Files
eminuxCRM/test/controllers/mailings_controller_test.rb
T
eminuxandCursor 98dcdbbf82
CI / lint (push) Failing after 16m2s
CI / scan_ruby (push) Has been cancelled
CI / scan_js (push) Has been cancelled
Aggiunge fascia oraria, prova manuale obbligatoria e cruscotto invii email.
Le campagne rispettano orario e giorni lavorativi, richiedono una mail di test con dati inseriti a mano prima dell'invio massivo e offrono una dashboard per monitorare l'avanzamento.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-18 00:04:33 +02:00

188 lines
6.5 KiB
Ruby

require "test_helper"
class MailingsControllerTest < ActionDispatch::IntegrationTest
setup do
@project = projects(:matchlivetv)
@identity = create_mail_identity
opportunities(:deal).update!(send_status: "to_send", pipeline_stage: "to_contact")
end
test "lists mailings in project space" do
login_as users(:admin)
follow_redirect! if response.redirect?
get dashboard_mailings_path(project_code: @project.code)
assert_response :success
assert_match(/Invii email/, response.body)
end
test "creates a draft and builds recipients" do
login_as users(:admin)
follow_redirect! if response.redirect?
assert_difference -> { Mailing.count } => 1, -> { MailingRecipient.count } => 1 do
post mailings_path(project_code: @project.code), params: {
mailing: {
name: "Lancio",
mail_identity_id: @identity.id,
audience: "to_send",
subject: "Ciao {{societa}}",
body_html: "<p>Ciao {{contatto_nome}}</p>",
interval_seconds: 0
}
}
end
mailing = Mailing.last
assert_redirected_to mailing_path(mailing, project_code: @project.code)
assert_equal "pending", mailing.mailing_recipients.first.status
end
test "check recipients then queue send" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "to_send")
mailing.rebuild_recipients!
recipient = mailing.mailing_recipients.first
patch update_recipients_mailing_path(mailing, project_code: @project.code), params: { pending_ids: [recipient.id] }
assert_redirected_to mailing_path(mailing, project_code: @project.code)
assert_equal "pending", recipient.reload.status
post test_send_mailing_path(mailing, project_code: @project.code), params: {
to: users(:admin).email,
vars: { societa: "ASD Test Calcio", contatto_nome: "Mario" }
}
assert mailing.reload.tested?
perform_enqueued_jobs do
post queue_mailing_path(mailing, project_code: @project.code)
end
assert_redirected_to dashboard_mailings_path(project_code: @project.code)
assert_equal "sent", mailing.reload.status
assert_equal "sent", recipient.reload.status
assert_equal "sent", opportunities(:deal).reload.send_status
assert_equal "contacted", opportunities(:deal).pipeline_stage
assert_equal 2, ActionMailer::Base.deliveries.size
assert_equal "Ciao ASD Test Calcio", ActionMailer::Base.deliveries.last.subject
end
test "queue send requires test email first" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "to_send")
mailing.rebuild_recipients!
recipient = mailing.mailing_recipients.first
patch update_recipients_mailing_path(mailing, project_code: @project.code), params: { pending_ids: [recipient.id] }
post queue_mailing_path(mailing, project_code: @project.code)
assert_redirected_to mailing_path(mailing, project_code: @project.code)
assert_equal "draft", mailing.reload.status
assert_not mailing.tested?
end
test "test send goes to current user" do
login_as users(:admin)
follow_redirect! if response.redirect?
mailing = create_mailing(identity: @identity, audience: "all")
mailing.rebuild_recipients!
assert_emails 1 do
post test_send_mailing_path(mailing, project_code: @project.code), params: {
to: users(:admin).email,
vars: { societa: "Società Prova", contatto_nome: "Anna Test" }
}
end
mail = ActionMailer::Base.deliveries.last
assert_equal [users(:admin).email], mail.to
assert_match(/\[TEST\]/, mail.subject)
assert_match(/Società Prova/, mail.subject)
assert mailing.reload.tested?
assert_equal users(:admin).email, mailing.test_sent_to
end
test "creates an A/B mailing and sends variant B as test" do
login_as users(:admin)
follow_redirect! if response.redirect?
post mailings_path(project_code: @project.code), params: {
mailing: {
name: "AB lancio",
mail_identity_id: @identity.id,
audience: "to_send",
ab_test: "1",
ab_assignment: "from_record",
subject: "Oggetto A {{societa}}",
body_html: "<p>Versione A</p>",
subject_b: "Oggetto B {{societa}}",
body_html_b: "<p>Versione B</p>",
interval_seconds: 0
}
}
mailing = Mailing.last
assert mailing.ab_test?
assert_equal "A", mailing.mailing_recipients.first.ab_variant
assert_emails 1 do
post test_send_mailing_path(mailing, project_code: @project.code), params: {
to: users(:admin).email,
variant: "B",
vars: { societa: "ASD Test Calcio" }
}
end
mail = ActionMailer::Base.deliveries.last
assert_match(/\[TEST B\] Oggetto B ASD Test Calcio/, mail.subject)
body = (mail.html_part || mail).body.to_s
assert_match(/Versione B/, body)
end
test "new mailing form embeds template content for the picker" do
login_as users(:admin)
follow_redirect! if response.redirect?
template = MailTemplate.create!(
project: @project,
name: "Variante B picker",
subject: "Oggetto dal template B",
body_html: "<p>Corpo dal template B</p>"
)
get new_mailing_path(project_code: @project.code)
assert_response :success
assert_match(/template-picker/, response.body)
assert_match(/Oggetto dal template B/, response.body)
assert_match(/Corpo dal template B/, response.body)
assert_includes response.body, template.id.to_s
end
test "create copies blank variant B fields from selected template" do
login_as users(:admin)
follow_redirect! if response.redirect?
template_b = MailTemplate.create!(
project: @project,
name: "Template B server",
subject: "B {{societa}}",
body_html: "<p>Versione B dal template</p>"
)
post mailings_path(project_code: @project.code), params: {
mailing: {
name: "AB da template",
mail_identity_id: @identity.id,
mail_template_b_id: template_b.id,
audience: "to_send",
ab_test: "1",
ab_assignment: "from_record",
subject: "Oggetto A",
body_html: "<p>Versione A</p>",
subject_b: "",
body_html_b: "",
interval_seconds: 0
}
}
mailing = Mailing.last
assert_redirected_to 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
end