def http_recorder(vcr_mode, cassette_dir): """Creates a VCR object in vcr_mode mode. Args: vcr_mode (string): the parameter for record_mode. cassette_dir (string): path to the cassettes. Returns: VCR: a VCR object. """ my_vcr = VCR(cassette_library_dir=cassette_dir, record_mode=vcr_mode, match_on=[ 'method', 'scheme', 'host', 'port', 'path', 'unordered_query' ], filter_headers=['x-qx-client-application', 'User-Agent'], filter_query_parameters=[('access_token', 'dummyapiusersloginWithTokenid01')], filter_post_data_parameters=[('apiToken', 'apiToken_dummy')], decode_compressed_response=True, before_record_response=_purge_headers_cb([ 'Date', ('Set-Cookie', 'dummy_cookie'), 'X-Global-Transaction-ID', 'Etag', 'Content-Security-Policy', 'X-Content-Security-Policy', 'X-Webkit-Csp', 'content-length' ])) my_vcr.register_matcher('unordered_query', _unordered_query_matcher) my_vcr.register_persister(IdRemoverPersister) return my_vcr
def use_cassette(vcr_cassette_dir, record_mode, markers, config): """Create a VCR instance and return an appropriate context manager for the given cassette configuration.""" merged_config = merge_kwargs(config, markers) path_transformer = get_path_transformer(merged_config) vcr = VCR(path_transformer=path_transformer, cassette_library_dir=vcr_cassette_dir, record_mode=record_mode) # flatten the paths extra_paths = chain(*(marker[0] for marker in markers)) persister = CombinedPersister(extra_paths) vcr.register_persister(persister) return vcr.use_cassette(markers[0][0][0], **merged_config)
def use_cassette( default_cassette: str, vcr_cassette_dir: str, record_mode: str, markers: List[Mark], config: ConfigType, pytestconfig: Config, ) -> CassetteContextDecorator: """Create a VCR instance and return an appropriate context manager for the given cassette configuration.""" merged_config = merge_kwargs(config, markers) if "record_mode" in merged_config: record_mode = merged_config["record_mode"] path_transformer = get_path_transformer(merged_config) if record_mode == "rewrite": path = path_transformer( os.path.join(vcr_cassette_dir, default_cassette)) try: os.remove(path) except OSError: pass record_mode = "new_episodes" vcr = VCR(path_transformer=path_transformer, cassette_library_dir=vcr_cassette_dir, record_mode=record_mode) def extra_path_transformer(path: str) -> str: """Paths in extras can be handled as relative and as absolute. Relative paths will be checked in `vcr_cassette_dir`. """ if not os.path.isabs(path): return os.path.join(vcr_cassette_dir, path) return path extra_paths = [ extra_path_transformer(path) for marker in markers for path in marker.args ] persister = CombinedPersister(extra_paths) vcr.register_persister(persister) pytestconfig.hook.pytest_recording_configure(config=pytestconfig, vcr=vcr) return vcr.use_cassette(default_cassette, **merged_config)
) @staticmethod def deserialize(cassette_string): return json.loads(cassette_string) vcr = VCR( before_record_response=filter_access_token, cassette_library_dir="tests/integration/cassettes", match_on=["uri", "method"], path_transformer=VCR.ensure_suffix(".json"), serializer="custom_serializer", ) vcr.register_serializer("custom_serializer", CustomSerializer) vcr.register_persister(CustomPersister) def after_init(func, *args): func(*args) def add_init_hook(original_init): """Wrap an __init__ method to also call some hooks.""" @wraps(original_init) def wrapper(self, *args, **kwargs): original_init(self, *args, **kwargs) after_init(init_hook, self) return wrapper
class CustomVCR(VCR): """Derived from VCR to make setting paths easier.""" def use_cassette(self, path="", **kwargs): """Use a cassette.""" path += ".json" return super().use_cassette(path, **kwargs) VCR = CustomVCR( serializer="custom_serializer", cassette_library_dir="tests/integration/cassettes", match_on=["uri", "method"], before_record_response=filter_access_token, ) VCR.register_serializer("custom_serializer", CustomSerializer) VCR.register_persister(CustomPersister) def after_init(func, *args): func(*args) def add_init_hook(original_init): """Wrap an __init__ method to also call some hooks.""" @wraps(original_init) def wrapper(self, *args, **kwargs): original_init(self, *args, **kwargs) after_init(init_hook, self) return wrapper