From 4cd1d3ce4478af78a5da07af9e4d1c4ca8b1a901 Mon Sep 17 00:00:00 2001 From: dsyddall Date: Tue, 31 Oct 2023 11:19:14 +0000 Subject: [PATCH] fix: support accessing fixture at same index of dependency fixture (#4387) --- packages/runner/src/fixture.ts | 2 +- packages/runner/src/types/tasks.ts | 29 +++++-------------- test/core/test/fixture-initialization.test.ts | 17 +++++++++++ test/core/test/test-extend.test.ts | 4 +++ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 6722b5792000..19b5f0092c9b 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -37,7 +37,7 @@ export function mergeContextFixtures(fixtures: Record, context: { f if (fixture.isFn) { const usedProps = getUsedProps(fixture.value) if (usedProps.length) - fixture.deps = context.fixtures!.filter(({ index, prop }) => index !== fixture.index && usedProps.includes(prop)) + fixture.deps = context.fixtures!.filter(({ prop }) => prop !== fixture.prop && usedProps.includes(prop)) } }) diff --git a/packages/runner/src/types/tasks.ts b/packages/runner/src/types/tasks.ts index c893067de42f..275d109138d7 100644 --- a/packages/runner/src/types/tasks.ts +++ b/packages/runner/src/types/tasks.ts @@ -200,28 +200,15 @@ export type TestAPI = ChainableTestAPI & Extend K extends keyof ExtraContext ? ExtraContext[K] : never }> } -type FixtureType = T extends (context: any, use: (fixture: infer F) => any) => any ? F : T -export type Fixture< - T, - K extends keyof T, - OnlyFunction, - ExtraContext = {}, - V = FixtureType, - FN = ( - context: { - [P in keyof T | keyof ExtraContext as P extends K ? - P extends keyof ExtraContext ? P : never : P - ]: - K extends P ? K extends keyof ExtraContext ? ExtraContext[K] : V : - P extends keyof T ? T[P] : never - } & TestContext, - use: (fixture: V) => Promise - ) => Promise, -> = OnlyFunction extends true ? FN : (FN | V) +export type Use = (value: T) => Promise +export type FixtureFn = + (context: Omit & ExtraContext, use: Use) => Promise +export type Fixture = + ((...args: any) => any) extends T[K] + ? (T[K] extends any ? FixtureFn>> : never) + : T[K] | (T[K] extends any ? FixtureFn>> : never) export type Fixtures, ExtraContext = {}> = { - [K in keyof T]: Fixture -} | { - [K in keyof T]: Fixture + [K in keyof T]: Fixture> } export type InferFixturesTypes = T extends TestAPI ? C : T diff --git a/test/core/test/fixture-initialization.test.ts b/test/core/test/fixture-initialization.test.ts index 4b7e1c0385c1..e0b50f90b97f 100644 --- a/test/core/test/fixture-initialization.test.ts +++ b/test/core/test/fixture-initialization.test.ts @@ -1,3 +1,4 @@ +import type { Use } from '@vitest/runner' import { describe, expect, expectTypeOf, test, vi } from 'vitest' interface Fixtures { @@ -127,4 +128,20 @@ describe('fixture initialization', () => { expect(fnD).toBeCalledTimes(1) }) }) + + describe('fixture dependency', () => { + const myTest = test + .extend({ a: 1 }) + .extend({ + b: async ({ a }, use: Use) => { + expectTypeOf(a).toEqualTypeOf() + await use(a * 2) + }, + }) + + myTest('b => a', ({ b }) => { + expectTypeOf(b).toEqualTypeOf() + expect(b).toBe(2) + }) + }) }) diff --git a/test/core/test/test-extend.test.ts b/test/core/test/test-extend.test.ts index 85d3c232393a..e0ad9fe85d2e 100644 --- a/test/core/test/test-extend.test.ts +++ b/test/core/test/test-extend.test.ts @@ -47,6 +47,7 @@ describe('test.extend()', () => { string: string any: any boolean: boolean + func: (a: number, b: string) => void } const typesTest = test.extend({ @@ -59,6 +60,9 @@ describe('test.extend()', () => { await use({}) }, boolean: true, + func: async ({}, use): Promise => { + await use(() => undefined) + }, }) expectTypeOf(typesTest).toEqualTypeOf>>()