223 lines
7.3 KiB
Java
223 lines
7.3 KiB
Java
package com.example.simpleblog.controller;
|
|
|
|
import com.example.simpleblog.domain.Post;
|
|
import com.example.simpleblog.repository.PostRepository;
|
|
import com.example.simpleblog.request.PostCreate;
|
|
import com.example.simpleblog.request.PostEdit;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.DisplayName;
|
|
import org.junit.jupiter.api.Test;
|
|
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.test.web.servlet.MockMvc;
|
|
|
|
import java.util.List;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.IntStream;
|
|
|
|
import static org.hamcrest.Matchers.is;
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
import static org.springframework.http.MediaType.APPLICATION_JSON;
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
|
|
|
//@WebMvcTest
|
|
@AutoConfigureMockMvc
|
|
@SpringBootTest
|
|
class PostControllerTest {
|
|
|
|
@Autowired
|
|
private MockMvc mockMvc;
|
|
|
|
@Autowired
|
|
private PostRepository postRepository;
|
|
|
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
@BeforeEach
|
|
void clean() {
|
|
postRepository.deleteAll();
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("/posts 요청시 저장된 값을 출력한다.")
|
|
void posts() throws Exception {
|
|
// given
|
|
PostCreate request = PostCreate.builder()
|
|
.title("글 제목입니다.")
|
|
.content("글 내용입니다.")
|
|
.build();
|
|
|
|
String jsonString = objectMapper.writeValueAsString(request);
|
|
|
|
// expected
|
|
mockMvc.perform(post("/posts")
|
|
.contentType(APPLICATION_JSON)
|
|
.content(jsonString)
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andExpect(content().string(""))
|
|
.andDo(print());
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("/posts 요청시 title값은 필수다.")
|
|
void posts_validation() throws Exception {
|
|
// given
|
|
PostCreate request = PostCreate.builder()
|
|
.content("글 내용입니다.")
|
|
.build();
|
|
|
|
String jsonString = objectMapper.writeValueAsString(request);
|
|
|
|
// expected
|
|
mockMvc.perform(post("/posts")
|
|
.contentType(APPLICATION_JSON)
|
|
.content(jsonString)
|
|
)
|
|
.andExpect(status().isBadRequest())
|
|
.andExpect(jsonPath("$.code").value("400"))
|
|
.andExpect(jsonPath("$.message").value("잘못된 요청입니다."))
|
|
.andExpect(jsonPath("$.validation.title").value("제목을 입력해주세요."))
|
|
.andDo(print())
|
|
;
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("/posts 요청시 DB에 값이 저장된다.")
|
|
void save_post_success() throws Exception {
|
|
// given
|
|
PostCreate request = PostCreate.builder()
|
|
.title("글 제목입니다.")
|
|
.content("글 내용입니다.")
|
|
.build();
|
|
|
|
String jsonString = objectMapper.writeValueAsString(request);
|
|
|
|
// when
|
|
mockMvc.perform(post("/posts")
|
|
.contentType(APPLICATION_JSON)
|
|
.content(jsonString)
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andDo(print())
|
|
;
|
|
|
|
// then
|
|
assertEquals(1L, postRepository.count());
|
|
|
|
Post post = postRepository.findAll().get(0);
|
|
assertEquals("글 제목입니다.", post.getTitle());
|
|
assertEquals("글 내용입니다.", post.getContent());
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("postId 로 글 조회")
|
|
void get_post_by_id_success() throws Exception {
|
|
// given
|
|
Post post = Post.builder()
|
|
.title("123456789012345")
|
|
.content("글 내용입니다.")
|
|
.build();
|
|
|
|
postRepository.save(post);
|
|
|
|
// json 응답에서 title 값 길이를 최대 10글자
|
|
|
|
// expected
|
|
mockMvc.perform(get("/posts/{postId}", post.getId())
|
|
.contentType(APPLICATION_JSON)
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andExpect(jsonPath("$.id").value(post.getId()))
|
|
.andExpect(jsonPath("$.title").value("1234567890"))
|
|
.andExpect(jsonPath("$.content").value("글 내용입니다."))
|
|
.andDo(print())
|
|
;
|
|
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("글 리스트 조회")
|
|
void get_post_list_success() throws Exception {
|
|
// given
|
|
List<Post> requestPosts = IntStream.range(1, 31)
|
|
.mapToObj(i -> Post.builder()
|
|
.title("제목 " + i)
|
|
.content("내용 " + i)
|
|
.build()
|
|
)
|
|
.collect(Collectors.toList());
|
|
|
|
postRepository.saveAll(requestPosts);
|
|
|
|
// expected
|
|
mockMvc.perform(get("/posts?page=1&size=10")
|
|
.contentType(APPLICATION_JSON)
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andExpect(jsonPath("$.length()", is(10)))
|
|
.andExpect(jsonPath("$[0].id").value("30"))
|
|
.andExpect(jsonPath("$[0].title").value("제목 30"))
|
|
.andExpect(jsonPath("$[0].content").value("내용 30"))
|
|
.andDo(print())
|
|
;
|
|
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("페이지를 0으로 요청하면 첫 페이지를 가져온다.")
|
|
void get_post_list_page_0() throws Exception {
|
|
// given
|
|
List<Post> requestPosts = IntStream.range(1, 31)
|
|
.mapToObj(i -> Post.builder()
|
|
.title("제목 " + i)
|
|
.content("내용 " + i)
|
|
.build()
|
|
)
|
|
.collect(Collectors.toList());
|
|
|
|
postRepository.saveAll(requestPosts);
|
|
|
|
// expected
|
|
mockMvc.perform(get("/posts?page=0&size=10")
|
|
.contentType(APPLICATION_JSON)
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andExpect(jsonPath("$.length()", is(10)))
|
|
.andExpect(jsonPath("$[0].id").value("30"))
|
|
.andExpect(jsonPath("$[0].title").value("제목 30"))
|
|
.andExpect(jsonPath("$[0].content").value("내용 30"))
|
|
.andDo(print())
|
|
;
|
|
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("글 제목 수정")
|
|
void update_post_title_test() throws Exception {
|
|
// given
|
|
Post post = postRepository.save(Post.builder()
|
|
.title("제목")
|
|
.content("내용")
|
|
.build());
|
|
|
|
PostEdit postEdit = PostEdit.builder()
|
|
.title("제목 수정")
|
|
.content("내용")
|
|
.build();
|
|
|
|
// expected
|
|
mockMvc.perform(patch("/posts/{postId}", post.getId())
|
|
.contentType(APPLICATION_JSON)
|
|
.content(objectMapper.writeValueAsString(postEdit))
|
|
)
|
|
.andExpect(status().isOk())
|
|
.andDo(print())
|
|
;
|
|
|
|
}
|
|
} |