test_coverage_boost.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import pytest
  2. import random
  3. from unittest.mock import AsyncMock, patch
  4. from app.crud import create_user
  5. from app.schemas import UserCreate
  6. @pytest.fixture
  7. def auth_header(client, db):
  8. username = f"user_{random.randint(1, 1000000)}"
  9. create_user(db, UserCreate(username=username, password="password123", role="admin"))
  10. token = client.post("/api/v1/auth/login", data={"username": username, "password": "password123"}).json()["access_token"]
  11. return {"Authorization": f"Bearer {token}"}
  12. def test_coverage_auth(client):
  13. # Coverage for auth error paths
  14. client.post("/api/v1/auth/login", data={"username": "none", "password": "p"})
  15. client.post("/api/v1/auth/login", data={"username": "", "password": ""})
  16. def test_coverage_users(client, auth_header):
  17. client.get("/api/v1/users/me", headers=auth_header)
  18. # Unauthorized
  19. client.get("/api/v1/users/me")
  20. def test_coverage_personas(client, auth_header):
  21. # Create
  22. p = client.post("/api/v1/personas/", json={"name": "N", "bio": "B"}, headers=auth_header).json()
  23. p_id = p["id"]
  24. # Get
  25. client.get(f"/api/v1/personas/{p_id}", headers=auth_header)
  26. # Update
  27. client.put(f"/api/v1/personas/{p_id}", json={"name": "N2"}, headers=auth_header)
  28. # Delete
  29. client.delete(f"/api/v1/personas/{p_id}", headers=auth_header)
  30. # Not found
  31. client.get("/api/v1/personas/9999", headers=auth_header)
  32. def test_coverage_moderators(client, auth_header):
  33. m = client.post("/api/v1/moderators/", json={"name": "M"}, headers=auth_header).json()
  34. m_id = m["id"]
  35. client.get(f"/api/v1/moderators/{m_id}", headers=auth_header)
  36. client.put(f"/api/v1/moderators/{m_id}", json={"name": "M2"}, headers=auth_header)
  37. client.get("/api/v1/moderators/", headers=auth_header)
  38. client.delete(f"/api/v1/moderators/{m_id}", headers=auth_header)
  39. def test_coverage_users_detailed(client, auth_header):
  40. # Create user
  41. username = f"user_{random.randint(1, 1000000)}"
  42. client.post("/api/v1/users/", json={"username": username, "password": "p", "role": "u"})
  43. # Duplicate (hits line 14)
  44. client.post("/api/v1/users/", json={"username": username, "password": "p", "role": "u"})
  45. # Read user (hits 23-26)
  46. client.get(f"/api/v1/users/{username}")
  47. client.get("/api/v1/users/nonexistent")
  48. def test_coverage_forums_edge_cases(client, auth_header):
  49. # Read forum (hits 78-81)
  50. persona = client.post("/api/v1/personas/", json={"name": "Forum Persona", "bio": "B"}, headers=auth_header).json()
  51. f = client.post("/api/v1/forums/", json={"topic": "T", "participant_ids": [persona["id"]]}, headers=auth_header).json()
  52. client.get(f"/api/v1/forums/{f['id']}", headers=auth_header)
  53. # Start forum (hits 102-107)
  54. with patch("app.services.forum_service.scheduler.start_forum", new_callable=AsyncMock):
  55. client.post(f"/api/v1/forums/{f['id']}/start", headers=auth_header)
  56. # Messages/Logs fail path
  57. client.get(f"/api/v1/forums/{f['id']}/messages", headers=auth_header)
  58. client.get(f"/api/v1/forums/{f['id']}/logs", headers=auth_header)
  59. # Delete (hits 91-93)
  60. client.delete(f"/api/v1/forums/{f['id']}", headers=auth_header)
  61. def test_coverage_god_detailed(client, auth_header):
  62. events = iter([{"type": "error", "content": "mocked failure"}])
  63. with patch("app.api.v1.endpoints.god.settings.API_KEY", "test-key"), patch(
  64. "app.api.v1.endpoints.god.RealGodAgent"
  65. ) as agent_class:
  66. agent_class.return_value.run.return_value = events
  67. response = client.post("/api/v1/god/generate_real", json={"prompt": "Short", "n": 1}, headers=auth_header)
  68. assert response.status_code == 200
  69. assert "mocked failure" in response.text
  70. assert "所有智能体角色已生成并保存完毕" not in response.text
  71. def test_coverage_personas_detailed(client, auth_header):
  72. # Create public
  73. p = client.post("/api/v1/personas/", json={"name": "Public", "bio": "B", "is_public": True}, headers=auth_header).json()
  74. p_id = p["id"]
  75. # List (hits 35-79 filter logic)
  76. client.get("/api/v1/personas/", headers=auth_header)
  77. # Get/Update/Delete (hits 110, 114, 127, 131)
  78. client.get(f"/api/v1/personas/{p_id}", headers=auth_header)
  79. client.put(f"/api/v1/personas/{p_id}", json={"name": "U"}, headers=auth_header)
  80. client.delete(f"/api/v1/personas/{p_id}", headers=auth_header)
  81. def test_coverage_god(client, auth_header):
  82. persona = {
  83. "name": "Mock Person",
  84. "title": "Researcher",
  85. "bio": "Bio",
  86. "theories": ["Theory"],
  87. "stance": "Neutral",
  88. "system_prompt": "Act naturally.",
  89. }
  90. with patch("app.api.v1.endpoints.god.settings.API_KEY", "test-key"), patch(
  91. "app.api.v1.endpoints.god.RealGodAgent"
  92. ) as agent_class:
  93. agent_class.return_value.run.return_value = iter([{"type": "result", "content": [persona]}])
  94. with client.stream("POST", "/api/v1/god/generate_real", json={"prompt": "Test", "n": 1}, headers=auth_header) as response:
  95. body = response.read().decode("utf-8")
  96. assert response.status_code == 200
  97. assert "Mock Person" in body
  98. def test_god_generation_reports_missing_model_configuration(client, auth_header):
  99. with patch("app.api.v1.endpoints.god.settings.API_KEY", None), patch.dict(
  100. "os.environ", {"API_KEY": ""}
  101. ):
  102. response = client.post(
  103. "/api/v1/god/generate_real",
  104. json={"prompt": "创建哈利波特", "n": 1},
  105. headers=auth_header,
  106. )
  107. assert response.status_code == 503
  108. assert "模型服务尚未配置" in response.json()["detail"]
  109. def test_coverage_agents(client, auth_header):
  110. client.get("/api/v1/agents/", headers=auth_header)