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