@@ -3270,7 +3270,7 @@ def test_fetch_single_catalog_rejects_malformed_payload(self, temp_dir, payload)
32703270 catalog = self ._make_catalog (temp_dir )
32713271
32723272 mock_response = MagicMock ()
3273- mock_response .read .return_value = json .dumps (payload ).encode ()
3273+ mock_response .read .side_effect = io . BytesIO ( json .dumps (payload ).encode ()). read
32743274 mock_response .__enter__ = lambda s : s
32753275 mock_response .__exit__ = MagicMock (return_value = False )
32763276
@@ -3337,10 +3337,12 @@ def test_fetch_single_catalog_rejects_malformed_cached_payload(
33373337 "schema_version" : "1.0" ,
33383338 "extensions" : {"foo" : {"name" : "Foo" , "version" : "1.0.0" }},
33393339 }
3340- mock_response = MagicMock ()
3341- mock_response .read .return_value = json .dumps (valid ).encode ()
3342- mock_response .__enter__ = lambda s : s
3343- mock_response .__exit__ = MagicMock (return_value = False )
3340+ def make_response ():
3341+ mock_response = MagicMock ()
3342+ mock_response .read .side_effect = io .BytesIO (json .dumps (valid ).encode ()).read
3343+ mock_response .__enter__ = lambda s : s
3344+ mock_response .__exit__ = MagicMock (return_value = False )
3345+ return mock_response
33443346
33453347 entry = CatalogEntry (
33463348 url = ExtensionCatalog .DEFAULT_CATALOG_URL ,
@@ -3349,7 +3351,7 @@ def test_fetch_single_catalog_rejects_malformed_cached_payload(
33493351 install_allowed = True ,
33503352 )
33513353
3352- with patch .object (catalog , "_open_url" , return_value = mock_response ):
3354+ with patch .object (catalog , "_open_url" , side_effect = lambda * a , ** kw : make_response () ):
33533355 result = catalog ._fetch_single_catalog (entry , force_refresh = False )
33543356
33553357 # The poisoned cache was discarded and the network payload returned.
@@ -3385,7 +3387,7 @@ def test_fetch_catalog_rejects_malformed_payload(self, temp_dir, payload):
33853387
33863388 catalog = self ._make_catalog (temp_dir )
33873389 mock_response = MagicMock ()
3388- mock_response .read .return_value = json .dumps (payload ).encode ()
3390+ mock_response .read .side_effect = io . BytesIO ( json .dumps (payload ).encode ()). read
33893391 mock_response .__enter__ = lambda s : s
33903392 mock_response .__exit__ = MagicMock (return_value = False )
33913393
@@ -3424,12 +3426,14 @@ def test_fetch_catalog_recovers_from_unreadable_cache(self, temp_dir):
34243426 "schema_version" : "1.0" ,
34253427 "extensions" : {"foo" : {"name" : "Foo" , "version" : "1.0.0" }},
34263428 }
3427- mock_response = MagicMock ()
3428- mock_response .read .return_value = json .dumps (valid ).encode ()
3429- mock_response .__enter__ = lambda s : s
3430- mock_response .__exit__ = MagicMock (return_value = False )
3429+ def make_response ():
3430+ mock_response = MagicMock ()
3431+ mock_response .read .side_effect = io .BytesIO (json .dumps (valid ).encode ()).read
3432+ mock_response .__enter__ = lambda s : s
3433+ mock_response .__exit__ = MagicMock (return_value = False )
3434+ return mock_response
34313435
3432- with patch .object (catalog , "_open_url" , return_value = mock_response ):
3436+ with patch .object (catalog , "_open_url" , side_effect = lambda * a , ** kw : make_response () ):
34333437 result = catalog .fetch_catalog (force_refresh = False )
34343438
34353439 # Recovered via network rather than crashing on the unreadable cache.
@@ -3463,7 +3467,7 @@ def test_fetch_catalog_recovers_from_unreadable_metadata(self, temp_dir):
34633467 "extensions" : {"foo" : {"name" : "Foo" , "version" : "1.0.0" }},
34643468 }
34653469 mock_response = MagicMock ()
3466- mock_response .read .return_value = json .dumps (valid ).encode ()
3470+ mock_response .read .side_effect = io . BytesIO ( json .dumps (valid ).encode ()). read
34673471 mock_response .__enter__ = lambda s : s
34683472 mock_response .__exit__ = MagicMock (return_value = False )
34693473
@@ -3537,7 +3541,7 @@ def test_fetch_catalog_writes_cache_as_utf8(self, temp_dir, monkeypatch):
35373541 "extensions" : {"foo" : {"name" : "Foo" , "version" : "1.0.0" }},
35383542 }
35393543 mock_response = MagicMock ()
3540- mock_response .read .return_value = json .dumps (payload ).encode ("utf-8" )
3544+ mock_response .read .side_effect = io . BytesIO ( json .dumps (payload ).encode ("utf-8" )). read
35413545 mock_response .__enter__ = lambda s : s
35423546 mock_response .__exit__ = MagicMock (return_value = False )
35433547
@@ -3587,10 +3591,12 @@ def test_fetch_catalog_survives_unwritable_cache(self, temp_dir, monkeypatch):
35873591 "schema_version" : "1.0" ,
35883592 "extensions" : {"foo" : {"name" : "Foo" , "version" : "1.0.0" }},
35893593 }
3590- mock_response = MagicMock ()
3591- mock_response .read .return_value = json .dumps (valid ).encode ()
3592- mock_response .__enter__ = lambda s : s
3593- mock_response .__exit__ = MagicMock (return_value = False )
3594+ def make_response ():
3595+ mock_response = MagicMock ()
3596+ mock_response .read .side_effect = io .BytesIO (json .dumps (valid ).encode ()).read
3597+ mock_response .__enter__ = lambda s : s
3598+ mock_response .__exit__ = MagicMock (return_value = False )
3599+ return mock_response
35943600
35953601 # Simulate an unwritable cache dir: every write_text under the
35963602 # cache directory raises PermissionError (an OSError subclass).
@@ -3603,7 +3609,7 @@ def failing_write_text(self, data, *args, **kwargs):
36033609
36043610 monkeypatch .setattr (_PathCls , "write_text" , failing_write_text )
36053611
3606- with patch .object (catalog , "_open_url" , return_value = mock_response ):
3612+ with patch .object (catalog , "_open_url" , side_effect = lambda * a , ** kw : make_response () ):
36073613 # Legacy single-catalog path.
36083614 assert catalog .fetch_catalog (force_refresh = True ) == valid
36093615
@@ -3639,7 +3645,7 @@ def test_get_merged_extensions_skips_non_mapping_entries(self, temp_dir):
36393645 },
36403646 }
36413647 mock_response = MagicMock ()
3642- mock_response .read .return_value = json .dumps (payload ).encode ()
3648+ mock_response .read .side_effect = io . BytesIO ( json .dumps (payload ).encode ()). read
36433649 mock_response .__enter__ = lambda s : s
36443650 mock_response .__exit__ = MagicMock (return_value = False )
36453651
@@ -3777,7 +3783,7 @@ def test_download_extension_accepts_direct_github_rest_asset_url(self, temp_dir,
37773783 zip_bytes = zip_buf .getvalue ()
37783784
37793785 asset_response = MagicMock ()
3780- asset_response .read .return_value = zip_bytes
3786+ asset_response .read .side_effect = io . BytesIO ( zip_bytes ). read
37813787 asset_response .__enter__ = lambda s : s
37823788 asset_response .__exit__ = MagicMock (return_value = False )
37833789
0 commit comments