@@ -82,6 +82,9 @@ class TestStorageFiles(TestStorage):
8282 'big' : {
8383 'path' : 'regression/data/five-mb-file.zip' ,
8484 },
85+ 'simple' : {
86+ 'path' : 'regression/data/simple.txt' ,
87+ }
8588 }
8689
8790 @staticmethod
@@ -203,6 +206,78 @@ def test_paginate_files(self):
203206 self .assertEqual (len (last_keys ), truncation_size )
204207
205208
209+ class TestStoragePseudoHierarchy (TestStorageFiles ):
210+
211+ FILENAMES = [
212+ 'file01.txt' ,
213+ 'parent/file11.txt' ,
214+ 'parent/child/file21.txt' ,
215+ 'parent/child/file22.txt' ,
216+ 'parent/child/grand/file31.txt' ,
217+ 'parent/child/other/file32.txt' ,
218+ ]
219+
220+ @classmethod
221+ def setUpClass (cls ):
222+ super (TestStoragePseudoHierarchy , cls ).setUpClass ()
223+ # Make sure bucket empty before beginning.
224+ for key in cls .bucket :
225+ key .delete ()
226+
227+ simple_path = cls .FILES ['simple' ]['path' ]
228+ key = cls .bucket .upload_file (simple_path , key = cls .FILENAMES [0 ])
229+ cls .suite_keys_to_delete = [key ]
230+ for filename in cls .FILENAMES [1 :]:
231+ new_key = cls .bucket .copy_key (key , cls .bucket , filename )
232+ cls .suite_keys_to_delete .append (new_key )
233+
234+ @classmethod
235+ def tearDownClass (cls ):
236+ for key in cls .suite_keys_to_delete :
237+ key .delete ()
238+
239+ def test_root_level_w_delimiter (self ):
240+ iterator = self .bucket .iterator (delimiter = '/' )
241+ response = iterator .get_next_page_response ()
242+ keys = list (iterator .get_items_from_response (response ))
243+ self .assertEqual ([key .name for key in keys ], ['file01.txt' ])
244+ self .assertEqual (iterator .page_number , 1 )
245+ self .assertTrue (iterator .next_page_token is None )
246+ self .assertEqual (iterator .prefixes , ('parent/' ,))
247+
248+ def test_first_level (self ):
249+ iterator = self .bucket .iterator (delimiter = '/' , prefix = 'parent/' )
250+ response = iterator .get_next_page_response ()
251+ keys = list (iterator .get_items_from_response (response ))
252+ self .assertEqual ([key .name for key in keys ], ['parent/file11.txt' ])
253+ self .assertEqual (iterator .page_number , 1 )
254+ self .assertTrue (iterator .next_page_token is None )
255+ self .assertEqual (iterator .prefixes , ('parent/child/' ,))
256+
257+ def test_second_level (self ):
258+ iterator = self .bucket .iterator (delimiter = '/' , prefix = 'parent/child/' )
259+ response = iterator .get_next_page_response ()
260+ keys = list (iterator .get_items_from_response (response ))
261+ self .assertEqual ([key .name for key in keys ],
262+ ['parent/child/file21.txt' ,
263+ 'parent/child/file22.txt' ])
264+ self .assertEqual (iterator .page_number , 1 )
265+ self .assertTrue (iterator .next_page_token is None )
266+ self .assertEqual (iterator .prefixes ,
267+ ('parent/child/grand/' , 'parent/child/other/' ))
268+
269+ def test_third_level (self ):
270+ iterator = self .bucket .iterator (delimiter = '/' ,
271+ prefix = 'parent/child/grand/' )
272+ response = iterator .get_next_page_response ()
273+ keys = list (iterator .get_items_from_response (response ))
274+ self .assertEqual ([key .name for key in keys ],
275+ ['parent/child/grand/file31.txt' ])
276+ self .assertEqual (iterator .page_number , 1 )
277+ self .assertTrue (iterator .next_page_token is None )
278+ self .assertEqual (iterator .prefixes , ())
279+
280+
206281class TestStorageSignURLs (TestStorageFiles ):
207282
208283 def setUp (self ):
0 commit comments