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

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

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 220
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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