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

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

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 206
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 167
mnd 3
bc 3
fnc 0
dl 0
loc 206
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { mock, instance, when, verify, anything, deepEqual } from 'ts-mockito';
2
import { AcceptLeaveRequestCommandHandler } from './AcceptLeaveRequestCommandHandler';
3
import { AcceptLeaveRequestCommand } from './AcceptLeaveRequestCommand';
4
import { User } from 'src/Domain/HumanResource/User/User.entity';
5
import { DateUtilsAdapter } from 'src/Infrastructure/Adapter/DateUtilsAdapter';
6
import { LeaveRequestNotFoundException } from 'src/Domain/HumanResource/Leave/Exception/LeaveRequestNotFoundException';
7
import { LeaveRequestCantBeModeratedException } from 'src/Domain/HumanResource/Leave/Exception/LeaveRequestCantBeModeratedException';
8
import { CanLeaveRequestBeModerated } from 'src/Domain/HumanResource/Leave/Specification/CanLeaveRequestBeModerated';
9
import { EventBusAdapter } from 'src/Infrastructure/Adapter/EventBusAdapter';
10
import { AcceptedLeaveRequestEvent } from '../Event/AcceptedLeaveRequestEvent';
11
import { DoesEventsExistForPeriod } from 'src/Domain/FairCalendar/Specification/DoesEventsExistForPeriod';
12
import { EventsAlreadyExistForThisPeriodException } from 'src/Domain/FairCalendar/Exception/EventsAlreadyExistForThisPeriodException';
13
import { LeaveRequest } from 'src/Domain/HumanResource/Leave/LeaveRequest.entity';
14
import { LeaveRequestRepository } from 'src/Infrastructure/HumanResource/Leave/Repository/LeaveRequestRepository';
15
16
describe('AcceptLeaveRequestCommandHandler', () => {
17
  let leaveRequestRepository: LeaveRequestRepository;
18
  let eventBusAdapter: EventBusAdapter;
19
  let dateUtilsAdapter: DateUtilsAdapter;
20
  let canLeaveRequestBeModerated: CanLeaveRequestBeModerated;
21
  let doesEventsExistForPeriod: DoesEventsExistForPeriod;
22
  let handler: AcceptLeaveRequestCommandHandler;
23
24
  const user = mock(User);
25
  const leaveRequest = mock(LeaveRequest);
26
  const command = new AcceptLeaveRequestCommand(
27
    instance(user),
28
    'cfdd06eb-cd71-44b9-82c6-46110b30ce05',
29
    'Enjoy'
30
  );
31
32
  beforeEach(() => {
33
    leaveRequestRepository = mock(LeaveRequestRepository);
34
    eventBusAdapter = mock(EventBusAdapter);
35
    dateUtilsAdapter = mock(DateUtilsAdapter);
36
    canLeaveRequestBeModerated = mock(CanLeaveRequestBeModerated);
37
    doesEventsExistForPeriod = mock(DoesEventsExistForPeriod);
38
39
    handler = new AcceptLeaveRequestCommandHandler(
40
      instance(leaveRequestRepository),
41
      instance(eventBusAdapter),
42
      instance(dateUtilsAdapter),
43
      instance(canLeaveRequestBeModerated),
44
      instance(doesEventsExistForPeriod)
45
    );
46
  });
47
48
  it('testLeaveNotNotFound', async () => {
49
    when(
50
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
51
    ).thenResolve(null);
52
53
    try {
54
      await handler.execute(command);
55
    } catch (e) {
56
      expect(e).toBeInstanceOf(LeaveRequestNotFoundException);
57
      expect(e.message).toBe('human_resources.leaves.requests.errors.not_found');
58
      verify(
59
        leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
60
      ).once();
61
      verify(
62
        canLeaveRequestBeModerated.isSatisfiedBy(anything(), anything())
63
      ).never();
64
      verify(
65
        doesEventsExistForPeriod.isSatisfiedBy(
66
          anything(),
67
          anything(),
68
          anything()
69
        )
70
      ).never();
71
      verify(leaveRequest.accept(anything(), anything(), anything())).never();
72
      verify(eventBusAdapter.publish(anything())).never();
73
      verify(leaveRequestRepository.save(anything())).never();
74
    }
75
  });
76
77
  it('testLeaveCantBeModerated', async () => {
78
    when(
79
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
80
    ).thenResolve(instance(leaveRequest));
81
    when(
82
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
83
    ).thenReturn(false);
84
85
    try {
86
      await handler.execute(command);
87
    } catch (e) {
88
      expect(e).toBeInstanceOf(LeaveRequestCantBeModeratedException);
89
      expect(e.message).toBe('human_resources.leaves.requests.errors.cant_be_moderated');
90
      verify(
91
        canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
92
      ).once();
93
      verify(
94
        leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
95
      ).once();
96
      verify(
97
        doesEventsExistForPeriod.isSatisfiedBy(
98
          anything(),
99
          anything(),
100
          anything()
101
        )
102
      ).never();
103
      verify(eventBusAdapter.publish(anything())).never();
104
      verify(leaveRequest.accept(anything(), anything(), anything())).never();
105
      verify(leaveRequestRepository.save(anything())).never();
106
    }
107
  });
108
109
  it('testEventsAlreadyExist', async () => {
110
    when(leaveRequest.getStartDate()).thenReturn('2019-01-04');
111
    when(leaveRequest.getEndDate()).thenReturn('2019-01-06');
112
    when(leaveRequest.getUser()).thenReturn(instance(user));
113
114
    when(
115
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
116
    ).thenResolve(instance(leaveRequest));
117
    when(
118
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
119
    ).thenReturn(true);
120
    when(
121
      doesEventsExistForPeriod.isSatisfiedBy(
122
        instance(user),
123
        '2019-01-04',
124
        '2019-01-06'
125
      )
126
    ).thenResolve(true);
127
128
    try {
129
      await handler.execute(command);
130
    } catch (e) {
131
      expect(e).toBeInstanceOf(EventsAlreadyExistForThisPeriodException);
132
      expect(e.message).toBe(
133
        'faircalendar.errors.events_already_exist_for_this_period'
134
      );
135
      verify(
136
        canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
137
      ).once();
138
      verify(
139
        leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
140
      ).once();
141
      verify(
142
        doesEventsExistForPeriod.isSatisfiedBy(
143
          instance(user),
144
          '2019-01-04',
145
          '2019-01-06'
146
        )
147
      ).once();
148
      verify(eventBusAdapter.publish(anything())).never();
149
      verify(leaveRequest.accept(anything(), anything(), anything())).never();
150
      verify(leaveRequestRepository.save(anything())).never();
151
    }
152
  });
153
154
  it('testLeaveSuccessfullyAccepted', async () => {
155
    when(leaveRequest.getId()).thenReturn('cfdd06eb-cd71-44b9-82c6-46110b30ce05');
156
    when(leaveRequest.getStartDate()).thenReturn('2020-09-10');
157
    when(leaveRequest.getEndDate()).thenReturn('2020-09-15');
158
    when(leaveRequest.getUser()).thenReturn(instance(user));
159
160
    when(
161
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
162
    ).thenResolve(instance(leaveRequest));
163
    when(
164
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
165
    ).thenReturn(true);
166
    when(
167
      doesEventsExistForPeriod.isSatisfiedBy(
168
        instance(user),
169
        '2020-09-10',
170
        '2020-09-15'
171
      )
172
    ).thenResolve(false);
173
174
    when(dateUtilsAdapter.getCurrentDateToISOString()).thenReturn(
175
      '2020-09-10T00:00:00.000Z'
176
    );
177
178
    expect(await handler.execute(command)).toBe(
179
      'cfdd06eb-cd71-44b9-82c6-46110b30ce05'
180
    );
181
182
    verify(
183
      canLeaveRequestBeModerated.isSatisfiedBy(instance(leaveRequest), instance(user))
184
    ).once();
185
    verify(
186
      doesEventsExistForPeriod.isSatisfiedBy(
187
        instance(user),
188
        '2020-09-10',
189
        '2020-09-15'
190
      )
191
    ).once();
192
    verify(
193
      eventBusAdapter.publish(
194
        deepEqual(new AcceptedLeaveRequestEvent(instance(leaveRequest)))
195
      )
196
    ).once();
197
    verify(
198
      leaveRequestRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
199
    ).once();
200
    verify(
201
      leaveRequest.accept(instance(user), '2020-09-10T00:00:00.000Z', 'Enjoy')
202
    ).once();
203
    verify(leaveRequestRepository.save(instance(leaveRequest))).once();
204
  });
205
});
206