test_int_api_provider.py 3.0 KB

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