test_int_sync_api_provider.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # This module is a copy paste of test_int_api_provider.py
  2. from http import HTTPStatus
  3. import pytest
  4. from clean_python import ctx
  5. from clean_python import Tenant
  6. from clean_python.api_client import ApiException
  7. from clean_python.api_client import SyncApiProvider
  8. @pytest.fixture
  9. def provider(fastapi_example_app) -> SyncApiProvider:
  10. ctx.tenant = Tenant(id=2, name="")
  11. yield SyncApiProvider(
  12. fastapi_example_app + "/", lambda: {"Authorization": "Bearer token"}
  13. )
  14. ctx.tenant = None
  15. def test_request_params(provider: SyncApiProvider):
  16. response = provider.request("GET", "v1/books", params={"limit": 10, "offset": 2})
  17. assert isinstance(response, dict)
  18. assert response["limit"] == 10
  19. assert response["offset"] == 2
  20. def test_request_json_body(provider: SyncApiProvider):
  21. response = provider.request(
  22. "POST", "v1/books", json={"title": "test_body", "author": {"name": "foo"}}
  23. )
  24. assert isinstance(response, dict)
  25. assert response["title"] == "test_body"
  26. assert response["author"] == {"name": "foo"}
  27. def test_request_form_body(provider: SyncApiProvider):
  28. response = provider.request("POST", "v1/form", fields={"name": "foo"})
  29. assert isinstance(response, dict)
  30. assert response["name"] == "foo"
  31. def test_request_form_file(provider: SyncApiProvider):
  32. response = provider.request("POST", "v1/file", fields={"file": ("x.txt", b"foo")})
  33. assert isinstance(response, dict)
  34. assert response["x.txt"] == "foo"
  35. @pytest.fixture
  36. def book(provider: SyncApiProvider):
  37. return provider.request(
  38. "POST", "v1/books", json={"title": "fixture", "author": {"name": "foo"}}
  39. )
  40. def test_no_content(provider: SyncApiProvider, book):
  41. response = provider.request("DELETE", f"v1/books/{book['id']}")
  42. assert response is None
  43. def test_not_found(provider: SyncApiProvider):
  44. with pytest.raises(ApiException) as e:
  45. provider.request("GET", "v1/book")
  46. assert e.value.status is HTTPStatus.NOT_FOUND
  47. assert e.value.args[0] == {"detail": "Not Found"}
  48. def test_bad_request(provider: SyncApiProvider):
  49. with pytest.raises(ApiException) as e:
  50. provider.request("GET", "v1/books", params={"limit": "foo"})
  51. assert e.value.status is HTTPStatus.BAD_REQUEST
  52. assert e.value.args[0]["detail"][0]["loc"] == ["query", "limit"]
  53. def test_no_json_response(provider: SyncApiProvider):
  54. with pytest.raises(ApiException) as e:
  55. provider.request("GET", "v1/text")
  56. assert e.value.args[0] == "Unexpected content type 'text/plain; charset=utf-8'"
  57. def test_urlencode(provider: SyncApiProvider):
  58. response = provider.request("PUT", "v1/urlencode/x?")
  59. assert isinstance(response, dict)
  60. assert response["name"] == "x?"
  61. def test_request_raw(provider: SyncApiProvider, book):
  62. response = provider.request_raw("GET", f"v1/books/{book['id']}")
  63. assert response.status is HTTPStatus.OK
  64. assert len(response.data) > 0
  65. assert response.content_type == "application/json"