test_api_provider.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 SyncApiProvider
  7. @pytest.fixture
  8. def provider(fastapi_example_app) -> SyncApiProvider:
  9. ctx.tenant = Tenant(id=2, name="")
  10. yield SyncApiProvider(fastapi_example_app + "/", lambda a, b: "token")
  11. ctx.tenant = None
  12. def test_request_params(provider: SyncApiProvider):
  13. response = provider.request("GET", "v1/books", params={"limit": 10, "offset": 2})
  14. assert isinstance(response, dict)
  15. assert response["limit"] == 10
  16. assert response["offset"] == 2
  17. def test_request_json_body(provider: SyncApiProvider):
  18. response = provider.request(
  19. "POST", "v1/books", json={"title": "test_body", "author": {"name": "foo"}}
  20. )
  21. assert isinstance(response, dict)
  22. assert response["title"] == "test_body"
  23. assert response["author"] == {"name": "foo"}
  24. def test_request_form_body(provider: SyncApiProvider):
  25. response = provider.request("POST", "v1/form", fields={"name": "foo"})
  26. assert isinstance(response, dict)
  27. assert response["name"] == "foo"
  28. def test_request_form_file(provider: SyncApiProvider):
  29. response = provider.request("POST", "v1/file", fields={"file": ("x.txt", b"foo")})
  30. assert isinstance(response, dict)
  31. assert response["x.txt"] == "foo"
  32. @pytest.fixture
  33. def book(provider: SyncApiProvider):
  34. return provider.request(
  35. "POST", "v1/books", json={"title": "fixture", "author": {"name": "foo"}}
  36. )
  37. def test_no_content(provider: SyncApiProvider, book):
  38. response = provider.request("DELETE", f"v1/books/{book['id']}")
  39. assert response is None
  40. def test_not_found(provider: SyncApiProvider):
  41. with pytest.raises(ApiException) as e:
  42. provider.request("GET", "v1/book")
  43. assert e.value.status is HTTPStatus.NOT_FOUND
  44. assert e.value.args[0] == {"detail": "Not Found"}
  45. def test_bad_request(provider: SyncApiProvider):
  46. with pytest.raises(ApiException) as e:
  47. provider.request("GET", "v1/books", params={"limit": "foo"})
  48. assert e.value.status is HTTPStatus.BAD_REQUEST
  49. assert e.value.args[0]["detail"][0]["loc"] == ["query", "limit"]
  50. def test_no_json_response(provider: SyncApiProvider):
  51. with pytest.raises(ApiException) as e:
  52. provider.request("GET", "v1/text")
  53. assert e.value.args[0] == "Unexpected content type 'text/plain; charset=utf-8'"
  54. def test_urlencode(provider: SyncApiProvider):
  55. response = provider.request("PUT", "v1/urlencode/x?")
  56. assert isinstance(response, dict)
  57. assert response["name"] == "x?"