Fixes Minor Edge Cases and Improves UserService Testing

This commit is contained in:
2023-10-24 01:02:15 -03:00
parent 8cc2dcddf7
commit 686c800a95
2 changed files with 127 additions and 16 deletions

View File

@@ -1,5 +1,6 @@
package com.hideyoshi.backendportfolio.base.user.service; package com.hideyoshi.backendportfolio.base.user.service;
import com.hideyoshi.backendportfolio.base.user.entity.Provider;
import com.hideyoshi.backendportfolio.base.user.entity.Role; import com.hideyoshi.backendportfolio.base.user.entity.Role;
import com.hideyoshi.backendportfolio.base.user.entity.User; import com.hideyoshi.backendportfolio.base.user.entity.User;
import com.hideyoshi.backendportfolio.base.user.model.UserDTO; import com.hideyoshi.backendportfolio.base.user.model.UserDTO;
@@ -34,19 +35,13 @@ public class UserServiceImpl implements UserService {
throw new BadRequestException(String.format("User %s already exists. Try another UserName.", userOnDB.getUsername())); throw new BadRequestException(String.format("User %s already exists. Try another UserName.", userOnDB.getUsername()));
}); });
user.setPassword(this.validatePassword(user));
user.setRoles(this.validateRoles(user.getRoles()));
log.info(String.format("Saving to the database user of name: %s", user.getName())); log.info(String.format("Saving to the database user of name: %s", user.getName()));
if (Objects.nonNull(user.getPassword())) {
user.setPassword(passwordEncoder.encode(user.getPassword()));
} else {
user.setPassword("");
}
UserDTO userSaved = new UserDTO(userRepo.save(user.toEntity())); UserDTO userSaved = new UserDTO(userRepo.save(user.toEntity()));
if (!userSaved.getRoles().contains(Role.USER)) {
userSaved.getRoles().add(Role.USER);
}
return userSaved; return userSaved;
} }
@@ -147,4 +142,31 @@ public class UserServiceImpl implements UserService {
public UserDetails loadUserByUsername(String username) { public UserDetails loadUserByUsername(String username) {
return this.getUser(username); return this.getUser(username);
} }
private String validatePassword(UserDTO user) {
String password = null;
if (Objects.nonNull(user.getPassword())) {
password = passwordEncoder.encode(user.getPassword());
} else if (!user.getProvider().equals(Provider.LOCAL)) {
password = "";
}
if (Objects.isNull(password)) {
throw new BadRequestException("Password cannot be empty.");
}
return password;
}
private List<Role> validateRoles(List<Role> roles) {
if (Objects.isNull(roles)) {
roles = List.of(Role.USER);
}
if (!roles.contains(Role.USER)) {
roles.add(Role.USER);
}
return roles;
}
} }

View File

@@ -38,13 +38,11 @@ class UserServiceImplTest {
@Mock @Mock
private UserRepository userRepository; private UserRepository userRepository;
private PasswordEncoder passwordEncoder;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
this.passwordEncoder = new BCryptPasswordEncoder(); PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
this.underTest = new UserServiceImpl(userRepository,passwordEncoder); this.underTest = new UserServiceImpl(userRepository, passwordEncoder);
} }
@Test @Test
@@ -58,8 +56,10 @@ class UserServiceImplTest {
// Given // Given
UserDTO user = this.createUser(); UserDTO user = this.createUser();
// When // When
UserDTO userSaved = this.underTest.saveUser(user); UserDTO userSaved = this.underTest.saveUser(user);
//Then //Then
ArgumentCaptor<User> userArgumentCaptor = ArgumentCaptor.forClass(User.class); ArgumentCaptor<User> userArgumentCaptor = ArgumentCaptor.forClass(User.class);
@@ -68,6 +68,30 @@ class UserServiceImplTest {
assertThat(userSaved).isInstanceOf(UserDTO.class); assertThat(userSaved).isInstanceOf(UserDTO.class);
} }
@Test
void canSaveOAuthUser() {
BDDMockito.when(userRepository.findByUsername(ArgumentMatchers.any(String.class)))
.thenReturn(Optional.ofNullable(null));
BDDMockito.when(userRepository.save(ArgumentMatchers.any(User.class)))
.thenReturn(createOAuthUser().toEntity());
// Given
UserDTO user = this.createOAuthUser();
// When
UserDTO userSaved = this.underTest.saveUser(user);
//Then
ArgumentCaptor<User> userArgumentCaptor = ArgumentCaptor.forClass(User.class);
verify(userRepository).save(userArgumentCaptor.capture());
assertThat(userArgumentCaptor.getValue()).isEqualTo(user.toEntity());
assertThat(userArgumentCaptor.getValue().getPassword()).isEmpty();
assertThat(userSaved).isInstanceOf(UserDTO.class);
}
@Test @Test
void cannotSaveUser() { void cannotSaveUser() {
@@ -77,7 +101,6 @@ class UserServiceImplTest {
// Given // Given
UserDTO user = this.createUser(); UserDTO user = this.createUser();
// When
//Then //Then
assertThrows( assertThrows(
BadRequestException.class, BadRequestException.class,
@@ -88,6 +111,29 @@ class UserServiceImplTest {
); );
} }
@Test
void cannotSaveUserWithEmptyPassword() {
BDDMockito.when(userRepository.findByUsername(ArgumentMatchers.any(String.class)))
.thenReturn(Optional.ofNullable(null));
// Given
UserDTO user = this.createUser();
// When
user.setPassword(null);
//Then
assertThrows(
BadRequestException.class,
() -> {
this.underTest.saveUser(user);
},
"Password cannot be empty."
);
}
@Test @Test
void canAlterUser() { void canAlterUser() {
BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class))) BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class)))
@@ -125,6 +171,7 @@ class UserServiceImplTest {
@Test @Test
void canAddRoleToUser() { void canAddRoleToUser() {
UserDTO user = this.createUser(); UserDTO user = this.createUser();
user.setRoles(List.of());
BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class))) BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class)))
.thenReturn(Optional.ofNullable(user.toEntity())); .thenReturn(Optional.ofNullable(user.toEntity()));
@@ -347,6 +394,40 @@ class UserServiceImplTest {
); );
} }
@Test
void canDeleteUser() {
UserDTO user = this.createUser();
BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class)))
.thenReturn(Optional.ofNullable(user.toEntity()));
// When
this.underTest.deleteUser(user.getId());
// Then
ArgumentCaptor<User> argumentCaptor = ArgumentCaptor.forClass(User.class);
verify(userRepository).delete(argumentCaptor.capture());
assertThat(argumentCaptor.getValue().getId()).isEqualTo(user.getId());
}
@Test
void cannotDeleteUser() {
UserDTO user = this.createUser();
BDDMockito.when(userRepository.findById(ArgumentMatchers.any(Long.class)))
.thenReturn(Optional.ofNullable(null));
// When
// Then
assertThrows(
BadRequestException.class,
() -> {
this.underTest.deleteUser(user.getId());
},
"User doesn't exist."
);
}
private UserDTO createUser() { private UserDTO createUser() {
return UserDTO.builder() return UserDTO.builder()
.id(1L) .id(1L)
@@ -355,8 +436,16 @@ class UserServiceImplTest {
.username("Superman") .username("Superman")
.password("password") .password("password")
.provider(Provider.LOCAL) .provider(Provider.LOCAL)
.roles(List.of(Role.USER))
.build(); .build();
} }
private UserDTO createOAuthUser() {
return UserDTO.builder()
.id(1L)
.name("Clark Kent")
.email("superman@gmail.com")
.username("Superman")
.provider(Provider.GOOGLE)
.build();
}
} }