require "test_helper" class ExpiredOrdersCleanupJobTest < ActiveJob::TestCase def setup @user = User.create!( email: "test@example.com", password: "password123", password_confirmation: "password123" ) @event = Event.create!( name: "Test Event", slug: "test-event", description: "A valid description for the test event that is long enough", latitude: 48.8566, longitude: 2.3522, venue_name: "Test Venue", venue_address: "123 Test Street", user: @user, start_time: 1.week.from_now, end_time: 1.week.from_now + 3.hours, state: :published ) end test "should be queued on default queue" do assert_equal "default", ExpiredOrdersCleanupJob.queue_name end test "should perform job without errors when no orders exist" do # Clear all orders Order.destroy_all assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end end test "should handle expired draft orders" do # Create an expired draft order expired_order = Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 2500, expires_at: 1.hour.ago ) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end # Order should still exist (functional test) assert_not_nil Order.find(expired_order.id) end test "should handle multiple expired orders" do # Create multiple expired orders order1 = Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 2500, expires_at: 2.hours.ago ) order2 = Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 1500, expires_at: 1.hour.ago ) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end # Both orders should still exist (functional test) assert_not_nil Order.find(order1.id) assert_not_nil Order.find(order2.id) end test "should not affect non-expired orders" do # Create non-expired order active_order = Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 2500, expires_at: 1.hour.from_now ) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end # Order should remain unchanged assert_equal "draft", active_order.reload.status end test "should not affect paid orders" do # Create paid order paid_order = Order.create!( user: @user, event: @event, status: "paid", total_amount_cents: 2500, expires_at: 1.hour.ago # Even if expired, paid orders shouldn't be affected ) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end # Order should remain paid assert_equal "paid", paid_order.reload.status end test "should handle empty expired orders list" do # Create only non-expired orders Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 2500, expires_at: 1.hour.from_now ) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end end test "should handle orders with different statuses" do # Create orders with various statuses Order.create!(user: @user, event: @event, status: "paid", total_amount_cents: 2500, expires_at: 1.hour.ago) Order.create!(user: @user, event: @event, status: "completed", total_amount_cents: 2500, expires_at: 1.hour.ago) Order.create!(user: @user, event: @event, status: "expired", total_amount_cents: 2500, expires_at: 1.hour.ago) # Job should run without errors assert_nothing_raised do ExpiredOrdersCleanupJob.perform_now end end end