require "test_helper" class SendMailingRecipientJobTest < ActiveJob::TestCase include ActionMailer::TestHelper test "sends pending recipients in sequence" do opportunities(:deal).update!(send_status: "to_send") mailing = create_mailing(audience: "to_send") mailing.rebuild_recipients! mailing.update!(status: "sending", queued_at: Time.current, test_sent_at: Time.current, test_sent_to: "test@example.com") perform_enqueued_jobs do SendMailingRecipientJob.perform_later(mailing.mailing_recipients.first.id) end assert_equal "sent", mailing.reload.status assert_equal "sent", mailing.mailing_recipients.first.status end test "does not send outside the working window and resumes next workday" do opportunities(:deal).update!(send_status: "to_send") mailing = create_mailing( audience: "to_send", send_window_enabled: true, send_window_start_minutes: 10 * 60, send_window_end_minutes: 18 * 60, interval_seconds: 120 ) mailing.rebuild_recipients! recipient = mailing.mailing_recipients.first mailing.update!(test_sent_at: Time.current, test_sent_to: "test@example.com") travel_to Time.zone.local(2026, 4, 3, 18, 30, 0) do mailing.update!(test_sent_at: Time.current, test_sent_to: "test@example.com") assert_no_emails do mailing.queue_send! end assert_equal "sending", mailing.reload.status assert_equal "pending", recipient.reload.status assert_equal Time.zone.local(2026, 4, 7, 10, 0, 0), mailing.next_send_at assert_enqueued_jobs 0, only: SendMailingRecipientJob end travel_to Time.zone.local(2026, 4, 7, 10, 0, 0) do perform_enqueued_jobs do ResumeMailingsJob.perform_now end assert_equal "sent", recipient.reload.status assert_equal "sent", mailing.reload.status end end end