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