Package in.partake.controller.api

Source Code of in.partake.controller.api.APIControllerTest

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"));
    }
}
TOP

Related Classes of in.partake.controller.api.APIControllerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.