@@ -67,16 +67,6 @@ def send_hook(self, view_name, view_kwargs, payload, target, method='get', **kwa
6767@pytest .mark .django_db
6868class TestGetMetadataHook (HookTestCase ):
6969
70- def test_empty (self ):
71- res = self .send_hook (
72- 'osfstorage_get_children' ,
73- {'fid' : self .node_settings .get_root ()._id , 'user_id' : self .user ._id },
74- {},
75- self .node
76- )
77- assert isinstance (res .json , list )
78- assert res .json == []
79-
8070 def test_file_metadata (self ):
8171 path = 'kind/of/magíc.mp3'
8272 record = recursively_create_file (self .node_settings , path )
@@ -107,6 +97,95 @@ def test_preprint_primary_file_metadata(self):
10797 assert isinstance (res .json , dict )
10898 assert res .json == record .parent .serialize (True )
10999
100+ def test_osf_storage_root (self ):
101+ auth = Auth (self .project .creator )
102+ result = osf_storage_root (self .node_settings .config , self .node_settings , auth )
103+ node = self .project
104+ expected = rubeus .build_addon_root (
105+ node_settings = self .node_settings ,
106+ name = '' ,
107+ permissions = auth ,
108+ user = auth .user ,
109+ nodeUrl = node .url ,
110+ nodeApiUrl = node .api_url ,
111+ )
112+ root = result [0 ]
113+ assert root == expected
114+
115+ def test_root_default (self ):
116+ res = self .send_hook ('osfstorage_get_metadata' , {}, {}, self .node )
117+
118+ assert res .json ['fullPath' ] == '/'
119+ assert res .json ['id' ] == self .node_settings .get_root ()._id
120+
121+ def test_root_preprint_default (self ):
122+ preprint = PreprintFactory ()
123+ res = self .send_hook ('osfstorage_get_metadata' , {}, {}, preprint )
124+
125+ assert res .json ['fullPath' ] == '/'
126+ assert res .json ['id' ] == preprint .root_folder ._id
127+
128+ def test_metadata_not_found (self ):
129+ res = self .send_hook (
130+ 'osfstorage_get_metadata' ,
131+ {'fid' : 'somebogusid' }, {},
132+ self .node ,
133+ )
134+ assert res .status_code == 404
135+
136+ def test_metadata_not_found_lots_of_slashes (self ):
137+ res = self .send_hook (
138+ 'osfstorage_get_metadata' ,
139+ {'fid' : '/not/fo/u/nd/' }, {},
140+ self .node ,
141+ )
142+ assert res .status_code == 302
143+ assert '/login?service=' in res .location
144+
145+ self .node .is_public = True
146+ self .node .save ()
147+ res = self .send_hook (
148+ 'osfstorage_get_metadata' ,
149+ {'fid' : '/not/fo/u/nd/' }, {},
150+ self .node ,
151+ )
152+ assert res .status_code == 404
153+
154+
155+ @pytest .mark .django_db
156+ class TestGetChildrenHook (HookTestCase ):
157+
158+ def get_children (self , parent , target = None , ** query_params ):
159+ params = {
160+ 'fid' : parent ._id ,
161+ 'user_id' : self .user ._id ,
162+ 'minimal' : 'true' ,
163+ ** query_params ,
164+ }
165+ return self .send_hook (
166+ 'osfstorage_get_children' ,
167+ params ,
168+ {},
169+ target or self .node ,
170+ )
171+
172+ def _create_child_file (self , parent , name ):
173+ record = parent .append_file (name )
174+ version = factories .FileVersionFactory ()
175+ record .add_version (version )
176+ record .save ()
177+ return record
178+
179+ def test_empty (self ):
180+ res = self .send_hook (
181+ 'osfstorage_get_children' ,
182+ {'fid' : self .node_settings .get_root ()._id , 'user_id' : self .user ._id },
183+ {},
184+ self .node
185+ )
186+ assert isinstance (res .json , list )
187+ assert res .json == []
188+
110189 def test_children_metadata (self ):
111190 path = 'kind/of/magíc.mp3'
112191 record = recursively_create_file (self .node_settings , path )
@@ -176,59 +255,60 @@ def test_children_metadata_preprint(self):
176255 assert res_date_modified == expected_date_modified
177256 assert res_date_created == expected_date_created
178257
179- def test_osf_storage_root (self ):
180- auth = Auth (self .project .creator )
181- result = osf_storage_root (self .node_settings .config , self .node_settings , auth )
182- node = self .project
183- expected = rubeus .build_addon_root (
184- node_settings = self .node_settings ,
185- name = '' ,
186- permissions = auth ,
187- user = auth .user ,
188- nodeUrl = node .url ,
189- nodeApiUrl = node .api_url ,
190- )
191- root = result [0 ]
192- assert root == expected
193-
194- def test_root_default (self ):
195- res = self .send_hook ('osfstorage_get_metadata' , {}, {}, self .node )
196-
197- assert res .json ['fullPath' ] == '/'
198- assert res .json ['id' ] == self .node_settings .get_root ()._id
199-
200- def test_root_preprint_default (self ):
201- preprint = PreprintFactory ()
202- res = self .send_hook ('osfstorage_get_metadata' , {}, {}, preprint )
203-
204- assert res .json ['fullPath' ] == '/'
205- assert res .json ['id' ] == preprint .root_folder ._id
206-
207- def test_metadata_not_found (self ):
208- res = self .send_hook (
209- 'osfstorage_get_metadata' ,
210- {'fid' : 'somebogusid' }, {},
211- self .node ,
212- )
213- assert res .status_code == 404
214-
215- def test_metadata_not_found_lots_of_slashes (self ):
216- res = self .send_hook (
217- 'osfstorage_get_metadata' ,
218- {'fid' : '/not/fo/u/nd/' }, {},
219- self .node ,
220- )
221- assert res .status_code == 302
222- assert '/login?service=' in res .location
223-
224- self .node .is_public = True
225- self .node .save ()
226- res = self .send_hook (
227- 'osfstorage_get_metadata' ,
228- {'fid' : '/not/fo/u/nd/' }, {},
229- self .node ,
258+ def test_minimal_child_fields (self ):
259+ parent = self .node_settings .get_root ().append_folder ('minimal-child-fields' )
260+ record = self ._create_child_file (parent , 'magíc.mp3' )
261+ folder = parent .append_folder ('nested' )
262+ res = self .get_children (parent )
263+ assert res .status_code == 200
264+ assert len (res .json ) == 2
265+ assert {item ['name' ] for item in res .json } == {record .name , folder .name }
266+ for item in res .json :
267+ assert set (item .keys ()) == {'id' , 'kind' , 'name' , 'path' , 'storage' }
268+ if item ['kind' ] == 'file' :
269+ assert item ['storage' ] == {
270+ 'data' : {
271+ 'name' : record .name ,
272+ 'path' : record .versions .first ().location_hash ,
273+ },
274+ 'settings' : {
275+ storage_settings .WATERBUTLER_RESOURCE : record .versions .first ().location [
276+ storage_settings .WATERBUTLER_RESOURCE
277+ ],
278+ },
279+ }
280+ assert item ['path' ] == f'/{ record ._id } '
281+ assert item ['id' ] == record .id
282+ else :
283+ assert item ['storage' ] is None
284+ assert item ['path' ] == f'/{ folder ._id } /'
285+ assert item ['id' ] == folder .id
286+
287+ def test_minimal_pagination (self ):
288+ parent = self .node_settings .get_root ().append_folder ('pagination' )
289+ children = [
290+ self ._create_child_file (parent , name )
291+ for name in ('a.mp3' , 'b.mp3' , 'c.mp3' )
292+ ]
293+ children .sort (key = lambda c : c .id )
294+ first_page = self .get_children (parent , limit = 2 )
295+ assert first_page .status_code == 200
296+ assert [item ['id' ] for item in first_page .json ] == [children [0 ].id , children [1 ].id ]
297+ second_page = self .get_children (
298+ parent ,
299+ limit = '2' ,
300+ after = str (children [1 ].id ),
230301 )
231- assert res .status_code == 404
302+ assert second_page .status_code == 200
303+ assert len (second_page .json ) == 1
304+ assert second_page .json [0 ]['id' ] == children [2 ].id
305+
306+ def test_minimal_pagination_after_beyond_last_child (self ):
307+ parent = self .node_settings .get_root ()
308+ record = self ._create_child_file (parent , 'only.mp3' )
309+ res = self .get_children (parent , after = str (record .id ))
310+ assert res .status_code == 200
311+ assert res .json == []
232312
233313
234314@pytest .mark .django_db
0 commit comments