import {promises as fs} from 'node:fs'; import path from 'node:path'; import test from '@ava/test'; import {cwd, fixture} from '../helpers/exec.js'; import {withTemporaryFixture} from '../helpers/with-temporary-fixture.js'; function countMatches(string, regex) { return [...string.matchAll(regex)].length; } function countStringMatches(string, patternString) { if (patternString.length === 0) { throw new RangeError('Pattern must be non-empty'); } let index = string.indexOf(patternString); let matches = 0; while (index !== -1 && index < string.length) { matches++; index = string.indexOf(patternString, index + patternString.length); } return matches; } test('snapshot corruption is reported to the console', async t => { await withTemporaryFixture(cwd('corrupt'), async cwd => { const snapPath = path.join(cwd, 'test.js.snap'); await fs.writeFile(snapPath, Uint8Array.of(0x00)); const result = await t.throwsAsync(fixture([], {cwd})); t.snapshot(result.stats.failed, 'failed tests'); t.is(countMatches(result.stdout, /The snapshot file is corrupted./g), 2); t.is(countMatches(result.stdout, /File path:/g), 2); t.is( countMatches( result.stdout, /Please run AVA again with the .*--update-snapshots.* flag to recreate it\./g, ), 2, ); t.is(countStringMatches(result.stdout, snapPath), 2); }); }); test('with --update-snapshots, corrupt snapshot files are overwritten', async t => { await withTemporaryFixture(cwd('corrupt'), async cwd => { const snapPath = path.join(cwd, 'test.js.snap'); const env = { AVA_FORCE_CI: 'not-ci', }; await fs.writeFile(snapPath, Uint8Array.of(0x00)); await fixture(['--update-snapshots'], {cwd, env}); const snapContents = await fs.readFile(snapPath); t.not(snapContents.length, 1); }); });