aps-agent/tests/golden/test_project_file_upload.py

90 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ============================================================
# Web 本地工程数据文件上传黄金测试(AG-08 扩展)
# 覆盖:multipart 上传 → 项目 workDir 自动落位 → 目录分析可见
# ============================================================
from __future__ import annotations
import os
import pytest
from fastapi.testclient import TestClient
from server.aps_domain.folder_pack import analyze_work_dir
from server.state.seed import seed_world
from tests.auth_provider import install_test_auth
@pytest.fixture()
def secure_app(tmp_path, monkeypatch):
monkeypatch.setenv("APS_DB_PATH", str(tmp_path / "tenant.db"))
monkeypatch.setenv("APS_WORLD_PATH", str(tmp_path / "world.json"))
monkeypatch.setenv("APS_DATA_DIR", str(tmp_path / "aps-data"))
import server.state.store as world_store
from server.db.database import reset_engine
install_test_auth(monkeypatch, "tenant-a-000000000000000000000001")
world_store._stores.clear()
reset_engine()
from server.gateway.app import create_app
app = create_app()
yield app
reset_engine()
world_store._stores.clear()
def _login(client: TestClient) -> None:
response = client.post("/api/auth/login", json={
"method": "password", "username": "planner", "password": "test",
})
assert response.status_code == 200
def test_upload_local_files_then_folder_analysis(secure_app, monkeypatch):
client = TestClient(secure_app)
_login(client)
created = client.post("/api/projects", json={"name": "浏览器项目"}).json()
pid = created["project"]["id"]
sid = created["session"]["id"]
csv = "订单号,客户,产品编码,数量,交期\nSO-DEMO-1,比亚迪,A0050101-00280,1,2026-08-30\n"
response = client.post(
f"/api/projects/{pid}/files/upload",
files=[("files", ("订单-样例.csv", csv.encode("utf-8"), "text/csv"))],
)
assert response.status_code == 200, response.text
body = response.json()
assert body["saved"] == ["订单-样例.csv"]
assert body["workDir"]
assert os.path.isfile(os.path.join(body["workDir"], "订单-样例.csv"))
snap = client.get("/api/workspace").json()
project = next(p for p in snap["projects"] if p["id"] == pid)
assert project["workDir"] == body["workDir"]
assert any(f["projectId"] == pid and f["name"] == "订单-样例.csv" for f in snap["files"])
class FakePS:
def snapshot(self, include_messages=False):
return {
"projects": [{"id": pid, "name": "浏览器项目", "workDir": body["workDir"]}],
"sessions": [{"id": sid, "projectId": pid}],
"files": [],
}
monkeypatch.setattr("server.state.projects.get_project_store", lambda: FakePS())
report = analyze_work_dir(seed_world(), sid)
assert report["ok"] is True
assert any(f["name"] == "订单-样例.csv" for f in report["files"])
def test_upload_rejects_unsupported_extension(secure_app):
client = TestClient(secure_app)
_login(client)
created = client.post("/api/projects", json={"name": "拒绝测试"}).json()
pid = created["project"]["id"]
response = client.post(
f"/api/projects/{pid}/files/upload",
files=[("files", ("说明.docx", b"docx", "application/octet-stream"))],
)
assert response.status_code == 400
assert "仅支持" in response.json()["detail"]