Files
renovate[bot]GitHubrenovate[bot] <29139614+renovate[bot]@users.noreply.github.com>Vladimir Sheremet
2f8762c5b7 chore(deps): update eslint packages (#9825)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Vladimir Sheremet <[email protected]>
2026-06-24 11:57:48 +02:00

325 lines
8.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import fs, { readFileSync } from 'node:fs'
import { join } from 'node:path'
import { expect, test } from 'vitest'
import { editFile, runVitest } from '../../test-utils'
const INLINE_BLOCK_RE = /\/\/ -- TEST INLINE START --\n([\s\S]*?)\/\/ -- TEST INLINE END --/g
function extractInlineBlocks(content: string): string {
return Array.from(content.matchAll(INLINE_BLOCK_RE), m => m[1].trim()).join('\n\n')
}
test('toMatchSnapshot and toMatchInlineSnapshot with properties', async () => {
const root = join(import.meta.dirname, 'fixtures/properties')
const testFile = join(root, 'basic.test.ts')
const snapshotFile = join(root, '__snapshots__/basic.test.ts.snap')
// remove snapshots
fs.rmSync(join(root, '__snapshots__'), { recursive: true, force: true })
editFile(testFile, s =>
s.replace(/toMatchInlineSnapshot\((\{[^}]*\}),\s*`[^`]*`\)/g, 'toMatchInlineSnapshot($1)'))
// create snapshots from scratch
let result = await runVitest({ root, update: 'new' })
expect(result.stderr).toMatchInlineSnapshot(`""`)
expect(readFileSync(snapshotFile, 'utf-8')).toMatchInlineSnapshot(`
"// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[\`file 1\`] = \`
{
"age": Any<Number>,
"name": "alice",
}
\`;
exports[\`file asymmetric 1\`] = \`
{
"name": "bob",
"score": toSatisfy<[Function lessThan100]>,
}
\`;
exports[\`file snapshot-only 1\`] = \`
{
"age": Any<Number>,
"name": "dave",
}
\`;
"
`)
expect(extractInlineBlocks(readFileSync(testFile, 'utf-8'))).toMatchInlineSnapshot(`
"test("inline", () => {
expect({ name: "carol", age: 25 }).toMatchInlineSnapshot({ age: expect.any(Number) }, \`
{
"age": Any<Number>,
"name": "carol",
}
\`);
});"
`)
expect(result.errorTree()).toMatchInlineSnapshot(`
{
"basic.test.ts": {
"file": "passed",
"file asymmetric": "passed",
"file snapshot-only": "passed",
"inline": "passed",
},
}
`)
// verify idempotency — re-run without update passes cleanly
const result2 = await runVitest({ root, update: 'none' })
expect(result2.stderr).toMatchInlineSnapshot(`""`)
expect(result2.errorTree()).toEqual(result.errorTree())
// edit tests to break properties check
editFile(testFile, s =>
s
.replace('age: 30', 'age: \'thirty\'')
.replace('score: 95', 'score: 999')
.replace('name: "dave"', 'name: "dave-edit"')
.replace('age: 25', 'age: \'twenty-five\''))
// properties mismatch should NOT cause false-positive obsolete snapshot
result = await runVitest({ root, update: 'none' })
expect(result.stderr).toMatchInlineSnapshot(`
"
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯
FAIL basic.test.ts > file
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "age": Any<Number>,
+ "age": "thirty",
+ "name": "alice",
}
❯ basic.test.ts:4:44
2|
3| test("file", () => {
4| expect({ name: "alice", age: 'thirty' }).toMatchSnapshot({ age: expe…
| ^
5| });
6|
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯
FAIL basic.test.ts > file asymmetric
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "score": toSatisfy<[Function lessThan100]>,
+ "name": "bob",
+ "score": 999,
}
❯ basic.test.ts:8:39
6|
7| test("file asymmetric", () => {
8| expect({ name: "bob", score: 999 }).toMatchSnapshot({
| ^
9| score: expect.toSatisfy(function lessThan100(n) {
10| return n < 100;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯
FAIL basic.test.ts > file snapshot-only
Error: Snapshot \`file snapshot-only 1\` mismatched
- Expected
+ Received
{
"age": Any<Number>,
- "name": "dave",
+ "name": "dave-edit",
}
❯ basic.test.ts:16:42
14|
15| test("file snapshot-only", () => {
16| expect({ name: "dave-edit", age: 42 }).toMatchSnapshot({ age: expect…
| ^
17| });
18|
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯
FAIL basic.test.ts > inline
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "age": Any<Number>,
+ "age": "twenty-five",
+ "name": "carol",
}
❯ basic.test.ts:21:49
19| // -- TEST INLINE START --
20| test("inline", () => {
21| expect({ name: "carol", age: 'twenty-five' }).toMatchInlineSnapshot(…
| ^
22| {
23| "age": Any<Number>,
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯
"
`)
expect(result.errorTree()).toMatchInlineSnapshot(`
{
"basic.test.ts": {
"file": [
"Snapshot properties mismatched",
],
"file asymmetric": [
"Snapshot properties mismatched",
],
"file snapshot-only": [
"Snapshot \`file snapshot-only 1\` mismatched",
],
"inline": [
"Snapshot properties mismatched",
],
},
}
`)
// run with update — properties errors persist
result = await runVitest({ root, update: 'all' })
expect(result.stderr).toMatchInlineSnapshot(`
"
⎯⎯⎯⎯⎯⎯⎯ Failed Tests 3 ⎯⎯⎯⎯⎯⎯⎯
FAIL basic.test.ts > file
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "age": Any<Number>,
+ "age": "thirty",
+ "name": "alice",
}
❯ basic.test.ts:4:44
2|
3| test("file", () => {
4| expect({ name: "alice", age: 'thirty' }).toMatchSnapshot({ age: expe…
| ^
5| });
6|
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/3]⎯
FAIL basic.test.ts > file asymmetric
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "score": toSatisfy<[Function lessThan100]>,
+ "name": "bob",
+ "score": 999,
}
❯ basic.test.ts:8:39
6|
7| test("file asymmetric", () => {
8| expect({ name: "bob", score: 999 }).toMatchSnapshot({
| ^
9| score: expect.toSatisfy(function lessThan100(n) {
10| return n < 100;
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/3]⎯
FAIL basic.test.ts > inline
Error: Snapshot properties mismatched
- Expected
+ Received
{
- "age": Any<Number>,
+ "age": "twenty-five",
+ "name": "carol",
}
❯ basic.test.ts:21:49
19| // -- TEST INLINE START --
20| test("inline", () => {
21| expect({ name: "carol", age: 'twenty-five' }).toMatchInlineSnapshot(…
| ^
22| {
23| "age": Any<Number>,
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/3]⎯
"
`)
expect(readFileSync(snapshotFile, 'utf-8')).toMatchInlineSnapshot(`
"// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[\`file 1\`] = \`
{
"age": Any<Number>,
"name": "alice",
}
\`;
exports[\`file asymmetric 1\`] = \`
{
"name": "bob",
"score": toSatisfy<[Function lessThan100]>,
}
\`;
exports[\`file snapshot-only 1\`] = \`
{
"age": Any<Number>,
"name": "dave-edit",
}
\`;
"
`)
expect(extractInlineBlocks(readFileSync(testFile, 'utf-8'))).toMatchInlineSnapshot(`
"test("inline", () => {
expect({ name: "carol", age: 'twenty-five' }).toMatchInlineSnapshot({ age: expect.any(Number) }, \`
{
"age": Any<Number>,
"name": "carol",
}
\`);
});"
`)
expect(result.errorTree()).toMatchInlineSnapshot(`
{
"basic.test.ts": {
"file": [
"Snapshot properties mismatched",
],
"file asymmetric": [
"Snapshot properties mismatched",
],
"file snapshot-only": "passed",
"inline": [
"Snapshot properties mismatched",
],
},
}
`)
})