/// /// import path from 'node:path' import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest' import logger from '@wdio/logger' import * as PercyHelper from '../src/Percy/PercyHelper.js' import Percy from '../src/Percy/Percy.js' import * as PercyLogger from '../src/Percy/PercyLogger.js' const log = logger('test') let browser: WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser vi.mock('got') vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger'))) vi.useFakeTimers().setSystemTime(new Date('2020-01-01')) vi.mock('uuid', () => ({ v4: () => '123456789' })) const PercyLoggerSpy = vi.spyOn(PercyLogger.PercyLogger, 'logToFile') PercyLoggerSpy.mockImplementation(() => {}) beforeEach(() => { vi.mocked(log.info).mockClear() vi.mocked(fetch).mockClear() vi.mocked(fetch).mockResolvedValue(Response.json({ value: { automation_session: { browser_url: 'https://www.browserstack.com/automate/builds/1/sessions/2' } } })) browser = { sessionId: 'session123', config: {}, capabilities: { device: '', os: 'OS X', os_version: 'Catalina', browserName: 'chrome' }, instances: ['browserA', 'browserB'], isMultiremote: false, browserA: { sessionId: 'session456', capabilities: { 'bstack:options': { device: '', os: 'Windows', osVersion: 10, browserName: 'chrome' } } }, getInstance: vi.fn().mockImplementation((browserName: string) => browser[browserName]), browserB: {}, execute: vi.fn(), executeAsync: async () => { 'done' }, getUrl: () => { return 'https://www.google.com/'}, on: vi.fn(), } as unknown as WebdriverIO.Browser | WebdriverIO.MultiRemoteBrowser }) describe('startPercy', () => { let percyStartSpy: any beforeEach(() => { percyStartSpy = vi.spyOn(Percy.prototype, 'start').mockImplementationOnce(async () => { return true }) }) it('should call start method of Percy', async () => { await PercyHelper.startPercy({}, {}, {}) expect(percyStartSpy).toBeCalledTimes(1) }) afterEach(() => { percyStartSpy.mockClear() }) }) describe('stopPercy', () => { let percyStopSpy: any beforeEach(() => { percyStopSpy = vi.spyOn(Percy.prototype, 'stop').mockImplementationOnce(async () => { return {} }) }) it('should call stop method of Percy', async () => { const percy = new Percy({}, {}, {}) await PercyHelper.stopPercy(percy) expect(percyStopSpy).toBeCalledTimes(1) }) afterEach(() => { percyStopSpy.mockClear() }) }) describe('getBestPlatformForPercySnapshot', () => { const capsArr: any = [ { maxInstances: 5, browserName: 'edge', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'edge' } }, { maxInstances: 5, browserName: 'chrome', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'chrome' } }, { maxInstances: 5, browserName: 'firefox', browserVersion: 'latest', platformName: 'Windows 10', 'moz:firefoxOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'firefox' } } ] const capsObj: any = { 'key-1': { capabilities: { maxInstances: 5, browserName: 'edge', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'edge' } } }, 'key-2': { capabilities: { maxInstances: 5, browserName: 'chrome', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'chrome' } } }, 'key-3': { capabilities: { maxInstances: 5, browserName: 'firefox', browserVersion: 'latest', platformName: 'Windows 10', 'moz:firefoxOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'firefox' } } }, } it('should return correct caps for best platform - Array', () => { const bestPlatformCaps = PercyHelper.getBestPlatformForPercySnapshot(capsArr) expect(bestPlatformCaps).toEqual({ maxInstances: 5, browserName: 'chrome', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'chrome' } }) }) it('should return correct caps for best platform - Object', () => { const bestPlatformCaps = PercyHelper.getBestPlatformForPercySnapshot(capsObj) expect(bestPlatformCaps).toEqual({ maxInstances: 5, browserName: 'chrome', browserVersion: 'latest', platformName: 'Windows 10', 'goog:chromeOptions': {}, 'bstack:options': { 'projectName': 'Project Name', 'browserName': 'chrome' } }) }) })