| 
									
										
										
										
											2021-08-09 18:09:11 -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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { test, expect } from './playwright-test-fixtures'; | 
					
						
							|  |  |  | import fs from 'fs'; | 
					
						
							|  |  |  | import path from 'path'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function listFiles(dir: string): string[] { | 
					
						
							|  |  |  |   const result: string[] = []; | 
					
						
							|  |  |  |   const entries = fs.readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name)); | 
					
						
							|  |  |  |   for (const entry of entries) { | 
					
						
							|  |  |  |     result.push(entry.name); | 
					
						
							|  |  |  |     if (entry.isDirectory()) | 
					
						
							|  |  |  |       result.push(...listFiles(path.join(dir, entry.name)).map(x => '  ' + x)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const testFiles = { | 
					
						
							|  |  |  |   'artifacts.spec.ts': `
 | 
					
						
							|  |  |  |     import fs from 'fs'; | 
					
						
							|  |  |  |     import os from 'os'; | 
					
						
							|  |  |  |     import path from 'path'; | 
					
						
							|  |  |  |     import rimraf from 'rimraf'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const { test } = pwt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test.describe('shared', () => { | 
					
						
							|  |  |  |       let page; | 
					
						
							|  |  |  |       test.beforeAll(async ({ browser }) => { | 
					
						
							|  |  |  |         page = await browser.newPage({}); | 
					
						
							|  |  |  |         await page.setContent('<button>Click me</button><button>And me</button>'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test.afterAll(async () => { | 
					
						
							| 
									
										
										
										
											2022-03-08 16:35:14 -08:00
										 |  |  |         await page.setContent('Reset!'); | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |         await page.close(); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('shared passing', async ({ }) => { | 
					
						
							|  |  |  |         await page.click('text=Click me'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test('shared  failing', async ({ }) => { | 
					
						
							|  |  |  |         await page.click('text=And me'); | 
					
						
							|  |  |  |         expect(1).toBe(2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('passing', async ({ page }) => { | 
					
						
							|  |  |  |       await page.setContent('I am the page'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |     test('two contexts', async ({ page, browser }) => { | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |       await page.setContent('I am the page'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |       const page2 = await browser.newPage(); | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |       await page2.setContent('I am the page'); | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |       await page2.close(); | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('failing', async ({ page }) => { | 
					
						
							|  |  |  |       await page.setContent('I am the page'); | 
					
						
							|  |  |  |       expect(1).toBe(2); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |     test('two contexts failing', async ({ page, browser }) => { | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |       await page.setContent('I am the page'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |       const page2 = await browser.newPage(); | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |       await page2.setContent('I am the page'); | 
					
						
							|  |  |  |       expect(1).toBe(2); | 
					
						
							| 
									
										
										
										
											2021-08-10 09:26:36 -07:00
										 |  |  |       await page2.close(); | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('own context passing', async ({ browser }) => { | 
					
						
							|  |  |  |       const page = await browser.newPage(); | 
					
						
							|  |  |  |       await page.setContent('<button>Click me</button><button>And me</button>'); | 
					
						
							|  |  |  |       await page.click('text=Click me'); | 
					
						
							|  |  |  |       await page.close(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test('own context failing', async ({ browser }) => { | 
					
						
							|  |  |  |       const page = await browser.newPage(); | 
					
						
							|  |  |  |       await page.setContent('<button>Click me</button><button>And me</button>'); | 
					
						
							|  |  |  |       await page.click('text=Click me'); | 
					
						
							|  |  |  |       await page.close(); | 
					
						
							|  |  |  |       expect(1).toBe(2); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const testPersistent = test.extend({ | 
					
						
							|  |  |  |       page: async ({ playwright, browserName }, use) => { | 
					
						
							|  |  |  |         const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'user-data-dir-')); | 
					
						
							|  |  |  |         const context = await playwright[browserName].launchPersistentContext(dir); | 
					
						
							|  |  |  |         await use(context.pages()[0]); | 
					
						
							|  |  |  |         await context.close(); | 
					
						
							|  |  |  |         rimraf.sync(dir); | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testPersistent('persistent passing', async ({ page }) => { | 
					
						
							|  |  |  |       await page.setContent('<button>Click me</button><button>And me</button>'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     testPersistent('persistent failing', async ({ page }) => { | 
					
						
							|  |  |  |       await page.setContent('<button>Click me</button><button>And me</button>'); | 
					
						
							|  |  |  |       expect(1).toBe(2); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   `,
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with screenshot: on', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     ...testFiles, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { use: { screenshot: 'on' } }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, { workers: 1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(5); | 
					
						
							|  |  |  |   expect(result.failed).toBe(5); | 
					
						
							|  |  |  |   expect(listFiles(testInfo.outputPath('test-results'))).toEqual([ | 
					
						
							|  |  |  |     'artifacts-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-own-context-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-own-context-passing', | 
					
						
							|  |  |  |     '  test-finished-1.png', | 
					
						
							|  |  |  |     'artifacts-passing', | 
					
						
							|  |  |  |     '  test-finished-1.png', | 
					
						
							|  |  |  |     'artifacts-persistent-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-persistent-passing', | 
					
						
							|  |  |  |     '  test-finished-1.png', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-failing', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     '  test-failed-1.png', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-passing', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     '  test-finished-1.png', | 
					
						
							|  |  |  |     'artifacts-two-contexts', | 
					
						
							|  |  |  |     '  test-finished-1.png', | 
					
						
							|  |  |  |     '  test-finished-2.png', | 
					
						
							|  |  |  |     'artifacts-two-contexts-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     '  test-failed-2.png', | 
					
						
							|  |  |  |     'report.json', | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with screenshot: only-on-failure', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     ...testFiles, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { use: { screenshot: 'only-on-failure' } }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, { workers: 1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(5); | 
					
						
							|  |  |  |   expect(result.failed).toBe(5); | 
					
						
							|  |  |  |   expect(listFiles(testInfo.outputPath('test-results'))).toEqual([ | 
					
						
							|  |  |  |     'artifacts-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-own-context-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-persistent-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-failing', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     'artifacts-two-contexts-failing', | 
					
						
							|  |  |  |     '  test-failed-1.png', | 
					
						
							|  |  |  |     '  test-failed-2.png', | 
					
						
							|  |  |  |     'report.json', | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with trace: on', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     ...testFiles, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { use: { trace: 'on' } }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, { workers: 1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(5); | 
					
						
							|  |  |  |   expect(result.failed).toBe(5); | 
					
						
							|  |  |  |   expect(listFiles(testInfo.outputPath('test-results'))).toEqual([ | 
					
						
							|  |  |  |     'artifacts-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-own-context-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-own-context-passing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-passing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-persistent-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-persistent-passing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-passing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-two-contexts', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace-1.zip', | 
					
						
							|  |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-two-contexts-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace-1.zip', | 
					
						
							|  |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'report.json', | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with trace: retain-on-failure', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     ...testFiles, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { use: { trace: 'retain-on-failure' } }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, { workers: 1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(5); | 
					
						
							|  |  |  |   expect(result.failed).toBe(5); | 
					
						
							|  |  |  |   expect(listFiles(testInfo.outputPath('test-results'))).toEqual([ | 
					
						
							|  |  |  |     'artifacts-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-own-context-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-persistent-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-two-contexts-failing', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace-1.zip', | 
					
						
							|  |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'report.json', | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('should work with trace: on-first-retry', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     ...testFiles, | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { use: { trace: 'on-first-retry' } }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }, { workers: 1, retries: 1 }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(5); | 
					
						
							|  |  |  |   expect(result.failed).toBe(5); | 
					
						
							|  |  |  |   expect(listFiles(testInfo.outputPath('test-results'))).toEqual([ | 
					
						
							|  |  |  |     'artifacts-failing-retry1', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-own-context-failing-retry1', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-persistent-failing-retry1', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-24 10:33:40 -04:00
										 |  |  |     'artifacts-shared-shared-failing-retry1', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'artifacts-two-contexts-failing-retry1', | 
					
						
							| 
									
										
										
										
											2021-11-01 19:27:41 -08:00
										 |  |  |     '  trace-1.zip', | 
					
						
							|  |  |  |     '  trace.zip', | 
					
						
							| 
									
										
										
										
											2021-08-09 18:09:11 -07:00
										 |  |  |     'report.json', | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); |