require "test_helper" class MailingsAudienceQueryTest < ActiveSupport::TestCase setup do opportunities(:deal).update!(send_status: "to_send", ab_variant: "A") @project = projects(:matchlivetv) @acme = organizations(:acme) @volley = create_campaign_org( name: "Volley Rosa", email: "volley@example.com", ab_variant: "B", send_status: "to_send", list_position: 20, sport: "Pallavolo", region: "Lazio", team_gender: "female" ) @acme.update!(sport: "Calcio", region: "Lombardia", list_position: 1, team_gender: "male") end test "preset to_send keeps campaign pending orgs" do ids = query({ "preset" => "to_send" }).relation.pluck(:id) assert_includes ids, @acme.id assert_includes ids, @volley.id end test "filters by sport" do ids = query({ "preset" => "all", "sports" => ["Calcio"] }).relation.pluck(:id) assert_includes ids, @acme.id assert_not_includes ids, @volley.id end test "filters by country" do @volley.update!(country: "Francia") @acme.update!(country: "Italia") ids = query({ "preset" => "all", "countries" => ["Francia"] }).relation.pluck(:id) assert_includes ids, @volley.id assert_not_includes ids, @acme.id end test "filters by list position range" do ids = query({ "preset" => "all", "list_min" => 1, "list_max" => 5 }).relation.pluck(:id) assert_includes ids, @acme.id assert_not_includes ids, @volley.id end test "history never excludes orgs already mailed" do previous = create_mailing(audience: "all") previous.rebuild_recipients! previous.mailing_recipients.find_by!(organization: @acme).update!(status: "sent", sent_at: 1.day.ago) mailing = create_mailing(audience: "all") ids = query({ "preset" => "all", "history_kind" => "never" }, mailing: mailing).relation.pluck(:id) assert_not_includes ids, @acme.id assert_includes ids, @volley.id end test "never contacted checkbox maps to history never" do filters = Mailings::AudienceFilters.new("preset" => "all", "never_contacted" => "1") assert_equal "never", filters.history_kind end test "history never excludes orgs with email_sent activity" do Activity.create!( organization: @acme, activity_type: "email_sent", subject: "Lancio giĆ  inviato", happened_at: 1.day.ago ) ids = query({ "preset" => "all", "never_contacted" => "1" }).relation.pluck(:id) assert_not_includes ids, @acme.id assert_includes ids, @volley.id end test "exclude customers drops active customers" do @volley.update!(status: "active_customer") ids = query({ "preset" => "all", "exclude_customers" => true }).relation.pluck(:id) assert_includes ids, @acme.id assert_not_includes ids, @volley.id end test "recipient builder uses audience filters" do mailing = create_mailing(audience: "all", audience_filters: { "preset" => "all", "sports" => ["Pallavolo"] }) mailing.rebuild_recipients! assert_equal [@volley.id], mailing.mailing_recipients.map(&:organization_id) end private def query(filters = {}, mailing: nil) Mailings::AudienceQuery.new(@project, Mailings::AudienceFilters.new(filters), mailing: mailing) end end