Files
weval-l99/pw-wevia-full-test.py
2026-04-19 18:05:32 +02:00

155 lines
5.9 KiB
Python

"""
WEVIA Master full Playwright test · Yacine non-tech user simulation
- Open /wevia-master.html
- Send 'wevia truth' → verify 906 agents response
- Send 'agis en multiagent' → verify SSE exec not simulate
- Send 'combien d'agents' → verify NL query works
- Video + screenshots + timing proofs
"""
import time, json
from pathlib import Path
from playwright.sync_api import sync_playwright
TS = time.strftime("%Y%m%d-%H%M%S")
OUT = Path(f"/var/www/html/test-report/wevia-full-test-{TS}")
OUT.mkdir(parents=True, exist_ok=True)
results = {"ts": TS, "steps": [], "api_tests": []}
# First: direct API tests (proof SSE works)
import urllib.request, urllib.error
def api_post(path, data, timeout=40):
req = urllib.request.Request(
f"https://weval-consulting.com{path}",
data=json.dumps(data).encode(),
headers={'Content-Type': 'application/json'},
method='POST'
)
try:
r = urllib.request.urlopen(req, timeout=timeout)
return r.read().decode(errors='replace')
except Exception as e:
return f"ERR: {e}"
# Test 1: wevia truth via API
print("[API] Testing 'wevia truth'...")
r1 = api_post("/api/wevia-master-api.php?fast=1", {"message":"wevia truth"}, timeout=15)
try:
d1 = json.loads(r1)
results["api_tests"].append({"q":"wevia truth", "intent":d1.get("intent"), "size":len(r1)})
print(f" ✓ intent={d1.get('intent')} size={len(r1)}")
except:
results["api_tests"].append({"q":"wevia truth", "raw":r1[:200]})
# Test 2: NL count
r2 = api_post("/api/wevia-master-api.php?fast=1", {"message":"combien d'agents"}, timeout=15)
try:
d2 = json.loads(r2)
results["api_tests"].append({"q":"combien d'agents", "intent":d2.get("intent"), "size":len(r2)})
print(f" ✓ intent={d2.get('intent')} size={len(r2)}")
except:
pass
# Test 3: SSE multiagent (streaming)
print("[API] Testing SSE multiagent (30s)...")
import http.client, ssl
conn = http.client.HTTPSConnection("weval-consulting.com", timeout=35, context=ssl._create_unverified_context())
conn.request("POST", "/api/wevia-master-api.php",
json.dumps({"message":"agis en multiagent 10 agents parallèles"}).encode(),
{"Content-Type": "application/json"})
resp = conn.getresponse()
sse_data = resp.read().decode(errors='replace')
conn.close()
events = []
for line in sse_data.split('\n'):
if line.startswith('data: '):
try: events.append(json.loads(line[6:]))
except: pass
sse_summary = {
"total_events": len(events),
"types": list(set(e.get("type","?") for e in events)),
"agents_count": len([e for e in events if e.get("type")=="agent"]),
"exec_results": len([e for e in events if e.get("type")=="exec_result"]),
"has_done": any(e.get("type")=="done" for e in events),
"has_llm_synthesis": any(e.get("type")=="llm_synthesis" for e in events),
}
results["sse_multiagent"] = sse_summary
print(f" ✓ SSE: {sse_summary['agents_count']} agents parallel, exec_results={sse_summary['exec_results']}")
# Now Playwright video recording
print("[PW] Opening chat UI with video...")
try:
with sync_playwright() as p:
browser = p.chromium.launch(headless=True, args=["--no-sandbox"])
ctx = browser.new_context(
viewport={"width":1400,"height":1000},
ignore_https_errors=True,
record_video_dir=str(OUT),
record_video_size={"width":1400,"height":1000}
)
page = ctx.new_page()
page.goto("https://weval-consulting.com/wevia-master.html", wait_until="networkidle", timeout=25000)
time.sleep(3)
page.screenshot(path=str(OUT/"01-chat-opened.png"), full_page=True)
results["steps"].append({"step":"chat_opened", "ok":True})
# Find input
input_sel = None
for sel in ['#chat-input', '#message', 'textarea[placeholder*="essage"]', 'textarea[placeholder*="uestion"]', 'textarea', 'input[type="text"][placeholder]']:
try:
el = page.locator(sel).first
if el.count() > 0 and el.is_visible():
input_sel = sel
print(f" Input found: {sel}")
break
except:
continue
if input_sel:
# Test 1 in UI: wevia truth
page.fill(input_sel, "wevia truth")
page.keyboard.press("Enter")
time.sleep(8)
page.screenshot(path=str(OUT/"02-truth-sent.png"), full_page=True)
results["steps"].append({"step":"truth_sent", "ok":True})
# Test 2 in UI: combien d'agents
time.sleep(2)
page.fill(input_sel, "combien d'agents")
page.keyboard.press("Enter")
time.sleep(6)
page.screenshot(path=str(OUT/"03-combien-agents.png"), full_page=True)
results["steps"].append({"step":"combien_agents", "ok":True})
# Test 3 in UI: multiagent
time.sleep(2)
page.fill(input_sel, "agis en multiagent 5 agents")
page.keyboard.press("Enter")
time.sleep(20) # SSE takes time
page.screenshot(path=str(OUT/"04-multiagent.png"), full_page=True)
results["steps"].append({"step":"multiagent", "ok":True})
else:
results["steps"].append({"step":"input_find", "ok":False, "err":"no input visible"})
ctx.close()
browser.close()
videos = list(OUT.glob("*.webm"))
results["video"] = videos[0].name if videos else None
pngs = list(OUT.glob("*.png"))
results["screenshots"] = [p.name for p in pngs]
results["total_png_size"] = sum(p.stat().st_size for p in pngs)
print(f" ✓ video={results['video']} screenshots={len(pngs)} total_size={results['total_png_size']}")
except Exception as e:
results["pw_error"] = str(e)
print(f"[PW err] {e}")
with open(OUT/"results.json","w") as f:
json.dump(results, f, indent=2)
print("\n=== SUMMARY ===")
print(json.dumps(results, indent=2, default=str)[:1500])