diff --git a/packages/playwright-test/src/matchers/toMatchSnapshot.ts b/packages/playwright-test/src/matchers/toMatchSnapshot.ts index 64802f0be99b6..a07897c75b61d 100644 --- a/packages/playwright-test/src/matchers/toMatchSnapshot.ts +++ b/packages/playwright-test/src/matchers/toMatchSnapshot.ts @@ -45,12 +45,15 @@ export function toMatchSnapshot(this: ReturnType, received: // sanitizes path if string const pathSegments = Array.isArray(options.name) ? options.name : [addSuffixToFilePath(options.name, '', undefined, true)]; const withNegateComparison = this.isNot; + let updateSnapshots = testInfo.config.updateSnapshots; + if (updateSnapshots === 'missing' && testInfo.retry < testInfo.project.retries) + updateSnapshots = 'none'; const { pass, message, expectedPath, actualPath, diffPath, mimeType } = compare( received, pathSegments, testInfo.snapshotPath, testInfo.outputPath, - testInfo.retry < testInfo.project.retries ? 'none' : testInfo.config.updateSnapshots, + updateSnapshots, withNegateComparison, options ); diff --git a/tests/playwright-test/golden.spec.ts b/tests/playwright-test/golden.spec.ts index 47b41684b104b..9526cceb991f3 100644 --- a/tests/playwright-test/golden.spec.ts +++ b/tests/playwright-test/golden.spec.ts @@ -655,6 +655,28 @@ test('should fail with missing expectations and retries', async ({ runInlineTest expect(data.toString()).toBe('Hello world'); }); +test('should update expectations with retries', async ({ runInlineTest }, testInfo) => { + const result = await runInlineTest({ + ...files, + 'playwright.config.ts': ` + module.exports = { retries: 1 }; + `, + 'a.spec.js': ` + const { test } = require('./helper'); + test('is a test', ({}) => { + expect('Hello world').toMatchSnapshot('snapshot.txt'); + }); + ` + }, { 'update-snapshots': true }); + + expect(result.exitCode).toBe(0); + expect(result.passed).toBe(1); + const snapshotOutputPath = testInfo.outputPath('a.spec.js-snapshots/snapshot.txt'); + expect(result.output).toContain(`${snapshotOutputPath} is missing in snapshots, writing actual`); + const data = fs.readFileSync(snapshotOutputPath); + expect(data.toString()).toBe('Hello world'); +}); + test('should allow comparing text with text without file extension', async ({ runInlineTest }) => { const result = await runInlineTest({ ...files,