require "rails_helper"
describe TestMailer do
before do
allow(TestMailer).to receive(:delivery_method).and_return(:sendgrid)
allow_any_instance_of(SendGridMailer::Deliverer).to receive(:api_key).and_return("XXX")
end
def expect_valid_mail_sent(request_body)
result = double(status_code: "202")
client2 = double(post: result)
client1 = double(_: client2)
expect_any_instance_of(SendGrid::Client).to receive(:_).with(:mail).and_return(client1)
expect(client2).to receive(:post).with(request_body: request_body).and_return(result)
deliver
end
context "setting body" do
let(:deliver) { described_class.body_email.deliver_now! }
it "sends mail with valid body" do
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Body email"
}
],
"content" => [
{
"type" => "text/plain",
"value" => "Body"
}
]
}
expect_valid_mail_sent(request_body)
end
end
context "setting body from params" do
let(:deliver) { described_class.body_params_email.deliver_now! }
it "sends mail with valid body" do
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Body params email"
}
],
"content" => [
{
"type" => "text/html",
"value" => "
Body Params
"
}
]
}
expect_valid_mail_sent(request_body)
end
end
context "setting body from rails template" do
let(:deliver) { described_class.rails_tpl_email.deliver_now! }
it "sends mail with valid body" do
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Rails tpl email"
}
],
"content" => [
{
"type" => "text/html",
"value" => "\n \n Rails Template!\n\n \n\n"
}
]
}
expect_valid_mail_sent(request_body)
end
end
context "overriding default from" do
let(:request_body) do
{
"from" =>
{
"email" => "override@platan.us"
},
"personalizations" => [
{
"subject" => subject
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
]
}
end
context "using params" do
let(:deliver) { described_class.from_params_email.deliver_now! }
let(:subject) { "From params email" }
it "sends mail with valid sender" do
expect_valid_mail_sent(request_body)
end
end
context "using methods" do
let(:deliver) { described_class.from_email.deliver_now! }
let(:subject) { "From email" }
it "sends mail with valid sender" do
expect_valid_mail_sent(request_body)
end
end
end
context "setting recipients" do
let(:request_body) do
{
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"to" => [
{
"email" => "r1@platan.us"
},
{
"email" => "r2@platan.us"
}
],
"cc" => [
{
"email" => "r4@platan.us"
}
],
"bcc" => [
{
"email" => "r5@platan.us"
}
],
"subject" => subject
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
]
}
end
context "using params" do
let(:deliver) { described_class.recipients_params_email.deliver_now! }
let(:subject) { "Recipients params email" }
it "sends mail with valid recipients" do
expect_valid_mail_sent(request_body)
end
end
context "using methods" do
let(:deliver) { described_class.recipients_email.deliver_now! }
let(:subject) { "Recipients email" }
it "sends mail with valid recipients" do
expect_valid_mail_sent(request_body)
end
end
end
context "setting template id" do
let(:request_body) do
{
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => subject
}
],
"template_id" => "XXX"
}
end
context "using params" do
let(:deliver) { described_class.template_id_params_email.deliver_now! }
let(:subject) { "Template id params email" }
it "sends mail with valid template" do
expect_valid_mail_sent(request_body)
end
end
context "using methods" do
let(:deliver) { described_class.template_id_email.deliver_now! }
let(:subject) { "Template id email" }
it "sends mail with valid template id" do
expect_valid_mail_sent(request_body)
end
end
end
context "setting subject" do
let(:request_body) do
{
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "My Subject"
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
]
}
end
context "using params" do
let(:deliver) { described_class.subject_params_email.deliver_now! }
it "sends mail with valid subject" do
expect_valid_mail_sent(request_body)
end
end
context "using methods" do
let(:deliver) { described_class.subject_email.deliver_now! }
it "sends mail with valid subject" do
expect_valid_mail_sent(request_body)
end
end
end
context "setting headers" do
let(:request_body) do
{
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => subject,
"headers" =>
{
"HEADER-1" => "VALUE-1",
"HEADER-2" => "VALUE-2"
}
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
]
}
end
context "using params" do
let(:deliver) { described_class.headers_params_email.deliver_now! }
let(:subject) { "Headers params email" }
it "sends mail with valid headers" do
expect_valid_mail_sent(request_body)
end
end
context "using methods" do
let(:deliver) { described_class.headers_email.deliver_now! }
let(:subject) { "Headers email" }
it "sends mail with valid headers" do
expect_valid_mail_sent(request_body)
end
end
end
context "adding attachments" do
let(:deliver) { described_class.add_attachments_email.deliver_now! }
it "sends mail with valid body" do
expect_any_instance_of(SendGrid::Attachment).to receive(:content).and_return("X")
expect_any_instance_of(SendGrid::Attachment).to receive(:content_id).and_return("A")
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Add attachments email"
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
],
"attachments" => [
{
"content" => "X",
"type" => "image/png",
"filename" => "nana.png",
"disposition" => "attachment",
"content_id" => "A"
}
]
}
expect_valid_mail_sent(request_body)
end
end
context "adding substitutions" do
let(:deliver) { described_class.substitutions_email.deliver_now! }
it "sends mail with valid body" do
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Substitutions email",
"substitutions" =>
{
"%key1%" => "value1",
"%key2%" => "value2"
}
}
],
"content" => [
{
"type" => "text/plain",
"value" => "X"
}
]
}
expect_valid_mail_sent(request_body)
end
end
def get_templates(status_code, response = nil)
result = double(status_code: status_code, body: response)
client = double(get: result)
expect_any_instance_of(SendGrid::Client).to receive(:_).with(:templates).and_return(client)
end
context "setting template name" do
let(:deliver) { described_class.template_name_email.deliver_now! }
it "sends mail with valid template id" do
response = { templates: [{ id: "123", name: "my template name" }] }.to_json
get_templates("200", response)
request_body = {
"from" =>
{
"email" => "default-sender@platan.us"
},
"personalizations" => [
{
"subject" => "Template name email"
}
],
"template_id" => "123"
}
expect_valid_mail_sent(request_body)
end
it "raises error when templates endpoint is down" do
get_templates("500")
expect { deliver }.to raise_error(SendGridMailer::Exception,
"Error trying to get templates. Status Code: 500")
end
it "raises error when template name does not match with server response" do
response = { templates: [{ id: "123", name: "other template" }] }.to_json
get_templates("200", response)
expect { deliver }.to raise_error(SendGridMailer::Exception,
"No template with name my template name")
end
end
end