Files
sales-trainer/backend/scripts/test_variant.py

57 lines
2.6 KiB
Python

"""Test: create a persona VARIANT from an existing persona (fresh identity, locked core traits)."""
import os, sys, tempfile, warnings
from pathlib import Path
warnings.filterwarnings("ignore")
BACKEND = str(Path(__file__).resolve().parents[1])
sys.path.insert(0, BACKEND)
os.environ["APP_ENV"] = "test"
os.environ["BOOTSTRAP_ADMIN_PASSWORD"] = "test-bootstrap-password"
from app.factory import create_app
from app.config import Config
td = tempfile.mkdtemp(); Config.DATA_DIR = Path(td)
sys.path.insert(0, BACKEND + "/scripts")
from mock_llm import MockLLM
app = create_app(); app.extensions["llm"] = MockLLM()
C = app.test_client()
def tok(u, p): return C.post("/api/auth/login", json={"username": u, "password": p}).get_json()["token"]
AT = tok("admin", "test-bootstrap-password"); AH = {"Authorization": f"Bearer {AT}"}
C.post("/api/auth/setup", headers=AH, json={"username":"admin","email":"a@b.co","password":"admin-ready-password","accepted_terms":True})
AT = tok("admin", "admin-ready-password"); AH = {"Authorization": f"Bearer {AT}"}
# admin creates group + analyze (15 personas)
r = C.post("/api/groups", headers=AH, json={"product":"POS CRM","segment":"SME restaurants","language":"th"})
gid = r.get_json()["group"]["id"]
C.post(f"/api/groups/{gid}/analyze", headers=AH)
ps = C.get(f"/api/groups/{gid}/personas", headers=AH).get_json()["personas"]
src = ps[0]
print("source:", src["name"], "id:", src["id"], "| pains:", len(src.get("pains", [])) if isinstance(src.get("pains"), list) else "")
# create a variant
r = C.post(f"/api/groups/{gid}/personas/{src['id']}/variant", headers=AH)
assert r.status_code == 201, (r.status_code, r.get_json())
var = r.get_json()["persona"]
print("[ok] variant created:", var.get("name"), "| id:", var.get("id"))
# it's a NEW id (not the source)
assert var["id"] != src["id"], "variant must have a new id"
# core traits locked (pains present as objects w/ description)
assert isinstance(var.get("pains", []), list), "variant must keep pains"
# added to the group
ps2 = C.get(f"/api/groups/{gid}/personas", headers=AH).get_json()["personas"]
ids = [p["id"] for p in ps2]
assert var["id"] in ids, "variant must be in the group personas"
print("[ok] variant added to group (now", len(ps2), "personas)")
# the variant can be chatted fresh (not_tried for a fresh trainee)
UT = tok("admin", "admin-ready-password"); UH = {"Authorization": f"Bearer {UT}"}
board = C.get("/api/me/board", headers=UH).get_json()
vp = next((x for x in board.get("board", []) if x["persona_id"] == var["id"]), None)
print("[ok] variant appears on my board:", (vp or {}).get("my_outcome") if vp else None)
print("ALL VARIANT TESTS PASSED")