Skip to content

Commit

Permalink
Do not write snapshots by default on CI (#3456)
Browse files Browse the repository at this point in the history
* Better flow typings for snapshots.

* Remove `initializeSnapshotState`.

* Do not write snapshots by default on CI systems.

* Tests + updateSnapshot fixes.
  • Loading branch information
cpojer committed May 4, 2017
1 parent bd8b071 commit e16431b
Show file tree
Hide file tree
Showing 23 changed files with 246 additions and 181 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ exports[`jest --showConfig outputs config info and exits 1`] = `
"rootDir": "/mocked/root/path/jest/integration_tests/verbose_reporter",
"testPathPattern": "",
"testResultsProcessor": null,
"updateSnapshot": "all",
"useStderr": false,
"verbose": null,
"watch": false,
Expand Down
11 changes: 10 additions & 1 deletion integration_tests/__tests__/__snapshots__/snapshot-test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ Ran all test suites.
"
`;
exports[`Snapshot Validation does not save snapshots in CI mode by default 1`] = `
"Test Suites: 3 failed, 3 total
Tests: 7 failed, 2 passed, 9 total
Snapshots: 9 failed, 9 total
Time: <<REPLACED>>
Ran all test suites.
"
`;
exports[`Snapshot Validation updates the snapshot when a test removes some snapshots 1`] = `
"Test Suites: 3 passed, 3 total
Tests: 9 passed, 9 total
Expand Down Expand Up @@ -72,7 +81,7 @@ Ran all test suites.
"
`;
exports[`Snapshot works as expected 1`] = `
exports[`Snapshot stores new snapshots on the first run 1`] = `
"Test Suites: 2 passed, 2 total
Tests: 5 passed, 5 total
Snapshots: 5 added, 5 total
Expand Down
7 changes: 6 additions & 1 deletion integration_tests/__tests__/showConfig-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,12 @@ describe('jest --showConfig', () => {
.replace(/"cacheDirectory": "(.+)"/, '"cacheDirectory": "/tmp/jest"'),
test: val => typeof val === 'string',
});
const {stdout} = runJest(dir, ['--showConfig', '--no-cache']);
const {stdout} = runJest(dir, [
'--showConfig',
'--no-cache',
// Make the snapshot flag stable on CI.
'--updateSnapshot',
]);
expect(stdout).toMatchSnapshot();
});
});
6 changes: 5 additions & 1 deletion integration_tests/__tests__/snapshot-serializers-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ const snapshotsDir = path.resolve(testDir, '__tests__/__snapshots__');
const snapshotPath = path.resolve(snapshotsDir, 'snapshot-test.js.snap');

const runAndAssert = () => {
const result = runJest.json('snapshot-serializers', ['--no-cache']);
const result = runJest.json('snapshot-serializers', [
'-w=1',
'--ci=false',
'--no-cache',
]);
const json = result.json;
expect(json.numTotalTests).toBe(7);
expect(json.numPassedTests).toBe(7);
Expand Down
66 changes: 52 additions & 14 deletions integration_tests/__tests__/snapshot-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ describe('Snapshot', () => {
beforeEach(cleanup);
afterAll(cleanup);

it('works as expected', () => {
const result = runJest.json('snapshot', []);
it('stores new snapshots on the first run', () => {
const result = runJest.json('snapshot', ['-w=1', '--ci=false']);
const json = result.json;

expect(json.numTotalTests).toBe(5);
Expand All @@ -122,7 +122,11 @@ describe('Snapshot', () => {

it('works with escaped characters', () => {
// Write the first snapshot
let result = runJest('snapshot-escape', ['snapshot-test.js']);
let result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-test.js',
]);
let stderr = result.stderr.toString();

expect(stderr).toMatch('1 snapshot written');
Expand All @@ -136,7 +140,12 @@ describe('Snapshot', () => {
const newTestData = initialTestData + testData;
fs.writeFileSync(snapshotEscapeTestFile, newTestData, 'utf8');

result = runJest('snapshot-escape', ['snapshot-test.js']);
result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'--updateSnapshot',
'snapshot-test.js',
]);
stderr = result.stderr.toString();

expect(stderr).toMatch('1 snapshot written');
Expand All @@ -145,7 +154,11 @@ describe('Snapshot', () => {

// Now let's check again if everything still passes.
// If this test doesn't pass, some snapshot data was not properly escaped.
result = runJest('snapshot-escape', ['snapshot-test.js']);
result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-test.js',
]);
stderr = result.stderr.toString();

expect(stderr).not.toMatch('Snapshot Summary');
Expand All @@ -155,14 +168,22 @@ describe('Snapshot', () => {

it('works with escaped regex', () => {
// Write the first snapshot
let result = runJest('snapshot-escape', ['snapshot-escape-regex.js']);
let result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-escape-regex.js',
]);
let stderr = result.stderr.toString();

expect(stderr).toMatch('2 snapshots written in 1 test suite.');
expect(result.status).toBe(0);
expect(extractSummary(stderr).summary).toMatchSnapshot();

result = runJest('snapshot-escape', ['snapshot-escape-regex.js']);
result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-escape-regex.js',
]);
stderr = result.stderr.toString();

// Make sure we aren't writing a snapshot this time which would
Expand All @@ -175,6 +196,8 @@ describe('Snapshot', () => {
it('works with template literal subsitutions', () => {
// Write the first snapshot
let result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-escape-substitution-test.js',
]);
let stderr = result.stderr.toString();
Expand All @@ -184,6 +207,8 @@ describe('Snapshot', () => {
expect(extractSummary(stderr).summary).toMatchSnapshot();

result = runJest('snapshot-escape', [
'-w=1',
'--ci=false',
'snapshot-escape-substitution-test.js',
]);
stderr = result.stderr.toString();
Expand All @@ -200,8 +225,21 @@ describe('Snapshot', () => {
fs.writeFileSync(copyOfTestPath, originalTestContent);
});

it('does not save snapshots in CI mode by default', () => {
const result = runJest.json('snapshot', ['-w=1', '--ci=true']);

expect(result.json.success).toBe(false);
expect(result.json.numTotalTests).toBe(9);
expect(result.json.snapshot.added).toBe(0);
expect(result.json.snapshot.total).toBe(9);
const {rest, summary} = extractSummary(result.stderr.toString());

expect(rest).toMatch('New snapshot was not written');
expect(summary).toMatchSnapshot();
});

it('works on subsequent runs without `-u`', () => {
const firstRun = runJest.json('snapshot', []);
const firstRun = runJest.json('snapshot', ['-w=1', '--ci=false']);

const content = require(snapshotOfCopy);
expect(content).not.toBe(undefined);
Expand All @@ -220,12 +258,12 @@ describe('Snapshot', () => {
});

it('deletes the snapshot if the test suite has been removed', () => {
const firstRun = runJest.json('snapshot', []);
const firstRun = runJest.json('snapshot', ['-w=1', '--ci=false']);
fs.unlinkSync(copyOfTestPath);

const content = require(snapshotOfCopy);
expect(content).not.toBe(undefined);
const secondRun = runJest.json('snapshot', ['-u']);
const secondRun = runJest.json('snapshot', ['-w=1', '--ci=false', '-u']);

expect(firstRun.json.numTotalTests).toBe(9);
expect(secondRun.json.numTotalTests).toBe(5);
Expand All @@ -240,10 +278,10 @@ describe('Snapshot', () => {
});

it('deletes a snapshot when a test does removes all the snapshots', () => {
const firstRun = runJest.json('snapshot', []);
const firstRun = runJest.json('snapshot', ['-w=1', '--ci=false']);

fs.writeFileSync(copyOfTestPath, emptyTest);
const secondRun = runJest.json('snapshot', ['-u']);
const secondRun = runJest.json('snapshot', ['-w=1', '--ci=false', '-u']);
fs.unlinkSync(copyOfTestPath);

expect(firstRun.json.numTotalTests).toBe(9);
Expand All @@ -259,7 +297,7 @@ describe('Snapshot', () => {
});

it('updates the snapshot when a test removes some snapshots', () => {
const firstRun = runJest.json('snapshot', []);
const firstRun = runJest.json('snapshot', ['-w=1', '--ci=false']);
fs.unlinkSync(copyOfTestPath);
const beforeRemovingSnapshot = getSnapshotOfCopy();

Expand All @@ -270,7 +308,7 @@ describe('Snapshot', () => {
'.not.toBe(undefined)',
),
);
const secondRun = runJest.json('snapshot', ['-u']);
const secondRun = runJest.json('snapshot', ['-w=1', '--ci=false', '-u']);
fs.unlinkSync(copyOfTestPath);

expect(firstRun.json.numTotalTests).toBe(9);
Expand Down
53 changes: 25 additions & 28 deletions integration_tests/__tests__/toMatchSnapshot-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,81 +26,82 @@ test('basic support', () => {

{
makeTests(TESTS_DIR, {[filename]: template(['{apple: "original value"}'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('1 snapshot written in 1 test suite.');
expect(status).toBe(0);
}

{
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('Snapshots: 1 passed, 1 total');
expect(stderr).not.toMatch('1 snapshot written in 1 test suite.');
expect(status).toBe(0);
}

{
makeTests(TESTS_DIR, {[filename]: template(['{apple: "updated value"}'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('Received value does not match stored snapshot');
expect(status).toBe(1);
}

{
const {stderr, status} = runJest(DIR, [filename, '-u']);
const {stderr, status} = runJest(DIR, [
'-w=1',
'--ci=false',
filename,
'-u',
]);
expect(stderr).toMatch('1 snapshot updated in 1 test suite.');
expect(status).toBe(0);
}
});

test('error thrown before snapshot', () => {
const filename = 'error-thrown-before-snapshot-test.js';
const template = makeTemplate(
`test('snapshots', () => {
const template = makeTemplate(`test('snapshots', () => {
expect($1).toBeTruthy();
expect($2).toMatchSnapshot();
});`,
);
});`);

{
makeTests(TESTS_DIR, {[filename]: template(['true', '{a: "original"}'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('1 snapshot written in 1 test suite.');
expect(status).toBe(0);
}

{
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('Snapshots: 1 passed, 1 total');
expect(status).toBe(0);
}

{
makeTests(TESTS_DIR, {[filename]: template(['false', '{a: "original"}'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).not.toMatch('1 obsolete snapshot found');
expect(status).toBe(1);
}
});

test('first snapshot fails, second passes', () => {
const filename = 'first-snapshot-fails-second-passes-test.js';
const template = makeTemplate(
`test('snapshots', () => {
const template = makeTemplate(`test('snapshots', () => {
expect($1).toMatchSnapshot();
expect($2).toMatchSnapshot();
});`,
);
});`);

{
makeTests(TESTS_DIR, {[filename]: template([`'apple'`, `'banana'`])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('2 snapshots written in 1 test suite.');
expect(status).toBe(0);
}

{
makeTests(TESTS_DIR, {[filename]: template([`'kiwi'`, `'banana'`])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('Received value does not match stored snapshot');
expect(stderr).toMatch('- "apple"\n + "kiwi"');
expect(stderr).not.toMatch('1 obsolete snapshot found');
Expand All @@ -110,44 +111,40 @@ test('first snapshot fails, second passes', () => {

test('does not mark snapshots as obsolete in skipped tests', () => {
const filename = 'no-obsolete-if-skipped-test.js';
const template = makeTemplate(
`test('snapshots', () => {
const template = makeTemplate(`test('snapshots', () => {
expect(true).toBe(true);
});
$1('will be skipped', () => {
expect({a: 6}).toMatchSnapshot();
});
`,
);
`);

{
makeTests(TESTS_DIR, {[filename]: template(['test'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('1 snapshot written in 1 test suite.');
expect(status).toBe(0);
}

{
makeTests(TESTS_DIR, {[filename]: template(['test.skip'])});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).not.toMatch('1 obsolete snapshot found');
expect(status).toBe(0);
}
});

test('accepts custom snapshot name', () => {
const filename = 'accept-custom-snapshot-name-test.js';
const template = makeTemplate(
`test('accepts custom snapshot name', () => {
const template = makeTemplate(`test('accepts custom snapshot name', () => {
expect(true).toMatchSnapshot('custom-name');
});
`,
);
`);

{
makeTests(TESTS_DIR, {[filename]: template()});
const {stderr, status} = runJest(DIR, [filename]);
const {stderr, status} = runJest(DIR, ['-w=1', '--ci=false', filename]);
expect(stderr).toMatch('1 snapshot written in 1 test suite.');
expect(status).toBe(0);
}
Expand Down
Loading

0 comments on commit e16431b

Please sign in to comment.