Verified correct behavior of RestController for 404
[demos/testing] / src / test / java / de / juplo / demo / RestControllerIT.java
1 package de.juplo.demo;
2
3
4 import org.junit.jupiter.api.DisplayName;
5 import org.junit.jupiter.api.Test;
6 import org.junit.jupiter.api.extension.ExtendWith;
7 import org.junit.jupiter.params.ParameterizedTest;
8 import org.junit.jupiter.params.provider.ValueSource;
9 import static org.mockito.Mockito.verify;
10 import static org.mockito.Mockito.when;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
13 import org.springframework.boot.test.mock.mockito.MockBean;
14 import org.springframework.http.MediaType;
15 import org.springframework.test.context.junit.jupiter.SpringExtension;
16 import org.springframework.test.web.reactive.server.WebTestClient;
17 import org.springframework.web.reactive.function.client.WebClientResponseException;
18 import reactor.core.publisher.Mono;
19
20
21 /**
22  * Narrow Integration-Test for the {@link RestController}.
23  * @author Kai Moritz
24  */
25 @ExtendWith(SpringExtension.class)
26 @WebFluxTest()
27 public class RestControllerIT
28 {
29   @Autowired
30   WebTestClient webClient;
31   @MockBean
32   RemoteContentService service;
33
34
35   @DisplayName("Valid mappings for RestController with parameter")
36   @ParameterizedTest()
37   @ValueSource(strings = { "/?path=foo", "?path=foo" })
38   void testUriWithParameter(String uri)
39   {
40     when(service.getRemoteText("foo")).thenReturn(Mono.just("bar"));
41     webClient
42         .get()
43         .uri(uri)
44         .header("Accept", MediaType.TEXT_PLAIN_VALUE)
45         .exchange()
46         .expectStatus().isOk()
47         .expectBody(String.class).isEqualTo("bar");
48     verify(service).getRemoteText("foo");
49   }
50
51   @DisplayName("Mappings for RestController without a parameter")
52   @ParameterizedTest(name = "{arguments} ==> uri={0}")
53   @ValueSource(strings = { "/", "", "?foo=bar", "/?foo=bar"})
54   void testUriWithoutParameter(String uri)
55   {
56     webClient
57         .get()
58         .uri(uri)
59         .header("Accept", MediaType.TEXT_PLAIN_VALUE)
60         .exchange()
61         .expectStatus().isBadRequest()
62         .expectBody()
63         .jsonPath("status").isEqualTo(400)
64         .jsonPath("error").isEqualTo("Bad Request")
65         .jsonPath("message").isEqualTo("Required String parameter 'path' is not present")
66         .jsonPath("timestamp").exists();
67   }
68
69   @DisplayName("Remote-Server answers with 404: Not Found")
70   @Test()
71   void testResponseNotFound()
72   {
73     when(service.getRemoteText("foo")).thenReturn(Mono.error(exception(404)));
74     webClient
75         .get()
76         .uri("/?path=foo")
77         .header("Accept", MediaType.TEXT_PLAIN_VALUE)
78         .exchange()
79         .expectStatus().isNotFound()
80         .expectBody()
81         .jsonPath("status").isEqualTo(404)
82         .jsonPath("error").isEqualTo("Not Found")
83         .jsonPath("path").isEqualTo("/")
84         .jsonPath("timestamp").exists();
85   }
86
87
88   WebClientResponseException exception(int status)
89   {
90     return WebClientResponseException.create(status, "MESSAGE", null, null, null);
91   }
92 }