Passed
Pull Request — master (#188)
by Mathieu
02:07
created

server/src/Application/Project/Command/UpdateProjectCommandHandler.spec.ts   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 157
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 131
dl 0
loc 157
rs 10
c 0
b 0
f 0
wmc 3
mnd 3
bc 3
fnc 0
bpm 0
cpm 0
noi 0
1
import {mock, instance, when, verify, anything} from 'ts-mockito';
2
import {ProjectRepository} from 'src/Infrastructure/Project/Repository/ProjectRepository';
3
import {IsProjectAlreadyExist} from 'src/Domain/Project/Specification/IsProjectAlreadyExist';
4
import {InvoiceUnits, Project} from 'src/Domain/Project/Project.entity';
5
import {UpdateProjectCommand} from './UpdateProjectCommand';
6
import {ProjectNotFoundException} from 'src/Domain/Project/Exception/ProjectNotFoundException';
7
import {ProjectAlreadyExistException} from 'src/Domain/Project/Exception/ProjectAlreadyExistException';
8
import {UpdateProjectCommandHandler} from './UpdateProjectCommandHandler';
9
import {CustomerRepository} from 'src/Infrastructure/Customer/Repository/CustomerRepository';
10
import {CustomerNotFoundException} from 'src/Domain/Customer/Exception/CustomerNotFoundException';
11
import {Customer} from 'src/Domain/Customer/Customer.entity';
12
13
describe('UpdateProjectCommandHandler', () => {
14
  let projectRepository: ProjectRepository;
15
  let customerRepository: CustomerRepository;
16
  let isProjectAlreadyExist: IsProjectAlreadyExist;
17
  let updatedProject: Project;
18
  let customer: Customer;
19
  let handler: UpdateProjectCommandHandler;
20
21
  const command = new UpdateProjectCommand(
22
    'afda00b1-bf49-4102-9bc2-bce17f3acd48',
23
    'Project',
24
    420,
25
    InvoiceUnits.HOUR,
26
    'd4aa560e-d2f7-422e-ae8d-6af5d0455eeb'
27
  );
28
29
  beforeEach(() => {
30
    projectRepository = mock(ProjectRepository);
31
    customerRepository = mock(CustomerRepository);
32
    isProjectAlreadyExist = mock(IsProjectAlreadyExist);
33
    updatedProject = mock(Project);
34
    customer = mock(Customer);
35
36
    handler = new UpdateProjectCommandHandler(
37
      instance(projectRepository),
38
      instance(customerRepository),
39
      instance(isProjectAlreadyExist)
40
    );
41
  });
42
43
  it('testUpdateSuccessfully', async () => {
44
    when(
45
      projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
46
    ).thenResolve(instance(updatedProject));
47
    when(
48
      customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
49
    ).thenResolve(instance(customer));
50
    when(isProjectAlreadyExist.isSatisfiedBy('Project')).thenResolve(false);
51
    when(updatedProject.getId()).thenReturn(
52
      'afda00b1-bf49-4102-9bc2-bce17f3acd48'
53
    );
54
    when(updatedProject.getDayDuration()).thenReturn(420);
55
    when(updatedProject.getName()).thenReturn('Old project');
56
57
    // Command return nothing
58
    expect(await handler.execute(command)).toBeUndefined();
59
60
    verify(isProjectAlreadyExist.isSatisfiedBy('Project')).once();
61
    verify(
62
      projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
63
    ).once();
64
    verify(
65
      customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
66
    ).once();
67
    verify(projectRepository.save(instance(updatedProject))).once();
68
    verify(
69
      updatedProject.update(instance(customer), 420, InvoiceUnits.HOUR, 'Project')
70
    ).once();
71
    verify(
72
      updatedProject.update(instance(customer), 420, InvoiceUnits.HOUR, 'Project')
73
    ).calledBefore(projectRepository.save(instance(updatedProject)));
74
    verify(updatedProject.getName()).once();
75
  });
76
77
  it('testProjectNotFound', async () => {
78
    when(
79
      projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
80
    ).thenResolve(null);
81
82
    try {
83
      await handler.execute(command);
84
    } catch (e) {
85
      expect(e).toBeInstanceOf(ProjectNotFoundException);
86
      expect(e.message).toBe('crm.projects.errors.not_found');
87
      verify(customerRepository.findOneById(anything())).never();
88
      verify(isProjectAlreadyExist.isSatisfiedBy(anything())).never();
89
      verify(
90
        projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
91
      ).once();
92
      verify(projectRepository.save(anything())).never();
93
      verify(
94
        updatedProject.update(anything(), anything(), anything(), anything())
95
      ).never();
96
      verify(updatedProject.getName()).never();
97
    }
98
  });
99
100
  it('testCustomerNotFound', async () => {
101
    when(
102
      projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
103
    ).thenResolve(instance(updatedProject));
104
    when(
105
      customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
106
    ).thenResolve(null);
107
108
    try {
109
      await handler.execute(command);
110
    } catch (e) {
111
      expect(e).toBeInstanceOf(CustomerNotFoundException);
112
      expect(e.message).toBe('crm.customers.errors.not_found');
113
      verify(isProjectAlreadyExist.isSatisfiedBy(anything())).never();
114
      verify(
115
        projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
116
      ).once();
117
      verify(
118
        customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
119
      ).once();
120
      verify(projectRepository.save(anything())).never();
121
      verify(
122
        updatedProject.update(anything(), anything(), anything(), anything())
123
      ).never();
124
      verify(updatedProject.getName()).never();
125
    }
126
  });
127
128
  it('testProjectAlreadyExist', async () => {
129
    when(
130
      projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
131
    ).thenResolve(instance(updatedProject));
132
    when(
133
      customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
134
    ).thenResolve(instance(customer));
135
    when(isProjectAlreadyExist.isSatisfiedBy('Project')).thenResolve(true);
136
137
    try {
138
      await handler.execute(command);
139
    } catch (e) {
140
      expect(e).toBeInstanceOf(ProjectAlreadyExistException);
141
      expect(e.message).toBe('crm.projects.errors.already_exist');
142
      verify(isProjectAlreadyExist.isSatisfiedBy('Project')).once();
143
      verify(
144
        projectRepository.findOneById('afda00b1-bf49-4102-9bc2-bce17f3acd48')
145
      ).once();
146
      verify(
147
        customerRepository.findOneById('d4aa560e-d2f7-422e-ae8d-6af5d0455eeb')
148
      ).once();
149
      verify(projectRepository.save(anything())).never();
150
      verify(
151
        updatedProject.update(anything(), anything(), anything(), anything())
152
      ).never();
153
      verify(updatedProject.getName()).once();
154
    }
155
  });
156
});
157