145 lines
3.7 KiB
C++
145 lines
3.7 KiB
C++
|
|
#include "sqlite_database.h"
|
||
|
|
#include "sqlite_file_executor.h"
|
||
|
|
#include "gtest/gtest.h"
|
||
|
|
|
||
|
|
// WARNING: Foreign keys are off
|
||
|
|
|
||
|
|
const std::string TEST_DB = "test.db";
|
||
|
|
|
||
|
|
// Test fixture for SQLiteDatabase
|
||
|
|
class SQLiteDatabaseTriggerTest : public ::testing::Test {
|
||
|
|
protected:
|
||
|
|
SQLiteDatabase *db_;
|
||
|
|
|
||
|
|
void SetUp() override {
|
||
|
|
db_ = new SQLiteDatabase(TEST_DB);
|
||
|
|
SQLiteFileExecutor executor(TEST_DB);
|
||
|
|
executor.executeSQLFile("sql/cinema_db_drop_table.sql");
|
||
|
|
executor.executeSQLFile("sql/cinema_db_create_table.sql");
|
||
|
|
executor.executeSQLFile("sql/cinema_db_drop_trigger.sql");
|
||
|
|
executor.executeSQLFile("sql/cinema_db_create_trigger.sql");
|
||
|
|
|
||
|
|
// Not necessarily, since the default setting
|
||
|
|
std::string sql;
|
||
|
|
FileReaderInterface *reader = &executor;
|
||
|
|
reader->read("sql/cinema_db_foreign_key_off.sql", sql);
|
||
|
|
db_->executeNonQuery(sql);
|
||
|
|
}
|
||
|
|
|
||
|
|
void TearDown() override {
|
||
|
|
delete db_;
|
||
|
|
remove(TEST_DB.c_str());
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// INFO: ----- TICKET -----
|
||
|
|
|
||
|
|
// Test trigger check_seat_number
|
||
|
|
TEST_F(SQLiteDatabaseTriggerTest, CheckSeatNumber) {
|
||
|
|
db_->addHall({"Hall 1", 100});
|
||
|
|
db_->addSession({1, 1, "2025-01-01 12:00:00", 10});
|
||
|
|
|
||
|
|
NewTicket ticket;
|
||
|
|
ticket.session_id = 1;
|
||
|
|
ticket.sold_at = "2025-01-01 12:00:00";
|
||
|
|
|
||
|
|
ticket.seat_number = 101;
|
||
|
|
EXPECT_FALSE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.seat_number = 100;
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.seat_number = 1;
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test trigger check_session_not_started
|
||
|
|
TEST_F(SQLiteDatabaseTriggerTest, CheckSessionNotStarted) {
|
||
|
|
db_->addSession({1, 1, "2025-01-01 12:00:00", 10});
|
||
|
|
|
||
|
|
NewTicket ticket;
|
||
|
|
ticket.session_id = 1;
|
||
|
|
ticket.seat_number = 1;
|
||
|
|
|
||
|
|
ticket.sold_at = "2025-01-01 13:00:00";
|
||
|
|
EXPECT_FALSE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.sold_at = "2025-01-01 11:00:00";
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.seat_number = 2;
|
||
|
|
ticket.sold_at = "2025-01-01 12:00:00";
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test trigger prevent_late_ticket_purchase
|
||
|
|
TEST_F(SQLiteDatabaseTriggerTest, PreventLateTicketPurchase) {
|
||
|
|
db_->addHall({"Hall 1", 100});
|
||
|
|
db_->addSession({1, 1, "2025-01-01 12:00:00", 10});
|
||
|
|
|
||
|
|
NewTicket ticket;
|
||
|
|
ticket.session_id = 1;
|
||
|
|
ticket.seat_number = 1;
|
||
|
|
|
||
|
|
ticket.sold_at = "2025-01-01 13:00:00";
|
||
|
|
EXPECT_FALSE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.sold_at = "2025-01-01 12:00:00";
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
|
||
|
|
ticket.seat_number = 2;
|
||
|
|
ticket.sold_at = "2025-01-01 11:00:00";
|
||
|
|
EXPECT_TRUE(db_->addTicket(ticket));
|
||
|
|
}
|
||
|
|
|
||
|
|
// INFO: ----- REFUND -----
|
||
|
|
|
||
|
|
// Test trigger validate_refund_amount
|
||
|
|
TEST_F(SQLiteDatabaseTriggerTest, ValidateRefundAmount) {
|
||
|
|
db_->addHall({"Hall 1", 100});
|
||
|
|
db_->addSession({1, 1, "2025-01-01 12:00:00", 10});
|
||
|
|
|
||
|
|
// ID 1
|
||
|
|
db_->addTicket({1, 1, "2025-01-01 10:00:00"});
|
||
|
|
// ID 2
|
||
|
|
db_->addTicket({1, 2, "2025-01-01 10:00:00"});
|
||
|
|
|
||
|
|
NewRefund refund;
|
||
|
|
refund.ticket_id = 1;
|
||
|
|
refund.refund_at = "2025-01-01 11:00:00";
|
||
|
|
|
||
|
|
refund.refund_amount = 11;
|
||
|
|
EXPECT_FALSE(db_->addRefund(refund));
|
||
|
|
|
||
|
|
refund.refund_amount = 10;
|
||
|
|
EXPECT_TRUE(db_->addRefund(refund));
|
||
|
|
|
||
|
|
refund.ticket_id = 2;
|
||
|
|
refund.refund_amount = 9;
|
||
|
|
EXPECT_TRUE(db_->addRefund(refund));
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test trigger validate_refund_date
|
||
|
|
TEST_F(SQLiteDatabaseTriggerTest, ValidateRefundDate) {
|
||
|
|
db_->addHall({"Hall 1", 100});
|
||
|
|
db_->addSession({1, 1, "2025-01-01 12:00:00", 10});
|
||
|
|
|
||
|
|
// ID 1
|
||
|
|
db_->addTicket({1, 1, "2025-01-01 10:00:00"});
|
||
|
|
// ID 2
|
||
|
|
db_->addTicket({1, 2, "2025-01-01 10:00:00"});
|
||
|
|
|
||
|
|
NewRefund refund;
|
||
|
|
refund.ticket_id = 1;
|
||
|
|
refund.refund_amount = 10;
|
||
|
|
|
||
|
|
refund.refund_at = "2025-01-01 09:00:00";
|
||
|
|
EXPECT_FALSE(db_->addRefund(refund));
|
||
|
|
|
||
|
|
refund.refund_at = "2025-01-01 11:00:00";
|
||
|
|
EXPECT_TRUE(db_->addRefund(refund));
|
||
|
|
|
||
|
|
refund.refund_at = "2025-01-01 12:00:00";
|
||
|
|
EXPECT_FALSE(db_->addRefund(refund));
|
||
|
|
}
|