import pytest import random from fastapi.testclient import TestClient from app.main import app def register_and_login(client): # Register username = "newuser_" + str(random.randint(1000, 9999)) client.post( "/api/v1/auth/register", json={"username": username, "password": "password", "role": "user"} ) # Login response = client.post( "/api/v1/auth/login", data={"username": username, "password": "password"} ) data = response.json() return data["access_token"] def test_auth_register_login(client): token = register_and_login(client) assert token is not None def test_register_rejects_weak_password_and_invalid_email(client): weak = client.post( "/api/v1/auth/register", json={"username": "weak-user", "email": "weak@example.com", "password": "1"}, ) assert weak.status_code == 400 assert weak.json()["detail"] == "密码至少需要 8 个字符" invalid_email = client.post( "/api/v1/auth/register", json={"username": "bad-email", "email": "not-an-email", "password": "password123"}, ) assert invalid_email.status_code == 400 assert "请输入有效的邮箱地址" in str(invalid_email.json()) def test_register_rejects_duplicate_email(client): payload = { "username": "email-owner", "email": "owner@example.com", "password": "password123", } assert client.post("/api/v1/auth/register", json=payload).status_code == 200 duplicate = client.post( "/api/v1/auth/register", json={**payload, "username": "email-copy"}, ) assert duplicate.status_code == 400 assert duplicate.json()["detail"] == "该邮箱已被注册" def test_personas_crud(client): token = register_and_login(client) headers = {"Authorization": f"Bearer {token}"} # List personas response = client.get("/api/v1/personas/", headers=headers) assert response.status_code == 200 assert isinstance(response.json(), list) def test_forums_list(client): token = register_and_login(client) headers = {"Authorization": f"Bearer {token}"} response = client.get("/api/v1/forums/", headers=headers) assert response.status_code == 200 assert isinstance(response.json(), list) def test_agents_list(client): # This might be 404 if not implemented or different path response = client.get("/api/v1/agents/") # If it's 404, we accept it for now or check the real path assert response.status_code in [200, 404] def test_moderators_list(client): token = register_and_login(client) headers = {"Authorization": f"Bearer {token}"} response = client.get("/api/v1/moderators/", headers=headers) assert response.status_code == 200 assert isinstance(response.json(), list) def test_create_forum_invalid_moderator_returns_404(client): token = register_and_login(client) headers = {"Authorization": f"Bearer {token}"} persona_res = client.post( "/api/v1/personas/", headers=headers, json={ "name": "P_invalid_mod", "title": "T", "bio": "B", "theories": ["X"], "stance": "S", "system_prompt": "SP", "is_public": False } ) assert persona_res.status_code == 200 persona_id = persona_res.json()["id"] forum_res = client.post( "/api/v1/forums/", headers=headers, json={ "topic": "invalid moderator", "participant_ids": [persona_id], "duration_minutes": 10, "moderator_id": 999999 } ) assert forum_res.status_code == 404 def test_create_forum_with_duplicate_participants_succeeds(client): token = register_and_login(client) headers = {"Authorization": f"Bearer {token}"} persona_res = client.post( "/api/v1/personas/", headers=headers, json={ "name": "P_duplicate_pid", "title": "T", "bio": "B", "theories": ["X"], "stance": "S", "system_prompt": "SP", "is_public": False } ) assert persona_res.status_code == 200 persona_id = persona_res.json()["id"] forum_res = client.post( "/api/v1/forums/", headers=headers, json={ "topic": "duplicate participants", "participant_ids": [persona_id, persona_id, persona_id], "duration_minutes": 10 } ) assert forum_res.status_code == 200 body = forum_res.json() assert isinstance(body.get("participants"), list) assert len(body["participants"]) == 1 def test_god_generate_unauthorized(client): response = client.post( "/api/v1/god/generate_real", json={"prompt": "test"} ) assert response.status_code == 401