Files
eminuxCRM/test/services/mailings_audience_query_test.rb
T
eminuxandCursor 1f946f63ba
CI / scan_ruby (push) Failing after 18m40s
CI / scan_js (push) Successful in 11m46s
CI / lint (push) Failing after 13m8s
Aggiunge filtri avanzati per i destinatari delle campagne email.
La scelta della lista passa da un wizard a tre passi, con anteprima del conteggio e lista congelata solo dopo la conferma.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-24 21:00:11 +02:00

69 lines
2.3 KiB
Ruby

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 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 "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