Skip to content

Commit 512e150

Browse files
committed
feat(registerMock): allow use of mocked generics in register mock factory
1 parent 46bcc06 commit 512e150

File tree

3 files changed

+93
-3
lines changed

3 files changed

+93
-3
lines changed

src/register-mock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { NoTransformerError } from './errors/no-transformer.error';
22

33
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4-
export function registerMock<T extends object>(factory: () => T): void {
4+
export function registerMock<T extends object>(factory: (...args) => T): void {
55
throw new Error(NoTransformerError);
66
}

src/transformer/mockDefiner/mockDefiner.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import { GetProperties } from '../descriptor/properties/properties';
88
import { GetTypeofEnumDescriptor } from '../descriptor/typeQuery/enumTypeQuery';
99
import { TypescriptCreator } from '../helper/creator';
1010
import { createImportOnIdentifier } from '../helper/import';
11-
import { MockIdentifierGenericParameter } from '../mockIdentifier/mockIdentifier';
11+
import {
12+
MockIdentifierGenericParameter,
13+
MockIdentifierGenericParameterValue,
14+
} from '../mockIdentifier/mockIdentifier';
1215
import { PrivateIdentifier } from '../privateIdentifier/privateIdentifier';
1316
import { Scope } from '../scope/scope';
1417
import { DeclarationCache } from './cache/declarationCache';
@@ -194,7 +197,11 @@ export class MockDefiner {
194197

195198
this._registerMockFactoryCache.set(declaration, key);
196199

197-
return this._getCallRegisterMock(this._fileName, key, factory);
200+
return this._getCallRegisterMock(
201+
this._fileName,
202+
key,
203+
this._wrapRegisterMockFactory(factory)
204+
);
198205
}
199206

200207
public hasMockForDeclaration(declaration: ts.Declaration): boolean {
@@ -358,6 +365,34 @@ export class MockDefiner {
358365
);
359366
}
360367

368+
private _wrapRegisterMockFactory(factory: ts.Expression): ts.Expression {
369+
return TypescriptCreator.createArrowFunction(
370+
TypescriptCreator.createCall(factory, [
371+
ts.createSpread(
372+
TypescriptCreator.createCall(
373+
ts.createPropertyAccess(
374+
ts.createIdentifier('generics'),
375+
ts.createIdentifier('map')
376+
),
377+
[
378+
TypescriptCreator.createArrowFunction(
379+
TypescriptCreator.createCall(
380+
ts.createPropertyAccess(
381+
ts.createIdentifier('g'),
382+
MockIdentifierGenericParameterValue
383+
),
384+
[]
385+
),
386+
[TypescriptCreator.createParameter('g')]
387+
),
388+
]
389+
)
390+
),
391+
]),
392+
[TypescriptCreator.createParameter('generics')]
393+
);
394+
}
395+
361396
private _getCallRegisterMock(
362397
fileName: string,
363398
key: string,
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { createMock, registerMock } from 'ts-auto-mock';
2+
3+
describe('registerMock of type with generics', () => {
4+
it('should provide mocked version of generics as parameters', () => {
5+
type GenericsType<T> = {
6+
internalProp: T;
7+
};
8+
9+
type GenericsInterface<T, K> = {
10+
internalProp: T;
11+
internalProp2: K;
12+
};
13+
14+
type GenericsInterface2<T, K> = {
15+
internalProp: T;
16+
internalProp2: K;
17+
};
18+
19+
interface AParentInterface {
20+
prop: GenericsType<string>;
21+
prop2: GenericsInterface<number, 'Test'>;
22+
prop3: GenericsInterface2<string, GenericsType<string>>;
23+
}
24+
25+
registerMock<GenericsType<unknown>>((generic: unknown) => ({
26+
internalProp: (generic as object).toString() + '-mocked',
27+
}));
28+
29+
registerMock<GenericsInterface<unknown, unknown>>(
30+
(genericNumber: unknown, genericString: unknown) => ({
31+
internalProp: (genericNumber as number) + 5,
32+
internalProp2: (genericString as object).toString() + '-mocked',
33+
})
34+
);
35+
36+
registerMock<GenericsInterface2<unknown, unknown>>(
37+
(genericString: unknown, genericObject: unknown) => {
38+
(genericObject as GenericsType<string>).internalProp += '-mocked';
39+
return {
40+
internalProp: (genericString as object).toString() + '-mocked',
41+
internalProp2: genericObject,
42+
};
43+
}
44+
);
45+
const mock: AParentInterface = createMock<AParentInterface>();
46+
47+
expect(mock.prop.internalProp).toBe('-mocked');
48+
expect(mock.prop2.internalProp).toBe(5);
49+
expect(mock.prop2.internalProp2).toBe('Test-mocked');
50+
expect(mock.prop3.internalProp).toBe('-mocked');
51+
expect(mock.prop3.internalProp2).toEqual({
52+
internalProp: '-mocked-mocked',
53+
});
54+
});
55+
});

0 commit comments

Comments
 (0)