import pytest from fastapi.testclient import TestClient from tests.golden.test_auth_tenant_isolation import login from tests.golden.test_auth_tenant_isolation import secure_app as secure_app_fixture secure_app = secure_app_fixture @pytest.mark.parametrize("placeholder", ["新话题", "新任务", "新会话", " 新话题 "]) def test_automatic_title_persists_once_without_reordering_history(secure_app, placeholder): client = TestClient(secure_app) login(client, "planner") created = client.post("/api/sessions", json={ "projectId": "__personal__", "title": placeholder, }).json()["session"] url = f"/api/sessions/{created['id']}" response = client.patch(url, json={"title": "检查新工厂排产数据", "onlyIfUntitled": True}) assert response.status_code == 200 assert response.json()["title"] == "检查新工厂排产数据" # Repeated effects and delayed requests must not rename an already named task. assert client.patch(url, json={"title": "另一条请求", "onlyIfUntitled": True}).json()["title"] == "检查新工厂排产数据" saved = next(row for row in client.get("/api/workspace").json()["sessions"] if row["id"] == created["id"]) assert saved["title"] == "检查新工厂排产数据" assert saved["updatedAt"] == created["updatedAt"] def test_delayed_automatic_title_preserves_manual_rename(secure_app): client = TestClient(secure_app) login(client, "planner") created = client.post("/api/projects", json={"name": "标题测试"}).json()["session"] url = f"/api/sessions/{created['id']}" assert client.patch(url, json={"title": "我的排产复核"}).status_code == 200 assert client.patch(url, json={"title": "首条问题摘要", "onlyIfUntitled": True}).json()["title"] == "我的排产复核" def test_automatic_title_respects_project_and_personal_permissions(secure_app): owner, viewer = TestClient(secure_app), TestClient(secure_app) login(owner, "planner") login(viewer, "viewer") project = owner.post("/api/projects", json={"name": "只读标题测试"}).json() owner.post(f"/api/projects/{project['project']['id']}/members", json={"userId": 1003, "role": "viewer"}) personal = owner.post("/api/sessions", json={"projectId": "__personal__"}).json()["session"] for sid in [project["session"]["id"], personal["id"]]: assert viewer.patch(f"/api/sessions/{sid}", json={"title": "越权标题", "onlyIfUntitled": True}).status_code == 403