from urllib.request import urlopen import socket from contextlib import contextmanager import vcr @contextmanager def overridden_dns(overrides): """ Monkeypatch socket.getaddrinfo() to override DNS lookups (name will resolve to address) """ real_getaddrinfo = socket.getaddrinfo def fake_getaddrinfo(*args, **kwargs): if args[0] in overrides: address = overrides[args[0]] return [(2, 1, 6, "", (address, args[1]))] return real_getaddrinfo(*args, **kwargs) socket.getaddrinfo = fake_getaddrinfo yield socket.getaddrinfo = real_getaddrinfo def test_ignore_localhost(tmpdir, httpbin): with overridden_dns({"httpbin.org": "127.0.0.1"}): cass_file = str(tmpdir.join("filter_qs.yaml")) with vcr.use_cassette(cass_file, ignore_localhost=True) as cass: urlopen("http://localhost:{}/".format(httpbin.port)) assert len(cass) == 0 urlopen("http://httpbin.org:{}/".format(httpbin.port)) assert len(cass) == 1 def test_ignore_httpbin(tmpdir, httpbin): with overridden_dns({"httpbin.org": "127.0.0.1"}): cass_file = str(tmpdir.join("filter_qs.yaml")) with vcr.use_cassette(cass_file, ignore_hosts=["httpbin.org"]) as cass: urlopen("http://httpbin.org:{}/".format(httpbin.port)) assert len(cass) == 0 urlopen("http://localhost:{}/".format(httpbin.port)) assert len(cass) == 1 def test_ignore_localhost_and_httpbin(tmpdir, httpbin): with overridden_dns({"httpbin.org": "127.0.0.1"}): cass_file = str(tmpdir.join("filter_qs.yaml")) with vcr.use_cassette(cass_file, ignore_hosts=["httpbin.org"], ignore_localhost=True) as cass: urlopen("http://httpbin.org:{}".format(httpbin.port)) urlopen("http://localhost:{}".format(httpbin.port)) assert len(cass) == 0 def test_ignore_localhost_twice(tmpdir, httpbin): with overridden_dns({"httpbin.org": "127.0.0.1"}): cass_file = str(tmpdir.join("filter_qs.yaml")) with vcr.use_cassette(cass_file, ignore_localhost=True) as cass: urlopen("http://localhost:{}".format(httpbin.port)) assert len(cass) == 0 urlopen("http://httpbin.org:{}".format(httpbin.port)) assert len(cass) == 1 with vcr.use_cassette(cass_file, ignore_localhost=True) as cass: assert len(cass) == 1 urlopen("http://localhost:{}".format(httpbin.port)) urlopen("http://httpbin.org:{}".format(httpbin.port)) assert len(cass) == 1