306f04452326058e49df4b694c4ec63b7d533ff3
[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 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;
20
21
22 /**
23  *
24  * @author Kai Moritz
25  */
26 public class GraphApiExchangeFilterFunctionIntegrationTest
27 {
28   private static final Logger LOG =
29       LoggerFactory.getLogger(GraphApiExchangeFilterFunctionIntegrationTest.class);
30
31   private MockWebServer server;
32         private WebClient webClient;
33
34
35         @Before
36         public void setup()
37   {
38     server = new MockWebServer();
39     webClient =
40         WebClient
41             .builder()
42             .clientConnector(new JettyClientHttpConnector())
43             .baseUrl(server.url("/").toString())
44             .build();
45         }
46
47         @After
48         public void shutdown() throws Exception
49   {
50     this.server.shutdown();
51         }
52
53
54   @Test
55   public void testValidError()
56   {
57     server
58         .enqueue(new MockResponse()
59             .setResponseCode(HttpStatus.BAD_REQUEST.value())
60             .setHeader("Content-Type", "application/json")
61             .setBody(
62                 "{\n" +
63                 "  \"error\":\n" +
64                 "  {\n" +
65                 "    \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
66                 "    \"type\": \"OAuthException\",\n" +
67                 "    \"code\": 613\n" +
68                 "  }\n" +
69                 "}"));
70
71
72     Mono<String> result =
73         webClient
74             .get()
75             .uri("/egal")
76             .retrieve()
77             .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
78             .bodyToMono(String.class);
79
80     StepVerifier
81         .create(result)
82         .expectErrorSatisfies(throwable ->
83         {
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());
90         })
91         .verify(Duration.ofSeconds(3));
92   }
93
94   @Test
95   public void testTest()
96   {
97     server
98         .enqueue(new MockResponse()
99             .setResponseCode(400)
100             .setHeader("Content-Type", "text/plain")
101             .setBody("Hello Spring!"));
102
103                 Mono<String> result;
104
105     result = webClient.get()
106                                 .uri("/greeting?name=Spring")
107                                 .retrieve()
108         .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
109                                 .bodyToMono(String.class);
110
111                 StepVerifier.create(result)
112                                 .expectError(Exception.class)
113                                 .verify(Duration.ofSeconds(3));
114
115     server
116         .enqueue(new MockResponse()
117             .setResponseCode(200)
118             .setHeader("Content-Type", "text/plain")
119             .setHeader("Foo", "Bar")
120             .setBody("Hello Spring!"));
121
122                 result = webClient.get()
123                                 .uri("/greeting?name=Spring")
124                                 .retrieve()
125         .onStatus(status -> status.is4xxClientError(), response -> GraphApiException.create(response))
126                                 .bodyToMono(String.class);
127
128                 StepVerifier.create(result)
129                                 .expectNext("Hello Spring!")
130         .expectComplete()
131                                 .verify(Duration.ofSeconds(3));
132   }
133
134   public static ExchangeFilterFunction errorHandlingFilter()
135   {
136     return ExchangeFilterFunction.ofResponseProcessor(clientResponse ->
137     {
138       if (clientResponse.statusCode() != null && (clientResponse.statusCode()
139           .is5xxServerError() || clientResponse.statusCode().is4xxClientError()))
140       {
141         return clientResponse.bodyToMono(String.class)
142             .flatMap(errorBody ->
143             {
144               return Mono.error(new Exception(errorBody));
145             });
146       }
147       else
148       {
149         return Mono.just(clientResponse);
150       }
151     });
152   }
153 }