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

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

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 201
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

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