| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright Microsoft Corporation. All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('test.extend should work', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const { output, passed } = await runInlineTest({ | 
					
						
							|  |  |  |     'helper.ts': `
 | 
					
						
							|  |  |  |       global.logs = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       function createDerivedFixtures(suffix) { | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |           derivedWorker: [async ({ baseWorker }, run) => { | 
					
						
							|  |  |  |             global.logs.push('beforeAll-' + suffix); | 
					
						
							|  |  |  |             await run(); | 
					
						
							|  |  |  |             global.logs.push('afterAll-' + suffix); | 
					
						
							|  |  |  |             if (suffix.includes('base')) | 
					
						
							|  |  |  |               console.log(global.logs.join('\\n')); | 
					
						
							|  |  |  |           }, { scope: 'worker' }], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           derivedTest: async ({ baseTest, derivedWorker }, run) => { | 
					
						
							|  |  |  |             global.logs.push('beforeEach-' + suffix); | 
					
						
							|  |  |  |             await run(); | 
					
						
							|  |  |  |             global.logs.push('afterEach-' + suffix); | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |       export const base = pwt.test.extend({ | 
					
						
							|  |  |  |         suffix: ['', { scope: 'worker', option: true } ], | 
					
						
							|  |  |  |         baseWorker: [async ({ suffix }, run) => { | 
					
						
							|  |  |  |           global.logs.push('beforeAll-' + suffix); | 
					
						
							|  |  |  |           await run(); | 
					
						
							|  |  |  |           global.logs.push('afterAll-' + suffix); | 
					
						
							|  |  |  |           if (suffix.includes('base')) | 
					
						
							|  |  |  |             console.log(global.logs.join('\\n')); | 
					
						
							|  |  |  |         }, { scope: 'worker' }], | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         baseTest: async ({ suffix, derivedWorker }, run) => { | 
					
						
							|  |  |  |           global.logs.push('beforeEach-' + suffix); | 
					
						
							|  |  |  |           await run(); | 
					
						
							|  |  |  |           global.logs.push('afterEach-' + suffix); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |       export const test1 = base.extend(createDerivedFixtures('e1')); | 
					
						
							|  |  |  |       export const test2 = base.extend(createDerivedFixtures('e2')); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { projects: [ | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |         { use: { suffix: 'base1' } }, | 
					
						
							|  |  |  |         { use: { suffix: 'base2' } }, | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |       ] }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.ts': `
 | 
					
						
							|  |  |  |       import { test1, test2 } from './helper'; | 
					
						
							| 
									
										
										
										
											2021-06-28 22:13:35 +02:00
										 |  |  |       test1('should work 1', async ({ derivedTest }) => { | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |         global.logs.push('test1'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2021-06-28 22:13:35 +02:00
										 |  |  |       test2('should work 2', async ({ derivedTest }) => { | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |         global.logs.push('test2'); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(passed).toBe(4); | 
					
						
							|  |  |  |   expect(output).toContain([ | 
					
						
							|  |  |  |     'beforeAll-base1', | 
					
						
							|  |  |  |     'beforeAll-e1', | 
					
						
							|  |  |  |     'beforeEach-base1', | 
					
						
							|  |  |  |     'beforeEach-e1', | 
					
						
							|  |  |  |     'test1', | 
					
						
							|  |  |  |     'afterEach-e1', | 
					
						
							|  |  |  |     'afterEach-base1', | 
					
						
							|  |  |  |     'afterAll-e1', | 
					
						
							|  |  |  |     'afterAll-base1', | 
					
						
							|  |  |  |   ].join('\n')); | 
					
						
							|  |  |  |   expect(output).toContain([ | 
					
						
							|  |  |  |     'beforeAll-base1', | 
					
						
							|  |  |  |     'beforeAll-e2', | 
					
						
							|  |  |  |     'beforeEach-base1', | 
					
						
							|  |  |  |     'beforeEach-e2', | 
					
						
							|  |  |  |     'test2', | 
					
						
							|  |  |  |     'afterEach-e2', | 
					
						
							|  |  |  |     'afterEach-base1', | 
					
						
							|  |  |  |     'afterAll-e2', | 
					
						
							|  |  |  |     'afterAll-base1', | 
					
						
							|  |  |  |   ].join('\n')); | 
					
						
							|  |  |  |   expect(output).toContain([ | 
					
						
							|  |  |  |     'beforeAll-base2', | 
					
						
							|  |  |  |     'beforeAll-e1', | 
					
						
							|  |  |  |     'beforeEach-base2', | 
					
						
							|  |  |  |     'beforeEach-e1', | 
					
						
							|  |  |  |     'test1', | 
					
						
							|  |  |  |     'afterEach-e1', | 
					
						
							|  |  |  |     'afterEach-base2', | 
					
						
							|  |  |  |     'afterAll-e1', | 
					
						
							|  |  |  |     'afterAll-base2', | 
					
						
							|  |  |  |   ].join('\n')); | 
					
						
							|  |  |  |   expect(output).toContain([ | 
					
						
							|  |  |  |     'beforeAll-base2', | 
					
						
							|  |  |  |     'beforeAll-e2', | 
					
						
							|  |  |  |     'beforeEach-base2', | 
					
						
							|  |  |  |     'beforeEach-e2', | 
					
						
							|  |  |  |     'test2', | 
					
						
							|  |  |  |     'afterEach-e2', | 
					
						
							|  |  |  |     'afterEach-base2', | 
					
						
							|  |  |  |     'afterAll-e2', | 
					
						
							|  |  |  |     'afterAll-base2', | 
					
						
							|  |  |  |   ].join('\n')); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  | test('config should override options but not fixtures', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { | 
					
						
							|  |  |  |         use: { param: 'config' }, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |       const test1 = pwt.test.extend({ param: [ 'default', { option: true } ] }); | 
					
						
							|  |  |  |       test1('default', async ({ param }) => { | 
					
						
							|  |  |  |         console.log('default-' + param); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const test2 = test1.extend({ | 
					
						
							|  |  |  |         param: 'extend', | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       test2('extend', async ({ param }) => { | 
					
						
							|  |  |  |         console.log('extend-' + param); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       const test3 = test1.extend({ | 
					
						
							|  |  |  |         param: async ({ param }, use) => { | 
					
						
							|  |  |  |           await use(param + '-fixture'); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |         }, | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |       test3('fixture', async ({ param }) => { | 
					
						
							|  |  |  |         console.log('fixture-' + param); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |     `,
 | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(3); | 
					
						
							|  |  |  |   expect(result.output).toContain('default-config'); | 
					
						
							|  |  |  |   expect(result.output).toContain('extend-extend'); | 
					
						
							|  |  |  |   expect(result.output).toContain('fixture-config-fixture'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | test('test.extend should be able to merge', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |         use: { param: 'from-config' }, | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |       }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |       const base = pwt.test.extend({ | 
					
						
							|  |  |  |         myFixture: 'abc', | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const test1 = base | 
					
						
							|  |  |  |           .extend({ | 
					
						
							|  |  |  |             param: [ 'default', { option: true } ], | 
					
						
							|  |  |  |             fixture1: ({ param }, use) => use(param + '+fixture1'), | 
					
						
							|  |  |  |             myFixture: 'override', | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const test2 = base.extend({ | 
					
						
							|  |  |  |         fixture2: ({}, use) => use('fixture2'), | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 15:54:00 -08:00
										 |  |  |       const test3 = test1._extendTest(test2); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       test3('merged', async ({ param, fixture1, myFixture, fixture2 }) => { | 
					
						
							|  |  |  |         console.log('param-' + param); | 
					
						
							|  |  |  |         console.log('fixture1-' + fixture1); | 
					
						
							|  |  |  |         console.log('myFixture-' + myFixture); | 
					
						
							|  |  |  |         console.log('fixture2-' + fixture2); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(1); | 
					
						
							|  |  |  |   expect(result.output).toContain('param-from-config'); | 
					
						
							|  |  |  |   expect(result.output).toContain('fixture1-from-config+fixture1'); | 
					
						
							|  |  |  |   expect(result.output).toContain('myFixture-override'); | 
					
						
							|  |  |  |   expect(result.output).toContain('fixture2-fixture2'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 15:54:00 -08:00
										 |  |  | test('test.extend should print nice message when used as _extendTest', async ({ runInlineTest }) => { | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |       const test1 = pwt.test.extend({}); | 
					
						
							|  |  |  |       const test2 = pwt.test.extend({}); | 
					
						
							|  |  |  |       const test3 = test1.extend(test2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test3('test', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(0); | 
					
						
							| 
									
										
										
										
											2022-01-05 15:54:00 -08:00
										 |  |  |   expect(result.output).toContain('Did you mean to call test._extendTest()?'); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-05 15:54:00 -08:00
										 |  |  | test('test._extendTest should print nice message when used as extend', async ({ runInlineTest }) => { | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							| 
									
										
										
										
											2022-01-05 15:54:00 -08:00
										 |  |  |       const test3 = pwt.test._extendTest({}); | 
					
						
							| 
									
										
											  
											
												feat(test runner): replace declare/define with "options" (#10293)
1. Fixtures defined in test.extend() can now have `{ option: true }` configuration that makes them overridable in the config. Options support all other properties of fixtures - value/function, scope, auto.
```
const test = base.extend<MyOptions>({
  foo: ['default', { option: true }],
});
```
2. test.declare() and project.define are removed.
3. project.use applies overrides to default option values and nothing else. Any test.extend() and test.use() calls take priority over config options.
Required user changes: if someone used to define fixture options with test.extend(), overriding them in config will stop working. The solution is to add `{ option: true }`.
```
// Old code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: 123,
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
// New code
export const test = base.extend<{ myOption: number, myFixture: number }>({
  myOption: [123, { option: true }],
  myFixture: ({ myOption }, use) => use(2 * myOption),
});
```
											
										 
											2021-11-18 15:45:52 -08:00
										 |  |  |       test3('test', () => {}); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(1); | 
					
						
							|  |  |  |   expect(result.passed).toBe(0); | 
					
						
							|  |  |  |   expect(result.output).toContain('Did you mean to call test.extend() with fixtures instead?'); | 
					
						
							| 
									
										
										
										
											2021-06-06 17:09:53 -07:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-11-10 14:45:05 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('test.use() with undefined should not be ignored', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { | 
					
						
							|  |  |  |         use: { option1: 'config' }, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |       const test = pwt.test.extend({ | 
					
						
							|  |  |  |         option1: [ 'default', { option: true } ], | 
					
						
							|  |  |  |         option2: [ 'default', { option: true } ], | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       test('test1', async ({ option1, option2 }) => { | 
					
						
							|  |  |  |         console.log('test1: option1=' + option1); | 
					
						
							|  |  |  |         console.log('test1: option2=' + option2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test.describe('', () => { | 
					
						
							|  |  |  |         test.use({ option1: 'foo', option2: 'foo' }); | 
					
						
							|  |  |  |         test('test2', async ({ option1, option2 }) => { | 
					
						
							|  |  |  |           console.log('test2: option1=' + option1); | 
					
						
							|  |  |  |           console.log('test2: option2=' + option2); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         test.describe('', () => { | 
					
						
							|  |  |  |           test.use({ option1: undefined, option2: undefined }); | 
					
						
							|  |  |  |           test('test3', async ({ option1, option2 }) => { | 
					
						
							|  |  |  |             console.log('test3: option1=' + option1); | 
					
						
							|  |  |  |             console.log('test3: option2=' + option2); | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test.extend({ option1: undefined, option2: undefined })('test4', async ({ option1, option2 }) => { | 
					
						
							|  |  |  |         console.log('test4: option1=' + option1); | 
					
						
							|  |  |  |         console.log('test4: option2=' + option2); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(4); | 
					
						
							|  |  |  |   expect(result.output).toContain('test1: option1=config'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test1: option2=default'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test2: option1=foo'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test2: option2=foo'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test3: option1=config'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test3: option2=default'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test4: option1=config'); | 
					
						
							|  |  |  |   expect(result.output).toContain('test4: option2=default'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-12-21 14:34:43 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | test('undefined values in config and test.use should be reverted to default', async ({ runInlineTest }) => { | 
					
						
							|  |  |  |   const result = await runInlineTest({ | 
					
						
							|  |  |  |     'playwright.config.ts': `
 | 
					
						
							|  |  |  |       module.exports = { | 
					
						
							|  |  |  |         use: { option1: undefined, option2: undefined }, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |     'a.test.js': `
 | 
					
						
							|  |  |  |       const test = pwt.test.extend({ | 
					
						
							|  |  |  |         option1: [ 'default1', { option: true } ], | 
					
						
							|  |  |  |         option2: [ 'default2', { option: true } ], | 
					
						
							|  |  |  |         option3: [ 'default3', { option: true } ], | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       test.use({ option2: undefined, option3: undefined }); | 
					
						
							|  |  |  |       test('my test', async ({ option1, option2, option3 }) => { | 
					
						
							|  |  |  |         console.log('option1=' + option1); | 
					
						
							|  |  |  |         console.log('option2=' + option2); | 
					
						
							|  |  |  |         console.log('option3=' + option3); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     `,
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(result.exitCode).toBe(0); | 
					
						
							|  |  |  |   expect(result.passed).toBe(1); | 
					
						
							|  |  |  |   expect(result.output).toContain('option1=default1'); | 
					
						
							|  |  |  |   expect(result.output).toContain('option2=default2'); | 
					
						
							|  |  |  |   expect(result.output).toContain('option3=default3'); | 
					
						
							|  |  |  | }); |