test_api_callback.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import json
  2. import sys
  3. import unittest
  4. from io import StringIO
  5. from unittest.mock import patch
  6. from scripts import test_api_callback
  7. class ApiCallbackScriptTests(unittest.TestCase):
  8. def test_completed_payload_matches_current_api_contract(self):
  9. payload = test_api_callback.build_callback_payload("completed")
  10. self.assertEqual(payload["status"], "completed")
  11. self.assertIn("final_review_url", payload)
  12. self.assertNotIn("error", payload)
  13. self.assertEqual(
  14. set(payload),
  15. {
  16. "request_id",
  17. "txbId",
  18. "status",
  19. "resultPath",
  20. "files",
  21. "final_review_url",
  22. },
  23. )
  24. def test_failed_payload_matches_current_api_contract(self):
  25. payload = test_api_callback.build_callback_payload("failed")
  26. self.assertEqual(payload["status"], "failed")
  27. self.assertTrue(payload["resultPath"].startswith("error: "))
  28. self.assertIn("error", payload)
  29. self.assertNotIn("final_review_url", payload)
  30. def test_send_callback_posts_utf8_json_and_returns_response(self):
  31. class FakeResponse:
  32. status = 200
  33. def __enter__(self):
  34. return self
  35. def __exit__(self, *_args):
  36. return False
  37. def read(self):
  38. return '{"code":0,"message":"成功"}'.encode("utf-8")
  39. payload = test_api_callback.build_callback_payload("completed")
  40. with patch.object(
  41. test_api_callback, "urlopen", return_value=FakeResponse()
  42. ) as mocked_urlopen:
  43. response = test_api_callback.send_callback(
  44. test_api_callback.CALLBACK_URL, payload
  45. )
  46. request = mocked_urlopen.call_args.args[0]
  47. self.assertEqual(request.method, "POST")
  48. self.assertEqual(
  49. request.headers["Content-type"], "application/json; charset=utf-8"
  50. )
  51. self.assertEqual(json.loads(request.data.decode("utf-8")), payload)
  52. self.assertEqual(response.status, 200)
  53. self.assertIn("成功", response.body)
  54. def test_main_treats_http_200_with_business_400_as_failure(self):
  55. response = test_api_callback.CallbackResponse(
  56. status=200,
  57. body='{"code":400,"message":"txbId不存在"}',
  58. )
  59. with patch.object(sys, "argv", ["test_api_callback.py", "--send"]), patch.object(
  60. test_api_callback, "send_callback", return_value=response
  61. ), patch("sys.stdout", new_callable=StringIO) as output:
  62. exit_code = test_api_callback.main()
  63. self.assertEqual(exit_code, 1)
  64. self.assertIn("业务码: 400(失败)", output.getvalue())
  65. if __name__ == "__main__":
  66. unittest.main()