| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import pytest
- def get_auth_headers(client, username="testuser", password="password123"):
- client.post("/api/v1/auth/register", json={"username": username, "password": password})
- response = client.post(
- "/api/v1/auth/login",
- data={"username": username, "password": password}
- )
- token = response.json()["access_token"]
- return {"Authorization": f"Bearer {token}"}
- def test_create_user(client):
- response = client.post(
- "/api/v1/users/",
- json={"username": "testuser", "password": "password123", "role": "user"}
- )
- assert response.status_code == 200
- data = response.json()
- assert data["username"] == "testuser"
- assert "id" in data
- def test_login(client):
- client.post("/api/v1/users/", json={"username": "testuser", "password": "password123", "role": "user"})
- response = client.post(
- "/api/v1/auth/login",
- data={"username": "testuser", "password": "password123"}
- )
- assert response.status_code == 200
- assert "access_token" in response.json()
- def test_create_persona(client):
- # Register and login
- headers = get_auth_headers(client)
-
- # We still need owner_id in API, but current_user is inferred from token.
- # Actually, API ignores owner_id in body if we use current_user.id,
- # but the schema might require it?
- # Checking endpoints/personas.py: create_new_persona takes owner_id param?
- # No, we updated it to use current_user.id.
- # BUT, the function signature `create_new_persona(persona, current_user, db)`
- # means `owner_id` is NOT a query param anymore in our update?
- # Wait, in endpoints/personas.py I wrote:
- # def create_new_persona(persona: PersonaCreate, current_user: ..., db: ...):
- # return create_persona(db=db, persona=persona, owner_id=current_user.id)
- # So `owner_id` query param is GONE.
-
- response = client.post(
- "/api/v1/personas/",
- headers=headers,
- json={
- "name": "Socrates",
- "bio": "Greek philosopher",
- "theories": ["Method", "Ethics"],
- "is_public": False
- }
- )
- assert response.status_code == 200
- data = response.json()
- assert data["name"] == "Socrates"
- # Ensure owner_id matches the user from token (which is created first, likely id=1)
- assert data["owner_id"] == 1
- def test_persona_name_is_trimmed_and_blank_name_is_rejected(client):
- headers = get_auth_headers(client, username="persona-validation")
- created = client.post(
- "/api/v1/personas/",
- headers=headers,
- json={"name": " Trimmed Persona "},
- )
- assert created.status_code == 200
- assert created.json()["name"] == "Trimmed Persona"
- blank = client.post(
- "/api/v1/personas/",
- headers=headers,
- json={"name": " "},
- )
- assert blank.status_code == 400
- assert blank.json()["message"] == "请求参数验证失败"
- update = client.put(
- f"/api/v1/personas/{created.json()['id']}",
- headers=headers,
- json={"name": "\t"},
- )
- assert update.status_code == 400
- def test_database_startup_repairs_legacy_blank_persona_name(db):
- from app.db.client import db_manager, fetch_one
- db.execute(
- "INSERT INTO personas (owner_id, name, theories, is_public) VALUES (?, ?, ?, ?)",
- [1, " ", "[]", 0],
- )
- row = fetch_one(db.execute("SELECT MAX(id) AS id FROM personas"))
- persona_id = row.id
- db.close()
- db_manager.init_db()
- repaired_db = db_manager.get_connection()
- try:
- repaired = fetch_one(
- repaired_db.execute("SELECT name FROM personas WHERE id = ?", [persona_id])
- )
- assert repaired.name == f"未命名智能体 #{persona_id}"
- db_manager.init_db()
- unchanged = fetch_one(
- repaired_db.execute("SELECT name FROM personas WHERE id = ?", [persona_id])
- )
- assert unchanged.name == repaired.name
- finally:
- repaired_db.close()
- def test_create_forum(client):
- headers = get_auth_headers(client)
-
- # Create personas first
- p1 = client.post("/api/v1/personas/", headers=headers, json={"name": "P1"}).json()
- p2 = client.post("/api/v1/personas/", headers=headers, json={"name": "P2"}).json()
-
- # Create forum (creator_id inferred from token)
- response = client.post(
- "/api/v1/forums/",
- headers=headers,
- json={
- "topic": "Philosophy",
- "participant_ids": [p1["id"], p2["id"]]
- }
- )
- assert response.status_code == 200
- data = response.json()
- assert data["topic"] == "Philosophy"
- assert data["creator_id"] == 1
- def test_post_message(client):
- headers = get_auth_headers(client)
-
- # Setup
- p1 = client.post("/api/v1/personas/", headers=headers, json={"name": "P1"}).json()
- f = client.post("/api/v1/forums/", headers=headers, json={"topic": "T", "participant_ids": [p1["id"]]}).json()
-
- response = client.post(
- f"/api/v1/forums/{f['id']}/messages",
- headers=headers,
- json={
- "forum_id": f['id'],
- "persona_id": p1['id'],
- "speaker_name": "P1",
- "content": "Know thyself",
- "turn_count": 1
- }
- )
- assert response.status_code == 200
- data = response.json()
- assert data["content"] == "Know thyself"
- def test_get_messages(client):
- headers = get_auth_headers(client)
- p1 = client.post("/api/v1/personas/", headers=headers, json={"name": "P1"}).json()
- f = client.post("/api/v1/forums/", headers=headers, json={"topic": "T", "participant_ids": [p1["id"]]}).json()
-
- client.post(f"/api/v1/forums/{f['id']}/messages", headers=headers, json={
- "forum_id": f['id'], "persona_id": p1['id'], "speaker_name": "P1", "content": "Msg1", "turn_count": 1
- })
-
- response = client.get(f"/api/v1/forums/{f['id']}/messages", headers=headers)
- assert response.status_code == 200
- data = response.json()
- assert len(data) > 0
- assert data[0]["content"] == "Msg1"
- def test_chat_with_agent(client):
- response = client.post(
- "/api/v1/agents/chat",
- json={
- "agent_name": "TestAgent",
- "persona_json": {
- "name": "TestAgent",
- "title": "Tester",
- "bio": "A test agent",
- "theories": ["Testing"],
- "system_prompt": "You are a test agent."
- },
- "context_messages": [
- {"speaker": "User", "content": "Hello"}
- ]
- }
- )
- assert response.status_code != 404
- assert response.status_code != 422
|