test_service_auth.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from http import HTTPStatus
  2. import pytest
  3. from fastapi.testclient import TestClient
  4. from clean_python import InMemoryGateway
  5. from clean_python.fastapi import get
  6. from clean_python.fastapi import Resource
  7. from clean_python.fastapi import Service
  8. from clean_python.fastapi import v
  9. from clean_python.oauth2 import OAuth2SPAClientSettings
  10. from clean_python.oauth2 import TokenVerifierSettings
  11. class FooResource(Resource, version=v(1), name="testing"):
  12. @get("/foo")
  13. def testing(self):
  14. return "ok"
  15. @pytest.fixture
  16. def app(settings: TokenVerifierSettings):
  17. return Service(FooResource()).create_app(
  18. title="test",
  19. description="testing",
  20. hostname="testserver",
  21. auth=settings,
  22. access_logger_gateway=InMemoryGateway([]),
  23. )
  24. @pytest.fixture
  25. def client(app):
  26. return TestClient(app)
  27. @pytest.mark.usefixtures("jwk_patched")
  28. def test_no_header(app, client: TestClient):
  29. response = client.get(app.url_path_for("v1/testing"))
  30. assert response.status_code == HTTPStatus.UNAUTHORIZED
  31. @pytest.mark.usefixtures("jwk_patched")
  32. def test_ok(app, client: TestClient, token_generator):
  33. response = client.get(
  34. app.url_path_for("v1/testing"),
  35. headers={"Authorization": "Bearer " + token_generator()},
  36. )
  37. assert response.status_code == HTTPStatus.OK
  38. @pytest.fixture
  39. def app2(settings: TokenVerifierSettings):
  40. return Service(FooResource()).create_app(
  41. title="test",
  42. description="testing",
  43. hostname="testserver",
  44. auth=settings,
  45. auth_client=OAuth2SPAClientSettings(
  46. client_id="123",
  47. token_url="https://server/token",
  48. authorization_url="https://server/token",
  49. ),
  50. access_logger_gateway=InMemoryGateway([]),
  51. )
  52. @pytest.fixture
  53. def client2(app):
  54. return TestClient(app)
  55. @pytest.mark.usefixtures("jwk_patched")
  56. def test_no_header2(app2, client2: TestClient):
  57. response = client2.get(app2.url_path_for("v1/testing"))
  58. assert response.status_code == HTTPStatus.UNAUTHORIZED
  59. @pytest.mark.usefixtures("jwk_patched")
  60. def test_ok2(app2, client2: TestClient, token_generator):
  61. response = client2.get(
  62. app2.url_path_for("v1/testing"),
  63. headers={"Authorization": "Bearer " + token_generator()},
  64. )
  65. assert response.status_code == HTTPStatus.OK