9faae0f637f84e72f4e0f760a3cb06d00e551e6b
[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 okhttp3.mockwebserver.MockResponse;
6 import okhttp3.mockwebserver.MockWebServer;
7 import org.junit.After;
8 import static org.junit.Assert.assertEquals;
9 import static org.junit.Assert.fail;
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.WebClient;
17 import org.springframework.web.reactive.function.client.WebClientResponseException.BadRequest;
18 import org.springframework.web.reactive.function.client.WebClientResponseException.InternalServerError;
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(new GraphApiExchangeFilterFunction())
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 testNoError()
58   {
59     Mono<String> result;
60
61
62     server
63         .enqueue(new MockResponse()
64             .setResponseCode(HttpStatus.CONTINUE.value())
65             .setHeader("Content-Type", "application/json")
66             .setBody("Hallo Welt!"));
67     
68     result =
69         webClient
70             .get()
71             .uri("/egal")
72             .retrieve()
73             .bodyToMono(String.class);
74
75     StepVerifier
76         .create(result)
77         .expectNext("Hallo Welt!")
78         .expectComplete()
79         .verify();
80
81
82     server
83         .enqueue(new MockResponse()
84             .setResponseCode(HttpStatus.OK.value())
85             .setHeader("Content-Type", "text/plain")
86             .setBody("Hallo Welt!"));
87
88     result =
89         webClient
90             .get()
91             .uri("/egal")
92             .retrieve()
93             .bodyToMono(String.class);
94
95     StepVerifier
96         .create(result)
97         .expectNext("Hallo Welt!")
98         .expectComplete()
99         .verify();
100
101
102     server
103         .enqueue(new MockResponse()
104             .setResponseCode(HttpStatus.TEMPORARY_REDIRECT.value())
105             .setHeader("Content-Type", "text/plain")
106             .setBody("Hallo Welt!"));
107
108     result =
109         webClient
110             .get()
111             .uri("/egal")
112             .retrieve()
113             .bodyToMono(String.class);
114
115     StepVerifier
116         .create(result)
117         .expectNext("Hallo Welt!")
118         .expectComplete()
119         .verify();
120
121
122     server
123         .enqueue(new MockResponse()
124             .setResponseCode(HttpStatus.INTERNAL_SERVER_ERROR.value())
125             .setHeader("Content-Type", "text/plain")
126             .setBody("Hallo Welt!"));
127
128     result =
129         webClient
130             .get()
131             .uri("/egal")
132             .retrieve()
133             .bodyToMono(String.class);
134
135     StepVerifier
136         .create(result)
137         .expectError(InternalServerError.class)
138         .verify();
139   }
140
141   @Test
142   public void testValidError()
143   {
144     server
145         .enqueue(new MockResponse()
146             .setResponseCode(HttpStatus.BAD_REQUEST.value())
147             .setHeader("Content-Type", "application/json")
148             .setBody(
149                 "{\n" +
150                 "  \"error\":\n" +
151                 "  {\n" +
152                 "    \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
153                 "    \"type\": \"OAuthException\",\n" +
154                 "    \"code\": 613\n" +
155                 "  }\n" +
156                 "}"));
157
158     Mono<String> result =
159         webClient
160             .get()
161             .uri("/egal")
162             .retrieve()
163             .bodyToMono(String.class);
164
165     StepVerifier.create(result).expectErrorSatisfies(throwable ->
166     {
167       assertEquals(RateLimitExceededException.class, throwable.getClass());
168       RateLimitExceededException e = (RateLimitExceededException)throwable;
169       LOG.debug("{}", e.toString());
170       assertEquals(new Integer(613), e.getCode());
171       assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
172       assertEquals(Type.OAuthException, e.getType());
173     })
174     .verify();
175   }
176
177   @Test
178   public void testUnmappedError()
179   {
180     server
181         .enqueue(new MockResponse()
182             .setResponseCode(HttpStatus.BAD_REQUEST.value())
183             .setHeader("Content-Type", "application/json")
184             .setBody(
185                 "{\n" +
186                 "  \"error\":\n" +
187                 "  {\n" +
188                 "    \"message\": \"This error does not exist.\",\n" +
189                 "    \"type\": \"NonexistentTypeException\",\n" +
190                 "    \"code\": 999999999\n" +
191                 "  }\n" +
192                 "}"));
193
194
195     Mono<String> result =
196         webClient
197             .get()
198             .uri("/egal")
199             .retrieve()
200             .bodyToMono(String.class);
201
202     StepVerifier.create(result).expectErrorSatisfies(throwable ->
203     {
204       assertEquals(UnmappedErrorException.class, throwable.getClass());
205       UnmappedErrorException e = (UnmappedErrorException)throwable;
206       LOG.debug("{}", e.toString());
207       assertEquals(new Integer(999999999), e.getCode());
208       assertEquals("This error does not exist.", e.getMessage());
209       try
210       {
211         Type type = e.getType();
212         LOG.error("unknown type: {}", type);
213         fail("unmapped type was resolved by enum: " + type);
214       }
215       catch (IllegalArgumentException ee) {}
216     })
217     .verify();
218   }
219
220   @Test
221   public void testInvlalidError()
222   {
223     Mono<String> result;
224
225
226     server
227         .enqueue(new MockResponse()
228             .setResponseCode(HttpStatus.BAD_REQUEST.value())
229             .setHeader("Content-Type", "application/json")
230             .setBody(
231                 "{\n" +
232                 "  \"error\":\n" +
233                 "  {\n" +
234                 "    \"message\": \"Not a Graph-Api-Exception.\",\n" +
235                 "    \"type\": \"Whatever\",\n" +
236                 "    \"code\": \"some string\"\n" +
237                 "  }\n" +
238                 "}"));
239
240     result =
241         webClient
242             .get()
243             .uri("/egal")
244             .retrieve()
245             .bodyToMono(String.class);
246
247     StepVerifier.create(result).expectError(BadRequest.class).verify();
248
249
250     server
251         .enqueue(new MockResponse()
252             .setResponseCode(HttpStatus.BAD_REQUEST.value())
253             .setHeader("Content-Type", "text/plain")
254             .setBody("Hallo Welt!"));
255
256     result =
257         webClient
258             .get()
259             .uri("/egal")
260             .retrieve()
261             .bodyToMono(String.class);
262
263     StepVerifier.create(result).expectError(BadRequest.class).verify();
264   }
265 }