| 
									
										
										
										
											2021-06-06 17:09:53 -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 * as path from 'path'; | 
					
						
							| 
									
										
										
										
											2021-11-03 08:25:16 -07:00
										 |  |  |  | import * as fs from 'fs'; | 
					
						
							| 
									
										
										
										
											2022-01-31 18:14:59 -07:00
										 |  |  |  | import { test, expect, stripAnsi } from './playwright-test-fixtures'; | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | test('should support spec.ok', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							| 
									
										
										
										
											2021-06-06 22:07:07 -07:00
										 |  |  |  |       const { test } = pwt; | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |  |       test('math works!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(2); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |       test('math fails!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(3); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `
 | 
					
						
							|  |  |  |  |   }, { }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].ok).toBe(true); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[1].ok).toBe(false); | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-27 11:04:38 -07:00
										 |  |  |  | test('should not report skipped due to sharding', async ({ runInlineTest }) => { | 
					
						
							| 
									
										
										
										
											2021-07-13 05:06:08 -07:00
										 |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('one', async () => { | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |       test('two', async () => { | 
					
						
							|  |  |  |  |         test.skip(); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |     'b.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('three', async () => { | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |       test('four', async () => { | 
					
						
							|  |  |  |  |         test.skip(); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |       test('five', async () => { | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |   }, { shard: '1/3', reporter: 'json' }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							| 
									
										
										
										
											2021-07-27 11:04:38 -07:00
										 |  |  |  |   expect(result.report.suites.length).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs.length).toBe(2); | 
					
						
							| 
									
										
										
										
											2021-07-13 05:06:08 -07:00
										 |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].status).toBe('expected'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[1].tests[0].status).toBe('skipped'); | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |  | test('should report projects', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |  |       module.exports = { | 
					
						
							|  |  |  |  |         retries: 2, | 
					
						
							|  |  |  |  |         projects: [ | 
					
						
							|  |  |  |  |           { | 
					
						
							|  |  |  |  |             timeout: 5000, | 
					
						
							|  |  |  |  |             name: 'p1', | 
					
						
							|  |  |  |  |             metadata: { foo: 'bar' }, | 
					
						
							|  |  |  |  |           }, | 
					
						
							|  |  |  |  |           { | 
					
						
							|  |  |  |  |             timeout: 8000, | 
					
						
							|  |  |  |  |             name: 'p2', | 
					
						
							|  |  |  |  |             metadata: { bar: 42 }, | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         ] | 
					
						
							|  |  |  |  |       }; | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							| 
									
										
										
										
											2021-06-06 22:07:07 -07:00
										 |  |  |  |       const { test } = pwt; | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |  |       test('math works!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(2); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `
 | 
					
						
							|  |  |  |  |   }, { }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |  |   const projects = result.report.config.projects; | 
					
						
							|  |  |  |  |   const testDir = testInfo.outputDir.split(path.sep).join(path.posix.sep); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   expect(projects[0].name).toBe('p1'); | 
					
						
							|  |  |  |  |   expect(projects[0].retries).toBe(2); | 
					
						
							|  |  |  |  |   expect(projects[0].timeout).toBe(5000); | 
					
						
							|  |  |  |  |   expect(projects[0].metadata).toEqual({ foo: 'bar' }); | 
					
						
							|  |  |  |  |   expect(projects[0].testDir).toBe(testDir); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   expect(projects[1].name).toBe('p2'); | 
					
						
							|  |  |  |  |   expect(projects[1].retries).toBe(2); | 
					
						
							|  |  |  |  |   expect(projects[1].timeout).toBe(8000); | 
					
						
							|  |  |  |  |   expect(projects[1].metadata).toEqual({ bar: 42 }); | 
					
						
							|  |  |  |  |   expect(projects[1].testDir).toBe(testDir); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].projectName).toBe('p1'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[1].projectName).toBe('p2'); | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-07-16 22:34:55 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-07 16:35:30 -04:00
										 |  |  |  | test('should show steps', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('math works!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(2); | 
					
						
							|  |  |  |  |         await test.step('math works in a step', async () => { | 
					
						
							|  |  |  |  |           expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |           await test.step('nested step', async () => { | 
					
						
							|  |  |  |  |             expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |             await test.step('deeply nested step', async () => { | 
					
						
							|  |  |  |  |               expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |           }) | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |         await test.step('failing step', async () => { | 
					
						
							|  |  |  |  |           expect(2 + 2).toBe(5); | 
					
						
							|  |  |  |  |         }); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `
 | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites.length).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs.length).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].steps[0].title).toBe('math works in a step'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].steps[0].steps[0].title).toBe('nested step'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].steps[0].steps[0].steps[0].title).toBe('deeply nested step'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].steps[0].steps[0].steps[0].steps).toBeUndefined(); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].steps[1].error).not.toBeUndefined(); | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-15 15:30:22 -04:00
										 |  |  |  | test('should display tags separately from title', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('math works! @USR-MATH-001 @USR-MATH-002', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(2); | 
					
						
							|  |  |  |  |         await test.step('math works in a step', async () => { | 
					
						
							|  |  |  |  |           expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |           await test.step('nested step', async () => { | 
					
						
							|  |  |  |  |             expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |             await test.step('deeply nested step', async () => { | 
					
						
							|  |  |  |  |               expect(2 + 2).toBe(4); | 
					
						
							|  |  |  |  |             }); | 
					
						
							|  |  |  |  |           }) | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `
 | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |  |   expect(result.report.suites.length).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs.length).toBe(1); | 
					
						
							|  |  |  |  |   // Ensure the length is as expected
 | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tags.length).toBe(2); | 
					
						
							|  |  |  |  |   // Ensure that the '@' value is stripped
 | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tags[0]).toBe('USR-MATH-001'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tags[1]).toBe('USR-MATH-002'); | 
					
						
							|  |  |  |  | }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-16 22:34:55 -07:00
										 |  |  |  | test('should have relative always-posix paths', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('math works!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(2); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `
 | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |  |   expect(result.report.config.rootDir.indexOf(path.win32.sep)).toBe(-1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].file).toBe('a.test.js'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].line).toBe(6); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].column).toBe(7); | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-10-01 02:48:36 +05:30
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | test('should have error position in results', async ({ | 
					
						
							|  |  |  |  |   runInlineTest, | 
					
						
							|  |  |  |  | }) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('math works!', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1 + 1).toBe(3); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |   }); | 
					
						
							|  |  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].file).toBe('a.test.js'); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].errorLocation.line).toBe(7); | 
					
						
							|  |  |  |  |   expect(result.report.suites[0].specs[0].tests[0].results[0].errorLocation.column).toBe(23); | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-11-03 08:25:16 -07:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-24 12:39:28 -08:00
										 |  |  |  | test('should add dot in addition to file json with CI', async ({ runInlineTest }, testInfo) => { | 
					
						
							| 
									
										
										
										
											2021-11-03 08:25:16 -07:00
										 |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |  |       module.exports = { reporter: [['json', { outputFile: 'a.json' }]] }; | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('one', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1).toBe(1); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							| 
									
										
										
										
											2022-02-24 12:39:28 -08:00
										 |  |  |  |   }, { reporter: '' }, { CI: '1' }); | 
					
						
							| 
									
										
										
										
											2021-11-03 08:25:16 -07:00
										 |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							| 
									
										
										
										
											2022-01-31 18:14:59 -07:00
										 |  |  |  |   expect(stripAnsi(result.output)).toContain('·'); | 
					
						
							| 
									
										
										
										
											2021-11-03 08:25:16 -07:00
										 |  |  |  |   expect(fs.existsSync(testInfo.outputPath('a.json'))).toBeTruthy(); | 
					
						
							|  |  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-02-24 12:39:28 -08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | test('should add line in addition to file json without CI', async ({ runInlineTest }, testInfo) => { | 
					
						
							|  |  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |  |       module.exports = { reporter: [['json', { outputFile: 'a.json' }]] }; | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							|  |  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |  |       const { test } = pwt; | 
					
						
							|  |  |  |  |       test('one', async ({}) => { | 
					
						
							|  |  |  |  |         expect(1).toBe(1); | 
					
						
							|  |  |  |  |       }); | 
					
						
							|  |  |  |  |     `,
 | 
					
						
							| 
									
										
										
										
											2022-03-14 10:37:43 -07:00
										 |  |  |  |   }, { reporter: '' }, { PW_TEST_DEBUG_REPORTERS: '1' }); | 
					
						
							| 
									
										
										
										
											2022-02-24 12:39:28 -08:00
										 |  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							| 
									
										
										
										
											2022-03-14 10:37:43 -07:00
										 |  |  |  |   expect(stripAnsi(result.output)).toContain('[1/1] a.test.js:6:7 › one'); | 
					
						
							| 
									
										
										
										
											2022-02-24 12:39:28 -08:00
										 |  |  |  |   expect(fs.existsSync(testInfo.outputPath('a.json'))).toBeTruthy(); | 
					
						
							|  |  |  |  | }); |