Implement Scene 7 evidence goal flow
This commit is contained in:
@@ -78,7 +78,7 @@ test('move, folder expansion, empty-board pan, desktop wheel zoom, mobile pinch,
|
||||
await expect(page.locator('.evidence-card.note')).toHaveCount(0)
|
||||
|
||||
const folder = page.locator('[data-temporal-id="widget:11111111-1111-4111-8111-111111111111"]')
|
||||
const file = page.locator('[data-temporal-id="file:contains:11111111-1111-4111-8111-111111111111:22222222-2222-4222-8222-222222222222"]')
|
||||
const file = page.locator('[data-temporal-id="widget:22222222-2222-4222-8222-222222222222"]')
|
||||
const board = page.locator('.board')
|
||||
const boardViewport = page.locator('.board-viewport')
|
||||
const containmentBand = page.locator('.folder-bands line')
|
||||
@@ -95,7 +95,7 @@ test('move, folder expansion, empty-board pan, desktop wheel zoom, mobile pinch,
|
||||
await expect(folder).toBeVisible()
|
||||
expect(await boardPosition(folder)).toEqual(movedFolder)
|
||||
|
||||
await waitForSave(page, () => folder.getByRole('button', { name: 'OPEN', exact: true }).click())
|
||||
await waitForSave(page, () => folder.dblclick())
|
||||
await expect(file).toHaveClass(/\bopen\b/)
|
||||
await expect(containmentBand).toHaveClass(/\bopen\b/)
|
||||
const fileBefore = await boardPosition(file)
|
||||
|
||||
@@ -90,7 +90,7 @@ test('a cloned Glass Harbor level can be solved without modifying its template',
|
||||
const elias = page.locator('.evidence-card.party').filter({ has: page.getByRole('heading', { name: 'Elias Vale', exact: true }) })
|
||||
const movement = page.locator('.evidence-card.folder').filter({ hasText: 'MOVEMENT RECORDS' })
|
||||
await waitForSave(page, () => page.getByRole('button', { name: 'Zoom out', exact: true }).click())
|
||||
await waitForSave(page, () => movement.getByRole('button', { name: 'OPEN', exact: true }).click())
|
||||
await waitForSave(page, () => movement.dblclick())
|
||||
const manifest = page.locator('.source-file-widget.open').filter({ hasText: 'Carrier Dispatch Manifest' })
|
||||
await expect(manifest.locator('.text-source-excerpt')).toContainText('HARBOR & FELL LOGISTICS')
|
||||
await expect(manifest.locator('.source-file-preview svg')).toHaveCount(0)
|
||||
@@ -115,7 +115,7 @@ test('a cloned Glass Harbor level can be solved without modifying its template',
|
||||
await expect(page.locator('.connections g.tightening path')).toBeVisible()
|
||||
|
||||
const procurement = page.locator('.evidence-card.folder').filter({ hasText: 'PROCUREMENT & OWNERSHIP' })
|
||||
await waitForSave(page, () => procurement.getByRole('button', { name: 'OPEN', exact: true }).click())
|
||||
await waitForSave(page, () => procurement.dblclick())
|
||||
const companyRegister = page.locator('.source-file-widget.open').filter({ hasText: 'Company Register Extract' })
|
||||
const memorandum = page.locator('.source-file-widget.open').filter({ hasText: 'Delivery Redirection Memorandum' })
|
||||
const photograph = page.locator('.source-file-widget.open').filter({ hasText: 'Warehouse 3 Security Photograph' })
|
||||
@@ -128,6 +128,7 @@ test('a cloned Glass Harbor level can be solved without modifying its template',
|
||||
await expect(threadEditor.getByText('Delivery Redirection Memorandum', { exact: true })).toBeVisible()
|
||||
await page.getByLabel('Thread tag').fill('Proves Voss owns Warehouse 3')
|
||||
await waitForSave(page, () => page.getByRole('button', { name: 'ADD TAG & TIGHTEN', exact: true }).click())
|
||||
await companyRegister.click()
|
||||
await page.getByRole('button', { name: 'Red thread', exact: true }).click()
|
||||
await photograph.click()
|
||||
await expect(threadEditor.getByText('Company Register Extract · Voss Antiquities Ltd', { exact: true })).toBeVisible()
|
||||
@@ -177,7 +178,7 @@ test('a cloned Glass Harbor level can be solved without modifying its template',
|
||||
const authoringLevels = levels.filter(level => level.id.startsWith('glass-harbor-authoring-'))
|
||||
expect(authoringLevels).toHaveLength(1)
|
||||
const untouched = await (await request.get(`/api/levels/${authoringLevels[0].id}?edit=1`)).json()
|
||||
expect(untouched.evidence.filter((item: { type: string }) => item.type === 'party')).toHaveLength(0)
|
||||
expect(untouched.evidence.filter((item: { type: string }) => item.type === 'event')).toHaveLength(0)
|
||||
expect(untouched.exhibits.filter((item: { type: string }) => item.type === 'party')).toHaveLength(0)
|
||||
expect(untouched.exhibits.filter((item: { type: string }) => item.type === 'event')).toHaveLength(0)
|
||||
expect(untouched.brief.concepts.every((concept: { resolvedPartyExhibitId?: string }) => !concept.resolvedPartyExhibitId)).toBe(true)
|
||||
})
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import { expect, test } from '@playwright/test'
|
||||
|
||||
test('pasting one Google Patents screenshot verifies the Scene 7 objective', async ({ page, request }) => {
|
||||
test.setTimeout(60_000)
|
||||
const levels = await (await request.get('/api/levels')).json() as { id:string }[]
|
||||
const sceneSeven = levels.find(level => level.id.startsWith('barricelli-inventor-proof-case-'))
|
||||
if (!sceneSeven) throw new Error('Scene 7 playable clone was not seeded')
|
||||
|
||||
await page.goto(`/level/${sceneSeven.id}`)
|
||||
await expect(page.getByRole('heading', { name:'The Barricelli Files' })).toBeVisible()
|
||||
await expect(page.locator('.brief-panel')).toBeVisible()
|
||||
await expect(page.locator('.brief-goals')).toContainText('Prove Nils Aall Barricelli was an inventor')
|
||||
await expect(page.locator('.brief-goals section')).toHaveClass(/\bpending\b/)
|
||||
await page.getByRole('button', { name:'BEGIN INVESTIGATION',exact:true }).click()
|
||||
|
||||
const uploadResponse = page.waitForResponse(response => response.request().method() === 'POST'
|
||||
&& response.url().includes(`/api/levels/${sceneSeven.id}/documents`) && response.status() === 201)
|
||||
await page.evaluate(async () => {
|
||||
const canvas = document.createElement('canvas')
|
||||
canvas.width = 1280
|
||||
canvas.height = 520
|
||||
const context = canvas.getContext('2d')!
|
||||
context.fillStyle = '#fff'
|
||||
context.fillRect(0, 0, canvas.width, canvas.height)
|
||||
context.fillStyle = '#111'
|
||||
context.font = 'bold 56px Arial, sans-serif'
|
||||
context.fillText('GB695913A', 70, 95)
|
||||
context.font = '48px Arial, sans-serif'
|
||||
context.fillText('Improved chest of drawers', 70, 175)
|
||||
context.font = '34px Arial, sans-serif'
|
||||
context.fillText('Inventor', 70, 280)
|
||||
context.font = 'bold 52px Arial, sans-serif'
|
||||
context.fillText('Nils Aall Barricelli', 70, 355)
|
||||
context.font = '30px Arial, sans-serif'
|
||||
context.fillText('Priority date 1951-05-31 Publication date 1953-08-19', 70, 445)
|
||||
const blob = await new Promise<Blob>((resolve, reject) => canvas.toBlob(value => value ? resolve(value) : reject(new Error('Could not render screenshot')), 'image/png'))
|
||||
const transfer = new DataTransfer()
|
||||
transfer.items.add(new File([blob], 'google-patents.png', { type:'image/png' }))
|
||||
window.dispatchEvent(new ClipboardEvent('paste', { clipboardData:transfer,bubbles:true,cancelable:true }))
|
||||
})
|
||||
const uploaded = await (await uploadResponse).json()
|
||||
expect(uploaded.analysis).toMatchObject({ extractionStatus:'succeeded',matchedFlags:['scene7.nils_inventor_proved'],
|
||||
goals:[expect.objectContaining({ key:'barricelli.inventor-proof',status:'complete',newlyCompleted:true })] })
|
||||
|
||||
await expect(page.locator('.source-file-widget')).toHaveCount(1)
|
||||
await expect(page.locator('.source-file-widget')).toHaveClass(/\barriving\b/)
|
||||
const complete = page.locator('.goal-complete-card')
|
||||
await expect(complete).toBeVisible({ timeout:20_000 })
|
||||
await expect(complete).toContainText('SOURCE VERIFIED — NILS AALL BARRICELLI: INVENTOR')
|
||||
await expect(complete.getByRole('button', { name:/RETURN TO BOARD/ })).toBeVisible()
|
||||
|
||||
const level = await (await request.get(`/api/levels/${sceneSeven.id}`)).json()
|
||||
expect(level.goals).toEqual([expect.objectContaining({ key:'barricelli.inventor-proof',status:'complete',newlyCompleted:false })])
|
||||
expect(level.exhibits.filter((exhibit: { type:string }) => exhibit.type === 'document')).toHaveLength(1)
|
||||
})
|
||||
Reference in New Issue
Block a user