#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)); }