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.ExchangeFilterFunction;
17 import org.springframework.web.reactive.function.client.WebClient;
18 import reactor.core.publisher.Mono;
19 import reactor.test.StepVerifier;
26 public class GraphApiExchangeFilterFunctionIntegrationTest
28 private static final Logger LOG =
29 LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
31 private MockWebServer server;
32 private WebClient webClient;
38 server = new MockWebServer();
42 .clientConnector(new JettyClientHttpConnector())
43 .baseUrl(server.url("/").toString())
48 public void shutdown() throws Exception
50 this.server.shutdown();
55 public void testValidError()
58 .enqueue(new MockResponse()
59 .setResponseCode(HttpStatus.BAD_REQUEST.value())
60 .setHeader("Content-Type", "application/json")
65 " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
66 " \"type\": \"OAuthException\",\n" +
77 .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
78 .bodyToMono(String.class);
82 .expectErrorSatisfies(throwable ->
84 assertEquals(RateLimitExceededException.class, throwable.getClass());
85 RateLimitExceededException e = (RateLimitExceededException)throwable;
86 LOG.debug("{}", e.toString());
87 assertEquals(new Integer(613), e.getCode());
88 assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
89 assertEquals(Type.OAuthException, e.getType());
91 .verify(Duration.ofSeconds(3));
95 public void testTest()
98 .enqueue(new MockResponse()
100 .setHeader("Content-Type", "text/plain")
101 .setBody("Hello Spring!"));
105 result = webClient.get()
106 .uri("/greeting?name=Spring")
108 .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
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 .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
126 .bodyToMono(String.class);
128 StepVerifier.create(result)
129 .expectNext("Hello Spring!")
131 .verify(Duration.ofSeconds(3));
134 public static ExchangeFilterFunction errorHandlingFilter()
136 return ExchangeFilterFunction.ofResponseProcessor(clientResponse ->
138 if (clientResponse.statusCode() != null && (clientResponse.statusCode()
139 .is5xxServerError() || clientResponse.statusCode().is4xxClientError()))
141 return clientResponse.bodyToMono(String.class)
142 .flatMap(errorBody ->
144 return Mono.error(new Exception(errorBody));
149 return Mono.just(clientResponse);