- Добавил модульные тесты для пользовательского сервиса.

https://www.youtube.com/watch?v=QrSR1fm9JwA&list=PLU2ftbIeotGpAYRP9Iv2KLIwK36-o_qYk&index=29
This commit is contained in:
Leonid
2025-03-04 12:20:14 +03:00
parent 2f2eacbcef
commit 6d907a725d
4 changed files with 234 additions and 4 deletions

View File

@@ -30,7 +30,7 @@
</li> </li>
<#else> <#else>
<li class="page-item"> <li class="page-item">
<a class="page-link" href="${url}?page=${p - 1}&size=${page.getSize()}" tabindex="-1">${p}</a> <a class="page-link" href="${url}?page=${p - 1}&amp;size=${page.getSize()}" tabindex="-1">${p}</a>
</li> </li>
</#if> </#if>
</#list> </#list>
@@ -47,7 +47,7 @@
</li> </li>
<#else> <#else>
<li class="page-item"> <li class="page-item">
<a class="page-link" href="${url}?page=${page.getNumber()}&size=${c}" tabindex="-1">${c}</a> <a class="page-link" href="${url}?page=${page.getNumber()}&amp;size=${c}" tabindex="-1">${c}</a>
</li> </li>
</#if> </#if>
</#list> </#list>

View File

@@ -1,4 +1,4 @@
package net.sytes.kashey.sweater; package net.sytes.kashey.sweater.controller;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,4 +1,4 @@
package net.sytes.kashey.sweater; package net.sytes.kashey.sweater.controller;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -0,0 +1,230 @@
package net.sytes.kashey.sweater.service;
import net.sytes.kashey.sweater.domain.Role;
import net.sytes.kashey.sweater.domain.User;
import net.sytes.kashey.sweater.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
class CustomUserDetailsServiceTest {
@Mock
UserRepository userRepository;
@Mock
EmailService emailService;
@Mock
PasswordEncoder passwordEncoder;
@InjectMocks
CustomUserDetailsService customUserDetailsService;
@Test
public void shouldAddUserWhenNewUserProvided() {
User user = new User();
user.setUsername("Dummy");
user.setEmail("test@gmail.com");
String isUserAdded = customUserDetailsService.addUser(user);
assertThat(isUserAdded).isEmpty();
assertThat(user.getActivationCode()).isNotNull();
assertThat(user.getRoles()).contains(Role.USER);
verify(userRepository, times(1))
.save(user);
verify(emailService, times(1))
.send(eq(user.getEmail()), anyString(), anyString());
}
@Test
public void shouldNotAddUserWhenUsernameIsEmpty() {
User user = new User();
String isUserAdded = customUserDetailsService.addUser(user);
assertThat(isUserAdded).contains("User name must not be empty!");
verify(userRepository, times(0))
.save(any(User.class));
verify(emailService, times(0))
.send(anyString(), anyString(), anyString());
}
@Test
public void shouldNotAddUserWhenUserAlreadyExists() {
User user = new User("Dummy");
when(userRepository.findByUsername(user.getUsername()))
.thenReturn(Optional.of(user));
String isUserAdded = customUserDetailsService.addUser(user);
assertThat(isUserAdded).contains("User already exists!");
verify(userRepository, times(0))
.save(user);
verify(emailService, times(0))
.send(anyString(), anyString(), anyString());
}
@Test
void shouldActivateUserWhenValidActivationCodeProvided() {
User user = new User();
user.setActivationCode("dummy_activation_code");
when(userRepository.findByActivationCode(user.getActivationCode()))
.thenReturn(user);
boolean isUserActivated = customUserDetailsService.activateUser(user.getActivationCode());
assertThat(isUserActivated).isTrue();
assertThat(user.getActivationCode()).isNull();
verify(userRepository, times(1))
.save(user);
}
@Test
void shouldNotActivateUserWhenInvalidActivationCodeProvided() {
boolean isUserActivated = customUserDetailsService.activateUser("dummy_activation_code");
assertThat(isUserActivated).isFalse();
verify(userRepository, times(0))
.save(any(User.class));
}
@Test
public void shouldUpdateUsernameAndRolesWhenValidDataProvided() {
User user = new User();
user.setUsername("oldUser");
user.setRoles(new HashSet<>(Collections.singleton(Role.USER)));
Map<String, String> form = new HashMap<>();
form.put("ADMIN", "true");
form.put("USER", "true");
customUserDetailsService.updateUser("newUser", form, user);
assertThat(user.getUsername()).isEqualTo("newUser");
assertThat(user.getRoles()).containsExactlyInAnyOrder(Role.ADMIN, Role.USER);
verify(userRepository, times(1)).save(user);
}
@Test
public void shouldUpdateEmailAndGenerateActivationCodeWhenEmailChanged() {
User user = new User();
user.setEmail("old@gmail.com");
customUserDetailsService.updateProfile(user, null, "new@gmail.com");
assertThat(user.getEmail()).isEqualTo("new@gmail.com");
assertThat(user.getActivationCode()).isNotNull();
verify(userRepository, times(1)).save(user);
verify(emailService, times(1)).send(anyString(), anyString(), anyString());
}
@Test
public void shouldUpdatePasswordWhenProvided() {
User user = new User();
user.setPassword("oldPassword");
customUserDetailsService.updateProfile(user, "newPassword", null);
assertThat(user.getPassword()).isEqualTo("newPassword");
verify(userRepository, times(1)).save(user);
verify(emailService, times(0)).send(anyString(), anyString(), anyString());
}
@Test
public void shouldUpdateBothEmailAndPasswordWhenBothProvided() {
User user = new User();
user.setEmail("old@gmail.com");
user.setPassword("oldPassword");
customUserDetailsService.updateProfile(user, "newPassword", "new@gmail.com");
assertThat(user.getEmail()).isEqualTo("new@gmail.com");
assertThat(user.getPassword()).isEqualTo("newPassword");
assertThat(user.getActivationCode()).isNotNull();
verify(userRepository, times(1)).save(user);
verify(emailService, times(1)).send(anyString(), anyString(), anyString());
}
@Test
public void shouldReturnAllUsers() {
User user1 = new User("Dummy1");
User user2 = new User("Dummy2");
List<User> users = Arrays.asList(user1, user2);
when(userRepository.findAll()).thenReturn(users);
List<User> result = customUserDetailsService.findAll();
assertThat(result).hasSize(2);
assertThat(result).contains(user1, user2);
verify(userRepository, times(1)).findAll();
}
@Test
public void shouldReturnEmptyListWhenNoUsersFound() {
when(userRepository.findAll()).thenReturn(Collections.emptyList());
List<User> result = customUserDetailsService.findAll();
assertThat(result).isEmpty();
verify(userRepository, times(1)).findAll();
}
@Test
public void shouldSubscribeUser() {
User subscriber = new User("Subscriber");
User userChannel = new User("UserChannel");
customUserDetailsService.subscribe(subscriber, userChannel);
assertThat(userChannel.getSubscribers()).contains(subscriber);
verify(userRepository, times(1)).save(userChannel);
}
@Test
public void shouldUnsubscribeUser() {
User subscriber = new User("Subscriber");
User userChannel = new User("UserChannel");
userChannel.getSubscribers().add(subscriber);
customUserDetailsService.unsubscribe(subscriber, userChannel);
assertThat(userChannel.getSubscribers()).doesNotContain(subscriber);
verify(userRepository, times(1)).save(userChannel);
}
@Test
public void shouldNotFailUnsubscribeIfUserIsNotSubscribed() {
User subscriber = new User("Subscriber");
User userChannel = new User("UserChannel");
customUserDetailsService.unsubscribe(subscriber, userChannel);
assertThat(userChannel.getSubscribers()).isEmpty();
verify(userRepository, times(1)).save(userChannel);
}
}