From 51a774f8a3e3f03e50b0363abfc7a51e7b9b6497 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Thu, 21 Sep 2023 16:23:46 -0700 Subject: [PATCH] chore: include log in matcherResult (#27164) --- packages/playwright/src/matchers/expect.ts | 1 + packages/playwright/src/matchers/matcherHint.ts | 1 + packages/playwright/src/matchers/toBeTruthy.ts | 2 +- packages/playwright/src/matchers/toEqual.ts | 2 +- packages/playwright/src/matchers/toMatchSnapshot.ts | 5 +++-- packages/playwright/src/matchers/toMatchText.ts | 1 + packages/playwright/src/worker/testInfo.ts | 4 ++-- tests/page/expect-matcher-result.spec.ts | 11 +++++++++++ 8 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/playwright/src/matchers/expect.ts b/packages/playwright/src/matchers/expect.ts index 5a6f23b9c1..a0d5dff91e 100644 --- a/packages/playwright/src/matchers/expect.ts +++ b/packages/playwright/src/matchers/expect.ts @@ -253,6 +253,7 @@ class ExpectMetaInfoProxyHandler implements ProxyHandler { params: args[0] ? { expected: args[0] } : undefined, wallTime, infectParentStepsWithError: this._info.isSoft, + laxParent: true, }) : undefined; const reportStepError = (jestError: Error) => { diff --git a/packages/playwright/src/matchers/matcherHint.ts b/packages/playwright/src/matchers/matcherHint.ts index 3f58a32032..83349cae64 100644 --- a/packages/playwright/src/matchers/matcherHint.ts +++ b/packages/playwright/src/matchers/matcherHint.ts @@ -34,4 +34,5 @@ export type MatcherResult = { message: () => string; pass: boolean; actual?: A; + log?: string[]; }; diff --git a/packages/playwright/src/matchers/toBeTruthy.ts b/packages/playwright/src/matchers/toBeTruthy.ts index fe4ad7c73c..751d4e4756 100644 --- a/packages/playwright/src/matchers/toBeTruthy.ts +++ b/packages/playwright/src/matchers/toBeTruthy.ts @@ -48,5 +48,5 @@ export async function toBeTruthy( return matches ? `${header}Expected: not ${expected}\nReceived: ${expected}${logText}` : `${header}Expected: ${expected}\nReceived: ${unexpected}${logText}`; }; - return { locator: receiver, message, pass: matches, actual, name: matcherName, expected }; + return { locator: receiver, message, pass: matches, actual, name: matcherName, expected, log }; } diff --git a/packages/playwright/src/matchers/toEqual.ts b/packages/playwright/src/matchers/toEqual.ts index 6067532343..4c47700e0a 100644 --- a/packages/playwright/src/matchers/toEqual.ts +++ b/packages/playwright/src/matchers/toEqual.ts @@ -67,5 +67,5 @@ export async function toEqual( // Passing 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 { locator: receiver, actual: received, expected, message, name: matcherName, pass }; + return { locator: receiver, actual: received, expected, message, name: matcherName, pass, log }; } diff --git a/packages/playwright/src/matchers/toMatchSnapshot.ts b/packages/playwright/src/matchers/toMatchSnapshot.ts index d4a7d5895d..c40dd9da54 100644 --- a/packages/playwright/src/matchers/toMatchSnapshot.ts +++ b/packages/playwright/src/matchers/toMatchSnapshot.ts @@ -157,7 +157,7 @@ class SnapshotHelper { this.kind = this.mimeType.startsWith('image/') ? 'Screenshot' : 'Snapshot'; } - createMatcherResult(message: string, pass: boolean): ImageMatcherResult { + createMatcherResult(message: string, pass: boolean, log?: string[]): ImageMatcherResult { const unfiltered: ImageMatcherResult = { name: this.matcherName, locator: this.locator, @@ -166,6 +166,7 @@ class SnapshotHelper { diff: this.diffPath, pass, message: () => message, + log, }; return Object.fromEntries(Object.entries(unfiltered).filter(([_, v]) => v !== undefined)) as ImageMatcherResult; } @@ -255,7 +256,7 @@ class SnapshotHelper { else output.push(''); - return this.createMatcherResult(output.join('\n'), false); + return this.createMatcherResult(output.join('\n'), false, log); } handleMatching(): ImageMatcherResult { diff --git a/packages/playwright/src/matchers/toMatchText.ts b/packages/playwright/src/matchers/toMatchText.ts index b21fc063aa..efeb5280b8 100644 --- a/packages/playwright/src/matchers/toMatchText.ts +++ b/packages/playwright/src/matchers/toMatchText.ts @@ -105,6 +105,7 @@ export async function toMatchText( message, pass, actual: received, + log, }; } diff --git a/packages/playwright/src/worker/testInfo.ts b/packages/playwright/src/worker/testInfo.ts index bb0e475eb6..40ce96c99a 100644 --- a/packages/playwright/src/worker/testInfo.ts +++ b/packages/playwright/src/worker/testInfo.ts @@ -348,8 +348,8 @@ export class TestInfoImpl implements TestInfo { this.errors.push(error); } - async _runAsStep(stepInfo: Omit, cb: (step: TestStepInternal) => Promise): Promise { - const step = this._addStep({ ...stepInfo, wallTime: Date.now() }); + async _runAsStep(stepInfo: Omit & { wallTime?: number }, cb: (step: TestStepInternal) => Promise): Promise { + const step = this._addStep({ wallTime: Date.now(), ...stepInfo }); return await zones.run('stepZone', step, async () => { try { const result = await cb(step); diff --git a/tests/page/expect-matcher-result.spec.ts b/tests/page/expect-matcher-result.spec.ts index ba11f690cb..5d7ae66ca7 100644 --- a/tests/page/expect-matcher-result.spec.ts +++ b/tests/page/expect-matcher-result.spec.ts @@ -31,6 +31,7 @@ test('toMatchText-based assertions should have matcher result', async ({ page }) message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).toHaveText(expected)`), name: 'toHaveText', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).toHaveText(expected) @@ -52,6 +53,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).not.toHaveText(expected)`), name: 'toHaveText', pass: true, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).not.toHaveText(expected) @@ -77,6 +79,7 @@ test('toBeTruthy-based assertions should have matcher result', async ({ page }) message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).toBeVisible()`), name: 'toBeVisible', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).toBeVisible() @@ -98,6 +101,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).not.toBeVisible()`), name: 'toBeVisible', pass: true, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).not.toBeVisible() @@ -123,6 +127,7 @@ test('toEqual-based assertions should have matcher result', async ({ page }) => message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).toHaveCount(expected)`), name: 'toHaveCount', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).toHaveCount(expected) @@ -143,6 +148,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).not.toHaveCount(expected)`), name: 'toHaveCount', pass: true, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).not.toHaveCount(expected) @@ -171,6 +177,7 @@ test('toBeChecked({ checked: false }) should have expected: false', async ({ pag message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).toBeChecked()`), name: 'toBeChecked', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).toBeChecked() @@ -192,6 +199,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).not.toBeChecked()`), name: 'toBeChecked', pass: true, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).not.toBeChecked() @@ -213,6 +221,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).toBeChecked({ checked: false })`), name: 'toBeChecked', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).toBeChecked({ checked: false }) @@ -234,6 +243,7 @@ Call log`); message: expect.stringContaining(`Timed out 1ms waiting for expect(locator).not.toBeChecked({ checked: false })`), name: 'toBeChecked', pass: true, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Timed out 1ms waiting for expect(locator).not.toBeChecked({ checked: false }) @@ -259,6 +269,7 @@ test('toHaveScreenshot should populate matcherResult', async ({ page, server }) message: expect.stringContaining(`Screenshot comparison failed`), name: 'toHaveScreenshot', pass: false, + log: expect.any(Array), }); expect.soft(stripAnsi(e.toString())).toContain(`Error: Screenshot comparison failed: