Skip to content

Commit 4cd1d3c

Browse files
authoredOct 31, 2023
fix: support accessing fixture at same index of dependency fixture (#4387)
1 parent b8ca387 commit 4cd1d3c

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed
 

Diff for: ‎packages/runner/src/fixture.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export function mergeContextFixtures(fixtures: Record<string, any>, context: { f
3737
if (fixture.isFn) {
3838
const usedProps = getUsedProps(fixture.value)
3939
if (usedProps.length)
40-
fixture.deps = context.fixtures!.filter(({ index, prop }) => index !== fixture.index && usedProps.includes(prop))
40+
fixture.deps = context.fixtures!.filter(({ prop }) => prop !== fixture.prop && usedProps.includes(prop))
4141
}
4242
})
4343

Diff for: ‎packages/runner/src/types/tasks.ts

+8-21
Original file line numberDiff line numberDiff line change
@@ -200,28 +200,15 @@ export type TestAPI<ExtraContext = {}> = ChainableTestAPI<ExtraContext> & Extend
200200
K extends keyof ExtraContext ? ExtraContext[K] : never }>
201201
}
202202

203-
type FixtureType<T> = T extends (context: any, use: (fixture: infer F) => any) => any ? F : T
204-
export type Fixture<
205-
T,
206-
K extends keyof T,
207-
OnlyFunction,
208-
ExtraContext = {},
209-
V = FixtureType<T[K]>,
210-
FN = (
211-
context: {
212-
[P in keyof T | keyof ExtraContext as P extends K ?
213-
P extends keyof ExtraContext ? P : never : P
214-
]:
215-
K extends P ? K extends keyof ExtraContext ? ExtraContext[K] : V :
216-
P extends keyof T ? T[P] : never
217-
} & TestContext,
218-
use: (fixture: V) => Promise<void>
219-
) => Promise<void>,
220-
> = OnlyFunction extends true ? FN : (FN | V)
203+
export type Use<T> = (value: T) => Promise<void>
204+
export type FixtureFn<T, K extends keyof T, ExtraContext> =
205+
(context: Omit<T, K> & ExtraContext, use: Use<T[K]>) => Promise<void>
206+
export type Fixture<T, K extends keyof T, ExtraContext = {}> =
207+
((...args: any) => any) extends T[K]
208+
? (T[K] extends any ? FixtureFn<T, K, Omit<ExtraContext, Exclude<keyof T, K>>> : never)
209+
: T[K] | (T[K] extends any ? FixtureFn<T, K, Omit<ExtraContext, Exclude<keyof T, K>>> : never)
221210
export type Fixtures<T extends Record<string, any>, ExtraContext = {}> = {
222-
[K in keyof T]: Fixture<T, K, false, ExtraContext>
223-
} | {
224-
[K in keyof T]: Fixture<T, K, true, ExtraContext>
211+
[K in keyof T]: Fixture<T, K, ExtraContext & ExtendedContext<Test>>
225212
}
226213

227214
export type InferFixturesTypes<T> = T extends TestAPI<infer C> ? C : T

Diff for: ‎test/core/test/fixture-initialization.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Use } from '@vitest/runner'
12
import { describe, expect, expectTypeOf, test, vi } from 'vitest'
23

34
interface Fixtures {
@@ -127,4 +128,20 @@ describe('fixture initialization', () => {
127128
expect(fnD).toBeCalledTimes(1)
128129
})
129130
})
131+
132+
describe('fixture dependency', () => {
133+
const myTest = test
134+
.extend({ a: 1 })
135+
.extend({
136+
b: async ({ a }, use: Use<number>) => {
137+
expectTypeOf(a).toEqualTypeOf<number>()
138+
await use(a * 2)
139+
},
140+
})
141+
142+
myTest('b => a', ({ b }) => {
143+
expectTypeOf(b).toEqualTypeOf<number>()
144+
expect(b).toBe(2)
145+
})
146+
})
130147
})

Diff for: ‎test/core/test/test-extend.test.ts

+4
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ describe('test.extend()', () => {
4747
string: string
4848
any: any
4949
boolean: boolean
50+
func: (a: number, b: string) => void
5051
}
5152

5253
const typesTest = test.extend<TypesContext>({
@@ -59,6 +60,9 @@ describe('test.extend()', () => {
5960
await use({})
6061
},
6162
boolean: true,
63+
func: async ({}, use): Promise<void> => {
64+
await use(() => undefined)
65+
},
6266
})
6367

6468
expectTypeOf(typesTest).toEqualTypeOf<TestAPI<InferFixturesTypes<typeof typesTest>>>()

0 commit comments

Comments
 (0)
Please sign in to comment.