org.wisdom.framework.vertx.FormTest.java Source code

Java tutorial

Introduction

Here is the source code for org.wisdom.framework.vertx.FormTest.java

Source

/*
 * #%L
 * Wisdom-Framework
 * %%
 * Copyright (C) 2013 - 2014 Wisdom Framework
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package org.wisdom.framework.vertx;

import org.apache.http.HttpResponse;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.After;
import org.junit.Test;
import org.wisdom.api.Controller;
import org.wisdom.api.DefaultController;
import org.wisdom.api.configuration.ApplicationConfiguration;
import org.wisdom.api.exceptions.ExceptionMapper;
import org.wisdom.api.http.HeaderNames;
import org.wisdom.api.http.HttpMethod;
import org.wisdom.api.http.MimeTypes;
import org.wisdom.api.http.Result;
import org.wisdom.api.router.Route;
import org.wisdom.api.router.RouteBuilder;
import org.wisdom.api.router.Router;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
 * Check that the Vertx server handle forms correctly.
 */
public class FormTest extends VertxBaseTest {

    private WisdomVertxServer server;

    @After
    public void tearDown() {
        if (server != null) {
            server.stop();
            server = null;
        }
    }

    @Test
    public void testFormSubmissionAsFormURLEncoded() throws InterruptedException, IOException {
        Router router = prepareServer();

        // Prepare the router with a controller
        Controller controller = new DefaultController() {
            @SuppressWarnings("unused")
            public Result submit() {
                final Map<String, List<String>> form = context().form();
                // String
                if (!form.get("key").get(0).equals("value")) {
                    return badRequest("key is not equals to value");
                }

                // Multiple values
                List<String> list = form.get("list");
                if (!(list.contains("1") && list.contains("2"))) {
                    return badRequest("list does not contains 1 and 2");
                }

                return ok(context().header(HeaderNames.CONTENT_TYPE));
            }
        };
        Route route = new RouteBuilder().route(HttpMethod.POST).on("/").to(controller, "submit");
        when(router.getRouteFor(anyString(), anyString(), any(org.wisdom.api.http.Request.class)))
                .thenReturn(route);

        server.start();
        waitForStart(server);

        int port = server.httpPort();

        final HttpResponse response = Request.Post("http://localhost:" + port + "/")
                .bodyForm(Form.form().add("key", "value").add("list", "1").add("list", "2").build()).execute()
                .returnResponse();

        assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
        assertThat(EntityUtils.toString(response.getEntity())).contains(MimeTypes.FORM);
    }

    @Test
    public void testFormSubmissionAsMultipart() throws InterruptedException, IOException {
        Router router = prepareServer();

        // Prepare the router with a controller
        Controller controller = new DefaultController() {
            @SuppressWarnings("unused")
            public Result submit() {
                final Map<String, List<String>> form = context().form();
                // String
                if (!form.get("key").get(0).equals("value")) {
                    return badRequest("key is not equals to value");
                }

                // Multiple values
                List<String> list = form.get("list");
                if (!(list.contains("1") && list.contains("2"))) {
                    return badRequest("list does not contains 1 and 2");
                }

                return ok(context().header(HeaderNames.CONTENT_TYPE));
            }
        };
        Route route = new RouteBuilder().route(HttpMethod.POST).on("/").to(controller, "submit");
        when(router.getRouteFor(anyString(), anyString(), any(org.wisdom.api.http.Request.class)))
                .thenReturn(route);

        server.start();
        waitForStart(server);

        int port = server.httpPort();

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addTextBody("key", "value", ContentType.TEXT_PLAIN).addTextBody("list", "1", ContentType.TEXT_PLAIN)
                .addTextBody("list", "2", ContentType.TEXT_PLAIN);

        final HttpResponse response = Request.Post("http://localhost:" + port + "/").body(builder.build()).execute()
                .returnResponse();

        assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200);
        assertThat(EntityUtils.toString(response.getEntity())).contains(MimeTypes.MULTIPART);
    }

    private Router prepareServer() {
        // Prepare the configuration
        ApplicationConfiguration configuration = mock(ApplicationConfiguration.class);
        when(configuration.getIntegerWithDefault(eq("vertx.http.port"), anyInt())).thenReturn(0);
        when(configuration.getIntegerWithDefault(eq("vertx.https.port"), anyInt())).thenReturn(-1);
        when(configuration.getIntegerWithDefault("request.body.max.size", 100 * 1024)).thenReturn(100 * 1024);
        when(configuration.getIntegerWithDefault("vertx.acceptBacklog", -1)).thenReturn(-1);
        when(configuration.getIntegerWithDefault("vertx.receiveBufferSize", -1)).thenReturn(-1);
        when(configuration.getIntegerWithDefault("vertx.sendBufferSize", -1)).thenReturn(-1);
        when(configuration.getStringArray("wisdom.websocket.subprotocols")).thenReturn(new String[0]);
        when(configuration.getStringArray("vertx.websocket-subprotocols")).thenReturn(new String[0]);

        Router router = mock(Router.class);

        // Configure the server.
        server = new WisdomVertxServer();
        server.configuration = configuration;
        server.accessor = new ServiceAccessor(null, configuration, router, getMockContentEngine(), null, null,
                Collections.<ExceptionMapper>emptyList());
        server.vertx = vertx;
        return router;
    }

}