Passed
Pull Request — master (#78)
by Mathieu
01:27
created

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

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 216
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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