@@ -1057,55 +1057,64 @@ def test_compact_metadata_cache(self, _time_until_object_expires: MagicMock):
10571057 self .assertEqual ([2 , 2 ], list (map (len , file_names .values ())))
10581058 self .assertEqual ([1 , 1 ], list (map (len , map (set , file_names .values ()))))
10591059
1060- def test_hash_validity (self ):
1060+ def test_hash_validity_with_notifications_enabled (self ) -> None :
1061+ self ._test_hash_validity ()
1062+
1063+ def _test_hash_validity (self ):
10611064 self .maxDiff = None
1062- bundle_uuid = 'aaa96233-bf27-44c7-82df-b4dc15ad4d9d'
1063- version1 = '2018-11-02T11:33:44.698028Z'
1064- version2 = '2018-11-04T11:33:44.698028Z'
1065- assert (version1 != version2 )
1066- original_fqid = self .bundle_fqid (uuid = bundle_uuid , version = version1 )
1067- self ._index_canned_bundle (original_fqid )
1068- filters = self ._filters ({'project' : {'is' : ['Single of human pancreas' ]}})
1069- old_keys = {}
1065+ bundles_by_project = {
1066+ '67bc798b-a34a-4104-8cab-cad648471f69' :
1067+ self .bundle_fqid (uuid = 'f79257a7-dfc6-46d6-ae00-ba4b25313c10' ,
1068+ version = '2018-09-14T13:33:14.453337Z' ),
1069+ '6615efae-fca8-4dd2-a223-9cfcf30fe94d' :
1070+ self .bundle_fqid (uuid = '587d74b4-1075-4bbf-b96a-4d1ede0481b2' ,
1071+ version = '2018-09-14T13:33:14.453337Z' ),
1072+ '091cf39b-01bc-42e5-9437-f419a66c8a45' :
1073+ self .bundle_fqid (uuid = 'cfab8304-dc9f-439e-af29-f8eb75b0729d' ,
1074+ version = '2019-07-18T21:28:20.595913Z' ),
1075+ }
1076+ projects , bundles = zip (* bundles_by_project .items ())
1077+ self ._index_canned_bundle (bundles [0 ])
1078+ filters = self ._filters (cast (FiltersJSON , {
1079+ 'projectId' : {
1080+ 'is' : [projects [0 ], projects [1 ]]
1081+ }
1082+ }))
10701083 service = ManifestService (self .storage_service , self .app_module .app .file_url )
10711084
10721085 def manifest_generator (format : ManifestFormat ) -> ManifestGenerator :
10731086 generator_cls = ManifestGenerator .cls_for_format (format )
10741087 return generator_cls (service , self .catalog , filters )
10751088
1089+ keys = [{}, {}]
1090+
10761091 for format in ManifestFormat :
1077- with self .subTest ('indexing new bundle' , format = format ):
1078- # When a new bundle is indexed and its compact manifest cached,
1079- # a matching manifest key is generated ...
1092+ with self .subTest ('First bundle indexed' , format = format ):
1093+ # A manifest for a filter matching files in the first bundle …
10801094 generator = manifest_generator (format )
1081- old_bundle_key = generator .manifest_key ()
1082- # and should remain valid ...
1083- self .assertEqual (old_bundle_key , generator .manifest_key ())
1084- old_keys [format ] = old_bundle_key
1085-
1086- # ... until a new bundle belonging to the same project is indexed, at
1087- # which point a manifest request will generate a different key ...
1088- update_fqid = self .bundle_fqid (uuid = bundle_uuid , version = version2 )
1089- self ._index_canned_bundle (update_fqid )
1090- new_keys = {}
1095+ manifest_key = generator .manifest_key ()
1096+ # … should remain cached …
1097+ self .assertEqual (manifest_key , generator .manifest_key ())
1098+ keys [0 ][format ] = manifest_key
1099+
1100+ # … until a new bundle with files also matching the filter is indexed.
1101+ self ._index_canned_bundle (bundles [1 ])
10911102 for format in ManifestFormat :
1092- with self .subTest ('indexing second bundle' , format = format ):
1103+ with self .subTest ('Second bundle indexed ' , format = format ):
10931104 generator = manifest_generator (format )
1094- new_bundle_key = generator .manifest_key ()
1095- # ... invalidating the cached object previously used for the same filter.
1096- self .assertNotEqual (old_keys [format ], new_bundle_key )
1097- new_keys [format ] = new_bundle_key
1098-
1099- # Updates or additions, unrelated to that project do not affect object
1100- # key generation
1101- other_fqid = self .bundle_fqid (uuid = 'f79257a7-dfc6-46d6-ae00-ba4b25313c10' ,
1102- version = '2018-09-14T13:33:14.453337Z' )
1103- self ._index_canned_bundle (other_fqid )
1105+ manifest_key = generator .manifest_key ()
1106+ # The updated manifest is cached under a different key.
1107+ self .assertNotEqual (keys [0 ][format ], manifest_key )
1108+ keys [1 ][format ] = manifest_key
1109+
1110+ # After indexing a bundle with files that don't match the filter, the
1111+ # cached manifest remains valid.
1112+ self ._index_canned_bundle (bundles [2 ])
11041113 for format in ManifestFormat :
1105- with self .subTest ('indexing unrelated bundle' , format = format ):
1114+ with self .subTest ('Unrelated bundle indexed ' , format = format ):
11061115 generator = manifest_generator (format )
1107- latest_bundle_key = generator .manifest_key ()
1108- self .assertEqual (latest_bundle_key , new_keys [ format ])
1116+ manifest_key = generator .manifest_key ()
1117+ self .assertEqual (keys [ 1 ][ format ], manifest_key )
11091118
11101119 @patch .object (StorageService , '_time_until_object_expires' )
11111120 def test_get_cached_manifest (self , _time_until_object_expires : MagicMock ):
0 commit comments