Passed
Pull Request — master (#188)
by Mathieu
02:03
created

server/src/Application/Project/Command/CreateProjectCommandHandler.spec.ts   A

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 107
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 87
dl 0
loc 107
rs 10
c 0
b 0
f 0
wmc 2
mnd 2
bc 2
fnc 0
bpm 0
cpm 0
noi 0
1
import {instance, mock, when, deepEqual, verify, anything} from 'ts-mockito';
2
import {CreateProjectCommandHandler} from 'src/Application/Project/Command/CreateProjectCommandHandler';
3
import {ProjectRepository} from 'src/Infrastructure/Project/Repository/ProjectRepository';
4
import {IsProjectAlreadyExist} from 'src/Domain/Project/Specification/IsProjectAlreadyExist';
5
import {CreateProjectCommand} from 'src/Application/Project/Command/CreateProjectCommand';
6
import {CustomerNotFoundException} from 'src/Domain/Customer/Exception/CustomerNotFoundException';
7
import {Customer} from 'src/Domain/Customer/Customer.entity';
8
import {ProjectAlreadyExistException} from 'src/Domain/Project/Exception/ProjectAlreadyExistException';
9
import {InvoiceUnits, Project} from 'src/Domain/Project/Project.entity';
10
import {CustomerRepository} from 'src/Infrastructure/Customer/Repository/CustomerRepository';
11
12
describe('CreateProjectCommandHandler', () => {
13
  let projectRepository: ProjectRepository;
14
  let customerRepository: CustomerRepository;
15
  let isProjectAlreadyExist: IsProjectAlreadyExist;
16
  let handler: CreateProjectCommandHandler;
17
18
  const command = new CreateProjectCommand(
19
    'Project',
20
    420,
21
    InvoiceUnits.DAY,
22
    'b5e8dc18-ca67-4323-bdae-654afe09499f'
23
  );
24
25
  beforeEach(() => {
26
    projectRepository = mock(ProjectRepository);
27
    customerRepository = mock(CustomerRepository);
28
    isProjectAlreadyExist = mock(IsProjectAlreadyExist);
29
30
    handler = new CreateProjectCommandHandler(
31
      instance(projectRepository),
32
      instance(customerRepository),
33
      instance(isProjectAlreadyExist)
34
    );
35
  });
36
37
  it('testCustomerNotFound', async () => {
38
    when(
39
      customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
40
    ).thenResolve(null);
41
42
    try {
43
      await handler.execute(command);
44
    } catch (e) {
45
      expect(e).toBeInstanceOf(CustomerNotFoundException);
46
      expect(e.message).toBe('crm.customers.errors.not_found');
47
      verify(
48
        customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
49
      ).once();
50
      verify(isProjectAlreadyExist.isSatisfiedBy(anything())).never();
51
      verify(projectRepository.save(anything())).never();
52
    }
53
  });
54
55
  it('testProjectAlreadyExist', async () => {
56
    when(
57
      customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
58
    ).thenResolve(new Customer('Radio France', anything()));
59
    when(isProjectAlreadyExist.isSatisfiedBy('Project')).thenResolve(true);
60
61
    try {
62
      await handler.execute(command);
63
    } catch (e) {
64
      expect(e).toBeInstanceOf(ProjectAlreadyExistException);
65
      expect(e.message).toBe('crm.projects.errors.already_exist');
66
      verify(
67
        customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
68
      ).once();
69
      verify(isProjectAlreadyExist.isSatisfiedBy('Project')).once();
70
      verify(projectRepository.save(anything())).never();
71
    }
72
  });
73
74
  it('testProjectCreatedSuccessfully', async () => {
75
    const createdProject = mock(Project);
76
    const customer = mock(Customer);
77
78
    when(createdProject.getId()).thenReturn(
79
      'ec9b683c-c075-41d9-8f85-532b2a2428f1'
80
    );
81
    when(isProjectAlreadyExist.isSatisfiedBy('Project')).thenResolve(false);
82
    when(
83
      customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
84
    ).thenResolve(instance(customer));
85
    when(
86
      projectRepository.save(
87
        deepEqual(new Project('Project', 420, InvoiceUnits.DAY, instance(customer)))
88
      )
89
    ).thenResolve(instance(createdProject));
90
91
    expect(await handler.execute(command)).toBe(
92
      'ec9b683c-c075-41d9-8f85-532b2a2428f1'
93
    );
94
95
    verify(
96
      customerRepository.findOneById('b5e8dc18-ca67-4323-bdae-654afe09499f')
97
    ).once();
98
    verify(isProjectAlreadyExist.isSatisfiedBy('Project')).once();
99
    verify(
100
      projectRepository.save(
101
        deepEqual(new Project('Project', 420, InvoiceUnits.DAY, instance(customer)))
102
      )
103
    ).once();
104
    verify(createdProject.getId()).once();
105
  });
106
});
107