package org.zalando.problem.spring.web.advice.routing;
import org.junit.Test;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.servlet.DispatcherServlet;
import org.zalando.problem.spring.web.advice.AdviceTraitTesting;
import java.lang.reflect.Field;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.springframework.http.HttpMethod.GET;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.request;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public final class NoHandlerFoundAdviceTraitTest implements AdviceTraitTesting {
@Test
public void noHandlerInController() throws Exception {
final MockMvc mvc = mvc();
throwExceptionIfNoHandlerFound(mvc);
mvc.perform(request(GET, "http://localhost/api/no-handler"))
.andExpect(status().isNotFound())
.andExpect(header().string("Content-Type", is("application/problem+json")))
.andExpect(jsonPath("$.type").doesNotExist())
.andExpect(jsonPath("$.title", is("Not Found")))
.andExpect(jsonPath("$.status", is(404)))
.andExpect(jsonPath("$.detail", containsString("No handler found")));
}
@Test
public void noHandler() throws Exception {
final MockMvc mvc = mvc();
throwExceptionIfNoHandlerFound(mvc);
mvc.perform(request(GET, "http://localhost/no-handler"))
.andExpect(status().isNotFound())
.andExpect(header().string("Content-Type", is("application/problem+json")))
.andExpect(jsonPath("$.type").doesNotExist())
.andExpect(jsonPath("$.title", is("Not Found")))
.andExpect(jsonPath("$.status", is(404)))
.andExpect(jsonPath("$.detail", containsString("No handler found")));
}
private void throwExceptionIfNoHandlerFound(final MockMvc mvc) throws NoSuchFieldException, IllegalAccessException {
final Field field = MockMvc.class.getDeclaredField("servlet");
field.setAccessible(true);
final DispatcherServlet servlet = (DispatcherServlet) field.get(mvc);
servlet.setThrowExceptionIfNoHandlerFound(true);
}
}