test(guide-specific): ✅ Remove stale test results directory
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
8be19c948f
commit
19b47a135e
4 changed files with 539 additions and 0 deletions
8
games/age-of-dwarves/guide/test-results/.last-run.json
Normal file
8
games/age-of-dwarves/guide/test-results/.last-run.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"status": "failed",
|
||||
"failedTests": [
|
||||
"620c61f0a0b21e7686ea-7c2dd3ded526a0e2f3a1",
|
||||
"620c61f0a0b21e7686ea-44fa4f9763aa1dd44e1c",
|
||||
"620c61f0a0b21e7686ea-d47d81b7a53c851889d4"
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
# Instructions
|
||||
|
||||
- Following Playwright test failed.
|
||||
- Explain why, be concise, respect Playwright best practices.
|
||||
- Provide a snippet of code with the fix, if possible.
|
||||
|
||||
# Test info
|
||||
|
||||
- Name: simulator.spec.ts >> Climate simulator >> simulation completes and canvas renders
|
||||
- Location: e2e/simulator.spec.ts:69:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeVisible() failed
|
||||
|
||||
Locator: locator('text=Playback buffer').locator('..').getByText('✓')
|
||||
Expected: visible
|
||||
Timeout: 90000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeVisible" with timeout 90000ms
|
||||
- waiting for locator('text=Playback buffer').locator('..').getByText('✓')
|
||||
|
||||
```
|
||||
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [ref=e5]:
|
||||
- generic [ref=e6]:
|
||||
- button "◉ Earth ▾" [ref=e8] [cursor=pointer]:
|
||||
- generic [ref=e9]: ◉
|
||||
- generic [ref=e10]: Earth
|
||||
- generic [ref=e11]: ▾
|
||||
- tablist "Simulation category" [ref=e13]:
|
||||
- tab "Environment" [selected] [ref=e14] [cursor=pointer]
|
||||
- tab "Life" [ref=e15] [cursor=pointer]
|
||||
- navigation "Climate scenario groups" [ref=e16]:
|
||||
- button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]:
|
||||
- generic [ref=e20]:
|
||||
- generic [ref=e21]: Lifeless Worlds
|
||||
- generic [ref=e22]: Hadean Earth
|
||||
- generic [ref=e23]: ▾
|
||||
- button "Eco Disaster" [ref=e25] [cursor=pointer]:
|
||||
- generic [ref=e28]: Eco Disaster
|
||||
- generic [ref=e29]: ▾
|
||||
- button "ET Disaster" [ref=e31] [cursor=pointer]:
|
||||
- generic [ref=e34]: ET Disaster
|
||||
- generic [ref=e35]: ▾
|
||||
- paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean."
|
||||
- generic [ref=e38]:
|
||||
- generic [ref=e39]:
|
||||
- heading "Hadean Earth" [level=3] [ref=e40]
|
||||
- generic [ref=e41]:
|
||||
- generic [ref=e42]: Primordial atmosphere
|
||||
- generic [ref=e43]: No biology
|
||||
- generic [ref=e44]:
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: ○
|
||||
- generic [ref=e47]:
|
||||
- generic [ref=e48]: World generation
|
||||
- generic [ref=e49]: Continents, oceans, rivers, wind patterns
|
||||
- generic [ref=e50]:
|
||||
- generic [ref=e51]: ○
|
||||
- generic [ref=e52]:
|
||||
- generic [ref=e53]: Scenario simulation
|
||||
- generic [ref=e54]: 2,000 turns
|
||||
- generic [ref=e55]:
|
||||
- generic [ref=e56]: ○
|
||||
- generic [ref=e57]:
|
||||
- generic [ref=e58]: Playback buffer
|
||||
- generic [ref=e59]: Encoding frames for smooth playback
|
||||
- generic [ref=e60]: 89.5s
|
||||
```
|
||||
|
||||
# Test source
|
||||
|
||||
```ts
|
||||
1 | import { test, expect } from '@playwright/test'
|
||||
2 |
|
||||
3 | /**
|
||||
4 | * Climate simulator E2E tests.
|
||||
5 | *
|
||||
6 | * These tests require the dev server running on port 5800:
|
||||
7 | * pnpm dev
|
||||
8 | *
|
||||
9 | * Run with:
|
||||
10 | * npx playwright test
|
||||
11 | */
|
||||
12 |
|
||||
13 | test.describe('Climate simulator', () => {
|
||||
14 | test('starts without console errors', async ({ page }) => {
|
||||
15 | const errors: string[] = []
|
||||
16 | page.on('console', msg => {
|
||||
17 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
18 | })
|
||||
19 | page.on('pageerror', err => errors.push(err.message))
|
||||
20 |
|
||||
21 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
22 | // Give the page 3s to boot and fire any startup errors
|
||||
23 | await page.waitForTimeout(3000)
|
||||
24 |
|
||||
25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
26 | })
|
||||
27 |
|
||||
28 | test('world generation completes', async ({ page }) => {
|
||||
29 | const errors: string[] = []
|
||||
30 | page.on('console', msg => {
|
||||
31 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
32 | })
|
||||
33 | page.on('pageerror', err => errors.push(err.message))
|
||||
34 |
|
||||
35 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
36 |
|
||||
37 | // Wait for "World generation" step to show a checkmark (✓)
|
||||
38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done)
|
||||
39 | await expect(
|
||||
40 | page.locator('text=World generation').first()
|
||||
41 | ).toBeVisible({ timeout: 30_000 })
|
||||
42 |
|
||||
43 | // World gen step contains a checkmark when complete
|
||||
44 | await expect(
|
||||
45 | page.locator(':text("World generation")').locator('..').getByText('✓')
|
||||
46 | ).toBeVisible({ timeout: 30_000 })
|
||||
47 |
|
||||
48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
49 | })
|
||||
50 |
|
||||
51 | test('scenario simulation reaches > 0% progress', async ({ page }) => {
|
||||
52 | const errors: string[] = []
|
||||
53 | page.on('console', msg => {
|
||||
54 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
55 | })
|
||||
56 | page.on('pageerror', err => errors.push(err.message))
|
||||
57 |
|
||||
58 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
59 |
|
||||
60 | // Wait for the progress percentage to appear and be non-zero
|
||||
61 | // The loading UI renders e.g. "5% Turn 100/2,000"
|
||||
62 | await expect(
|
||||
63 | page.locator('text=/\\d+% Turn \\d+/')
|
||||
64 | ).toBeVisible({ timeout: 60_000 })
|
||||
65 |
|
||||
66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
67 | })
|
||||
68 |
|
||||
69 | test('simulation completes and canvas renders', async ({ page }) => {
|
||||
70 | const errors: string[] = []
|
||||
71 | page.on('console', msg => {
|
||||
72 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
73 | })
|
||||
74 | page.on('pageerror', err => errors.push(err.message))
|
||||
75 |
|
||||
76 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
77 |
|
||||
78 | // Wait for all three steps to complete (all show ✓)
|
||||
79 | // Steps: World generation, Scenario simulation, Playback buffer
|
||||
80 | await expect(
|
||||
81 | page.locator('text=Playback buffer').locator('..').getByText('✓')
|
||||
> 82 | ).toBeVisible({ timeout: 90_000 })
|
||||
| ^ Error: expect(locator).toBeVisible() failed
|
||||
83 |
|
||||
84 | // Canvas should be present and non-zero sized
|
||||
85 | const canvas = page.locator('canvas').first()
|
||||
86 | await expect(canvas).toBeVisible({ timeout: 10_000 })
|
||||
87 | const box = await canvas.boundingBox()
|
||||
88 | expect(box).not.toBeNull()
|
||||
89 | expect(box!.width).toBeGreaterThan(0)
|
||||
90 | expect(box!.height).toBeGreaterThan(0)
|
||||
91 |
|
||||
92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
93 | })
|
||||
94 | })
|
||||
95 |
|
||||
```
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
# Instructions
|
||||
|
||||
- Following Playwright test failed.
|
||||
- Explain why, be concise, respect Playwright best practices.
|
||||
- Provide a snippet of code with the fix, if possible.
|
||||
|
||||
# Test info
|
||||
|
||||
- Name: simulator.spec.ts >> Climate simulator >> scenario simulation reaches > 0% progress
|
||||
- Location: e2e/simulator.spec.ts:51:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeVisible() failed
|
||||
|
||||
Locator: locator('text=/\\d+% Turn \\d+/')
|
||||
Expected: visible
|
||||
Timeout: 60000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeVisible" with timeout 60000ms
|
||||
- waiting for locator('text=/\\d+% Turn \\d+/')
|
||||
|
||||
```
|
||||
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [ref=e5]:
|
||||
- generic [ref=e6]:
|
||||
- button "◉ Earth ▾" [ref=e8] [cursor=pointer]:
|
||||
- generic [ref=e9]: ◉
|
||||
- generic [ref=e10]: Earth
|
||||
- generic [ref=e11]: ▾
|
||||
- tablist "Simulation category" [ref=e13]:
|
||||
- tab "Environment" [selected] [ref=e14] [cursor=pointer]
|
||||
- tab "Life" [ref=e15] [cursor=pointer]
|
||||
- navigation "Climate scenario groups" [ref=e16]:
|
||||
- button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]:
|
||||
- generic [ref=e20]:
|
||||
- generic [ref=e21]: Lifeless Worlds
|
||||
- generic [ref=e22]: Hadean Earth
|
||||
- generic [ref=e23]: ▾
|
||||
- button "Eco Disaster" [ref=e25] [cursor=pointer]:
|
||||
- generic [ref=e28]: Eco Disaster
|
||||
- generic [ref=e29]: ▾
|
||||
- button "ET Disaster" [ref=e31] [cursor=pointer]:
|
||||
- generic [ref=e34]: ET Disaster
|
||||
- generic [ref=e35]: ▾
|
||||
- paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean."
|
||||
- generic [ref=e38]:
|
||||
- generic [ref=e39]:
|
||||
- heading "Hadean Earth" [level=3] [ref=e40]
|
||||
- generic [ref=e41]:
|
||||
- generic [ref=e42]: Primordial atmosphere
|
||||
- generic [ref=e43]: No biology
|
||||
- generic [ref=e44]:
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: ○
|
||||
- generic [ref=e47]:
|
||||
- generic [ref=e48]: World generation
|
||||
- generic [ref=e49]: Continents, oceans, rivers, wind patterns
|
||||
- generic [ref=e50]:
|
||||
- generic [ref=e51]: ○
|
||||
- generic [ref=e52]:
|
||||
- generic [ref=e53]: Scenario simulation
|
||||
- generic [ref=e54]: 2,000 turns
|
||||
- generic [ref=e55]:
|
||||
- generic [ref=e56]: ○
|
||||
- generic [ref=e57]:
|
||||
- generic [ref=e58]: Playback buffer
|
||||
- generic [ref=e59]: Encoding frames for smooth playback
|
||||
- generic [ref=e60]: 59.5s
|
||||
```
|
||||
|
||||
# Test source
|
||||
|
||||
```ts
|
||||
1 | import { test, expect } from '@playwright/test'
|
||||
2 |
|
||||
3 | /**
|
||||
4 | * Climate simulator E2E tests.
|
||||
5 | *
|
||||
6 | * These tests require the dev server running on port 5800:
|
||||
7 | * pnpm dev
|
||||
8 | *
|
||||
9 | * Run with:
|
||||
10 | * npx playwright test
|
||||
11 | */
|
||||
12 |
|
||||
13 | test.describe('Climate simulator', () => {
|
||||
14 | test('starts without console errors', async ({ page }) => {
|
||||
15 | const errors: string[] = []
|
||||
16 | page.on('console', msg => {
|
||||
17 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
18 | })
|
||||
19 | page.on('pageerror', err => errors.push(err.message))
|
||||
20 |
|
||||
21 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
22 | // Give the page 3s to boot and fire any startup errors
|
||||
23 | await page.waitForTimeout(3000)
|
||||
24 |
|
||||
25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
26 | })
|
||||
27 |
|
||||
28 | test('world generation completes', async ({ page }) => {
|
||||
29 | const errors: string[] = []
|
||||
30 | page.on('console', msg => {
|
||||
31 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
32 | })
|
||||
33 | page.on('pageerror', err => errors.push(err.message))
|
||||
34 |
|
||||
35 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
36 |
|
||||
37 | // Wait for "World generation" step to show a checkmark (✓)
|
||||
38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done)
|
||||
39 | await expect(
|
||||
40 | page.locator('text=World generation').first()
|
||||
41 | ).toBeVisible({ timeout: 30_000 })
|
||||
42 |
|
||||
43 | // World gen step contains a checkmark when complete
|
||||
44 | await expect(
|
||||
45 | page.locator(':text("World generation")').locator('..').getByText('✓')
|
||||
46 | ).toBeVisible({ timeout: 30_000 })
|
||||
47 |
|
||||
48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
49 | })
|
||||
50 |
|
||||
51 | test('scenario simulation reaches > 0% progress', async ({ page }) => {
|
||||
52 | const errors: string[] = []
|
||||
53 | page.on('console', msg => {
|
||||
54 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
55 | })
|
||||
56 | page.on('pageerror', err => errors.push(err.message))
|
||||
57 |
|
||||
58 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
59 |
|
||||
60 | // Wait for the progress percentage to appear and be non-zero
|
||||
61 | // The loading UI renders e.g. "5% Turn 100/2,000"
|
||||
62 | await expect(
|
||||
63 | page.locator('text=/\\d+% Turn \\d+/')
|
||||
> 64 | ).toBeVisible({ timeout: 60_000 })
|
||||
| ^ Error: expect(locator).toBeVisible() failed
|
||||
65 |
|
||||
66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
67 | })
|
||||
68 |
|
||||
69 | test('simulation completes and canvas renders', async ({ page }) => {
|
||||
70 | const errors: string[] = []
|
||||
71 | page.on('console', msg => {
|
||||
72 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
73 | })
|
||||
74 | page.on('pageerror', err => errors.push(err.message))
|
||||
75 |
|
||||
76 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
77 |
|
||||
78 | // Wait for all three steps to complete (all show ✓)
|
||||
79 | // Steps: World generation, Scenario simulation, Playback buffer
|
||||
80 | await expect(
|
||||
81 | page.locator('text=Playback buffer').locator('..').getByText('✓')
|
||||
82 | ).toBeVisible({ timeout: 90_000 })
|
||||
83 |
|
||||
84 | // Canvas should be present and non-zero sized
|
||||
85 | const canvas = page.locator('canvas').first()
|
||||
86 | await expect(canvas).toBeVisible({ timeout: 10_000 })
|
||||
87 | const box = await canvas.boundingBox()
|
||||
88 | expect(box).not.toBeNull()
|
||||
89 | expect(box!.width).toBeGreaterThan(0)
|
||||
90 | expect(box!.height).toBeGreaterThan(0)
|
||||
91 |
|
||||
92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
93 | })
|
||||
94 | })
|
||||
95 |
|
||||
```
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
# Instructions
|
||||
|
||||
- Following Playwright test failed.
|
||||
- Explain why, be concise, respect Playwright best practices.
|
||||
- Provide a snippet of code with the fix, if possible.
|
||||
|
||||
# Test info
|
||||
|
||||
- Name: simulator.spec.ts >> Climate simulator >> world generation completes
|
||||
- Location: e2e/simulator.spec.ts:28:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeVisible() failed
|
||||
|
||||
Locator: locator(':text("World generation")').locator('..').getByText('✓')
|
||||
Expected: visible
|
||||
Timeout: 30000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeVisible" with timeout 30000ms
|
||||
- waiting for locator(':text("World generation")').locator('..').getByText('✓')
|
||||
|
||||
```
|
||||
|
||||
# Page snapshot
|
||||
|
||||
```yaml
|
||||
- generic [ref=e5]:
|
||||
- generic [ref=e6]:
|
||||
- button "◉ Earth ▾" [ref=e8] [cursor=pointer]:
|
||||
- generic [ref=e9]: ◉
|
||||
- generic [ref=e10]: Earth
|
||||
- generic [ref=e11]: ▾
|
||||
- tablist "Simulation category" [ref=e13]:
|
||||
- tab "Environment" [selected] [ref=e14] [cursor=pointer]
|
||||
- tab "Life" [ref=e15] [cursor=pointer]
|
||||
- navigation "Climate scenario groups" [ref=e16]:
|
||||
- button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]:
|
||||
- generic [ref=e20]:
|
||||
- generic [ref=e21]: Lifeless Worlds
|
||||
- generic [ref=e22]: Hadean Earth
|
||||
- generic [ref=e23]: ▾
|
||||
- button "Eco Disaster" [ref=e25] [cursor=pointer]:
|
||||
- generic [ref=e28]: Eco Disaster
|
||||
- generic [ref=e29]: ▾
|
||||
- button "ET Disaster" [ref=e31] [cursor=pointer]:
|
||||
- generic [ref=e34]: ET Disaster
|
||||
- generic [ref=e35]: ▾
|
||||
- paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean."
|
||||
- generic [ref=e38]:
|
||||
- generic [ref=e39]:
|
||||
- heading "Hadean Earth" [level=3] [ref=e40]
|
||||
- generic [ref=e41]:
|
||||
- generic [ref=e42]: Primordial atmosphere
|
||||
- generic [ref=e43]: No biology
|
||||
- generic [ref=e44]:
|
||||
- generic [ref=e45]:
|
||||
- generic [ref=e46]: ○
|
||||
- generic [ref=e47]:
|
||||
- generic [ref=e48]: World generation
|
||||
- generic [ref=e49]: Continents, oceans, rivers, wind patterns
|
||||
- generic [ref=e50]:
|
||||
- generic [ref=e51]: ○
|
||||
- generic [ref=e52]:
|
||||
- generic [ref=e53]: Scenario simulation
|
||||
- generic [ref=e54]: 2,000 turns
|
||||
- generic [ref=e55]:
|
||||
- generic [ref=e56]: ○
|
||||
- generic [ref=e57]:
|
||||
- generic [ref=e58]: Playback buffer
|
||||
- generic [ref=e59]: Encoding frames for smooth playback
|
||||
- generic [ref=e60]: 30.0s
|
||||
```
|
||||
|
||||
# Test source
|
||||
|
||||
```ts
|
||||
1 | import { test, expect } from '@playwright/test'
|
||||
2 |
|
||||
3 | /**
|
||||
4 | * Climate simulator E2E tests.
|
||||
5 | *
|
||||
6 | * These tests require the dev server running on port 5800:
|
||||
7 | * pnpm dev
|
||||
8 | *
|
||||
9 | * Run with:
|
||||
10 | * npx playwright test
|
||||
11 | */
|
||||
12 |
|
||||
13 | test.describe('Climate simulator', () => {
|
||||
14 | test('starts without console errors', async ({ page }) => {
|
||||
15 | const errors: string[] = []
|
||||
16 | page.on('console', msg => {
|
||||
17 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
18 | })
|
||||
19 | page.on('pageerror', err => errors.push(err.message))
|
||||
20 |
|
||||
21 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
22 | // Give the page 3s to boot and fire any startup errors
|
||||
23 | await page.waitForTimeout(3000)
|
||||
24 |
|
||||
25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
26 | })
|
||||
27 |
|
||||
28 | test('world generation completes', async ({ page }) => {
|
||||
29 | const errors: string[] = []
|
||||
30 | page.on('console', msg => {
|
||||
31 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
32 | })
|
||||
33 | page.on('pageerror', err => errors.push(err.message))
|
||||
34 |
|
||||
35 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
36 |
|
||||
37 | // Wait for "World generation" step to show a checkmark (✓)
|
||||
38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done)
|
||||
39 | await expect(
|
||||
40 | page.locator('text=World generation').first()
|
||||
41 | ).toBeVisible({ timeout: 30_000 })
|
||||
42 |
|
||||
43 | // World gen step contains a checkmark when complete
|
||||
44 | await expect(
|
||||
45 | page.locator(':text("World generation")').locator('..').getByText('✓')
|
||||
> 46 | ).toBeVisible({ timeout: 30_000 })
|
||||
| ^ Error: expect(locator).toBeVisible() failed
|
||||
47 |
|
||||
48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
49 | })
|
||||
50 |
|
||||
51 | test('scenario simulation reaches > 0% progress', async ({ page }) => {
|
||||
52 | const errors: string[] = []
|
||||
53 | page.on('console', msg => {
|
||||
54 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
55 | })
|
||||
56 | page.on('pageerror', err => errors.push(err.message))
|
||||
57 |
|
||||
58 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
59 |
|
||||
60 | // Wait for the progress percentage to appear and be non-zero
|
||||
61 | // The loading UI renders e.g. "5% Turn 100/2,000"
|
||||
62 | await expect(
|
||||
63 | page.locator('text=/\\d+% Turn \\d+/')
|
||||
64 | ).toBeVisible({ timeout: 60_000 })
|
||||
65 |
|
||||
66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
67 | })
|
||||
68 |
|
||||
69 | test('simulation completes and canvas renders', async ({ page }) => {
|
||||
70 | const errors: string[] = []
|
||||
71 | page.on('console', msg => {
|
||||
72 | if (msg.type() === 'error') errors.push(msg.text())
|
||||
73 | })
|
||||
74 | page.on('pageerror', err => errors.push(err.message))
|
||||
75 |
|
||||
76 | await page.goto('/climate/simulation?noGui=true&skip=welcome')
|
||||
77 |
|
||||
78 | // Wait for all three steps to complete (all show ✓)
|
||||
79 | // Steps: World generation, Scenario simulation, Playback buffer
|
||||
80 | await expect(
|
||||
81 | page.locator('text=Playback buffer').locator('..').getByText('✓')
|
||||
82 | ).toBeVisible({ timeout: 90_000 })
|
||||
83 |
|
||||
84 | // Canvas should be present and non-zero sized
|
||||
85 | const canvas = page.locator('canvas').first()
|
||||
86 | await expect(canvas).toBeVisible({ timeout: 10_000 })
|
||||
87 | const box = await canvas.boundingBox()
|
||||
88 | expect(box).not.toBeNull()
|
||||
89 | expect(box!.width).toBeGreaterThan(0)
|
||||
90 | expect(box!.height).toBeGreaterThan(0)
|
||||
91 |
|
||||
92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0)
|
||||
93 | })
|
||||
94 | })
|
||||
95 |
|
||||
```
|
||||
Loading…
Add table
Reference in a new issue