Aggiunge filtri avanzati per i destinatari delle campagne email.
CI / scan_ruby (push) Failing after 18m40s
CI / scan_js (push) Successful in 11m46s
CI / lint (push) Failing after 13m8s

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>
This commit is contained in:
2026-08-24 21:00:11 +02:00
co-authored by Cursor
parent 2db7504629
commit 1f946f63ba
19 changed files with 912 additions and 46 deletions
+57 -4
View File
@@ -16,11 +16,11 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
assert_match(/Invii email/, response.body)
end
test "creates a draft and builds recipients" do
test "creates a draft and opens audience filters" do
login_as users(:admin)
follow_redirect! if response.redirect?
assert_difference -> { Mailing.count } => 1, -> { MailingRecipient.count } => 1 do
assert_difference -> { Mailing.count } => 1, -> { MailingRecipient.count } => 0 do
post mailings_path(project_code: @project.code), params: {
mailing: {
name: "Lancio",
@@ -33,10 +33,59 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
}
end
mailing = Mailing.last
assert_redirected_to audience_mailing_path(mailing, project_code: @project.code)
assert mailing.mailing_recipients.none?
end
test "audience apply builds frozen recipient list" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "to_send")
patch audience_mailing_path(mailing, project_code: @project.code), params: {
intent: "apply",
filters: { preset: "to_send" }
}
assert_redirected_to mailing_path(mailing, project_code: @project.code)
assert mailing.reload.mailing_recipients.any?
assert_equal "pending", mailing.mailing_recipients.first.status
end
test "audience page shows live filter counts" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "to_send")
get audience_mailing_path(mailing, project_code: @project.code)
assert_response :success
assert_match(/Destinatari/, response.body)
assert_match(/Corrispondenze/, response.body)
assert_match(/Genera lista e rivedi/, response.body)
assert_match(/Chi deve ricevere questa email/, response.body)
assert_select "details[data-section=organization]"
assert_select "details[data-section=campaign]"
assert_select "details[data-section=history]"
assert_select "details[data-section=exclusions]"
end
test "audience preview saves filters without building recipients" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "to_send")
patch audience_mailing_path(mailing, project_code: @project.code), params: {
intent: "preview",
filters: { preset: "all", sports: [ "Calcio" ] }
}
assert_response :success
assert_match(/Destinatari/, response.body)
assert mailing.reload.mailing_recipients.none?
assert_equal "all", mailing.audience
assert_equal [ "Calcio" ], mailing.parsed_audience_filters["sports"]
end
test "check recipients then queue send" do
login_as users(:admin)
follow_redirect! if response.redirect?
@@ -125,7 +174,11 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
}
mailing = Mailing.last
assert mailing.ab_test?
assert_equal "A", mailing.mailing_recipients.first.ab_variant
patch audience_mailing_path(mailing, project_code: @project.code), params: {
intent: "apply",
filters: { preset: "to_send" }
}
assert_equal "A", mailing.reload.mailing_recipients.first.ab_variant
assert_emails 1 do
post test_send_mailing_path(mailing, project_code: @project.code), params: {
@@ -184,7 +237,7 @@ class MailingsControllerTest < ActionDispatch::IntegrationTest
}
}
mailing = Mailing.last
assert_redirected_to mailing_path(mailing, project_code: @project.code)
assert_redirected_to audience_mailing_path(mailing, project_code: @project.code)
assert_equal "B {{societa}}", mailing.subject_b
assert_includes mailing.body_html_b, "Versione B dal template"
end