Passed
Pull Request — master (#112)
by Mathieu
02:16 queued 45s
created

server/src/Application/HumanResource/Holiday/Command/AcceptHolidayCommandHandler.spec.ts   A

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 123
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 101
mnd 2
bc 2
fnc 0
dl 0
loc 123
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 {AcceptHolidayCommandHandler} from './AcceptHolidayCommandHandler';
3
import {HolidayRepository} from 'src/Infrastructure/HumanResource/Holiday/Repository/HolidayRepository';
4
import {AcceptHolidayCommand} from './AcceptHolidayCommand';
5
import {User} from 'src/Domain/HumanResource/User/User.entity';
6
import {Holiday} from 'src/Domain/HumanResource/Holiday/Holiday.entity';
7
import {DateUtilsAdapter} from 'src/Infrastructure/Adapter/DateUtilsAdapter';
8
import {HolidayNotFoundException} from 'src/Domain/HumanResource/Holiday/Exception/HolidayNotFoundException';
9
import {HolidayCantBeModeratedException} from 'src/Domain/HumanResource/Holiday/Exception/HolidayCantBeModeratedException';
10
import {CanHolidayBeModerated} from 'src/Domain/HumanResource/Holiday/Specification/CanHolidayBeModerated';
11
import {EventBusAdapter} from 'src/Infrastructure/Adapter/EventBusAdapter';
12
import {AcceptedHolidayEvent} from '../Event/AcceptedHolidayEvent';
13
14
describe('AcceptHolidayCommandHandler', () => {
15
  let holidayRepository: HolidayRepository;
16
  let eventBusAdapter: EventBusAdapter;
17
  let dateUtilsAdapter: DateUtilsAdapter;
18
  let canHolidayBeModerated: CanHolidayBeModerated;
19
  let handler: AcceptHolidayCommandHandler;
20
21
  const user = mock(User);
22
  const holiday = mock(Holiday);
23
  const command = new AcceptHolidayCommand(
24
    instance(user),
25
    'cfdd06eb-cd71-44b9-82c6-46110b30ce05',
26
    'Enjoy'
27
  );
28
29
  beforeEach(() => {
30
    holidayRepository = mock(HolidayRepository);
31
    eventBusAdapter = mock(EventBusAdapter);
32
    dateUtilsAdapter = mock(DateUtilsAdapter);
33
    canHolidayBeModerated = mock(CanHolidayBeModerated);
34
35
    handler = new AcceptHolidayCommandHandler(
36
      instance(holidayRepository),
37
      instance(eventBusAdapter),
38
      instance(dateUtilsAdapter),
39
      instance(canHolidayBeModerated)
40
    );
41
  });
42
43
  it('testHolidayNotNotFound', async () => {
44
    when(
45
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
46
    ).thenResolve(null);
47
48
    try {
49
      await handler.execute(command);
50
    } catch (e) {
51
      expect(e).toBeInstanceOf(HolidayNotFoundException);
52
      expect(e.message).toBe('human_resource.errors.holiday_not_found');
53
      verify(
54
        holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
55
      ).once();
56
      verify(
57
        canHolidayBeModerated.isSatisfiedBy(anything(), anything())
58
      ).never();
59
      verify(holiday.accept(anything(), anything(), anything())).never();
60
      verify(eventBusAdapter.publish(anything())).never();
61
      verify(holidayRepository.save(anything())).never();
62
    }
63
  });
64
65
  it('testHolidayCantBeAccepted', async () => {
66
    when(
67
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
68
    ).thenResolve(instance(holiday));
69
    when(
70
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
71
    ).thenReturn(false);
72
73
    try {
74
      await handler.execute(command);
75
    } catch (e) {
76
      expect(e).toBeInstanceOf(HolidayCantBeModeratedException);
77
      expect(e.message).toBe('human_resource.errors.holiday_cant_be_moderated');
78
      verify(
79
        canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
80
      ).once();
81
      verify(
82
        holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
83
      ).once();
84
      verify(eventBusAdapter.publish(anything())).never();
85
      verify(holiday.accept(anything(), anything(), anything())).never();
86
      verify(holidayRepository.save(anything())).never();
87
    }
88
  });
89
90
  it('testHolidaySuccessfullyAccepted', async () => {
91
    when(holiday.getId()).thenReturn('cfdd06eb-cd71-44b9-82c6-46110b30ce05');
92
    when(
93
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
94
    ).thenResolve(instance(holiday));
95
    when(
96
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
97
    ).thenReturn(true);
98
    when(dateUtilsAdapter.getCurrentDateToISOString()).thenReturn(
99
      '2020-09-10T00:00:00.000Z'
100
    );
101
102
    expect(await handler.execute(command)).toBe(
103
      'cfdd06eb-cd71-44b9-82c6-46110b30ce05'
104
    );
105
106
    verify(
107
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
108
    ).once();
109
    verify(
110
      eventBusAdapter.publish(
111
        deepEqual(new AcceptedHolidayEvent(instance(holiday)))
112
      )
113
    ).once();
114
    verify(
115
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
116
    ).once();
117
    verify(
118
      holiday.accept(instance(user), '2020-09-10T00:00:00.000Z', 'Enjoy')
119
    ).once();
120
    verify(holidayRepository.save(instance(holiday))).once();
121
  });
122
});
123