From 5ddf7057fb4dc3e8d7e28640e56a55a8d61b0be4 Mon Sep 17 00:00:00 2001 From: Andreas Hasenkopf Date: Tue, 22 Nov 2022 15:20:35 +0100 Subject: [PATCH] Overload TestClient.delete to accept JSON data again (#107) Starting from version 0.21 the `TestClient` in starlette is based on `httpx`, which does not accept a `json` parameter for its `delete` method. Motivation: AIMAAS expects a request body for some DELETE requests. Co-authored-by: frozenIceage --- .github/workflows/default.yml | 2 +- backend/requirements_test.txt | 2 ++ backend/tests/conftest.py | 22 +++++++++++++++++++++- backend/tests/test_dynamic_routes.py | 6 +----- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/.github/workflows/default.yml b/.github/workflows/default.yml index 5c57f0c..dc01da3 100644 --- a/.github/workflows/default.yml +++ b/.github/workflows/default.yml @@ -1,6 +1,6 @@ name: Tests -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: test: diff --git a/backend/requirements_test.txt b/backend/requirements_test.txt index d177651..32e6fae 100644 --- a/backend/requirements_test.txt +++ b/backend/requirements_test.txt @@ -1,3 +1,5 @@ +# See: https://github.com/encode/starlette/issues/1943 +httpx pytest pytest-cov pytest-mock==3.6.1 diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index 9b4c7b6..3c1fee1 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -2,6 +2,7 @@ from alembic import command from alembic.config import Config +from httpx._client import USE_CLIENT_DEFAULT import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker @@ -333,11 +334,30 @@ def testuser(dbsession) -> User: return get_user(db=dbsession, username=TEST_USER.username) +class OldStyleTestClient(TestClient): + def delete(self, url, *, params=None, headers=None, cookies=None, auth=USE_CLIENT_DEFAULT, + follow_redirects=None, allow_redirects=None, timeout=USE_CLIENT_DEFAULT, + extensions=None, json=None): + # Note: Since starlette 0.21 `TestClient.delete` no longer accepts the `json` parameter. + return self.request( + "DELETE", + url, + params=params, + headers=headers, + cookies=cookies, + auth=auth, + follow_redirects=self._choose_redirect_arg(follow_redirects, allow_redirects), + timeout=timeout, + extensions=extensions, + json=json + ) + + @pytest.fixture def client(dbsession): app = create_app(session=dbsession) app.dependency_overrides[get_db] = lambda: dbsession - client = TestClient(app) + client = OldStyleTestClient(app) yield client diff --git a/backend/tests/test_dynamic_routes.py b/backend/tests/test_dynamic_routes.py index c35bbc1..57bfbbd 100644 --- a/backend/tests/test_dynamic_routes.py +++ b/backend/tests/test_dynamic_routes.py @@ -1,7 +1,6 @@ from datetime import datetime, timezone, timedelta import pytest -from sqlalchemy import update from ..models import * from ..dynamic_routes import * @@ -13,10 +12,7 @@ class TestRouteBasics: def test_load_schema_data(self, dbsession, client): schemas = load_schemas(db=dbsession) - assert len(schemas) == 2 - - s = schemas[0] - assert s.name == 'Person' + assert {s.name for s in schemas} == {'Person', 'UnPerson'} def test_routes_were_generated(self, dbsession, client): routes = [