57 lines
2.6 KiB
Python
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")
|