Skip to content

Commit 7191103

Browse files
authored
fix(ui): fix coverage iframe url for html report preview (#4717)
1 parent 67d93ed commit 7191103

File tree

6 files changed

+33
-13
lines changed

6 files changed

+33
-13
lines changed

docs/config/index.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,8 @@ Clean coverage report on watch rerun
11261126

11271127
Directory to write coverage report to.
11281128

1129+
To preview the coverage report in the output of [HTML reporter](/guide/reporters.html#html-reporter), this option must be set as a sub-directory of the html report directory (for example `./html/coverage`).
1130+
11291131
#### coverage.reporter
11301132

11311133
- **Type:** `string | string[] | [string, {}][]`

packages/ui/client/composables/navigation.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,16 @@ export const dashboardVisible = ref(true)
77
export const coverageVisible = ref(false)
88
export const disableCoverage = ref(true)
99
export const coverage = computed(() => config.value?.coverage)
10-
export const coverageConfigured = computed(() => {
11-
if (!config.value?.api?.port)
12-
return false
13-
14-
return coverage.value?.enabled
15-
})
10+
export const coverageConfigured = computed(() => coverage.value?.enabled)
1611
export const coverageEnabled = computed(() => {
1712
return coverageConfigured.value
1813
&& coverage.value.reporter.map(([reporterName]) => reporterName).includes('html')
1914
})
15+
// TODO
16+
// For html report preview, "coverage.reportsDirectory" must be explicitly set as a subdirectory of html report.
17+
// Handling other cases seems difficult, so this limitation is mentioned in the documentation for now.
2018
export const coverageUrl = computed(() => {
2119
if (coverageEnabled.value) {
22-
const url = `${window.location.protocol}//${window.location.hostname}:${config.value!.api!.port!}`
2320
const idx = coverage.value!.reportsDirectory.lastIndexOf('/')
2421
const htmlReporter = coverage.value!.reporter.find((reporter) => {
2522
if (reporter[0] !== 'html')
@@ -28,8 +25,8 @@ export const coverageUrl = computed(() => {
2825
return reporter
2926
})
3027
return htmlReporter && 'subdir' in htmlReporter[1]
31-
? `${url}/${coverage.value!.reportsDirectory.slice(idx + 1)}/${htmlReporter[1].subdir}/index.html`
32-
: `${url}/${coverage.value!.reportsDirectory.slice(idx + 1)}/index.html`
28+
? `/${coverage.value!.reportsDirectory.slice(idx + 1)}/${htmlReporter[1].subdir}/index.html`
29+
: `/${coverage.value!.reportsDirectory.slice(idx + 1)}/index.html`
3330
}
3431

3532
return undefined

test/ui/fixtures/coverage.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { expect, it } from 'vitest'
2+
import { multiply } from './coverage'
3+
4+
it(multiply, () => {
5+
expect(multiply(2, 3)).toEqual(6)
6+
})

test/ui/fixtures/coverage.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function multiply(n: number, m: number) {
2+
return n * m;
3+
}

test/ui/test/html-report.spec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ test.describe('html report', () => {
1111

1212
test.beforeAll(async () => {
1313
// generate vitest html report
14-
await startVitest('test', [], { run: true, reporters: 'html' })
14+
await startVitest('test', [], { run: true, reporters: 'html', coverage: { enabled: true, reportsDirectory: 'html/coverage' } })
1515

1616
// run vite preview server
1717
previewServer = await preview({ build: { outDir: 'html' }, preview: { port, strictPort: true } })
@@ -32,7 +32,7 @@ test.describe('html report', () => {
3232
await page.goto(pageUrl)
3333

3434
// dashbaord
35-
await expect(page.locator('[aria-labelledby=tests]')).toContainText('4 Pass 0 Fail 4 Total')
35+
await expect(page.locator('[aria-labelledby=tests]')).toContainText('5 Pass 0 Fail 5 Total')
3636

3737
// report
3838
await page.getByText('sample.test.ts').click()
@@ -49,4 +49,10 @@ test.describe('html report', () => {
4949

5050
expect(pageErrors).toEqual([])
5151
})
52+
53+
test('coverage', async ({ page }) => {
54+
await page.goto(pageUrl)
55+
await page.getByLabel('Show coverage').click()
56+
await page.frameLocator('#vitest-ui-coverage').getByRole('heading', { name: 'All files' }).click()
57+
})
5258
})

test/ui/test/ui.spec.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ test.describe('ui', () => {
88
let vitest: Vitest | undefined
99

1010
test.beforeAll(async () => {
11-
vitest = await startVitest('test', [], { watch: true, ui: true, open: false, api: { port } })
11+
vitest = await startVitest('test', [], { watch: true, ui: true, open: false, api: { port }, coverage: { enabled: true } })
1212
expect(vitest).toBeDefined()
1313
})
1414

@@ -23,7 +23,7 @@ test.describe('ui', () => {
2323
await page.goto(pageUrl)
2424

2525
// dashbaord
26-
await expect(page.locator('[aria-labelledby=tests]')).toContainText('4 Pass 0 Fail 4 Total')
26+
await expect(page.locator('[aria-labelledby=tests]')).toContainText('5 Pass 0 Fail 5 Total')
2727

2828
// report
2929
await page.getByText('sample.test.ts').click()
@@ -41,6 +41,12 @@ test.describe('ui', () => {
4141
expect(pageErrors).toEqual([])
4242
})
4343

44+
test('coverage', async ({ page }) => {
45+
await page.goto(pageUrl)
46+
await page.getByLabel('Show coverage').click()
47+
await page.frameLocator('#vitest-ui-coverage').getByRole('heading', { name: 'All files' }).click()
48+
})
49+
4450
test('console', async ({ page }) => {
4551
await page.goto(pageUrl)
4652
await page.getByText('fixtures/console.test.ts').click()

0 commit comments

Comments
 (0)