Passed
Pull Request — master (#75)
by Mathieu
01:36
created

server/src/Application/FairCalendar/Command/AddEventCommandHandler.spec.ts   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 193
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 160
mnd 3
bc 3
fnc 0
dl 0
loc 193
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import {
2
  mock,
3
  instance,
4
  when,
5
  verify,
6
  anything,
7
  deepEqual,
8
  anyOfClass
9
} from 'ts-mockito';
10
import {TaskRepository} from 'src/Infrastructure/Task/Repository/TaskRepository';
11
import {ProjectRepository} from 'src/Infrastructure/Project/Repository/ProjectRepository';
12
import {EventRepository} from 'src/Infrastructure/FairCalendar/Repository/EventRepository';
13
import {IsMaximumTimeSpentReached} from 'src/Domain/FairCalendar/Specification/IsMaximumTimeSpentReached';
14
import {AddEventCommandHandler} from './AddEventCommandHandler';
15
import {AddEventCommand} from './AddEventCommand';
16
import {User} from 'src/Domain/User/User.entity';
17
import {ProjectNotFoundException} from 'src/Domain/Project/Exception/ProjectNotFoundException';
18
import {Project} from 'src/Domain/Project/Project.entity';
19
import {TaskNotFoundException} from 'src/Domain/Task/Exception/TaskNotFoundException';
20
import {Task} from 'src/Domain/Task/Task.entity';
21
import {MaximumEventReachedException} from 'src/Domain/FairCalendar/Exception/MaximumEventReachedException';
22
import {Event, EventType} from 'src/Domain/FairCalendar/Event.entity';
23
import {DateUtilsAdapter} from 'src/Infrastructure/Adapter/DateUtilsAdapter';
24
25
describe('AddEventCommandHandler', () => {
26
  let taskRepository: TaskRepository;
27
  let projectRepository: ProjectRepository;
28
  let eventRepository: EventRepository;
29
  let isMaximumTimeSpentReached: IsMaximumTimeSpentReached;
30
  let dateUtils: DateUtilsAdapter;
31
  let handler: AddEventCommandHandler;
32
33
  const user = mock(User);
34
  const project = mock(Project);
35
  const task = mock(Task);
36
37
  const command = new AddEventCommand(
38
    EventType.MISSION,
39
    instance(user),
40
    100,
41
    new Date('2019-12-12'),
42
    '50e624ef-3609-4053-a437-f74844a2d2de',
43
    'e3fc9666-2932-4dc1-b2b9-d904388293fb',
44
    'Superkaiser development'
45
  );
46
47
  beforeEach(() => {
48
    taskRepository = mock(TaskRepository);
49
    projectRepository = mock(ProjectRepository);
50
    eventRepository = mock(EventRepository);
51
    taskRepository = mock(TaskRepository);
52
    isMaximumTimeSpentReached = mock(IsMaximumTimeSpentReached);
53
    dateUtils = mock(DateUtilsAdapter);
54
55
    handler = new AddEventCommandHandler(
56
      instance(taskRepository),
57
      instance(projectRepository),
58
      instance(eventRepository),
59
      instance(dateUtils),
60
      instance(isMaximumTimeSpentReached)
61
    );
62
  });
63
64
  it('testProjectNotFound', async () => {
65
    when(
66
      projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
67
    ).thenResolve(null);
68
69
    try {
70
      await handler.execute(command);
71
    } catch (e) {
72
      expect(e).toBeInstanceOf(ProjectNotFoundException);
73
      expect(e.message).toBe('project.errors.not_found');
74
      verify(
75
        projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
76
      ).once();
77
      verify(taskRepository.findOneById(anything())).never();
78
      verify(isMaximumTimeSpentReached.isSatisfiedBy(anything())).never();
79
      verify(eventRepository.save(anything())).never();
80
    }
81
  });
82
83
  it('testTaskNotFound', async () => {
84
    when(
85
      projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
86
    ).thenResolve(instance(project));
87
    when(
88
      taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
89
    ).thenResolve(null);
90
91
    try {
92
      await handler.execute(command);
93
    } catch (e) {
94
      expect(e).toBeInstanceOf(TaskNotFoundException);
95
      expect(e.message).toBe('task.errors.not_found');
96
      verify(
97
        projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
98
      ).once();
99
      verify(
100
        taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
101
      ).once();
102
      verify(isMaximumTimeSpentReached.isSatisfiedBy(anything())).never();
103
      verify(eventRepository.save(anything())).never();
104
    }
105
  });
106
107
  it('testMaximumTimeSpentReached', async () => {
108
    const event = new Event(
109
      EventType.MISSION,
110
      instance(user),
111
      100,
112
      '2019-12-12',
113
      instance(project),
114
      instance(task),
115
      'Superkaiser development'
116
    );
117
118
    when(
119
      projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
120
    ).thenResolve(instance(project));
121
    when(
122
      taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
123
    ).thenResolve(instance(task));
124
    when(isMaximumTimeSpentReached.isSatisfiedBy(deepEqual(event))).thenResolve(
125
      true
126
    );
127
    when(dateUtils.format(anyOfClass(Date), 'y-MM-dd')).thenReturn(
128
      '2019-12-12'
129
    );
130
131
    try {
132
      await handler.execute(command);
133
    } catch (e) {
134
      expect(e).toBeInstanceOf(MaximumEventReachedException);
135
      expect(e.message).toBe('fair_calendar.errors.event_maximum_reached');
136
      verify(
137
        projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
138
      ).once();
139
      verify(
140
        taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
141
      ).once();
142
      verify(isMaximumTimeSpentReached.isSatisfiedBy(deepEqual(event))).once();
143
      verify(dateUtils.format(anyOfClass(Date), 'y-MM-dd')).once();
144
      verify(eventRepository.save(anything())).never();
145
    }
146
  });
147
148
  it('testAddMissionSuccessfully', async () => {
149
    const event = new Event(
150
      EventType.MISSION,
151
      instance(user),
152
      100,
153
      '2019-12-12',
154
      instance(project),
155
      instance(task),
156
      'Superkaiser development'
157
    );
158
    const savedEvent = mock(Event);
159
160
    when(
161
      projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
162
    ).thenResolve(instance(project));
163
    when(
164
      taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
165
    ).thenResolve(instance(task));
166
    when(isMaximumTimeSpentReached.isSatisfiedBy(deepEqual(event))).thenResolve(
167
      false
168
    );
169
    when(dateUtils.format(anyOfClass(Date), 'y-MM-dd')).thenReturn(
170
      '2019-12-12'
171
    );
172
    when(savedEvent.getId()).thenReturn('a2eaac9c-a118-4502-bc9f-4dbd3b296e73');
173
    when(eventRepository.save(deepEqual(event))).thenResolve(
174
      instance(savedEvent)
175
    );
176
177
    expect(await handler.execute(command)).toBe(
178
      'a2eaac9c-a118-4502-bc9f-4dbd3b296e73'
179
    );
180
181
    verify(
182
      projectRepository.findOneById('50e624ef-3609-4053-a437-f74844a2d2de')
183
    ).once();
184
    verify(
185
      taskRepository.findOneById('e3fc9666-2932-4dc1-b2b9-d904388293fb')
186
    ).once();
187
    verify(dateUtils.format(anyOfClass(Date), 'y-MM-dd')).once();
188
    verify(isMaximumTimeSpentReached.isSatisfiedBy(deepEqual(event))).once();
189
    verify(eventRepository.save(deepEqual(event))).once();
190
    verify(savedEvent.getId()).once();
191
  });
192
});
193