| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright (c) Microsoft Corporation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 11:28:28 -07:00
										 |  |  | import { test, expect, retries, dumpTestTree } from './ui-mode-fixtures'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test.describe.configure({ mode: 'parallel', retries }); | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const basicTestTree = { | 
					
						
							|  |  |  |   'a.test.ts': `
 | 
					
						
							|  |  |  |     import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |     test('passes', () => {}); | 
					
						
							|  |  |  |     test('fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |     test.describe('suite', () => { | 
					
						
							|  |  |  |       test('inner passes', () => {}); | 
					
						
							|  |  |  |       test('inner fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   `,
 | 
					
						
							|  |  |  |   'b.test.ts': `
 | 
					
						
							|  |  |  |     import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |     test('passes', () => {}); | 
					
						
							|  |  |  |     test('fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |   `,
 | 
					
						
							|  |  |  |   'c.test.ts': `
 | 
					
						
							|  |  |  |     import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |     test('passes', () => {}); | 
					
						
							|  |  |  |     test.skip('skipped', () => {}); | 
					
						
							|  |  |  |   `,
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should run visible', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest(basicTestTree); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ❌ fails <= | 
					
						
							|  |  |  |       ► ❌ suite | 
					
						
							|  |  |  |     ▼ ❌ b.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ❌ fails | 
					
						
							|  |  |  |     ▼ ✅ c.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ⊘ skipped | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-19 12:04:19 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem "[icon-error] suite" [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-error] b.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-check] c.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem "[icon-circle-slash] skipped" | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-19 14:23:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-19 12:04:19 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('4/8 passed (50%)'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should show running progress', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-19 12:04:19 -07:00
										 |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('test 1', async () => {}); | 
					
						
							|  |  |  |       test('test 2', async () => new Promise(() => {})); | 
					
						
							|  |  |  |       test('test 3', async () => {}); | 
					
						
							|  |  |  |       test('test 4', async () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('Running 1/4 passed (25%)'); | 
					
						
							| 
									
										
										
										
											2023-03-19 12:04:19 -07:00
										 |  |  |   await page.getByTitle('Stop').click(); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/4 passed (25%)'); | 
					
						
							| 
									
										
										
										
											2023-03-19 12:04:19 -07:00
										 |  |  |   await page.getByTitle('Reload').click(); | 
					
						
							|  |  |  |   await expect(page.getByTestId('status-line')).toBeHidden(); | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-17 09:43:54 -07:00
										 |  |  | test('should run on hover', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-17 09:43:54 -07:00
										 |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |       test('fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByText('passes').hover(); | 
					
						
							| 
									
										
										
										
											2024-10-18 13:50:43 -07:00
										 |  |  |   await page.getByRole('treeitem', { name: 'passes' }).getByRole('button', { name: 'Run' }).click(); | 
					
						
							| 
									
										
										
										
											2023-03-17 09:43:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-17 09:43:54 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |         ✅ passes <= | 
					
						
							|  |  |  |         ◯ fails | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-circle-outline] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/}: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |           - treeitem "[icon-circle-outline] fails" | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-17 09:43:54 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | test('should run on double click', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |       test('fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByText('passes').dblclick(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |         ✅ passes <= | 
					
						
							|  |  |  |         ◯ fails | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-circle-outline] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							|  |  |  |           - treeitem ${/\[icon-check\] passes/} [selected]: | 
					
						
							|  |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |           - treeitem "[icon-circle-outline] fails" | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should run on Enter', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |       test('fails', () => { expect(1).toBe(2); }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByText('fails').click(); | 
					
						
							|  |  |  |   await page.keyboard.press('Enter'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |         ◯ passes | 
					
						
							|  |  |  |         ❌ fails <= | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							|  |  |  |           - treeitem "[icon-circle-outline] passes" | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-error\] fails/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-13 12:14:51 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should run by project', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |     ...basicTestTree, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       import { defineConfig } from '@playwright/test'; | 
					
						
							|  |  |  |       export default defineConfig({ | 
					
						
							|  |  |  |         projects: [ | 
					
						
							|  |  |  |           { name: 'foo' }, | 
					
						
							|  |  |  |           { name: 'bar' }, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ❌ fails <= | 
					
						
							|  |  |  |       ► ❌ suite | 
					
						
							|  |  |  |     ▼ ❌ b.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ❌ fails | 
					
						
							|  |  |  |     ▼ ✅ c.test.ts | 
					
						
							|  |  |  |         ✅ passes | 
					
						
							|  |  |  |         ⊘ skipped | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem "[icon-error] suite" [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-error] b.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-check] c.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem "[icon-circle-slash] skipped" | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |   await page.getByText('Status:').click(); | 
					
						
							|  |  |  |   await page.getByLabel('bar').setChecked(true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |       ► ◯ passes | 
					
						
							| 
									
										
										
										
											2024-08-12 13:50:11 +02:00
										 |  |  |       ▼ ❌ fails | 
					
						
							|  |  |  |           ❌ foo <= | 
					
						
							|  |  |  |           ◯ bar | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |       ► ❌ suite | 
					
						
							|  |  |  |     ▼ ❌ b.test.ts | 
					
						
							|  |  |  |       ► ◯ passes | 
					
						
							|  |  |  |       ► ❌ fails | 
					
						
							|  |  |  |     ▼ ◯ c.test.ts | 
					
						
							|  |  |  |       ► ◯ passes | 
					
						
							|  |  |  |       ► ◯ skipped | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem ${/\[icon-circle-outline\] passes/} [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem ${/\[icon-error\] fails/}: | 
					
						
							|  |  |  |             - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |               - treeitem ${/\[icon-error\] foo/} [selected] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |               - treeitem "[icon-circle-outline] bar" | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem "[icon-error] suite" [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-error] b.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem ${/\[icon-circle-outline\] passes/} [expanded=false] | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-circle-outline] c.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem ${/\[icon-circle-outline\] passes/} [expanded=false] | 
					
						
							|  |  |  |           - treeitem ${/\[icon-circle-outline\] skipped/} [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |   await page.getByText('Status:').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTestId('test-tree').getByText('passes').first().click(); | 
					
						
							|  |  |  |   await page.keyboard.press('ArrowRight'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |       ▼ ◯ passes <= | 
					
						
							|  |  |  |           ✅ foo | 
					
						
							|  |  |  |           ◯ bar | 
					
						
							|  |  |  |       ► ❌ fails | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-circle-outline\] passes/} [expanded] [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |             - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |               - treeitem ${/\[icon-check\] foo/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |               - treeitem ${/\[icon-circle-outline\] bar/} | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-error\] fails/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |   await expect(page.getByText('Projects: foo bar')).toBeVisible(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |       ▼ ✅ passes | 
					
						
							|  |  |  |           ✅ foo | 
					
						
							|  |  |  |           ✅ bar | 
					
						
							|  |  |  |       ▼ ❌ fails | 
					
						
							|  |  |  |           ❌ foo <= | 
					
						
							|  |  |  |           ❌ bar | 
					
						
							|  |  |  |       ► ❌ suite | 
					
						
							|  |  |  |     ▼ ❌ b.test.ts | 
					
						
							|  |  |  |       ► ✅ passes | 
					
						
							|  |  |  |       ► ❌ fails | 
					
						
							|  |  |  |     ▼ ✅ c.test.ts | 
					
						
							|  |  |  |       ► ✅ passes | 
					
						
							|  |  |  |       ► ⊘ skipped | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} [expanded]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |               - treeitem ${/\[icon-check\] foo/} | 
					
						
							|  |  |  |               - treeitem ${/\[icon-check\] bar/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} [expanded]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |               - treeitem ${/\[icon-error\] foo/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |                 - button "Run" | 
					
						
							|  |  |  |                 - button "Show source" | 
					
						
							|  |  |  |                 - button "Watch" | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |               - treeitem ${/\[icon-error\] bar/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem ${/\[icon-error\] suite/} | 
					
						
							|  |  |  |       - treeitem "[icon-error] b.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} [expanded=false] | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails/} [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-check] c.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes/} [expanded=false] | 
					
						
							|  |  |  |           - treeitem ${/\[icon-circle-slash\] skipped/} [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-13 22:19:31 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should stop', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('test 0', () => { test.skip(); }); | 
					
						
							|  |  |  |       test('test 1', () => {}); | 
					
						
							|  |  |  |       test('test 2', async () => { await new Promise(() => {}); }); | 
					
						
							|  |  |  |       test('test 3', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect(page.getByTitle('Run all')).toBeEnabled(); | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |   await expect(page.getByTitle('Stop')).toBeDisabled(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |     ▼ ↻ a.test.ts | 
					
						
							|  |  |  |         ⊘ test 0 | 
					
						
							|  |  |  |         ✅ test 1 | 
					
						
							|  |  |  |         ↻ test 2 | 
					
						
							| 
									
										
										
										
											2023-03-20 17:12:02 -07:00
										 |  |  |         🕦 test 3 | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-loading] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							|  |  |  |           - treeitem "[icon-circle-slash] test 0" | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] test 1/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem ${/\[icon-loading\] test 2/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-clock\] test 3/} | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |   await expect(page.getByTitle('Run all')).toBeDisabled(); | 
					
						
							|  |  |  |   await expect(page.getByTitle('Stop')).toBeEnabled(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Stop').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |         ⊘ test 0 | 
					
						
							|  |  |  |         ✅ test 1 | 
					
						
							|  |  |  |         ◯ test 2 | 
					
						
							|  |  |  |         ◯ test 3 | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-circle-outline] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							|  |  |  |           - treeitem "[icon-circle-slash] test 0" | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] test 1/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem ${/\[icon-circle-outline\] test 2/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-circle-outline\] test 3/} | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-17 14:10:25 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-03-19 18:51:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should run folder', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest({ | 
					
						
							| 
									
										
										
										
											2023-03-19 18:51:09 -07:00
										 |  |  |     'a/folder-b/folder-c/inC.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a/folder-b/in-b.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a/in-a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('passes', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByText('folder-b').hover(); | 
					
						
							| 
									
										
										
										
											2024-10-18 13:50:43 -07:00
										 |  |  |   await page.getByRole('treeitem', { name: 'folder-b' }).getByRole('button', { name: 'Run' }).click(); | 
					
						
							| 
									
										
										
										
											2023-03-19 18:51:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-03-19 18:51:09 -07:00
										 |  |  |     ▼ ✅ folder-b <= | 
					
						
							|  |  |  |       ► ✅ folder-c | 
					
						
							|  |  |  |       ► ✅ in-b.test.ts | 
					
						
							|  |  |  |     ▼ ◯ in-a.test.ts | 
					
						
							|  |  |  |         ◯ passes | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] folder-b" [expanded] [selected]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem "[icon-check] folder-c" [expanded=false] | 
					
						
							|  |  |  |           - treeitem "[icon-check] in-b.test.ts" [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-circle-outline] in-a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							|  |  |  |           - treeitem "[icon-circle-outline] passes" | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2023-03-19 18:51:09 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-03-20 17:12:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should show time', async ({ runUITest }) => { | 
					
						
							| 
									
										
										
										
											2023-03-29 13:57:19 -07:00
										 |  |  |   const { page } = await runUITest(basicTestTree); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-03-20 17:12:02 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page, { time: true })).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-20 17:12:02 -07:00
										 |  |  |     ▼ ❌ a.test.ts | 
					
						
							|  |  |  |         ✅ passes XXms | 
					
						
							|  |  |  |         ❌ fails XXms <= | 
					
						
							|  |  |  |       ► ❌ suite | 
					
						
							|  |  |  |     ▼ ❌ b.test.ts | 
					
						
							|  |  |  |         ✅ passes XXms | 
					
						
							|  |  |  |         ❌ fails XXms | 
					
						
							|  |  |  |     ▼ ✅ c.test.ts | 
					
						
							|  |  |  |         ✅ passes XXms | 
					
						
							|  |  |  |         ⊘ skipped | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-error] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes \d+m?s/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails \d+m?s/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							| 
									
										
										
										
											2024-10-25 16:13:38 -07:00
										 |  |  |           - treeitem "[icon-error] suite" [expanded=false] | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-error] b.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes \d+m?s/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-error\] fails \d+m?s/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |       - treeitem "[icon-check] c.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] passes \d+m?s/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |           - treeitem "[icon-circle-slash] skipped" | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-20 17:12:02 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('4/8 passed (50%)'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-03-30 16:17:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should show test.fail as passing', async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('should fail', () => { | 
					
						
							|  |  |  |         test.fail(); | 
					
						
							|  |  |  |         expect(1).toBe(2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-03-30 16:17:34 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page, { time: true })).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-03-30 16:17:34 -07:00
										 |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ should fail XXms | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] should fail \d+m?s/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-30 16:17:34 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-04-19 14:16:12 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should ignore repeatEach', async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       import { defineConfig } from '@playwright/test'; | 
					
						
							|  |  |  |       export default defineConfig({ | 
					
						
							|  |  |  |         repeatEach: 3, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('should pass', () => { | 
					
						
							|  |  |  |         expect(1).toBe(1); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							| 
									
										
										
										
											2023-04-19 14:16:12 -07:00
										 |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-28 14:18:46 -07:00
										 |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							| 
									
										
										
										
											2023-04-19 14:16:12 -07:00
										 |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ should pass | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] should pass/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-19 14:16:12 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-05-30 16:03:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should remove output folder before test run', async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       import { defineConfig } from '@playwright/test'; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import fs from 'fs'; | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('should pass', () => { | 
					
						
							|  |  |  |         const path = test.info().outputPath('a.txt'); | 
					
						
							|  |  |  |         expect(fs.existsSync(path)).toBe(false); | 
					
						
							|  |  |  |         fs.writeFileSync(path, 'dirty'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							|  |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ should pass | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] should pass/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-30 16:03:50 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ should pass | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] should pass/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-30 16:03:50 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2023-10-19 20:07:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should show proper total when using deps', async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       import { defineConfig } from "@playwright/test"; | 
					
						
							|  |  |  |       export default defineConfig({ | 
					
						
							|  |  |  |         projects: [ | 
					
						
							|  |  |  |           { name: "setup", grep: /@setup/, }, | 
					
						
							|  |  |  |           { name: "chromium", grep: /@chromium/, dependencies: ["setup"], }, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { expect, test } from "@playwright/test"; | 
					
						
							|  |  |  |       test("run @setup", async ({ page }) => { | 
					
						
							|  |  |  |         console.log("Test setup executed"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       test("run @chromium", async ({ page }) => { | 
					
						
							|  |  |  |         console.log("Test chromium executed"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByText('Status:').click(); | 
					
						
							| 
									
										
										
										
											2024-10-18 13:50:43 -07:00
										 |  |  |   await page.getByRole('checkbox', { name: 'setup' }).setChecked(true); | 
					
						
							|  |  |  |   await page.getByRole('checkbox', { name: 'chromium' }).setChecked(true); | 
					
						
							| 
									
										
										
										
											2023-10-19 20:07:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toContain(`
 | 
					
						
							|  |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('run @setup').dblclick(); | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ◯ a.test.ts | 
					
						
							|  |  |  |         ✅ run @setup <= | 
					
						
							|  |  |  |         ◯ run @chromium | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-circle-outline] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] run @setup setup/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |           - treeitem "[icon-circle-outline] run @chromium chromium" | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-19 20:07:47 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('run @chromium').dblclick(); | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ run @setup | 
					
						
							|  |  |  |         ✅ run @chromium <= | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] run @setup setup/} | 
					
						
							|  |  |  |           - treeitem ${/\[icon-check\] run @chromium chromium/} [selected]: | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |             - button "Run" | 
					
						
							|  |  |  |             - button "Show source" | 
					
						
							|  |  |  |             - button "Watch" | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-19 20:07:47 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('2/2 passed (100%)'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2024-09-24 19:59:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should respect --tsconfig option', { | 
					
						
							|  |  |  |   annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/32797' } | 
					
						
							|  |  |  | }, async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       import { foo } from '~/foo'; | 
					
						
							|  |  |  |       export default { | 
					
						
							|  |  |  |         testDir: './tests' + foo, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'tsconfig.json': `{
 | 
					
						
							|  |  |  |       "compilerOptions": { | 
					
						
							|  |  |  |         "baseUrl": ".", | 
					
						
							|  |  |  |         "paths": { | 
					
						
							|  |  |  |           "~/*": ["./does-not-exist/*"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }`,
 | 
					
						
							|  |  |  |     'tsconfig.special.json': `{
 | 
					
						
							|  |  |  |       "compilerOptions": { | 
					
						
							|  |  |  |         "baseUrl": ".", | 
					
						
							|  |  |  |         "paths": { | 
					
						
							|  |  |  |           "~/*": ["./mapped-from-root/*"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }`,
 | 
					
						
							|  |  |  |     'mapped-from-root/foo.ts': `
 | 
					
						
							|  |  |  |       export const foo = 42; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'tests42/tsconfig.json': `{
 | 
					
						
							|  |  |  |       "compilerOptions": { | 
					
						
							|  |  |  |         "baseUrl": ".", | 
					
						
							|  |  |  |         "paths": { | 
					
						
							|  |  |  |           "~/*": ["../should-be-ignored/*"], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }`,
 | 
					
						
							|  |  |  |     'tests42/a.test.ts': `
 | 
					
						
							|  |  |  |       import { foo } from '~/foo'; | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('test', ({}) => { | 
					
						
							|  |  |  |         expect(foo).toBe(42); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'should-be-ignored/foo.ts': `
 | 
					
						
							|  |  |  |       export const foo = 43; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, undefined, { additionalArgs: ['--tsconfig=tsconfig.special.json'] }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ test | 
					
						
							|  |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] test/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 19:59:15 -07:00
										 |  |  |   await expect(page.getByTestId('status-line')).toHaveText('1/1 passed (100%)'); | 
					
						
							| 
									
										
										
										
											2024-09-30 15:12:37 +02:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should respect --ignore-snapshots option', { | 
					
						
							|  |  |  |   annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/32868' } | 
					
						
							|  |  |  | }, async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('snapshot', () => { | 
					
						
							|  |  |  |         expect('foo').toMatchSnapshot(); // fails because no snapshot is present
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, undefined, { additionalArgs: ['--ignore-snapshots'] }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.getByTitle('Run all').click(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await expect.poll(dumpTestTree(page)).toBe(`
 | 
					
						
							|  |  |  |     ▼ ✅ a.test.ts | 
					
						
							|  |  |  |         ✅ snapshot | 
					
						
							|  |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   await expect(page.getByTestId('test-tree')).toMatchAriaSnapshot(`
 | 
					
						
							|  |  |  |     - tree: | 
					
						
							|  |  |  |       - treeitem "[icon-check] a.test.ts" [expanded]: | 
					
						
							|  |  |  |         - group: | 
					
						
							| 
									
										
										
										
											2024-10-24 16:49:10 -07:00
										 |  |  |           - treeitem ${/\[icon-check\] snapshot/} | 
					
						
							| 
									
										
										
										
											2024-10-21 21:54:06 -07:00
										 |  |  |   `);
 | 
					
						
							| 
									
										
										
										
											2024-09-30 15:12:37 +02:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2024-11-18 09:03:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('should not leak websocket connections', { | 
					
						
							|  |  |  |   annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/33641' } | 
					
						
							|  |  |  | }, async ({ runUITest }) => { | 
					
						
							|  |  |  |   const { page } = await runUITest({ | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test, expect } from '@playwright/test'; | 
					
						
							|  |  |  |       test('test', async () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const [ws1] = await Promise.all([ | 
					
						
							|  |  |  |     page.waitForEvent('websocket'), | 
					
						
							|  |  |  |     page.getByTitle('Reload').click(), | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await Promise.all([ | 
					
						
							|  |  |  |     page.waitForEvent('websocket'), | 
					
						
							|  |  |  |     page.getByTitle('Reload').click(), | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await expect.poll(() => ws1.isClosed()).toBe(true); | 
					
						
							|  |  |  | }); |