diff --git a/app/src/test/java/com/codesoom/assignment/application/TaskServiceTest.java b/app/src/test/java/com/codesoom/assignment/application/TaskServiceTest.java new file mode 100644 index 00000000..d19de699 --- /dev/null +++ b/app/src/test/java/com/codesoom/assignment/application/TaskServiceTest.java @@ -0,0 +1,143 @@ +package com.codesoom.assignment.application; + +import com.codesoom.assignment.TaskNotFoundException; +import com.codesoom.assignment.models.Task; +import org.assertj.core.api.Assertions; +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.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.given; + + +class TaskServiceTest { + + TaskService taskService; + + @BeforeEach + void setUp() { + taskService = new TaskService(); + } + @Test + @DisplayName("getTasks는 할 일이 비어있으면 빈 리스트를 반환한다.") + void getFirstTasksIsEmpty() { + assertThat(taskService.getTasks()).hasSize(0); + } + + @Test + @DisplayName("기존에 할일이 2개 있는 경우 2개 조회 테스트") + void getTasksSuccess() { + // given + Task task1 = new Task(); + Task task2 = new Task(); + + taskService.createTask(task1); + taskService.createTask(task2); + + // when & then + assertThat(taskService.getTasks()).hasSize(2); + } + + @Test + @DisplayName("getTasks는 해당하는 할일이 존재하는 경우 상세 할일 내용을 반환한다") + void getTaskSuccess() { + // given + Task task = new Task(); + task.setTitle("task0"); + taskService.createTask(task); + + // when & then + assertThat(taskService.getTask(1L).getTitle()).isEqualTo("task0"); + } + + @Test + @DisplayName("getTasks는 할일 상세 조회시 할일이 없는 경우 TaskNotFound 예외를 반환한다") + void getTaskFail() { + // when & then + assertThatThrownBy(() -> taskService.getTask(100L)).isInstanceOf(TaskNotFoundException.class); + } + + @Test + @DisplayName("할일을 생성후 할일이 생성되었는지 확인하는 테스트") + void createTaskSuccess() { + // given + Task task = new Task(); + task.setTitle("task0"); + + // when + Task createdTask = taskService.createTask(task); + + // then + assertThat(createdTask.getTitle()).isEqualTo("task0"); + } + + @Test + @DisplayName("할일을 수정후 수정된 할일이 반환되는지 확인하는 테스트") + void updateTaskSuccess() { + // given + Task task = new Task(); + task.setTitle("task0"); + taskService.createTask(task); + + Task updateTask = new Task(); + updateTask.setTitle("task1"); + + // when + Task updatedTask = taskService.updateTask(1L, updateTask); + + // then + assertThat(updatedTask.getTitle()).isEqualTo("task1"); + } + @Test + @DisplayName("존재하지 않는 할일을 업데이트 할 경우 예외를 반환하는 테스트") + void notExistTaskUpdateFail() { + // given + Task task = new Task(); + task.setTitle("task0"); + taskService.createTask(task); + + Task updateTask = new Task(); + updateTask.setTitle("task1"); + + // when & then + assertThatThrownBy(() -> taskService.updateTask(100L, updateTask)).isInstanceOf(TaskNotFoundException.class); + } + + @Test + @DisplayName("할일을 삭제 후 삭제 되었는지 확인하는 테스트") + void deleteTaskSuccess() { + // given + Task task = new Task(); + task.setTitle("task0"); + taskService.createTask(task); + + int oldSize = taskService.getTasks().size(); + + // when + taskService.deleteTask(1L); + + int newSize = taskService.getTasks().size(); + + // then + assertThat(newSize - oldSize).isEqualTo(-1); + } + + @Test + @DisplayName("존재하지 않는 할일을 삭제 할 경우 예외를 반환하는 테스트") + void isNotExistTaskDeleteFail() { + // given + Task task = new Task(); + task.setTitle("task0"); + taskService.createTask(task); + + // when & then + assertThatThrownBy(() -> taskService.deleteTask(100L)).isInstanceOf(TaskNotFoundException.class); + } + +} diff --git a/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerTest.java b/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerTest.java new file mode 100644 index 00000000..dd9a5894 --- /dev/null +++ b/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerTest.java @@ -0,0 +1,145 @@ +package com.codesoom.assignment.controllers; + +import com.codesoom.assignment.TaskNotFoundException; +import com.codesoom.assignment.application.TaskService; +import com.codesoom.assignment.models.Task; +import org.assertj.core.api.Assertions; +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 static org.assertj.core.api.Assertions.*; + + +class TaskControllerTest { + private TaskController taskController; + + @BeforeEach + void setUp() { + taskController = new TaskController(new TaskService()); + } + + public Task createTask() { + Task task = new Task(); + task.setTitle("task"); + return task; + } + + @Test + @DisplayName("최초 할일 생성 후 할일 리스트에 값이 늘어난지 테스트") + void createTaskSuccessTest() { + // given + Task task = createTask(); + int beforeSize = taskController.list().size(); + // when + taskController.create(task); + + // then + assertThat( + beforeSize).isEqualTo(taskController.list().size() - 1); + + } + + @Test + @DisplayName("최초 호출시 할일 리스트가 비어있는지 테스트.") + void isFirstTasksIsEmpty() { + assertThat(taskController.list()).isEmpty(); + } + + @Test + @DisplayName("할일 복수 있는 경우 해당 개수에 맞게 나오는지 테스트.") + void listSuccessTest() { + // given + Task task1 = createTask(); + Task task2 = createTask(); + + // when + taskController.create(task1); + taskController.create(task2); + + // then + assertThat(taskController.list()).hasSize(2); + } + + + @Test + @DisplayName("할일을 1개를 등록 후 해당 할일 상세 조회 테스트") + void getTaskSuccess() { + // given + Task task1 = createTask(); + + // when + taskController.create(task1); + + // then + assertThat(taskController.detail(1L).getTitle()).isEqualTo("task1"); + + } + + @Test + @DisplayName("존재하지 않지 않는 할일 조회시 TaskNotFound 예외 발생 테스트") + void getTaskFail() { + assertThatThrownBy(() -> taskController.detail(100L)) + .isInstanceOf(TaskNotFoundException.class); + } + + @Test + @DisplayName("할일 수정 후 해당 할일 값이 수정되었는지 테스트") + void updateTaskTest() { + // given + Task task = taskController.create(createTask()); + Task updateTask = new Task(); + updateTask.setTitle("updated"); + + // when + taskController.update(task.getId(), updateTask); + + // then + assertThat(taskController.detail(task.getId()).getTitle()).isEqualTo("updated"); + } + + @Test + @DisplayName("존재하지 않는 할일을 수정할 경우 TaskNotFound 예외 발생 테스트") + void updatedFailTest() { + // given + Task task = taskController.create(createTask()); + Task updateTask = new Task(); + updateTask.setTitle("updated"); + taskController.update(task.getId(), updateTask); + // when then + assertThatThrownBy(() -> taskController.update(100L, updateTask)) + .isInstanceOf(TaskNotFoundException.class); + } + + @Test + @DisplayName("1개 할일을 삭제 후 해당 리스트의 삭제후 리스트가 비어있는지 테스트") + void deleteTaskSuccess() { + // given + Task task = taskController.create(createTask()); + // when + taskController.delete(task.getId()); + // then + assertThat(taskController.list()).isEmpty(); + } + + @Test + @DisplayName("2개 할일을 삭제 후 해당 리스트의 삭제후 리스트크기가 감소했는 지 테스트") + void deleteTasksSuccess() { + // given + taskController.create(createTask()); + Task task = taskController.create(createTask()); + int beforeSize = taskController.list().size(); + // when + taskController.delete(task.getId()); + // then + assertThat(taskController.list().size()).isEqualTo(beforeSize - 1); + } + + @Test + @DisplayName("존재하지 않는 할일을 삭제할 경우 TaskNotFound 예외 발생 테스트") + void deleteTaskFail() { + assertThatThrownBy(() -> taskController.delete(1L)).isInstanceOf(TaskNotFoundException.class); + } +} diff --git a/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerWebTest.java b/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerWebTest.java new file mode 100644 index 00000000..c3ca3cac --- /dev/null +++ b/app/src/test/java/com/codesoom/assignment/controllers/TaskControllerWebTest.java @@ -0,0 +1,121 @@ +package com.codesoom.assignment.controllers; + +import com.codesoom.assignment.TaskNotFoundException; +import com.codesoom.assignment.application.TaskService; +import com.codesoom.assignment.models.Task; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.test.web.client.match.MockRestRequestMatchers; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultMatcher; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; +import static org.hamcrest.Matchers.containsString; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.BDDMockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +class TaskControllerWebTest { + @Autowired + private MockMvc mockMvc; + + @MockBean + private TaskService taskService; + + @Test + @DisplayName("요청한 할일목록 있는 경우 해당할일 응답") + void list() throws Exception { + //given + List tasks = new ArrayList<>(); + Task task = new Task(); + task.setTitle("test task"); + tasks.add(task); + given(taskService.getTasks()).willReturn(tasks); + + // expect + mockMvc.perform(get("/tasks")) + .andExpect((status().isOk())) + .andExpect(content().string(containsString("test task"))); + } + + @Test + @DisplayName("요청한 할일이 있는 경우 200 상태코드와 조회한 할일 응답") + void detailWithValidId() throws Exception { + // given + Task task = new Task(); + given(taskService.getTask(1L)).willReturn(task); + + // expect + mockMvc.perform(get("/tasks/1")) + .andExpect(status().isOk()); + } + + @Test + @DisplayName("요청한 할일이 없는 경우 404 상태코드 응답") + void detailWithInvalidId() throws Exception { + // given + given(taskService.getTask(100L)) + .willThrow(new TaskNotFoundException(100L)); + // expect + mockMvc.perform(get("/tasks/100")) + .andExpect(status().isNotFound()); + } + + @Test + @DisplayName("요청한 할일 생성시 201 상태코드 응답 후 생성된 할일 응답") + void createTask() throws Exception { + // given + Task task = new Task(); + task.setTitle("test task"); + given(taskService.createTask(any(Task.class))).willReturn(task); + + // expect + mockMvc.perform(post("/tasks") + .contentType("application/json") + .content("{\"title\":\"test task\"}")) + .andExpect(status().isCreated()) + .andExpect(content().string(containsString("test task"))); + } + + @Test + @DisplayName("요청한 할일 수정시 200 상태코드 응답 후 수정된 할일 응답") + void updateTask() throws Exception { + // given + Task task = new Task(); + task.setTitle("test task2"); + given(taskService.updateTask(any(Long.class), any(Task.class))).willReturn(task); + + // expect + mockMvc.perform(put("/tasks/1") + .contentType("application/json") + .content("{\"title\":\"test task2\"}")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("test task2"))); + } + + @Test + @DisplayName("요청한 할일 수정시 203 상태코드 응답") + void deleteTask() throws Exception { + // given + given(taskService.deleteTask(any(Long.class))).willReturn(null); + + // expect + mockMvc.perform(delete("/tasks/1")) + .andExpect(status().isNoContent()); + } +}