Projekt

Obecné

Profil

Stáhnout (16 KB) Statistiky
| Větev: | Tag: | Revize:
1
package cz.zcu.kiv.backendapi.user;
2

    
3
import cz.zcu.kiv.backendapi.exception.ApiRequestException;
4
import cz.zcu.kiv.backendapi.user.password.PasswordDto;
5
import cz.zcu.kiv.backendapi.user.permission.PermissionDto;
6
import org.junit.jupiter.api.BeforeEach;
7
import org.junit.jupiter.api.Test;
8
import org.junit.jupiter.api.extension.ExtendWith;
9
import org.mockito.ArgumentCaptor;
10
import org.mockito.Mock;
11
import org.mockito.junit.jupiter.MockitoExtension;
12
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
13
import org.springframework.security.core.Authentication;
14
import org.springframework.security.core.context.SecurityContext;
15
import org.springframework.security.core.context.SecurityContextHolder;
16
import org.springframework.security.core.userdetails.UsernameNotFoundException;
17
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
18

    
19
import java.util.Collections;
20
import java.util.List;
21
import java.util.Optional;
22

    
23
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
24
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
25
import static org.junit.jupiter.api.Assertions.assertTrue;
26
import static org.mockito.ArgumentMatchers.anyString;
27
import static org.mockito.BDDMockito.given;
28
import static org.mockito.Mockito.*;
29

    
30
@ExtendWith(MockitoExtension.class)
31
class UserServiceImplTest {
32

    
33
    @Mock
34
    private UserRepository userRepository;
35

    
36
    @Mock
37
    private BCryptPasswordEncoder bCryptPasswordEncoder;
38

    
39
    private UserServiceImpl underTest;
40

    
41
    @BeforeEach
42
    void setUp() {
43
        underTest = new UserServiceImpl(userRepository, bCryptPasswordEncoder);
44
    }
45

    
46
    @Test
47
    void testCanLoadUserByUsername() {
48
        // given
49
        String email = "test@test.com";
50
        UserEntity userEntity = new UserEntity("John Doe", email, "password", (byte) 1, false);
51
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
52

    
53
        // when
54
        UserEntity user = (UserEntity) underTest.loadUserByUsername(email);
55

    
56
        // then
57
        verify(userRepository).findByEmail(email);
58
        assertThat(user).isEqualTo(userEntity);
59
    }
60

    
61
    @Test
62
    void testCanNotLoadUserByUsername() {
63
        String email = "test@test.com";
64

    
65
        // when
66
        // then
67
        assertThatThrownBy(() -> underTest.loadUserByUsername(email))
68
                .isInstanceOf(UsernameNotFoundException.class)
69
                .hasMessageContaining("User with username " + email + " not found");
70

    
71
        verify(userRepository).findByEmail(email);
72
    }
73

    
74
    @Test
75
    void testCanGetUserByName() {
76
        // given
77
        String email = "test@test.com";
78
        UserEntity userEntity = new UserEntity("John Doe", email, "password", (byte) 1, false);
79
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
80

    
81
        // when
82
        UserEntity user = underTest.getUserByName(email);
83

    
84
        // then
85
        verify(userRepository).findByEmail(email);
86
        assertThat(user).isEqualTo(userEntity);
87
    }
88

    
89
    @Test
90
    void testCanNotGetUserByName() {
91
        String email = "test@test.com";
92

    
93
        // when
94
        // then
95
        assertThatThrownBy(() -> underTest.getUserByName(email))
96
                .isInstanceOf(UsernameNotFoundException.class)
97
                .hasMessageContaining("User with username " + email + " not found");
98

    
99
        verify(userRepository).findByEmail(email);
100
    }
101

    
102
    @Test
103
    void canRegisterNewUser() {
104
        // given
105
        String email = "test@test.com";
106
        String password = "password";
107
        UserDto userDto = new UserDto("John Doe", email, new PermissionDto(), new PasswordDto(password, password));
108
        UserEntity userEntity = new UserEntity(userDto.getName(), userDto.getEmail(), bCryptPasswordEncoder.encode(password), (byte) 0, false);
109
        // when
110
        underTest.registerNewUser(userDto);
111

    
112
        // then
113
        ArgumentCaptor<UserEntity> argumentCaptor = ArgumentCaptor.forClass(UserEntity.class);
114

    
115
        verify(userRepository).save(argumentCaptor.capture());
116

    
117
        UserEntity capturedUser = argumentCaptor.getValue();
118

    
119
        assertThat(capturedUser).isEqualTo(userEntity);
120
    }
121

    
122
    @Test
123
    void canNotRegisterNewUser() {
124
        // given
125
        String email = "test@test.com";
126
        String password = "password";
127
        UserDto userDto = new UserDto("John Doe", email, new PermissionDto(), new PasswordDto(password, password));
128

    
129

    
130
        given(userRepository.findByEmail(anyString())).willReturn(Optional.of(new UserEntity()));
131

    
132
        // when
133
        // then
134
        assertThatThrownBy(() -> underTest.registerNewUser(userDto))
135
                .isInstanceOf(ApiRequestException.class)
136
                .hasMessageContaining("User with username " + email + " already exists");
137

    
138
        verify(userRepository, never()).save(any());
139
    }
140

    
141
    @Test
142
    void testCanUpdatePermissions() {
143
        // given
144
        String email = "test@test.com";
145
        String password = "password";
146
        UserEntity userEntity = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(password), (byte) 0, false);
147
        UserEntity userEntityWithChangedPermissions = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(password), (byte) 7, false);
148
        PermissionDto permissionDto = new PermissionDto(true, true, true);
149
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
150

    
151
        // when
152
        underTest.updatePermissions(email, permissionDto);
153

    
154
        // then
155
        ArgumentCaptor<UserEntity> argumentCaptor = ArgumentCaptor.forClass(UserEntity.class);
156

    
157
        verify(userRepository).save(argumentCaptor.capture());
158

    
159
        UserEntity capturedUser = argumentCaptor.getValue();
160

    
161
        assertThat(capturedUser).isEqualTo(userEntityWithChangedPermissions);
162
    }
163

    
164
    @Test
165
    void testCanNotUpdatePermissions() {
166
        // given
167
        String email = "test@test.com";
168
        PermissionDto permissionDto = new PermissionDto();
169
        given(userRepository.findByEmail(anyString())).willReturn(Optional.empty());
170

    
171
        // when
172
        // then
173
        assertThatThrownBy(() -> underTest.updatePermissions(email, permissionDto))
174
                .isInstanceOf(UsernameNotFoundException.class)
175
                .hasMessageContaining("User with username " + email + " not found");
176

    
177
        verify(userRepository, never()).save(any());
178
    }
179

    
180
    @Test
181
    void testCanNotUpdatePermissionsAdmin() {
182
        // given
183
        String email = "test@test.com";
184
        UserEntity userEntity = new UserEntity("John Doe", email, "", (byte) 0, true);
185
        PermissionDto permissionDto = new PermissionDto();
186
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
187

    
188
        // when
189
        assertThatThrownBy(() -> underTest.updatePermissions(email, permissionDto))
190
                .isInstanceOf(ApiRequestException.class)
191
                .hasMessageContaining("Permissions for user with ADMIN rights can not be changed");
192

    
193
        // then
194
        verify(userRepository, never()).delete(any());
195
    }
196

    
197
    @Test
198
    void testCanResetPassword() {
199
        // given
200
        String email = "test@test.com";
201
        String password = "password";
202
        String newPassword = "password123";
203
        UserEntity userEntity = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(password), (byte) 0, false);
204
        UserEntity userEntityWithChangedPassword = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(newPassword), (byte) 0, false);
205
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
206

    
207
        // when
208
        underTest.resetPassword(email, newPassword);
209

    
210
        // then
211
        ArgumentCaptor<UserEntity> argumentCaptor = ArgumentCaptor.forClass(UserEntity.class);
212

    
213
        verify(userRepository).save(argumentCaptor.capture());
214

    
215
        UserEntity capturedUser = argumentCaptor.getValue();
216

    
217
        assertThat(capturedUser).isEqualTo(userEntityWithChangedPassword);
218
    }
219

    
220
    @Test
221
    void testCanNotResetPassword() {
222
        // given
223
        String email = "test@test.com";
224
        String newPassword = "password123";
225
        given(userRepository.findByEmail(anyString())).willReturn(Optional.empty());
226

    
227
        // when
228
        // then
229
        assertThatThrownBy(() -> underTest.resetPassword(email, newPassword))
230
                .isInstanceOf(UsernameNotFoundException.class)
231
                .hasMessageContaining("User with username " + email + " not found");
232

    
233
        verify(userRepository, never()).save(any());
234
    }
235

    
236
    @Test
237
    void testCanNotResetSuperAdminPassword() {
238
        // given
239
        String email = "admin@admin.com";
240
        String newPassword = "password123";
241

    
242
        // when
243
        // then
244
        assertThatThrownBy(() -> underTest.resetPassword(email, newPassword))
245
                .isInstanceOf(ApiRequestException.class)
246
                .hasMessageContaining("Password for SUPER ADMIN can not be changed");
247

    
248
        verify(userRepository, never()).save(any());
249
        verify(userRepository, never()).findByEmail(any());
250
    }
251

    
252
    @Test
253
    void testCanDeleteUser() {
254
        // given
255
        String email = "test@test.com";
256
        UserEntity userEntity = new UserEntity("John Doe", email, "", (byte) 0, false);
257
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
258

    
259
        // when
260
        underTest.deleteUser(email);
261

    
262
        // then
263
        verify(userRepository).delete(userEntity);
264
    }
265

    
266
    @Test
267
    void testCanNotDeleteUser() {
268
        // given
269
        String email = "test@test.com";
270
        given(userRepository.findByEmail(email)).willReturn(Optional.empty());
271

    
272
        // when
273
        assertThatThrownBy(() -> underTest.deleteUser(email))
274
                .isInstanceOf(UsernameNotFoundException.class)
275
                .hasMessageContaining("User with username " + email + " not found");
276

    
277
        // then
278
        verify(userRepository, never()).delete(any());
279
    }
280

    
281
    @Test
282
    void testCanNotDeleteUserAdmin() {
283
        // given
284
        String email = "test@test.com";
285
        UserEntity userEntity = new UserEntity("John Doe", email, "", (byte) 0, true);
286
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
287

    
288
        // when
289
        assertThatThrownBy(() -> underTest.deleteUser(email))
290
                .isInstanceOf(ApiRequestException.class)
291
                .hasMessageContaining("User with ADMIN rights can not be deleted");
292

    
293
        // then
294
        verify(userRepository, never()).delete(any());
295
    }
296

    
297
    @Test
298
    void getAllUsers() {
299
        // given
300
        UserEntity userEntity1 = new UserEntity("first", "first@test.com", "password", (byte) 0, false);
301
        UserEntity userEntity2 = new UserEntity("second", "second@test.com", "password2", (byte) 1, false);
302
        UserEntity userEntity3 = new UserEntity("third", "third@test.com", "password3", (byte) 7, true);
303
        UserEntity userEntity4 = new UserEntity("SuperAdmin", "admin@admin.com", "password3", (byte) 7, true);
304

    
305
        UserDto userDto1 = new UserDto("first", "first@test.com", new PermissionDto(), null);
306
        UserDto userDto2 = new UserDto("second", "second@test.com", new PermissionDto(true, false, false), null);
307
        UserDto userDto3 = new UserDto("third", "third@test.com", new PermissionDto(true, true, true), null);
308

    
309
        given(userRepository.findAll()).willReturn(List.of(userEntity1, userEntity2, userEntity3, userEntity4));
310

    
311
        // when
312
        List<UserDto> allUsers = underTest.getAllUsers();
313

    
314
        // then
315
        assertThat(allUsers.size()).isEqualTo(3);
316
        assertTrue(allUsers.contains(userDto1));
317
        assertTrue(allUsers.contains(userDto2));
318
        assertTrue(allUsers.contains(userDto3));
319

    
320

    
321
        verify(userRepository).findAll();
322
    }
323

    
324
    @Test
325
    void testCanChangePassword() {
326
        // given
327
        String email = "test@test.com";
328
        String oldPassword = "password";
329
        String newPassword = "password123";
330
        given(bCryptPasswordEncoder.encode(oldPassword)).willReturn("encodedOldPassword");
331
        given(bCryptPasswordEncoder.encode(newPassword)).willReturn("encodedNewPassword");
332
        UserEntity userEntity = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(oldPassword), (byte) 0, false);
333
        UserEntity userEntityWithChangedPassword = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(newPassword), (byte) 0, false);
334
        given(bCryptPasswordEncoder.matches(any(), any())).willReturn(true);
335
        SecurityContext securityContext = mock(SecurityContext.class);
336
        Authentication authentication = mock(Authentication.class);
337
        given(securityContext.getAuthentication()).willReturn(authentication);
338
        SecurityContextHolder.setContext(securityContext);
339
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, null, Collections.emptySet());
340
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
341
        given(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).willReturn(email);
342
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
343
        // when
344
        underTest.changePassword(oldPassword, newPassword);
345

    
346
        // then
347
        ArgumentCaptor<UserEntity> argumentCaptor = ArgumentCaptor.forClass(UserEntity.class);
348

    
349
        verify(userRepository).save(argumentCaptor.capture());
350

    
351
        UserEntity capturedUser = argumentCaptor.getValue();
352

    
353
        assertThat(capturedUser).isEqualTo(userEntityWithChangedPassword);
354
    }
355

    
356
    @Test
357
    void testCanNotChangePassword() {
358
        // given
359
        String email = "test@test.com";
360
        String oldPassword = "password";
361
        String newPassword = "password123";
362
        UserEntity userEntity = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(oldPassword), (byte) 0, false);
363
        given(bCryptPasswordEncoder.matches(any(), any())).willReturn(false);
364
        SecurityContext securityContext = mock(SecurityContext.class);
365
        Authentication authentication = mock(Authentication.class);
366
        given(securityContext.getAuthentication()).willReturn(authentication);
367
        SecurityContextHolder.setContext(securityContext);
368
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, null, Collections.emptySet());
369
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
370
        given(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).willReturn(email);
371
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
372

    
373
        // when
374
        // then
375
        assertThatThrownBy(() -> underTest.changePassword(oldPassword, newPassword))
376
                .isInstanceOf(ApiRequestException.class)
377
                .hasMessageContaining("Old password does not match");
378

    
379
        verify(userRepository, never()).save(any());
380
    }
381

    
382
    @Test
383
    void testCanNotChangePasswordSuperAdmin() {
384
        // given
385
        String email = "admin@admin.com";
386
        String oldPassword = "password";
387
        String newPassword = "password123";
388
        UserEntity userEntity = new UserEntity("John Doe", email, bCryptPasswordEncoder.encode(oldPassword), (byte) 7, true);
389
        SecurityContext securityContext = mock(SecurityContext.class);
390
        Authentication authentication = mock(Authentication.class);
391
        given(securityContext.getAuthentication()).willReturn(authentication);
392
        SecurityContextHolder.setContext(securityContext);
393
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, null, Collections.emptySet());
394
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
395
        given(SecurityContextHolder.getContext().getAuthentication().getPrincipal()).willReturn(email);
396
        given(userRepository.findByEmail(email)).willReturn(Optional.of(userEntity));
397

    
398
        // when
399
        // then
400
        assertThatThrownBy(() -> underTest.changePassword(oldPassword, newPassword))
401
                .isInstanceOf(ApiRequestException.class)
402
                .hasMessageContaining("Can not change password for SUPER ADMIN");
403

    
404
        verify(userRepository, never()).save(any());
405
    }
406
}
(2-2/2)