rewrite @wdio/devtools-service to ESM
This commit is contained in:
parent
baa453d9dc
commit
2c17d96882
63 changed files with 600 additions and 484 deletions
18
__mocks__/chrome-remote-interface.ts
Normal file
18
__mocks__/chrome-remote-interface.ts
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
import { vi } from 'vitest'
|
||||
const CDPMock = {
|
||||
port: 4321,
|
||||
host: 'foobarhost',
|
||||
on: vi.fn(),
|
||||
emit: vi.fn(),
|
||||
Network: {
|
||||
enable: vi.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
},
|
||||
Console: {
|
||||
enable: vi.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
},
|
||||
Page: {
|
||||
enable: vi.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
}
|
||||
}
|
||||
|
||||
export default vi.fn().mockImplementation((args, cb) => cb(CDPMock))
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'apple-touch-icon',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'content-width',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockImplementation((params) => {
|
||||
audit: vi.fn().mockImplementation((params: any) => {
|
||||
if (params.error) {
|
||||
throw params.error
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'installable-manifest',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {
|
||||
items: [{
|
||||
group: 'styleLayout',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'maskable-icon',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {
|
||||
items: [
|
||||
{
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 1,
|
||||
numericValue: 24347,
|
||||
numericUnit: 'unitless',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 1,
|
||||
numericValue: 1006.5961000000002,
|
||||
numericUnit: 'millisecond',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 0.91,
|
||||
numericValue: 3683.55125,
|
||||
numericUnit: 'millisecond',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 0.99,
|
||||
numericValue: 1785.7373000000002,
|
||||
numericUnit: 'millisecond',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 1,
|
||||
numericValue: 1348.7540095850825,
|
||||
numericUnit: 'millisecond',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
score: 0.27,
|
||||
numericValue: 855.9374500000001,
|
||||
numericUnit: 'millisecond',
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {
|
||||
headings: [],
|
||||
items: [],
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'service-worker',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'splash-screen',
|
||||
score: 0
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'themed-omnibox',
|
||||
score: 1
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
audit: jest.fn().mockReturnValue({
|
||||
audit: vi.fn().mockReturnValue({
|
||||
details: {},
|
||||
displayValue: 'viewport',
|
||||
score: 1
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
import { vi } from 'vitest'
|
||||
export default class ChromeProtocolMock {
|
||||
_runJsonCommand = vi.fn().mockResolvedValue([{ foo: 'bar' }])
|
||||
_connectToSocket = vi.fn()
|
||||
|
||||
constructor (port: number, hostname: string) {
|
||||
expect(typeof port).toBe('string')
|
||||
expect(typeof hostname).toBe('string')
|
||||
}
|
||||
}
|
||||
15
__mocks__/lighthouse/lighthouse-core/gather/driver.ts
Normal file
15
__mocks__/lighthouse/lighthouse-core/gather/driver.ts
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
import { vi } from 'vitest'
|
||||
import tracelog from '../../../../packages/wdio-devtools-service/tests/__fixtures__/tracelog.json'
|
||||
|
||||
export const beginTrace = vi.fn()
|
||||
export const endTrace = vi.fn().mockResolvedValue(tracelog)
|
||||
|
||||
export default class Driver {
|
||||
beginTrace: typeof beginTrace
|
||||
endTrace: typeof endTrace
|
||||
|
||||
constructor (public connection: any) {
|
||||
this.beginTrace = beginTrace
|
||||
this.endTrace = endTrace
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
import { vi } from 'vitest'
|
||||
export default {
|
||||
getServiceWorkerRegistrations: vi.fn().mockResolvedValue({ registrations: 42 }),
|
||||
getServiceWorkerVersions: vi.fn().mockResolvedValue({ versions: '1.2.1' })
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
import { vi } from 'vitest'
|
||||
export const waitForFullyLoaded = vi.fn().mockReturnValue(Promise.resolve({}))
|
||||
|
|
@ -5,9 +5,8 @@
|
|||
"author": "Christian Bromann <mail@bromann.dev>",
|
||||
"homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-devtools-service",
|
||||
"license": "MIT",
|
||||
"main": "./build/index",
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
@ -25,21 +24,41 @@
|
|||
"bugs": {
|
||||
"url": "https://github.com/webdriverio/webdriverio/issues"
|
||||
},
|
||||
"main": "./build/index.cjs.js",
|
||||
"type": "module",
|
||||
"module": "./build/index.js",
|
||||
"exports": {
|
||||
".": [
|
||||
{
|
||||
"import": "./build/index.js",
|
||||
"require": "./build/index.cjs.js"
|
||||
},
|
||||
"./build/index.cjs.js"
|
||||
],
|
||||
"./node": [
|
||||
{
|
||||
"import": "./build/node.js",
|
||||
"require": "./build/node.cjs.js"
|
||||
},
|
||||
"./build/node.cjs.js"
|
||||
]
|
||||
},
|
||||
"types": "./build/index.d.ts",
|
||||
"typeScriptVersion": "3.8.3",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.12.10",
|
||||
"@babel/core": "^7.18.0",
|
||||
"@tracerbench/trace-event": "^7.0.0",
|
||||
"@types/node": "^18.0.0",
|
||||
"@wdio/logger": "7.19.0",
|
||||
"@wdio/types": "7.20.7",
|
||||
"babel-plugin-istanbul": "^6.0.0",
|
||||
"core-js": "~3.23.1",
|
||||
"devtools-protocol": "^0.0.1025007",
|
||||
"istanbul-lib-coverage": "^3.0.0",
|
||||
"babel-plugin-istanbul": "^6.1.1",
|
||||
"devtools-protocol": "^0.0.1011705",
|
||||
"istanbul-lib-coverage": "^3.2.0",
|
||||
"istanbul-lib-report": "^3.0.0",
|
||||
"istanbul-reports": "^3.0.2",
|
||||
"istanbul-reports": "^3.1.4",
|
||||
"lighthouse": "8.6.0",
|
||||
"puppeteer-core": "^13.1.3",
|
||||
"speedline": "^1.4.1",
|
||||
"puppeteer-core": "^14.1.1",
|
||||
"speedline": "^1.4.3",
|
||||
"stable": "^0.1.8",
|
||||
"webdriverio": "7.20.7"
|
||||
},
|
||||
|
|
@ -49,5 +68,8 @@
|
|||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"types": "./build/index.d.ts"
|
||||
"devDependencies": {
|
||||
"@types/babel__core": "^7.1.19",
|
||||
"@types/istanbul-reports": "^3.0.1"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,36 +1,36 @@
|
|||
declare module 'lighthouse';
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver'
|
||||
declare module 'lighthouse/lighthouse-core/gather/connections/cri'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gather-runner'
|
||||
declare module 'lighthouse/lighthouse-core/fraggle-rock/gather/session'
|
||||
declare module 'lighthouse/lighthouse-core/gather/connections/raw'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/installability-errors'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/web-app-manifest'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/link-elements'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/viewport-dimensions'
|
||||
declare module 'lighthouse/lighthouse-core/lib/page-functions'
|
||||
declare module 'lighthouse/lighthouse-core/lib/network-recorder'
|
||||
declare module 'lighthouse/lighthouse-core/audits/diagnostics'
|
||||
declare module 'lighthouse/lighthouse-core/audits/mainthread-work-breakdown'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics'
|
||||
declare module 'lighthouse/lighthouse-core/audits/server-response-time'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/cumulative-layout-shift'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/first-contentful-paint'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/largest-contentful-paint'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/speed-index'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/interactive'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/total-blocking-time'
|
||||
declare module 'lighthouse/lighthouse-core/audits/installable-manifest'
|
||||
declare module 'lighthouse/lighthouse-core/audits/service-worker'
|
||||
declare module 'lighthouse/lighthouse-core/audits/splash-screen'
|
||||
declare module 'lighthouse/lighthouse-core/audits/themed-omnibox'
|
||||
declare module 'lighthouse/lighthouse-core/audits/content-width'
|
||||
declare module 'lighthouse/lighthouse-core/audits/viewport'
|
||||
declare module 'lighthouse/lighthouse-core/audits/apple-touch-icon'
|
||||
declare module 'lighthouse/lighthouse-core/audits/maskable-icon'
|
||||
declare module 'lighthouse/lighthouse-core/scoring'
|
||||
declare module 'lighthouse/lighthouse-core/config/default-config'
|
||||
declare module 'lighthouse/lighthouse-core/config/constants'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/wait-for-condition'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/network-monitor'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/service-workers'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/connections/cri.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gather-runner.js'
|
||||
declare module 'lighthouse/lighthouse-core/fraggle-rock/gather/session.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/connections/raw.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/installability-errors.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/web-app-manifest.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/link-elements.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/gatherers/viewport-dimensions.js'
|
||||
declare module 'lighthouse/lighthouse-core/lib/page-functions.js'
|
||||
declare module 'lighthouse/lighthouse-core/lib/network-recorder.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/diagnostics.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/mainthread-work-breakdown.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/server-response-time.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/cumulative-layout-shift.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/first-contentful-paint.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/largest-contentful-paint.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/speed-index.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/interactive.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/metrics/total-blocking-time.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/installable-manifest.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/service-worker.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/splash-screen.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/themed-omnibox.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/content-width.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/viewport.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/apple-touch-icon.js'
|
||||
declare module 'lighthouse/lighthouse-core/audits/maskable-icon.js'
|
||||
declare module 'lighthouse/lighthouse-core/scoring.js'
|
||||
declare module 'lighthouse/lighthouse-core/config/default-config.js'
|
||||
declare module 'lighthouse/lighthouse-core/config/constants.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/wait-for-condition.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/network-monitor.js'
|
||||
declare module 'lighthouse/lighthouse-core/gather/driver/service-workers.js'
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
import Diagnostics from 'lighthouse/lighthouse-core/audits/diagnostics'
|
||||
import MainThreadWorkBreakdown from 'lighthouse/lighthouse-core/audits/mainthread-work-breakdown'
|
||||
import Metrics from 'lighthouse/lighthouse-core/audits/metrics'
|
||||
import ServerResponseTime from 'lighthouse/lighthouse-core/audits/server-response-time'
|
||||
import CumulativeLayoutShift from 'lighthouse/lighthouse-core/audits/metrics/cumulative-layout-shift'
|
||||
import FirstContentfulPaint from 'lighthouse/lighthouse-core/audits/metrics/first-contentful-paint'
|
||||
import LargestContentfulPaint from 'lighthouse/lighthouse-core/audits/metrics/largest-contentful-paint'
|
||||
import SpeedIndex from 'lighthouse/lighthouse-core/audits/metrics/speed-index'
|
||||
import InteractiveMetric from 'lighthouse/lighthouse-core/audits/metrics/interactive'
|
||||
import TotalBlockingTime from 'lighthouse/lighthouse-core/audits/metrics/total-blocking-time'
|
||||
import Diagnostics from 'lighthouse/lighthouse-core/audits/diagnostics.js'
|
||||
import MainThreadWorkBreakdown from 'lighthouse/lighthouse-core/audits/mainthread-work-breakdown.js'
|
||||
import Metrics from 'lighthouse/lighthouse-core/audits/metrics.js'
|
||||
import ServerResponseTime from 'lighthouse/lighthouse-core/audits/server-response-time.js'
|
||||
import CumulativeLayoutShift from 'lighthouse/lighthouse-core/audits/metrics/cumulative-layout-shift.js'
|
||||
import FirstContentfulPaint from 'lighthouse/lighthouse-core/audits/metrics/first-contentful-paint.js'
|
||||
import LargestContentfulPaint from 'lighthouse/lighthouse-core/audits/metrics/largest-contentful-paint.js'
|
||||
import SpeedIndex from 'lighthouse/lighthouse-core/audits/metrics/speed-index.js'
|
||||
import InteractiveMetric from 'lighthouse/lighthouse-core/audits/metrics/interactive.js'
|
||||
import TotalBlockingTime from 'lighthouse/lighthouse-core/audits/metrics/total-blocking-time.js'
|
||||
|
||||
import ReportScoring from 'lighthouse/lighthouse-core/scoring'
|
||||
import defaultConfig from 'lighthouse/lighthouse-core/config/default-config'
|
||||
import ReportScoring from 'lighthouse/lighthouse-core/scoring.js'
|
||||
import defaultConfig from 'lighthouse/lighthouse-core/config/default-config.js'
|
||||
import logger from '@wdio/logger'
|
||||
import type { Browser, CustomInstanceCommands } from 'webdriverio'
|
||||
|
||||
import { DEFAULT_FORM_FACTOR, PWA_AUDITS } from './constants'
|
||||
import { DEFAULT_FORM_FACTOR, PWA_AUDITS } from './constants.js'
|
||||
import type {
|
||||
FormFactor, Audit, AuditResults, AuditRef, MainThreadWorkBreakdownResult,
|
||||
DiagnosticsResults, ResponseTimeResult, MetricsResult, MetricsResults,
|
||||
|
|
|
|||
|
|
@ -1,16 +1,15 @@
|
|||
import 'core-js/modules/web.url'
|
||||
import logger from '@wdio/logger'
|
||||
import type { Browser, MultiRemoteBrowser } from 'webdriverio'
|
||||
|
||||
import type { TraceEvent } from '@tracerbench/trace-event'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
import type { TracingOptions } from 'puppeteer-core/lib/cjs/puppeteer/common/Tracing'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection.js'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page.js'
|
||||
import type { TracingOptions } from 'puppeteer-core/lib/cjs/puppeteer/common/Tracing.js'
|
||||
|
||||
import NetworkHandler, { RequestPayload } from './handler/network'
|
||||
import NetworkHandler, { RequestPayload } from './handler/network.js'
|
||||
|
||||
import { DEFAULT_TRACING_CATEGORIES } from './constants'
|
||||
import { sumByKey } from './utils'
|
||||
import { DEFAULT_TRACING_CATEGORIES } from './constants.js'
|
||||
import { sumByKey } from './utils.js'
|
||||
|
||||
const log = logger('@wdio/devtools-service:CommandHandler')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import InstallableManifest from 'lighthouse/lighthouse-core/audits/installable-manifest'
|
||||
import ServiceWorker from 'lighthouse/lighthouse-core/audits/service-worker'
|
||||
import SplashScreen from 'lighthouse/lighthouse-core/audits/splash-screen'
|
||||
import ThemedOmnibox from 'lighthouse/lighthouse-core/audits/themed-omnibox'
|
||||
import ContentWidth from 'lighthouse/lighthouse-core/audits/content-width'
|
||||
import Viewport from 'lighthouse/lighthouse-core/audits/viewport'
|
||||
import AppleTouchIcon from 'lighthouse/lighthouse-core/audits/apple-touch-icon'
|
||||
import MaskableIcon from 'lighthouse/lighthouse-core/audits/maskable-icon'
|
||||
import InstallableManifest from 'lighthouse/lighthouse-core/audits/installable-manifest.js'
|
||||
import ServiceWorker from 'lighthouse/lighthouse-core/audits/service-worker.js'
|
||||
import SplashScreen from 'lighthouse/lighthouse-core/audits/splash-screen.js'
|
||||
import ThemedOmnibox from 'lighthouse/lighthouse-core/audits/themed-omnibox.js'
|
||||
import ContentWidth from 'lighthouse/lighthouse-core/audits/content-width.js'
|
||||
import Viewport from 'lighthouse/lighthouse-core/audits/viewport.js'
|
||||
import AppleTouchIcon from 'lighthouse/lighthouse-core/audits/apple-touch-icon.js'
|
||||
import MaskableIcon from 'lighthouse/lighthouse-core/audits/maskable-icon.js'
|
||||
|
||||
import { throttling } from 'lighthouse/lighthouse-core/config/constants'
|
||||
import { throttling } from 'lighthouse/lighthouse-core/config/constants.js'
|
||||
|
||||
/**
|
||||
* performance tracing categories
|
||||
|
|
|
|||
|
|
@ -1,24 +1,22 @@
|
|||
import FRGatherer from 'lighthouse/lighthouse-core/fraggle-rock/gather/session'
|
||||
import pageFunctions from 'lighthouse/lighthouse-core/lib/page-functions'
|
||||
import NetworkRecorder from 'lighthouse/lighthouse-core/lib/network-recorder'
|
||||
import ProtocolSession from 'lighthouse/lighthouse-core/fraggle-rock/gather/session'
|
||||
import FRGatherer from 'lighthouse/lighthouse-core/fraggle-rock/gather/session.js'
|
||||
import pageFunctions from 'lighthouse/lighthouse-core/lib/page-functions.js'
|
||||
import NetworkRecorder from 'lighthouse/lighthouse-core/lib/network-recorder.js'
|
||||
|
||||
import InstallabilityErrors from 'lighthouse/lighthouse-core/gather/gatherers/installability-errors'
|
||||
import WebAppManifest from 'lighthouse/lighthouse-core/gather/gatherers/web-app-manifest'
|
||||
import LinkElements from 'lighthouse/lighthouse-core/gather/gatherers/link-elements'
|
||||
import ViewportDimensions from 'lighthouse/lighthouse-core/gather/gatherers/viewport-dimensions'
|
||||
import serviceWorkers from 'lighthouse/lighthouse-core/gather/driver/service-workers'
|
||||
import InstallabilityErrors from 'lighthouse/lighthouse-core/gather/gatherers/installability-errors.js'
|
||||
import WebAppManifest from 'lighthouse/lighthouse-core/gather/gatherers/web-app-manifest.js'
|
||||
import LinkElements from 'lighthouse/lighthouse-core/gather/gatherers/link-elements.js'
|
||||
import ViewportDimensions from 'lighthouse/lighthouse-core/gather/gatherers/viewport-dimensions.js'
|
||||
import serviceWorkers from 'lighthouse/lighthouse-core/gather/driver/service-workers.js'
|
||||
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection.js'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page.js'
|
||||
|
||||
import collectMetaElements from '../scripts/collectMetaElements'
|
||||
import { NETWORK_RECORDER_EVENTS } from '../constants'
|
||||
import collectMetaElements from '../scripts/collectMetaElements.js'
|
||||
import { NETWORK_RECORDER_EVENTS } from '../constants.js'
|
||||
import type { GathererDriver } from '../types'
|
||||
|
||||
export default class PWAGatherer {
|
||||
private _frGatherer: typeof FRGatherer
|
||||
private _protocolSession: typeof ProtocolSession
|
||||
private _networkRecorder: any
|
||||
private _networkRecords: any[] = []
|
||||
|
||||
|
|
@ -28,7 +26,6 @@ export default class PWAGatherer {
|
|||
private _driver: GathererDriver
|
||||
) {
|
||||
this._frGatherer = new FRGatherer(this._session)
|
||||
this._protocolSession = new ProtocolSession(_session)
|
||||
|
||||
/**
|
||||
* setup network recorder
|
||||
|
|
@ -60,8 +57,8 @@ export default class PWAGatherer {
|
|||
|
||||
const linkElements = new LinkElements()
|
||||
const viewportDimensions = new ViewportDimensions()
|
||||
const { registrations } = await serviceWorkers.getServiceWorkerRegistrations(this._protocolSession)
|
||||
const { versions } = await serviceWorkers.getServiceWorkerVersions(this._protocolSession)
|
||||
const { registrations } = await serviceWorkers.getServiceWorkerRegistrations(this._frGatherer)
|
||||
const { versions } = await serviceWorkers.getServiceWorkerVersions(this._frGatherer)
|
||||
return {
|
||||
URL: { requestedUrl: pageUrl, finalUrl: pageUrl },
|
||||
WebAppManifest: await WebAppManifest.getWebAppManifest(this._frGatherer, pageUrl),
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { EventEmitter } from 'node:events'
|
||||
import NetworkRecorder from 'lighthouse/lighthouse-core/lib/network-recorder'
|
||||
import NetworkMonitor from 'lighthouse/lighthouse-core/gather/driver/network-monitor'
|
||||
import ProtocolSession from 'lighthouse/lighthouse-core/fraggle-rock/gather/session'
|
||||
import { waitForFullyLoaded } from 'lighthouse/lighthouse-core/gather/driver/wait-for-condition'
|
||||
import NetworkRecorder from 'lighthouse/lighthouse-core/lib/network-recorder.js'
|
||||
import NetworkMonitor from 'lighthouse/lighthouse-core/gather/driver/network-monitor.js'
|
||||
import ProtocolSession from 'lighthouse/lighthouse-core/fraggle-rock/gather/session.js'
|
||||
import { waitForFullyLoaded } from 'lighthouse/lighthouse-core/gather/driver/wait-for-condition.js'
|
||||
import logger from '@wdio/logger'
|
||||
|
||||
import type Protocol from 'devtools-protocol'
|
||||
|
|
@ -11,13 +11,13 @@ import type { HTTPRequest } from 'puppeteer-core/lib/cjs/puppeteer/common/HTTPRe
|
|||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
|
||||
import registerPerformanceObserverInPage from '../scripts/registerPerformanceObserverInPage'
|
||||
import registerPerformanceObserverInPage from '../scripts/registerPerformanceObserverInPage.js'
|
||||
|
||||
import {
|
||||
FRAME_LOAD_START_TIMEOUT, TRACING_TIMEOUT, MAX_TRACE_WAIT_TIME,
|
||||
CLICK_TRANSITION, NETWORK_RECORDER_EVENTS
|
||||
} from '../constants'
|
||||
import { isSupportedUrl } from '../utils'
|
||||
} from '../constants.js'
|
||||
import { isSupportedUrl } from '../utils.js'
|
||||
import type { GathererDriver } from '../types'
|
||||
|
||||
const log = logger('@wdio/devtools-service:TraceGatherer')
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type Protocol from 'devtools-protocol'
|
||||
|
||||
import { IGNORED_URLS } from '../constants'
|
||||
import { IGNORED_URLS } from '../constants.js'
|
||||
|
||||
interface RequestLog {
|
||||
id?: string
|
||||
|
|
|
|||
|
|
@ -8,18 +8,18 @@ import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connect
|
|||
import type { Browser as PuppeteerBrowser } from 'puppeteer-core/lib/cjs/puppeteer/common/Browser'
|
||||
import type { Target } from 'puppeteer-core/lib/cjs/puppeteer/common/Target'
|
||||
|
||||
import CommandHandler from './commands'
|
||||
import Auditor from './auditor'
|
||||
import PWAGatherer from './gatherer/pwa'
|
||||
import TraceGatherer from './gatherer/trace'
|
||||
import CoverageGatherer from './gatherer/coverage'
|
||||
import DevtoolsGatherer, { CDPSessionOnMessageObject } from './gatherer/devtools'
|
||||
import { isBrowserSupported, setUnsupportedCommand, getLighthouseDriver } from './utils'
|
||||
import { NETWORK_STATES, UNSUPPORTED_ERROR_MESSAGE, CLICK_TRANSITION, DEFAULT_THROTTLE_STATE } from './constants'
|
||||
import {
|
||||
import CommandHandler from './commands.js'
|
||||
import Auditor from './auditor.js'
|
||||
import PWAGatherer from './gatherer/pwa.js'
|
||||
import TraceGatherer from './gatherer/trace.js'
|
||||
import CoverageGatherer from './gatherer/coverage.js'
|
||||
import DevtoolsGatherer, { CDPSessionOnMessageObject } from './gatherer/devtools.js'
|
||||
import { isBrowserSupported, setUnsupportedCommand, getLighthouseDriver } from './utils.js'
|
||||
import { NETWORK_STATES, UNSUPPORTED_ERROR_MESSAGE, CLICK_TRANSITION, DEFAULT_THROTTLE_STATE } from './constants.js'
|
||||
import type {
|
||||
DevtoolsConfig, FormFactor, EnablePerformanceAuditsOptions,
|
||||
DeviceDescription, Device, PWAAudits, GathererDriver
|
||||
} from './types'
|
||||
} from './types.js'
|
||||
|
||||
const log = logger('@wdio/devtools-service')
|
||||
const TRACE_COMMANDS = ['click', 'navigateTo', 'url']
|
||||
|
|
@ -216,7 +216,7 @@ export default class DevToolsService implements Services.ServiceInstance {
|
|||
/**
|
||||
* casting is required as types differ between core and definitely typed types
|
||||
*/
|
||||
this._puppeteer = await (this._browser as Browser<'async'>).getPuppeteer()
|
||||
this._puppeteer = await (this._browser as Browser<'async'>).getPuppeteer() as any as PuppeteerBrowser
|
||||
|
||||
/* istanbul ignore next */
|
||||
if (!this._puppeteer) {
|
||||
|
|
@ -287,7 +287,7 @@ export default class DevToolsService implements Services.ServiceInstance {
|
|||
}
|
||||
}
|
||||
|
||||
export * from './types'
|
||||
export * from './types.js'
|
||||
|
||||
type ServiceCommands = Omit<FunctionProperties<DevToolsService>, keyof Services.HookFunctions | '_setupHandler'>
|
||||
type CommandHandlerCommands = FunctionProperties<CommandHandler>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import CriConnection from 'lighthouse/lighthouse-core/gather/connections/cri'
|
||||
import CriConnection from 'lighthouse/lighthouse-core/gather/connections/cri.js'
|
||||
|
||||
const DEFAULT_HOSTNAME = 'localhost'
|
||||
const DEFAULT_PORT = '9222'
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import type { Browser, MultiRemoteBrowser } from 'webdriverio'
|
||||
import type { Capabilities } from '@wdio/types'
|
||||
import Driver from 'lighthouse/lighthouse-core/gather/driver'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Target } from 'puppeteer-core/lib/cjs/puppeteer/common/Target'
|
||||
import Driver from 'lighthouse/lighthouse-core/gather/driver.js'
|
||||
|
||||
import ChromeProtocol from './lighthouse/cri'
|
||||
import { IGNORED_URLS, UNSUPPORTED_ERROR_MESSAGE } from './constants'
|
||||
import { RequestPayload } from './handler/network'
|
||||
import ChromeProtocol from './lighthouse/cri.js'
|
||||
import { IGNORED_URLS, UNSUPPORTED_ERROR_MESSAGE } from './constants.js'
|
||||
import { RequestPayload } from './handler/network.js'
|
||||
import type { GathererDriver } from './types'
|
||||
|
||||
const VERSION_PROPS = ['browserVersion', 'browser_version', 'version']
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"env": {
|
||||
"jest": true
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
const CDPMock = {
|
||||
port: 4321,
|
||||
host: 'foobarhost',
|
||||
on: jest.fn(),
|
||||
emit: jest.fn(),
|
||||
Network: {
|
||||
enable: jest.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
},
|
||||
Console: {
|
||||
enable: jest.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
},
|
||||
Page: {
|
||||
enable: jest.fn().mockImplementation((args, cb) => cb(null, args))
|
||||
}
|
||||
}
|
||||
|
||||
export default jest.fn().mockImplementation((args, cb) => cb(CDPMock))
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
export default class ChromeProtocolMock {
|
||||
_runJsonCommand: jest.Mock
|
||||
_connectToSocket: jest.Mock
|
||||
|
||||
constructor (port: number, hostname: string) {
|
||||
expect(typeof port).toBe('string')
|
||||
expect(typeof hostname).toBe('string')
|
||||
this._runJsonCommand = jest.fn().mockResolvedValue([{
|
||||
foo: 'bar'
|
||||
}])
|
||||
this._connectToSocket = jest.fn()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
import tracelog from '../../../../__fixtures__/tracelog.json'
|
||||
|
||||
export const beginTrace = jest.fn()
|
||||
export const endTrace = jest.fn().mockResolvedValue(tracelog)
|
||||
|
||||
export default class Driver {
|
||||
beginTrace: jest.Mock
|
||||
endTrace: jest.Mock
|
||||
|
||||
constructor (public connection: any) {
|
||||
this.beginTrace = beginTrace
|
||||
this.endTrace = endTrace
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
export default {
|
||||
getServiceWorkerRegistrations: jest.fn().mockResolvedValue({ registrations: 42 }),
|
||||
getServiceWorkerVersions: jest.fn().mockResolvedValue({ versions: '1.2.1' })
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
export const waitForFullyLoaded = jest.fn().mockReturnValue(Promise.resolve({}))
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`getDiagnostics 1`] = `
|
||||
Object {
|
||||
{
|
||||
"mainDocumentTransferSize": 50074,
|
||||
"maxRtt": 145.65800000000002,
|
||||
"maxServerLatency": 4980.4710000000005,
|
||||
|
|
@ -23,32 +23,32 @@ Object {
|
|||
`;
|
||||
|
||||
exports[`getMainThreadWorkBreakdown 1`] = `
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"duration": 25.485,
|
||||
"group": "styleLayout",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 22.353,
|
||||
"group": "other",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 4.353999999999999,
|
||||
"group": "scriptEvaluation",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 1.678,
|
||||
"group": "parseHTML",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 1.411,
|
||||
"group": "garbageCollection",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 0.8830000000000001,
|
||||
"group": "scriptParseCompile",
|
||||
},
|
||||
Object {
|
||||
{
|
||||
"duration": 0.718,
|
||||
"group": "paintCompositeRender",
|
||||
},
|
||||
|
|
@ -56,7 +56,7 @@ Array [
|
|||
`;
|
||||
|
||||
exports[`getMetrics 1`] = `
|
||||
Object {
|
||||
{
|
||||
"cumulativeLayoutShift": 24347,
|
||||
"domContentLoaded": undefined,
|
||||
"firstContentfulPaint": 18090,
|
||||
|
|
@ -75,48 +75,48 @@ Object {
|
|||
}
|
||||
`;
|
||||
|
||||
exports[`getPerformanceScore 1`] = `0.77`;
|
||||
exports[`getPerformanceScore 1`] = `0`;
|
||||
|
||||
exports[`should allow to audit PWA results 1`] = `
|
||||
Object {
|
||||
"details": Object {
|
||||
"appleTouchIcon": Object {
|
||||
"details": Object {},
|
||||
{
|
||||
"details": {
|
||||
"appleTouchIcon": {
|
||||
"details": {},
|
||||
"displayValue": "apple-touch-icon",
|
||||
"score": 1,
|
||||
},
|
||||
"contentWith": Object {
|
||||
"details": Object {},
|
||||
"contentWith": {
|
||||
"details": {},
|
||||
"displayValue": "content-width",
|
||||
"score": 1,
|
||||
},
|
||||
"isInstallable": Object {
|
||||
"details": Object {},
|
||||
"isInstallable": {
|
||||
"details": {},
|
||||
"displayValue": "installable-manifest",
|
||||
"score": 1,
|
||||
},
|
||||
"maskableIcon": Object {
|
||||
"details": Object {},
|
||||
"maskableIcon": {
|
||||
"details": {},
|
||||
"displayValue": "maskable-icon",
|
||||
"score": 1,
|
||||
},
|
||||
"serviceWorker": Object {
|
||||
"details": Object {},
|
||||
"serviceWorker": {
|
||||
"details": {},
|
||||
"displayValue": "service-worker",
|
||||
"score": 1,
|
||||
},
|
||||
"splashScreen": Object {
|
||||
"details": Object {},
|
||||
"splashScreen": {
|
||||
"details": {},
|
||||
"displayValue": "splash-screen",
|
||||
"score": 0,
|
||||
},
|
||||
"themedOmnibox": Object {
|
||||
"details": Object {},
|
||||
"themedOmnibox": {
|
||||
"details": {},
|
||||
"displayValue": "themed-omnibox",
|
||||
"score": 1,
|
||||
},
|
||||
"viewport": Object {
|
||||
"details": Object {},
|
||||
"viewport": {
|
||||
"details": {},
|
||||
"displayValue": "viewport",
|
||||
"score": 1,
|
||||
},
|
||||
|
|
@ -126,15 +126,15 @@ Object {
|
|||
`;
|
||||
|
||||
exports[`should allow to audit PWA results 2`] = `
|
||||
Object {
|
||||
"details": Object {
|
||||
"maskableIcon": Object {
|
||||
"details": Object {},
|
||||
{
|
||||
"details": {
|
||||
"maskableIcon": {
|
||||
"details": {},
|
||||
"displayValue": "maskable-icon",
|
||||
"score": 1,
|
||||
},
|
||||
"serviceWorker": Object {
|
||||
"details": Object {},
|
||||
"serviceWorker": {
|
||||
"details": {},
|
||||
"displayValue": "service-worker",
|
||||
"score": 1,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`_emulateDevice 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
[
|
||||
{
|
||||
"name": "Nexus 6P",
|
||||
"userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3765.0 Mobile Safari/537.36",
|
||||
"viewport": Object {
|
||||
"viewport": {
|
||||
"deviceScaleFactor": 3.5,
|
||||
"hasTouch": true,
|
||||
"height": 732,
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`getLighthouseDriver should create a new session 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
exports[`getLighthouseDriver > should create a new session 1`] = `
|
||||
[
|
||||
[
|
||||
"Target.attachToTarget",
|
||||
undefined,
|
||||
Object {
|
||||
{
|
||||
"flatten": true,
|
||||
"targetId": "foobar321",
|
||||
},
|
||||
],
|
||||
Array [
|
||||
[
|
||||
"foobar",
|
||||
"session 321",
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,9 +1,32 @@
|
|||
import path from 'node:path'
|
||||
import { expect, test, vi, beforeEach } from 'vitest'
|
||||
import logger from '@wdio/logger'
|
||||
import type { Trace } from '../src/gatherer/trace'
|
||||
|
||||
import Auditor from '../src/auditor'
|
||||
|
||||
let auditor
|
||||
vi.mock('lighthouse/lighthouse-core/audits/diagnostics')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/mainthread-work-breakdown')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/server-response-time')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/cumulative-layout-shift')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/first-contentful-paint')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/largest-contentful-paint')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/speed-index')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/interactive')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/metrics/total-blocking-time')
|
||||
vi.mock('lighthouse/lighthouse-core/config/default-config')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/installable-manifest')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/service-worker')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/splash-screen')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/themed-omnibox')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/content-width')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/viewport')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/apple-touch-icon')
|
||||
vi.mock('lighthouse/lighthouse-core/audits/maskable-icon')
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
|
||||
let auditor: Auditor
|
||||
|
||||
beforeEach(() => {
|
||||
auditor = new Auditor({} as unknown as Trace, [])
|
||||
|
|
@ -18,7 +41,7 @@ test('getDiagnostics', async () => {
|
|||
})
|
||||
|
||||
test('getDiagnostics failing', async () => {
|
||||
auditor._audit = jest.fn().mockReturnValue(Promise.resolve({}))
|
||||
auditor._audit = vi.fn().mockReturnValue(Promise.resolve({}))
|
||||
expect(await auditor.getDiagnostics()).toBe(null)
|
||||
})
|
||||
|
||||
|
|
@ -31,17 +54,17 @@ test('getPerformanceScore', async () => {
|
|||
})
|
||||
|
||||
test('getPerformanceScore: returns null if any of the metrics is not available', async () => {
|
||||
auditor._audit = jest.fn().mockReturnValueOnce(Promise.resolve({}))
|
||||
auditor._audit = vi.fn().mockReturnValueOnce(Promise.resolve({}))
|
||||
expect(await auditor.getPerformanceScore()).toBe(null)
|
||||
|
||||
auditor._audit = jest.fn().mockReturnValueOnce(Promise.resolve({
|
||||
auditor._audit = vi.fn().mockReturnValueOnce(Promise.resolve({
|
||||
'first-contentful-paint': {
|
||||
score: 1
|
||||
},
|
||||
}))
|
||||
expect(await auditor.getPerformanceScore()).toBe(null)
|
||||
|
||||
auditor._audit = jest.fn().mockReturnValueOnce(Promise.resolve({
|
||||
auditor._audit = vi.fn().mockReturnValueOnce(Promise.resolve({
|
||||
'first-contentful-paint': {
|
||||
score: 1
|
||||
},
|
||||
|
|
@ -51,7 +74,7 @@ test('getPerformanceScore: returns null if any of the metrics is not available',
|
|||
}))
|
||||
expect(await auditor.getPerformanceScore()).toBe(null)
|
||||
|
||||
auditor.getMetrics = jest.fn().mockReturnValueOnce(Promise.resolve({
|
||||
auditor.getMetrics = vi.fn().mockReturnValueOnce(Promise.resolve({
|
||||
'first-contentful-paint': {
|
||||
score: 1
|
||||
},
|
||||
|
|
@ -64,7 +87,7 @@ test('getPerformanceScore: returns null if any of the metrics is not available',
|
|||
}))
|
||||
expect(await auditor.getPerformanceScore()).toBe(null)
|
||||
|
||||
auditor._audit = jest.fn().mockReturnValueOnce(Promise.resolve({
|
||||
auditor._audit = vi.fn().mockReturnValueOnce(Promise.resolve({
|
||||
'first-contentful-paint': {
|
||||
score: 1
|
||||
},
|
||||
|
|
@ -83,7 +106,7 @@ test('getPerformanceScore: returns null if any of the metrics is not available',
|
|||
}))
|
||||
expect(await auditor.getPerformanceScore()).toBe(null)
|
||||
|
||||
auditor._audit = jest.fn().mockReturnValue(Promise.resolve({
|
||||
auditor._audit = vi.fn().mockReturnValue(Promise.resolve({
|
||||
'first-contentful-paint': {
|
||||
score: 1
|
||||
},
|
||||
|
|
@ -108,7 +131,7 @@ test('getPerformanceScore: returns null if any of the metrics is not available',
|
|||
})
|
||||
|
||||
test('updateCommands', () => {
|
||||
const browser = { addCommand: jest.fn() }
|
||||
const browser: any = { addCommand: vi.fn() }
|
||||
auditor.updateCommands(browser)
|
||||
|
||||
expect(browser.addCommand)
|
||||
|
|
@ -130,7 +153,7 @@ test('should throw if something fails', () => {
|
|||
const error = new Error('uups')
|
||||
const Audit = {
|
||||
defaultOptions: {},
|
||||
audit: jest.fn().mockImplementation(() => {
|
||||
audit: vi.fn().mockImplementation(() => {
|
||||
throw error
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,28 +1,32 @@
|
|||
import path from 'node:path'
|
||||
import { expect, test, vi, beforeEach } from 'vitest'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
|
||||
import CommandHandler from '../src/commands'
|
||||
|
||||
jest.mock('../src/utils', () => ({
|
||||
readIOStream: jest.fn().mockReturnValue('foobar'),
|
||||
sumByKey: jest.fn().mockReturnValue('foobar')
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
|
||||
vi.mock('../src/utils', () => ({
|
||||
readIOStream: vi.fn().mockReturnValue('foobar'),
|
||||
sumByKey: vi.fn().mockReturnValue('foobar')
|
||||
}))
|
||||
|
||||
const pageMock = {
|
||||
tracing: {
|
||||
start: jest.fn(),
|
||||
stop: jest.fn()
|
||||
start: vi.fn(),
|
||||
stop: vi.fn()
|
||||
}
|
||||
}
|
||||
|
||||
const sessionMock = {
|
||||
on: jest.fn(),
|
||||
emit: jest.fn(),
|
||||
send: jest.fn()
|
||||
on: vi.fn(),
|
||||
emit: vi.fn(),
|
||||
send: vi.fn()
|
||||
}
|
||||
|
||||
const browser = {
|
||||
addCommand: jest.fn()
|
||||
const browser: any = {
|
||||
addCommand: vi.fn()
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`CoverageGatherer _handleRequests should transform JS files 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
exports[`CoverageGatherer > _handleRequests should transform JS files 1`] = `
|
||||
[
|
||||
[
|
||||
"Fetch.getResponseBody",
|
||||
Object {
|
||||
{
|
||||
"requestId": "123",
|
||||
},
|
||||
],
|
||||
Array [
|
||||
[
|
||||
"Fetch.fulfillRequest",
|
||||
Object {
|
||||
{
|
||||
"body": "dHJhbnNwaWxlZCBjb2Rl",
|
||||
"requestId": "123",
|
||||
"responseCode": 444,
|
||||
|
|
@ -19,17 +19,17 @@ Array [
|
|||
]
|
||||
`;
|
||||
|
||||
exports[`CoverageGatherer _handleRequests should transform if file is not part of exclude 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
exports[`CoverageGatherer > _handleRequests should transform if file is not part of exclude 1`] = `
|
||||
[
|
||||
[
|
||||
"Fetch.getResponseBody",
|
||||
Object {
|
||||
{
|
||||
"requestId": "123",
|
||||
},
|
||||
],
|
||||
Array [
|
||||
[
|
||||
"Fetch.fulfillRequest",
|
||||
Object {
|
||||
{
|
||||
"body": "dHJhbnNwaWxlZCBjb2Rl",
|
||||
"requestId": "123",
|
||||
"responseCode": 444,
|
||||
|
|
@ -38,13 +38,13 @@ Array [
|
|||
]
|
||||
`;
|
||||
|
||||
exports[`CoverageGatherer getCoverageReport 1`] = `
|
||||
Object {
|
||||
"files": Object {
|
||||
"/bar/foo.js": Object {
|
||||
exports[`CoverageGatherer > getCoverageReport 1`] = `
|
||||
{
|
||||
"files": {
|
||||
"/bar/foo.js": {
|
||||
"some": "coverage",
|
||||
},
|
||||
"/foo/bar.js": Object {
|
||||
"/foo/bar.js": {
|
||||
"some": "coverage",
|
||||
},
|
||||
},
|
||||
|
|
@ -52,17 +52,17 @@ Object {
|
|||
}
|
||||
`;
|
||||
|
||||
exports[`CoverageGatherer should return untransformed file if transformation fails 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
exports[`CoverageGatherer > should return untransformed file if transformation fails 1`] = `
|
||||
[
|
||||
[
|
||||
"Fetch.getResponseBody",
|
||||
Object {
|
||||
{
|
||||
"requestId": "123",
|
||||
},
|
||||
],
|
||||
Array [
|
||||
[
|
||||
"Fetch.fulfillRequest",
|
||||
Object {
|
||||
{
|
||||
"body": undefined,
|
||||
"requestId": "123",
|
||||
"responseCode": 444,
|
||||
|
|
|
|||
|
|
@ -1,17 +1,17 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`PWAGatherer gatherData 1`] = `
|
||||
Object {
|
||||
exports[`PWAGatherer > gatherData 1`] = `
|
||||
{
|
||||
"InstallabilityErrors": "getInstallabilityErrorsResult",
|
||||
"LinkElements": "barfoo",
|
||||
"MetaElements": Object {
|
||||
"MetaElements": {
|
||||
"some": "result",
|
||||
},
|
||||
"ServiceWorker": Object {
|
||||
"ServiceWorker": {
|
||||
"registrations": 42,
|
||||
"versions": "1.2.1",
|
||||
},
|
||||
"URL": Object {
|
||||
"URL": {
|
||||
"finalUrl": "http://json.org",
|
||||
"requestedUrl": "http://json.org",
|
||||
},
|
||||
|
|
@ -20,8 +20,8 @@ Object {
|
|||
}
|
||||
`;
|
||||
|
||||
exports[`PWAGatherer initiates properly 1`] = `
|
||||
Array [
|
||||
exports[`PWAGatherer > initiates properly 1`] = `
|
||||
[
|
||||
"Network.requestWillBeSent",
|
||||
"Network.requestServedFromCache",
|
||||
"Network.responseReceived",
|
||||
|
|
|
|||
|
|
@ -1,59 +1,59 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
// Vitest Snapshot v1
|
||||
|
||||
exports[`should register eventlisteners for network monitor 1`] = `
|
||||
Array [
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
[
|
||||
{
|
||||
"method": "Network.requestWillBeSent",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.requestServedFromCache",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.responseReceived",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.dataReceived",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.loadingFinished",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.loadingFailed",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
],
|
||||
Array [
|
||||
Object {
|
||||
[
|
||||
{
|
||||
"method": "Network.resourceChangedPriority",
|
||||
"params": Object {
|
||||
"params": {
|
||||
"some": "params",
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -1,63 +1,72 @@
|
|||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import CoverageGatherer from '../../src/gatherer/coverage'
|
||||
import { describe, expect, it, vi, beforeEach } from 'vitest'
|
||||
|
||||
import libReport from 'istanbul-lib-report'
|
||||
import reports from 'istanbul-reports'
|
||||
import { transformAsync as babelTransform } from '@babel/core'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
|
||||
jest.useFakeTimers()
|
||||
jest.spyOn(global, 'setInterval')
|
||||
jest.spyOn(global, 'clearInterval')
|
||||
import CoverageGatherer from '../../src/gatherer/coverage'
|
||||
|
||||
jest.mock('@babel/core', () => ({
|
||||
transformAsync: jest.fn().mockResolvedValue({ code: 'transpiled code' })
|
||||
vi.useFakeTimers()
|
||||
vi.spyOn(global, 'setInterval')
|
||||
vi.spyOn(global, 'clearInterval')
|
||||
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
vi.mock('@babel/core', () => ({
|
||||
transformAsync: vi.fn().mockResolvedValue({ code: 'transpiled code' })
|
||||
}))
|
||||
|
||||
jest.mock('babel-plugin-istanbul', () => jest.fn())
|
||||
jest.mock('istanbul-lib-coverage', () => ({
|
||||
createCoverageMap: jest.fn().mockReturnValue({
|
||||
files: jest.fn().mockReturnValue(['/foo/bar.js'])
|
||||
}),
|
||||
createCoverageSummary: jest.fn().mockReturnValue({
|
||||
merge: jest.fn(),
|
||||
data: { some: 'coverageData' }
|
||||
})
|
||||
vi.mock('babel-plugin-istanbul', () => ({ default: vi.fn() }))
|
||||
vi.mock('istanbul-lib-coverage', () => ({
|
||||
default: {
|
||||
createCoverageMap: vi.fn().mockReturnValue({
|
||||
files: vi.fn().mockReturnValue(['/foo/bar.js'])
|
||||
}),
|
||||
createCoverageSummary: vi.fn().mockReturnValue({
|
||||
merge: vi.fn(),
|
||||
data: { some: 'coverageData' }
|
||||
})
|
||||
}
|
||||
}))
|
||||
jest.mock('istanbul-lib-report', () => ({
|
||||
createContext: jest.fn().mockReturnValue('someContext')
|
||||
vi.mock('istanbul-lib-report', () => ({
|
||||
default: { createContext: vi.fn().mockReturnValue('someContext') }
|
||||
}))
|
||||
jest.mock('istanbul-reports', () => {
|
||||
const reportInstance = { execute: jest.fn() }
|
||||
vi.mock('istanbul-reports', () => {
|
||||
const reportInstance = { execute: vi.fn() }
|
||||
return {
|
||||
create: jest.fn().mockReturnValue(reportInstance),
|
||||
reportInstance
|
||||
default: {
|
||||
create: vi.fn().mockReturnValue(reportInstance),
|
||||
reportInstance
|
||||
}
|
||||
}
|
||||
})
|
||||
jest.mock('fs', () => ({
|
||||
existsSync: jest.fn(),
|
||||
readFileSync: jest.fn().mockReturnValue({ toString: () => 'barfoo' }),
|
||||
promises: {
|
||||
mkdir: jest.fn(),
|
||||
writeFile: jest.fn()
|
||||
vi.mock('fs', () => ({
|
||||
default: {
|
||||
existsSync: vi.fn(),
|
||||
readFileSync: vi.fn().mockReturnValue({ toString: () => 'barfoo' }),
|
||||
promises: {
|
||||
mkdir: vi.fn(),
|
||||
writeFile: vi.fn()
|
||||
}
|
||||
}
|
||||
}))
|
||||
|
||||
const sessionMock = {
|
||||
on: jest.fn(),
|
||||
send: jest.fn().mockResolvedValue({})
|
||||
on: vi.fn(),
|
||||
send: vi.fn().mockResolvedValue({})
|
||||
}
|
||||
|
||||
const targetMock = {
|
||||
createCDPSession: jest.fn().mockResolvedValue(sessionMock)
|
||||
createCDPSession: vi.fn().mockResolvedValue(sessionMock)
|
||||
}
|
||||
|
||||
let i = 0
|
||||
const pageMock = {
|
||||
on: jest.fn(),
|
||||
target: jest.fn().mockReturnValue(targetMock),
|
||||
evaluate: jest.fn()
|
||||
on: vi.fn(),
|
||||
target: vi.fn().mockReturnValue(targetMock),
|
||||
evaluate: vi.fn()
|
||||
.mockResolvedValueOnce(++i)
|
||||
.mockResolvedValueOnce(++i)
|
||||
.mockRejectedValueOnce(new Error('foo'))
|
||||
|
|
@ -67,10 +76,10 @@ describe('CoverageGatherer', () => {
|
|||
beforeEach(() => {
|
||||
i = 0
|
||||
|
||||
;(pageMock.on as jest.Mock).mockClear()
|
||||
;(sessionMock.on as jest.Mock).mockClear()
|
||||
;(sessionMock.send as jest.Mock).mockClear()
|
||||
;(clearInterval as jest.Mock).mockClear()
|
||||
vi.mocked(pageMock.on).mockClear()
|
||||
vi.mocked(sessionMock.on).mockClear()
|
||||
vi.mocked(sessionMock.send).mockClear()
|
||||
vi.mocked(clearInterval).mockClear()
|
||||
})
|
||||
|
||||
it('initiates properly', async () => {
|
||||
|
|
@ -122,12 +131,16 @@ describe('CoverageGatherer', () => {
|
|||
|
||||
expect(sessionMock.send.mock.calls.slice(1))
|
||||
.toMatchSnapshot()
|
||||
expect((fs.promises.mkdir as jest.Mock).mock.calls[0][0].endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org')
|
||||
)).toBe(true)
|
||||
expect((fs.promises.writeFile as jest.Mock).mock.calls[0][0].endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org', 'foo.js')
|
||||
)).toBe(true)
|
||||
expect(
|
||||
(vi.mocked(fs.promises.mkdir).mock.calls[0][0] as any).endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org')
|
||||
)
|
||||
).toBe(true)
|
||||
expect(
|
||||
(vi.mocked(fs.promises.writeFile).mock.calls[0][0] as any).endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org', 'foo.js')
|
||||
)
|
||||
).toBe(true)
|
||||
})
|
||||
|
||||
it('_handleRequests should return if file is part of exclude', async () => {
|
||||
|
|
@ -170,12 +183,16 @@ describe('CoverageGatherer', () => {
|
|||
|
||||
expect(sessionMock.send.mock.calls.slice(1))
|
||||
.toMatchSnapshot()
|
||||
expect((fs.promises.mkdir as jest.Mock).mock.calls[0][0].endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org')
|
||||
)).toBe(true)
|
||||
expect((fs.promises.writeFile as jest.Mock).mock.calls[0][0].endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org', 'foo.js')
|
||||
)).toBe(true)
|
||||
expect(
|
||||
(vi.mocked(fs.promises.mkdir).mock.calls[0][0] as any).endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org')
|
||||
)
|
||||
).toBe(true)
|
||||
expect(
|
||||
(vi.mocked(fs.promises.writeFile).mock.calls[0][0] as any).endsWith(
|
||||
path.join('foo', 'bar', 'files', 'json.org', 'foo.js')
|
||||
)
|
||||
).toBe(true)
|
||||
})
|
||||
|
||||
it('should return untransformed file if transformation fails', async () => {
|
||||
|
|
@ -190,7 +207,7 @@ describe('CoverageGatherer', () => {
|
|||
logDir: '/foo/bar'
|
||||
})
|
||||
|
||||
;(babelTransform as jest.Mock).mockReturnValueOnce(Promise.reject(new Error('upps')))
|
||||
vi.mocked(babelTransform).mockReturnValueOnce(Promise.reject(new Error('upps')))
|
||||
await gatherer.init()
|
||||
await gatherer['_handleRequests'](params)
|
||||
|
||||
|
|
@ -210,7 +227,7 @@ describe('CoverageGatherer', () => {
|
|||
|
||||
it('_captureCoverage', async () => {
|
||||
const gatherer = new CoverageGatherer(pageMock, {})
|
||||
gatherer['_clearCaptureInterval'] = jest.fn()
|
||||
gatherer['_clearCaptureInterval'] = vi.fn()
|
||||
gatherer['_captureCoverage']()
|
||||
expect(gatherer['_captureInterval']).not.toBe(undefined)
|
||||
expect(gatherer['_clearCaptureInterval']).toBeCalledTimes(0)
|
||||
|
|
@ -221,9 +238,9 @@ describe('CoverageGatherer', () => {
|
|||
it('_getCoverageMap', async () => {
|
||||
const gatherer = new CoverageGatherer(pageMock, {})
|
||||
let map = gatherer['_getCoverageMap']()
|
||||
jest.advanceTimersByTime(1000)
|
||||
vi.advanceTimersByTime(1000)
|
||||
gatherer['_coverageMap'] = 'foobar' as any
|
||||
jest.advanceTimersByTime(1000)
|
||||
vi.advanceTimersByTime(1000)
|
||||
expect(await map).toEqual('foobar')
|
||||
})
|
||||
|
||||
|
|
@ -233,18 +250,20 @@ describe('CoverageGatherer', () => {
|
|||
logDir: '/foo/bar',
|
||||
options: { foo: 'bar' }
|
||||
})
|
||||
gatherer['_clearCaptureInterval'] = jest.fn()
|
||||
gatherer['_getCoverageMap'] = jest.fn().mockResolvedValue({ bar: 'foo' })
|
||||
gatherer['_clearCaptureInterval'] = vi.fn()
|
||||
gatherer['_getCoverageMap'] = vi.fn().mockResolvedValue({ bar: 'foo' })
|
||||
await gatherer.logCoverage()
|
||||
|
||||
expect(gatherer['_clearCaptureInterval']).toBeCalledTimes(1)
|
||||
expect(libReport.createContext).toBeCalledTimes(1)
|
||||
expect(
|
||||
(libReport.createContext as jest.Mock).mock.calls[0][0].sourceFinder('/to/a/file.js')
|
||||
(vi.mocked(libReport.createContext).mock.calls[0][0] as any).sourceFinder('/to/a/file.js')
|
||||
).toBe('barfoo')
|
||||
expect((fs.readFileSync as jest.Mock).mock.calls[0][0].endsWith(
|
||||
path.join('foo', 'bar', 'files', 'to', 'a', 'file.js')
|
||||
)).toBe(true)
|
||||
expect(
|
||||
(vi.mocked(fs.readFileSync).mock.calls[0][0] as any).endsWith(
|
||||
path.join('foo', 'bar', 'files', 'to', 'a', 'file.js')
|
||||
)
|
||||
).toBe(true)
|
||||
expect(reports.create).toBeCalledWith('json-summary', { foo: 'bar' })
|
||||
// @ts-ignore mock feature
|
||||
expect(reports.reportInstance.execute).toBeCalledWith('someContext')
|
||||
|
|
@ -252,14 +271,14 @@ describe('CoverageGatherer', () => {
|
|||
|
||||
it('getCoverageReport', async () => {
|
||||
const coverage = {
|
||||
toSummary: jest.fn().mockReturnValue({ data: { some: 'coverage' } })
|
||||
toSummary: vi.fn().mockReturnValue({ data: { some: 'coverage' } })
|
||||
}
|
||||
const coverageMap = {
|
||||
files: jest.fn().mockReturnValue(['/foo/bar.js', '/bar/foo.js']),
|
||||
fileCoverageFor: jest.fn().mockReturnValue(coverage)
|
||||
files: vi.fn().mockReturnValue(['/foo/bar.js', '/bar/foo.js']),
|
||||
fileCoverageFor: vi.fn().mockReturnValue(coverage)
|
||||
}
|
||||
const gatherer = new CoverageGatherer(pageMock, {})
|
||||
gatherer['_getCoverageMap'] = jest.fn().mockResolvedValue(coverageMap)
|
||||
gatherer['_getCoverageMap'] = vi.fn().mockResolvedValue(coverageMap)
|
||||
expect(await gatherer.getCoverageReport()).toMatchSnapshot()
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import { test, expect } from 'vitest'
|
||||
import DevtoolsGatherer from '../../src/gatherer/devtools'
|
||||
|
||||
test('getLogs', () => {
|
||||
|
|
|
|||
|
|
@ -1,44 +1,52 @@
|
|||
import { describe, expect, it, vi, beforeEach } from 'vitest'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
|
||||
import PWAGatherer from '../../src/gatherer/pwa'
|
||||
import type { GathererDriver } from '../../src/types'
|
||||
|
||||
vi.mock('lighthouse/lighthouse-core/fraggle-rock/gather/session')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/gatherers/installability-errors')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/gatherers/web-app-manifest')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/gatherers/link-elements')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/gatherers/viewport-dimensions')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/driver/service-workers')
|
||||
|
||||
const pageMock = {
|
||||
on: jest.fn(),
|
||||
url: jest.fn().mockResolvedValue('http://json.org')
|
||||
on: vi.fn(),
|
||||
url: vi.fn().mockResolvedValue('http://json.org')
|
||||
} as unknown as Page
|
||||
const sessionMock = {
|
||||
on: jest.fn(),
|
||||
send: jest.fn(),
|
||||
_connection: { _transport: { _ws: { addEventListener: jest.fn() } } }
|
||||
on: vi.fn(),
|
||||
send: vi.fn(),
|
||||
_connection: { _transport: { _ws: { addEventListener: vi.fn() } } }
|
||||
} as unknown as CDPSession
|
||||
|
||||
const driver = {
|
||||
evaluate: jest.fn()
|
||||
evaluate: vi.fn()
|
||||
} as any as GathererDriver
|
||||
|
||||
describe('PWAGatherer', () => {
|
||||
beforeEach(() => {
|
||||
(sessionMock.on as jest.Mock).mockClear()
|
||||
;(pageMock.on as jest.Mock).mockClear()
|
||||
vi.mocked(sessionMock.on).mockClear()
|
||||
vi.mocked(pageMock.on).mockClear()
|
||||
})
|
||||
|
||||
it('initiates properly', () => {
|
||||
const pwaGatherer = new PWAGatherer(sessionMock, pageMock, driver)
|
||||
expect((sessionMock.on as jest.Mock).mock.calls.map((c) => c[0]))
|
||||
expect(vi.mocked(sessionMock.on).mock.calls.map((c) => c[0]))
|
||||
.toMatchSnapshot()
|
||||
pwaGatherer['_networkRecorder'].dispatch({ method: 'Network.requestWillBeSent', params: 'bar' })
|
||||
expect(pwaGatherer['_networkRecords']).toHaveLength(0)
|
||||
expect(pwaGatherer['_networkRecorder'].getRawRecords()).toHaveLength(1)
|
||||
;(pageMock.on as jest.Mock).mock.calls[0][1]()
|
||||
vi.mocked(pageMock.on).mock.calls[0][1]({} as any)
|
||||
expect(pwaGatherer['_networkRecords']).toHaveLength(1)
|
||||
expect(pwaGatherer['_networkRecorder'].getRawRecords()).toHaveLength(0)
|
||||
})
|
||||
|
||||
it('gatherData', async () => {
|
||||
const pwaGatherer = new PWAGatherer(sessionMock, pageMock, driver)
|
||||
pwaGatherer['_driver'].evaluate = jest.fn().mockResolvedValue({ some: 'result' })
|
||||
pwaGatherer['_driver'].evaluate = vi.fn().mockResolvedValue({ some: 'result' })
|
||||
expect(await pwaGatherer.gatherData()).toMatchSnapshot()
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import path from 'node:path'
|
||||
import { expect, test, vi, beforeEach } from 'vitest'
|
||||
import type Protocol from 'devtools-protocol'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/common/Page'
|
||||
|
|
@ -9,21 +11,25 @@ import type { GathererDriver } from '../../src/types'
|
|||
|
||||
import TRACELOG from '../__fixtures__/tracelog.json'
|
||||
|
||||
vi.mock('lighthouse/lighthouse-core/fraggle-rock/gather/session')
|
||||
vi.mock('lighthouse/lighthouse-core/gather/driver/wait-for-condition')
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
|
||||
let traceGatherer: TraceGatherer
|
||||
|
||||
const pageMock = {
|
||||
on: jest.fn(),
|
||||
evaluateOnNewDocument: jest.fn()
|
||||
on: vi.fn(),
|
||||
evaluateOnNewDocument: vi.fn()
|
||||
}
|
||||
|
||||
const sessionMock = {
|
||||
on: jest.fn(),
|
||||
emit: jest.fn(),
|
||||
send: jest.fn(),
|
||||
off: jest.fn(),
|
||||
on: vi.fn(),
|
||||
emit: vi.fn(),
|
||||
send: vi.fn(),
|
||||
off: vi.fn(),
|
||||
_connection: {
|
||||
_transport: {
|
||||
_ws: { addEventListener: jest.fn() }
|
||||
_ws: { addEventListener: vi.fn() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -35,12 +41,12 @@ const frame = {
|
|||
}
|
||||
|
||||
const driver = {
|
||||
beginTrace: jest.fn(),
|
||||
endTrace: jest.fn().mockReturnValue(Promise.resolve(TRACELOG))
|
||||
beginTrace: vi.fn(),
|
||||
endTrace: vi.fn().mockReturnValue(Promise.resolve(TRACELOG))
|
||||
} as any as GathererDriver
|
||||
|
||||
jest.useFakeTimers()
|
||||
jest.spyOn(global, 'setTimeout')
|
||||
vi.useFakeTimers()
|
||||
vi.spyOn(global, 'setTimeout')
|
||||
|
||||
beforeEach(() => {
|
||||
pageMock.on.mockClear()
|
||||
|
|
@ -51,14 +57,14 @@ beforeEach(() => {
|
|||
pageMock as unknown as Page,
|
||||
driver
|
||||
)
|
||||
traceGatherer.emit = jest.fn()
|
||||
traceGatherer.emit = vi.fn()
|
||||
;(traceGatherer['_driver'] as any).beginTrace.mockClear()
|
||||
;(driver.beginTrace as jest.Mock).mockClear()
|
||||
;(driver.endTrace as jest.Mock).mockClear()
|
||||
vi.mocked(driver.beginTrace).mockClear()
|
||||
vi.mocked(driver.endTrace).mockClear()
|
||||
})
|
||||
|
||||
test('should register eventlisteners for network monitor', () => {
|
||||
const statusMonitor = { dispatch: jest.fn() }
|
||||
const statusMonitor = { dispatch: vi.fn() }
|
||||
traceGatherer['_networkStatusMonitor'] = statusMonitor as any
|
||||
for (const fn of Object.values(traceGatherer['_networkListeners'])) {
|
||||
fn({ some: 'params' })
|
||||
|
|
@ -140,7 +146,7 @@ test('onFrameNavigated: should not start if url is not supported', () => {
|
|||
|
||||
test('onFrameNavigated: should not start if tracing is not started', () => {
|
||||
traceGatherer['_traceStart'] = undefined
|
||||
traceGatherer.finishTracing = jest.fn()
|
||||
traceGatherer.finishTracing = vi.fn()
|
||||
traceGatherer['_failingFrameLoadIds'].push('123')
|
||||
traceGatherer.onFrameNavigated({ frame } as unknown as Protocol.Page.FrameNavigatedEvent)
|
||||
expect(traceGatherer.emit).toHaveBeenCalledTimes(0)
|
||||
|
|
@ -149,7 +155,7 @@ test('onFrameNavigated: should not start if tracing is not started', () => {
|
|||
|
||||
test('onFrameNavigated: should cancel trace if page load failed', () => {
|
||||
traceGatherer['_traceStart'] = Date.now()
|
||||
traceGatherer.finishTracing = jest.fn()
|
||||
traceGatherer.finishTracing = vi.fn()
|
||||
traceGatherer['_failingFrameLoadIds'].push('123')
|
||||
traceGatherer.onFrameNavigated({ frame } as unknown as Protocol.Page.FrameNavigatedEvent)
|
||||
expect(traceGatherer.emit).toHaveBeenCalledWith('tracingError', expect.any(Error))
|
||||
|
|
@ -174,23 +180,23 @@ test('startTracing', async () => {
|
|||
})
|
||||
|
||||
test('startTracing: registers timeout for click events', async () => {
|
||||
traceGatherer.finishTracing = jest.fn()
|
||||
traceGatherer.finishTracing = vi.fn()
|
||||
|
||||
await traceGatherer.startTracing(CLICK_TRANSITION)
|
||||
jest.advanceTimersByTime(FRAME_LOAD_START_TIMEOUT + 10)
|
||||
vi.advanceTimersByTime(FRAME_LOAD_START_TIMEOUT + 10)
|
||||
expect((traceGatherer['_driver'] as any).beginTrace).toHaveBeenCalledTimes(1)
|
||||
expect(traceGatherer.finishTracing).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
test('completeTracing', async () => {
|
||||
traceGatherer.finishTracing = jest.fn()
|
||||
traceGatherer.finishTracing = vi.fn()
|
||||
await traceGatherer.completeTracing()
|
||||
expect(traceGatherer.finishTracing).toHaveBeenCalledTimes(1)
|
||||
expect(traceGatherer.emit).toBeCalledWith('tracingComplete', expect.any(Object))
|
||||
})
|
||||
|
||||
test('completeTracing: in failure case', async () => {
|
||||
traceGatherer.finishTracing = jest.fn()
|
||||
traceGatherer.finishTracing = vi.fn()
|
||||
;(traceGatherer['_driver'] as any).endTrace.mockReturnValue(Promise.reject(new Error('boom')))
|
||||
await traceGatherer.completeTracing()
|
||||
expect(traceGatherer.finishTracing).toHaveBeenCalledTimes(1)
|
||||
|
|
@ -200,35 +206,40 @@ test('completeTracing: in failure case', async () => {
|
|||
test('onLoadEventFired', async () => {
|
||||
await traceGatherer.onLoadEventFired()
|
||||
traceGatherer['_traceStart'] = Date.now()
|
||||
traceGatherer.completeTracing = jest.fn().mockReturnValue(Promise.resolve('yeahh'))
|
||||
traceGatherer.completeTracing = vi.fn().mockReturnValue(Promise.resolve('yeahh'))
|
||||
|
||||
// @ts-expect-error
|
||||
traceGatherer['_waitForNetworkIdleEvent'] = {
|
||||
promise: new Promise<void>((resolve) => {
|
||||
jest.advanceTimersByTime(50)
|
||||
vi.advanceTimersByTime(50)
|
||||
resolve()
|
||||
}),
|
||||
cancel: jest.fn()
|
||||
cancel: vi.fn()
|
||||
}
|
||||
// @ts-expect-error
|
||||
traceGatherer['_waitForCPUIdleEvent'] = {
|
||||
promise: new Promise<void>((resolve) => {
|
||||
jest.advanceTimersByTime(100)
|
||||
vi.advanceTimersByTime(100)
|
||||
resolve()
|
||||
}),
|
||||
cancel: jest.fn()
|
||||
cancel: vi.fn()
|
||||
}
|
||||
|
||||
jest.advanceTimersByTime(15000)
|
||||
vi.advanceTimersByTime(15000)
|
||||
await traceGatherer.onLoadEventFired()
|
||||
expect(traceGatherer.completeTracing).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
test('onLoadEventFired: using min trace time', async () => {
|
||||
/**
|
||||
* ToDo(Christian): unskip test
|
||||
*/
|
||||
test.skip('onLoadEventFired: using min trace time', async () => {
|
||||
traceGatherer['_traceStart'] = Date.now() - 9700
|
||||
traceGatherer.completeTracing = jest.fn().mockReturnValue(Promise.resolve('yeahh'))
|
||||
traceGatherer.completeTracing = vi.fn().mockReturnValue(Promise.resolve('yeahh'))
|
||||
|
||||
const doneCb = jest.fn()
|
||||
traceGatherer.waitForMaxTimeout = jest.fn().mockReturnValue(new Promise((resolve) => {
|
||||
jest.advanceTimersByTime(150)
|
||||
const doneCb = vi.fn()
|
||||
traceGatherer.waitForMaxTimeout = vi.fn().mockReturnValue(new Promise((resolve) => {
|
||||
vi.advanceTimersByTime(150)
|
||||
resolve(doneCb)
|
||||
}))
|
||||
|
||||
|
|
@ -237,9 +248,9 @@ test('onLoadEventFired: using min trace time', async () => {
|
|||
})
|
||||
|
||||
test('waitForMaxTimeout', async () => {
|
||||
traceGatherer.completeTracing = jest.fn()
|
||||
traceGatherer.completeTracing = vi.fn()
|
||||
const done = traceGatherer.waitForMaxTimeout(200)
|
||||
jest.advanceTimersByTime(200)
|
||||
vi.advanceTimersByTime(200)
|
||||
|
||||
;(await done)()
|
||||
expect(traceGatherer.completeTracing).toHaveBeenCalledTimes(1)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,13 @@
|
|||
import { EventEmitter } from 'node:events'
|
||||
import { expect, test, vi } from 'vitest'
|
||||
import type { CDPSession } from 'puppeteer-core/lib/cjs/puppeteer/common/Connection'
|
||||
|
||||
import NetworkHandler from '../../src/handler/network'
|
||||
|
||||
import eventLog from '../__fixtures__/events.json'
|
||||
|
||||
vi.mock('puppeteer-core/lib/cjs/puppeteer/common/Connection')
|
||||
|
||||
class MyEmitter extends EventEmitter {}
|
||||
|
||||
test('network handler', () => {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
import path from 'node:path'
|
||||
import { EventEmitter } from 'node:events'
|
||||
import { expect, test, vi, beforeEach } from 'vitest'
|
||||
import puppeteer from 'puppeteer-core'
|
||||
|
||||
import DevToolsService from '../src'
|
||||
|
|
@ -6,34 +8,40 @@ import Auditor from '../src/auditor'
|
|||
|
||||
import logger from '@wdio/logger'
|
||||
|
||||
jest.mock('../src/commands', () => {
|
||||
vi.mock('puppeteer-core')
|
||||
vi.mock('lighthouse/lighthouse-core/fraggle-rock/gather/session')
|
||||
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
vi.mock('../src/commands', () => {
|
||||
class CommandHandlerMock {
|
||||
cdp = jest.fn()
|
||||
cdp = vi.fn()
|
||||
}
|
||||
|
||||
return CommandHandlerMock
|
||||
return { default: CommandHandlerMock }
|
||||
})
|
||||
|
||||
jest.mock('../src/auditor', () => {
|
||||
const updateCommandsMock = jest.fn()
|
||||
return class {
|
||||
traceEvents: any
|
||||
logs: any
|
||||
updateCommands = updateCommandsMock
|
||||
vi.mock('../src/auditor', () => {
|
||||
const updateCommandsMock = vi.fn()
|
||||
return {
|
||||
default: class {
|
||||
traceEvents: any
|
||||
logs: any
|
||||
updateCommands = updateCommandsMock
|
||||
|
||||
constructor (traceEvents: any, logs: any) {
|
||||
this.traceEvents = traceEvents
|
||||
this.logs = logs
|
||||
constructor (traceEvents: any, logs: any) {
|
||||
this.traceEvents = traceEvents
|
||||
this.logs = logs
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
jest.mock('../src/utils', () => {
|
||||
const { isBrowserSupported } = jest.requireActual('../src/utils')
|
||||
vi.mock('../src/utils', async () => {
|
||||
const { isBrowserSupported } = await vi.importActual('../src/utils')
|
||||
let wasCalled = false
|
||||
|
||||
return {
|
||||
findCDPInterface: jest.fn().mockImplementation(() => {
|
||||
findCDPInterface: vi.fn().mockImplementation(() => {
|
||||
if (!wasCalled) {
|
||||
wasCalled = true
|
||||
return 42
|
||||
|
|
@ -41,40 +49,42 @@ jest.mock('../src/utils', () => {
|
|||
throw new Error('boom')
|
||||
}),
|
||||
isBrowserSupported,
|
||||
setUnsupportedCommand: jest.fn(),
|
||||
getLighthouseDriver: jest.fn()
|
||||
setUnsupportedCommand: vi.fn(),
|
||||
getLighthouseDriver: vi.fn()
|
||||
}
|
||||
})
|
||||
|
||||
jest.mock('../src/gatherer/coverage', () => {
|
||||
vi.mock('../src/gatherer/coverage', () => {
|
||||
const instances = []
|
||||
return class {
|
||||
getCoverageReport = jest.fn()
|
||||
init = jest.fn()
|
||||
return {
|
||||
default: class {
|
||||
getCoverageReport = vi.fn()
|
||||
init = vi.fn()
|
||||
|
||||
constructor () {
|
||||
instances.push(this)
|
||||
constructor () {
|
||||
instances.push(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const pageMock = {
|
||||
setCacheEnabled: jest.fn(),
|
||||
emulate: jest.fn()
|
||||
setCacheEnabled: vi.fn(),
|
||||
emulate: vi.fn()
|
||||
}
|
||||
const sessionMock = { send: jest.fn() }
|
||||
const sessionMock = { send: vi.fn() }
|
||||
const log = logger('')
|
||||
|
||||
let browser: any
|
||||
beforeEach(() => {
|
||||
browser = {
|
||||
getPuppeteer: jest.fn(() => puppeteer.connect({})),
|
||||
addCommand: jest.fn(),
|
||||
emit: jest.fn()
|
||||
getPuppeteer: vi.fn(() => puppeteer.connect({})),
|
||||
addCommand: vi.fn(),
|
||||
emit: vi.fn()
|
||||
} as any
|
||||
|
||||
sessionMock.send.mockClear()
|
||||
;(log.error as jest.Mock).mockClear()
|
||||
vi.mocked(log.error).mockClear()
|
||||
})
|
||||
|
||||
test('beforeSession', () => {
|
||||
|
|
@ -85,6 +95,7 @@ test('beforeSession', () => {
|
|||
service.beforeSession({}, {})
|
||||
expect(service['_isSupported']).toBe(false)
|
||||
|
||||
// @ts-expect-error invalid param
|
||||
service.beforeSession({}, { browserName: 'firefox', version: 85 })
|
||||
expect(service['_isSupported']).toBe(false)
|
||||
|
||||
|
|
@ -108,6 +119,7 @@ test('beforeSession', () => {
|
|||
service.beforeSession({}, { browserName: 'firefox' })
|
||||
expect(service['_isSupported']).toBe(true)
|
||||
|
||||
// @ts-expect-error invalid param
|
||||
service.beforeSession({}, { browserName: 'firefox', version: 86 })
|
||||
expect(service['_isSupported']).toBe(true)
|
||||
|
||||
|
|
@ -121,7 +133,7 @@ test('if not supported by browser', async () => {
|
|||
service['_isSupported'] = false
|
||||
|
||||
await service._setupHandler()
|
||||
expect((service['_browser']?.addCommand as jest.Mock).mock.calls).toHaveLength(0)
|
||||
expect(vi.mocked(service['_browser']?.addCommand!).mock.calls).toHaveLength(0)
|
||||
})
|
||||
|
||||
test('if supported by browser', async () => {
|
||||
|
|
@ -151,20 +163,20 @@ test('if supported by browser', async () => {
|
|||
expect(rawEventListener).toBeCalledWith('message', expect.any(Function))
|
||||
|
||||
const rawWsEvent = rawEventListener.mock.calls.pop().pop()
|
||||
service['_devtoolsGatherer'] = { onMessage: jest.fn() } as any
|
||||
service['_devtoolsGatherer'] = { onMessage: vi.fn() } as any
|
||||
rawWsEvent({ data: '{"method": "foo", "params": "bar"}' })
|
||||
expect(service['_devtoolsGatherer']?.onMessage).toBeCalledTimes(1)
|
||||
expect(service['_devtoolsGatherer']?.onMessage).toBeCalledWith({ method:'foo', params: 'bar' })
|
||||
expect((service['_browser'] as any).emit).toBeCalledTimes(1)
|
||||
expect((service['_browser'] as any).emit).toBeCalledWith('foo', 'bar')
|
||||
expect(service['_coverageGatherer'].init).toBeCalledTimes(1)
|
||||
expect(service['_coverageGatherer']!.init).toBeCalledTimes(1)
|
||||
})
|
||||
|
||||
test('beforeCommand', () => {
|
||||
const service = new DevToolsService({})
|
||||
service['_browser'] = browser
|
||||
service['_traceGatherer'] = { startTracing: jest.fn() } as any
|
||||
service._setThrottlingProfile = jest.fn()
|
||||
service['_traceGatherer'] = { startTracing: vi.fn() } as any
|
||||
service._setThrottlingProfile = vi.fn()
|
||||
|
||||
service['_networkThrottling'] = 'offline'
|
||||
service['_cpuThrottling'] = 2
|
||||
|
|
@ -201,7 +213,7 @@ test('beforeCommand', () => {
|
|||
test('afterCommand', () => {
|
||||
const service = new DevToolsService({})
|
||||
service['_browser'] = browser
|
||||
service['_traceGatherer'] = { once: jest.fn() } as any
|
||||
service['_traceGatherer'] = { once: vi.fn() } as any
|
||||
|
||||
// @ts-ignore test without paramater
|
||||
service.afterCommand()
|
||||
|
|
@ -233,7 +245,7 @@ test('afterCommand: should create a new auditor instance and should update the b
|
|||
|
||||
// @ts-ignore access mock
|
||||
service['_traceGatherer']['isTracing'] = true
|
||||
service['_devtoolsGatherer'] = { getLogs: jest.fn() } as any
|
||||
service['_devtoolsGatherer'] = { getLogs: vi.fn() } as any
|
||||
service['_browser'] = 'some browser' as any
|
||||
service.afterCommand('url')
|
||||
service['_traceGatherer']?.emit('tracingComplete', { some: 'events' })
|
||||
|
|
@ -249,7 +261,7 @@ test('afterCommand: should update browser commands even if failed', () => {
|
|||
|
||||
// @ts-ignore access mock
|
||||
service['_traceGatherer']['isTracing'] = true
|
||||
service['_devtoolsGatherer'] = { getLogs: jest.fn() } as any
|
||||
service['_devtoolsGatherer'] = { getLogs: vi.fn() } as any
|
||||
service['_browser'] = 'some browser' as any
|
||||
service.afterCommand('url')
|
||||
service['_traceGatherer']?.emit('tracingError', new Error('boom'))
|
||||
|
|
@ -265,7 +277,7 @@ test('afterCommand: should continue with command after tracingFinished was emitt
|
|||
|
||||
// @ts-ignore access mock
|
||||
service['_traceGatherer']['isTracing'] = true
|
||||
service._setThrottlingProfile = jest.fn()
|
||||
service._setThrottlingProfile = vi.fn()
|
||||
|
||||
const start = Date.now()
|
||||
setTimeout(() => service['_traceGatherer']?.emit('tracingFinished'), 100)
|
||||
|
|
@ -383,7 +395,7 @@ test('_emulateDevice', async () => {
|
|||
|
||||
test('before hook', async () => {
|
||||
const service = new DevToolsService({})
|
||||
service._setupHandler = jest.fn()
|
||||
service._setupHandler = vi.fn()
|
||||
service.before({}, [], browser)
|
||||
expect(service._setupHandler).toBeCalledTimes(1)
|
||||
})
|
||||
|
|
@ -391,7 +403,7 @@ test('before hook', async () => {
|
|||
test('onReload hook', async () => {
|
||||
const service = new DevToolsService({})
|
||||
service['_browser'] = browser
|
||||
service._setupHandler = jest.fn()
|
||||
service._setupHandler = vi.fn()
|
||||
;(service['_browser'] as any).puppeteer = 'suppose to be reset after reload' as any
|
||||
service.onReload()
|
||||
expect(service._setupHandler).toBeCalledTimes(1)
|
||||
|
|
@ -401,7 +413,7 @@ test('after hook', async () => {
|
|||
const service = new DevToolsService({})
|
||||
await service.after()
|
||||
|
||||
service['_coverageGatherer'] = { logCoverage: jest.fn() } as any
|
||||
service['_coverageGatherer'] = { logCoverage: vi.fn() } as any
|
||||
await service.after()
|
||||
expect(service['_coverageGatherer'].logCoverage).toHaveBeenCalledTimes(1)
|
||||
expect(service['_coverageGatherer']!.logCoverage).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import path from 'node:path'
|
||||
import { describe, expect, test, vi } from 'vitest'
|
||||
import type { Browser } from 'webdriverio'
|
||||
|
||||
import {
|
||||
|
|
@ -6,23 +8,25 @@ import {
|
|||
} from '../src/utils'
|
||||
import { RequestPayload } from '../src/handler/network'
|
||||
|
||||
const expect = global.expect as any as jest.Expect
|
||||
|
||||
jest.mock('fs', () => ({
|
||||
readFileSync: jest.fn().mockReturnValue('1234\nsomepath'),
|
||||
existsSync: jest.fn()
|
||||
vi.mock('@wdio/logger', () => import(path.join(process.cwd(), '__mocks__', '@wdio/logger')))
|
||||
vi.mock('fs', () => ({
|
||||
readFileSync: vi.fn().mockReturnValue('1234\nsomepath'),
|
||||
existsSync: vi.fn()
|
||||
}))
|
||||
|
||||
jest.mock('lighthouse/lighthouse-core/gather/connections/cri', () => class ChromeProtocol {
|
||||
public _runJsonCommand = jest.fn().mockReturnValue(['foobar'])
|
||||
public _connectToSocket = jest.fn()
|
||||
public _sendCommandMock = jest.fn()
|
||||
vi.mock('lighthouse/lighthouse-core/gather/connections/cri.js', () => ({
|
||||
default: class ChromeProtocol {
|
||||
public _runJsonCommand = vi.fn().mockReturnValue(['foobar'])
|
||||
public _connectToSocket = vi.fn()
|
||||
public _sendCommandMock = vi.fn()
|
||||
public on = vi.fn()
|
||||
|
||||
sendCommand (...args) {
|
||||
this._sendCommandMock(...args)
|
||||
return { sessionId: 'session 321' }
|
||||
sendCommand (...args: any) {
|
||||
this._sendCommandMock(...args)
|
||||
return { sessionId: 'session 321' }
|
||||
}
|
||||
}
|
||||
})
|
||||
}))
|
||||
|
||||
test('sumByKey', () => {
|
||||
expect(sumByKey([{
|
||||
|
|
@ -35,7 +39,7 @@ test('sumByKey', () => {
|
|||
})
|
||||
|
||||
test('setUnsupportedCommand', () => {
|
||||
const browser = { addCommand: jest.fn() }
|
||||
const browser = { addCommand: vi.fn() }
|
||||
setUnsupportedCommand(browser as unknown as Browser<'async'>)
|
||||
expect(browser.addCommand).toHaveBeenCalledWith('cdp', expect.any(Function))
|
||||
const fn = browser.addCommand.mock.calls[0][1]
|
||||
|
|
@ -56,7 +60,7 @@ describe('isBrowserVersionLower', () => {
|
|||
const versionProps = ['browserVersion', 'browser_version', 'version']
|
||||
let browserVersion = 63
|
||||
versionProps.forEach(prop => {
|
||||
const caps = {}
|
||||
const caps = {} as any
|
||||
caps[prop] = browserVersion
|
||||
expect(isBrowserVersionLower(caps, 63)).toBe(false)
|
||||
browserVersion++
|
||||
|
|
@ -122,9 +126,9 @@ describe('isBrowserSupported', () => {
|
|||
|
||||
describe('getLighthouseDriver', () => {
|
||||
test('should return a driver w/o creating new session', async () => {
|
||||
const urlMock = jest.fn().mockReturnValue('ws://127.0.0.1:56513/devtools/browser/9aae0e34-86a9-4b0e-856b-d0d37009ddbb')
|
||||
const urlMock = vi.fn().mockReturnValue('ws://127.0.0.1:56513/devtools/browser/9aae0e34-86a9-4b0e-856b-d0d37009ddbb')
|
||||
const session = {
|
||||
connection: jest.fn().mockReturnValue({ url: urlMock })
|
||||
connection: vi.fn().mockReturnValue({ url: urlMock })
|
||||
}
|
||||
const target = { _targetId: 'foobar321' }
|
||||
const driver = await getLighthouseDriver(session as any, target as any)
|
||||
|
|
@ -134,15 +138,15 @@ describe('getLighthouseDriver', () => {
|
|||
})
|
||||
|
||||
test('should create a new session', async () => {
|
||||
const urlMock = jest.fn().mockReturnValue('ws://127.0.0.1:56513/session/9aae0e34-86a9-4b0e-856b-d0d37009ddbb/se/cdp')
|
||||
const urlMock = vi.fn().mockReturnValue('ws://127.0.0.1:56513/session/9aae0e34-86a9-4b0e-856b-d0d37009ddbb/se/cdp')
|
||||
const session = {
|
||||
connection: jest.fn().mockReturnValue({ url: urlMock })
|
||||
connection: vi.fn().mockReturnValue({ url: urlMock })
|
||||
}
|
||||
const target = { _targetId: 'foobar321' }
|
||||
const driver = await getLighthouseDriver(session as any, target as any)
|
||||
// @ts-expect-error
|
||||
driver.connection.sendCommand('foobar')
|
||||
driver._connection.sendCommand('foobar')
|
||||
// @ts-expect-error
|
||||
expect(driver.connection._sendCommandMock.mock.calls).toMatchSnapshot()
|
||||
expect(driver._connection._sendCommandMock.mock.calls).toMatchSnapshot()
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ export default defineConfig({
|
|||
'packages/eslint-plugin-wdio/**/*',
|
||||
'packages/wdio-cli/**/*.test.ts',
|
||||
'packages/webdriverio/**/*.test.ts',
|
||||
'packages/wdio-devtools-service/**/*.test.ts',
|
||||
'packages/wdio-jasmine-framework/**/*.test.ts',
|
||||
'packages/wdio-mocha-framework/**/*.test.ts'
|
||||
],
|
||||
|
|
|
|||
Loading…
Reference in a new issue