cz.muni.fi.pv168.project.hotelmanager.RoomManagerImplTest.java Source code

Java tutorial

Introduction

Here is the source code for cz.muni.fi.pv168.project.hotelmanager.RoomManagerImplTest.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.muni.fi.pv168.project.hotelmanager;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.derby.jdbc.EmbeddedDriver;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.sameInstance;
import org.junit.After;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;

/**
 *
 * @author Klara Kosecka
 */
public class RoomManagerImplTest {

    private RoomManager manager;
    private DataSource dataSource;

    @Before
    public void setUp() throws SQLException {

        BasicDataSource bds = new BasicDataSource();
        //set JDBC driver and URL
        bds.setDriverClassName(EmbeddedDriver.class.getName());
        bds.setUrl("jdbc:derby:memory:TestRoomManagerDB;create=true");
        //populate db with tables and data
        new ResourceDatabasePopulator(new ClassPathResource("schema-javadb.sql")).execute(bds);
        this.dataSource = bds;
        manager = new RoomManagerImpl(bds);

    }

    @After
    public void tearDown() throws SQLException {
        try (Connection connection = dataSource.getConnection()) {
            connection.prepareStatement("DROP TABLE room").executeUpdate();
            connection.prepareStatement("DROP TABLE guest").executeUpdate();
            connection.prepareStatement("DROP TABLE reservation").executeUpdate();
        }
    }

    private Room setRoom(int roomnumber, int capacity, int costpernight, boolean doublebed) {
        Room room = new Room();
        room.setRoomNumber(roomnumber);
        room.setCapacity(capacity);
        room.setCostPerNight(costpernight);
        room.setDoubleBed(doublebed);
        return room;
    }

    @Test
    public void testCreatRoom() {
        Room room = setRoom(1, 2, 125, true);
        manager.createRoom(room);

        Long roomId = room.getId();
        assertNotNull(roomId);

        Room result = manager.findRoom(roomId);
        assertThat("loaded room differs from the saved one", result, is(equalTo(room)));
        assertThat("loaded room is the same instance", result, is(not(sameInstance(room))));
        assertDeepEquals(room, result);
    }

    @Test
    public void testUpdateRoom() {
        Room room1 = setRoom(101, 2, 125, true);
        Room room2 = setRoom(102, 3, 250, false);
        manager.createRoom(room1);
        manager.createRoom(room2);

        Long roomId = room1.getId();

        room1 = manager.findRoom(roomId);
        room1.setRoomNumber(103);
        manager.updateRoom(room1);
        assertThat("room number was not changed", room1.getRoomNumber(), is(equalTo(103)));
        assertThat("capacity was changed", room1.getCapacity(), is(equalTo(2)));
        assertThat("cost per night was changed", room1.getCostPerNight(), is(equalTo(125)));
        assertThat("doublebeded was changed", room1.getDoubleBed(), is(equalTo(true)));

        room1 = manager.findRoom(roomId);
        room1.setCapacity(3);
        manager.updateRoom(room1);
        assertThat("room number was changed", room1.getRoomNumber(), is(equalTo(103)));
        assertThat("capacity was not changed", room1.getCapacity(), is(equalTo(3)));
        assertThat("cost per night was changed", room1.getCostPerNight(), is(equalTo(125)));
        assertThat("doublebeded was changed", room1.getDoubleBed(), is(equalTo(true)));

        room1 = manager.findRoom(roomId);
        room1.setCostPerNight(130);
        manager.updateRoom(room1);
        assertThat("room number was changed", room1.getRoomNumber(), is(equalTo(103)));
        assertThat("capacity was changed", room1.getCapacity(), is(equalTo(3)));
        assertThat("cost per night was not changed", room1.getCostPerNight(), is(equalTo(130)));
        assertThat("doublebeded was changed", room1.getDoubleBed(), is(equalTo(true)));

        room1 = manager.findRoom(roomId);
        room1.setDoubleBed(false);
        manager.updateRoom(room1);
        assertThat("room number was changed", room1.getRoomNumber(), is(equalTo(103)));
        assertThat("capacity was changed", room1.getCapacity(), is(equalTo(3)));
        assertThat("cost per night was changed", room1.getCostPerNight(), is(equalTo(130)));
        assertThat("doublebeded was not changed", room1.getDoubleBed(), is(equalTo(false)));

        assertDeepEquals(room2, manager.findRoom(room2.getId()));
    }

    @Test(expected = IllegalArgumentException.class)
    public void testCreateRoomWithNull() throws Exception {
        manager.createRoom(null);
    }

    @Test
    public void testCreateRoomWithWrongValues() {

        Room room;

        room = setRoom(-5, 2, 125, true);
        try {
            manager.createRoom(room);
            fail("wrong room number (negative value)");
        } catch (IllegalArgumentException ex) {
            //OK
        }

        room = setRoom(2, -5, 125, true);
        try {
            manager.createRoom(room);
            fail("wrong capacity number(negative value)");
        } catch (IllegalArgumentException ex) {
            //OK
        }

        room = setRoom(2, 2, -125, true);
        try {
            manager.createRoom(room);
            fail("wrong cost number");
        } catch (IllegalArgumentException ex) {
            //OK
        }
    }

    @Test
    public void testGetAllRooms() {

        assertTrue(manager.findAllRooms().isEmpty());

        Room r1 = setRoom(101, 2, 125, true);
        Room r2 = setRoom(102, 3, 250, false);

        manager.createRoom(r1);
        manager.createRoom(r2);

        List<Room> expected = Arrays.asList(r1, r2);
        List<Room> actual = manager.findAllRooms();

        Collections.sort(actual, idComparator);
        Collections.sort(expected, idComparator);

        assertEquals("saved and retrieved rooms differ", expected, actual);
        assertDeepEquals(expected, actual);
    }

    @Test
    public void TestdeleteRoom() {
        Room r1 = setRoom(101, 2, 125, true);
        Room r2 = setRoom(102, 3, 250, false);
        manager.createRoom(r1);
        manager.createRoom(r2);

        assertNotNull(manager.findRoom(r1.getId()));
        assertNotNull(manager.findRoom(r2.getId()));

        manager.deleteRoom(r1);

        assertNull(manager.findRoom(r1.getId()));
        assertNotNull(manager.findRoom(r2.getId()));
    }

    private void assertDeepEquals(List<Room> expectedList, List<Room> actualList) {
        for (int i = 0; i < expectedList.size(); i++) {
            Room expected = expectedList.get(i);
            Room actual = actualList.get(i);
            assertDeepEquals(expected, actual);
        }
    }

    private void assertDeepEquals(Room expected, Room actual) {
        assertEquals(expected.getId(), actual.getId());
        assertEquals(expected.getRoomNumber(), actual.getRoomNumber());
        assertEquals(expected.getCapacity(), actual.getCapacity());
        assertEquals(expected.getCostPerNight(), actual.getCostPerNight());
        assertEquals(expected.getDoubleBed(), actual.getDoubleBed());
    }

    private static Comparator<Room> idComparator = new Comparator<Room>() {
        @Override
        public int compare(Room o1, Room o2) {
            return o1.getId().compareTo(o2.getId());
        }
    };
}