ch.entwine.weblounge.test.harness.content.HTMLActionTest.java Source code

Java tutorial

Introduction

Here is the source code for ch.entwine.weblounge.test.harness.content.HTMLActionTest.java

Source

/*
 *  Weblounge: Web Content Management System
 *  Copyright (c) 2003 - 2011 The Weblounge Team
 *  http://entwinemedia.com/weblounge
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, write to the Free Software Foundation
 *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

package ch.entwine.weblounge.test.harness.content;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;

import ch.entwine.weblounge.common.impl.testing.IntegrationTestBase;
import ch.entwine.weblounge.common.impl.util.TestUtils;
import ch.entwine.weblounge.common.impl.util.xml.XPathHelper;
import ch.entwine.weblounge.common.site.HTMLAction;
import ch.entwine.weblounge.common.url.UrlUtils;
import ch.entwine.weblounge.test.site.GreeterHTMLAction;
import ch.entwine.weblounge.test.util.TestSiteUtils;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpOptions;
import org.apache.http.impl.client.DefaultHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;

import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

/**
 * Integration test to test <code>HTML</code> action output.
 */
public class HTMLActionTest extends IntegrationTestBase {

    /** The logger */
    private static final Logger logger = LoggerFactory.getLogger(HTMLActionTest.class);

    /** Title of the alternate template */
    private static final String ALTERNATE_TEMPLATE_TITLE = "Weblounge Test Site Alternate Representation";

    /** The paths to test */
    private static final String[] requestPaths = new String[] { "/greeting/", "/greeting/html" };

    /** The default path to action */
    private static final String defaultActionPath = "/greeting";

    /** The path to action configured to render on a specific template */
    private static final String templatedActionPath = "/greeting-templated";

    /** The path to targeted action */
    private static final String targetedActionPath = "/greeting-targeted";

    /**
     * Creates a new instance of the <code>HTML</code> action test.
     */
    public HTMLActionTest() {
        super("HTML Action Test", WEBLOUNGE_CONTENT_TEST_GROUP);
    }

    /**
     * {@inheritDoc}
     * 
     * @see ch.entwine.weblounge.testing.kernel.IntegrationTest#execute(java.lang.String)
     */
    @Override
    public void execute(String serverUrl) throws Exception {
        testActionURL(serverUrl);
        testParametersAndLanguage(serverUrl);
        testConfiguredTargetPage(serverUrl);
        testOverridenTargetPage(serverUrl);
        testConfiguredTemplate(serverUrl);
        testOverridenTemplateByParameter(serverUrl);
        testOverridenTemplateByCode(serverUrl);
    }

    /**
     * {@inheritDoc}
     * 
     * @see ch.entwine.weblounge.testing.kernel.IntegrationTest#execute(java.lang.String)
     */
    private void testParametersAndLanguage(String serverUrl) throws Exception {
        logger.info("Preparing test of greeter action");

        // Load the test data
        Map<String, String> greetings = TestSiteUtils.loadGreetings();
        Set<String> languages = greetings.keySet();

        // Prepare the request
        logger.info("Testing greeter action's html output");
        logger.info("Sending {} requests to {}", languages.size(), UrlUtils.concat(serverUrl, requestPaths[0]));

        for (String path : requestPaths) {
            for (String language : languages) {
                String greeting = greetings.get(language);
                HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, path));
                String[][] params = new String[][] { { "language", language } };

                // Send and the request and examine the response
                logger.debug("Sending request to {}", request.getURI());
                HttpClient httpClient = new DefaultHttpClient();
                try {
                    HttpResponse response = TestUtils.request(httpClient, request, params);
                    assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

                    // Get the document contents
                    Document xml = TestUtils.parseXMLResponse(response);

                    // Look for page content output
                    String templateOutput = XPathHelper.valueOf(xml, "/html/head/title");
                    assertNotNull("General template output does not work", templateOutput);
                    assertEquals("Template title is not as expected", "Welcome to Weblounge", templateOutput);

                    // Look for action parameter handling and direct output of
                    // startState()
                    String actualGreeting = XPathHelper.valueOf(xml, "/html/body/div[@id='main']/h1");
                    assertEquals(greeting, actualGreeting);
                    logger.debug("Found greeting");

                    // Look for included pagelets
                    assertNotNull("JSP include failed",
                            XPathHelper.valueOf(xml, "/html/body/div[@id='main']/div[@class='greeting']"));
                    logger.debug("Found pagelet content");

                    // Look for action header includes
                    String scriptInclude = UrlUtils.concat(site.getHostname(environment).getURL().toExternalForm(),
                            "weblounge-sites", site.getIdentifier(), "modules/test/scripts/greeting.js");
                    assertEquals("Action include failed", scriptInclude,
                            XPathHelper.valueOf(xml, "/html/head/script[1]/@src"));
                    logger.debug("Found action javascript include");

                    // Look for pagelet header includes
                    assertEquals("Pagelet include failed", "1",
                            XPathHelper.valueOf(xml, "count(/html/head/link[contains(@href, 'greeting.css')])"));
                    logger.debug("Found pagelet stylesheet include");

                    // Test for template replacement
                    assertNull("Header tag templating failed",
                            XPathHelper.valueOf(xml, "//@src[contains(., '${module.root}')]"));
                    assertNull("Header tag templating failed",
                            XPathHelper.valueOf(xml, "//@src[contains(., '${site.root}')]"));

                } finally {
                    httpClient.getConnectionManager().shutdown();
                }
            }
        }
    }

    /**
     * Tests whether the action returns its url correctly.
     * 
     * @param serverUrl
     *          the server url
     */
    private void testActionURL(String serverUrl) {
        // Prepare the request
        logger.info("Testing action url");

        HttpOptions request = new HttpOptions(UrlUtils.concat(serverUrl, defaultActionPath));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Make sure there is a Location header in the response
            Header locationHeader = response.getFirstHeader("Location");
            assertNotNull("Action did not return 'Location' header", locationHeader);
            String location = locationHeader.getValue();

            // Check that the action's url starts with the correct environment
            assertEquals("Action reports invalid url", defaultActionPath + "/", location);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

    /**
     * Tests whether actions are rendered on pages as configured in module.xml
     * 
     * @param serverUrl
     *          the server url
     */
    private void testConfiguredTargetPage(String serverUrl) {
        logger.info("Preparing test of greeter action");

        // Prepare the request
        logger.info("Testing action target page configuration");

        HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, targetedActionPath));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Get the document contents
            Document xml = TestUtils.parseXMLResponse(response);

            // Make sure it is rendered on the home page
            String testSuiteTitle = XPathHelper.valueOf(xml, "/html/body/h1");
            assertNull("Action is not rendered on configured page", testSuiteTitle);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

    /**
     * Tests whether action output can be redirected to certain pages by providing
     * a target url.
     * 
     * @param serverUrl
     *          the server url
     */
    private void testOverridenTargetPage(String serverUrl) {
        logger.info("Preparing test of greeter action");

        // Prepare the request
        logger.info("Testing action target page overriding");

        StringBuffer requestUrl = new StringBuffer(targetedActionPath);
        requestUrl.append("?").append(HTMLAction.TARGET_PAGE).append("=%2F");
        HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, requestUrl.toString()));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Get the document contents
            Document xml = TestUtils.parseXMLResponse(response);

            // Make sure it is rendered on the home page
            String testSuiteTitle = XPathHelper.valueOf(xml, "/html/body/h1");
            assertEquals("Action is not rendered on start page", "Welcome to the Weblounge 3.0 testpage!",
                    testSuiteTitle);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

    /**
     * Tests whether actions are rendered using templates as configured in
     * module.xml
     * 
     * @param serverUrl
     *          the server url
     */
    private void testConfiguredTemplate(String serverUrl) {
        logger.info("Preparing test of greeter action with configured template");

        HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, templatedActionPath));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Get the document contents
            Document xml = TestUtils.parseXMLResponse(response);

            // Make sure it is rendered on the home page
            String templateTitle = XPathHelper.valueOf(xml, "/html/head/title");
            assertEquals("Action is not rendered on alternate template", ALTERNATE_TEMPLATE_TITLE, templateTitle);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

    /**
     * Tests whether action template can be overwritten.
     * 
     * @param serverUrl
     *          the server url
     */
    private void testOverridenTemplateByParameter(String serverUrl) {
        logger.info("Preparing test of greeter action with overridden template by parameter");

        StringBuffer requestUrl = new StringBuffer(defaultActionPath);
        requestUrl.append("?").append(HTMLAction.TARGET_TEMPLATE).append("=alternate");
        HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, requestUrl.toString()));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Get the document contents
            Document xml = TestUtils.parseXMLResponse(response);

            // Make sure it is rendered on the home page
            String templateTitle = XPathHelper.valueOf(xml, "/html/head/title");
            assertEquals("Action is not rendered on alternate template", ALTERNATE_TEMPLATE_TITLE, templateTitle);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

    /**
     * Tests whether action template can be overwritten. The template is
     * overwritten in the configure() method rather than by a request parameter.
     * 
     * @param serverUrl
     *          the server url
     */
    private void testOverridenTemplateByCode(String serverUrl) {
        logger.info("Preparing test of greeter action with overridden template by code");

        StringBuffer requestUrl = new StringBuffer(defaultActionPath);
        requestUrl.append("?").append(GreeterHTMLAction.CODE_TEMPLATE).append("=alternate");
        HttpGet request = new HttpGet(UrlUtils.concat(serverUrl, requestUrl.toString()));

        // Send the request and make sure it ends up on the expected page
        logger.info("Sending request to {}", request.getURI());
        HttpClient httpClient = new DefaultHttpClient();
        try {
            HttpResponse response = TestUtils.request(httpClient, request, null);
            assertEquals(HttpServletResponse.SC_OK, response.getStatusLine().getStatusCode());

            // Get the document contents
            Document xml = TestUtils.parseXMLResponse(response);

            // Make sure it is rendered on the home page
            String templateTitle = XPathHelper.valueOf(xml, "/html/head/title");
            assertEquals("Action is not rendered on alternate template", ALTERNATE_TEMPLATE_TITLE, templateTitle);

        } catch (Throwable e) {
            fail("Request to " + request.getURI() + " failed" + e.getMessage());
        } finally {
            httpClient.getConnectionManager().shutdown();
        }
    }

}