From d61921009fe33ba42b291148ae7d568c0ab607de Mon Sep 17 00:00:00 2001 From: Alina Tarasova Date: Mon, 19 Aug 2024 09:34:50 +0300 Subject: [PATCH] fix tests --- .../hexlet/code/config/SecurityConfig.java | 4 +- .../code/controller/UserTaskController.java | 39 +- .../hexlet/code/mapper/UserTaskMapper.java | 60 --- .../hexlet/code/service/UserTaskService.java | 40 +- .../controller/UserTaskControllerTest.java | 455 ++++++++---------- 5 files changed, 226 insertions(+), 372 deletions(-) delete mode 100644 src/main/java/hexlet/code/mapper/UserTaskMapper.java diff --git a/src/main/java/hexlet/code/config/SecurityConfig.java b/src/main/java/hexlet/code/config/SecurityConfig.java index 6efe515..a987c26 100644 --- a/src/main/java/hexlet/code/config/SecurityConfig.java +++ b/src/main/java/hexlet/code/config/SecurityConfig.java @@ -62,9 +62,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.POST, "/api/users").permitAll() - .requestMatchers(HttpMethod.POST, "/api/create/user").permitAll() - .requestMatchers(HttpMethod.GET, "/api/create/user").permitAll() - .requestMatchers(HttpMethod.POST, "/api/create/task").permitAll() + .requestMatchers(HttpMethod.POST, "/api/create/**").permitAll() .requestMatchers(HttpMethod.POST, "/api/user/**").permitAll() .requestMatchers(PUBLIC_URLS).permitAll() diff --git a/src/main/java/hexlet/code/controller/UserTaskController.java b/src/main/java/hexlet/code/controller/UserTaskController.java index 8c5fae3..0bfb2d0 100644 --- a/src/main/java/hexlet/code/controller/UserTaskController.java +++ b/src/main/java/hexlet/code/controller/UserTaskController.java @@ -4,18 +4,21 @@ import hexlet.code.dto.tasks.TaskDTO; import hexlet.code.dto.users.UserCreateDTO; import hexlet.code.dto.users.UserDTO; -import hexlet.code.dto.userstasks.UserTaskUpdateDTO; import hexlet.code.service.UserTaskService; import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.PostMapping; + +import hexlet.code.dto.userstasks.UserWithTaskDTO; +//import hexlet.code.dto.userstasks.UserTaskUpdateDTO; + @RestController @@ -25,33 +28,31 @@ public class UserTaskController { private final UserTaskService userTaskService; - //@PostMapping(path = "/create/user") - @GetMapping(path = "/create/user") - //@ResponseStatus(HttpStatus.CREATED) - public UserDTO create(@Valid @RequestBody UserCreateDTO taskCreateDTO) { - return userTaskService.createUser(taskCreateDTO); + @PostMapping(path = "/create/user") + @ResponseStatus(HttpStatus.CREATED) + public UserDTO create(@Valid @RequestBody UserCreateDTO userCreateDTO) { + return userTaskService.createUser(userCreateDTO); } - //@PostMapping(path = "/create/task") - @GetMapping(path = "/create/task") - //@ResponseStatus(HttpStatus.CREATED) + @PostMapping(path = "/create/task") + @ResponseStatus(HttpStatus.CREATED) public TaskDTO create(@Valid @RequestBody TaskCreateDTO taskCreateDTO) { return userTaskService.createTask(taskCreateDTO); } -// @PutMapping("/user/{userId}/task/{taskId}") -// @ResponseStatus(HttpStatus.OK) -// public void updateUserAndTask(@PathVariable Long userId, -// @PathVariable Long taskId, -// @RequestBody UserWithTaskDTO userTaskDTO) { -// userTaskService.updateUserAndTask(userId, taskId, userTaskDTO); -// } - @PutMapping("/user/{userId}/task/{taskId}") @ResponseStatus(HttpStatus.OK) public void updateUserAndTask(@PathVariable Long userId, @PathVariable Long taskId, - @RequestBody UserTaskUpdateDTO userTaskDTO) { + @RequestBody UserWithTaskDTO userTaskDTO) { userTaskService.updateUserAndTask(userId, taskId, userTaskDTO); } + +// @PutMapping("/user/{userId}/task/{taskId}") +// @ResponseStatus(HttpStatus.OK) +// public void updateUserAndTask(@PathVariable Long userId, +// @PathVariable Long taskId, +// @RequestBody UserTaskUpdateDTO userTaskDTO) { +// userTaskService.updateUserAndTask(userId, taskId, userTaskDTO); +// } } diff --git a/src/main/java/hexlet/code/mapper/UserTaskMapper.java b/src/main/java/hexlet/code/mapper/UserTaskMapper.java deleted file mode 100644 index e7d74b8..0000000 --- a/src/main/java/hexlet/code/mapper/UserTaskMapper.java +++ /dev/null @@ -1,60 +0,0 @@ -package hexlet.code.mapper; - -import hexlet.code.dto.tasks.TaskDTO; -import hexlet.code.dto.userstasks.UserWithTaskDTO; -import hexlet.code.exception.ResourceNotFoundException; -import hexlet.code.model.Task; -import hexlet.code.model.TaskStatus; -import hexlet.code.model.User; -import hexlet.code.repository.TaskStatusRepository; -import hexlet.code.repository.UserRepository; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants; -import org.mapstruct.NullValuePropertyMappingStrategy; -import org.mapstruct.ReportingPolicy; -import org.springframework.beans.factory.annotation.Autowired; - - -@Mapper( - uses = {JsonNullableMapper.class, ReferenceMapper.class}, - nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, - componentModel = MappingConstants.ComponentModel.SPRING, - unmappedTargetPolicy = ReportingPolicy.IGNORE -) -public abstract class UserTaskMapper { - @Autowired - private TaskStatusRepository taskStatusRepository; - - @Autowired - private UserRepository userRepository; - - public User map(UserWithTaskDTO userTaskDTO) { - User user = new User(); - user.setId(userTaskDTO.getId()); - user.setFirstName(userTaskDTO.getFirstName()); - user.setLastName(userTaskDTO.getLastName()); - user.setEmail(userTaskDTO.getEmail()); - user.getTasks().add(map(userTaskDTO.getTaskDTO())); - return user; - } - - public Task map(TaskDTO taskDTO) { - Task task = new Task(); - task.setId(taskDTO.getId()); - task.setName(taskDTO.getTitle()); - task.setDescription(taskDTO.getContent()); - task.setTaskStatus(slugToTaskStatus(taskDTO.getStatus())); - task.setAssignee(idToAssignee(taskDTO.getAssigneeId())); - return task; - } - - private TaskStatus slugToTaskStatus(String slug) { - return taskStatusRepository.findBySlugWithEagerUpload(slug).orElseThrow( - () -> new ResourceNotFoundException("TaskStatus with slug " + slug + " not found")); - } - - private User idToAssignee(Long assigneeId) { - return userRepository.findById(assigneeId).orElseThrow( - () -> new ResourceNotFoundException("User with id " + assigneeId + " not found")); - } -} diff --git a/src/main/java/hexlet/code/service/UserTaskService.java b/src/main/java/hexlet/code/service/UserTaskService.java index 4a51d7b..8feafb4 100644 --- a/src/main/java/hexlet/code/service/UserTaskService.java +++ b/src/main/java/hexlet/code/service/UserTaskService.java @@ -2,24 +2,24 @@ import hexlet.code.dto.tasks.TaskCreateDTO; import hexlet.code.dto.tasks.TaskDTO; -import hexlet.code.dto.tasks.TaskUpdateDTO; import hexlet.code.dto.users.UserCreateDTO; import hexlet.code.dto.users.UserDTO; -import hexlet.code.dto.users.UserUpdateDTO; -import hexlet.code.dto.userstasks.UserTaskUpdateDTO; import hexlet.code.exception.ResourceNotFoundException; import hexlet.code.mapper.TaskMapper; import hexlet.code.mapper.UserMapper; -import hexlet.code.mapper.UserTaskMapper; import hexlet.code.model.Task; import hexlet.code.model.User; import hexlet.code.repository.TaskRepository; import hexlet.code.repository.UserRepository; -import jakarta.transaction.Transactional; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import hexlet.code.dto.userstasks.UserWithTaskDTO; +//import hexlet.code.dto.users.UserUpdateDTO; +//import hexlet.code.dto.userstasks.UserTaskUpdateDTO; +//import hexlet.code.dto.tasks.TaskUpdateDTO; + @Service @AllArgsConstructor @@ -28,7 +28,6 @@ public class UserTaskService { private final TaskRepository taskRepository; private final UserMapper userMapper; private final TaskMapper taskMapper; - private final UserTaskMapper mapper; public UserDTO createUser(UserCreateDTO userCreateDTO) { @@ -37,29 +36,21 @@ public UserDTO createUser(UserCreateDTO userCreateDTO) { return userMapper.map(user); } - public TaskDTO createTask(TaskCreateDTO taskCreateDTO) { var task = taskMapper.map(taskCreateDTO); taskRepository.save(task); return taskMapper.map(task); } - @Transactional - public void updateUserAndTask(Long userId, Long taskId, UserTaskUpdateDTO userTaskUpdateDTO) { - + public void updateUserAndTask(Long userId, Long taskId, UserWithTaskDTO userTaskDTO) { User user = userRepository.findByIdWithEagerUpload(userId).orElseThrow( () -> new ResourceNotFoundException("User With Id: " + userId + " Not Found")); Task task = taskRepository.findByIdWithEagerUpload(taskId).orElseThrow( () -> new ResourceNotFoundException("Task With Id: " + taskId + " Not Found")); - UserUpdateDTO userUpdateDTO = new UserUpdateDTO(); - userUpdateDTO.setLastName(userTaskUpdateDTO.getLastName()); - - TaskUpdateDTO taskUpdateDTO = userTaskUpdateDTO.getTaskUpdateDTO(); - - userMapper.update(userUpdateDTO, user); - taskMapper.update(taskUpdateDTO, task); + user.setLastName(userTaskDTO.getLastName()); + task.setName(userTaskDTO.getTaskDTO().getTitle()); user.addTask(task); // MERGE userRepository.save(user); @@ -67,8 +58,7 @@ public void updateUserAndTask(Long userId, Long taskId, UserTaskUpdateDTO userTa ResponseEntity.ok().build(); } - - // public void updateUserAndTask(Long userId, Long taskId, UserWithTaskDTO userTaskDTO) { + // public void updateUserAndTask(Long userId, Long taskId, UserTaskUpdateDTO userTaskUpdateDTO) { // // User user = userRepository.findByIdWithEagerUpload(userId).orElseThrow( // () -> new ResourceNotFoundException("User With Id: " + userId + " Not Found")); @@ -76,13 +66,13 @@ public void updateUserAndTask(Long userId, Long taskId, UserTaskUpdateDTO userTa // Task task = taskRepository.findByIdWithEagerUpload(taskId).orElseThrow( // () -> new ResourceNotFoundException("Task With Id: " + taskId + " Not Found")); // -// user.setLastName(userTaskDTO.getLastName()); -// task.setName(userTaskDTO.getTaskDTO().getTitle()); +// UserUpdateDTO userUpdateDTO = new UserUpdateDTO(); +// userUpdateDTO.setLastName(userTaskUpdateDTO.getLastName()); +// +// TaskUpdateDTO taskUpdateDTO = userTaskUpdateDTO.getTaskUpdateDTO(); // -//// User updatedUser = mapper.map(userTaskDTO); -//// Task updatedTask = mapper.map(userTaskDTO.getTaskDTO()); -//// user.setLastName(updatedUser.getLastName()); -//// task.setName(updatedTask.getName()); +// userMapper.update(userUpdateDTO, user); +// taskMapper.update(taskUpdateDTO, task); // // user.addTask(task); // MERGE // userRepository.save(user); diff --git a/src/test/java/hexlet/code/controller/UserTaskControllerTest.java b/src/test/java/hexlet/code/controller/UserTaskControllerTest.java index 6a3682e..353149a 100644 --- a/src/test/java/hexlet/code/controller/UserTaskControllerTest.java +++ b/src/test/java/hexlet/code/controller/UserTaskControllerTest.java @@ -1,276 +1,201 @@ package hexlet.code.controller; -//import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -//import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; -//import static org.springframework.test.web.client.match.MockRestRequestMatchers.jsonPath; -//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -//import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -//import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -// -//import com.fasterxml.jackson.core.JsonProcessingException; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; + +import hexlet.code.model.TaskStatus; +import hexlet.code.repository.TaskStatusRepository; +import hexlet.code.util.ModelGenerator; +import org.instancio.Instancio; +import com.fasterxml.jackson.databind.ObjectMapper; +import hexlet.code.dto.tasks.TaskCreateDTO; +import hexlet.code.dto.tasks.TaskDTO; +import hexlet.code.dto.users.UserCreateDTO; +import hexlet.code.dto.userstasks.UserWithTaskDTO; +import hexlet.code.mapper.TaskMapper; +import hexlet.code.mapper.UserMapper; +import hexlet.code.model.Task; +import hexlet.code.model.User; +import hexlet.code.repository.TaskRepository; +import hexlet.code.repository.UserRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + //import hexlet.code.dto.tasks.TaskUpdateDTO; //import hexlet.code.dto.userstasks.UserTaskUpdateDTO; -//import hexlet.code.repository.TaskStatusRepository; -//import hexlet.code.util.ModelGenerator; -//import org.assertj.core.api.Assertions; -//import org.instancio.Instancio; -//import org.json.JSONException; //import org.openapitools.jackson.nullable.JsonNullable; -//import org.skyscreamer.jsonassert.JSONAssert; -// -//import com.fasterxml.jackson.databind.ObjectMapper; -//import hexlet.code.dto.tasks.TaskCreateDTO; -//import hexlet.code.dto.tasks.TaskDTO; -//import hexlet.code.dto.users.UserCreateDTO; -//import hexlet.code.dto.users.UserDTO; -//import hexlet.code.dto.userstasks.UserWithTaskDTO; -//import hexlet.code.mapper.TaskMapper; -//import hexlet.code.mapper.UserMapper; -//import hexlet.code.model.Task; -//import hexlet.code.model.User; -//import hexlet.code.repository.TaskRepository; -//import hexlet.code.repository.UserRepository; -//import org.junit.jupiter.api.AfterEach; -//import org.junit.jupiter.api.Test; -//import org.junit.jupiter.api.BeforeEach; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.http.MediaType; -//import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; -//import org.springframework.test.web.servlet.MockMvc; -//import org.springframework.test.web.servlet.setup.MockMvcBuilders; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.context.WebApplicationContext; -// -// -//@SpringBootTest -//@AutoConfigureMockMvc -//@RequestMapping("/api") -//public class UserTaskControllerTest { -// -// @Autowired -// private MockMvc mockMvc; -// -// @Autowired -// private ObjectMapper om; -// -// @Autowired -// private WebApplicationContext wac; -// -// @Autowired -// private UserRepository userRepository; -// -// @Autowired -// private TaskRepository taskRepository; -// -// @Autowired -// private TaskStatusRepository taskStatusRepository; -// -// @Autowired -// private UserMapper userMapper; -// -// @Autowired -// private TaskMapper taskMapper; -// -// @Autowired -// private ModelGenerator modelGenerator; -// -// private UserCreateDTO userCreateDTO; -// private TaskCreateDTO taskCreateDTO; -// private UserWithTaskDTO userTaskDTO; -// private SecurityMockMvcRequestPostProcessors.JwtRequestPostProcessor token; -// private Task taskModel; -// private User userModel; -// -// @BeforeEach -// public void setup() { -// mockMvc = MockMvcBuilders.webAppContextSetup(wac).apply(springSecurity()).build(); -// -// userCreateDTO = new UserCreateDTO(); -// userCreateDTO.setFirstName("FirstName"); -// userCreateDTO.setLastName("LastName"); -// userCreateDTO.setEmail("test.user@example.com"); -// userCreateDTO.setPassword("password"); -// -// taskCreateDTO = new TaskCreateDTO(); -// taskCreateDTO.setTitle("Task Title"); -// taskCreateDTO.setContent("Task Content"); -// taskCreateDTO.setStatus("draft"); -// -// userModel = Instancio.of(modelGenerator.getUserModel()).create(); -// userRepository.save(userModel); -// token = jwt().jwt(builder -> builder.subject(userModel.getEmail())); -//// -//// TaskStatus testStatus = Instancio.of(modelGenerator.getTaskStatusModel()).create(); -//// taskStatusRepository.save(testStatus); -//// -//// taskModel = Instancio.of(modelGenerator.getTaskModel()).create(); -//// taskModel.setAssignee(userModel); -//// taskModel.setTaskStatus(testStatus); -//// taskRepository.save(taskModel); -// } -// -// @AfterEach -// public void clean() { -// taskRepository.deleteAll(); -// userRepository.deleteAll(); -// } -// -// // ПАДАЕТ С 404 -// @Test -// public void testCreateUser() throws Exception { -// //mockMvc.perform(post("/create/user") -// mockMvc.perform(get("/create/user") -// .with(token) -// .contentType(MediaType.APPLICATION_JSON) -// .content(om.writeValueAsString(userCreateDTO))); -//// .andExpect(status().isCreated()) -//// .andExpect((ResultMatcher) jsonPath("$.firstName").value("FirstName")) -//// .andExpect((ResultMatcher) jsonPath("$.lastName").value("LastName")); -// var user = userRepository.findByEmailWithEagerUpload(userCreateDTO.getEmail()).orElseThrow(); -// -// Assertions.assertThat(user).isNotNull(); -// Assertions.assertThat(user.getFirstName()).isEqualTo(userCreateDTO.getFirstName()); -// Assertions.assertThat(user.getLastName()).isEqualTo(userCreateDTO.getLastName()); -// } -// -//// @Test -//// public void testCreateTask() throws Exception { -//// mockMvc.perform(post("/create/task") -//// .contentType(MediaType.APPLICATION_JSON) -//// .content(om.writeValueAsString(taskCreateDTO))) -//// .andExpect(status().isCreated()) -//// .andExpect(jsonPath("$.title").value("Task Title")) -//// .andExpect(jsonPath("$.content").value("Task Content")); -//// } -// -// @Test -// public void testJSON() throws JSONException, JsonProcessingException { -// UserCreateDTO testUser = new UserCreateDTO(); -// testUser.setFirstName("FirstName"); -// testUser.setLastName("LastName"); -// testUser.setEmail("test.user@example.com"); -// testUser.setPassword("password"); -// -// User user = userMapper.map(testUser); -// userRepository.save(user); // user.id = 2; -// token = jwt().jwt(builder -> builder.subject(user.getEmail())); -// System.out.println("1 SAVE USER: " + user); -// -// TaskCreateDTO testTask = new TaskCreateDTO(); -// testTask.setTitle("Task Title"); -// testTask.setContent("Task Content"); -// testTask.setStatus("draft"); -// testTask.setAssigneeId(user.getId()); -// -// Task task = taskMapper.map(testTask); -// taskRepository.save(task); // task.id = 1; -// System.out.println("SAVE TASK: " + task); -// // merge -// user.addTask(task); -// userRepository.save(user); -// System.out.println("SAVE + MERGE USERTASK: " + user); -// -// userTaskDTO = new UserWithTaskDTO(); -// UserDTO userDTO = userMapper.map(user); -// userTaskDTO.setId(userDTO.getId()); -// userTaskDTO.setFirstName(userDTO.getFirstName()); -// userTaskDTO.setLastName("***"); -// userTaskDTO.setEmail(userDTO.getEmail()); -// -// TaskDTO taskDTO = taskMapper.map(task); -// taskDTO.setTitle("***"); -// userTaskDTO.setTaskDTO(taskDTO); -// -// String jsonString = om.writeValueAsString(userTaskDTO); // JSON -// // -> {"id":2,"email":"test.user@example.com","firstName":"FirstName", -// // "lastName":"***","taskDTO":{"id":1,"createdAt":"2024-08-18","title":"***", -// // "content":"Task Content","status":"draft","taskLabelIds":[],"assignee_id":2}} -// -// String expectedJson = "{" -// + "\"id\": 2," -// + "\"email\": \"test.user@example.com\"," -// + "\"firstName\": \"FirstName\"," -// + "\"lastName\": \"***\"," -// + "\"taskDTO\": {" -// + " \"id\": 1," -// + " \"createdAt\": \"2024-08-18\"," -// + " \"title\": \"***\"," -// + " \"content\": \"Task Content\"," -// + " \"status\": \"draft\"," -// + " \"taskLabelIds\": [ ]," -// + " \"assignee_id\": 2" -// + "}}"; -// -// JSONAssert.assertEquals(expectedJson, jsonString, false); -// } -// -// // ПАДАЕТ С 404 -// @Test -// public void testUpdateUserAndTask() throws Exception { -// UserCreateDTO testUser = new UserCreateDTO(); -// testUser.setFirstName("FirstName"); -// testUser.setLastName("LastName"); -// testUser.setEmail("test.user@example.com"); -// testUser.setPassword("password"); -// -// User user = userMapper.map(testUser); -// userRepository.save(user); // user.id = 2; -// token = jwt().jwt(builder -> builder.subject(user.getEmail())); -// -// TaskCreateDTO testTask = new TaskCreateDTO(); -// testTask.setTitle("Task Title"); -// testTask.setContent("Task Content"); -// testTask.setStatus("draft"); -// testTask.setAssigneeId(user.getId()); -// -// Task task = taskMapper.map(testTask); -// taskRepository.save(task); // task.id = 1; -// -// // merge -// user.addTask(task); -// userRepository.save(user); -// -//// // Если используется UserWithTaskDTO: -//// userTaskDTO = new UserWithTaskDTO(); -//// userTaskDTO.setId(user.getId()); -//// userTaskDTO.setFirstName(user.getFirstName()); -//// userTaskDTO.setLastName("***"); -//// userTaskDTO.setEmail(user.getEmail()); -//// -//// TaskDTO taskDTO = taskMapper.map(task); -//// taskDTO.setTitle("***"); -//// userTaskDTO.setTaskDTO(taskDTO); -// + + +@SpringBootTest +@AutoConfigureMockMvc +public class UserTaskControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper om; + + @Autowired + private WebApplicationContext wac; + + @Autowired + private UserRepository userRepository; + + @Autowired + private TaskRepository taskRepository; + + @Autowired + private TaskStatusRepository taskStatusRepository; + + @Autowired + private UserMapper userMapper; + + @Autowired + private TaskMapper taskMapper; + + @Autowired + private ModelGenerator modelGenerator; + + private SecurityMockMvcRequestPostProcessors.JwtRequestPostProcessor token; + private UserCreateDTO userCreateDTO; + private TaskCreateDTO taskCreateDTO; + private UserWithTaskDTO userTaskDTO; + private User userModel; + private TaskStatus testStatus; + + @BeforeEach + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(wac).apply(springSecurity()).build(); + + userModel = Instancio.of(modelGenerator.getUserModel()).create(); + userRepository.save(userModel); + token = jwt().jwt(builder -> builder.subject(userModel.getEmail())); + + testStatus = Instancio.of(modelGenerator.getTaskStatusModel()).create(); + taskStatusRepository.save(testStatus); + + userCreateDTO = new UserCreateDTO(); + userCreateDTO.setFirstName("FirstName"); + userCreateDTO.setLastName("LastName"); + userCreateDTO.setEmail("test.user@example.com"); + userCreateDTO.setPassword("password"); + + taskCreateDTO = new TaskCreateDTO(); + taskCreateDTO.setTitle("Task Title"); + taskCreateDTO.setContent("Task Content"); + taskCreateDTO.setStatus(testStatus.getSlug()); +// taskCreateDTO.setStatus("draft"); // так падает с 401 ("TaskStatus with slug draft not found") + taskCreateDTO.setAssigneeId(userModel.getId()); + } + + @AfterEach + public void clean() { + taskRepository.deleteAll(); + taskStatusRepository.deleteAll(); + userRepository.deleteAll(); + } + + @Test + public void testCreateUser() throws Exception { + + mockMvc.perform(post("/api/create/user") + .contentType(MediaType.APPLICATION_JSON) + .content(om.writeValueAsString(userCreateDTO))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.firstName").value("FirstName")) + .andExpect(jsonPath("$.email").value("test.user@example.com")); + } + + @Test + public void testCreateTask() throws Exception { + + mockMvc.perform(post("/api/create/task") + .contentType(MediaType.APPLICATION_JSON) + .content(om.writeValueAsString(taskCreateDTO))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.title").value("Task Title")) + .andExpect(jsonPath("$.content").value("Task Content")); + } + + + @Test + public void testUpdateUserAndTask() throws Exception { + UserCreateDTO testUser = new UserCreateDTO(); + testUser.setFirstName("FirstName"); + testUser.setLastName("LastName"); + testUser.setEmail("test.user@example.com"); + testUser.setPassword("password"); + + User user = userMapper.map(testUser); + userRepository.save(user); // user.id = 2; + token = jwt().jwt(builder -> builder.subject(user.getEmail())); + + TaskCreateDTO testTask = new TaskCreateDTO(); + testTask.setTitle("Task Title"); + testTask.setContent("Task Content"); + testTask.setStatus(testStatus.getSlug()); + //testTask.setStatus("draft"); // так падает с 401 ("TaskStatus with slug draft not found") + testTask.setAssigneeId(user.getId()); + + Task task = taskMapper.map(testTask); + taskRepository.save(task); // task.id = 1; + + // merge + user.addTask(task); + userRepository.save(user); + + // Если используется UserWithTaskDTO: + userTaskDTO = new UserWithTaskDTO(); + userTaskDTO.setId(user.getId()); + userTaskDTO.setFirstName(user.getFirstName()); + userTaskDTO.setLastName("***"); + userTaskDTO.setEmail(user.getEmail()); + + TaskDTO taskDTO = taskMapper.map(task); + taskDTO.setTitle("***"); + userTaskDTO.setTaskDTO(taskDTO); + // // Если используется UserTaskUpdateDTO: // UserTaskUpdateDTO userTaskUpdateDTO = new UserTaskUpdateDTO(); // TaskUpdateDTO taskUpdateDTO = new TaskUpdateDTO(); // taskUpdateDTO.setTitle(JsonNullable.of("***")); // userTaskUpdateDTO.setTaskUpdateDTO(taskUpdateDTO); // userTaskUpdateDTO.setLastName(JsonNullable.of("***")); -// -// -// -// mockMvc.perform(put("/user/2/task/1") -// .with(token) -// .contentType(MediaType.APPLICATION_JSON) -// //.content(om.writeValueAsString(userTaskDTO))); -// .content(om.writeValueAsString(userTaskUpdateDTO))); -// //.andExpect(status().isOk()); -// -// // Проверка обновления пользователя -// User updatedUser = userRepository.findByIdWithEagerUpload(2L).orElseThrow(); -// assertThat(updatedUser.getLastName()).isEqualTo("***"); -// -// // Проверка обновления задачи -// Task updatedTask = taskRepository.findByIdWithEagerUpload(task.getId()).orElseThrow(); -// assertThat(updatedTask.getName()).isEqualTo("***"); -// -// // Проверка связи между пользователем и задачей -// assertThat(updatedUser.getTasks().size()).isEqualTo(1); -// assertThat(updatedTask.getAssignee()).isEqualTo(updatedUser); -// } -//} + + + + mockMvc.perform(put("/api/user/2/task/1") + .with(token) + .contentType(MediaType.APPLICATION_JSON) + .content(om.writeValueAsString(userTaskDTO))) + //.content(om.writeValueAsString(userTaskUpdateDTO))) + .andExpect(status().isOk()); + + // Проверка обновления пользователя + User updatedUser = userRepository.findByIdWithEagerUpload(2L).orElseThrow(); + assertThat(updatedUser.getLastName()).isEqualTo("***"); + + // Проверка обновления задачи + Task updatedTask = taskRepository.findByIdWithEagerUpload(task.getId()).orElseThrow(); + assertThat(updatedTask.getName()).isEqualTo("***"); + + // Проверка связи между пользователем и задачей + assertThat(updatedUser.getTasks().size()).isEqualTo(1); + assertThat(updatedTask.getAssignee()).isEqualTo(updatedUser); + } +}