Skip to content

Commit

Permalink
feat!: rename mock types to match jest's (#1525)
Browse files Browse the repository at this point in the history
* feat: rename mock types to match jest's

* chore: cleaup

* chore: expose types
  • Loading branch information
sheremet-va committed Jun 24, 2022
1 parent 7546f29 commit 223e81c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 15 deletions.
46 changes: 33 additions & 13 deletions packages/vitest/src/integrations/spy.ts
Expand Up @@ -16,7 +16,7 @@ interface MockResultThrow {

type MockResult<T> = MockResultReturn<T> | MockResultThrow | MockResultIncomplete

export interface SpyContext<TArgs, TReturns> {
export interface MockContext<TArgs, TReturns> {
calls: TArgs[]
instances: TReturns[]
invocationCallOrder: number[]
Expand All @@ -37,11 +37,9 @@ type Classes<T> = {
}[keyof T] & (string | symbol)

export interface SpyInstance<TArgs extends any[] = any[], TReturns = any> {
(...args: TArgs): TReturns

getMockName(): string
mockName(n: string): this
mock: SpyContext<TArgs, TReturns>
mock: MockContext<TArgs, TReturns>
mockClear(): this
mockReset(): this
mockRestore(): void
Expand All @@ -57,20 +55,22 @@ export interface SpyInstance<TArgs extends any[] = any[], TReturns = any> {
mockRejectedValueOnce(obj: any): this
}

export interface SpyInstanceFn<TArgs extends any[] = any, TReturns = any> extends SpyInstance<TArgs, TReturns> {
(...args: TArgs): TReturns
export interface MockInstance<A extends any[] = any[], R = any> extends SpyInstance<A, R> {}

export interface Mock<TArgs extends any[] = any, TReturns = any> extends SpyInstance<TArgs, TReturns> {
new (...args: TArgs): TReturns
(...args: TArgs): TReturns
}

export type MaybeMockedConstructor<T> = T extends new (
...args: Array<any>
) => infer R
? SpyInstanceFn<ConstructorParameters<T>, R>
? Mock<ConstructorParameters<T>, R>
: T
export type MockedFunction<T extends Procedure> = SpyInstanceFn<Parameters<T>, ReturnType<T>> & {
export type MockedFunction<T extends Procedure> = Mock<Parameters<T>, ReturnType<T>> & {
[K in keyof T]: T[K];
}
export type MockedFunctionDeep<T extends Procedure> = SpyInstanceFn<Parameters<T>, ReturnType<T>> & MockedObjectDeep<T>
export type MockedFunctionDeep<T extends Procedure> = Mock<Parameters<T>, ReturnType<T>> & MockedObjectDeep<T>
export type MockedObject<T> = MaybeMockedConstructor<T> & {
[K in Methods<T>]: T[K] extends Procedure
? MockedFunction<T[K]>
Expand All @@ -94,6 +94,26 @@ export type MaybeMocked<T> = T extends Procedure
? MockedObject<T>
: T

interface Constructable {
new (...args: any[]): any
}

export type MockedClass<T extends Constructable> = MockInstance<
InstanceType<T>,
T extends new (...args: infer P) => any ? P : never
> & {
prototype: T extends { prototype: any } ? Mocked<T['prototype']> : never
} & T

export type Mocked<T> = {
[P in keyof T]: T[P] extends (...args: infer Args) => infer Returns
? MockInstance<Args, Returns>
: T[P] extends Constructable
? MockedClass<T[P]>
: T[P]
} &
T

export type EnhancedSpy<TArgs extends any[] = any[], TReturns = any> = SpyInstance<TArgs, TReturns> & SpyImpl<TArgs, TReturns>

export const spies = new Set<SpyInstance>()
Expand Down Expand Up @@ -244,12 +264,12 @@ function enhanceSpy<TArgs extends any[], TReturns>(
return stub as any
}

export function fn<TArgs extends any[] = any[], R = any>(): SpyInstanceFn<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(): Mock<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(
implementation: (...args: TArgs) => R
): SpyInstanceFn<TArgs, R>
): Mock<TArgs, R>
export function fn<TArgs extends any[] = any[], R = any>(
implementation?: (...args: TArgs) => R,
): SpyInstanceFn<TArgs, R> {
return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as SpyInstanceFn
): Mock<TArgs, R> {
return enhanceSpy(tinyspy.spyOn({ fn: implementation || (() => {}) }, 'fn')) as unknown as Mock
}
7 changes: 5 additions & 2 deletions packages/vitest/src/types/index.ts
Expand Up @@ -14,6 +14,9 @@ export type {
MockedFunction,
MockedObject,
SpyInstance,
SpyInstanceFn,
SpyContext,
MockInstance,
Mock,
MockContext,
Mocked,
MockedClass,
} from '../integrations/spy'

0 comments on commit 223e81c

Please sign in to comment.