@Override
public boolean hasError(ClientHttpResponse response) throws IOException
{
- return
- HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())
- || this.parent.hasError(response);
+ return HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series());
}
@Override
+++ /dev/null
-package de.juplo.facebook.errors;
-
-
-import de.juplo.facebook.errors.GraphApiException.Type;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.RestTemplate;
-
-
-
-/**
- *
- * @author Kai Moritz
- */
-public class GraphApiErrorHandlerTest
-{
- private static final Logger log =
- LoggerFactory.getLogger(GraphApiErrorHandlerTest.class);
-
- private RestTemplate clientTemplate;
- private MockClientHttpRequestFactory requestFactory;
-
-
- @Test
- public void testError1()
- {
- log.info("testError1");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"An unknown error has occurred.\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 1\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnknownErrorException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(1), e.getCode());
- assertEquals("An unknown error has occurred.", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError2()
- {
- log.info("testError2");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"An unexpected error has occurred. Please retry your request later.\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 2\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnexpectedErrorException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(2), e.getCode());
- assertEquals("An unexpected error has occurred. Please retry your request later.", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError4()
- {
- log.info("testError4");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\": {\n" +
- " \"code\": 4, \n" +
- " \"fbtrace_id\": \"HZRM6BTMu+D\", \n" +
- " \"is_transient\": true, \n" +
- " \"message\": \"(#4) Application request limit reached\", \n" +
- " \"type\": \"OAuthException\"\n" +
- " }\n" +
- "}\n");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(ApplicationRequestLimitReachedException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(4), e.getCode());
- assertEquals("(#4) Application request limit reached", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError12()
- {
- log.info("testError12");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"(#12) location field is deprecated for versions v2.5 and higher\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 12\n," +
- " \"fbtrace_id\":\"BoxCYne7GrL\"\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(DeprecatedException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(12), e.getCode());
- assertEquals("(#12) location field is deprecated for versions v2.5 and higher", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError21()
- {
- log.info("testError21");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"(#21) Page ID 590408587650316 was migrated to page ID 1421620791415603. Please update your API calls to the new ID\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 21\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(PageMigratedException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(21), e.getCode());
- assertEquals("(#21) Page ID 590408587650316 was migrated to page ID 1421620791415603. Please update your API calls to the new ID", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError100()
- {
- log.info("testError100");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"Unsupported get request.\",\n" +
- " \"type\": \"GraphMethodException\",\n" +
- " \"code\": 100\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnsupportedGetRequestException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(100), e.getCode());
- assertEquals("Unsupported get request.", e.getMessage());
- assertEquals(Type.GraphMethodException, e.getType());
- }
- }
-
- @Test
- public void testError102()
- {
- log.info("testError102");
-
- requestFactory.setBody("{\"error\":{\"message\":\"A user access token is required to request this resource.\",\"type\":\"OAuthException\",\"code\":102,\"fbtrace_id\":\"DhdMyf23Ki7\"}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UserAccessTokenRequiredException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(102), e.getCode());
- assertEquals("A user access token is required to request this resource.", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- assertEquals("DhdMyf23Ki7", e.getTraceId());
- }
- }
-
- @Test
- public void testError104()
- {
- log.info("testError104");
-
- requestFactory.setBody("{\"error\":{\"message\":\"An access token is required to request this resource.\",\"type\":\"OAuthException\",\"code\":104,\"fbtrace_id\":\"E2Jjkj5++LL\"}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(AccessTokenRequiredException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(104), e.getCode());
- assertEquals("An access token is required to request this resource.", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- assertEquals("E2Jjkj5++LL", e.getTraceId());
- }
- }
-
- @Test
- public void testError190()
- {
- log.info("testError190");
-
- requestFactory.setBody("{\"error\":{\"message\":\"Bad signature\",\"type\":\"OAuthException\",\"code\":190,\"fbtrace_id\":\"Ay2OYQrINbXOCfQpBvoxDIw\"}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(AccessTokenExpiredException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(190), e.getCode());
- assertEquals("Bad signature", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- assertEquals("Ay2OYQrINbXOCfQpBvoxDIw", e.getTraceId());
- }
- }
-
- @Test
- public void testError200()
- {
- log.info("testError200");
-
- requestFactory.setBody("{\n" +
- " \"error\": {\n" +
- " \"message\": \"(#200) The user hasn't authorized the application to perform this action\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 200\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(ApplicationNotAuthorizedByUserException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(200), e.getCode());
- assertEquals("(#200) The user hasn't authorized the application to perform this action", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- assertNull(e.getTraceId());
- }
- }
-
- @Test
- public void testError613()
- {
- log.info("testError613");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
- " \"type\": \"OAuthException\",\n" +
- " \"code\": 613\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(RateLimitExceededException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(613), e.getCode());
- assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- }
- }
-
- @Test
- public void testError2200()
- {
- requestFactory.setBody("{\"error\":{\"message\":\"(#2200) callback verification failed: \",\"type\":\"OAuthException\",\"code\":2200,\"fbtrace_id\":\"ESLjoZKvPXg\"}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(CallbackVerificationFailedException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(2200), e.getCode());
- assertEquals("(#2200) callback verification failed: ", e.getMessage());
- assertEquals(Type.OAuthException, e.getType());
- assertEquals("ESLjoZKvPXg", e.getTraceId());
- }
- }
-
- @Test
- public void testUnmappedError()
- {
- log.info("testUnmappedError");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"This error does not exist.\",\n" +
- " \"type\": \"NonexistentTypeException\",\n" +
- " \"code\": 999999999\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(GraphApiException e)
- {
- log.debug("{}", e.toString());
- assertEquals(new Integer(999999999), e.getCode());
- assertEquals("This error does not exist.", e.getMessage());
- try
- {
- Type type = e.getType();
- log.error("unknown type: {}", type);
- fail("unmapped type was resolved by enum: " + type);
- }
- catch (IllegalArgumentException ee) {}
- }
- }
-
- @Test
- public void testUnmappedErrors()
- {
- log.info("testUnmappedErrors");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": null,\n" +
- " \"type\": \"WhateverTypeException\",\n" +
- " \"code\": 999999999\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnmappedErrorException e)
- {
- log.debug("{}", e.toString());
- assertNull(e.getMessage());
- try
- {
- Type type = e.getType();
- log.error("unknown type: {}", type);
- fail("unmapped type was resolved by enum: " + type);
- }
- catch (IllegalArgumentException ee) {}
- assertEquals(new Integer(999999999), e.getCode());
- assertNull(e.getSubCode());
- assertNull(e.getUserTitle());
- assertNull(e.getUserMessage());
- assertNull(e.getTraceId());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"type\": \"WhateverTypeException\",\n" +
- " \"code\": 999999999\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnmappedErrorException e)
- {
- log.debug("{}", e.toString());
- assertNull(e.getMessage());
- try
- {
- Type type = e.getType();
- log.error("unknown type: {}", type);
- fail("unmapped type was resolved by enum: " + type);
- }
- catch (IllegalArgumentException ee) {}
- assertEquals(new Integer(999999999), e.getCode());
- assertNull(e.getSubCode());
- assertNull(e.getUserTitle());
- assertNull(e.getUserMessage());
- assertNull(e.getTraceId());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"An unmapped Graph-API-Exception.\",\n" +
- " \"type\": null,\n" +
- " \"code\": 999999999\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnmappedErrorException e)
- {
- log.debug("{}", e.toString());
- assertEquals("An unmapped Graph-API-Exception.", e.getMessage());
- assertNull(e.getType());
- assertEquals(new Integer(999999999), e.getCode());
- assertNull(e.getSubCode());
- assertNull(e.getUserTitle());
- assertNull(e.getUserMessage());
- assertNull(e.getTraceId());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"An unmapped Graph-API-Exception.\",\n" +
- " \"code\": 999999999\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(UnmappedErrorException e)
- {
- log.debug("{}", e.toString());
- assertEquals("An unmapped Graph-API-Exception.", e.getMessage());
- assertNull(e.getType());
- assertEquals(new Integer(999999999), e.getCode());
- assertNull(e.getSubCode());
- assertNull(e.getUserTitle());
- assertNull(e.getUserMessage());
- assertNull(e.getTraceId());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
- }
-
- @Test
- public void testInvlalidErrors()
- {
- log.info("testInvalidErrors");
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"Not a Graph-Api-Exception.\",\n" +
- " \"type\": \"Whatever\",\n" +
- " \"code\": \"some string\"\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"Not a Graph-Api-Exception.\",\n" +
- " \"type\": \"Whatever\",\n" +
- " \"code\": 9.9\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"Not a Graph-Api-Exception.\",\n" +
- " \"type\": \"Whatever\",\n" +
- " \"code\": null\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody(
- "{\n" +
- " \"error\":\n" +
- " {\n" +
- " \"message\": \"Not a Graph-Api-Exception.\",\n" +
- " \"type\": \"Whatever\"\n" +
- " }\n" +
- "}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":{\"message\":null}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":{\"type\":null}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":{\"code\":null}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":{}}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":\"some message\"}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"error\":null}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{\"some filed\":\"some message\"}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("{}");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
-
-
- requestFactory.setBody("");
-
- try
- {
- clientTemplate.getForObject("ANY", SOME.class);
- fail("The expected exception was not thrown");
- }
- catch(HttpClientErrorException e)
- {
- log.debug("{}", e.toString());
- }
- catch(Exception e)
- {
- fail("A wrong exception was thrown: " + e.toString());
- }
- }
-
-
- @Before
- public void setUp()
- {
- requestFactory = new MockClientHttpRequestFactory();
- requestFactory.setStatus(HttpStatus.BAD_REQUEST);
- requestFactory.addHeader("Content-Type", "application/json");
-
- clientTemplate = new RestTemplate();
- clientTemplate.setRequestFactory(requestFactory);
- clientTemplate.setErrorHandler(
- new GraphApiErrorResponseErrorHandler(clientTemplate.getErrorHandler())
- );
- }
-
-
- static class SOME
- {
- }
-}
--- /dev/null
+package de.juplo.facebook.errors;
+
+
+import de.juplo.facebook.errors.GraphApiException.Type;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+
+
+/**
+ *
+ * @author Kai Moritz
+ */
+public class GraphApiErrorResponseErrorHandlerIntegrationTest
+{
+ private static final Logger LOG =
+ LoggerFactory.getLogger(GraphApiErrorResponseErrorHandlerIntegrationTest.class);
+
+ private RestTemplate clientTemplate;
+ private MockClientHttpRequestFactory requestFactory;
+
+
+ @Test
+ public void testNoError()
+ {
+ LOG.info("testNoError");
+
+ requestFactory.setBody("{\n" +
+ " \"error\": {\n" +
+ " \"message\": \"(#200) The user hasn't authorized the application to perform this action\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 200\n" +
+ " }\n" +
+ "}");
+
+
+ requestFactory.setStatus(HttpStatus.CONTINUE);
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ }
+ catch(Exception e)
+ {
+ LOG.debug("{}", e.toString());
+ fail("Unexpected error: " + e);
+ }
+
+ requestFactory.setStatus(HttpStatus.OK);
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ }
+ catch(Exception e)
+ {
+ LOG.debug("{}", e.toString());
+ fail("Unexpected error: " + e);
+ }
+
+ requestFactory.setStatus(HttpStatus.TEMPORARY_REDIRECT);
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ }
+ catch(Exception e)
+ {
+ LOG.debug("{}", e.toString());
+ fail("Unexpected error: " + e);
+ }
+
+ requestFactory.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ }
+ catch(Exception e)
+ {
+ LOG.debug("{}", e.toString());
+ fail("Unexpected error: " + e);
+ }
+ }
+
+ @Test
+ public void testValidError()
+ {
+ LOG.info("testValidError");
+
+
+ requestFactory.setBody(
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 613\n" +
+ " }\n" +
+ "}");
+
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ fail("The expected exception was not thrown");
+ }
+ catch(RateLimitExceededException e)
+ {
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(613), e.getCode());
+ assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+ }
+
+ @Test
+ public void testUnmappedError()
+ {
+ LOG.info("testUnmappedError");
+
+
+ requestFactory.setBody(
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"This error does not exist.\",\n" +
+ " \"type\": \"NonexistentTypeException\",\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}");
+
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ fail("The expected exception was not thrown");
+ }
+ catch(GraphApiException e)
+ {
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(999999999), e.getCode());
+ assertEquals("This error does not exist.", e.getMessage());
+ try
+ {
+ Type type = e.getType();
+ LOG.error("unknown type: {}", type);
+ fail("unmapped type was resolved by enum: " + type);
+ }
+ catch (IllegalArgumentException ee) {}
+ }
+ }
+
+ @Test
+ public void testInvlalidError()
+ {
+ LOG.info("testInvalidError");
+
+
+ requestFactory.setBody(
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Not a Graph-Api-Exception.\",\n" +
+ " \"type\": \"Whatever\",\n" +
+ " \"code\": \"some string\"\n" +
+ " }\n" +
+ "}");
+
+ try
+ {
+ clientTemplate.getForObject("ANY", SOME.class);
+ fail("The expected exception was not thrown");
+ }
+ catch(HttpClientErrorException e)
+ {
+ LOG.debug("{}", e.toString());
+ }
+ catch(Exception e)
+ {
+ fail("A wrong exception was thrown: " + e.toString());
+ }
+ }
+
+
+ @Before
+ public void setUp()
+ {
+ requestFactory = new MockClientHttpRequestFactory();
+ requestFactory.setStatus(HttpStatus.BAD_REQUEST);
+ requestFactory.addHeader("Content-Type", "application/json");
+
+ clientTemplate = new RestTemplate();
+ clientTemplate.setRequestFactory(requestFactory);
+ clientTemplate.setErrorHandler(
+ new GraphApiErrorResponseErrorHandler(clientTemplate.getErrorHandler())
+ );
+ }
+
+
+ static class SOME
+ {
+ }
+}
--- /dev/null
+package de.juplo.facebook.errors;
+
+
+import de.juplo.facebook.errors.GraphApiException.Type;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+
+
+
+/**
+ *
+ * @author Kai Moritz
+ */
+public class GraphApiExceptionTest
+{
+ private static final Logger LOG =
+ LoggerFactory.getLogger(GraphApiExceptionTest.class);
+
+ private HttpStatus status = HttpStatus.I_AM_A_TEAPOT;
+ private HttpHeaders headers = HttpHeaders.EMPTY;
+
+
+ @Test
+ public void testError1()
+ {
+ LOG.info("testError1");
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"An unknown error has occurred.\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 1\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnknownErrorException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testError2()
+ {
+ LOG.info("testError2");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"An unexpected error has occurred. Please retry your request later.\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 2\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnexpectedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(2), e.getCode());
+ assertEquals("An unexpected error has occurred. Please retry your request later.", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+
+ @Test
+ public void testError4()
+ {
+ LOG.info("testError4");
+
+
+ String str =
+ "{\n" +
+ " \"error\": {\n" +
+ " \"code\": 4, \n" +
+ " \"fbtrace_id\": \"HZRM6BTMu+D\", \n" +
+ " \"is_transient\": true, \n" +
+ " \"message\": \"(#4) Application request limit reached\", \n" +
+ " \"type\": \"OAuthException\"\n" +
+ " }\n" +
+ "}\n";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(ApplicationRequestLimitReachedException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(4), e.getCode());
+ assertEquals("(#4) Application request limit reached", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+
+ @Test
+ public void testError12()
+ {
+ LOG.info("testError12");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"(#12) location field is deprecated for versions v2.5 and higher\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 12\n," +
+ " \"fbtrace_id\":\"BoxCYne7GrL\"\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(DeprecatedException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(12), e.getCode());
+ assertEquals("(#12) location field is deprecated for versions v2.5 and higher", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+
+ @Test
+ public void testError21()
+ {
+ LOG.info("testError21");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"(#21) Page ID 590408587650316 was migrated to page ID 1421620791415603. Please update your API calls to the new ID\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 21\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(PageMigratedException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(21), e.getCode());
+ assertEquals("(#21) Page ID 590408587650316 was migrated to page ID 1421620791415603. Please update your API calls to the new ID", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+
+ @Test
+ public void testError100()
+ {
+ LOG.info("testError100");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Unsupported get request.\",\n" +
+ " \"type\": \"GraphMethodException\",\n" +
+ " \"code\": 100\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+
+ assertTrue(e.getClass().equals(UnsupportedGetRequestException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(100), e.getCode());
+ assertEquals("Unsupported get request.", e.getMessage());
+ assertEquals(Type.GraphMethodException, e.getType());
+ }
+
+ @Test
+ public void testError102()
+ {
+ LOG.info("testError102");
+
+ String str ="{\"error\":{\"message\":\"A user access token is required to request this resource.\",\"type\":\"OAuthException\",\"code\":102,\"fbtrace_id\":\"DhdMyf23Ki7\"}}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+
+ assertTrue(e.getClass().equals(UserAccessTokenRequiredException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testError104()
+ {
+ LOG.info("testError104");
+
+ String str ="{\"error\":{\"message\":\"An access token is required to request this resource.\",\"type\":\"OAuthException\",\"code\":104,\"fbtrace_id\":\"E2Jjkj5++LL\"}}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(AccessTokenRequiredException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testError190()
+ {
+ LOG.info("testError190");
+
+ String str ="{\"error\":{\"message\":\"Bad signature\",\"type\":\"OAuthException\",\"code\":190,\"fbtrace_id\":\"Ay2OYQrINbXOCfQpBvoxDIw\"}}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(AccessTokenExpiredException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testError200()
+ {
+ LOG.info("testError200");
+
+ String str ="{\n" +
+ " \"error\": {\n" +
+ " \"message\": \"(#200) The user hasn't authorized the application to perform this action\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 200\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(ApplicationNotAuthorizedByUserException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testError613()
+ {
+ LOG.info("testError613");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.\",\n" +
+ " \"type\": \"OAuthException\",\n" +
+ " \"code\": 613\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(RateLimitExceededException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(613), e.getCode());
+ assertEquals("(#613) Calls to stream have exceeded the rate of 600 calls per 600 seconds.", e.getMessage());
+ assertEquals(Type.OAuthException, e.getType());
+ }
+
+ @Test
+ public void testError2200()
+ {
+ LOG.info("testError2200");
+
+ String str ="{\"error\":{\"message\":\"(#2200) callback verification failed: \",\"type\":\"OAuthException\",\"code\":2200,\"fbtrace_id\":\"ESLjoZKvPXg\"}}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(CallbackVerificationFailedException.class));
+ LOG.debug("{}", e.toString());
+ }
+
+ @Test
+ public void testUnmappedError()
+ {
+ LOG.info("testUnmappedError");
+
+
+ String str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"This error does not exist.\",\n" +
+ " \"type\": \"NonexistentTypeException\",\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}";
+ byte[] message = str.getBytes();
+ GraphApiException e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnmappedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals(new Integer(999999999), e.getCode());
+ assertEquals("This error does not exist.", e.getMessage());
+ try
+ {
+ Type type = e.getType();
+ LOG.error("unknown type: {}", type);
+ fail("unmapped type was resolved by enum: " + type);
+ }
+ catch (IllegalArgumentException ee) {}
+ }
+
+ @Test
+ public void testUnmappedErrors()
+ {
+ LOG.info("testUnmappedErrors");
+
+ String str;
+ byte[] message;
+ GraphApiException e;
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": null,\n" +
+ " \"type\": \"WhateverTypeException\",\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnmappedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertNull(e.getMessage());
+ try
+ {
+ Type type = e.getType();
+ LOG.error("unknown type: {}", type);
+ fail("unmapped type was resolved by enum: " + type);
+ }
+ catch (IllegalArgumentException ee) {}
+ assertEquals(new Integer(999999999), e.getCode());
+ assertNull(e.getSubCode());
+ assertNull(e.getUserTitle());
+ assertNull(e.getUserMessage());
+ assertNull(e.getTraceId());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"type\": \"WhateverTypeException\",\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnmappedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertNull(e.getMessage());
+ try
+ {
+ Type type = e.getType();
+ LOG.error("unknown type: {}", type);
+ fail("unmapped type was resolved by enum: " + type);
+ }
+ catch (IllegalArgumentException ee) {}
+ assertEquals(new Integer(999999999), e.getCode());
+ assertNull(e.getSubCode());
+ assertNull(e.getUserTitle());
+ assertNull(e.getUserMessage());
+ assertNull(e.getTraceId());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"An unmapped Graph-API-Exception.\",\n" +
+ " \"type\": null,\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnmappedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals("An unmapped Graph-API-Exception.", e.getMessage());
+ assertNull(e.getType());
+ assertEquals(new Integer(999999999), e.getCode());
+ assertNull(e.getSubCode());
+ assertNull(e.getUserTitle());
+ assertNull(e.getUserMessage());
+ assertNull(e.getTraceId());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"An unmapped Graph-API-Exception.\",\n" +
+ " \"code\": 999999999\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+
+ assertTrue(e.getClass().equals(UnmappedErrorException.class));
+ LOG.debug("{}", e.toString());
+ assertEquals("An unmapped Graph-API-Exception.", e.getMessage());
+ assertNull(e.getType());
+ assertEquals(new Integer(999999999), e.getCode());
+ assertNull(e.getSubCode());
+ assertNull(e.getUserTitle());
+ assertNull(e.getUserMessage());
+ assertNull(e.getTraceId());
+ }
+
+ @Test
+ public void testInvlalidErrors()
+ {
+ LOG.info("testInvalidErrors");
+
+ String str;
+ byte[] message;
+ GraphApiException e;
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Not a Graph-Api-Exception.\",\n" +
+ " \"type\": \"Whatever\",\n" +
+ " \"code\": \"some string\"\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Not a Graph-Api-Exception.\",\n" +
+ " \"type\": \"Whatever\",\n" +
+ " \"code\": 9.9\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Not a Graph-Api-Exception.\",\n" +
+ " \"type\": \"Whatever\",\n" +
+ " \"code\": null\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str =
+ "{\n" +
+ " \"error\":\n" +
+ " {\n" +
+ " \"message\": \"Not a Graph-Api-Exception.\",\n" +
+ " \"type\": \"Whatever\"\n" +
+ " }\n" +
+ "}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":{\"message\":null}}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":{\"type\":null}}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":{\"code\":null}}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":{}}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":\"some message\"}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"error\":null}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{\"some filed\":\"some message\"}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="{}";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+
+
+ str ="";
+ message = str.getBytes();
+ e = GraphApiException.create (status, headers, message);
+ assertTrue(e.getClass().equals(ErrorResponseParsingErrorException.class));
+ LOG.debug("{}", e.toString());
+ }
+}