diff --git a/tests/unit/test_cassettes.py b/tests/unit/test_cassettes.py index 0397d1f4..fe0cabbb 100644 --- a/tests/unit/test_cassettes.py +++ b/tests/unit/test_cassettes.py @@ -435,3 +435,40 @@ def test_used_interactions(tmpdir): used_interactions = cassette._played_interactions + cassette._new_interactions() assert len(used_interactions) == 2 + + # Also verify that we can account for request modification + file2 = tmpdir.join("test_cassette2.yml") + file2.write(yaml.dump({"interactions": [interactions[0]]})) + + def filter_auth_header(request: Request) -> Request: + request = copy.deepcopy(request) + if "Authorization" in request.headers: + del request.headers["Authorization"] + return request + + # Play response with a raw request that has header to be filtered + cassette2 = Cassette.load( + path=str(file2), + before_record_request=filter_auth_header, + drop_unused_requests=True, + ) + cassette2.play_response( + Request._from_dict( + { + "body": "", + "uri": "foo1", + "method": "GET", + "headers": {"Authorization": "Bearer secret-token"}, + }, + ), + ) + assert len(cassette2._played_interactions) == 1 + played_request, _ = cassette2._played_interactions[0] + assert "Authorization" not in played_request.headers, "Expected played request's header to be filtered" + + # Save and verify the cassette doesn't contain Authorization + cassette2._save(force=True) + with file2.open() as f: + saved_content = f.read() + assert "Authorization" not in saved_content + assert "secret-token" not in saved_content diff --git a/vcr/cassette.py b/vcr/cassette.py index 7fb884d0..9324db06 100644 --- a/vcr/cassette.py +++ b/vcr/cassette.py @@ -263,7 +263,8 @@ def play_response(self, request): for index, response in self._responses(request): if self.play_counts[index] == 0 or self.allow_playback_repeats: self.play_counts[index] += 1 - self._played_interactions.append((request, response)) + # Use stored (possibly modified) request, not the raw incoming request + self._played_interactions.append((self.data[index][0], response)) return response # The cassette doesn't contain the request asked for. raise UnhandledHTTPRequestError(