Skip to content

Commit f92c7de

Browse files
committed
test: add test for virtuals factory
1 parent e70232a commit f92c7de

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed

tests/e2e/virtual.factory.spec.ts

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import * as mongoose from 'mongoose';
2+
import { TypeMetadataStorage } from '../../lib/storages/type-metadata.storage';
3+
import { VirtualMetadataInterface } from '../../lib/metadata/virtual-metadata.interface';
4+
import { VirtualsFactory } from '../../lib';
5+
6+
describe('VirtualsFactory', () => {
7+
// Mock schema & model
8+
9+
const setVirtualSetterFunctionMock = jest.fn();
10+
const setVirtualGetterFunctionMock = jest.fn();
11+
const schemaMock = {
12+
virtual: jest.fn(() => ({
13+
get: setVirtualGetterFunctionMock,
14+
set: setVirtualSetterFunctionMock,
15+
})),
16+
} as any;
17+
18+
const targetConstructorMock = jest.fn();
19+
20+
// Mock virtuals
21+
22+
const virtualOptionsMock = {
23+
ref: 'collectionNameMock',
24+
localField: 'localFieldMockValue',
25+
foreignField: 'foreignFieldMockValue',
26+
};
27+
28+
const virtualMetadataWithOnlyRequiredAttributesMock = {
29+
target: targetConstructorMock,
30+
name: 'attribute1Mock',
31+
};
32+
33+
const virtualMetadataNotLikedToModelMock = {
34+
target: jest.fn(),
35+
name: 'attribute1Mock',
36+
};
37+
38+
const virtualMetadataWithOptionsMock = {
39+
target: targetConstructorMock,
40+
name: 'virtualMetadataWithOptionsMock',
41+
options: virtualOptionsMock,
42+
};
43+
44+
const virtualMetadataWithGetterMock = {
45+
target: targetConstructorMock,
46+
name: 'virtualMetadataWithGetterMock',
47+
options: virtualOptionsMock,
48+
getter: jest.fn(),
49+
};
50+
51+
const virtualMetadataWithSetterMock = {
52+
target: targetConstructorMock,
53+
name: 'virtualMetadataWithSetterMock',
54+
options: virtualOptionsMock,
55+
setter: jest.fn(),
56+
};
57+
58+
const virtualMetadataWithGetterSetterMock = {
59+
target: targetConstructorMock,
60+
name: 'virtualMetadataWithGetterSetterMock',
61+
options: virtualOptionsMock,
62+
getter: jest.fn(),
63+
setter: jest.fn(),
64+
};
65+
66+
beforeEach(() => {
67+
(schemaMock.virtual as any) = jest.fn(() => ({
68+
get: setVirtualGetterFunctionMock,
69+
set: setVirtualSetterFunctionMock,
70+
}));
71+
});
72+
73+
afterEach(() => {
74+
jest.resetAllMocks();
75+
});
76+
77+
describe('Schema virtual definition', () => {
78+
it('should not define virtuals if there is no stored virtual definition', () => {
79+
// arrange
80+
TypeMetadataStorage['virtuals'] = [];
81+
82+
// Act
83+
VirtualsFactory.createForClass(targetConstructorMock, schemaMock);
84+
85+
// Assert
86+
expect(schemaMock.virtual).toHaveBeenCalledTimes(0);
87+
});
88+
89+
it('should not define virtuals if there is no stored virtual definition linked to schema model', () => {
90+
// arrange
91+
TypeMetadataStorage['virtuals'] = [virtualMetadataNotLikedToModelMock];
92+
93+
// Act
94+
VirtualsFactory.createForClass(targetConstructorMock, schemaMock);
95+
96+
// Assert
97+
expect(schemaMock.virtual).toHaveBeenCalledTimes(0);
98+
});
99+
100+
it('should defines virtual for each stored virtualMetadata linked to schema model', () => {
101+
// arrange
102+
TypeMetadataStorage['virtuals'] = [
103+
virtualMetadataWithOnlyRequiredAttributesMock,
104+
virtualMetadataNotLikedToModelMock,
105+
virtualMetadataWithOptionsMock,
106+
];
107+
108+
// Act
109+
VirtualsFactory.createForClass(targetConstructorMock, schemaMock);
110+
111+
// Assert
112+
expect(schemaMock.virtual['mock'].calls).toEqual([
113+
[virtualMetadataWithOnlyRequiredAttributesMock.name, undefined],
114+
[
115+
virtualMetadataWithOptionsMock.name,
116+
virtualMetadataWithOptionsMock.options,
117+
],
118+
]);
119+
});
120+
});
121+
122+
describe('Schema virtual getter/setter definition', () => {
123+
it('should not call the getter/setter definition method if no getter/setter defined in the stored virtual metadata linked to the schema model', () => {
124+
// arrange
125+
TypeMetadataStorage['virtuals'] = [
126+
virtualMetadataWithOptionsMock,
127+
] as VirtualMetadataInterface[];
128+
129+
// Act
130+
VirtualsFactory.createForClass(targetConstructorMock, schemaMock);
131+
132+
// Assert
133+
expect(setVirtualGetterFunctionMock).toHaveBeenCalledTimes(0);
134+
expect(setVirtualSetterFunctionMock).toHaveBeenCalledTimes(0);
135+
});
136+
137+
it('should call the getter/setter definition method for each stored virtuals metadata with defined getter/setter linked to the schema model', () => {
138+
// arrange
139+
TypeMetadataStorage['virtuals'] = [
140+
virtualMetadataWithOptionsMock,
141+
virtualMetadataWithGetterMock,
142+
virtualMetadataWithSetterMock,
143+
virtualMetadataWithGetterSetterMock,
144+
] as VirtualMetadataInterface[];
145+
146+
// Act
147+
VirtualsFactory.createForClass(targetConstructorMock, schemaMock);
148+
149+
// Assert
150+
// expect(setVirtualGetterFunctionMock).toHaveBeenNthCalledWith(1,)
151+
expect(setVirtualGetterFunctionMock.mock.calls).toEqual([
152+
[virtualMetadataWithGetterMock.getter],
153+
[virtualMetadataWithGetterSetterMock.getter],
154+
]);
155+
expect(setVirtualSetterFunctionMock.mock.calls).toEqual([
156+
[virtualMetadataWithSetterMock.setter],
157+
[virtualMetadataWithGetterSetterMock.setter],
158+
]);
159+
});
160+
});
161+
});

0 commit comments

Comments
 (0)