diff --git a/lib/playwrightVisualRegressionTracker.spec.ts b/lib/playwrightVisualRegressionTracker.spec.ts index ece446f..f483204 100644 --- a/lib/playwrightVisualRegressionTracker.spec.ts +++ b/lib/playwrightVisualRegressionTracker.spec.ts @@ -11,11 +11,13 @@ import { import { mocked } from "ts-jest/utils"; import { MaybeMocked } from "ts-jest/dist/utils/testing"; +jest.mock("@visual-regression-tracker/sdk-js"); + let browserType = chromium; let browser: Browser; let context: BrowserContext; let page: Page; -let vrt: PlaywrightVisualRegressionTracker; +let playwrightVrt: PlaywrightVisualRegressionTracker; const config: Config = { apiUrl: "http://localhost:4200", @@ -34,7 +36,6 @@ beforeAll(async () => { }, }); page = await context.newPage(); - vrt = new PlaywrightVisualRegressionTracker(browserType, config); }); afterAll(async () => { @@ -42,33 +43,33 @@ afterAll(async () => { }); describe("playwright", () => { - it("start", async () => { - const startMock = jest.fn(); - VisualRegressionTracker.prototype.start = startMock; + beforeEach(() => { + playwrightVrt = new PlaywrightVisualRegressionTracker(browserType, config); + }); + + it("constructor", async () => { + expect(playwrightVrt["browser"]).toBe(browserType.name()); + expect(VisualRegressionTracker).toHaveBeenCalledWith(config); + }); - await vrt.start(); + it("start", async () => { + await playwrightVrt.start(); - expect(startMock).toHaveBeenCalled(); + expect(VisualRegressionTracker.prototype.start).toHaveBeenCalled(); }); it("stop", async () => { - const stopMock = jest.fn(); - VisualRegressionTracker.prototype.stop = stopMock; + await playwrightVrt.stop(); - await vrt.stop(); - - expect(stopMock).toHaveBeenCalled(); + expect(VisualRegressionTracker.prototype.stop).toHaveBeenCalled(); }); describe("track", () => { - let trackMock: jest.Mock; let pageMocked: MaybeMocked; const screenshot: Buffer = Buffer.from("image mocked"); beforeEach(() => { - vrt["vrt"]["isStarted"] = jest.fn().mockReturnValueOnce(true); - trackMock = jest.fn(); - VisualRegressionTracker.prototype.track = trackMock; + playwrightVrt["vrt"]["isStarted"] = jest.fn().mockReturnValueOnce(true); pageMocked = mocked(page); pageMocked.screenshot = jest.fn().mockResolvedValueOnce(screenshot); }); @@ -102,12 +103,12 @@ describe("playwright", () => { }, }; - await vrt.trackPage(page, imageName, trackOptions); + await playwrightVrt.trackPage(page, imageName, trackOptions); expect(pageMocked.screenshot).toHaveBeenCalledWith( trackOptions.screenshotOptions ); - expect(trackMock).toHaveBeenCalledWith({ + expect(VisualRegressionTracker.prototype.track).toHaveBeenCalledWith({ name: imageName, imageBase64: screenshot.toString("base64"), browser: browserType.name(), @@ -123,10 +124,10 @@ describe("playwright", () => { const imageName = "test name"; pageMocked.viewportSize = jest.fn().mockReturnValueOnce(null); - await vrt.trackPage(page, imageName); + await playwrightVrt.trackPage(page, imageName); expect(pageMocked.screenshot).toHaveBeenCalledWith(undefined); - expect(trackMock).toHaveBeenCalledWith({ + expect(VisualRegressionTracker.prototype.track).toHaveBeenCalledWith({ name: imageName, imageBase64: screenshot.toString("base64"), browser: browserType.name(), @@ -168,12 +169,16 @@ describe("playwright", () => { .fn() .mockResolvedValueOnce(screenshot); - await vrt.trackElementHandle(elementHandle, imageName, trackOptions); + await playwrightVrt.trackElementHandle( + elementHandle, + imageName, + trackOptions + ); expect(elementHandleMocked!.screenshot).toHaveBeenCalledWith( trackOptions.screenshotOptions ); - expect(trackMock).toHaveBeenCalledWith({ + expect(VisualRegressionTracker.prototype.track).toHaveBeenCalledWith({ name: imageName, imageBase64: screenshot.toString("base64"), browser: browserType.name(), @@ -194,10 +199,10 @@ describe("playwright", () => { .fn() .mockResolvedValueOnce(screenshot); - await vrt.trackElementHandle(elementHandle, imageName); + await playwrightVrt.trackElementHandle(elementHandle, imageName); expect(elementHandleMocked!.screenshot).toHaveBeenCalledWith(undefined); - expect(trackMock).toHaveBeenCalledWith({ + expect(VisualRegressionTracker.prototype.track).toHaveBeenCalledWith({ name: imageName, imageBase64: screenshot.toString("base64"), browser: browserType.name(), @@ -214,7 +219,7 @@ describe("playwright", () => { const elementHandle = await page.$("#test"); await expect( - vrt.trackElementHandle(elementHandle, imageName) + playwrightVrt.trackElementHandle(elementHandle, imageName) ).rejects.toThrowError(new Error("ElementHandle is null")); }); }); diff --git a/lib/playwrightVisualRegressionTracker.ts b/lib/playwrightVisualRegressionTracker.ts index 03b5c13..c9b4521 100644 --- a/lib/playwrightVisualRegressionTracker.ts +++ b/lib/playwrightVisualRegressionTracker.ts @@ -1,6 +1,7 @@ import { VisualRegressionTracker, Config, + BuildResponse, } from "@visual-regression-tracker/sdk-js"; import { Page, Browser, BrowserType, ElementHandle } from "playwright"; import { @@ -10,14 +11,14 @@ import { export class PlaywrightVisualRegressionTracker { private vrt: VisualRegressionTracker; - private browser: BrowserType; + private browser: string; - constructor(browser: BrowserType, config?: Config) { + constructor(browserType: BrowserType, config?: Config) { this.vrt = new VisualRegressionTracker(config); - this.browser = browser; + this.browser = browserType.name(); } - async start() { + async start(): Promise { return this.vrt.start(); } @@ -32,7 +33,7 @@ export class PlaywrightVisualRegressionTracker { imageBase64: (await page.screenshot(options?.screenshotOptions)).toString( "base64" ), - browser: this.browser.name(), + browser: this.browser, viewport: viewportSize ? `${viewportSize.width}x${viewportSize.height}` : undefined, @@ -56,7 +57,7 @@ export class PlaywrightVisualRegressionTracker { imageBase64: ( await elementHandle.screenshot(options?.screenshotOptions) ).toString("base64"), - browser: this.browser.name(), + browser: this.browser, viewport: options?.agent?.viewport, os: options?.agent?.os, device: options?.agent?.device, diff --git a/package-lock.json b/package-lock.json index 16fa132..67f7a79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@visual-regression-tracker/agent-playwright", - "version": "4.5.0", + "version": "4.6.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -749,9 +749,9 @@ } }, "@types/jest": { - "version": "26.0.16", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.16.tgz", - "integrity": "sha512-Gp12+7tmKCgv9JjtltxUXokohCAEZfpJaEW5tn871SGRp8I+bRWBonQO7vW5NHwnAHe5dd50+Q4zyKuN35i09g==", + "version": "26.0.19", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.19.tgz", + "integrity": "sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ==", "dev": true, "requires": { "jest-diff": "^26.0.0", @@ -759,9 +759,9 @@ } }, "@types/node": { - "version": "14.14.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", - "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", + "version": "14.14.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", + "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==", "dev": true }, "@types/normalize-package-data": { @@ -808,9 +808,9 @@ } }, "@visual-regression-tracker/sdk-js": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@visual-regression-tracker/sdk-js/-/sdk-js-4.6.2.tgz", - "integrity": "sha512-FY81Oifs99zKQry8KUJRFEU3GKZbG/3zOJPNFeFwYcWy3UuwwUjhOh8ObyvHJtHvTykwnGRrBMGGhYeULD+wyw==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/@visual-regression-tracker/sdk-js/-/sdk-js-4.6.3.tgz", + "integrity": "sha512-hd3gFrJCffi9Tny07BaIWiIKF9+EOBKXZAyKWkCMlsGpT3fX3tOTPUqIwjy+ubiJSXzHN9fHHcPx48QfGfcqWw==", "requires": { "axios": "^0.21.0" } @@ -985,9 +985,9 @@ "dev": true }, "axios": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", - "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { "follow-redirects": "^1.10.0" } @@ -1891,9 +1891,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, "for-in": { "version": "1.0.2", @@ -3226,9 +3226,9 @@ } }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", "dev": true }, "mime-db": { @@ -3618,9 +3618,9 @@ } }, "playwright": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.6.2.tgz", - "integrity": "sha512-KiMmQuANG4O/ozpwxP8EwBBap0/liS3+wwkGo6nBJ4O4951y4ZsRPR1dqwsMOUD9wjsWf3ER+bAmQH5XmEO4Ig==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.7.1.tgz", + "integrity": "sha512-dOSWME42wDedJ/PXv8k0zG0Kxd6d6R2OKA51/05++Z2ISdA4N58gHlWqlVKPDkBog1MI6lu/KNt7QDn19AybWQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -4703,9 +4703,9 @@ } }, "typescript": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", - "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", "dev": true }, "union-value": { diff --git a/package.json b/package.json index ac0474c..090d12d 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "test": "jest", - "test:cov": "jest --collectCoverage", + "test": "jest --detectOpenHandles --forceExit", + "test:cov": "jest --collectCoverage --detectOpenHandles --forceExit", "build": "./node_modules/.bin/tsc" }, "repository": { @@ -25,14 +25,14 @@ }, "homepage": "https://github.com/Visual-Regression-Tracker/agent-playwright#readme", "dependencies": { - "@visual-regression-tracker/sdk-js": "^4.6.2" + "@visual-regression-tracker/sdk-js": "^4.6.3" }, "devDependencies": { - "@types/jest": "^26.0.16", - "@types/node": "^14.14.10", + "@types/jest": "^26.0.19", + "@types/node": "^14.14.16", "jest": "^26.6.2", - "playwright": "^1.6.2", + "playwright": "^1.7.1", "ts-jest": "^26.4.3", - "typescript": "^4.1.2" + "typescript": "^4.1.3" } }