Merge lp:~elopio/cloudspacesclient/refactor into lp:cloudspacesclient
- refactor
- Merge into trunk
Proposed by
Leo Arias
Status: | Merged |
---|---|
Merged at revision: | 41 |
Proposed branch: | lp:~elopio/cloudspacesclient/refactor |
Merge into: | lp:cloudspacesclient |
Prerequisite: | lp:~elopio/cloudspacesclient/update_filename |
Diff against target: |
375 lines (+62/-82) 1 file modified
src/cloudspacesclient/tests/conformance/test_cloudspaces_api.py (+62/-82) |
To merge this branch: | bzr merge lp:~elopio/cloudspacesclient/refactor |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Richard Huddie (community) | Approve | ||
Review via email: mp+197976@code.launchpad.net |
Commit message
Refactor tests to make them smaller or clearer.
Description of the change
To post a comment you must log in.
Revision history for this message
Richard Huddie (rhuddie) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/cloudspacesclient/tests/conformance/test_cloudspaces_api.py' |
2 | --- src/cloudspacesclient/tests/conformance/test_cloudspaces_api.py 2013-12-06 00:21:49 +0000 |
3 | +++ src/cloudspacesclient/tests/conformance/test_cloudspaces_api.py 2013-12-06 00:21:49 +0000 |
4 | @@ -39,13 +39,13 @@ |
5 | return getattr(test_server_module, test_server_adapter[-1])() |
6 | |
7 | |
8 | -class CloudspacesAPITestCase(unittest.TestCase): |
9 | +class BaseCloudspacesAPITestCase(unittest.TestCase): |
10 | |
11 | cloudspaces_server_url = config.get( |
12 | 'cloudspaces', 'cloudspaces_server_url') |
13 | |
14 | def setUp(self): |
15 | - super(CloudspacesAPITestCase, self).setUp() |
16 | + super(BaseCloudspacesAPITestCase, self).setUp() |
17 | self.start_datetime = self._get_now_datetime() |
18 | self.test_server = get_test_server_adapter() |
19 | self.test_user = self.test_server.create_test_user() |
20 | @@ -64,6 +64,14 @@ |
21 | rfc3339_now = now.isoformat().replace("T ", "T").split(".")[0] + "Z" |
22 | return parser.parse(rfc3339_now) |
23 | |
24 | + def assert_datetime_limits(self, datetime, start_datetime, end_datetime): |
25 | + # The server doesn't return microseconds, so times may be equal. |
26 | + self.assertGreaterEqual(datetime, start_datetime) |
27 | + self.assertLessEqual(datetime, end_datetime) |
28 | + |
29 | + |
30 | +class UserRepresentationTestCase(BaseCloudspacesAPITestCase): |
31 | + |
32 | def test_get_user_representation(self): |
33 | user_rep = self.cloudspaces_api_client.get_user_representation() |
34 | |
35 | @@ -80,23 +88,33 @@ |
36 | end_datetime): |
37 | for volume in volumes: |
38 | when_created = parser.parse(volume.get('when_created')) |
39 | - self._assert_datetime_limits( |
40 | + self.assert_datetime_limits( |
41 | when_created, start_datetime, end_datetime) |
42 | |
43 | - def _assert_datetime_limits(self, datetime, start_datetime, end_datetime): |
44 | - # The server doesn't return microseconds, so times may be equal. |
45 | - self.assertGreaterEqual(datetime, start_datetime) |
46 | - self.assertLessEqual(datetime, end_datetime) |
47 | - |
48 | def _assert_new_user_volumes_name(self, volumes): |
49 | volume_names = [volume.get('name') for volume in volumes] |
50 | self.assertEqual( |
51 | volume_names, self.test_server.get_new_user_volume_names()) |
52 | |
53 | + |
54 | +class TestCaseWithRootNodeInfo(BaseCloudspacesAPITestCase): |
55 | + |
56 | + def setUp(self): |
57 | + super(TestCaseWithRootNodeInfo, self).setUp() |
58 | + self.root_node_id = self._get_root_node_id() |
59 | + |
60 | + def _get_root_node_id(self): |
61 | + user_rep = self.cloudspaces_api_client.get_user_representation() |
62 | + root_volume = self._get_root_volume(user_rep.get('volumes')) |
63 | + return root_volume.get('node_id') |
64 | + |
65 | + def _get_root_volume(self, volumes): |
66 | + # FIXME The first volume returned is not necessarily the root. |
67 | + # --elopio - 2013-11-23 |
68 | + return volumes[0] |
69 | + |
70 | def test_get_root_metadata(self): |
71 | - node_id = self._get_root_node_id() |
72 | - |
73 | - metadata = self.cloudspaces_api_client.get_metadata(node_id) |
74 | + metadata = self.cloudspaces_api_client.get_metadata(self.root_node_id) |
75 | |
76 | validictory.validate( |
77 | metadata, schemas.GET_FOLDER_METADATA_RESPONSE_SCHEMA) |
78 | @@ -104,7 +122,7 @@ |
79 | path, filename = os.path.split(self.test_server.get_root_path()) |
80 | expected = dict( |
81 | is_deleted=False, is_folder=True, is_root=True, filename=filename, |
82 | - node_id=node_id, path=path) |
83 | + node_id=self.root_node_id, path=path) |
84 | self._assert_json_object_values(expected, metadata) |
85 | |
86 | self._assert_normal_folder_keys_not_in_root(metadata) |
87 | @@ -117,16 +135,6 @@ |
88 | # --elopio - 2013-11-25 |
89 | # TODO Check the volume_id field. --elopio - 2013-11-25 |
90 | |
91 | - def _get_root_node_id(self): |
92 | - user_rep = self.cloudspaces_api_client.get_user_representation() |
93 | - root_volume = self._get_root_volume(user_rep.get('volumes')) |
94 | - return root_volume.get('node_id') |
95 | - |
96 | - def _get_root_volume(self, volumes): |
97 | - # FIXME The first volume returned is not necessarily the root. |
98 | - # --elopio - 2013-11-23 |
99 | - return volumes[0] |
100 | - |
101 | def _assert_json_object_values(self, expected, actual): |
102 | """Assert the values of the returned json object. |
103 | |
104 | @@ -163,7 +171,7 @@ |
105 | metadata_log = [] |
106 | # if a node id is not given, then use the root as default |
107 | if not parent_node_id: |
108 | - parent_node_id = self._get_root_node_id() |
109 | + parent_node_id = self.root_node_id |
110 | # create the folders in the parent folder |
111 | for count in range(folder_count): |
112 | metadata = self.cloudspaces_api_client.make_folder( |
113 | @@ -177,13 +185,11 @@ |
114 | return metadata_log |
115 | |
116 | def test_create_folder_in_root(self): |
117 | - # get the root node id and root folder name |
118 | - root_node_id = self._get_root_node_id() |
119 | # create the folder |
120 | folder_name = 'root_folder_1' |
121 | |
122 | metadata = self.cloudspaces_api_client.make_folder( |
123 | - root_node_id, folder_name) |
124 | + self.root_node_id, folder_name) |
125 | # validate the folder properties from response |
126 | validictory.validate( |
127 | metadata, schemas.GET_FOLDER_METADATA_RESPONSE_SCHEMA) |
128 | @@ -191,12 +197,10 @@ |
129 | root_path = self.test_server.get_root_path() |
130 | expected = dict( |
131 | is_folder=True, is_deleted=False, is_root=False, path=root_path, |
132 | - filename=folder_name, parent_node_id=root_node_id, version=1) |
133 | + filename=folder_name, parent_node_id=self.root_node_id, version=1) |
134 | self._assert_json_object_values(expected, metadata) |
135 | |
136 | def test_create_folder_no_parent_id(self): |
137 | - # get the root node id and root folder name |
138 | - root_node_id = self._get_root_node_id() |
139 | # create the folder without specifying the parent folder id |
140 | # this should add folder to root level by default |
141 | folder_name = 'folder_no_parent_id' |
142 | @@ -209,16 +213,14 @@ |
143 | root_path = self.test_server.get_root_path() |
144 | expected = dict( |
145 | is_folder=True, is_deleted=False, is_root=False, path=root_path, |
146 | - filename=folder_name, parent_node_id=root_node_id, version=1) |
147 | + filename=folder_name, parent_node_id=self.root_node_id, version=1) |
148 | self._assert_json_object_values(expected, metadata) |
149 | |
150 | def test_create_child_folder(self): |
151 | - # get the root node id and root folder name |
152 | - root_node_id = self._get_root_node_id() |
153 | parent_folder_name = 'parent_folder_1' |
154 | # create the parent folder |
155 | parent_metadata = self.cloudspaces_api_client.make_folder( |
156 | - root_node_id, parent_folder_name) |
157 | + self.root_node_id, parent_folder_name) |
158 | # Now create a sub folder under the parent folder |
159 | child_folder_name = 'child_folder_1' |
160 | parent_node_id = parent_metadata.get('node_id') |
161 | @@ -237,12 +239,11 @@ |
162 | self._assert_json_object_values(expected, metadata) |
163 | |
164 | def test_create_new_file(self): |
165 | - root_node_id = self._get_root_node_id() |
166 | test_file_name = 'test.txt' |
167 | test_file_mimetype = 'text/plain' |
168 | |
169 | metadata = self.cloudspaces_api_client.make_file( |
170 | - root_node_id, test_file_name) |
171 | + self.root_node_id, test_file_name) |
172 | |
173 | validictory.validate( |
174 | metadata, schemas.GET_FILE_METADATA_RESPONSE_SCHEMA) |
175 | @@ -251,11 +252,12 @@ |
176 | expected = dict( |
177 | hash=None, filename=test_file_name, is_deleted=False, |
178 | is_folder=False, mimetype=test_file_mimetype, |
179 | - parent_node_id=root_node_id, path=root_path, size=0, version=1) |
180 | + parent_node_id=self.root_node_id, path=root_path, size=0, |
181 | + version=1) |
182 | self._assert_json_object_values(expected, metadata) |
183 | |
184 | # Assert that the file has just been created. |
185 | - self._assert_datetime_limits( |
186 | + self.assert_datetime_limits( |
187 | parser.parse(metadata.get('server_modified')), self.start_datetime, |
188 | self._get_now_datetime()) |
189 | # TODO update the spec because it says checksum instead of hash. |
190 | @@ -267,21 +269,19 @@ |
191 | |
192 | def test_download_empty_file(self): |
193 | test_file_name = 'test_file_to_download.txt' |
194 | - root_node_id = self._get_root_node_id() |
195 | create_metadata = self.cloudspaces_api_client.make_file( |
196 | - root_node_id, test_file_name) |
197 | + self.root_node_id, test_file_name) |
198 | file_node_id = create_metadata.get('node_id') |
199 | |
200 | contents = list(self.cloudspaces_api_client.get_file(file_node_id)) |
201 | self.assertEqual(contents, []) |
202 | |
203 | def test_delete_file(self): |
204 | - root_node_id = self._get_root_node_id() |
205 | test_file_name = 'test_file_to_delete.txt' |
206 | test_file_mimetype = 'text/plain' |
207 | |
208 | create_metadata = self.cloudspaces_api_client.make_file( |
209 | - root_node_id, test_file_name) |
210 | + self.root_node_id, test_file_name) |
211 | file_node_id = create_metadata.get('node_id') |
212 | |
213 | delete_metadata = self.cloudspaces_api_client.delete(file_node_id) |
214 | @@ -292,11 +292,11 @@ |
215 | expected = dict( |
216 | hash=None, filename=test_file_name, is_deleted=True, |
217 | is_folder=False, mimetype=test_file_mimetype, |
218 | - parent_node_id=root_node_id, path=root_path, size=0) |
219 | + parent_node_id=self.root_node_id, path=root_path, size=0) |
220 | self._assert_json_object_values(expected, delete_metadata) |
221 | |
222 | # Assert that the file has just been modified. |
223 | - self._assert_datetime_limits( |
224 | + self.assert_datetime_limits( |
225 | parser.parse(delete_metadata.get('server_modified')), |
226 | self.start_datetime, |
227 | self._get_now_datetime()) |
228 | @@ -304,12 +304,10 @@ |
229 | # TODO Check the volume_id field. --elopio - 2013-11-27 |
230 | |
231 | def test_delete_folder_in_root(self): |
232 | - # get the root node id and root folder name |
233 | - root_node_id = self._get_root_node_id() |
234 | # create the folder to be deleted later |
235 | folder_name = 'delete_me_folder_1' |
236 | metadata = self.cloudspaces_api_client.make_folder( |
237 | - root_node_id, folder_name) |
238 | + self.root_node_id, folder_name) |
239 | # now delete the folder |
240 | node_id = metadata.get('node_id') |
241 | metadata = self.cloudspaces_api_client.delete(node_id) |
242 | @@ -329,10 +327,9 @@ |
243 | self.cloudspaces_api_client.delete(node_id) |
244 | |
245 | def test_delete_folder_and_children_in_root(self): |
246 | - root_node_id = self._get_root_node_id() |
247 | # create a new parent folder to hold the child items |
248 | metadata = self.cloudspaces_api_client.make_folder( |
249 | - root_node_id, 'test_delete_folder_and_children_in_root') |
250 | + self.root_node_id, 'test_delete_folder_and_children_in_root') |
251 | parent_node_id = metadata.get('node_id') |
252 | # now create sub-files and folders within this folder |
253 | # this content should be deleted by the test when top folder is deleted |
254 | @@ -355,12 +352,10 @@ |
255 | |
256 | def test_create_folder_using_parent_file_id(self): |
257 | # A negative test to create a folder using the node id of a file as |
258 | - # the parent node id for the folder |
259 | - root_node_id = self._get_root_node_id() |
260 | # create a file first |
261 | file_name = 'test_file.txt' |
262 | metadata = self.cloudspaces_api_client.make_file( |
263 | - root_node_id, file_name) |
264 | + self.root_node_id, file_name) |
265 | file_node_id = metadata.get('node_id') |
266 | # now try and create a folder, using file id as parent |
267 | # this should fail gracefully with a suitable error code |
268 | @@ -369,11 +364,9 @@ |
269 | self.cloudspaces_api_client.make_folder(file_node_id, folder_name) |
270 | |
271 | def test_folder_child_list_false(self): |
272 | - # A test to get child objects from parent directory |
273 | - root_node_id = self._get_root_node_id() |
274 | # create a new parent folder to hold the child items |
275 | metadata = self.cloudspaces_api_client.make_folder( |
276 | - root_node_id, 'test_folder_child_list_false') |
277 | + self.root_node_id, 'test_folder_child_list_false') |
278 | parent_node_id = metadata.get('node_id') |
279 | # Create a data structure from root folder |
280 | file_count = 3 |
281 | @@ -387,11 +380,9 @@ |
282 | self.assertEqual(None, metadata.get('contents')) |
283 | |
284 | def test_folder_child_list_true(self): |
285 | - # A test to get child objects from parent directory |
286 | - root_node_id = self._get_root_node_id() |
287 | # create a new parent folder to hold the child items |
288 | metadata = self.cloudspaces_api_client.make_folder( |
289 | - root_node_id, 'test_folder_child_list_true') |
290 | + self.root_node_id, 'test_folder_child_list_true') |
291 | parent_node_id = metadata.get('node_id') |
292 | # Create a data structure from root folder |
293 | file_count = 3 |
294 | @@ -408,17 +399,14 @@ |
295 | |
296 | def test_folder_depth(self): |
297 | # A test to create a hierarchichal directory structure and validate |
298 | - # the folder path is correct for each sub-folder |
299 | - root_node_id = self._get_root_node_id() |
300 | - # create a new parent folder to hold the child items |
301 | - parent_metadata = self.cloudspaces_api_client.make_folder( |
302 | - root_node_id, 'test_folder_depth') |
303 | - parent_node_id = parent_metadata.get('node_id') |
304 | - folder_depth = 10 |
305 | + parent_node_id = self.root_node_id |
306 | + parent_metadata = self.cloudspaces_api_client.get_metadata( |
307 | + parent_node_id) |
308 | # store the path of the top level folder |
309 | parent_path = os.path.join( |
310 | parent_metadata.get('path'), parent_metadata.get('filename')) |
311 | |
312 | + folder_depth = 10 |
313 | for level in range(folder_depth): |
314 | # construct the expected folder path |
315 | folder_name = 'folder_{}'.format(level + 1) |
316 | @@ -434,33 +422,25 @@ |
317 | parent_node_id = metadata.get('node_id') |
318 | |
319 | def test_create_folder_with_existing_name(self): |
320 | - # attempt to create 2 folders with the same name in root |
321 | - root_node_id = self._get_root_node_id() |
322 | - # create a new parent folder to hold the child items |
323 | - metadata = self.cloudspaces_api_client.make_folder( |
324 | - root_node_id, 'test_create_folder_with_existing_name') |
325 | - parent_node_id = metadata.get('node_id') |
326 | folder_name = 'duplicate_folder' |
327 | self.cloudspaces_api_client.make_folder( |
328 | - parent_node_id, folder_name) |
329 | - metadata = self.cloudspaces_api_client.make_folder( |
330 | - parent_node_id, folder_name) |
331 | + self.root_node_id, folder_name) |
332 | + folder_metadata = self.cloudspaces_api_client.make_folder( |
333 | + self.root_node_id, folder_name) |
334 | # now do a check the metadata of the dir listing |
335 | - get_metadata = self.cloudspaces_api_client.get_metadata( |
336 | - parent_node_id, list='true') |
337 | - child_nodes = get_metadata.get('contents') |
338 | + root_metadata = self.cloudspaces_api_client.get_metadata( |
339 | + self.root_node_id, list='true') |
340 | + child_nodes = root_metadata.get('contents') |
341 | # check only 1 folder listed and that the metadata matches |
342 | self.assertEqual(len(child_nodes), 1) |
343 | - self.assertEqual(metadata, child_nodes[0]) |
344 | + self.assertEqual(folder_metadata, child_nodes[0]) |
345 | |
346 | def test_new_file_version(self): |
347 | - # A test to upload new content to a file and check it is updated |
348 | - root_node_id = self._get_root_node_id() |
349 | test_file_name = 'file_version_test.txt' |
350 | content_v1 = 'This is file content version 1' |
351 | content_v2 = 'This is the next file version, 2' |
352 | metadata = self.cloudspaces_api_client.make_file( |
353 | - root_node_id, test_file_name) |
354 | + self.root_node_id, test_file_name) |
355 | file_node_id = metadata.get('node_id') |
356 | # load version 1 of the file |
357 | metadata = self.cloudspaces_api_client.put_file( |
358 | @@ -468,7 +448,7 @@ |
359 | # check correct version |
360 | self.assertEqual(metadata.get('version'), 2) |
361 | # Assert that the file has just been created. |
362 | - self._assert_datetime_limits( |
363 | + self.assert_datetime_limits( |
364 | parser.parse(metadata.get('server_modified')), self.start_datetime, |
365 | self._get_now_datetime()) |
366 | # load version 2 of the file |
367 | @@ -477,7 +457,7 @@ |
368 | # check correct version |
369 | self.assertEqual(metadata.get('version'), 3) |
370 | # Assert that the file has just been updated. |
371 | - self._assert_datetime_limits( |
372 | + self.assert_datetime_limits( |
373 | parser.parse(metadata.get('server_modified')), self.start_datetime, |
374 | self._get_now_datetime()) |
375 | # get the latest version and compare with expected content |