diff --git a/src/main/java/io/hexlet/blog/mapper/PostCommentMapper.java b/src/main/java/io/hexlet/blog/mapper/PostCommentMapper.java index d0d27bb..c36c251 100644 --- a/src/main/java/io/hexlet/blog/mapper/PostCommentMapper.java +++ b/src/main/java/io/hexlet/blog/mapper/PostCommentMapper.java @@ -19,5 +19,9 @@ public abstract class PostCommentMapper { @Mapping(source = "author.id", target = "authorId") @Mapping(source = "post.id", target = "postId") public abstract PostCommentDTO map(PostComment model); + + @Mapping(source = "authorId", target = "author.id") + @Mapping(source = "postId", target = "post.id") + public abstract PostComment map(PostCommentDTO model); } diff --git a/src/main/java/io/hexlet/blog/mapper/PostMapper.java b/src/main/java/io/hexlet/blog/mapper/PostMapper.java index d7c3e08..e822f43 100644 --- a/src/main/java/io/hexlet/blog/mapper/PostMapper.java +++ b/src/main/java/io/hexlet/blog/mapper/PostMapper.java @@ -25,5 +25,8 @@ public abstract class PostMapper { @Mapping(source = "author.id", target = "authorId") public abstract PostDTO map(Post model); + @Mapping(source = "authorId", target = "author.id") + public abstract Post map(PostDTO model); + public abstract void update(PostUpdateDTO dto, @MappingTarget Post model); } diff --git a/src/main/java/io/hexlet/blog/mapper/UserMapper.java b/src/main/java/io/hexlet/blog/mapper/UserMapper.java index c7ea1dc..0e70735 100644 --- a/src/main/java/io/hexlet/blog/mapper/UserMapper.java +++ b/src/main/java/io/hexlet/blog/mapper/UserMapper.java @@ -35,6 +35,9 @@ public abstract class UserMapper { @Mapping(target = "password", ignore = true) public abstract UserDTO map(User model); + @Mapping(target = "email", source = "username") + public abstract User map(UserDTO model); + public abstract void update(UserUpdateDTO update, @MappingTarget User destination); @BeforeMapping diff --git a/src/test/java/io/hexlet/blog/controller/api/PostsCommentsControllerTest.java b/src/test/java/io/hexlet/blog/controller/api/PostsCommentsControllerTest.java index 03a73c2..60dfb9d 100644 --- a/src/test/java/io/hexlet/blog/controller/api/PostsCommentsControllerTest.java +++ b/src/test/java/io/hexlet/blog/controller/api/PostsCommentsControllerTest.java @@ -6,6 +6,11 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.hexlet.blog.dto.PostCommentDTO; +import io.hexlet.blog.mapper.PostCommentMapper; +import org.assertj.core.api.Assertions; import org.instancio.Instancio; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -25,6 +30,9 @@ import org.springframework.web.context.WebApplicationContext; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + @SpringBootTest @Transactional @@ -53,6 +61,13 @@ public class PostsCommentsControllerTest { private Post testPost; + @Autowired + private ObjectMapper om; + + @Autowired + private PostCommentMapper postCommentMapper; + + @BeforeEach public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac) @@ -89,10 +104,15 @@ public void testIndex() throws Exception { .andExpect(status().isOk()) .andReturn(); var body = result.getResponse().getContentAsString(); - assertThatJson(body) - .node("content") - .isArray() - .hasSize(2); + + Map content = om.readValue(body, new TypeReference<>() {}); + var postComments = content.get("content"); + + List postCommentDTOS = om.convertValue(postComments, new TypeReference<>() {}); + + var actual = postCommentDTOS.stream().map(postCommentMapper::map).toList(); + var expected = postCommentRepository.findAll(); + Assertions.assertThat(actual).containsExactlyInAnyOrderElementsOf(expected); } @Test @@ -102,9 +122,8 @@ public void testFilteredIndex() throws Exception { .andReturn(); var body = result.getResponse().getContentAsString(); assertThatJson(body) - .node("content") - .isArray() - .hasSize(1); + .node("content") + .isArray() + .hasSize(1); } } - diff --git a/src/test/java/io/hexlet/blog/controller/api/PostsControllerTest.java b/src/test/java/io/hexlet/blog/controller/api/PostsControllerTest.java index f283b21..11d8b89 100644 --- a/src/test/java/io/hexlet/blog/controller/api/PostsControllerTest.java +++ b/src/test/java/io/hexlet/blog/controller/api/PostsControllerTest.java @@ -11,6 +11,9 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.core.type.TypeReference; +import io.hexlet.blog.dto.PostDTO; +import org.assertj.core.api.Assertions; import org.instancio.Instancio; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -34,6 +37,8 @@ import org.springframework.web.context.WebApplicationContext; import java.nio.charset.StandardCharsets; +import java.util.List; + @SpringBootTest @AutoConfigureMockMvc @@ -64,6 +69,7 @@ public class PostsControllerTest { private Post testPost; + @BeforeEach public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac) @@ -81,11 +87,18 @@ public void setUp() { @Test public void testIndex() throws Exception { postRepository.save(testPost); - var result = mockMvc.perform(get("/api/posts").with(token)) + + var response = mockMvc.perform(get("/api/posts").with(token)) .andExpect(status().isOk()) - .andReturn(); - var body = result.getResponse().getContentAsString(); - assertThatJson(body).isArray(); + .andReturn() + .getResponse(); + var body = response.getContentAsString(); + + List postDTOS = om.readValue(body, new TypeReference<>() {}); + + var actual = postDTOS.stream().map(postMapper::map).toList(); + var expected = postRepository.findAll(); + Assertions.assertThat(actual).containsExactlyInAnyOrderElementsOf(expected); } @Test diff --git a/src/test/java/io/hexlet/blog/controller/api/UsersControllerTest.java b/src/test/java/io/hexlet/blog/controller/api/UsersControllerTest.java index 62c4940..2e22efe 100644 --- a/src/test/java/io/hexlet/blog/controller/api/UsersControllerTest.java +++ b/src/test/java/io/hexlet/blog/controller/api/UsersControllerTest.java @@ -1,17 +1,23 @@ package io.hexlet.blog.controller.api; +import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.List; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import com.fasterxml.jackson.core.type.TypeReference; +import io.hexlet.blog.dto.UserDTO; +import io.hexlet.blog.mapper.UserMapper; +import org.assertj.core.api.Assertions; import org.instancio.Instancio; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,6 +37,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; + @SpringBootTest @AutoConfigureMockMvc public class UsersControllerTest { @@ -53,10 +60,14 @@ public class UsersControllerTest { @Autowired private ObjectMapper om; + @Autowired + private UserMapper userMapper; + private JwtRequestPostProcessor token; private User testUser; + @BeforeEach public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac) @@ -73,12 +84,21 @@ public void setUp() { @Test public void testIndex() throws Exception { - mockMvc.perform(get("/api/users").with(jwt())) - .andExpect(status().isOk()); + var response = mockMvc.perform(get("/api/users").with(jwt())) + .andExpect(status().isOk()) + .andReturn() + .getResponse(); + var body = response.getContentAsString(); + + List userDTOS = om.readValue(body, new TypeReference<>() {}); + + var actual = userDTOS.stream().map(userMapper::map).toList(); + var expected = userRepository.findAll(); + Assertions.assertThat(actual).containsExactlyInAnyOrderElementsOf(expected); } @Test - void testCreate() throws Exception { + public void testCreate() throws Exception { var data = Instancio.of(modelGenerator.getUserModel()) .create(); @@ -108,9 +128,22 @@ public void testUpdate() throws Exception { .content(om.writeValueAsString(data)); mockMvc.perform(request) - .andExpect(status().isOk()); + .andExpect(status().isOk()); var user = userRepository.findById(testUser.getId()).get(); assertThat(user.getFirstName()).isEqualTo(("Mike")); } + + @Test + public void testShow() throws Exception { + var request = get("/api/users/" + testUser.getId()).with(jwt()); + var result = mockMvc.perform(request) + .andExpect(status().isOk()) + .andReturn(); + var body = result.getResponse().getContentAsString(); + assertThatJson(body).and( + v -> v.node("username").isEqualTo(testUser.getEmail()), + v -> v.node("firstName").isEqualTo(testUser.getFirstName()), + v -> v.node("lastName").isEqualTo(testUser.getLastName())); + } }