From 3cc405c2713960bafd11e08a63cdd39fa80c2329 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 30 Sep 2021 16:13:52 -0700 Subject: [PATCH] fix(test runner): do not write missing snapshot until the last retry 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 c987b032a080f..f1d9b7b600b89 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 b997e9359d3cf..c3cd866a70d66 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'); +});