@@ -761,7 +761,7 @@ def test_fetch_object_and_check_content(self):
761761
762762class TestStorageListFiles (TestStorageFiles ):
763763
764- FILENAMES = ("CloudLogo1" , "CloudLogo2" , "CloudLogo3" )
764+ FILENAMES = ("CloudLogo1" , "CloudLogo2" , "CloudLogo3" , "CloudLogo4" )
765765
766766 @classmethod
767767 def setUpClass (cls ):
@@ -818,18 +818,49 @@ def test_paginate_files(self):
818818 # Technically the iterator is exhausted.
819819 self .assertEqual (iterator .num_results , iterator .max_results )
820820 # But we modify the iterator to continue paging after
821- # articially stopping after ``count`` items.
821+ # artificially stopping after ``count`` items.
822822 iterator .max_results = None
823823
824824 page2 = six .next (page_iter )
825825 last_blobs = list (page2 )
826826 self .assertEqual (len (last_blobs ), truncation_size )
827827
828+ @RetryErrors (unittest .TestCase .failureException )
829+ def test_paginate_files_with_offset (self ):
830+ truncation_size = 1
831+ inclusive_start_offset = self .FILENAMES [1 ]
832+ exclusive_end_offset = self .FILENAMES [- 1 ]
833+ desired_files = self .FILENAMES [1 :- 1 ]
834+ count = len (desired_files ) - truncation_size
835+ iterator = self .bucket .list_blobs (
836+ max_results = count ,
837+ start_offset = inclusive_start_offset ,
838+ end_offset = exclusive_end_offset ,
839+ )
840+ page_iter = iterator .pages
841+
842+ page1 = six .next (page_iter )
843+ blobs = list (page1 )
844+ self .assertEqual (len (blobs ), count )
845+ self .assertEqual (blobs [0 ].name , desired_files [0 ])
846+ self .assertIsNotNone (iterator .next_page_token )
847+ # Technically the iterator is exhausted.
848+ self .assertEqual (iterator .num_results , iterator .max_results )
849+ # But we modify the iterator to continue paging after
850+ # artificially stopping after ``count`` items.
851+ iterator .max_results = None
852+
853+ page2 = six .next (page_iter )
854+ last_blobs = list (page2 )
855+ self .assertEqual (len (last_blobs ), truncation_size )
856+ self .assertEqual (last_blobs [- 1 ].name , desired_files [- 1 ])
857+
828858
829859class TestStoragePseudoHierarchy (TestStorageFiles ):
830860
831861 FILENAMES = (
832862 "file01.txt" ,
863+ "parent/" ,
833864 "parent/file11.txt" ,
834865 "parent/child/file21.txt" ,
835866 "parent/child/file22.txt" ,
@@ -877,7 +908,9 @@ def test_first_level(self):
877908 iterator = self .bucket .list_blobs (delimiter = "/" , prefix = "parent/" )
878909 page = six .next (iterator .pages )
879910 blobs = list (page )
880- self .assertEqual ([blob .name for blob in blobs ], ["parent/file11.txt" ])
911+ self .assertEqual (
912+ [blob .name for blob in blobs ], ["parent/" , "parent/file11.txt" ]
913+ )
881914 self .assertIsNone (iterator .next_page_token )
882915 self .assertEqual (iterator .prefixes , set (["parent/child/" ]))
883916
@@ -909,6 +942,17 @@ def test_third_level(self):
909942 self .assertIsNone (iterator .next_page_token )
910943 self .assertEqual (iterator .prefixes , set ())
911944
945+ @RetryErrors (unittest .TestCase .failureException )
946+ def test_include_trailing_delimiter (self ):
947+ iterator = self .bucket .list_blobs (
948+ delimiter = "/" , include_trailing_delimiter = True
949+ )
950+ page = six .next (iterator .pages )
951+ blobs = list (page )
952+ self .assertEqual ([blob .name for blob in blobs ], ["file01.txt" , "parent/" ])
953+ self .assertIsNone (iterator .next_page_token )
954+ self .assertEqual (iterator .prefixes , set (["parent/" ]))
955+
912956
913957class TestStorageSignURLs (unittest .TestCase ):
914958 BLOB_CONTENT = b"This time for sure, Rocky!"
0 commit comments