require "test_helper" class EmailNotificationsIntegrationTest < ActionDispatch::IntegrationTest include ActiveJob::TestHelper def setup @user = User.create!( email: "test@example.com", password: "password123", first_name: "Test", last_name: "User" ) @event = Event.create!( name: "Test Event", slug: "test-event", description: "A test event for integration testing", state: :published, venue_name: "Test Venue", venue_address: "123 Test Street", latitude: 40.7128, longitude: -74.0060, start_time: 1.week.from_now, end_time: 1.week.from_now + 4.hours, user: @user ) @ticket_type = TicketType.create!( name: "General Admission", description: "General admission ticket", price_cents: 2500, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: 1.day.from_now, event: @event ) @order = Order.create!( user: @user, event: @event, status: "draft", total_amount_cents: 2500, payment_attempts: 0 ) @ticket = Ticket.create!( order: @order, ticket_type: @ticket_type, first_name: "Test", last_name: "User", price_cents: 2500, status: "draft" ) end test "sends purchase confirmation email when order is marked as paid" do # Mock PDF generation to avoid QR code issues @ticket.stubs(:to_pdf).returns("fake_pdf_content") assert_emails 1 do @order.mark_as_paid! end assert_equal "paid", @order.status assert_equal "active", @ticket.reload.status end test "event reminder email can be sent to users with active tickets" do # Setup: mark order as paid and activate tickets @ticket.stubs(:to_pdf).returns("fake_pdf_content") @order.mark_as_paid! # Clear any emails from the setup ActionMailer::Base.deliveries.clear assert_emails 1 do TicketMailer.event_reminder(@user, @event, 7).deliver_now end email = ActionMailer::Base.deliveries.last assert_equal [ @user.email ], email.to assert_equal "Rappel : #{@event.name} dans une semaine", email.subject end test "event reminder job schedules emails for users with tickets" do # Setup: mark order as paid and activate tickets @ticket.stubs(:to_pdf).returns("fake_pdf_content") @order.mark_as_paid! # Clear any emails from the setup ActionMailer::Base.deliveries.clear # Perform the job EventReminderJob.perform_now(@event.id, 7) assert_equal 1, ActionMailer::Base.deliveries.size email = ActionMailer::Base.deliveries.last assert_equal [ @user.email ], email.to assert_match "une semaine", email.subject end end