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

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

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 197
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 159
mnd 2
bc 2
fnc 0
dl 0
loc 197
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 {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(quoteNumberGenerator.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
            new Date('2020-04-06'),
62
            new Date('2020-04-29'),
63
            'FS-DEVIS-2020-0001',
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(quoteNumberGenerator.generate()).once();
83
    verify(
84
      quoteRepository.save(
85
        deepEqual(
86
          new Quote(
87
            new Date('2020-04-06'),
88
            new Date('2020-04-29'),
89
            'FS-DEVIS-2020-0001',
90
            instance(user),
91
            customer,
92
            project
93
          )
94
        )
95
      )
96
    ).once();
97
  });
98
99
  it('testQuoteSuccessfullyWithoutProjectCreated', async () => {
100
    when(
101
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
102
    ).thenResolve(customer);
103
    when(quoteNumberGenerator.generate()).thenResolve('FS-DEVIS-2020-0001');
104
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
105
    when(
106
      quoteRepository.save(
107
        deepEqual(
108
          new Quote(
109
            new Date('2020-04-06'),
110
            new Date('2020-04-29'),
111
            'FS-DEVIS-2020-0001',
112
            instance(user),
113
            customer,
114
            null
115
          )
116
        )
117
      )
118
    ).thenResolve(instance(quote));
119
120
    expect(
121
      await handler.execute(
122
        new CreateQuoteCommand(
123
          instance(user),
124
          new Date('2020-04-06'),
125
          new Date('2020-04-29'),
126
          'a491ccc9-df7c-4fc6-8e90-db816208f689'
127
        )
128
      )
129
    ).toBe('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
130
131
    verify(
132
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
133
    ).once();
134
    verify(projectRepository.findOneById(anything())).never();
135
    verify(quoteNumberGenerator.generate()).once();
136
    verify(
137
      quoteRepository.save(
138
        deepEqual(
139
          new Quote(
140
            new Date('2020-04-06'),
141
            new Date('2020-04-29'),
142
            'FS-DEVIS-2020-0001',
143
            instance(user),
144
            customer,
145
            null
146
          )
147
        )
148
      )
149
    ).once();
150
  });
151
152
  it('testCustomerNotFound', async () => {
153
    when(
154
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
155
    ).thenResolve(null);
156
157
    try {
158
      expect(await handler.execute(command)).toBe(
159
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
160
      );
161
    } catch (e) {
162
      expect(e).toBeInstanceOf(CustomerNotFoundException);
163
      expect(e.message).toBe('customer.errors.not_found');
164
      verify(
165
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
166
      ).once();
167
      verify(projectRepository.findOneById(anything())).never();
168
      verify(quoteNumberGenerator.generate()).never();
169
      verify(quoteRepository.save(anything())).never();
170
    }
171
  });
172
173
  it('testProjectNotFound', async () => {
174
    when(
175
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
176
    ).thenResolve(customer);
177
    when(
178
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
179
    ).thenResolve(null);
180
181
    try {
182
      expect(await handler.execute(command)).toBe(
183
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
184
      );
185
    } catch (e) {
186
      expect(e).toBeInstanceOf(ProjectNotFoundException);
187
      expect(e.message).toBe('project.errors.not_found');
188
      verify(
189
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
190
      ).once();
191
      verify(projectRepository.findOneById(anything())).once();
192
      verify(quoteNumberGenerator.generate()).never();
193
      verify(quoteRepository.save(anything())).never();
194
    }
195
  });
196
});
197