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.HttpHeaders;
15 import org.springframework.http.HttpStatus;
16 import org.springframework.http.client.reactive.JettyClientHttpConnector;
17 import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
18 import org.springframework.web.reactive.function.client.WebClient;
19 import reactor.core.publisher.Mono;
20 import reactor.test.StepVerifier;
27 public class GraphApiExchangeFilterFunctionIntegrationTest
29 private static final Logger LOG =
30 LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
32 private MockWebServer server;
33 private WebClient webClient;
39 server = new MockWebServer();
43 .clientConnector(new JettyClientHttpConnector())
44 .baseUrl(server.url("/").toString())
45 .filter(errorHandlingFilter())
50 public void shutdown() throws Exception
52 this.server.shutdown();
57 public void testValidError()
60 .enqueue(new MockResponse()
61 .setResponseCode(HttpStatus.BAD_REQUEST.value())
62 .setHeader("Content-Type", "application/json")
67 " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
68 " \"type\": \"OAuthException\",\n" +
79 .bodyToMono(String.class);
83 .expectErrorSatisfies(throwable ->
85 assertEquals(RateLimitExceededException.class, throwable.getClass());
86 RateLimitExceededException e = (RateLimitExceededException)throwable;
87 LOG.debug("{}", e.toString());
88 assertEquals(new Integer(613), e.getCode());
89 assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
90 assertEquals(Type.OAuthException, e.getType());
92 .verify(Duration.ofSeconds(3));
96 public void testTest()
99 .enqueue(new MockResponse()
100 .setResponseCode(400)
101 .setHeader("Content-Type", "text/plain")
102 .setBody("Hello Spring!"));
106 result = webClient.get()
107 .uri("/greeting?name=Spring")
109 .bodyToMono(String.class);
111 StepVerifier.create(result)
112 .expectError(Exception.class)
113 .verify(Duration.ofSeconds(3));
116 .enqueue(new MockResponse()
117 .setResponseCode(200)
118 .setHeader("Content-Type", "text/plain")
119 .setHeader("Foo", "Bar")
120 .setBody("Hello Spring!"));
122 result = webClient.get()
123 .uri("/greeting?name=Spring")
125 .bodyToMono(String.class);
127 StepVerifier.create(result)
128 .expectNext("Hello Spring!")
130 .verify(Duration.ofSeconds(3));
133 public static ExchangeFilterFunction errorHandlingFilter()
135 return ExchangeFilterFunction.ofResponseProcessor(response ->
137 if (response.statusCode() != null && (response.statusCode()
138 .is5xxServerError() || response.statusCode().is4xxClientError()))
140 return response.bodyToMono(String.class)
141 .flatMap(errorBody ->
143 return Mono.error(GraphApiException.create(response.statusCode(), response.headers().asHttpHeaders(), errorBody.getBytes()));
148 return Mono.just(response);