diff --git a/transaction-script/pom.xml b/transaction-script/pom.xml
index bf2811994..64e824ead 100644
--- a/transaction-script/pom.xml
+++ b/transaction-script/pom.xml
@@ -16,13 +16,45 @@
com.h2database
h2
-
com.h2database
h2
1.4.200
test
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.mockito
+ mockito-core
+
+
+ com.h2database
+ h2
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+
+
+
+ com.ashishtrivedi16.transactionscript.TransactionScriptApp
+
+
+
+
+
+
+
+
+
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/CustomException.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/CustomException.java
similarity index 94%
rename from transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/CustomException.java
rename to transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/CustomException.java
index 4f7e11d45..002ea79aa 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/CustomException.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/CustomException.java
@@ -1,43 +1,43 @@
-/*
- * The MIT License
- * Copyright © 2014-2019 Ilkka Seppälä
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-package com.ashishtrivedi16.transactionscript.db;
-
-/**
- * Custom exception.
- */
-public class CustomException extends Exception {
-
- private static final long serialVersionUID = 1L;
-
- public CustomException() {
- }
-
- public CustomException(String message) {
- super(message);
- }
-
- public CustomException(String message, Throwable cause) {
- super(message, cause);
- }
-}
+/*
+ * The MIT License
+ * Copyright © 2014-2019 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.ashishtrivedi16.transactionscript;
+
+/**
+ * Custom exception.
+ */
+public class CustomException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ public CustomException() {
+ }
+
+ public CustomException(String message) {
+ super(message);
+ }
+
+ public CustomException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/Hotel.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/Hotel.java
index c459c32d5..212a0df68 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/Hotel.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/Hotel.java
@@ -1,6 +1,5 @@
package com.ashishtrivedi16.transactionscript;
-import com.ashishtrivedi16.transactionscript.db.HotelDaoImpl;
import java.util.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,10 +24,10 @@ public class Hotel {
Optional room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
- LOGGER.info(roomNumber + " does not exist");
+ throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
- LOGGER.info("Room already booked!");
+ throw new Exception("Room already booked!");
} else {
Room updateRoomBooking = room.get();
updateRoomBooking.setBooked(true);
@@ -48,7 +47,7 @@ public class Hotel {
Optional room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
- LOGGER.info("Room number: " + roomNumber + " does not exist");
+ throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
Room updateRoomBooking = room.get();
@@ -59,7 +58,7 @@ public class Hotel {
LOGGER.info("Booking cancelled for room number: " + roomNumber);
LOGGER.info(refundAmount + " is refunded");
} else {
- LOGGER.info("No booking for the room exists");
+ throw new Exception("No booking for the room exists");
}
}
}
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDao.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDao.java
similarity index 76%
rename from transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDao.java
rename to transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDao.java
index ee2b6de7e..7efa3c9e6 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDao.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDao.java
@@ -1,6 +1,4 @@
-package com.ashishtrivedi16.transactionscript.db;
-
-import com.ashishtrivedi16.transactionscript.Room;
+package com.ashishtrivedi16.transactionscript;
import java.util.Optional;
import java.util.stream.Stream;
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDaoImpl.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDaoImpl.java
similarity index 97%
rename from transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDaoImpl.java
rename to transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDaoImpl.java
index 4124a4bcf..88e7984a6 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/HotelDaoImpl.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/HotelDaoImpl.java
@@ -1,6 +1,5 @@
-package com.ashishtrivedi16.transactionscript.db;
+package com.ashishtrivedi16.transactionscript;
-import com.ashishtrivedi16.transactionscript.Room;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@@ -116,7 +115,7 @@ public class HotelDaoImpl implements HotelDao {
@Override
public Boolean delete(Room room) throws Exception {
try (var connection = getConnection();
- var statement = connection.prepareStatement("DELETE FROM CUSTOMERS WHERE ID = ?")) {
+ var statement = connection.prepareStatement("DELETE FROM ROOMS WHERE ID = ?")) {
statement.setInt(1, room.getId());
return statement.executeUpdate() > 0;
} catch (SQLException ex) {
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/RoomSchemaSql.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/RoomSchemaSql.java
similarity index 96%
rename from transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/RoomSchemaSql.java
rename to transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/RoomSchemaSql.java
index 3ac8fed06..bb2e2374b 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/db/RoomSchemaSql.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/RoomSchemaSql.java
@@ -21,7 +21,7 @@
* THE SOFTWARE.
*/
-package com.ashishtrivedi16.transactionscript.db;
+package com.ashishtrivedi16.transactionscript;
/**
* Customer Schema SQL Class.
diff --git a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/TransactionScriptApp.java b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/TransactionScriptApp.java
index c04306a18..dfd980b46 100644
--- a/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/TransactionScriptApp.java
+++ b/transaction-script/src/main/java/com/ashishtrivedi16/transactionscript/TransactionScriptApp.java
@@ -1,8 +1,5 @@
package com.ashishtrivedi16.transactionscript;
-import com.ashishtrivedi16.transactionscript.db.CustomException;
-import com.ashishtrivedi16.transactionscript.db.HotelDaoImpl;
-import com.ashishtrivedi16.transactionscript.db.RoomSchemaSql;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
@@ -15,7 +12,6 @@ public class TransactionScriptApp {
private static final String H2_DB_URL = "jdbc:h2:~/test";
private static final Logger LOGGER = LoggerFactory.getLogger(TransactionScriptApp.class);
- private static final String ALL_ROOMS = "customerDao.getAllRooms(): ";
/**
* Program entry point.
diff --git a/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/AppTest.java b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/AppTest.java
new file mode 100644
index 000000000..a4c22739d
--- /dev/null
+++ b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/AppTest.java
@@ -0,0 +1,36 @@
+/*
+ * The MIT License
+ * Copyright © 2014-2019 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.ashishtrivedi16.transactionscript;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests that Transaction script example runs without errors.
+ */
+public class AppTest {
+ @Test
+ public void test() throws Exception {
+ TransactionScriptApp.main(new String[]{});
+ }
+}
diff --git a/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelDaoImplTest.java b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelDaoImplTest.java
new file mode 100644
index 000000000..01c588075
--- /dev/null
+++ b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelDaoImplTest.java
@@ -0,0 +1,272 @@
+/*
+ * The MIT License
+ * Copyright © 2014-2019 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.ashishtrivedi16.transactionscript;
+
+import org.h2.jdbcx.JdbcDataSource;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import static org.mockito.Mockito.*;
+
+/**
+ * Tests {@link HotelDaoImpl}.
+ */
+public class HotelDaoImplTest {
+
+ private static final String DB_URL = "jdbc:h2:~/test";
+ private HotelDaoImpl dao;
+ private Room existingRoom = new Room(1, "Single", 50, false);
+
+ /**
+ * Creates rooms schema.
+ *
+ * @throws SQLException if there is any error while creating schema.
+ */
+ @BeforeEach
+ public void createSchema() throws SQLException {
+ try (var connection = DriverManager.getConnection(DB_URL);
+ var statement = connection.createStatement()) {
+ statement.execute(RoomSchemaSql.CREATE_SCHEMA_SQL);
+ }
+ }
+
+ /**
+ * Represents the scenario where DB connectivity is present.
+ */
+ @Nested
+ public class ConnectionSuccess {
+
+ /**
+ * Setup for connection success scenario.
+ *
+ * @throws Exception if any error occurs.
+ */
+ @BeforeEach
+ public void setUp() throws Exception {
+ var dataSource = new JdbcDataSource();
+ dataSource.setURL(DB_URL);
+ dao = new HotelDaoImpl(dataSource);
+ var result = dao.add(existingRoom);
+ assertTrue(result);
+ }
+
+ /**
+ * Represents the scenario when DAO operations are being performed on a non existing room.
+ */
+ @Nested
+ public class NonExistingRoom {
+
+ @Test
+ public void addingShouldResultInSuccess() throws Exception {
+ try (var allRooms = dao.getAll()) {
+ assumeTrue(allRooms.count() == 1);
+ }
+
+ final var nonExistingRoom = new Room(2, "Double", 80, false);
+ var result = dao.add(nonExistingRoom);
+ assertTrue(result);
+
+ assertRoomCountIs(2);
+ assertEquals(nonExistingRoom, dao.getById(nonExistingRoom.getId()).get());
+ }
+
+ @Test
+ public void deletionShouldBeFailureAndNotAffectExistingRooms() throws Exception {
+ final var nonExistingRoom = new Room(2, "Double", 80, false);
+ var result = dao.delete(nonExistingRoom);
+
+ assertFalse(result);
+ assertRoomCountIs(1);
+ }
+
+ @Test
+ public void updationShouldBeFailureAndNotAffectExistingRooms() throws Exception {
+ final var nonExistingId = getNonExistingRoomId();
+ final var newRoomType = "Double";
+ final var newPrice = 80;
+ final var room = new Room(nonExistingId, newRoomType, newPrice, false);
+ var result = dao.update(room);
+
+ assertFalse(result);
+ assertFalse(dao.getById(nonExistingId).isPresent());
+ }
+
+ @Test
+ public void retrieveShouldReturnNoRoom() throws Exception {
+ assertFalse(dao.getById(getNonExistingRoomId()).isPresent());
+ }
+ }
+
+ /**
+ * Represents a scenario where DAO operations are being performed on an already existing
+ * room.
+ */
+ @Nested
+ public class ExistingRoom {
+
+ @Test
+ public void addingShouldResultInFailureAndNotAffectExistingRooms() throws Exception {
+ var existingRoom = new Room(1, "Single", 50, false);
+ var result = dao.add(existingRoom);
+
+ assertFalse(result);
+ assertRoomCountIs(1);
+ assertEquals(existingRoom, dao.getById(existingRoom.getId()).get());
+ }
+
+ @Test
+ public void deletionShouldBeSuccessAndRoomShouldBeNonAccessible() throws Exception {
+ var result = dao.delete(existingRoom);
+
+ assertTrue(result);
+ assertRoomCountIs(0);
+ assertFalse(dao.getById(existingRoom.getId()).isPresent());
+ }
+
+ @Test
+ public void updationShouldBeSuccessAndAccessingTheSameRoomShouldReturnUpdatedInformation() throws
+ Exception {
+ final var newRoomType = "Double";
+ final var newPrice = 80;
+ final var newBookingStatus = false;
+ final var Room = new Room(existingRoom.getId(), newRoomType, newPrice, newBookingStatus);
+ var result = dao.update(Room);
+
+ assertTrue(result);
+
+ final var room = dao.getById(existingRoom.getId()).get();
+ assertEquals(newRoomType, room.getRoomType());
+ assertEquals(newPrice, room.getPrice());
+ assertEquals(newBookingStatus, room.isBooked());
+ }
+ }
+ }
+
+ /**
+ * Represents a scenario where DB connectivity is not present due to network issue, or DB service
+ * unavailable.
+ */
+ @Nested
+ public class ConnectivityIssue {
+
+ private static final String EXCEPTION_CAUSE = "Connection not available";
+
+ /**
+ * setup a connection failure scenario.
+ *
+ * @throws SQLException if any error occurs.
+ */
+ @BeforeEach
+ public void setUp() throws SQLException {
+ dao = new HotelDaoImpl(mockedDatasource());
+ }
+
+ private DataSource mockedDatasource() throws SQLException {
+ var mockedDataSource = mock(DataSource.class);
+ var mockedConnection = mock(Connection.class);
+ var exception = new SQLException(EXCEPTION_CAUSE);
+ doThrow(exception).when(mockedConnection).prepareStatement(Mockito.anyString());
+ doReturn(mockedConnection).when(mockedDataSource).getConnection();
+ return mockedDataSource;
+ }
+
+ @Test
+ public void addingARoomFailsWithExceptionAsFeedbackToClient() {
+ assertThrows(Exception.class, () -> {
+ dao.add(new Room(2, "Double", 80, false));
+ });
+ }
+
+ @Test
+ public void deletingARoomFailsWithExceptionAsFeedbackToTheClient() {
+ assertThrows(Exception.class, () -> {
+ dao.delete(existingRoom);
+ });
+ }
+
+ @Test
+ public void updatingARoomFailsWithFeedbackToTheClient() {
+ final var newRoomType = "Double";
+ final var newPrice = 80;
+ final var newBookingStatus = false;
+ assertThrows(Exception.class, () -> {
+ dao.update(new Room(existingRoom.getId(), newRoomType, newPrice, newBookingStatus));
+ });
+ }
+
+ @Test
+ public void retrievingARoomByIdFailsWithExceptionAsFeedbackToClient() {
+ assertThrows(Exception.class, () -> {
+ dao.getById(existingRoom.getId());
+ });
+ }
+
+ @Test
+ public void retrievingAllRoomsFailsWithExceptionAsFeedbackToClient() {
+ assertThrows(Exception.class, () -> {
+ dao.getAll();
+ });
+ }
+
+ }
+
+ /**
+ * Delete room schema for fresh setup per test.
+ *
+ * @throws SQLException if any error occurs.
+ */
+ @AfterEach
+ public void deleteSchema() throws SQLException {
+ try (var connection = DriverManager.getConnection(DB_URL);
+ var statement = connection.createStatement()) {
+ statement.execute(RoomSchemaSql.DELETE_SCHEMA_SQL);
+ }
+ }
+
+ private void assertRoomCountIs(int count) throws Exception {
+ try (var allRooms = dao.getAll()) {
+ assertEquals(count, allRooms.count());
+ }
+ }
+
+
+ /**
+ * An arbitrary number which does not correspond to an active Room id.
+ *
+ * @return an int of a room id which doesn't exist
+ */
+ private int getNonExistingRoomId() {
+ return 999;
+ }
+}
diff --git a/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelTest.java b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelTest.java
new file mode 100644
index 000000000..6c16b2df5
--- /dev/null
+++ b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/HotelTest.java
@@ -0,0 +1,123 @@
+package com.ashishtrivedi16.transactionscript;
+
+import org.h2.jdbc.JdbcSQLException;
+import org.h2.jdbcx.JdbcDataSource;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assumptions.assumeTrue;
+import static org.mockito.Mockito.*;
+
+/**
+ * Tests {@link Hotel}
+ */
+public class HotelTest {
+
+ private static final String H2_DB_URL = "jdbc:h2:~/test";
+
+ private Hotel hotel;
+ private HotelDaoImpl dao;
+
+ @BeforeEach
+ public void setUp() throws Exception {
+ final var dataSource = createDataSource();
+ deleteSchema(dataSource);
+ createSchema(dataSource);
+ dao = new HotelDaoImpl(dataSource);
+ addRooms(dao);
+ hotel = new Hotel(dao);
+
+ }
+
+ @Test
+ public void bookingRoomShouldChangeBookedStatusToTrue() throws Exception {
+ hotel.bookRoom(1);
+ assertTrue(dao.getById(1).get().isBooked());
+ }
+
+ @Test()
+ public void bookingRoomWithInvalidIdShouldRaiseException() {
+ assertThrows(Exception.class, () -> {
+ hotel.bookRoom(999);
+ });
+ }
+
+ @Test()
+ public void bookingRoomAgainShouldRaiseException() {
+ assertThrows(Exception.class, () -> {
+ hotel.bookRoom(1);
+ hotel.bookRoom(1);
+ });
+ }
+
+ @Test
+ public void NotBookingRoomShouldNotChangeBookedStatus() throws Exception {
+ assertFalse(dao.getById(1).get().isBooked());
+ }
+
+ @Test
+ public void cancelRoomBookingShouldChangeBookedStatus() throws Exception {
+ hotel.bookRoom(1);
+ assertTrue(dao.getById(1).get().isBooked());
+ hotel.cancelRoomBooking(1);
+ assertFalse(dao.getById(1).get().isBooked());
+ }
+
+ @Test
+ public void cancelRoomBookingWithInvalidIdShouldRaiseException() {
+ assertThrows(Exception.class, () -> {
+ hotel.cancelRoomBooking(999);
+ });
+ }
+
+ @Test
+ public void cancelRoomBookingForUnbookedRoomShouldRaiseException() {
+ assertThrows(Exception.class, () -> {
+ hotel.cancelRoomBooking(1);
+ });
+ }
+
+
+ private static void deleteSchema(DataSource dataSource) throws SQLException {
+ try (var connection = dataSource.getConnection();
+ var statement = connection.createStatement()) {
+ statement.execute(RoomSchemaSql.DELETE_SCHEMA_SQL);
+ }
+ }
+
+ private static void createSchema(DataSource dataSource) throws Exception {
+ try (var connection = dataSource.getConnection();
+ var statement = connection.createStatement()) {
+ statement.execute(RoomSchemaSql.CREATE_SCHEMA_SQL);
+ } catch (JdbcSQLException e) {
+ throw new CustomException(e.getMessage(), e);
+ }
+ }
+
+ public static DataSource createDataSource() {
+ JdbcDataSource dataSource = new JdbcDataSource();
+ dataSource.setUrl(H2_DB_URL);
+ return dataSource;
+ }
+
+ private static void addRooms(HotelDaoImpl hotelDao) throws Exception {
+ for (var room : generateSampleRooms()) {
+ hotelDao.add(room);
+ }
+ }
+
+ public static List generateSampleRooms() {
+ final var room1 = new Room(1, "Single", 50, false);
+ final var room2 = new Room(2, "Double", 80, false);
+ final var room3 = new Room(3, "Queen", 120, false);
+ final var room4 = new Room(4, "King", 150, false);
+ final var room5 = new Room(5, "Single", 50, false);
+ final var room6 = new Room(6, "Double", 80, false);
+ return List.of(room1, room2, room3, room4, room5, room6);
+ }
+}
diff --git a/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/RoomTest.java b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/RoomTest.java
new file mode 100644
index 000000000..9ea8756bd
--- /dev/null
+++ b/transaction-script/src/test/java/com/ashishtrivedi16/transactionscript/RoomTest.java
@@ -0,0 +1,95 @@
+/*
+ * The MIT License
+ * Copyright © 2014-2019 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package com.ashishtrivedi16.transactionscript;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
+/**
+ * Tests {@link Room}.
+ */
+public class RoomTest {
+
+ private Room room;
+ private static final int ID = 1;
+ private static final String ROOMTYPE = "Single";
+ private static final int PRICE = 50;
+ private static final boolean BOOKED = false;
+
+ @BeforeEach
+ public void setUp() {
+ room = new Room(ID, ROOMTYPE, PRICE, BOOKED);
+ }
+
+ @Test
+ public void getAndSetId() {
+ final var newId = 2;
+ room.setId(newId);
+ assertEquals(newId, room.getId());
+ }
+
+ @Test
+ public void getAndSetRoomType() {
+ final var newRoomType = "Double";
+ room.setRoomType(newRoomType);
+ assertEquals(newRoomType, room.getRoomType());
+ }
+
+ @Test
+ public void getAndSetLastName() {
+ final var newPrice = 60;
+ room.setPrice(newPrice);
+ assertEquals(newPrice, room.getPrice());
+ }
+
+ @Test
+ public void notEqualWithDifferentId() {
+ final var newId = 2;
+ final var otherRoom = new Room(newId, ROOMTYPE, PRICE, BOOKED);
+ assertNotEquals(room, otherRoom);
+ assertNotEquals(room.hashCode(), otherRoom.hashCode());
+ }
+
+ @Test
+ public void equalsWithSameObjectValues() {
+ final var otherRoom = new Room(ID, ROOMTYPE, PRICE, BOOKED);
+ assertEquals(room, otherRoom);
+ assertEquals(room.hashCode(), otherRoom.hashCode());
+ }
+
+ @Test
+ public void equalsWithSameObjects() {
+ assertEquals(room, room);
+ assertEquals(room.hashCode(), room.hashCode());
+ }
+
+ @Test
+ public void testToString() {
+ assertEquals(String.format("Room{id=%s, roomType=%s, price=%s, booked=%s}",
+ room.getId(), room.getRoomType(), room.getPrice(), room.isBooked()), room.toString());
+ }
+}