mirror of
https://github.com/hanzoai/vitest.git
synced 2026-09-24 17:04:25 +00:00
1691 lines
54 KiB
TypeScript
1691 lines
54 KiB
TypeScript
import type { BrowserTraceData, BrowserTraceEntry } from '../../../packages/browser/src/client/tester/trace'
|
|
import { stripVTControlCharacters } from 'node:util'
|
|
import { relative } from 'pathe'
|
|
import { expect, test } from 'vitest'
|
|
import { buildTestProjectTree } from '../../test-utils'
|
|
import { instances, provider, runBrowserTests } from './utils'
|
|
|
|
// update snapshots by
|
|
// TEST_BROWSER=chromium pnpm -C test/browser/ test:playwright specs/trace.test.ts -u --run
|
|
// run fixture directly by
|
|
// TEST_BROWSER=chromium pnpm -C test/browser/ test-fixtures --root fixtures/trace
|
|
|
|
test('trace view artifacts', async () => {
|
|
const result = await runBrowserTests({
|
|
root: './fixtures/trace',
|
|
})
|
|
const root = result.ctx!.config.root
|
|
|
|
function formatLocation(location: BrowserTraceEntry['location']) {
|
|
// columns can differ between browsers
|
|
// return `${relative(root, location.file)}:${location.line}:${location.column}`
|
|
return `${relative(root, location!.file)}:${location!.line}`
|
|
}
|
|
|
|
function formatEntry(raw: BrowserTraceEntry) {
|
|
// snapshot only stable data.
|
|
// other integration features need to be tested separately
|
|
const result = {
|
|
...raw,
|
|
range: raw.range ? { phase: raw.range.phase } : undefined,
|
|
location: raw.location ? formatLocation(raw.location) : undefined,
|
|
stack: undefined,
|
|
startTime: undefined,
|
|
duration: undefined,
|
|
snapshot: {
|
|
selectorResolution: raw.snapshot.selectorResolution,
|
|
selectorError: raw.snapshot.selectorError,
|
|
},
|
|
}
|
|
// remove noisy undefined properties
|
|
for (const _key in result) {
|
|
const key = _key as keyof typeof result
|
|
if (result[key] === undefined) {
|
|
delete result[key]
|
|
}
|
|
if (result[key] && typeof result[key] === 'object') {
|
|
for (const subKey in result[key]) {
|
|
if ((result as any)[key][subKey] === undefined) {
|
|
delete (result as any)[key][subKey]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
const projectErrorTree = buildTestProjectTree(result.results, (testCase) => {
|
|
const result = testCase.result()
|
|
return result.state === 'failed'
|
|
? result.errors.map(e => stripVTControlCharacters(e.message))
|
|
: result.state
|
|
})
|
|
|
|
const projectArtifactTree = buildTestProjectTree(result.results, (testCase) => {
|
|
const artifacts = testCase.artifacts()
|
|
const traces = artifacts.map((artifact) => {
|
|
if (artifact.type === 'internal:browserTrace') {
|
|
const data = artifact.data as BrowserTraceData
|
|
return {
|
|
entries: data.entries.map(e => formatEntry(e)),
|
|
...(data.retry ? { retry: data.retry } : {}),
|
|
...(data.repeats ? { repeats: data.repeats } : {}),
|
|
}
|
|
}
|
|
return artifact.type
|
|
})
|
|
return traces
|
|
})
|
|
|
|
for (const { browser } of instances) {
|
|
expect.soft(projectErrorTree[browser], browser).toMatchInlineSnapshot(`
|
|
{
|
|
"exotic.test.ts": {
|
|
"adopted stylesheets are not captured by snapshot alone": "passed",
|
|
"canvas pixels are captured for replay": "passed",
|
|
"custom element dom shape is rebuilt without runtime behavior": "passed",
|
|
"shadow dom is rebuilt and highlightable by mirror id": "passed",
|
|
},
|
|
"expect.test.ts": {
|
|
"click": "passed",
|
|
"click fail": [
|
|
"Click failed (normalized)",
|
|
],
|
|
"expect.element fail": [
|
|
"expect(element).toHaveTextContent()
|
|
|
|
Expected element to have text content:
|
|
World
|
|
Received:
|
|
Hello",
|
|
],
|
|
"expect.element pass": "passed",
|
|
"failure": [
|
|
"Test failure",
|
|
],
|
|
},
|
|
"mark.test.ts": {
|
|
"custom command": "passed",
|
|
"helper": "passed",
|
|
"kind": "passed",
|
|
"locator.mark": "passed",
|
|
"mark function": "passed",
|
|
"mark function fail": [
|
|
"Mark failure",
|
|
],
|
|
"page.mark": "passed",
|
|
"stack": "passed",
|
|
},
|
|
"resources.test.ts": {
|
|
"external image remains url dependent": "passed",
|
|
"same-origin image is inlined for offline replay": "passed",
|
|
},
|
|
"retry.test.ts": {
|
|
"repeated retried tests": "passed",
|
|
"repeated test": "passed",
|
|
"repeated test retried on later repeat": "passed",
|
|
"retried test": "passed",
|
|
},
|
|
"styles.test.ts": {
|
|
"css url resources stay as urls": "passed",
|
|
"external stylesheet remains url dependent": "passed",
|
|
"font files remain url dependent": "passed",
|
|
"inline styles": "passed",
|
|
"same-origin link css is inlined": "passed",
|
|
"snapshot-time pseudo-state styles": "passed",
|
|
"style tag css is inlined": "passed",
|
|
},
|
|
"viewport.test.ts": {
|
|
"document scroll is restored from trace metadata": "passed",
|
|
"overflow element scroll is stored in snapshot payload": "passed",
|
|
"viewport media query depends on replay viewport": "passed",
|
|
},
|
|
}
|
|
`)
|
|
if (provider.name === 'playwright') {
|
|
expect.soft(projectArtifactTree[browser], browser).toMatchInlineSnapshot(`
|
|
{
|
|
"exotic.test.ts": {
|
|
"adopted stylesheets are not captured by snapshot alone": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "mark",
|
|
"location": "exotic.test.ts:54",
|
|
"name": "button rendered with adopted stylesheet",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "exotic.test.ts:47",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"canvas pixels are captured for replay": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByTestId('trace-canvas')",
|
|
"selector": "internal:testid=[data-testid="trace-canvas"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "exotic.test.ts:17",
|
|
"name": "canvas drawn before mark",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "exotic.test.ts:11",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"custom element dom shape is rebuilt without runtime behavior": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Custom element button' })",
|
|
"selector": "internal:role=button[name="Custom element button"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "exotic.test.ts:43",
|
|
"name": "custom element rendered",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "exotic.test.ts:30",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"shadow dom is rebuilt and highlightable by mirror id": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Shadow button' })",
|
|
"selector": "internal:role=button[name="Shadow button"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "exotic.test.ts:26",
|
|
"name": "shadow button rendered",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "exotic.test.ts:20",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
"expect.test.ts": {
|
|
"click": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "action",
|
|
"location": "expect.test.ts:25",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "action",
|
|
"location": "expect.test.ts:25",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "expect.test.ts:23",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"click fail": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Missing' })",
|
|
"selector": "internal:role=button[name="Missing"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "expect.test.ts:31",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "missing",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Missing' })",
|
|
"selector": "internal:role=button[name="Missing"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "expect.test.ts:31",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "missing",
|
|
},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "expect.test.ts:31",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"expect.element fail": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "expect",
|
|
"location": "expect.test.ts:15",
|
|
"name": "toHaveTextContent",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "expect",
|
|
"location": "expect.test.ts:15",
|
|
"name": "toHaveTextContent [ERROR]",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "expect.test.ts:15",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"expect.element pass": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "expect",
|
|
"location": "expect.test.ts:10",
|
|
"name": "toHaveTextContent",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "expect",
|
|
"location": "expect.test.ts:10",
|
|
"name": "toHaveTextContent",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "expect.test.ts:8",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"failure": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "expect.test.ts:20",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
"mark.test.ts": {
|
|
"custom command": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "action",
|
|
"name": "from server command",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:48",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"helper": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Hello', exact: false })",
|
|
"selector": "internal:role=button[name="Hello"i]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:24",
|
|
"name": "render helper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:23",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"kind": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "action",
|
|
"location": "mark.test.ts:42",
|
|
"name": "action marker",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "expect",
|
|
"location": "mark.test.ts:43",
|
|
"name": "expect marker",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:44",
|
|
"name": "lifecycle group",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:45",
|
|
"name": "lifecycle group",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:39",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"locator.mark": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:10",
|
|
"name": "button rendered - locator",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:8",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"mark function": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:34",
|
|
"name": "render group",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:34",
|
|
"name": "render group",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:33",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"mark function fail": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:57",
|
|
"name": "failed render group",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:57",
|
|
"name": "failed render group",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:59",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"page.mark": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:15",
|
|
"name": "button rendered - page",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:13",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"stack": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "mark",
|
|
"location": "mark.test.ts:29",
|
|
"name": "button rendered - stack",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "mark.test.ts:27",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
"resources.test.ts": {
|
|
"external image remains url dependent": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByAltText('external trace asset')",
|
|
"selector": "internal:attr=[alt="external trace asset"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "resources.test.ts:20",
|
|
"name": "image rendered from external url",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "resources.test.ts:17",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"same-origin image is inlined for offline replay": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByAltText('local trace asset')",
|
|
"selector": "internal:attr=[alt="local trace asset"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "resources.test.ts:12",
|
|
"name": "image rendered from same-origin url",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "resources.test.ts:9",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
"retry.test.ts": {
|
|
"repeated retried tests": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:29",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:31",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:29",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:31",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:29",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"retry": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:28",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"retry": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:29",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:28",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:29",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:28",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
],
|
|
"repeated test": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:18",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:17",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:18",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:17",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:18",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:17",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
],
|
|
"repeated test retried on later repeat": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:36",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:35",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:36",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:38",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:36",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:35",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 1,
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:36",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:35",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"repeats": 2,
|
|
},
|
|
],
|
|
"retried test": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:22",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:24",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:22",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:24",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "fail",
|
|
},
|
|
],
|
|
"retry": 1,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('list')",
|
|
"selector": "internal:role=list",
|
|
},
|
|
"kind": "mark",
|
|
"location": "retry.test.ts:22",
|
|
"name": "renderHelper",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
"retry": 2,
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "retry.test.ts:21",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
"retry": 2,
|
|
},
|
|
],
|
|
},
|
|
"styles.test.ts": {
|
|
"css url resources stay as urls": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:51",
|
|
"name": "element rendered with css url resource",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:45",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"external stylesheet remains url dependent": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:62",
|
|
"name": "button rendered with external stylesheet",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:55",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"font files remain url dependent": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:80",
|
|
"name": "button rendered with font-face url",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:66",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"inline styles": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:11",
|
|
"name": "button rendered with css",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:9",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"same-origin link css is inlined": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:41",
|
|
"name": "button rendered with same-origin linked css",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:32",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"snapshot-time pseudo-state styles": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'First pseudo state' })",
|
|
"selector": "internal:role=button[name="First pseudo state"s]",
|
|
},
|
|
"kind": "expect",
|
|
"location": "styles.test.ts:101",
|
|
"name": "toHaveStyle",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'First pseudo state' })",
|
|
"selector": "internal:role=button[name="First pseudo state"s]",
|
|
},
|
|
"kind": "expect",
|
|
"location": "styles.test.ts:101",
|
|
"name": "toHaveStyle",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'First pseudo state' })",
|
|
"selector": "internal:role=button[name="First pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:104",
|
|
"name": "vitest:hover",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'First pseudo state' })",
|
|
"selector": "internal:role=button[name="First pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:104",
|
|
"name": "vitest:hover",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Second pseudo state' })",
|
|
"selector": "internal:role=button[name="Second pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:105",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button', { name: 'Second pseudo state' })",
|
|
"selector": "internal:role=button[name="Second pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:105",
|
|
"name": "vitest:click",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('textbox', { name: 'Focused pseudo state' })",
|
|
"selector": "internal:role=textbox[name="Focused pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:106",
|
|
"name": "vitest:fill",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('textbox', { name: 'Focused pseudo state' })",
|
|
"selector": "internal:role=textbox[name="Focused pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:106",
|
|
"name": "vitest:fill",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('textbox', { name: 'Focus within pseudo state' })",
|
|
"selector": "internal:role=textbox[name="Focus within pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:107",
|
|
"name": "vitest:fill",
|
|
"range": {
|
|
"phase": "start",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('textbox', { name: 'Focus within pseudo state' })",
|
|
"selector": "internal:role=textbox[name="Focus within pseudo state"s]",
|
|
},
|
|
"kind": "action",
|
|
"location": "styles.test.ts:107",
|
|
"name": "vitest:fill",
|
|
"range": {
|
|
"phase": "end",
|
|
},
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:83",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"style tag css is inlined": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "styles.test.ts:29",
|
|
"name": "button rendered with style tag css",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "styles.test.ts:14",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
"viewport.test.ts": {
|
|
"document scroll is restored from trace metadata": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByRole('button')",
|
|
"selector": "internal:role=button",
|
|
},
|
|
"kind": "mark",
|
|
"location": "viewport.test.ts:31",
|
|
"name": "document scrolled before mark",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "viewport.test.ts:24",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"overflow element scroll is stored in snapshot payload": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"element": {
|
|
"locator": "getByTestId('scroll-box')",
|
|
"selector": "internal:testid=[data-testid="scroll-box"s]",
|
|
},
|
|
"kind": "mark",
|
|
"location": "viewport.test.ts:47",
|
|
"name": "overflow container scrolled before mark",
|
|
"snapshot": {
|
|
"selectorResolution": "matched",
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "viewport.test.ts:34",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"viewport media query depends on replay viewport": [
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "mark",
|
|
"location": "viewport.test.ts:21",
|
|
"name": "viewport sensitive layout rendered",
|
|
"snapshot": {},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
"entries": [
|
|
{
|
|
"kind": "lifecycle",
|
|
"location": "viewport.test.ts:10",
|
|
"name": "vitest:onAfterRetryTask",
|
|
"snapshot": {},
|
|
"status": "pass",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
}
|
|
`)
|
|
}
|
|
}
|
|
})
|