Implement Scene 7 evidence goal flow
This commit is contained in:
@@ -125,4 +125,52 @@ suite('narrative graph runtime', () => {
|
||||
expect((await authFetch(`${baseUrl}/api/playthroughs/current`, playerTwo)).status).toBe(204)
|
||||
expect((await authFetch(`${baseUrl}/api/playthroughs/${id}/advance`, playerTwo, { method: 'POST', headers: json, body: '{}' })).status).toBe(404)
|
||||
})
|
||||
|
||||
it('blocks a level terminal until authored goals complete, then promotes their flags', async () => {
|
||||
const json = { 'content-type':'application/json' }
|
||||
await authFetch(`${baseUrl}/api/levels`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ id:'goal-src',title:'Goal Source' }) })
|
||||
const goalResponse = await authFetch(`${baseUrl}/api/levels/goal-src/goals`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ key:'demo.prove-inventor',title:'Prove the inventor claim',instructions:'Paste the source.',
|
||||
completionMessage:'Source verified.',requiredFlags:['demo.inventor-proved'] }) })
|
||||
expect(goalResponse.status).toBe(201)
|
||||
expect((await authFetch(`${baseUrl}/api/levels/goal-src/evidence-match-rules`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ name:'Known patent text',flagKey:'demo.inventor-proved',minimumAnchorMatches:1,
|
||||
anchors:[{ phrase:'Nils Aall Barricelli improved chest of drawers',minimumSimilarity:.72 }] }) })).status).toBe(201)
|
||||
expect((await authFetch(`${baseUrl}/api/levels/goal-src/templates?edit=1`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ name:'Goal Chapter',slug:'goal-chapter' }) })).status).toBe(201)
|
||||
expect((await authFetch(`${baseUrl}/api/mysteries?edit=1`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ slug:'goal-mystery',title:'Goal Mystery',cast:[] }) })).status).toBe(201)
|
||||
const mysteries = await (await authFetch(`${baseUrl}/api/admin/mysteries`, adminAuthorization)).json() as { id:string;slug:string }[]
|
||||
const mysteryId = mysteries.find(mystery => mystery.slug === 'goal-mystery')!.id
|
||||
expect((await authFetch(`${baseUrl}/api/admin/mysteries/${mysteryId}/graph`, adminAuthorization, { method:'POST',headers:json,
|
||||
body:JSON.stringify({ entry:'level',nodes:[{ key:'level',type:'level',label:'Prove it',templateSlug:'goal-chapter',x:0,y:0,
|
||||
terminals:[{ key:'continue',label:'Continue',to:null }] }] }) })).status).toBe(201)
|
||||
|
||||
const created = await authFetch(`${baseUrl}/api/playthroughs`, undefined, { method:'POST',headers:json,body:JSON.stringify({ mystery:'goal-mystery' }) })
|
||||
expect(created.status).toBe(201)
|
||||
const atLevel = await created.json() as PlaythroughState
|
||||
expect(atLevel.node?.kind).toBe('level')
|
||||
const playthroughId = atLevel.playthrough.id
|
||||
const levelSlug = atLevel.node!.levelSlug!
|
||||
|
||||
const tooEarly = await authFetch(`${baseUrl}/api/playthroughs/${playthroughId}/advance`, undefined, { method:'POST',headers:json,body:'{}' })
|
||||
expect(tooEarly.status).toBe(409)
|
||||
expect(await tooEarly.json()).toMatchObject({ errorCode:'goals_incomplete',pendingGoals:[{ key:'demo.prove-inventor' }] })
|
||||
|
||||
const upload = new FormData()
|
||||
upload.append('file',new Blob(['Patent record: Nils Aall Barricelli improved chest of drawers.'],{ type:'text/plain' }),'patent.txt')
|
||||
const uploadResponse = await fetch(`${baseUrl}/api/levels/${levelSlug}/documents`, { method:'POST',body:upload })
|
||||
expect(uploadResponse.status).toBe(201)
|
||||
expect(await uploadResponse.json()).toMatchObject({ analysis:{ awardedFlags:['demo.inventor-proved'],
|
||||
goals:[expect.objectContaining({ key:'demo.prove-inventor',status:'complete',newlyCompleted:true })] } })
|
||||
|
||||
const completed = await authFetch(`${baseUrl}/api/playthroughs/${playthroughId}/advance`, undefined, { method:'POST',headers:json,body:'{}' })
|
||||
expect(completed.status).toBe(200)
|
||||
expect((await completed.json() as PlaythroughState).playthrough.status).toBe('finished')
|
||||
expect(await (await authFetch(`${baseUrl}/api/playthroughs/${playthroughId}/achievements`, undefined)).json()).toContain('demo.inventor-proved')
|
||||
const achievement = await appPool.query<{ awarded_by_node_id:string | null }>(
|
||||
'SELECT awarded_by_node_id FROM osint.achievements WHERE playthrough_id=$1 AND flag_key=$2', [playthroughId,'demo.inventor-proved'])
|
||||
expect(achievement.rows[0].awarded_by_node_id).toBe(atLevel.node!.id)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user