test_all_endpoints.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import pytest
  2. import random
  3. from fastapi.testclient import TestClient
  4. from app.main import app
  5. def register_and_login(client):
  6. # Register
  7. username = "newuser_" + str(random.randint(1000, 9999))
  8. client.post(
  9. "/api/v1/auth/register",
  10. json={"username": username, "password": "password", "role": "user"}
  11. )
  12. # Login
  13. response = client.post(
  14. "/api/v1/auth/login",
  15. data={"username": username, "password": "password"}
  16. )
  17. data = response.json()
  18. return data["access_token"]
  19. def test_auth_register_login(client):
  20. token = register_and_login(client)
  21. assert token is not None
  22. def test_register_rejects_weak_password_and_invalid_email(client):
  23. weak = client.post(
  24. "/api/v1/auth/register",
  25. json={"username": "weak-user", "email": "weak@example.com", "password": "1"},
  26. )
  27. assert weak.status_code == 400
  28. assert weak.json()["detail"] == "密码至少需要 8 个字符"
  29. invalid_email = client.post(
  30. "/api/v1/auth/register",
  31. json={"username": "bad-email", "email": "not-an-email", "password": "password123"},
  32. )
  33. assert invalid_email.status_code == 400
  34. assert "请输入有效的邮箱地址" in str(invalid_email.json())
  35. def test_register_rejects_duplicate_email(client):
  36. payload = {
  37. "username": "email-owner",
  38. "email": "owner@example.com",
  39. "password": "password123",
  40. }
  41. assert client.post("/api/v1/auth/register", json=payload).status_code == 200
  42. duplicate = client.post(
  43. "/api/v1/auth/register",
  44. json={**payload, "username": "email-copy"},
  45. )
  46. assert duplicate.status_code == 400
  47. assert duplicate.json()["detail"] == "该邮箱已被注册"
  48. def test_personas_crud(client):
  49. token = register_and_login(client)
  50. headers = {"Authorization": f"Bearer {token}"}
  51. # List personas
  52. response = client.get("/api/v1/personas/", headers=headers)
  53. assert response.status_code == 200
  54. assert isinstance(response.json(), list)
  55. def test_forums_list(client):
  56. token = register_and_login(client)
  57. headers = {"Authorization": f"Bearer {token}"}
  58. response = client.get("/api/v1/forums/", headers=headers)
  59. assert response.status_code == 200
  60. assert isinstance(response.json(), list)
  61. def test_agents_list(client):
  62. # This might be 404 if not implemented or different path
  63. response = client.get("/api/v1/agents/")
  64. # If it's 404, we accept it for now or check the real path
  65. assert response.status_code in [200, 404]
  66. def test_moderators_list(client):
  67. token = register_and_login(client)
  68. headers = {"Authorization": f"Bearer {token}"}
  69. response = client.get("/api/v1/moderators/", headers=headers)
  70. assert response.status_code == 200
  71. assert isinstance(response.json(), list)
  72. def test_create_forum_invalid_moderator_returns_404(client):
  73. token = register_and_login(client)
  74. headers = {"Authorization": f"Bearer {token}"}
  75. persona_res = client.post(
  76. "/api/v1/personas/",
  77. headers=headers,
  78. json={
  79. "name": "P_invalid_mod",
  80. "title": "T",
  81. "bio": "B",
  82. "theories": ["X"],
  83. "stance": "S",
  84. "system_prompt": "SP",
  85. "is_public": False
  86. }
  87. )
  88. assert persona_res.status_code == 200
  89. persona_id = persona_res.json()["id"]
  90. forum_res = client.post(
  91. "/api/v1/forums/",
  92. headers=headers,
  93. json={
  94. "topic": "invalid moderator",
  95. "participant_ids": [persona_id],
  96. "duration_minutes": 10,
  97. "moderator_id": 999999
  98. }
  99. )
  100. assert forum_res.status_code == 404
  101. def test_create_forum_with_duplicate_participants_succeeds(client):
  102. token = register_and_login(client)
  103. headers = {"Authorization": f"Bearer {token}"}
  104. persona_res = client.post(
  105. "/api/v1/personas/",
  106. headers=headers,
  107. json={
  108. "name": "P_duplicate_pid",
  109. "title": "T",
  110. "bio": "B",
  111. "theories": ["X"],
  112. "stance": "S",
  113. "system_prompt": "SP",
  114. "is_public": False
  115. }
  116. )
  117. assert persona_res.status_code == 200
  118. persona_id = persona_res.json()["id"]
  119. forum_res = client.post(
  120. "/api/v1/forums/",
  121. headers=headers,
  122. json={
  123. "topic": "duplicate participants",
  124. "participant_ids": [persona_id, persona_id, persona_id],
  125. "duration_minutes": 10
  126. }
  127. )
  128. assert forum_res.status_code == 200
  129. body = forum_res.json()
  130. assert isinstance(body.get("participants"), list)
  131. assert len(body["participants"]) == 1
  132. def test_god_generate_unauthorized(client):
  133. response = client.post(
  134. "/api/v1/god/generate_real",
  135. json={"prompt": "test"}
  136. )
  137. assert response.status_code == 401