Implemented an ExchangeFilterFunction, to support Spring WebFlux
[facebook-errors] / src / test / java / de / juplo / facebook / errors / GraphApiExchangeFilterFunctionIntegrationTest.java
1 package de.juplo.facebook.errors;
2
3
4 import de.juplo.facebook.errors.GraphApiException.Type;
5 import okhttp3.mockwebserver.MockResponse;
6 import okhttp3.mockwebserver.MockWebServer;
7 import org.junit.After;
8 import static org.junit.Assert.assertEquals;
9 import static org.junit.Assert.fail;
10 import org.junit.Before;
11 import org.junit.Test;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14 import org.springframework.http.HttpStatus;
15 import org.springframework.http.client.reactive.JettyClientHttpConnector;
16 import org.springframework.web.reactive.function.client.WebClient;
17 import org.springframework.web.reactive.function.client.WebClientResponseException.BadRequest;
18 import org.springframework.web.reactive.function.client.WebClientResponseException.InternalServerError;
19 import reactor.core.publisher.Mono;
20 import reactor.test.StepVerifier;
21
22
23 /**
24  *
25  * @author Kai Moritz
26  */
27 public class GraphApiExchangeFilterFunctionIntegrationTest
28 {
29   private static final Logger LOG =
30       LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
31
32   private MockWebServer server;
33         private WebClient webClient;
34
35
36         @Before
37         public void setup()
38   {
39     server = new MockWebServer();
40     webClient =
41         WebClient
42             .builder()
43             .clientConnector(new JettyClientHttpConnector())
44             .baseUrl(server.url("/").toString())
45             .filter(new GraphApiExchangeFilterFunction())
46             .build();
47         }
48
49         @After
50         public void shutdown() throws Exception
51   {
52     this.server.shutdown();
53         }
54
55
56   @Test
57   public void testNoError()
58   {
59     Mono<String> result;
60
61
62     //server
63     //    .enqueue(new MockResponse()
64     //        .setResponseCode(HttpStatus.CONTINUE.value())
65     //        .setHeader("Content-Type", "application/json")
66     //        .setBody("Hallo Welt!"));
67     //
68     //result =
69     //    webClient
70     //        .get()
71     //        .uri("/egal")
72     //        .retrieve()
73     //        .bodyToMono(String.class);
74     //
75     //StepVerifier
76     //    .create(result)
77     //    .expectNext("Hallo Welt!")
78     //    .expectComplete()
79     //    .verify();
80
81
82     server
83         .enqueue(new MockResponse()
84             .setResponseCode(HttpStatus.OK.value())
85             .setHeader("Content-Type", "text/plain")
86             .setBody("Hallo Welt!"));
87
88     result =
89         webClient
90             .get()
91             .uri("/egal")
92             .retrieve()
93             .bodyToMono(String.class);
94
95     StepVerifier
96         .create(result)
97         .expectNext("Hallo Welt!")
98         .expectComplete()
99         .verify();
100
101
102     server
103         .enqueue(new MockResponse()
104             .setResponseCode(HttpStatus.TEMPORARY_REDIRECT.value())
105             .setHeader("Location", server.url("/woanders"))
106             .setHeader("Content-Type", "text/plain")
107             .setBody("Jetzt doch woanders..."));
108     server
109         .enqueue(new MockResponse()
110             .setResponseCode(HttpStatus.OK.value())
111             .setHeader("Content-Type", "text/plain")
112             .setBody("Hallo Welt!"));
113
114     result =
115         webClient
116             .get()
117             .uri("/egal")
118             .retrieve()
119             .bodyToMono(String.class);
120
121     StepVerifier
122         .create(result)
123         .expectNext("Hallo Welt!")
124         .expectComplete()
125         .verify();
126
127
128     server
129         .enqueue(new MockResponse()
130             .setResponseCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
131             .setHeader("Content-Type", "text/plain")
132             .setBody("Hallo Welt!"));
133
134     result =
135         webClient
136             .get()
137             .uri("/egal")
138             .retrieve()
139             .bodyToMono(String.class);
140
141     StepVerifier
142         .create(result)
143         .expectError(InternalServerError.class)
144         .verify();
145   }
146
147   @Test
148   public void testValidError()
149   {
150     server
151         .enqueue(new MockResponse()
152             .setResponseCode(HttpStatus.BAD_REQUEST.value())
153             .setHeader("Content-Type", "application/json")
154             .setBody(
155                 "{\n" +
156                 "  \"error\":\n" +
157                 "  {\n" +
158                 "    \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
159                 "    \"type\": \"OAuthException\",\n" +
160                 "    \"code\": 613\n" +
161                 "  }\n" +
162                 "}"));
163
164     Mono<String> result =
165         webClient
166             .get()
167             .uri("/egal")
168             .retrieve()
169             .bodyToMono(String.class);
170
171     StepVerifier.create(result).expectErrorSatisfies(throwable ->
172     {
173       assertEquals(RateLimitExceededException.class, throwable.getClass());
174       RateLimitExceededException e = (RateLimitExceededException)throwable;
175       LOG.debug("{}", e.toString());
176       assertEquals(new Integer(613), e.getCode());
177       assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
178       assertEquals(Type.OAuthException, e.getType());
179     })
180     .verify();
181   }
182
183   @Test
184   public void testUnmappedError()
185   {
186     server
187         .enqueue(new MockResponse()
188             .setResponseCode(HttpStatus.BAD_REQUEST.value())
189             .setHeader("Content-Type", "application/json")
190             .setBody(
191                 "{\n" +
192                 "  \"error\":\n" +
193                 "  {\n" +
194                 "    \"message\": \"This error does not exist.\",\n" +
195                 "    \"type\": \"NonexistentTypeException\",\n" +
196                 "    \"code\": 999999999\n" +
197                 "  }\n" +
198                 "}"));
199
200
201     Mono<String> result =
202         webClient
203             .get()
204             .uri("/egal")
205             .retrieve()
206             .bodyToMono(String.class);
207
208     StepVerifier.create(result).expectErrorSatisfies(throwable ->
209     {
210       assertEquals(UnmappedErrorException.class, throwable.getClass());
211       UnmappedErrorException e = (UnmappedErrorException)throwable;
212       LOG.debug("{}", e.toString());
213       assertEquals(new Integer(999999999), e.getCode());
214       assertEquals("This error does not exist.", e.getMessage());
215       try
216       {
217         Type type = e.getType();
218         LOG.error("unknown type: {}", type);
219         fail("unmapped type was resolved by enum: " + type);
220       }
221       catch (IllegalArgumentException ee) {}
222     })
223     .verify();
224   }
225
226   @Test
227   public void testInvlalidError()
228   {
229     Mono<String> result;
230
231
232     server
233         .enqueue(new MockResponse()
234             .setResponseCode(HttpStatus.BAD_REQUEST.value())
235             .setHeader("Content-Type", "application/json")
236             .setBody(
237                 "{\n" +
238                 "  \"error\":\n" +
239                 "  {\n" +
240                 "    \"message\": \"Not a Graph-Api-Exception.\",\n" +
241                 "    \"type\": \"Whatever\",\n" +
242                 "    \"code\": \"some string\"\n" +
243                 "  }\n" +
244                 "}"));
245
246     result =
247         webClient
248             .get()
249             .uri("/egal")
250             .retrieve()
251             .bodyToMono(String.class);
252
253     StepVerifier.create(result).expectError(BadRequest.class).verify();
254
255
256     server
257         .enqueue(new MockResponse()
258             .setResponseCode(HttpStatus.BAD_REQUEST.value())
259             .setHeader("Content-Type", "text/plain")
260             .setBody("Hallo Welt!"));
261
262     result =
263         webClient
264             .get()
265             .uri("/egal")
266             .retrieve()
267             .bodyToMono(String.class);
268
269     StepVerifier.create(result).expectError(BadRequest.class).verify();
270   }
271 }