Skip to content

Commit 229eb54

Browse files
authored
Merge pull request #3 from BeerMoneyDev/AddTests
refactor(Nest-Monk): Add Unit tests.
2 parents e253d8c + 7f1faae commit 229eb54

19 files changed

+724
-12
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,4 @@
188188
]
189189
]
190190
}
191-
}
191+
}

src/lib/class-transformer.middleware.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ export function classTransformerMiddlewareFactory<T>(type: ModelType<T>) {
1111
} catch (ex) {
1212
res = null;
1313
const error = ex as Error;
14-
new Logger('classTransformerMiddlewareFactory').error(ex.message, ex.stack);
14+
new Logger('classTransformerMiddlewareFactory').error(
15+
error.message,
16+
error.stack,
17+
);
1518
}
1619
}
1720
return res;

src/lib/decorators.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Inject, Type } from '@nestjs/common';
1+
import { Inject } from '@nestjs/common';
22
import { createMonkCollectionToken, createMonkRepositoryToken } from './tokens';
33
import { ModelType, ModelOptions } from './types';
44

src/lib/monk.module.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,15 @@ export class MonkModule {
146146
private static createCollectionProviders = (
147147
collections?: Array<ModelType<any>>,
148148
): FactoryProvider<Promise<ICollection<any>>>[] => {
149-
return (collections ?? []).map((f) => {
149+
return (collections ?? []).map(f => {
150150
return {
151151
provide: createMonkCollectionToken(f),
152152
useFactory: async (database: string, options: MonkOptions) => {
153153
const modelOptions = ModelRegistrations.get(f);
154154
const collectionName = modelOptions?.collectionName?.length
155155
? ModelRegistrations.get(f).collectionName
156156
: `${snakeCase(f.name)}s`;
157-
return await monk(database, options).then((db) => {
157+
return await monk(database, options).then(db => {
158158
db.addMiddleware(classTransformerMiddlewareFactory(f));
159159
const collection = db.get(collectionName);
160160
if (collection) {

src/lib/repository.service.spec.ts

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import { ICollection, id as convertToMongoId } from 'monk';
2+
import { Repository } from './repository.service';
3+
4+
describe('Repository', () => {
5+
let repo: Repository<PersonTest>;
6+
let collection: ICollection<PersonTest>;
7+
let findOneMock: jest.SpyInstance<Promise<PersonTest>, any[]>;
8+
let findMock: jest.SpyInstance<Promise<PersonTest[]>, any[]>;
9+
let insertMock: jest.SpyInstance<Promise<PersonTest>, any[]>;
10+
let removeMock: jest.SpyInstance<
11+
Promise<{
12+
deletedCount: number;
13+
result: {
14+
n: number;
15+
ok: 0 | 1;
16+
};
17+
}>,
18+
any[]
19+
>;
20+
let findOneAndUpdateMock: jest.SpyInstance<Promise<PersonTest>, any[]>;
21+
22+
beforeEach(async () => {
23+
collection = {
24+
findOne: () => null,
25+
find: () => null,
26+
insert: () => null,
27+
remove: () => null,
28+
findOneAndUpdate: () => null,
29+
} as any;
30+
findOneMock = jest.spyOn(collection, 'findOne') as any;
31+
findMock = jest.spyOn(collection, 'find') as any;
32+
insertMock = jest.spyOn(collection, 'insert') as any;
33+
removeMock = jest.spyOn(collection, 'remove') as any;
34+
findOneAndUpdateMock = jest.spyOn(collection, 'findOneAndUpdate') as any;
35+
repo = new Repository(collection);
36+
});
37+
38+
it('getById() should invoke monk collection.findOne()', async () => {
39+
const id = '507f191e810c19729de860ea';
40+
findOneMock.mockReturnValue(Promise.resolve(getMockPersonTest()));
41+
const response = await repo.getById(id);
42+
expect(response).toEqual(getMockPersonTest());
43+
expect(findOneMock).toHaveBeenCalledTimes(1);
44+
expect(findOneMock).toHaveBeenCalledWith({
45+
_id: convertToMongoId(id).toHexString(),
46+
});
47+
});
48+
49+
it('list() should invoke monk collection.find()', async () => {
50+
const id = '507f191e810c19729de860ea';
51+
findMock.mockReturnValue(Promise.resolve([getMockPersonTest()]));
52+
const response = await repo.list({
53+
_id: convertToMongoId(id).toHexString(),
54+
});
55+
expect(response).toEqual([getMockPersonTest()]);
56+
expect(findMock).toHaveBeenCalledTimes(1);
57+
expect(findMock).toHaveBeenCalledWith({
58+
_id: convertToMongoId(id).toHexString(),
59+
});
60+
});
61+
62+
it('add() should invoke monk collection.insert()', async () => {
63+
const personTest = getMockPersonTest();
64+
insertMock.mockReturnValue(Promise.resolve(personTest));
65+
const response = await repo.add(personTest);
66+
expect(response).toEqual(getMockPersonTest());
67+
expect(insertMock).toHaveBeenCalledTimes(1);
68+
expect(insertMock).toHaveBeenCalledWith(personTest);
69+
});
70+
71+
it('delete() should invoke monk collection.remove()', async () => {
72+
const mockDeleteResponse = {
73+
deletedCount: 1,
74+
result: {
75+
n: 1,
76+
ok: 1 as any,
77+
},
78+
};
79+
removeMock.mockReturnValue(Promise.resolve(mockDeleteResponse));
80+
const id = '507f191e810c19729de860ea';
81+
const response = await repo.delete(id);
82+
expect(response).toEqual(mockDeleteResponse);
83+
expect(removeMock).toHaveBeenCalledTimes(1);
84+
expect(removeMock).toHaveBeenCalledWith({
85+
_id: convertToMongoId(id).toHexString(),
86+
});
87+
});
88+
89+
it('edit() should invoke monk collection.findOneAndUpdateMock() and only set certain properties', async () => {
90+
const personTest = getMockPersonTest();
91+
const id = '507f191e810c19729de860ea';
92+
findOneAndUpdateMock.mockReturnValue(Promise.resolve(personTest));
93+
const response = await repo.edit(id, personTest, ['profession', 'sex']);
94+
expect(response).toEqual(personTest);
95+
expect(findOneAndUpdateMock).toHaveBeenCalledTimes(1);
96+
expect(findOneAndUpdateMock).toHaveBeenCalledWith(
97+
{ _id: convertToMongoId(id).toHexString() },
98+
{ $set: { profession: 'Software Engineer', sex: 'M' } },
99+
);
100+
});
101+
102+
it('edit() should invoke monk collection.findOneAndUpdateMock() and set all properties', async () => {
103+
const personTest = getMockPersonTest();
104+
const id = '507f191e810c19729de860ea';
105+
findOneAndUpdateMock.mockReturnValue(Promise.resolve(personTest));
106+
const response = await repo.edit(id, personTest);
107+
expect(response).toEqual(personTest);
108+
expect(findOneAndUpdateMock).toHaveBeenCalledTimes(1);
109+
expect(findOneAndUpdateMock).toHaveBeenCalledWith(
110+
{ _id: convertToMongoId(id).toHexString() },
111+
{ $set: personTest },
112+
);
113+
});
114+
});
115+
116+
function getMockPersonTest(): PersonTest {
117+
return {
118+
name: 'Ben',
119+
dob: new Date('1988-12-30'),
120+
sex: 'M',
121+
profession: 'Software Engineer',
122+
};
123+
}
124+
125+
class PersonTest {
126+
name: string;
127+
dob: Date;
128+
sex: 'M' | 'F';
129+
profession: string;
130+
}

src/lib/repository.service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export class Repository<T> {
77
return this.collection.findOne({ _id: convertToMongoId(id).toHexString() });
88
}
99

10-
list(query: string | Object) {
10+
list(query: string | { [key: string]: any }) {
1111
return this.collection.find(query);
1212
}
1313

src/lib/types.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export type AsyncProvider<T> =
1919
| Omit<ValueProvider<T>, 'provide'>;
2020

2121
export interface MonkOptions {
22-
collectionOptions?: Object;
22+
collectionOptions?: any;
2323
poolSize?: number;
2424
ssl?: boolean;
2525
sslValidate?: boolean;
@@ -50,8 +50,8 @@ export interface MonkOptions {
5050
raw?: boolean;
5151
promoteLongs?: boolean;
5252
bufferMaxEntries?: number;
53-
readPreference?: Object | null;
54-
pkFactory?: Object | null;
55-
promiseLibrary?: Object | null;
56-
readConcern?: Object | null;
53+
readPreference?: any;
54+
pkFactory?: any;
55+
promiseLibrary?: any;
56+
readConcern?: any;
5757
}

test/coverage/clover.xml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<coverage generated="1615482828422" clover="3.2.0">
3+
<project timestamp="1615482828422" name="All files">
4+
<metrics statements="0" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0" elements="0" coveredelements="0" complexity="0" loc="0" ncloc="0" packages="0" files="0" classes="0"/>
5+
</project>
6+
</coverage>

test/coverage/coverage-final.json

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

0 commit comments

Comments
 (0)