Passed
Pull Request — master (#109)
by Mathieu
02:12
created

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

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 109
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 91
mnd 2
bc 2
fnc 0
dl 0
loc 109
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import {mock, instance, when, verify, anything} from 'ts-mockito';
2
import {RefuseHolidayCommandHandler} from './RefuseHolidayCommandHandler';
3
import {HolidayRepository} from 'src/Infrastructure/HumanResource/Holiday/Repository/HolidayRepository';
4
import {RefuseHolidayCommand} from './RefuseHolidayCommand';
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
12
describe('RefuseHolidayCommandHandler', () => {
13
  let holidayRepository: HolidayRepository;
14
  let dateUtilsAdapter: DateUtilsAdapter;
15
  let canHolidayBeModerated: CanHolidayBeModerated;
16
  let handler: RefuseHolidayCommandHandler;
17
18
  const user = mock(User);
19
  const holiday = mock(Holiday);
20
  const command = new RefuseHolidayCommand(
21
    instance(user),
22
    'cfdd06eb-cd71-44b9-82c6-46110b30ce05'
23
  );
24
25
  beforeEach(() => {
26
    holidayRepository = mock(HolidayRepository);
27
    dateUtilsAdapter = mock(DateUtilsAdapter);
28
    canHolidayBeModerated = mock(CanHolidayBeModerated);
29
30
    handler = new RefuseHolidayCommandHandler(
31
      instance(holidayRepository),
32
      instance(dateUtilsAdapter),
33
      instance(canHolidayBeModerated)
34
    );
35
  });
36
37
  it('testHolidayNotNotFound', async () => {
38
    when(
39
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
40
    ).thenResolve(null);
41
42
    try {
43
      await handler.execute(command);
44
    } catch (e) {
45
      expect(e).toBeInstanceOf(HolidayNotFoundException);
46
      expect(e.message).toBe('human_resource.errors.holiday_not_found');
47
      verify(
48
        holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
49
      ).once();
50
      verify(
51
        canHolidayBeModerated.isSatisfiedBy(anything(), anything())
52
      ).never();
53
      verify(holiday.refuse(anything(), anything())).never();
54
      verify(holidayRepository.save(anything())).never();
55
    }
56
  });
57
58
  it('testHolidayCantBeRefused', async () => {
59
    when(
60
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
61
    ).thenResolve(instance(holiday));
62
    when(
63
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
64
    ).thenReturn(false);
65
66
    try {
67
      await handler.execute(command);
68
    } catch (e) {
69
      expect(e).toBeInstanceOf(HolidayCantBeModeratedException);
70
      expect(e.message).toBe('human_resource.errors.holiday_cant_be_moderated');
71
      verify(
72
        canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
73
      ).once();
74
      verify(
75
        holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
76
      ).once();
77
      verify(holiday.refuse(anything(), anything())).never();
78
      verify(holidayRepository.save(anything())).never();
79
    }
80
  });
81
82
  it('testHolidaySuccessfullyRefused', async () => {
83
    const date = new Date('2020-09-10T00:00:00.000Z');
84
    when(
85
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
86
    ).thenResolve(instance(holiday));
87
    when(holiday.getId()).thenReturn('cfdd06eb-cd71-44b9-82c6-46110b30ce05');
88
    when(
89
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
90
    ).thenReturn(true);
91
    when(dateUtilsAdapter.getCurrentDate()).thenReturn(date);
92
93
    expect(await handler.execute(command)).toBe(
94
      'cfdd06eb-cd71-44b9-82c6-46110b30ce05'
95
    );
96
97
    verify(
98
      canHolidayBeModerated.isSatisfiedBy(instance(holiday), instance(user))
99
    ).once();
100
    verify(
101
      holidayRepository.findOneById('cfdd06eb-cd71-44b9-82c6-46110b30ce05')
102
    ).once();
103
    verify(
104
      holiday.refuse(instance(user), '2020-09-10T00:00:00.000Z')
105
    ).calledBefore(holidayRepository.save(instance(holiday)));
106
    verify(holidayRepository.save(instance(holiday))).once();
107
  });
108
});
109