net.officefloor.tutorial.transactionhttpserver.TransactionHttpServerTest.java Source code

Java tutorial

Introduction

Here is the source code for net.officefloor.tutorial.transactionhttpserver.TransactionHttpServerTest.java

Source

/*
 * OfficeFloor - http://www.officefloor.net
 * Copyright (C) 2005-2013 Daniel Sagenschneider
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package net.officefloor.tutorial.transactionhttpserver;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.sql.DataSource;

import junit.framework.TestCase;
import net.officefloor.plugin.socket.server.http.HttpTestUtil;
import net.officefloor.plugin.woof.WoofOfficeFloorSource;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.hsqldb.jdbc.jdbcDataSource;

/**
 * Tests the Transaction HTTP Server.
 * 
 * @author Daniel Sagenschneider
 */
public class TransactionHttpServerTest extends TestCase {

    /**
     * URL for the database.
     */
    private static final String DATABASE_URL = "jdbc:hsqldb:mem:exampleDb";

    /**
     * User for the database.
     */
    private static final String DATABASE_USER = "sa";

    /**
     * {@link CloseableHttpClient}.
     */
    private final CloseableHttpClient client = HttpTestUtil.createHttpClient();

    @Override
    protected void setUp() throws Exception {
        // Start the database and HTTP Server
        WoofOfficeFloorSource.start();
    }

    @Override
    protected void tearDown() throws Exception {
        try {
            // Disconnect client
            this.client.close();
        } finally {
            try {
                // Stop HTTP Server
                WoofOfficeFloorSource.stop();
            } finally {
                // Stop database for new instance each test
                DriverManager.getConnection(DATABASE_URL, DATABASE_USER, "").createStatement()
                        .execute("SHUTDOWN IMMEDIATELY");
            }
        }
    }

    /**
     * Ensure able to connect to database with {@link DataSource}.
     */
    public void testSetupDatabase() throws Exception {

        // Request page to allow time for database setup
        this.doRequest("http://localhost:7878/users.woof");

        // Obtain connection via DataSource
        jdbcDataSource dataSource = new jdbcDataSource();
        dataSource.setDatabase(DATABASE_URL);
        dataSource.setUser(DATABASE_USER);
        Connection connection = dataSource.getConnection();

        // Ensure can get initial row
        ResultSet resultSet = connection.createStatement().executeQuery("SELECT FULLNAME FROM PERSON");
        assertTrue("Ensure have result", resultSet.next());
        assertEquals("Incorrect setup name", "Daniel Sagenschneider", resultSet.getString("FULLNAME"));
        assertFalse("Ensure no further results", resultSet.next());
        resultSet.close();
    }

    /**
     * Ensure the JPA connects to database.
     */
    public void testJpa() throws Exception {

        // Request page to allow time for database setup
        this.doRequest("http://localhost:7878/users.woof");

        // Obtain entity manager
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("example");
        EntityManager manager = factory.createEntityManager();

        // Ensure can obtain user and person
        Query query = manager.createQuery("SELECT U FROM User U");
        User user = (User) query.getSingleResult();
        assertEquals("Incorrect user name", "daniel", user.getUserName());
        Person person = user.getPerson();
        assertEquals("Incorrect person name", "Daniel Sagenschneider", person.getFullName());

        // Ensure persist user and person
        User newUser = new User();
        newUser.setUserName("test");
        Person newPerson = new Person();
        newPerson.setFullName("TEST");
        newPerson.setUser(newUser);
        manager.persist(newPerson);
        manager.close();

        // Ensure user and person persisted
        manager = factory.createEntityManager();
        User retrievedUser = manager.find(User.class, newUser.getId());
        assertEquals("Incorrect retrieved user name", "test", retrievedUser.getUserName());
        Person retrievedPerson = retrievedUser.getPerson();
        assertEquals("Incorrect retrieved full name", "TEST", retrievedPerson.getFullName());

        // Close persistence
        factory.close();
    }

    /**
     * Requests the page, creates a user and fails to create a user.
     */
    // START SNIPPET: test
    public void testCreateUser() throws Exception {

        // Request page
        this.doRequest("http://localhost:7878/users.woof");

        // Create user with all details
        this.doRequest("http://localhost:7878/users-create.woof?username=melanie&fullname=Melanie+Sagenschneider");

        // Attempt to create user that will fail database constraints
        this.doRequest("http://localhost:7878/users-create.woof?username=joe");

        // Validate melanie added
        EntityManager manager = Persistence.createEntityManagerFactory("example").createEntityManager();
        User melanie = (User) manager.createQuery("SELECT U FROM User U WHERE U.userName = 'melanie'")
                .getSingleResult();
        assertEquals("Melanie created", "Melanie Sagenschneider", melanie.getPerson().getFullName());

        // Validate joe not added
        try {
            manager.createQuery("SELECT U FROM User U WHERE U.userName = 'joe'").getSingleResult();
            fail("Should not find Joe");
        } catch (NoResultException ex) {
        }
    }

    private void doRequest(String url) throws Exception {
        HttpResponse response = this.client.execute(new HttpGet(url));
        assertEquals("Request should be successful", 200, response.getStatusLine().getStatusCode());
        response.getEntity().writeTo(System.out);
    }
    // END SNIPPET: test

}