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

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

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 205
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 165
mnd 2
bc 2
fnc 0
dl 0
loc 205
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 {QuoteNumberGenerator} from 'src/Domain/Billing/QuoteNumberGenerator';
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
15
describe('CreateQuoteCommandHandler', () => {
16
  let quoteRepository: QuoteRepository;
17
  let customerRepository: CustomerRepository;
18
  let projectRepository: ProjectRepository;
19
  let quoteNumberGenerator: QuoteNumberGenerator;
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
    new Date('2020-04-06'),
29
    new Date('2020-04-29'),
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
    quoteNumberGenerator = mock(QuoteNumberGenerator);
39
40
    handler = new CreateQuoteCommandHandler(
41
      instance(quoteRepository),
42
      instance(customerRepository),
43
      instance(projectRepository),
44
      instance(quoteNumberGenerator)
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(
56
      quoteNumberGenerator.generate(deepEqual(new Date('2020-04-06')))
57
    ).thenResolve('FS-DEVIS-2020-0001');
58
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
59
    when(
60
      quoteRepository.save(
61
        deepEqual(
62
          new Quote(
63
            new Date('2020-04-06'),
64
            new Date('2020-04-29'),
65
            'FS-DEVIS-2020-0001',
66
            instance(user),
67
            customer,
68
            project
69
          )
70
        )
71
      )
72
    ).thenResolve(instance(quote));
73
74
    expect(await handler.execute(command)).toBe(
75
      '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
76
    );
77
78
    verify(
79
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
80
    ).once();
81
    verify(
82
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
83
    ).once();
84
    verify(
85
      quoteNumberGenerator.generate(deepEqual(new Date('2020-04-06')))
86
    ).once();
87
    verify(
88
      quoteRepository.save(
89
        deepEqual(
90
          new Quote(
91
            new Date('2020-04-06'),
92
            new Date('2020-04-29'),
93
            'FS-DEVIS-2020-0001',
94
            instance(user),
95
            customer,
96
            project
97
          )
98
        )
99
      )
100
    ).once();
101
  });
102
103
  it('testQuoteSuccessfullyWithoutProjectCreated', async () => {
104
    when(
105
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
106
    ).thenResolve(customer);
107
    when(
108
      quoteNumberGenerator.generate(deepEqual(new Date('2020-04-06')))
109
    ).thenResolve('FS-DEVIS-2020-0001');
110
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
111
    when(
112
      quoteRepository.save(
113
        deepEqual(
114
          new Quote(
115
            new Date('2020-04-06'),
116
            new Date('2020-04-29'),
117
            'FS-DEVIS-2020-0001',
118
            instance(user),
119
            customer,
120
            null
121
          )
122
        )
123
      )
124
    ).thenResolve(instance(quote));
125
126
    expect(
127
      await handler.execute(
128
        new CreateQuoteCommand(
129
          instance(user),
130
          new Date('2020-04-06'),
131
          new Date('2020-04-29'),
132
          'a491ccc9-df7c-4fc6-8e90-db816208f689'
133
        )
134
      )
135
    ).toBe('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
136
137
    verify(
138
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
139
    ).once();
140
    verify(projectRepository.findOneById(anything())).never();
141
    verify(
142
      quoteNumberGenerator.generate(deepEqual(new Date('2020-04-06')))
143
    ).once();
144
    verify(
145
      quoteRepository.save(
146
        deepEqual(
147
          new Quote(
148
            new Date('2020-04-06'),
149
            new Date('2020-04-29'),
150
            'FS-DEVIS-2020-0001',
151
            instance(user),
152
            customer,
153
            null
154
          )
155
        )
156
      )
157
    ).once();
158
  });
159
160
  it('testCustomerNotFound', async () => {
161
    when(
162
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
163
    ).thenResolve(null);
164
165
    try {
166
      expect(await handler.execute(command)).toBe(
167
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
168
      );
169
    } catch (e) {
170
      expect(e).toBeInstanceOf(CustomerNotFoundException);
171
      expect(e.message).toBe('customer.errors.not_found');
172
      verify(
173
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
174
      ).once();
175
      verify(projectRepository.findOneById(anything())).never();
176
      verify(quoteNumberGenerator.generate(anything())).never();
177
      verify(quoteRepository.save(anything())).never();
178
    }
179
  });
180
181
  it('testProjectNotFound', async () => {
182
    when(
183
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
184
    ).thenResolve(customer);
185
    when(
186
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
187
    ).thenResolve(null);
188
189
    try {
190
      expect(await handler.execute(command)).toBe(
191
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
192
      );
193
    } catch (e) {
194
      expect(e).toBeInstanceOf(ProjectNotFoundException);
195
      expect(e.message).toBe('project.errors.not_found');
196
      verify(
197
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
198
      ).once();
199
      verify(projectRepository.findOneById(anything())).once();
200
      verify(quoteNumberGenerator.generate(anything())).never();
201
      verify(quoteRepository.save(anything())).never();
202
    }
203
  });
204
});
205