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.ClientRequest;
17 import org.springframework.web.reactive.function.client.ClientResponse;
18 import org.springframework.web.reactive.function.client.ExchangeFunction;
19 import org.springframework.web.reactive.function.client.WebClient;
20 import reactor.core.publisher.Mono;
21 import reactor.test.StepVerifier;
28 public class GraphApiExchangeFilterFunctionIntegrationTest
30 private static final Logger LOG =
31 LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
33 private MockWebServer server;
34 private WebClient webClient;
40 server = new MockWebServer();
44 .clientConnector(new JettyClientHttpConnector())
45 .baseUrl(server.url("/").toString())
46 .filter(this::errorHandlingFilter)
51 public void shutdown() throws Exception
53 this.server.shutdown();
58 public void testValidError()
61 .enqueue(new MockResponse()
62 .setResponseCode(HttpStatus.BAD_REQUEST.value())
63 .setHeader("Content-Type", "application/json")
68 " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
69 " \"type\": \"OAuthException\",\n" +
80 .bodyToMono(String.class);
84 .expectErrorSatisfies(throwable ->
86 assertEquals(RateLimitExceededException.class, throwable.getClass());
87 RateLimitExceededException e = (RateLimitExceededException)throwable;
88 LOG.debug("{}", e.toString());
89 assertEquals(new Integer(613), e.getCode());
90 assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
91 assertEquals(Type.OAuthException, e.getType());
93 .verify(Duration.ofSeconds(3));
97 public void testTest()
100 .enqueue(new MockResponse()
101 .setResponseCode(400)
102 .setHeader("Content-Type", "text/plain")
103 .setBody("Hello Spring!"));
107 result = webClient.get()
108 .uri("/greeting?name=Spring")
110 .bodyToMono(String.class);
112 StepVerifier.create(result)
113 .expectError(Exception.class)
114 .verify(Duration.ofSeconds(3));
117 .enqueue(new MockResponse()
118 .setResponseCode(200)
119 .setHeader("Content-Type", "text/plain")
120 .setHeader("Foo", "Bar")
121 .setBody("Hello Spring!"));
123 result = webClient.get()
124 .uri("/greeting?name=Spring")
126 .bodyToMono(String.class);
128 StepVerifier.create(result)
129 .expectNext("Hello Spring!")
131 .verify(Duration.ofSeconds(3));
134 public Mono<ClientResponse> errorHandlingFilter(ClientRequest request, ExchangeFunction next)
142 HttpStatus.Series.CLIENT_ERROR.equals(response.statusCode().series())
144 .bodyToMono(String.class)
145 .flatMap(errorBody -> Mono.error(GraphApiException.create(
146 response.statusCode(),
147 response.headers().asHttpHeaders(),
148 errorBody.getBytes())))
149 : Mono.just(response);