TA 역할 Spring 경계 smoke #3

Open
forge-bot wants to merge 9 commits from forge/role-ta-live-1522-001-attempt-1-run-6e84b72613b1 into main
Showing only changes of commit 5e9d29c817 - Show all commits

View file

@ -0,0 +1,62 @@
package com.runtimematrix.controller;
import com.runtimematrix.config.GlobalExceptionHandler;
import com.runtimematrix.domain.exception.BusinessException;
import com.runtimematrix.service.RoleService;
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.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
/** ADR-001 RFC 7807 오류 응답 계약 테스트 */
@WebMvcTest(RoleController.class)
@Import(GlobalExceptionHandler.class)
@DisplayName("오류 응답 계약 테스트")
class ErrorResponseContractTest {
@Autowired private MockMvc mockMvc;
@MockBean private RoleService roleService;
@Test
@DisplayName("역할 미존재 시 404와 RFC 7807 형식 응답 반환")
void role_not_found_returns_404_with_problem_details() throws Exception {
String roleId = "non-existent";
when(roleService.getRole(roleId)).thenThrow(new BusinessException.RoleNotFoundException(roleId));
mockMvc.perform(get("/api/v1/roles/{roleId}", roleId))
.andExpect(status().isNotFound())
.andExpect(content().contentType(MediaType.APPLICATION_PROBLEM_JSON))
.andExpect(jsonPath("$.type", startsWith("https://api.runtimematrix.com/errors/")))
.andExpect(jsonPath("$.title", is("역할을 찾을 수 없습니다")))
.andExpect(jsonPath("$.status", is(404)))
.andExpect(jsonPath("$.detail", containsString(roleId)))
.andExpect(jsonPath("$.instance", containsString("/api/v1/roles/")))
.andExpect(jsonPath("$.timestamp", notNullValue()))
.andExpect(jsonPath("$.traceId", notNullValue()));
}
@Test
@DisplayName("오류 응답에 모든 필수 필드 포함")
void error_response_contains_all_required_fields() throws Exception {
when(roleService.getRole("test")).thenThrow(new BusinessException.RoleNotFoundException("test"));
mockMvc.perform(get("/api/v1/roles/{roleId}", "test"))
.andExpect(status().isNotFound())
.andExpect(jsonPath("$", hasKey("type")))
.andExpect(jsonPath("$", hasKey("title")))
.andExpect(jsonPath("$", hasKey("status")))
.andExpect(jsonPath("$", hasKey("detail")))
.andExpect(jsonPath("$", hasKey("instance")))
.andExpect(jsonPath("$", hasKey("timestamp")))
.andExpect(jsonPath("$", hasKey("traceId")));
}
}