Skip to content

Commit 3ad4e59

Browse files
committed
tests: Added unit test for checklist item member use-cases
1 parent 6f32939 commit 3ad4e59

10 files changed

+440
-8
lines changed

api/src/application/use-cases/checklist-item-member/AddMemberToItemUseCase.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ class AddMemberToItemUseCase {
77
}
88

99
async execute(checklistItemId, availableMembersToBeAddedIds) {
10+
if (!checklistItemId) throw new Error('checklistItemId was not provided');
11+
if (availableMembersToBeAddedIds?.length === 0) return [];
12+
1013
const checklistItemMemberEntities = availableMembersToBeAddedIds.map(
1114
(pmId) =>
1215
new ChecklistItemMemberEntity({

api/src/application/use-cases/checklist-item-member/DeleteChecklistItemUseCase.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,21 @@ class DeleteChecklistItemUseCase {
44
}
55

66
async execute(checklistItemId, projectMemberId) {
7-
return this.checklistItemMemberRepository.delete(
7+
if (!checklistItemId) throw new Error('checklistItemId was not provided');
8+
if (!projectMemberId) throw new Error('projectMemberId was not provided');
9+
10+
const result = await this.checklistItemMemberRepository.delete(
811
checklistItemId,
912
projectMemberId,
1013
);
14+
15+
if (result === 0) {
16+
throw new Error(
17+
'Something went wrong removing the checklist item member',
18+
);
19+
}
20+
21+
return result;
1122
}
1223
}
1324

api/src/application/use-cases/checklist-item-member/GetAllByProjectMemberUseCase.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ class GetAllByProjectMemberUseCase {
77
}
88

99
async execute(checklistItemId, projectMemberIds) {
10-
if (!checklistItemId) throw boom.badData('checklistItemId is required');
11-
if (!Array.isArray(projectMemberIds) || projectMemberIds.length === 0)
12-
throw boom.badData('projectMemberIds must be a non-empty array');
10+
if (!checklistItemId)
11+
throw boom.badData('checklistItemId was not provided');
12+
if (!Array.isArray(projectMemberIds))
13+
throw boom.badData('projectMemberIds was not provided');
14+
if (projectMemberIds?.length === 0) return [];
1315

1416
const checklistItemMembers =
1517
await this.checklistItemMemberRepository.findAllByProjectMember(
1618
checklistItemId,
1719
projectMemberIds,
1820
);
19-
return checklistItemMembers.map(
20-
(member) => new ChecklistItemMemberDto(member),
21-
);
21+
return checklistItemMembers?.length > 0
22+
? checklistItemMembers.map((member) => new ChecklistItemMemberDto(member))
23+
: [];
2224
}
2325
}
2426

api/src/application/use-cases/checklist-item-member/GetAllItemMembersUseCase.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ class GetAllItemMembersUseCase {
66
}
77

88
async execute(checklistItemId) {
9+
if (!checklistItemId) throw new Error('checklistItemId was not provided');
10+
911
const checklistItemMembers =
1012
await this.checklistItemMemberRepository.findAll(checklistItemId);
1113

1214
return checklistItemMembers?.length > 0
1315
? checklistItemMembers.map((m) => {
14-
const formattedMembers = m.get({ plain: true });
16+
const formattedMembers = m?.get ? m.get({ plain: true }) : m;
1517
return new ChecklistItemMemberDto({
1618
...formattedMembers,
1719
name:

api/src/application/use-cases/checklist-item-member/GetItemMembersByIdsUseCase.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ class GetItemMembersByIdsUseCase {
66
}
77

88
async execute(checklistItemId, checklistItemMemberIds) {
9+
if (!checklistItemId) throw new Error('checklistItemId was not provided');
10+
if (checklistItemMemberIds?.length === 0) return [];
11+
912
const members = await this.checklistItemMemberRepository.getByIds(
1013
checklistItemId,
1114
checklistItemMemberIds,
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
jest.mock('uuid', () => ({
2+
v4: jest.fn(),
3+
}));
4+
5+
const { v4: uuid } = require('uuid');
6+
7+
const AddMemberToItemUseCase = require('../../../api/src/application/use-cases/checklist-item-member/AddMemberToItemUseCase');
8+
const ChecklistItemMemberDto = require('../../../api/src/application/dtos/checklist-item-member.dto');
9+
const {
10+
createChecklistItem,
11+
createChecklistItemMember,
12+
} = require('../../fake-data/fake-entities');
13+
14+
describe('AddMemberToItemUseCase', () => {
15+
const fakeChecklistItemId = createChecklistItem().id;
16+
const fakeChecklistItemMemberId = 'fake-uuid';
17+
18+
let availableMembersToBeAddedIds;
19+
let createdChecklistItemMembers;
20+
let mockChecklistItemMemberRepository;
21+
let addMemberToItemUseCase;
22+
23+
beforeAll(() => {
24+
uuid.mockReturnValue(fakeChecklistItemMemberId);
25+
});
26+
27+
beforeEach(() => {
28+
availableMembersToBeAddedIds = [createChecklistItemMember()];
29+
30+
createdChecklistItemMembers = [
31+
createChecklistItemMember({ id: fakeChecklistItemMemberId }),
32+
];
33+
34+
mockChecklistItemMemberRepository = {
35+
bulkCreate: jest.fn().mockResolvedValue(createdChecklistItemMembers),
36+
};
37+
38+
addMemberToItemUseCase = new AddMemberToItemUseCase({
39+
checklistItemMemberRepository: mockChecklistItemMemberRepository,
40+
});
41+
});
42+
43+
test('It should return a created checklist item member', async () => {
44+
const result = await addMemberToItemUseCase.execute(
45+
fakeChecklistItemId,
46+
availableMembersToBeAddedIds,
47+
);
48+
49+
expect(mockChecklistItemMemberRepository.bulkCreate).toHaveBeenCalledTimes(
50+
1,
51+
);
52+
expect(result).toMatchObject(
53+
createdChecklistItemMembers.map(
54+
(member) => new ChecklistItemMemberDto(member),
55+
),
56+
);
57+
});
58+
59+
test('It should return an error because checklistItemId was not provided', async () => {
60+
await expect(
61+
addMemberToItemUseCase.execute(null, availableMembersToBeAddedIds),
62+
).rejects.toThrow(/was not provided/);
63+
expect(mockChecklistItemMemberRepository.bulkCreate).not.toHaveBeenCalled();
64+
});
65+
66+
test('It should return an error because availableMembersToBeAddedIds is an empty array', async () => {
67+
const result = await addMemberToItemUseCase.execute(
68+
fakeChecklistItemId,
69+
[],
70+
);
71+
expect(mockChecklistItemMemberRepository.bulkCreate).not.toHaveBeenCalled();
72+
expect(result).toEqual([]);
73+
});
74+
75+
test('It should return an empty array because the create operation failed', async () => {
76+
mockChecklistItemMemberRepository.bulkCreate.mockResolvedValue([]);
77+
78+
const result = await addMemberToItemUseCase.execute(
79+
fakeChecklistItemId,
80+
availableMembersToBeAddedIds,
81+
);
82+
83+
expect(mockChecklistItemMemberRepository.bulkCreate).toHaveBeenCalledTimes(
84+
1,
85+
);
86+
expect(result).toEqual([]);
87+
});
88+
89+
afterEach(() => {
90+
jest.clearAllMocks();
91+
});
92+
});
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const DeleteChecklistItemUseCase = require('../../../api/src/application/use-cases/checklist-item-member/DeleteChecklistItemUseCase');
2+
const { createChecklistItem } = require('../../fake-data/fake-entities');
3+
4+
describe('DeleteChecklistItemUseCase', () => {
5+
const fakeChecklistItemId = createChecklistItem().id;
6+
const fakeProjectMemberId = 'fake-uuid';
7+
8+
let mockChecklistItemMemberRepository;
9+
let deleteChecklistItemUseCase;
10+
11+
beforeEach(() => {
12+
mockChecklistItemMemberRepository = {
13+
delete: jest.fn().mockResolvedValue(1),
14+
};
15+
16+
deleteChecklistItemUseCase = new DeleteChecklistItemUseCase({
17+
checklistItemMemberRepository: mockChecklistItemMemberRepository,
18+
});
19+
});
20+
21+
test('It should return a 1', async () => {
22+
const result = await deleteChecklistItemUseCase.execute(
23+
fakeChecklistItemId,
24+
fakeProjectMemberId,
25+
);
26+
27+
expect(mockChecklistItemMemberRepository.delete).toHaveBeenCalledTimes(1);
28+
expect(result).toBe(1);
29+
});
30+
31+
test('It should return an error because checklistItemId was not provided', async () => {
32+
await expect(
33+
deleteChecklistItemUseCase.execute(null, fakeProjectMemberId),
34+
).rejects.toThrow(/was not provided/);
35+
expect(mockChecklistItemMemberRepository.delete).not.toHaveBeenCalled();
36+
});
37+
38+
test('It should return an error because ProjectMemberId was not provided', async () => {
39+
await expect(
40+
deleteChecklistItemUseCase.execute(fakeChecklistItemId, null),
41+
).rejects.toThrow(/was not provided/);
42+
expect(mockChecklistItemMemberRepository.delete).not.toHaveBeenCalled();
43+
});
44+
45+
test('It should return an empty array because the create operation did not find anything', async () => {
46+
mockChecklistItemMemberRepository.delete.mockResolvedValue(0);
47+
48+
await expect(
49+
deleteChecklistItemUseCase.execute(
50+
fakeChecklistItemId,
51+
fakeProjectMemberId,
52+
),
53+
).rejects.toThrow(/Something went wrong/);
54+
expect(mockChecklistItemMemberRepository.delete).toHaveBeenCalledTimes(1);
55+
});
56+
57+
afterEach(() => {
58+
jest.clearAllMocks();
59+
});
60+
});
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
const GetAllByProjectMemberUseCase = require('../../../api/src/application/use-cases/checklist-item-member/GetAllByProjectMemberUseCase');
2+
const ChecklistItemMemberDto = require('../../../api/src/application/dtos/checklist-item-member.dto');
3+
const {
4+
createChecklistItem,
5+
createChecklistItemMember,
6+
createProjectMember,
7+
} = require('../../fake-data/fake-entities');
8+
9+
describe('GetAllByProjectMemberUseCase', () => {
10+
const fakeChecklistItemId = createChecklistItem().id;
11+
// const fakeChecklistItemMemberId = 'fake-uuid';
12+
13+
let fakeProjectMemberIds;
14+
let dbResponse;
15+
let mockChecklistItemMemberRepository;
16+
let getAllByProjectMemberUseCase;
17+
18+
beforeEach(() => {
19+
fakeProjectMemberIds = [createProjectMember().id, createProjectMember().id];
20+
dbResponse = [createChecklistItemMember(), createChecklistItemMember()];
21+
22+
mockChecklistItemMemberRepository = {
23+
findAllByProjectMember: jest.fn().mockResolvedValue(dbResponse),
24+
};
25+
26+
getAllByProjectMemberUseCase = new GetAllByProjectMemberUseCase({
27+
checklistItemMemberRepository: mockChecklistItemMemberRepository,
28+
});
29+
});
30+
31+
test('It should return a checklist item members', async () => {
32+
const result = await getAllByProjectMemberUseCase.execute(
33+
fakeChecklistItemId,
34+
fakeProjectMemberIds,
35+
);
36+
37+
expect(
38+
mockChecklistItemMemberRepository.findAllByProjectMember,
39+
).toHaveBeenCalledTimes(1);
40+
expect(result).toMatchObject(
41+
dbResponse.map((member) => new ChecklistItemMemberDto(member)),
42+
);
43+
});
44+
45+
test('It should return an error because ProjectMemberIds was not provided', async () => {
46+
await expect(
47+
getAllByProjectMemberUseCase.execute(null, fakeProjectMemberIds),
48+
).rejects.toThrow(/was not provided/);
49+
expect(
50+
mockChecklistItemMemberRepository.findAllByProjectMember,
51+
).not.toHaveBeenCalled();
52+
});
53+
54+
test('It should return an error because ProjectMemberIds was not provided', async () => {
55+
await expect(
56+
getAllByProjectMemberUseCase.execute(fakeChecklistItemId, {}),
57+
).rejects.toThrow(/was not provided/);
58+
expect(
59+
mockChecklistItemMemberRepository.findAllByProjectMember,
60+
).not.toHaveBeenCalled();
61+
});
62+
63+
test('It should return an error because ProjectMemberIds was not provided', async () => {
64+
const result = await getAllByProjectMemberUseCase.execute(
65+
fakeChecklistItemId,
66+
[],
67+
);
68+
69+
expect(
70+
mockChecklistItemMemberRepository.findAllByProjectMember,
71+
).not.toHaveBeenCalled();
72+
expect(result).toEqual([]);
73+
});
74+
75+
test('It should return an empty array because the create operation did not find anything', async () => {
76+
mockChecklistItemMemberRepository.findAllByProjectMember.mockResolvedValue(
77+
[],
78+
);
79+
80+
const result = await getAllByProjectMemberUseCase.execute(
81+
fakeChecklistItemId,
82+
fakeProjectMemberIds,
83+
);
84+
85+
expect(
86+
mockChecklistItemMemberRepository.findAllByProjectMember,
87+
).toHaveBeenCalledTimes(1);
88+
expect(result).toEqual([]);
89+
});
90+
91+
afterEach(() => {
92+
jest.clearAllMocks();
93+
});
94+
});

0 commit comments

Comments
 (0)