test_exceptions.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import httpx
  2. import pytest
  3. from gpustack.api.exceptions import (
  4. ErrorResponse,
  5. raise_if_response_error,
  6. BadRequestException,
  7. InternalServerErrorException,
  8. NotFoundException,
  9. )
  10. @pytest.mark.parametrize(
  11. "name, given, expected",
  12. [
  13. (
  14. "valid case",
  15. {"code": 404, "reason": "NotFound", "message": "Resource not found"},
  16. True,
  17. ),
  18. (
  19. "valid case with type",
  20. {
  21. "code": 404,
  22. "reason": "NotFound",
  23. "type": "NotFound",
  24. "message": "Resource not found",
  25. },
  26. True,
  27. ),
  28. (
  29. "invalid type key",
  30. {"code": 404, "type": "NotFound", "message": "Resource not found"},
  31. False,
  32. ),
  33. (
  34. "invalid code type",
  35. {"code": "404", "reason": "NotFound", "message": "Resource not found"},
  36. False,
  37. ),
  38. (
  39. "invalid reason type",
  40. {"code": 404, "reason": 123, "message": "Resource not found"},
  41. False,
  42. ),
  43. ("missing message", {"code": 404, "reason": "NotFound"}, False),
  44. ("missing reason and message", {"code": 404}, False),
  45. (
  46. "missing code",
  47. {"reason": "NotFound", "message": "Resource not found"},
  48. False,
  49. ),
  50. ],
  51. )
  52. def test_error_response_model_validate(name, given, expected):
  53. try:
  54. _ = ErrorResponse.model_validate(given)
  55. assert (
  56. expected is True
  57. ), f"Case {name} expected validation to fail but succeeded"
  58. except Exception as e:
  59. assert (
  60. expected is False
  61. ), f"Case {name} expected validation to succeed but failed: {e}"
  62. @pytest.mark.parametrize(
  63. "name, given, expected",
  64. [
  65. ("valid response", httpx.Response(status_code=200, content="..."), None),
  66. ("valid response without content", httpx.Response(status_code=204), None),
  67. (
  68. "client error response",
  69. httpx.Response(
  70. status_code=400,
  71. json={
  72. "code": 400,
  73. "reason": "BadRequest",
  74. "message": "Invalid request",
  75. },
  76. ),
  77. BadRequestException("Invalid request"),
  78. ),
  79. (
  80. "server error response",
  81. httpx.Response(
  82. status_code=500,
  83. json={
  84. "code": 500,
  85. "reason": "InternalServerError",
  86. "message": "Server error",
  87. },
  88. ),
  89. InternalServerErrorException("Server error"),
  90. ),
  91. (
  92. "not found response",
  93. httpx.Response(
  94. status_code=404,
  95. json={
  96. "code": 404,
  97. "reason": "NotFound",
  98. "message": "Resource not found",
  99. },
  100. ),
  101. NotFoundException("Resource not found"),
  102. ),
  103. (
  104. "client error openai response",
  105. httpx.Response(
  106. status_code=400,
  107. json={
  108. "error": {
  109. "code": 400,
  110. "type": "NotFound",
  111. "message": "Invalid request",
  112. }
  113. },
  114. ),
  115. BadRequestException("Invalid request"),
  116. ),
  117. (
  118. "server error openai response",
  119. httpx.Response(
  120. status_code=500,
  121. json={
  122. "error": {
  123. "code": 500,
  124. "type": "InternalServerError",
  125. "message": "Server error",
  126. }
  127. },
  128. ),
  129. InternalServerErrorException("Server error"),
  130. ),
  131. (
  132. "not found openai response",
  133. httpx.Response(
  134. status_code=404,
  135. json={
  136. "error": {
  137. "code": 404,
  138. "type": "NotFound",
  139. "message": "Resource not found",
  140. }
  141. },
  142. ),
  143. NotFoundException("Resource not found"),
  144. ),
  145. ],
  146. )
  147. def test_raise_if_response_error(name, given, expected):
  148. try:
  149. raise_if_response_error(given)
  150. assert expected is None, f"Case {name} expected get exception but none"
  151. except Exception as e:
  152. assert str(e) == str(
  153. expected
  154. ), f"Case {name} expected exception {expected} but got {e}"