Passed
Pull Request — master (#70)
by Mathieu
01:34
created

server/src/Application/Billing/Command/CreateQuoteCommandHandler.spec.ts   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 221
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 179
mnd 3
bc 3
fnc 0
dl 0
loc 221
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import {mock, instance, when, verify, deepEqual, anything} from 'ts-mockito';
2
import {CustomerRepository} from 'src/Infrastructure/Customer/Repository/CustomerRepository';
3
import {QuoteRepository} from 'src/Infrastructure/Billing/Repository/QuoteRepository';
4
import {CreateQuoteCommandHandler} from './CreateQuoteCommandHandler';
5
import {ProjectRepository} from 'src/Infrastructure/Project/Repository/ProjectRepository';
6
import {QuoteIdGenerator} from 'src/Domain/Billing/QuoteIdGenerator';
7
import {CreateQuoteCommand} from './CreateQuoteCommand';
8
import {User} from 'src/Domain/User/User.entity';
9
import {Customer} from 'src/Domain/Customer/Customer.entity';
10
import {Project} from 'src/Domain/Project/Project.entity';
11
import {Quote} from 'src/Domain/Billing/Quote.entity';
12
import {CustomerNotFoundException} from 'src/Domain/Customer/Exception/CustomerNotFoundException';
13
import {ProjectNotFoundException} from 'src/Domain/Project/Exception/ProjectNotFoundException';
14
import {ProjectNotAllowedException} from 'src/Domain/Billing/Exception/ProjectNotAllowedException';
15
16
describe('CreateQuoteCommandHandler', () => {
17
  let quoteRepository: QuoteRepository;
18
  let customerRepository: CustomerRepository;
19
  let projectRepository: ProjectRepository;
20
  let quoteIdGenerator: QuoteIdGenerator;
21
  let handler: CreateQuoteCommandHandler;
22
23
  const user = mock(User);
24
  const quote = mock(Quote);
25
  const customer = new Customer('Customer');
26
  const project = new Project('Project', customer);
27
  const command = new CreateQuoteCommand(
28
    instance(user),
29
    'draft',
30
    'a491ccc9-df7c-4fc6-8e90-db816208f689',
31
    '3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c'
32
  );
33
34
  beforeEach(() => {
35
    quoteRepository = mock(QuoteRepository);
36
    customerRepository = mock(CustomerRepository);
37
    projectRepository = mock(ProjectRepository);
38
    quoteIdGenerator = mock(QuoteIdGenerator);
39
40
    handler = new CreateQuoteCommandHandler(
41
      instance(quoteRepository),
42
      instance(customerRepository),
43
      instance(projectRepository),
44
      instance(quoteIdGenerator)
45
    );
46
  });
47
48
  it('testQuoteSuccessfullyCreated', async () => {
49
    when(
50
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
51
    ).thenResolve(customer);
52
    when(
53
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
54
    ).thenResolve(project);
55
    when(quoteIdGenerator.generate()).thenResolve('FS-DEVIS-2020-0001');
56
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
57
    when(
58
      quoteRepository.save(
59
        deepEqual(
60
          new Quote(
61
            'FS-DEVIS-2020-0001',
62
            'draft',
63
            instance(user),
64
            customer,
65
            project
66
          )
67
        )
68
      )
69
    ).thenResolve(instance(quote));
70
71
    expect(await handler.execute(command)).toBe(
72
      '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
73
    );
74
75
    verify(
76
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
77
    ).once();
78
    verify(
79
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
80
    ).once();
81
    verify(quoteIdGenerator.generate()).once();
82
    verify(
83
      quoteRepository.save(
84
        deepEqual(
85
          new Quote(
86
            'FS-DEVIS-2020-0001',
87
            'draft',
88
            instance(user),
89
            customer,
90
            project
91
          )
92
        )
93
      )
94
    ).once();
95
  });
96
97
  it('testQuoteSuccessfullyWithoutProjectCreated', async () => {
98
    when(
99
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
100
    ).thenResolve(customer);
101
    when(quoteIdGenerator.generate()).thenResolve('FS-DEVIS-2020-0001');
102
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
103
    when(
104
      quoteRepository.save(
105
        deepEqual(
106
          new Quote(
107
            'FS-DEVIS-2020-0001',
108
            'draft',
109
            instance(user),
110
            customer,
111
            null
112
          )
113
        )
114
      )
115
    ).thenResolve(instance(quote));
116
117
    expect(
118
      await handler.execute(
119
        new CreateQuoteCommand(
120
          instance(user),
121
          'draft',
122
          'a491ccc9-df7c-4fc6-8e90-db816208f689'
123
        )
124
      )
125
    ).toBe('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
126
127
    verify(
128
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
129
    ).once();
130
    verify(projectRepository.findOneById(anything())).never();
131
    verify(quoteIdGenerator.generate()).once();
132
    verify(
133
      quoteRepository.save(
134
        deepEqual(
135
          new Quote(
136
            'FS-DEVIS-2020-0001',
137
            'draft',
138
            instance(user),
139
            customer,
140
            null
141
          )
142
        )
143
      )
144
    ).once();
145
  });
146
147
  it('testCustomerNotFound', async () => {
148
    when(
149
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
150
    ).thenResolve(null);
151
152
    try {
153
      expect(await handler.execute(command)).toBe(
154
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
155
      );
156
    } catch (e) {
157
      expect(e).toBeInstanceOf(CustomerNotFoundException);
158
      expect(e.message).toBe('customer.errors.not_found');
159
      verify(
160
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
161
      ).once();
162
      verify(projectRepository.findOneById(anything())).never();
163
      verify(quoteIdGenerator.generate()).never();
164
      verify(quoteRepository.save(anything())).never();
165
    }
166
  });
167
168
  it('testProjectNotFound', async () => {
169
    when(
170
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
171
    ).thenResolve(customer);
172
    when(
173
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
174
    ).thenResolve(null);
175
176
    try {
177
      expect(await handler.execute(command)).toBe(
178
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
179
      );
180
    } catch (e) {
181
      expect(e).toBeInstanceOf(ProjectNotFoundException);
182
      expect(e.message).toBe('project.errors.not_found');
183
      verify(
184
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
185
      ).once();
186
      verify(projectRepository.findOneById(anything())).once();
187
      verify(quoteIdGenerator.generate()).never();
188
      verify(quoteRepository.save(anything())).never();
189
    }
190
  });
191
192
  it('testProjectNotAllowed', async () => {
193
    const customer2 = mock(Customer);
194
    const project2 = mock(Project);
195
196
    when(customer2.getId()).thenReturn('6c35d37c-b0e3-480d-bf6c-3dc1e094886f');
197
    when(project2.getCustomer()).thenReturn(instance(customer2));
198
    when(
199
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
200
    ).thenResolve(customer);
201
    when(
202
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
203
    ).thenResolve(instance(project2));
204
205
    try {
206
      expect(await handler.execute(command)).toBe(
207
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
208
      );
209
    } catch (e) {
210
      expect(e).toBeInstanceOf(ProjectNotAllowedException);
211
      expect(e.message).toBe('quote.errors.projet_not_allowed');
212
      verify(
213
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
214
      ).once();
215
      verify(projectRepository.findOneById(anything())).once();
216
      verify(quoteIdGenerator.generate()).never();
217
      verify(quoteRepository.save(anything())).never();
218
    }
219
  });
220
});
221