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

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

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 165
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 131
mnd 2
bc 2
fnc 0
dl 0
loc 165
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 {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
    'a491ccc9-df7c-4fc6-8e90-db816208f689',
29
    '3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c'
30
  );
31
32
  beforeEach(() => {
33
    quoteRepository = mock(QuoteRepository);
34
    customerRepository = mock(CustomerRepository);
35
    projectRepository = mock(ProjectRepository);
36
    quoteIdGenerator = mock(QuoteIdGenerator);
37
38
    handler = new CreateQuoteCommandHandler(
39
      instance(quoteRepository),
40
      instance(customerRepository),
41
      instance(projectRepository),
42
      instance(quoteIdGenerator)
43
    );
44
  });
45
46
  it('testQuoteSuccessfullyCreated', async () => {
47
    when(
48
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
49
    ).thenResolve(customer);
50
    when(
51
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
52
    ).thenResolve(project);
53
    when(quoteIdGenerator.generate()).thenResolve('FS-DEVIS-2020-0001');
54
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
55
    when(
56
      quoteRepository.save(
57
        deepEqual(
58
          new Quote('FS-DEVIS-2020-0001', instance(user), customer, project)
59
        )
60
      )
61
    ).thenResolve(instance(quote));
62
63
    expect(await handler.execute(command)).toBe(
64
      '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
65
    );
66
67
    verify(
68
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
69
    ).once();
70
    verify(
71
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
72
    ).once();
73
    verify(quoteIdGenerator.generate()).once();
74
    verify(
75
      quoteRepository.save(
76
        deepEqual(
77
          new Quote('FS-DEVIS-2020-0001', instance(user), customer, project)
78
        )
79
      )
80
    ).once();
81
  });
82
83
  it('testQuoteSuccessfullyWithoutProjectCreated', async () => {
84
    when(
85
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
86
    ).thenResolve(customer);
87
    when(quoteIdGenerator.generate()).thenResolve('FS-DEVIS-2020-0001');
88
    when(quote.getId()).thenReturn('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
89
    when(
90
      quoteRepository.save(
91
        deepEqual(
92
          new Quote('FS-DEVIS-2020-0001', instance(user), customer, null)
93
        )
94
      )
95
    ).thenResolve(instance(quote));
96
97
    expect(
98
      await handler.execute(
99
        new CreateQuoteCommand(
100
          instance(user),
101
          'a491ccc9-df7c-4fc6-8e90-db816208f689'
102
        )
103
      )
104
    ).toBe('7c35d37c-b0e3-480d-bf6c-3dc1e094886f');
105
106
    verify(
107
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
108
    ).once();
109
    verify(projectRepository.findOneById(anything())).never();
110
    verify(quoteIdGenerator.generate()).once();
111
    verify(
112
      quoteRepository.save(
113
        deepEqual(
114
          new Quote('FS-DEVIS-2020-0001', instance(user), customer, null)
115
        )
116
      )
117
    ).once();
118
  });
119
120
  it('testCustomerNotFound', async () => {
121
    when(
122
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
123
    ).thenResolve(null);
124
125
    try {
126
      expect(await handler.execute(command)).toBe(
127
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
128
      );
129
    } catch (e) {
130
      expect(e).toBeInstanceOf(CustomerNotFoundException);
131
      expect(e.message).toBe('customer.errors.not_found');
132
      verify(
133
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
134
      ).once();
135
      verify(projectRepository.findOneById(anything())).never();
136
      verify(quoteIdGenerator.generate()).never();
137
      verify(quoteRepository.save(anything())).never();
138
    }
139
  });
140
141
  it('testProjectNotFound', async () => {
142
    when(
143
      customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
144
    ).thenResolve(customer);
145
    when(
146
      projectRepository.findOneById('3d0a282f-3b3e-4ef3-948f-5ab3cb77a04c')
147
    ).thenResolve(null);
148
149
    try {
150
      expect(await handler.execute(command)).toBe(
151
        '7c35d37c-b0e3-480d-bf6c-3dc1e094886f'
152
      );
153
    } catch (e) {
154
      expect(e).toBeInstanceOf(ProjectNotFoundException);
155
      expect(e.message).toBe('project.errors.not_found');
156
      verify(
157
        customerRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
158
      ).once();
159
      verify(projectRepository.findOneById(anything())).once();
160
      verify(quoteIdGenerator.generate()).never();
161
      verify(quoteRepository.save(anything())).never();
162
    }
163
  });
164
});
165