95 lines
3.2 KiB
Ruby
95 lines
3.2 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 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
|