api/src/Application/User/Command/UpdateProfileCommandHandler.spec.ts   A
last analyzed

Complexity

Total Complexity 2
Complexity/F 0

Size

Lines of Code 120
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 106
mnd 2
bc 2
fnc 0
dl 0
loc 120
rs 10
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
1
import { mock, instance, when, verify, anything, anyString } from 'ts-mockito';
2
import { PasswordEncoderAdapter } from 'src/Infrastructure/Adapter/PasswordEncoderAdapter';
3
import { UpdateProfileCommandHandler } from './UpdateProfileCommandHandler';
4
import { UpdateProfileCommand } from './UpdateProfileCommand';
5
import { IsEmailAlreadyExist } from 'src/Domain/User/Specification/IsEmailAlreadyExist';
6
import { UserRepository } from 'src/Infrastructure/User/Repository/UserRepository';
7
import { User } from 'src/Domain/User/User.entity';
8
import { EmailAlreadyExistException } from 'src/Domain/User/Exception/EmailAlreadyExistException';
9
import { UserNotFoundException } from 'src/Domain/User/Exception/UserNotFoundException';
10
11
describe('UpdateProfileCommandHandler', () => {
12
  const email = '[email protected]';
13
  const user = mock(User);
14
  const command = new UpdateProfileCommand(
15
    '2bd10a90-ad92-47f7-9004-c0a493ed1e13',
16
    'Mathieu',
17
    'Marchois',
18
    '[email protected]'
19
  );
20
21
  let userRepository: UserRepository;
22
  let passwordEncoder: PasswordEncoderAdapter;
23
  let isEmailAlreadyExist: IsEmailAlreadyExist;
24
  let commandHandler: UpdateProfileCommandHandler;
25
26
  beforeEach(() => {
27
    userRepository = mock(UserRepository);
28
    passwordEncoder = mock(PasswordEncoderAdapter);
29
    isEmailAlreadyExist = mock(IsEmailAlreadyExist);
30
31
    commandHandler = new UpdateProfileCommandHandler(
32
      instance(userRepository),
33
      instance(passwordEncoder),
34
      instance(isEmailAlreadyExist)
35
    );
36
  });
37
38
  it('testUserNotFound', async () => {
39
    when(userRepository.findOneById('2bd10a90-ad92-47f7-9004-c0a493ed1e13'))
40
      .thenResolve(null);
41
42
    try {
43
      expect(await commandHandler.execute(command)).toBeUndefined();
44
    } catch (e) {
45
      expect(e).toBeInstanceOf(UserNotFoundException);
46
      expect(e.message).toBe('users.errors.not_found');
47
      verify(isEmailAlreadyExist.isSatisfiedBy(anything())).never();
48
      verify(userRepository.findOneById('2bd10a90-ad92-47f7-9004-c0a493ed1e13')).once();
49
      verify(passwordEncoder.hash(anything())).never();
50
      verify(userRepository.save(anything())).never();
51
    }
52
  });
53
54
  it('testEmailAlreadyExist', async () => {
55
    when(userRepository.findOneById('2bd10a90-ad92-47f7-9004-c0a493ed1e13'))
56
      .thenResolve(instance(user));
57
    when(user.getEmail()).thenReturn('[email protected]');
58
    when(isEmailAlreadyExist.isSatisfiedBy(email)).thenResolve(true);
59
60
    try {
61
      expect(await commandHandler.execute(command)).toBeUndefined();
62
    } catch (e) {
63
      expect(e).toBeInstanceOf(EmailAlreadyExistException);
64
      expect(e.message).toBe('users.errors.email_already_exist');
65
      verify(isEmailAlreadyExist.isSatisfiedBy(email)).once();
66
      verify(userRepository.findOneById('2bd10a90-ad92-47f7-9004-c0a493ed1e13')).once();
67
      verify(passwordEncoder.hash(anything())).never();
68
      verify(userRepository.save(anything())).never();
69
    }
70
  });
71
72
  it('testUpdateWithoutPassword', async () => {
73
    when(userRepository.findOneById('2bd10a90-ad92-47f7-9004-c0a493ed1e13'))
74
      .thenResolve(instance(user));
75
    when(isEmailAlreadyExist.isSatisfiedBy(email)).thenResolve(false);
76
77
    // Command return nothing
78
    expect(await commandHandler.execute(command)).toBeUndefined();
79
80
    verify(user.update('Mathieu', 'Marchois', '[email protected]')).once();
81
    verify(
82
      user.update('Mathieu', 'Marchois', '[email protected]')
83
    ).calledBefore(userRepository.save(instance(user)));
84
    verify(user.updatePassword(anyString())).never();
85
    verify(isEmailAlreadyExist.isSatisfiedBy(email)).once();
86
    verify(userRepository.save(instance(user))).once();
87
  });
88
89
  it('testUpdateWithPassword', async () => {
90
    const user2 = mock(User);
91
    when(userRepository.findOneById('a90-ad92-47f7-9004-c0a493ed1e13'))
92
      .thenResolve(instance(user2));
93
    const command2 = new UpdateProfileCommand(
94
      'a90-ad92-47f7-9004-c0a493ed1e13',
95
      'Mathieu',
96
      'Marchois',
97
      '[email protected]',
98
      'azerty'
99
    );
100
101
    when(isEmailAlreadyExist.isSatisfiedBy(email)).thenResolve(false);
102
    when(passwordEncoder.hash('azerty')).thenResolve('azertyCrypted');
103
104
    expect(await commandHandler.execute(command2)).toBeUndefined();
105
106
    verify(user2.update('Mathieu', 'Marchois', '[email protected]')).once();
107
    verify(user2.updatePassword('azertyCrypted')).once();
108
    verify(userRepository.findOneById('a90-ad92-47f7-9004-c0a493ed1e13')).once();
109
    verify(user2.updatePassword('azertyCrypted')).calledBefore(
110
      userRepository.save(instance(user2))
111
    );
112
    verify(passwordEncoder.hash('azerty')).once();
113
    verify(
114
      user2.update('Mathieu', 'Marchois', '[email protected]')
115
    ).calledBefore(userRepository.save(instance(user2)));
116
    verify(isEmailAlreadyExist.isSatisfiedBy(email)).once();
117
    verify(userRepository.save(instance(user2))).once();
118
  });
119
});
120