package in.partake.controller.api; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import in.partake.controller.AbstractPartakeControllerTest; import in.partake.resource.ServerErrorCode; import in.partake.resource.UserErrorCode; import java.io.IOException; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.node.ObjectNode; import org.junit.Assert; import play.mvc.Result; import play.test.Helpers; import in.partake.controller.ActionProxy; public abstract class APIControllerTest extends AbstractPartakeControllerTest { /** * Returns JSON from <code>proxy</code>. If not available, null will be returned. * @param proxy * @return * @throws IOException */ protected String getJSONString(ActionProxy proxy) throws Exception { byte[] streamData = Helpers.contentAsBytes(proxy.getResult()); if (streamData == null) { return null; } else { return new String(streamData, "UTF-8"); } } /** * proxy から JSON を取得する。 * @param proxy * @return * @throws IOException */ protected ObjectNode getJSON(ActionProxy proxy) throws Exception { String str = getJSONString(proxy); return new ObjectMapper().readValue(str, ObjectNode.class); } // ---------------------------------------------------------------------- protected void assertResultOK(ActionProxy proxy) throws Exception { Assert.assertEquals(200, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); assertThat(obj.get("result").asText(), is("ok")); } protected void assertResultInvalid(ActionProxy proxy, UserErrorCode ec) throws Exception { Assert.assertEquals(400, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); assertThat(obj.get("result").asText(), is("invalid")); assertThat(obj.get("reason").asText(), is(ec.getReasonString())); } protected void assertResultInvalid(ActionProxy proxy, UserErrorCode ec, String additional) throws Exception { Assert.assertEquals(400, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); assertThat(obj.get("result").asText(), is("invalid")); assertThat(obj.get("reason").asText(), is(ec.getReasonString())); JsonNode additionalObj = obj.get("additional"); assertThat(additionalObj.has(additional), is(true)); } protected void assertResultLoginRequired(ActionProxy proxy) throws Exception { Assert.assertEquals(401, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); String authenticate = (String) Helpers.header("WWW-Authenticate", proxy.getResult()); Assert.assertNotNull(authenticate); Assert.assertTrue(authenticate.contains("OAuth")); ObjectNode obj = getJSON(proxy); Assert.assertEquals("auth", obj.get("result").asText()); Assert.assertFalse(StringUtils.isBlank(obj.get("reason").asText())); } protected void assertResultForbidden(ActionProxy proxy) throws Exception { // status code should be 403 Assert.assertEquals(403, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); Assert.assertEquals("forbidden", obj.get("result").asText()); Assert.assertFalse(StringUtils.isBlank(obj.get("reason").asText())); } protected void assertResultForbidden(ActionProxy proxy, UserErrorCode ec) throws Exception { assert ec.getStatusCode() == 403; // status code should be 403 Assert.assertEquals(403, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); Assert.assertEquals("forbidden", obj.get("result").asText()); Assert.assertFalse(StringUtils.isBlank(obj.get("reason").asText())); // TODO: Check errorCode here. } protected void assertResultError(ActionProxy proxy, ServerErrorCode ec) throws Exception { Assert.assertEquals(500, Helpers.status(proxy.getResult())); expectBehaveAsApi(proxy.getResult()); ObjectNode obj = getJSON(proxy); assertThat(obj.get("result").asText(), is("error")); assertThat(obj.get("reason").asText(), is(ec.getReasonString())); } private void expectBehaveAsApi(Result result) { assertThat( Helpers.header(Helpers.CONTENT_TYPE, result), is("application/json; charset=utf-8")); assertThat( Helpers.header(Helpers.CACHE_CONTROL, result), is("no-cache")); } }