From 5e3ad63b42bd557a13abf28c9942a5dfaaa2d281 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 30 Sep 2021 16:44:52 -0700 Subject: [PATCH] fix(test runner): do not write missing snapshot until the last retry (#9246) This prevents future retries from passing because of the actual snapshot being written. In theory, we can avoid running the retry since it should fail anyway. However, this brings problems, for example in the `describe.serial` mode where running a test also has some side effects and so it should not be skipped. Since running a test without a snapshot is rare, it should be fine to retry it. --- src/test/matchers/toMatchSnapshot.ts | 2 +- tests/playwright-test/golden.spec.ts | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/matchers/toMatchSnapshot.ts b/src/test/matchers/toMatchSnapshot.ts index c987b032a0..f1d9b7b600 100644 --- a/src/test/matchers/toMatchSnapshot.ts +++ b/src/test/matchers/toMatchSnapshot.ts @@ -46,7 +46,7 @@ export function toMatchSnapshot(this: ReturnType, received: options.name, testInfo.snapshotPath, testInfo.outputPath, - testInfo.config.updateSnapshots, + testInfo.retry < testInfo.project.retries ? 'none' : testInfo.config.updateSnapshots, withNegateComparison, options ); diff --git a/tests/playwright-test/golden.spec.ts b/tests/playwright-test/golden.spec.ts index b997e9359d..c3cd866a70 100644 --- a/tests/playwright-test/golden.spec.ts +++ b/tests/playwright-test/golden.spec.ts @@ -562,3 +562,24 @@ test('should attach expected/actual and no diff', async ({ runInlineTest }, test ]); }); +test('should fail with missing expectations and 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'); + }); + ` + }); + + expect(result.exitCode).toBe(1); + expect(result.failed).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'); +});