def test_mod_response(): router = Router() route1a = router.get("https://foo.bar/baz/") % 409 route1b = router.get("https://foo.bar/baz/") % 404 route2 = router.get("https://foo.bar") % dict(status_code=201) route3 = router.post("https://fox.zoo/") % httpx.Response(401, json={"error": "x"}) request = httpx.Request("GET", "https://foo.bar/baz/") resolved = router.resolve(request) assert resolved.response.status_code == 404 assert resolved.route is route1b assert route1a is route1b request = httpx.Request("GET", "https://foo.bar/") resolved = router.resolve(request) assert resolved.response.status_code == 201 assert resolved.route is route2 request = httpx.Request("POST", "https://fox.zoo/") resolved = router.resolve(request) assert resolved.response.status_code == 401 assert resolved.response.json() == {"error": "x"} assert resolved.route is route3 with pytest.raises(TypeError, match="Route can only"): router.route() % []
async def test_empty_router(): router = Router() request = httpx.Request("GET", "https://example.org/") with pytest.raises(AllMockedAssertionError): router.resolve(request) with pytest.raises(AllMockedAssertionError): await router.aresolve(request)
def test_side_effect_list(): router = Router() router.get("https://foo.bar/").side_effect( [httpx.Response(404), httpx.Response(201)]) request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 404 assert response.request == request request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 201 assert response.request == request
def test_url_pattern_lookup(lookups, url, expected): router = Router(assert_all_mocked=False) route = router.get(**lookups) % 418 request = httpx.Request("GET", url) response = router.resolve(request) assert bool(response.status_code == 418) is expected assert route.called is expected
def test_pass_through(): router = Router(assert_all_mocked=False) route = router.get("https://foo.bar/", path="/baz/").pass_through() request = httpx.Request("GET", "https://foo.bar/baz/") with pytest.raises(PassThrough) as exc_info: router.resolve(request) assert exc_info.value.origin is route assert exc_info.value.origin.is_pass_through route.pass_through(False) resolved = router.resolve(request) assert resolved.route is route assert not resolved.route.is_pass_through assert resolved.response is not None
def test_side_effect_list(): router = Router() route = router.get("https://foo.bar/").mock( return_value=httpx.Response(409), side_effect=[ httpx.Response(404), httpcore.NetworkError, httpx.Response(201) ], ) request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 404 assert response.request == request request = httpx.Request("GET", "https://foo.bar") with pytest.raises(httpcore.NetworkError): router.resolve(request) request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 201 assert response.request == request with pytest.raises(StopIteration): request = httpx.Request("GET", "https://foo.bar") router.resolve(request) route.side_effect = None request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 409 assert response.request == request
def test_side_effect_decorator(): router = Router() @router.route(host="ham.spam", path__regex=r"/(?P<slug>\w+)/") def foobar(request, slug): return httpx.Response(200, json={"slug": slug}) @router.post("https://example.org/") def example(request): return httpx.Response(201, json={"message": "OK"}) request = httpx.Request("GET", "https://ham.spam/egg/") response = router.resolve(request) assert response.status_code == 200 assert response.json() == {"slug": "egg"} request = httpx.Request("POST", "https://example.org/") response = router.resolve(request) assert response.status_code == 201 assert response.json() == {"message": "OK"}
def test_base_url(url, lookups, expected): router = Router(base_url="https://foo.bar/api/", assert_all_mocked=False) route = router.get(**lookups).respond(201) request = httpx.Request("GET", url) resolved = router.resolve(request) assert bool(resolved.route is route) is expected if expected: assert bool(resolved.response.status_code == 201) is expected else: assert resolved.response.status_code == 200 # auto mocked
async def test_empty_router__auto_mocked(): router = Router(assert_all_mocked=False) request = httpx.Request("GET", "https://example.org/") resolved = router.resolve(request) assert resolved.route is None assert resolved.response.status_code == 200 resolved = await router.aresolve(request) assert resolved.route is None assert resolved.response.status_code == 200
def test_resolve(args, kwargs, expected): router = Router(assert_all_mocked=False) route = router.route(*args, **kwargs).respond(status_code=201) request = httpx.Request( "GET", "https://foo.bar/baz/", cookies={"foo": "bar", "ham": "spam"} ) resolved = router.resolve(request) assert bool(resolved.route is route) is expected if expected: assert bool(resolved.response.status_code == 201) is expected else: assert resolved.response.status_code == 200 # auto mocked
def test_base_url(url, expected): router = Router(base_url="https://foo.bar/", assert_all_mocked=False) route = router.route(method="GET", url="/baz/").respond(201) request = httpx.Request("GET", url) matched_route, response = router.match(request) assert bool(matched_route is route) is expected if expected: assert bool(response.status_code == 201) is expected else: assert not response response = router.resolve(request) assert bool(response.status_code == 201) is expected
def test_side_effect_no_match(): router = Router() def no_match(request): request.respx_was_here = True return None router.get(url__startswith="https://foo.bar/").mock(side_effect=no_match) router.get(url__eq="https://foo.bar/baz/").mock( return_value=httpx.Response(204)) request = httpx.Request("GET", "https://foo.bar/baz/") response = router.resolve(request) assert response.status_code == 204 assert response.request.respx_was_here is True
def test_side_effect_exception(): router = Router() router.get("https://foo.bar/").side_effect(httpx.ConnectError) router.get("https://ham.spam/").side_effect(httpcore.NetworkError) router.get("https://egg.plant/").side_effect(httpcore.NetworkError()) request = httpx.Request("GET", "https://foo.bar") with pytest.raises(httpx.ConnectError) as e: router.resolve(request) assert e.value.request == request request = httpx.Request("GET", "https://ham.spam") with pytest.raises(httpcore.NetworkError) as e: router.resolve(request) request = httpx.Request("GET", "https://egg.plant") with pytest.raises(httpcore.NetworkError) as e: router.resolve(request)
def test_rollback(): router = Router() route = router.get("https://foo.bar/") % 404 pattern = route.pattern assert route.name is None router.snapshot() # 1. get 404 route.return_value = httpx.Response(200) router.post("https://foo.bar/").mock( side_effect=[httpx.Response(400), httpx.Response(201)]) router.snapshot() # 2. get 200, post _route = router.get("https://foo.bar/", name="foobar") _route = router.get("https://foo.bar/baz/", name="foobar") assert _route is route assert route.name == "foobar" assert route.pattern != pattern route.return_value = httpx.Response(418) request = httpx.Request("GET", "https://foo.bar/baz/") response = router.resolve(request) assert response.status_code == 418 request = httpx.Request("POST", "https://foo.bar") response = router.resolve(request) assert response.status_code == 400 assert len(router.routes) == 2 assert router.calls.call_count == 2 assert route.call_count == 1 assert route.return_value.status_code == 418 router.patch("https://foo.bar/") assert len(router.routes) == 3 route.rollback() # get 200 assert router.calls.call_count == 2 assert route.call_count == 0 assert route.return_value.status_code == 200 request = httpx.Request("GET", "https://foo.bar") response = router.resolve(request) assert response.status_code == 200 router.rollback() # 2. get 404, post request = httpx.Request("POST", "https://foo.bar") response = router.resolve(request) assert response.status_code == 400 assert len(router.routes) == 2 router.rollback() # 1. get 404 assert len(router.routes) == 1 assert router.calls.call_count == 0 assert route.return_value is None router.rollback() # Empty inital state assert len(router.routes) == 0 assert route.return_value is None # Idempotent route.rollback() router.rollback() assert len(router.routes) == 0 assert route.name is None assert route.pattern == pattern assert route.return_value is None