test_enterprise.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. """
  2. 企业模块测试用例。
  3. """
  4. import pytest
  5. from fastapi.testclient import TestClient
  6. from app.core.dependencies import get_current_user, db_getter, redis_getter
  7. @pytest.fixture
  8. def app_with_auth():
  9. """创建带认证覆盖的测试应用"""
  10. from unittest.mock import MagicMock
  11. from main import create_app
  12. from app.core.database import async_db_session
  13. from app.api.v1.module_system.auth.schema import AuthSchema
  14. from app.api.v1.module_system.user.model import UserModel
  15. app = create_app()
  16. async def override_get_current_user(
  17. request,
  18. db,
  19. redis,
  20. token,
  21. ):
  22. """覆盖 get_current_user,返回模拟的超级管理员用户"""
  23. mock_user = MagicMock(spec=UserModel)
  24. mock_user.id = 1
  25. mock_user.username = "test_user"
  26. mock_user.is_superuser = True
  27. mock_user.roles = []
  28. mock_user.dept = None
  29. mock_user.positions = []
  30. auth = AuthSchema(db=db, check_data_scope=False)
  31. auth.user = mock_user
  32. return auth
  33. async def override_db_getter():
  34. """覆盖数据库会话,使用真实的异步会话"""
  35. async with async_db_session() as session:
  36. yield session
  37. async def override_redis_getter(request):
  38. """覆盖 Redis getter"""
  39. from app.core.database import async_redis_connect
  40. redis = await async_redis_connect()
  41. yield redis
  42. await redis.aclose()
  43. app.dependency_overrides[get_current_user] = override_get_current_user
  44. app.dependency_overrides[db_getter] = override_db_getter
  45. app.dependency_overrides[redis_getter] = override_redis_getter
  46. yield app
  47. app.dependency_overrides.clear()
  48. @pytest.fixture
  49. def auth_client(app_with_auth):
  50. """创建带认证的测试客户端"""
  51. with TestClient(app_with_auth) as client:
  52. yield client
  53. def test_create_enterprise_success(auth_client: TestClient) -> None:
  54. """
  55. 测试创建企业成功场景。
  56. 参数:
  57. - auth_client (TestClient): 带认证的测试客户端。
  58. """
  59. data = {
  60. "name": "测试企业",
  61. "short_name": "测试",
  62. "identity_type": "ALIPAY_USER_ID",
  63. "identity": "2088123456789012",
  64. "register_mode": "NORMAL",
  65. "sign_fund_way": "BALANCE",
  66. }
  67. response = auth_client.post("/payment/enterprise", json=data)
  68. assert response.status_code == 200
  69. body = response.json()
  70. assert body["success"] is True
  71. assert body["code"] == 0
  72. assert body["msg"] == "创建企业成功"
  73. assert body["data"] is not None
  74. assert body["data"]["name"] == "测试企业"
  75. assert body["data"]["out_biz_no"] is not None
  76. assert body["data"]["status"] == "ENTERPRISE_CREATE"
  77. def test_create_enterprise_with_optional_fields(auth_client: TestClient) -> None:
  78. """
  79. 测试创建企业时传入可选字段。
  80. 参数:
  81. - auth_client (TestClient): 带认证的测试客户端。
  82. """
  83. data = {
  84. "name": "测试企业完整",
  85. "short_name": "完整测试",
  86. "identity_type": "ALIPAY_LOGON_ID",
  87. "identity": "test@example.com",
  88. "register_mode": "NORMAL",
  89. "sign_fund_way": "CREDIT",
  90. "base_info": {
  91. "industry": "互联网",
  92. "enterprise_code": "91110000XXXXXXXX",
  93. "enterprise_name": "测试企业全称",
  94. },
  95. }
  96. response = auth_client.post("/payment/enterprise", json=data)
  97. assert response.status_code == 200
  98. body = response.json()
  99. assert body["success"] is True
  100. assert body["data"]["name"] == "测试企业完整"
  101. def test_create_enterprise_invalid_identity(auth_client: TestClient) -> None:
  102. """
  103. 测试创建企业时 identity 和 identity_open_id 都为空的情况。
  104. 参数:
  105. - auth_client (TestClient): 带认证的测试客户端。
  106. """
  107. data = {
  108. "name": "测试企业",
  109. "identity_type": "ALIPAY_USER_ID",
  110. "register_mode": "NORMAL",
  111. "sign_fund_way": "BALANCE",
  112. }
  113. response = auth_client.post("/payment/enterprise", json=data)
  114. assert response.status_code == 422
  115. def test_create_enterprise_duplicate_biz_no(auth_client: TestClient) -> None:
  116. """
  117. 测试使用相同的 out_biz_no 创建企业(幂等性)。
  118. 参数:
  119. - auth_client (TestClient): 带认证的测试客户端。
  120. """
  121. data = {
  122. "name": "测试企业A",
  123. "short_name": "测试A",
  124. "identity_type": "ALIPAY_USER_ID",
  125. "identity": "2088123456789012",
  126. "register_mode": "NORMAL",
  127. "sign_fund_way": "BALANCE",
  128. }
  129. response1 = auth_client.post("/payment/enterprise", json=data)
  130. assert response1.status_code == 200
  131. data2 = {
  132. "name": "测试企业B",
  133. "short_name": "测试B",
  134. "identity_type": "ALIPAY_USER_ID",
  135. "identity": "2088123456789013",
  136. "register_mode": "NORMAL",
  137. "sign_fund_way": "BALANCE",
  138. }
  139. response2 = auth_client.post("/payment/enterprise", json=data2)
  140. assert response2.status_code == 200
  141. if __name__ == "__main__":
  142. pytest.main(["-v", __file__])