Skip to content

Commit

Permalink
#150 | Revert | Fix response type of save user endpoint (#155)
Browse files Browse the repository at this point in the history
  • Loading branch information
agitrubard authored Aug 26, 2023
1 parent 5cddddf commit 729a674
Show file tree
Hide file tree
Showing 9 changed files with 132 additions and 12 deletions.
10 changes: 7 additions & 3 deletions src/main/java/com/ays/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
import com.ays.user.model.dto.request.UserSaveRequest;
import com.ays.user.model.dto.request.UserUpdateRequest;
import com.ays.user.model.dto.response.UserResponse;
import com.ays.user.model.dto.response.UserSavedResponse;
import com.ays.user.model.dto.response.UsersResponse;
import com.ays.user.model.mapper.UserToUserResponseMapper;
import com.ays.user.model.mapper.UserToUserSavedResponseMapper;
import com.ays.user.model.mapper.UserToUsersResponseMapper;
import com.ays.user.service.UserSaveService;
import com.ays.user.service.UserService;
Expand All @@ -34,6 +36,7 @@ class UserController {
private final UserService userService;
private final UserSaveService userSaveService;

private final UserToUserSavedResponseMapper userToUserSavedResponseMapper = UserToUserSavedResponseMapper.initialize();
private final UserToUserResponseMapper userToUserResponseMapper = UserToUserResponseMapper.initialize();
private final UserToUsersResponseMapper userToUsersResponseMapper = UserToUsersResponseMapper.initialize();

Expand Down Expand Up @@ -80,9 +83,10 @@ public AysResponse<UserResponse> getUserById(@PathVariable @UUID String id) {
*/
@PostMapping("/user")
@PreAuthorize("hasAnyAuthority('ADMIN')")
public AysResponse<Void> saveUser(@RequestBody @Valid UserSaveRequest saveRequest) {
userSaveService.saveUser(saveRequest);
return AysResponse.SUCCESS;
public AysResponse<UserSavedResponse> saveUser(@RequestBody @Valid UserSaveRequest saveRequest) {
User user = userSaveService.saveUser(saveRequest);
UserSavedResponse userSavedResponse = userToUserSavedResponseMapper.map(user);
return AysResponse.successOf(userSavedResponse);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.ays.user.model.dto.response;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

/**
* A DTO class representing the response data returned when a user is saved.
* <p>
* This class provides getters and setters for the username and password fields.
* It also includes a builder pattern implementation for constructing instances of this class with optional parameters.
* <p>
* The purpose of this class is to encapsulate the response data related to saving a user, allowing for easy
* transfer of the data between different layers of the application.
*/
@Getter
@Setter
@Builder
public class UserSavedResponse {

/**
* This field is created by the application.
*/
private String username;

/**
* This field is created by the application.
*/
private String password;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.ays.user.model.mapper;

import com.ays.common.model.mapper.BaseMapper;
import com.ays.user.model.User;
import com.ays.user.model.dto.response.UserSavedResponse;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
* UserToUserResponseMapper is an interface that defines the mapping between an {@link User} and an {@link UserSavedResponse}.
* This interface uses the MapStruct annotation @Mapper to generate an implementation of this interface at compile-time.
* <p>The class provides a static method {@code initialize()} that returns an instance of the generated mapper implementation.
* <p>The interface extends the MapStruct interface {@link BaseMapper}, which defines basic mapping methods.
* The interface adds no additional mapping methods, but simply defines the types to be used in the mapping process.
*/
@Mapper
public interface UserToUserSavedResponseMapper extends BaseMapper<User, UserSavedResponse> {

/**
* Initializes the mapper.
*
* @return the initialized mapper object.
*/
static UserToUserSavedResponseMapper initialize() {
return Mappers.getMapper(UserToUserSavedResponseMapper.class);
}

}
3 changes: 2 additions & 1 deletion src/main/java/com/ays/user/service/UserSaveService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public interface UserSaveService {
* Saves a saveRequest to the database.
*
* @param saveRequest the UserSaveRequest entity
* @return User
*/
void saveUser(UserSaveRequest saveRequest);
User saveUser(UserSaveRequest saveRequest);

}
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ class UserSaveServiceImpl implements UserSaveService {
* Saves a new user based on the provided save request.
*
* @param saveRequest the request object containing user data to be saved
* @return the saved user
* @throws AysUserAlreadyExistsByPhoneNumberException if a user with the same phone number already exists
*/
public void saveUser(final UserSaveRequest saveRequest) {
public User saveUser(final UserSaveRequest saveRequest) {

final List<UserEntity> usersFromDatabase = userRepository.findAll();

Expand All @@ -57,6 +58,11 @@ public void saveUser(final UserSaveRequest saveRequest) {
);

userRepository.save(userEntity);

return User.builder()
.username(username)
.password(password)
.build();
}

/**
Expand Down
22 changes: 19 additions & 3 deletions src/test/java/com/ays/user/controller/UserControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import com.ays.user.model.UserBuilder;
import com.ays.user.model.dto.request.*;
import com.ays.user.model.dto.response.UserResponse;
import com.ays.user.model.dto.response.UserSavedResponse;
import com.ays.user.model.dto.response.UserSavedResponseBuilder;
import com.ays.user.model.dto.response.UsersResponse;
import com.ays.user.model.entity.UserEntity;
import com.ays.user.model.entity.UserEntityBuilder;
Expand All @@ -33,6 +35,7 @@
import org.springframework.data.domain.PageImpl;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.util.List;

Expand All @@ -59,11 +62,20 @@ void givenValidUserSaveRequest_whenUserSaved_thenReturnUserSavedResponse() throw
.build();

// When
Mockito.doNothing().when(userSaveService).saveUser(Mockito.any(UserSaveRequest.class));
User mockUser = new UserBuilder()
.withUsername("123456")
.withPassword("987654")
.withStatus(UserStatus.ACTIVE).build();
Mockito.when(userSaveService.saveUser(Mockito.any(UserSaveRequest.class)))
.thenReturn(mockUser);

// Then
String endpoint = BASE_PATH.concat("/user");
AysResponse<Void> mockResponse = AysResponseBuilder.SUCCESS;
UserSavedResponse mockUserSavedResponse = new UserSavedResponseBuilder()
.withUsername(mockUser.getUsername())
.withPassword(mockUser.getPassword())
.build();
AysResponse<UserSavedResponse> mockResponse = AysResponseBuilder.successOf(mockUserSavedResponse);
mockMvc.perform(AysMockMvcRequestBuilders
.post(endpoint, mockAdminUserToken.getAccessToken(), mockUserSaveRequest))
.andDo(MockMvcResultHandlers.print())
Expand All @@ -75,7 +87,11 @@ void givenValidUserSaveRequest_whenUserSaved_thenReturnUserSavedResponse() throw
.andExpect(AysMockResultMatchersBuilders.isSuccess()
.value(mockResponse.getIsSuccess()))
.andExpect(AysMockResultMatchersBuilders.response()
.doesNotExist());
.isNotEmpty())
.andExpect(MockMvcResultMatchers.jsonPath("$.response.username")
.value(mockResponse.getResponse().getUsername()))
.andExpect(MockMvcResultMatchers.jsonPath("$.response.password")
.value(mockResponse.getResponse().getPassword()));

Mockito.verify(userSaveService, Mockito.times(1))
.saveUser(Mockito.any(UserSaveRequest.class));
Expand Down
12 changes: 10 additions & 2 deletions src/test/java/com/ays/user/controller/UserSystemTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import com.ays.user.model.UserBuilder;
import com.ays.user.model.dto.request.*;
import com.ays.user.model.dto.response.UserResponse;
import com.ays.user.model.dto.response.UserSavedResponse;
import com.ays.user.model.dto.response.UserSavedResponseBuilder;
import com.ays.user.model.dto.response.UsersResponse;
import com.ays.user.model.entity.UserEntity;
import com.ays.user.model.entity.UserEntityBuilder;
Expand All @@ -29,6 +31,7 @@
import org.springframework.data.domain.PageImpl;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import java.util.List;

Expand All @@ -50,7 +53,8 @@ void givenValidUserSaveRequest_whenUserSaved_thenReturnUserSavedResponse() throw

// Then
String endpoint = BASE_PATH.concat("/user");
AysResponse<Void> response = AysResponseBuilder.SUCCESS;
UserSavedResponse userSavedResponse = new UserSavedResponseBuilder().build();
AysResponse<UserSavedResponse> response = AysResponseBuilder.successOf(userSavedResponse);
mockMvc.perform(AysMockMvcRequestBuilders
.post(endpoint, adminUserTokenOne.getAccessToken(), userSaveRequest))
.andDo(MockMvcResultHandlers.print())
Expand All @@ -62,7 +66,11 @@ void givenValidUserSaveRequest_whenUserSaved_thenReturnUserSavedResponse() throw
.andExpect(AysMockResultMatchersBuilders.isSuccess()
.value(response.getIsSuccess()))
.andExpect(AysMockResultMatchersBuilders.response()
.doesNotExist());
.isNotEmpty())
.andExpect(MockMvcResultMatchers.jsonPath("$.response.username")
.isNotEmpty())
.andExpect(MockMvcResultMatchers.jsonPath("$.response.password")
.isNotEmpty());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.ays.user.model.dto.response;

import com.ays.common.model.TestDataBuilder;

public class UserSavedResponseBuilder extends TestDataBuilder<UserSavedResponse> {

public UserSavedResponseBuilder() {
super(UserSavedResponse.class);
}

public UserSavedResponseBuilder withUsername(String username) {
data.setUsername(username);
return this;
}

public UserSavedResponseBuilder withPassword(String password) {
data.setPassword(password);
return this;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,13 @@ void givenValidUserSaveRequest_whenUserSaved_thenReturnUser() {
.thenReturn(AysRandomUtil.generateUUID());

// Then
userSaveService.saveUser(mockUserSaveRequest);

User user = userSaveService.saveUser(mockUserSaveRequest);

Assertions.assertNotNull(user.getUsername());
Assertions.assertEquals(6, user.getUsername().length());
Assertions.assertNotNull(user.getPassword());
Assertions.assertEquals(6, user.getPassword().length());

Mockito.verify(userRepository, Mockito.times(1)).findAll();
Mockito.verify(identity, Mockito.times(1)).getInstitutionId();
Mockito.verify(passwordEncoder, Mockito.times(1)).encode(Mockito.anyString());
Expand Down

0 comments on commit 729a674

Please sign in to comment.