Passed
Pull Request — master (#148)
by Mathieu
01:37
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 {RefuseLeaveCommandHandler} from './RefuseLeaveCommandHandler';
3
import {LeaveRepository} from 'src/Infrastructure/HumanResource/Leave/Repository/LeaveRepository';
4
import {RefuseLeaveCommand} from './RefuseLeaveRequestCommand';
5
import {User} from 'src/Domain/HumanResource/User/User.entity';
6
import {Leave} from 'src/Domain/HumanResource/Leave/Leave.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('RefuseLeaveCommandHandler', () => {
13
  let leaveRepository: LeaveRepository;
14
  let dateUtilsAdapter: DateUtilsAdapter;
15
  let CanLeaveRequestBeModerated: CanLeaveRequestBeModerated;
16
  let handler: RefuseLeaveCommandHandler;
17
18
  const user = mock(User);
19
  const leave = mock(Leave);
20
  const command = new RefuseLeaveCommand(
21
    instance(user),
22
    'cfdd06eb-cd71-44b9-82c6-46110b30ce05',
23
    'Bad period'
24
  );
25
26
  beforeEach(() => {
27
    leaveRepository = mock(LeaveRepository);
28
    dateUtilsAdapter = mock(DateUtilsAdapter);
29
    CanLeaveRequestBeModerated = mock(CanLeaveRequestBeModerated);
30
31
    handler = new RefuseLeaveCommandHandler(
32
      instance(leaveRepository),
33
      instance(dateUtilsAdapter),
34
      instance(CanLeaveRequestBeModerated)
35
    );
36
  });
37
38
  it('testLeaveNotNotFound', async () => {
39
    when(
40
      leaveRepository.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.errors.not_found');
48
      verify(
49
        leaveRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
50
      ).once();
51
      verify(
52
        CanLeaveRequestBeModerated.isSatisfiedBy(anything(), anything())
53
      ).never();
54
      verify(leave.refuse(anything(), anything(), anything())).never();
55
      verify(leaveRepository.save(anything())).never();
56
    }
57
  });
58
59
  it('testLeaveCantBeRefused', async () => {
60
    when(
61
      leaveRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
62
    ).thenResolve(instance(leave));
63
    when(
64
      CanLeaveRequestBeModerated.isSatisfiedBy(instance(leave), 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.errors.cant_be_moderated');
72
      verify(
73
        CanLeaveRequestBeModerated.isSatisfiedBy(instance(leave), instance(user))
74
      ).once();
75
      verify(
76
        leaveRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
77
      ).once();
78
      verify(leave.refuse(anything(), anything(), anything())).never();
79
      verify(leaveRepository.save(anything())).never();
80
    }
81
  });
82
83
  it('testLeaveSuccessfullyRefused', async () => {
84
    when(
85
      leaveRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
86
    ).thenResolve(instance(leave));
87
    when(leave.getId()).thenReturn('cfdd06eb-cd71-44b9-82c6-46110b30ce05');
88
    when(
89
      CanLeaveRequestBeModerated.isSatisfiedBy(instance(leave), 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(leave), instance(user))
101
    ).once();
102
    verify(
103
      leaveRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
104
    ).once();
105
    verify(
106
      leave.refuse(instance(user), '2020-09-10T00:00:00.000Z', 'Bad period')
107
    ).calledBefore(leaveRepository.save(instance(leave)));
108
    verify(leaveRepository.save(instance(leave))).once();
109
  });
110
});
111