diff --git a/packages/build/src/getActualApiTypesContent.ts b/packages/build/src/getActualApiTypesContent.ts index 7b884d00..52672c7e 100644 --- a/packages/build/src/getActualApiTypesContent.ts +++ b/packages/build/src/getActualApiTypesContent.ts @@ -270,6 +270,9 @@ export const getActualApiTypesContent = (contentApi: string, contentExpect: stri newLines.push(' (api: TestApi): Promise') newLines.push('}') newLines.push('') + newLines.push("export type BrowserName = 'chromium' | 'firefox' | 'unknown' | 'webkit'") + newLines.push('export type Skip = boolean | number | readonly BrowserName[]') + newLines.push('') const formatted = formatApiTypes(newLines) diff --git a/packages/test-worker/src/parts/GetBrowserName/GetBrowserName.ts b/packages/test-worker/src/parts/GetBrowserName/GetBrowserName.ts new file mode 100644 index 00000000..1e3771ac --- /dev/null +++ b/packages/test-worker/src/parts/GetBrowserName/GetBrowserName.ts @@ -0,0 +1,26 @@ +export type BrowserName = 'chromium' | 'firefox' | 'unknown' | 'webkit' + +const includes = (userAgent: string, value: string): boolean => { + return userAgent.includes(value) +} + +export const getBrowserNameFromUserAgent = (userAgent: string): BrowserName => { + const normalized = userAgent.toLowerCase() + if (includes(normalized, 'firefox')) { + return 'firefox' + } + if (includes(normalized, 'chrome') || includes(normalized, 'chromium') || includes(normalized, 'edg')) { + return 'chromium' + } + if (includes(normalized, 'safari') || includes(normalized, 'applewebkit')) { + return 'webkit' + } + return 'unknown' +} + +export const getBrowserName = (): BrowserName => { + if (typeof navigator === 'undefined') { + return 'unknown' + } + return getBrowserNameFromUserAgent(navigator.userAgent) +} diff --git a/packages/test-worker/src/parts/ShouldSkipTest/ShouldSkipTest.ts b/packages/test-worker/src/parts/ShouldSkipTest/ShouldSkipTest.ts new file mode 100644 index 00000000..875d28c1 --- /dev/null +++ b/packages/test-worker/src/parts/ShouldSkipTest/ShouldSkipTest.ts @@ -0,0 +1,13 @@ +import * as GetBrowserName from '../GetBrowserName/GetBrowserName.ts' + +export const shouldSkipTestWithBrowserName = (skip: unknown, browserName: GetBrowserName.BrowserName): boolean => { + if (Array.isArray(skip)) { + return skip.includes(browserName) + } + return Boolean(skip) +} + +export const shouldSkipTest = (skip: unknown): boolean => { + const browserName = GetBrowserName.getBrowserName() + return shouldSkipTestWithBrowserName(skip, browserName) +} diff --git a/packages/test-worker/src/parts/Test/Test.ts b/packages/test-worker/src/parts/Test/Test.ts index 18ce40a5..be06719b 100644 --- a/packages/test-worker/src/parts/Test/Test.ts +++ b/packages/test-worker/src/parts/Test/Test.ts @@ -7,6 +7,7 @@ import { formatDuration } from '../FormatDuration/FormatDuration.ts' import { hotReloadEnabled } from '../HotReloadEnabled/HotReloadEnabled.ts' import * as ImportTest from '../ImportTest/ImportTest.ts' import { printTestError } from '../PrintTestError/PrintTestError.ts' +import * as ShouldSkipTest from '../ShouldSkipTest/ShouldSkipTest.ts' import * as TestFrameWork from '../TestFrameWork/TestFrameWork.ts' import * as TestFrameWorkComponentUrl from '../TestFrameWorkComponentUrl/TestFrameWorkComponentUrl.ts' import * as TestInfoCache from '../TestInfoCache/TestInfoCache.ts' @@ -86,7 +87,7 @@ const executeAllTest = async (item: ExecuteAllTest, globals: any): Promise { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(true, 'unknown')).toBe(true) +}) + +test('shouldSkipTest returns true for 1', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(1, 'unknown')).toBe(true) +}) + +test('shouldSkipTest returns true for matching browser', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(['webkit'], 'webkit')).toBe(true) +}) + +test('shouldSkipTest returns false for chromium when skip targets webkit', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(['webkit'], 'chromium')).toBe(false) +}) + +test('shouldSkipTest returns false for firefox when skip targets webkit', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(['webkit'], 'firefox')).toBe(false) +}) + +test('shouldSkipTest returns false for empty array', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName([], 'webkit')).toBe(false) +}) + +test('shouldSkipTest returns false for false', () => { + expect(ShouldSkipTest.shouldSkipTestWithBrowserName(false, 'unknown')).toBe(false) +}) + +test('getBrowserNameFromUserAgent detects firefox', () => { + expect(GetBrowserName.getBrowserNameFromUserAgent('Mozilla/5.0 Firefox/145.0')).toBe('firefox') +}) + +test('getBrowserNameFromUserAgent detects chromium', () => { + expect(GetBrowserName.getBrowserNameFromUserAgent('Mozilla/5.0 Chrome/145.0 Safari/537.36')).toBe('chromium') +}) + +test('getBrowserNameFromUserAgent detects webkit', () => { + expect(GetBrowserName.getBrowserNameFromUserAgent('Mozilla/5.0 Version/18.0 Safari/605.1.15')).toBe('webkit') +})