From 476a813a5c10a7c6fc4d90deec8f5a4744b1ed46 Mon Sep 17 00:00:00 2001 From: Tane Morgan <464864+tanem@users.noreply.github.com> Date: Tue, 17 Feb 2026 06:16:26 +1300 Subject: [PATCH] Fix code coverage setup --- src/extract-symbol.ts | 1 - src/inject-element.ts | 13 ------ src/load-svg-cached.ts | 1 - src/load-svg-uncached.ts | 1 - src/request-queue.ts | 10 +---- test/eval-scripts.test.ts | 3 +- test/local.test.ts | 3 +- test/no-extension.test.ts | 3 +- test/playwright/coverage.ts | 59 ++++++++++++++++------------ test/renumerate-iri-elements.test.ts | 3 +- test/sprite.test.ts | 3 +- test/svg-injector.test.ts | 3 +- test/unique-id.test.ts | 3 +- 13 files changed, 42 insertions(+), 64 deletions(-) diff --git a/src/extract-symbol.ts b/src/extract-symbol.ts index f9fd9135..c9832d2d 100644 --- a/src/extract-symbol.ts +++ b/src/extract-symbol.ts @@ -6,7 +6,6 @@ const extractSymbol = ( ): SVGSVGElement | null => { const symbol = spriteSvg.querySelector('#' + CSS.escape(symbolId)) - /* istanbul ignore else */ if (symbol?.tagName.toLowerCase() !== 'symbol') { return null } diff --git a/src/inject-element.ts b/src/inject-element.ts index 2d153f23..0513a2cd 100644 --- a/src/inject-element.ts +++ b/src/inject-element.ts @@ -22,7 +22,6 @@ const injectElement = ( ) => { const elUrl = el.getAttribute('data-src') ?? el.getAttribute('src') - /* istanbul ignore else */ if (!elUrl) { callback(new Error('Invalid data-src or src attribute')) return @@ -32,7 +31,6 @@ const injectElement = ( // avoid a race condition if multiple injections for the same element are run. // :NOTE: Using indexOf() only _after_ we check for SVG support and bail, so // no need for IE8 indexOf() polyfill. - /* istanbul ignore else */ if (injectedElements.indexOf(el) !== -1) { // TODO: Extract. injectedElements.splice(injectedElements.indexOf(el), 1) @@ -56,7 +54,6 @@ const injectElement = ( const loadSvg = cacheRequests ? loadSvgCached : loadSvgUncached loadSvg(baseUrl, httpRequestWithCredentials, (error, loadedSvg) => { - /* istanbul ignore else */ if (!loadedSvg) { // TODO: Extract. injectedElements.splice(injectedElements.indexOf(el), 1) @@ -70,7 +67,6 @@ const injectElement = ( if (symbolId) { const symbolSvg = extractSymbol(loadedSvg, symbolId) - /* istanbul ignore else */ if (!symbolSvg) { injectedElements.splice(injectedElements.indexOf(el), 1) ;(el as ElementType) = null @@ -82,25 +78,21 @@ const injectElement = ( } const elId = el.getAttribute('id') - /* istanbul ignore else */ if (elId) { svg.setAttribute('id', elId) } const elTitle = el.getAttribute('title') - /* istanbul ignore else */ if (elTitle) { svg.setAttribute('title', elTitle) } const elWidth = el.getAttribute('width') - /* istanbul ignore else */ if (elWidth) { svg.setAttribute('width', elWidth) } const elHeight = el.getAttribute('height') - /* istanbul ignore else */ if (elHeight) { svg.setAttribute('height', elHeight) } @@ -117,7 +109,6 @@ const injectElement = ( svg.setAttribute('class', mergedClasses) const elStyle = el.getAttribute('style') - /* istanbul ignore else */ if (elStyle) { svg.setAttribute('style', elStyle) } @@ -136,7 +127,6 @@ const injectElement = ( } }) - /* istanbul ignore else */ if (renumerateIRIElements) { // Make sure any internally referenced clipPath ids and their clip-path // references are unique. @@ -251,7 +241,6 @@ const injectElement = ( for (let c = 0, allLinksLen = allLinks.length; c < allLinksLen; c++) { const link = allLinks[c]! const href = link.getAttribute('href') - /* istanbul ignore else */ if (href) { const nextHref = replaceHrefReference(href, iriIdMap) if (nextHref !== href) { @@ -260,7 +249,6 @@ const injectElement = ( } const xlinkHref = link.getAttributeNS(xlinkNamespace, 'href') - /* istanbul ignore else */ if (xlinkHref) { const nextXlinkHref = replaceHrefReference(xlinkHref, iriIdMap) if (nextXlinkHref !== xlinkHref) { @@ -353,7 +341,6 @@ const injectElement = ( } // Run/Eval the scripts if needed. - /* istanbul ignore else */ if ( scriptsToEval.length > 0 && (evalScripts === 'always' || diff --git a/src/load-svg-cached.ts b/src/load-svg-cached.ts index 67d2eb04..9b95ec28 100644 --- a/src/load-svg-cached.ts +++ b/src/load-svg-cached.ts @@ -31,7 +31,6 @@ const loadSvgCached = ( queueRequest(url, callback) makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => { - /* istanbul ignore else */ if (error) { cache.set(url, error) } else if ( diff --git a/src/load-svg-uncached.ts b/src/load-svg-uncached.ts index ba01e56a..724d5eda 100644 --- a/src/load-svg-uncached.ts +++ b/src/load-svg-uncached.ts @@ -7,7 +7,6 @@ const loadSvgUncached = ( callback: Errback, ) => { makeAjaxRequest(url, httpRequestWithCredentials, (error, httpRequest) => { - /* istanbul ignore else */ if (error) { callback(error) } else if ( diff --git a/src/request-queue.ts b/src/request-queue.ts index 2e860c09..73c3308f 100644 --- a/src/request-queue.ts +++ b/src/request-queue.ts @@ -2,11 +2,7 @@ import cache from './cache' import cloneSvg from './clone-svg' import type { Errback } from './types' -let requestQueue: Record = {} - -export const clear = () => { - requestQueue = {} -} +const requestQueue: Record = {} export const queueRequest = (url: string, callback: Errback) => { requestQueue[url] ??= [] @@ -22,7 +18,6 @@ export const processRequestQueue = (url: string) => { for (let i = 0, len = callbacks.length; i < len; i++) { // Make these calls async so we avoid blocking the page/renderer. setTimeout(() => { - /* istanbul ignore else */ if (Array.isArray(requestQueue[url])) { const cacheValue = cache.get(url) const callback = callbacks[i] @@ -32,17 +27,14 @@ export const processRequestQueue = (url: string) => { return } - /* istanbul ignore else */ if (cacheValue instanceof SVGSVGElement) { callback(null, cloneSvg(cacheValue)) } - /* istanbul ignore else */ if (cacheValue instanceof Error) { callback(cacheValue) } - /* istanbul ignore else */ if (i === callbacks.length - 1) { delete requestQueue[url] } diff --git a/test/eval-scripts.test.ts b/test/eval-scripts.test.ts index ecc9e5f0..01ae3f6f 100644 --- a/test/eval-scripts.test.ts +++ b/test/eval-scripts.test.ts @@ -1,7 +1,6 @@ -import { expect, test } from '@playwright/test' import type { Page } from '@playwright/test' +import { expect, test } from './playwright/coverage' import { formatHtml, injectSvg, setupPage } from './playwright/test-utils' -import './playwright/coverage' const injectHtml = `
{ test('missing content type', async ({ page, browserName }) => { diff --git a/test/playwright/coverage.ts b/test/playwright/coverage.ts index 30665bb8..741f9d82 100644 --- a/test/playwright/coverage.ts +++ b/test/playwright/coverage.ts @@ -1,4 +1,4 @@ -import { test } from '@playwright/test' +import { test as base, expect } from '@playwright/test' import * as fs from 'fs/promises' import * as path from 'path' @@ -12,28 +12,37 @@ const sanitize = (value: string) => { return value.replace(/[^a-zA-Z0-9_-]+/g, '_') } -test.afterEach(async ({ page }, testInfo) => { - if (process.env.COVERAGE !== '1') { - return - } - - try { - const coverage = await page.evaluate( - () => (window as unknown as CoverageWindow).__coverage__ ?? null, - ) - - if (!coverage) { - return - } - - await fs.mkdir(coverageDir, { recursive: true }) - - const title = sanitize(testInfo.titlePath.join('-')) - const fileName = `${testInfo.project.name}-${title}.json` - const filePath = path.join(coverageDir, fileName) - - await fs.writeFile(filePath, JSON.stringify(coverage), 'utf8') - } catch { - // Ignore coverage collection failures to avoid masking test results. - } +const test = base.extend<{ _collectCoverage: void }>({ + _collectCoverage: [ + async ({ page }, use, testInfo) => { + await use() + + if (process.env.COVERAGE !== '1') { + return + } + + try { + const coverage = await page.evaluate( + () => (window as unknown as CoverageWindow).__coverage__ ?? null, + ) + + if (!coverage) { + return + } + + await fs.mkdir(coverageDir, { recursive: true }) + + const title = sanitize(testInfo.titlePath.join('-')) + const fileName = `${testInfo.project.name}-${title}.json` + const filePath = path.join(coverageDir, fileName) + + await fs.writeFile(filePath, JSON.stringify(coverage), 'utf8') + } catch { + // Ignore coverage collection failures to avoid masking test results. + } + }, + { auto: true }, + ], }) + +export { expect, test } diff --git a/test/renumerate-iri-elements.test.ts b/test/renumerate-iri-elements.test.ts index d2cce958..33c3d6e0 100644 --- a/test/renumerate-iri-elements.test.ts +++ b/test/renumerate-iri-elements.test.ts @@ -1,6 +1,5 @@ -import { expect, test } from '@playwright/test' +import { expect, test } from './playwright/coverage' import { formatHtml, injectSvg, setupPage } from './playwright/test-utils' -import './playwright/coverage' test.describe('renumerate iri elements', () => { test('renumerateIRIElements: false', async ({ page }) => { diff --git a/test/sprite.test.ts b/test/sprite.test.ts index 716f2103..d99deb6c 100644 --- a/test/sprite.test.ts +++ b/test/sprite.test.ts @@ -1,6 +1,5 @@ -import { expect, test } from '@playwright/test' +import { expect, test } from './playwright/coverage' import { formatHtml, injectSvg, setupPage } from './playwright/test-utils' -import './playwright/coverage' const thumbUpPath = 'M4.47 0c-.19.02-.37.15-.47.34-.13.26-1.09 2.19-1.28 2.38-.19.19-.44.28-.72.28v4h3.5c.21 0 .39-.13.47-.31 0 0 1.03-2.91 1.03-3.19 0-.28-.22-.5-.5-.5h-1.5c-.28 0-.5-.25-.5-.5s.39-1.58.47-1.84c.08-.26-.05-.54-.31-.63-.07-.02-.12-.04-.19-.03zm-4.47 3v4h1v-4h-1z' diff --git a/test/svg-injector.test.ts b/test/svg-injector.test.ts index 33c05311..ff622931 100644 --- a/test/svg-injector.test.ts +++ b/test/svg-injector.test.ts @@ -1,11 +1,10 @@ -import { expect, test } from '@playwright/test' +import { expect, test } from './playwright/coverage' import { formatHtml, injectSvg, setupPage, type SvgInjectorWindow, } from './playwright/test-utils' -import './playwright/coverage' const thumbUpPath = 'M4.47 0c-.19.02-.37.15-.47.34-.13.26-1.09 2.19-1.28 2.38-.19.19-.44.28-.72.28v4h3.5c.21 0 .39-.13.47-.31 0 0 1.03-2.91 1.03-3.19 0-.28-.22-.5-.5-.5h-1.5c-.28 0-.5-.25-.5-.5s.39-1.58.47-1.84c.08-.26-.05-.54-.31-.63-.07-.02-.12-.04-.19-.03zm-4.47 3v4h1v-4h-1z' diff --git a/test/unique-id.test.ts b/test/unique-id.test.ts index b8093b09..e64a1a2d 100644 --- a/test/unique-id.test.ts +++ b/test/unique-id.test.ts @@ -1,6 +1,5 @@ -import { expect, test } from '@playwright/test' +import { expect, test } from './playwright/coverage' import uniqueId from '../src/unique-id' -import './playwright/coverage' test('unique id generates unique ids', () => { expect(uniqueId()).toBe(1)