Passed
Pull Request — master (#165)
by Mathieu
01:54
created

server/src/Application/Accounting/Command/Invoice/GenerateInvoiceCommandHandler.spec.ts   A

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 132
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 110
dl 0
loc 132
rs 10
c 0
b 0
f 0
wmc 2
mnd 2
bc 2
fnc 0
bpm 0
cpm 0
noi 0
1
import { mock, instance, when, verify, anything } from 'ts-mockito';
2
import { ProjectRepository } from 'src/Infrastructure/Project/Repository/ProjectRepository';
3
import { GenerateInvoiceCommandHandler } from './GenerateInvoiceCommandHandler';
4
import { GenerateInvoiceCommand } from './GenerateInvoiceCommand';
5
import { User } from 'src/Domain/HumanResource/User/User.entity';
6
import { ProjectNotFoundException } from 'src/Domain/Project/Exception/ProjectNotFoundException';
7
import { InvoiceIdGenerator } from 'src/Domain/Accounting/Generators/InvoiceIdGenerator';
8
import { InvoiceStatus } from 'src/Domain/Accounting/Invoice.entity';
9
import { EventRepository } from 'src/Infrastructure/FairCalendar/Repository/EventRepository';
10
import { InvoiceRepository } from 'src/Infrastructure/Accounting/Repository/InvoiceRepository';
11
import { InvoiceItemRepository } from 'src/Infrastructure/Accounting/Repository/InvoiceItemRepository';
12
import { DateUtilsAdapter } from 'src/Infrastructure/Adapter/DateUtilsAdapter';
13
import { Project } from 'src/Domain/Project/Project.entity';
14
import { NoBillableEventsFoundException } from 'src/Domain/Accounting/Exception/NoBillableEventsFoundException';
15
16
describe('GenerateInvoiceCommandHandler', () => {
17
  let projectRepository: ProjectRepository;
18
  let eventRepository: EventRepository;
19
  let invoiceRepository: InvoiceRepository;
20
  let invoiceItemRepository: InvoiceItemRepository;
21
  let invoiceIdGenerator: InvoiceIdGenerator;
22
  let dateUtilsAdapter: DateUtilsAdapter;
23
  let handler: GenerateInvoiceCommandHandler;
24
25
  const user = mock(User);
26
  const project = mock(Project);
27
  const date = new Date('2020-11-23T17:43:14.299Z');
28
  const command = new GenerateInvoiceCommand(
29
    'a491ccc9-df7c-4fc6-8e90-db816208f689',
30
    InvoiceStatus.DRAFT,
31
    30,
32
    date,
33
    instance(user)
34
  );
35
36
  beforeEach(() => {
37
    projectRepository = mock(ProjectRepository);
38
    invoiceIdGenerator = mock(InvoiceIdGenerator);
39
    eventRepository = mock(EventRepository);
40
    invoiceRepository = mock(InvoiceRepository);
41
    invoiceItemRepository = mock(InvoiceItemRepository);
42
    dateUtilsAdapter = mock(DateUtilsAdapter);
43
44
    handler = new GenerateInvoiceCommandHandler(
45
      instance(projectRepository),
46
      instance(eventRepository),
47
      instance(invoiceRepository),
48
      instance(invoiceItemRepository),
49
      instance(dateUtilsAdapter),
50
      instance(invoiceIdGenerator),
51
    );
52
  });
53
54
  it('testProjectNotFound', async () => {
55
    when(
56
      projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
57
    ).thenResolve(null);
58
59
    try {
60
      await handler.execute(command);
61
    } catch (e) {
62
      expect(e).toBeInstanceOf(ProjectNotFoundException);
63
      expect(e.message).toBe('crm.projects.errors.not_found');
64
      verify(
65
        projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
66
      ).once();
67
      verify(invoiceIdGenerator.generate()).never();
68
      verify(eventRepository.findBillableEventsByMonthAndProject(anything(), anything())).never();
69
      verify(dateUtilsAdapter.addDaysToDate(anything(), anything())).never();
70
      verify(invoiceRepository.save(anything())).never();
71
      verify(invoiceItemRepository.save(anything())).never();
72
    }
73
  });
74
75
  it('testNoBillableEventsFound', async () => {
76
    when(
77
      projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
78
    ).thenResolve(instance(project));
79
    when(invoiceIdGenerator.generate()).thenResolve('FS-2020-0001');
80
    when(
81
      eventRepository.findBillableEventsByMonthAndProject(date, instance(project))
82
    ).thenResolve([]);
83
84
    try {
85
      await handler.execute(command);
86
    } catch (e) {
87
      expect(e).toBeInstanceOf(NoBillableEventsFoundException);
88
      expect(e.message).toBe('accounting.invoice.errors.no_billable_events_found');
89
      verify(
90
        projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
91
      ).once();
92
      verify(invoiceIdGenerator.generate()).once();
93
      verify(
94
        eventRepository.findBillableEventsByMonthAndProject(date, instance(project))
95
      ).once();
96
      verify(dateUtilsAdapter.addDaysToDate(anything(), anything())).never();
97
      verify(invoiceRepository.save(anything())).never();
98
      verify(invoiceItemRepository.save(anything())).never();
99
    }
100
  });
101
102
  it('testGenerateInvoice', async () => {
103
    const events = [
104
      {
105
106
      }
107
    ];
108
109
    when(
110
      projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
111
    ).thenResolve(instance(project));
112
    when(invoiceIdGenerator.generate()).thenResolve('FS-2020-0001');
113
    when(
114
      eventRepository.findBillableEventsByMonthAndProject(date, instance(project))
115
    ).thenResolve(events);
116
117
118
    await handler.execute(command);
119
120
    verify(
121
      projectRepository.findOneById('a491ccc9-df7c-4fc6-8e90-db816208f689')
122
    ).once();
123
    verify(invoiceIdGenerator.generate()).once();
124
    verify(
125
      eventRepository.findBillableEventsByMonthAndProject(date, instance(project))
126
    ).once();
127
    verify(dateUtilsAdapter.addDaysToDate(anything(), anything())).never();
128
    verify(invoiceRepository.save(anything())).never();
129
    verify(invoiceItemRepository.save(anything())).never();
130
  });
131
});
132