1 package de.juplo.facebook.errors;
4 import de.juplo.facebook.errors.GraphApiException.Type;
5 import java.time.Duration;
6 import okhttp3.mockwebserver.MockResponse;
7 import okhttp3.mockwebserver.MockWebServer;
8 import org.junit.After;
9 import static org.junit.Assert.assertEquals;
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 reactor.core.publisher.Mono;
18 import reactor.test.StepVerifier;
25 public class GraphApiExchangeFilterFunctionIntegrationTest
27 private static final Logger LOG =
28 LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
30 private MockWebServer server;
31 private WebClient webClient;
37 server = new MockWebServer();
41 .clientConnector(new JettyClientHttpConnector())
42 .baseUrl(server.url("/").toString())
43 .filter(new GraphApiExchangeFilterFunction())
48 public void shutdown() throws Exception
50 this.server.shutdown();
55 public void testNoError()
58 // .enqueue(new MockResponse()
59 // .setResponseCode(HttpStatus.CONTINUE.value())
60 // .setHeader("Content-Type", "application/json")
61 // .setBody("Hallo Welt!"));
65 // String result = clientTemplate.getForObject(uri, String.class);
66 // assertEquals("Hallo Welt!", result);
70 // LOG.debug("{}", e.toString());
71 // fail("Unexpected error: " + e);
76 .enqueue(new MockResponse()
77 .setResponseCode(HttpStatus.OK.value())
78 .setHeader("Content-Type", "text/plain")
79 .setBody("Hallo Welt!"));
83 String result = clientTemplate.getForObject(uri, String.class);
84 assertEquals("Hallo Welt!", result);
88 LOG.debug("{}", e.toString());
89 fail("Unexpected error: " + e);
94 .enqueue(new MockResponse()
95 .setResponseCode(HttpStatus.TEMPORARY_REDIRECT.value())
96 .setHeader("Content-Type", "text/plain")
97 .setBody("Hallo Welt!"));
101 String result = clientTemplate.getForObject(uri, String.class);
102 assertEquals("Hallo Welt!", result);
106 LOG.debug("{}", e.toString());
107 fail("Unexpected error: " + e);
112 .enqueue(new MockResponse()
113 .setResponseCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
114 .setHeader("Content-Type", "text/plain")
115 .setBody("Hallo Welt!"));
119 clientTemplate.getForObject(uri, String.class);
120 fail("The parent handler should have raised an exception!");
122 catch(HttpServerErrorException e)
124 LOG.debug("Expexted error: {}", e.toString());
128 LOG.debug("{}", e.toString());
129 fail("Unexpected error: " + e);
134 public void testValidError()
137 .enqueue(new MockResponse()
138 .setResponseCode(HttpStatus.BAD_REQUEST.value())
139 .setHeader("Content-Type", "application/json")
144 " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
145 " \"type\": \"OAuthException\",\n" +
152 clientTemplate.getForObject(uri, String.class);
153 fail("The expected exception was not thrown");
155 catch(RateLimitExceededException e)
157 LOG.debug("{}", e.toString());
158 assertEquals(new Integer(613), e.getCode());
159 assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
160 assertEquals(Type.OAuthException, e.getType());
165 public void testUnmappedError()
168 .enqueue(new MockResponse()
169 .setResponseCode(HttpStatus.BAD_REQUEST.value())
170 .setHeader("Content-Type", "application/json")
175 " \"message\": \"This error does not exist.\",\n" +
176 " \"type\": \"NonexistentTypeException\",\n" +
177 " \"code\": 999999999\n" +
183 clientTemplate.getForObject(uri, String.class);
184 fail("The expected exception was not thrown");
186 catch(GraphApiException e)
188 LOG.debug("{}", e.toString());
189 assertEquals(new Integer(999999999), e.getCode());
190 assertEquals("This error does not exist.", e.getMessage());
193 Type type = e.getType();
194 LOG.error("unknown type: {}", type);
195 fail("unmapped type was resolved by enum: " + type);
197 catch (IllegalArgumentException ee) {}
202 public void testInvlalidError()
205 .enqueue(new MockResponse()
206 .setResponseCode(HttpStatus.BAD_REQUEST.value())
207 .setHeader("Content-Type", "application/json")
212 " \"message\": \"Not a Graph-Api-Exception.\",\n" +
213 " \"type\": \"Whatever\",\n" +
214 " \"code\": \"some string\"\n" +
220 clientTemplate.getForObject(uri, String.class);
221 fail("The parent handler should have raised an exception!");
223 catch(HttpClientErrorException e)
225 LOG.debug("Expexted error: {}", e.toString());
229 LOG.debug("{}", e.toString());
230 fail("Unexpected error: " + e);
235 .enqueue(new MockResponse()
236 .setResponseCode(HttpStatus.BAD_REQUEST.value())
237 .setHeader("Content-Type", "text/plain")
238 .setBody("Hallo Welt!"));
242 clientTemplate.getForObject(uri, String.class);
243 fail("The parent handler should have raised an exception!");
245 catch(HttpClientErrorException e)
247 LOG.debug("Expexted error: {}", e.toString());
251 LOG.debug("{}", e.toString());
252 fail("Unexpected error: " + e);
257 public void testValidError()
260 .enqueue(new MockResponse()
261 .setResponseCode(HttpStatus.BAD_REQUEST.value())
262 .setHeader("Content-Type", "application/json")
267 " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
268 " \"type\": \"OAuthException\",\n" +
274 Mono<String> result =
279 .bodyToMono(String.class);
283 .expectErrorSatisfies(throwable ->
285 assertEquals(RateLimitExceededException.class, throwable.getClass());
286 RateLimitExceededException e = (RateLimitExceededException)throwable;
287 LOG.debug("{}", e.toString());
288 assertEquals(new Integer(613), e.getCode());
289 assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
290 assertEquals(Type.OAuthException, e.getType());
292 .verify(Duration.ofSeconds(3));