11import type { BaseCoverageProvider , CoverageOptions } from 'vitest/node'
2- import { mkdirSync , rmSync } from 'node:fs'
3- import { join , resolve , sep } from 'node:path'
2+ import { mkdirSync , rmSync , writeFileSync } from 'node:fs'
3+ import { dirname , join , relative , resolve , sep } from 'node:path'
44import { Writable } from 'node:stream'
5+ import { normalize } from 'pathe'
56import { expect , onTestFinished , test } from 'vitest'
67import { createVitest } from 'vitest/node'
78
@@ -164,7 +165,35 @@ test('files with almost matching name, outside project when allowExternal: false
164165 expect ( isIncluded ( resolve ( parent , './something-else/src/three.ts' ) ) ) . toBe ( false )
165166} )
166167
168+ test ( 'tested files with glob characters in their path are not uncovered' , async ( ) => {
169+ const root = resolve ( process . cwd ( ) , `vitest-test-${ crypto . randomUUID ( ) } ` )
170+ const tested = resolve ( root , 'src/(app)/[id]/{page}.ts' )
171+ const untested = resolve ( root , 'src/(app)/[id]/untested.ts' )
172+
173+ mkdirSync ( dirname ( tested ) , { recursive : true } )
174+ writeFileSync ( tested , '' )
175+ writeFileSync ( untested , '' )
176+ onTestFinished ( ( ) => {
177+ rmSync ( root , { recursive : true , force : true } )
178+ } )
179+
180+ const provider = await initProvider ( { include : [ 'src/**' ] , root } )
181+ const untestedFiles = await provider . getUntestedFiles ( [ normalize ( tested ) ] )
182+
183+ expect ( untestedFiles . map ( ( file ) => relative ( root , file ) . replaceAll ( '\\' , '/' ) ) ) . toEqual ( [
184+ 'src/(app)/[id]/untested.ts' ,
185+ ] )
186+ } )
187+
167188async function init ( options : Partial < CoverageOptions > & { testInclude ?: string [ ] ; root ?: string } ) {
189+ const provider = await initProvider ( options )
190+
191+ return ( path : string ) => provider . isIncluded ( resolve ( process . cwd ( ) , path ) )
192+ }
193+
194+ async function initProvider (
195+ options : Partial < CoverageOptions > & { testInclude ?: string [ ] ; root ?: string } ,
196+ ) {
168197 const vitest = await createVitest (
169198 'test' ,
170199 {
@@ -184,7 +213,5 @@ async function init(options: Partial<CoverageOptions> & { testInclude?: string[]
184213 onTestFinished ( ( ) => vitest . close ( ) )
185214 await vitest . standalone ( )
186215
187- const provider = vitest . coverageProvider as unknown as BaseCoverageProvider
188-
189- return ( path : string ) => provider . isIncluded ( resolve ( process . cwd ( ) , path ) )
216+ return vitest . coverageProvider as unknown as BaseCoverageProvider
190217}
0 commit comments