Passed
Pull Request — master (#148)
by Mathieu
03:14
created

server/src/Application/HumanResource/Leave/Command/RefuseLeaveRequestCommandHandler.spec.ts   A

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 111
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 92
mnd 2
bc 2
fnc 0
dl 0
loc 111
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { mock, instance, when, verify, anything } from 'ts-mockito';
2
import { RefuseLeaveRequestCommandHandler } from './RefuseLeaveRequestCommandHandler';
3
import { LeaveRequestRepository } from 'src/Infrastructure/HumanResource/Leave/Repository/LeaveRequestRepository';
4
import { RefuseLeaveRequestCommand } from './RefuseLeaveRequestCommand';
5
import { User } from 'src/Domain/HumanResource/User/User.entity';
6
import { LeaveRequest } from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
7
import { DateUtilsAdapter } from 'src/Infrastructure/Adapter/DateUtilsAdapter';
8
import { LeaveRequestNotFoundException } from 'src/Domain/HumanResource/Leave/Exception/LeaveRequestNotFoundException';
9
import { LeaveRequestCantBeModeratedException } from 'src/Domain/HumanResource/Leave/Exception/LeaveRequestCantBeModeratedException';
10
import { CanLeaveRequestBeModerated } from 'src/Domain/HumanResource/Leave/Specification/CanLeaveRequestBeModerated';
11
12
describe('RefuseLeaveRequestCommandHandler', () => {
13
  let leaveRequestRepository: LeaveRequestRepository;
14
  let dateUtilsAdapter: DateUtilsAdapter;
15
  let canLeaveRequestBeModerated: CanLeaveRequestBeModerated;
16
  let handler: RefuseLeaveRequestCommandHandler;
17
18
  const user = mock(User);
19
  const leaveRequest = mock(LeaveRequest);
20
  const command = new RefuseLeaveRequestCommand(
21
    instance(user),
22
    'cfdd06eb-cd71-44b9-82c6-46110b30ce05',
23
    'Bad period'
24
  );
25
26
  beforeEach(() => {
27
    leaveRequestRepository = mock(LeaveRequestRepository);
28
    dateUtilsAdapter = mock(DateUtilsAdapter);
29
    canLeaveRequestBeModerated = mock(CanLeaveRequestBeModerated);
30
31
    handler = new RefuseLeaveRequestCommandHandler(
32
      instance(leaveRequestRepository),
33
      instance(dateUtilsAdapter),
34
      instance(canLeaveRequestBeModerated)
35
    );
36
  });
37
38
  it('testLeaveRequestNotNotFound', async () => {
39
    when(
40
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
41
    ).thenResolve(null);
42
43
    try {
44
      await handler.execute(command);
45
    } catch (e) {
46
      expect(e).toBeInstanceOf(LeaveRequestNotFoundException);
47
      expect(e.message).toBe('human_resources.leaves.requests.errors.not_found');
48
      verify(
49
        leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
50
      ).once();
51
      verify(
52
        canLeaveRequestBeModerated.isSatisfiedBy(anything(), anything())
53
      ).never();
54
      verify(leaveRequest.refuse(anything(), anything(), anything())).never();
55
      verify(leaveRequestRepository.save(anything())).never();
56
    }
57
  });
58
59
  it('testLeaveRequestCantBeRefused', async () => {
60
    when(
61
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
62
    ).thenResolve(instance(leaveRequest));
63
    when(
64
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
65
    ).thenReturn(false);
66
67
    try {
68
      await handler.execute(command);
69
    } catch (e) {
70
      expect(e).toBeInstanceOf(LeaveRequestCantBeModeratedException);
71
      expect(e.message).toBe('human_resources.leaves.requests.errors.cant_be_moderated');
72
      verify(
73
        canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
74
      ).once();
75
      verify(
76
        leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
77
      ).once();
78
      verify(leaveRequest.refuse(anything(), anything(), anything())).never();
79
      verify(leaveRequestRepository.save(anything())).never();
80
    }
81
  });
82
83
  it('testLeaveRequestSuccessfullyRefused', async () => {
84
    when(
85
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
86
    ).thenResolve(instance(leaveRequest));
87
    when(leaveRequest.getId()).thenReturn('cfdd06eb-cd71-44b9-82c6-46110b30ce05');
88
    when(
89
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
90
    ).thenReturn(true);
91
    when(dateUtilsAdapter.getCurrentDateToISOString()).thenReturn(
92
      '2020-09-10T00:00:00.000Z'
93
    );
94
95
    expect(await handler.execute(command)).toBe(
96
      'cfdd06eb-cd71-44b9-82c6-46110b30ce05'
97
    );
98
99
    verify(
100
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
101
    ).once();
102
    verify(
103
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
104
    ).once();
105
    verify(
106
      leaveRequest.refuse(instance(user), '2020-09-10T00:00:00.000Z', 'Bad period')
107
    ).calledBefore(leaveRequestRepository.save(instance(leaveRequest)));
108
    verify(leaveRequestRepository.save(instance(leaveRequest))).once();
109
  });
110
});
111