161 lines
3.9 KiB
JavaScript
161 lines
3.9 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
'use strict';
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
const diff = require('jest-diff');
|
||
|
const fileExists = require('jest-file-exists');
|
||
|
const fs = require('fs');
|
||
|
const path = require('path');
|
||
|
const SnapshotState = require('./State');var _require =
|
||
|
require('./plugins');const addSerializer = _require.addSerializer,getSerializers = _require.getSerializers;var _require2 =
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
require('jest-matcher-utils');const EXPECTED_COLOR = _require2.EXPECTED_COLOR,ensureNoExpected = _require2.ensureNoExpected,matcherHint = _require2.matcherHint,RECEIVED_COLOR = _require2.RECEIVED_COLOR;var _require3 =
|
||
|
require('./utils');const SNAPSHOT_EXTENSION = _require3.SNAPSHOT_EXTENSION;
|
||
|
|
||
|
const cleanup = (hasteFS, update) => {
|
||
|
const pattern = '\\.' + SNAPSHOT_EXTENSION + '$';
|
||
|
const files = hasteFS.matchFiles(pattern);
|
||
|
const filesRemoved = files.
|
||
|
filter(snapshotFile => !fileExists(
|
||
|
path.resolve(
|
||
|
path.dirname(snapshotFile),
|
||
|
'..',
|
||
|
path.basename(snapshotFile, '.' + SNAPSHOT_EXTENSION)),
|
||
|
|
||
|
hasteFS)).
|
||
|
|
||
|
map(snapshotFile => {
|
||
|
if (update) {
|
||
|
fs.unlinkSync(snapshotFile);
|
||
|
}
|
||
|
}).
|
||
|
length;
|
||
|
|
||
|
return {
|
||
|
filesRemoved };
|
||
|
|
||
|
};
|
||
|
|
||
|
const initializeSnapshotState = (
|
||
|
testFile,
|
||
|
update,
|
||
|
testPath,
|
||
|
expand) =>
|
||
|
new SnapshotState(testFile, update, testPath, expand);
|
||
|
|
||
|
const toMatchSnapshot = function (received, testName) {
|
||
|
this.dontThrow && this.dontThrow();const
|
||
|
|
||
|
currentTestName = this.currentTestName,isNot = this.isNot,snapshotState = this.snapshotState;
|
||
|
|
||
|
if (isNot) {
|
||
|
throw new Error(
|
||
|
'Jest: `.not` cannot be used with `.toMatchSnapshot()`.');
|
||
|
|
||
|
}
|
||
|
|
||
|
if (!snapshotState) {
|
||
|
throw new Error('Jest: snapshot state must be initialized.');
|
||
|
}
|
||
|
|
||
|
const result = snapshotState.match(testName || currentTestName, received);const
|
||
|
pass = result.pass;
|
||
|
|
||
|
if (pass) {
|
||
|
return { message: '', pass: true };
|
||
|
} else {const
|
||
|
count = result.count,expected = result.expected,actual = result.actual;
|
||
|
|
||
|
const expectedString = expected.trim();
|
||
|
const actualString = actual.trim();
|
||
|
const diffMessage = diff(
|
||
|
expectedString,
|
||
|
actualString,
|
||
|
{
|
||
|
aAnnotation: 'Snapshot',
|
||
|
bAnnotation: 'Received',
|
||
|
expand: snapshotState.expand });
|
||
|
|
||
|
|
||
|
|
||
|
const report =
|
||
|
() => `${RECEIVED_COLOR('Received value')} does not match ` +
|
||
|
`${EXPECTED_COLOR('stored snapshot ' + count)}.\n\n` + (
|
||
|
diffMessage ||
|
||
|
RECEIVED_COLOR('- ' + expectedString) + '\n' +
|
||
|
EXPECTED_COLOR('+ ' + actualString));
|
||
|
|
||
|
|
||
|
const message =
|
||
|
() => matcherHint('.toMatchSnapshot', 'value', '') + '\n\n' +
|
||
|
report();
|
||
|
|
||
|
// Passing the the actual and expected objects so that a custom reporter
|
||
|
// could access them, for example in order to display a custom visual diff,
|
||
|
// or create a different error message
|
||
|
return {
|
||
|
actual: actualString,
|
||
|
expected: expectedString,
|
||
|
message,
|
||
|
name: 'toMatchSnapshot',
|
||
|
pass: false,
|
||
|
report };
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const toThrowErrorMatchingSnapshot = function (received, expected) {
|
||
|
this.dontThrow && this.dontThrow();const
|
||
|
isNot = this.isNot;
|
||
|
|
||
|
if (isNot) {
|
||
|
throw new Error(
|
||
|
'Jest: `.not` cannot be used with `.toThrowErrorMatchingSnapshot()`.');
|
||
|
|
||
|
}
|
||
|
|
||
|
ensureNoExpected(expected, '.toThrowErrorMatchingSnapshot');
|
||
|
|
||
|
let error;
|
||
|
|
||
|
try {
|
||
|
received();
|
||
|
} catch (e) {
|
||
|
error = e;
|
||
|
}
|
||
|
|
||
|
if (error === undefined) {
|
||
|
throw new Error(
|
||
|
matcherHint('.toThrowErrorMatchingSnapshot', '() => {}', '') + '\n\n' +
|
||
|
`Expected the function to throw an error.\n` +
|
||
|
`But it didn't throw anything.`);
|
||
|
|
||
|
}
|
||
|
|
||
|
return toMatchSnapshot.call(this, error.message);
|
||
|
};
|
||
|
|
||
|
module.exports = {
|
||
|
EXTENSION: SNAPSHOT_EXTENSION,
|
||
|
SnapshotState,
|
||
|
addSerializer,
|
||
|
cleanup,
|
||
|
getSerializers,
|
||
|
initializeSnapshotState,
|
||
|
toMatchSnapshot,
|
||
|
toThrowErrorMatchingSnapshot };
|