Reevaluate existing evidence when rules change
This commit is contained in:
@@ -250,6 +250,37 @@ suite('normalized level persistence API', () => {
|
||||
])
|
||||
})
|
||||
|
||||
it('evaluates existing documents when an evidence fingerprint is added later', async () => {
|
||||
const created = await adminFetch(`${baseUrl}/api/levels`, {
|
||||
method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({ id:'late-evidence-rule',title:'Late evidence rule' }),
|
||||
})
|
||||
expect(created.status).toBe(201)
|
||||
const level = await created.json() as CaseState
|
||||
const upload = new FormData()
|
||||
upload.append('file',new Blob(['Archive patent 93585 names Niels Aall Baricelli and describes a Koffert-kommode.'],{ type:'text/plain' }),'patent.txt')
|
||||
const uploaded = await (await fetch(`${baseUrl}/api/levels/${level.id}/documents`,{ method:'POST',body:upload })).json() as DocumentExhibit & {
|
||||
analysis:{ matchedFlags:string[] }
|
||||
}
|
||||
expect(uploaded.analysis.matchedFlags).toEqual([])
|
||||
|
||||
const rule = await adminFetch(`${baseUrl}/api/levels/${level.id}/evidence-match-rules`,{
|
||||
method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({
|
||||
name:'Late National Library fingerprint',flagKey:'late.patent-recognized',minimumAnchorMatches:2,
|
||||
anchors:[
|
||||
{ phrase:'Archive patent 93585 names Niels Aall Baricelli',minimumSimilarity:.7 },
|
||||
{ phrase:'describes a Koffert-kommode',minimumSimilarity:.7 },
|
||||
],
|
||||
}),
|
||||
})
|
||||
expect(rule.status).toBe(201)
|
||||
expect(await (await adminFetch(`${baseUrl}/api/levels/${level.id}/flags`)).json()).toEqual([
|
||||
expect.objectContaining({ key:'late.patent-recognized',earnedAt:expect.any(String) }),
|
||||
])
|
||||
const evaluation = await appPool.query<{ matched:boolean;matched_anchor_count:number }>(
|
||||
'SELECT matched,matched_anchor_count FROM osint.evidence_match_evaluations WHERE document_exhibit_id=$1',[uploaded.id])
|
||||
expect(evaluation.rows).toEqual([{ matched:true,matched_anchor_count:2 }])
|
||||
})
|
||||
|
||||
it('imports the data-defined Scene 7 template with its private recognition rules', async () => {
|
||||
const { importMysteryTemplate } = await import('../scripts/importMysteryTemplate.js')
|
||||
const manifestPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'mysteries', 'barricelli-scene-7', 'mystery.json')
|
||||
|
||||
Reference in New Issue
Block a user