test_error_responses.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import json
  2. from http import HTTPStatus
  3. from pydantic import BaseModel
  4. from pydantic import ValidationError
  5. from clean_python import BadRequest
  6. from clean_python import Conflict
  7. from clean_python import DoesNotExist
  8. from clean_python import PermissionDenied
  9. from clean_python import Unauthorized
  10. from clean_python.fastapi.error_responses import conflict_handler
  11. from clean_python.fastapi.error_responses import not_found_handler
  12. from clean_python.fastapi.error_responses import permission_denied_handler
  13. from clean_python.fastapi.error_responses import unauthorized_handler
  14. from clean_python.fastapi.error_responses import validation_error_handler
  15. async def test_does_not_exist():
  16. actual = await not_found_handler(None, DoesNotExist("record", id=15))
  17. assert actual.status_code == HTTPStatus.NOT_FOUND
  18. assert json.loads(actual.body) == {"message": "Could not find record with id=15"}
  19. async def test_does_not_exist_no_id():
  20. actual = await not_found_handler(None, DoesNotExist("tafeltje"))
  21. assert actual.status_code == HTTPStatus.NOT_FOUND
  22. assert json.loads(actual.body) == {"message": "Could not find tafeltje"}
  23. async def test_conflict():
  24. actual = await conflict_handler(None, Conflict("foo"))
  25. assert actual.status_code == HTTPStatus.CONFLICT
  26. assert json.loads(actual.body) == {"message": "Conflict", "detail": "foo"}
  27. async def test_conflict_no_msg():
  28. actual = await conflict_handler(None, Conflict())
  29. assert actual.status_code == HTTPStatus.CONFLICT
  30. assert json.loads(actual.body) == {"message": "Conflict", "detail": None}
  31. async def test_unauthorized():
  32. actual = await unauthorized_handler(None, Unauthorized())
  33. assert actual.status_code == HTTPStatus.UNAUTHORIZED
  34. assert json.loads(actual.body) == {"message": "Unauthorized", "detail": None}
  35. assert actual.headers["WWW-Authenticate"] == "Bearer"
  36. async def test_unauthorized_with_msg():
  37. # message should be ignored
  38. actual = await unauthorized_handler(None, Unauthorized("foo"))
  39. assert actual.status_code == HTTPStatus.UNAUTHORIZED
  40. assert json.loads(actual.body) == {"message": "Unauthorized", "detail": None}
  41. assert actual.headers["WWW-Authenticate"] == "Bearer"
  42. async def test_permission_denied():
  43. actual = await permission_denied_handler(None, PermissionDenied())
  44. assert actual.status_code == HTTPStatus.FORBIDDEN
  45. assert json.loads(actual.body) == {"message": "Permission denied", "detail": None}
  46. async def test_permission_denied_with_msg():
  47. actual = await permission_denied_handler(None, PermissionDenied("foo"))
  48. assert actual.status_code == HTTPStatus.FORBIDDEN
  49. assert json.loads(actual.body) == {"message": "Permission denied", "detail": "foo"}
  50. class Book(BaseModel):
  51. title: str
  52. async def test_validation_error():
  53. try:
  54. Book(name="foo")
  55. except ValidationError as e:
  56. actual = await validation_error_handler(None, e)
  57. assert actual.status_code == HTTPStatus.BAD_REQUEST
  58. assert json.loads(actual.body) == {
  59. "message": "Validation error",
  60. "detail": [{"loc": ["title"], "msg": "Field required", "type": "missing"}],
  61. }
  62. async def test_bad_request_from_validation_error():
  63. try:
  64. Book(name="foo")
  65. except ValidationError as e:
  66. actual = await validation_error_handler(None, BadRequest(e))
  67. assert actual.status_code == HTTPStatus.BAD_REQUEST
  68. assert json.loads(actual.body) == {
  69. "message": "Validation error",
  70. "detail": [{"loc": ["title"], "msg": "Field required", "type": "missing"}],
  71. }
  72. async def test_bad_request_from_msg():
  73. actual = await validation_error_handler(None, BadRequest("foo"))
  74. assert actual.status_code == HTTPStatus.BAD_REQUEST
  75. assert json.loads(actual.body) == {
  76. "message": "Validation error",
  77. "detail": [{"loc": [], "msg": "foo", "type": "value_error"}],
  78. }