Files

42 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Run real guest-input regression tests via an exported public VCC Plus grant.
Usage: python3 tests/playtest.py PRIVATE_GRANT --evidence /tmp/quiz-evidence
Requires C Assistant's Use Project Makefile and Allow Disposable Playtests.
"""
import argparse,json,os,runpy,sys,time,uuid
from pathlib import Path
ROOT=Path(__file__).resolve().parents[1]
sys.path.insert(0,str(ROOT/'tools'))
from vcc_mcp import VCC
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('grant',type=Path);p.add_argument('--evidence',required=True,type=Path)
a=p.parse_args();out=a.evidence.resolve()
if out.is_relative_to(ROOT):p.error('Keep evidence outside the watched checkout until the run completes.')
out.mkdir(parents=True,exist_ok=True)
os.environ.update(VCC_GRANT=str(a.grant.resolve()),CAPITAL_TEST_EVIDENCE=str(out),CAPITAL_TEST_STATE=str(out/'session.json'))
v=VCC(a.grant)
c=v.call('get_capabilities');assert c.get('owned_playtests'),c
b=v.call('build_project',dict(project_id=c['project_id'],revision=c['revision'],action='disk',configuration='Test',request_id=str(uuid.uuid4())))
assert 'build_id' in b,b
for _ in range(150):
receipt=v.call('get_build',dict(build_id=b['build_id']))
if receipt.get('status')!='building':break
time.sleep(.2)
assert receipt.get('status')=='succeeded',receipt
(out/'build-receipt.json').write_text(json.dumps(receipt,indent=2))
r=v.call('start_playtest',dict(project_id=c['project_id'],revision=c['revision'],artifact_id=receipt['artifact_id'],request_id=str(uuid.uuid4())))
assert 'run_id' in r,r
state=dict(cap=c,build=b,artifact=receipt,run=r)
(out/'session.json').write_text(json.dumps(state))
v.call('playtest_input',dict(run_id=r['run_id'],request_id=str(uuid.uuid4()),steps=[dict(keys=[],fields=600)]))
v.close()
support=runpy.run_path(str(Path(__file__).with_name('playtest_support.py')))
support['capture'](r['run_id'],'title');support['v'].close()
runpy.run_path(str(Path(__file__).with_name('playtest_mc.py')),run_name='__main__')
runpy.run_path(str(Path(__file__).with_name('playtest_typed.py')),run_name='__main__')
state=json.loads((out/'session.json').read_text());v=VCC(a.grant)
for r in (state['run'],state['typed_run']):
result=v.call('stop_playtest',dict(run_id=r['run_id'],request_id=str(uuid.uuid4())))
(out/('retained-'+r['run_id']+'.json')).write_text(json.dumps(result,indent=2))
v.close();print('PASS: complete multiple-choice and typed regression suite. Evidence:',out)