Merge decorators with original classes brought from spree and merge order_mailer specs

This commit is contained in:
Luis Ramos
2020-07-14 13:38:11 +01:00
parent c6cd695b3c
commit d12495f3db
6 changed files with 182 additions and 208 deletions

View File

@@ -1,5 +1,11 @@
module Spree
class BaseMailer < ActionMailer::Base
# Inline stylesheets
include Roadie::Rails::Automatic
# Define layout
layout 'mailer'
def from_address
Spree::Config[:mails_from]
end
@@ -8,5 +14,12 @@ module Spree
Spree::Money.new(amount).to_s
end
helper_method :money
protected
def roadie_options
# This lets us specify assets using relative paths in email templates
super.merge(url_options: { host: URI(main_app.root_url).host })
end
end
end

View File

@@ -1,14 +0,0 @@
Spree::BaseMailer.class_eval do
# Inline stylesheets
include Roadie::Rails::Automatic
# Define layout
layout 'mailer'
protected
def roadie_options
# This lets us specify assets using relative paths in email templates
super.merge(url_options: { host: URI(main_app.root_url).host })
end
end

View File

@@ -1,17 +1,66 @@
module Spree
class OrderMailer < BaseMailer
def confirm_email(order, resend = false)
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
subject += "#{Spree::Config[:site_name]} #{Spree.t('order_mailer.confirm_email.subject')} ##{@order.number}"
mail(to: @order.email, from: from_address, subject: subject)
helper HtmlHelper
helper CheckoutHelper
helper SpreeCurrencyHelper
helper OrderHelper
include I18nHelper
def cancel_email(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
mail(to: @order.email,
from: from_address,
subject: mail_subject(t('spree.order_mailer.cancel_email.subject'), resend))
end
end
def cancel_email(order, resend = false)
@order = order.respond_to?(:id) ? order : Spree::Order.find(order)
subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
subject += "#{Spree::Config[:site_name]} #{Spree.t('order_mailer.cancel_email.subject')} ##{@order.number}"
mail(to: @order.email, from: from_address, subject: subject)
def confirm_email_for_customer(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
mail(to: @order.email,
from: from_address,
subject: subject,
reply_to: @order.distributor.contact.email)
end
end
def confirm_email_for_shop(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
mail(to: @order.distributor.contact.email,
from: from_address,
subject: subject)
end
end
def invoice_email(order_or_order_id, pdf)
@order = find_order(order_or_order_id)
attach_file("invoice-#{@order.number}.pdf", pdf)
I18n.with_locale valid_locale(@order.user) do
mail(to: @order.email,
from: from_address,
subject: mail_subject(t(:invoice), false),
reply_to: @order.distributor.contact.email)
end
end
private
# Finds an order instance from an order or from an order id
def find_order(order_or_order_id)
order_or_order_id.respond_to?(:id) ? order_or_order_id : Spree::Order.find(order_or_order_id)
end
def mail_subject(base_subject, resend)
resend_prefix = (resend ? "[#{t(:resend).upcase}] " : '')
"#{resend_prefix}#{Spree::Config[:site_name]} #{base_subject} ##{@order.number}"
end
def attach_file(filename, file)
attachments[filename] = file if file.present?
end
end
end

View File

@@ -1,64 +0,0 @@
Spree::OrderMailer.class_eval do
helper HtmlHelper
helper CheckoutHelper
helper SpreeCurrencyHelper
helper OrderHelper
include I18nHelper
def cancel_email(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
mail(to: @order.email,
from: from_address,
subject: mail_subject(t('spree.order_mailer.cancel_email.subject'), resend))
end
end
def confirm_email_for_customer(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
mail(to: @order.email,
from: from_address,
subject: subject,
reply_to: @order.distributor.contact.email)
end
end
def confirm_email_for_shop(order_or_order_id, resend = false)
@order = find_order(order_or_order_id)
I18n.with_locale valid_locale(@order.user) do
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
mail(to: @order.distributor.contact.email,
from: from_address,
subject: subject)
end
end
def invoice_email(order_or_order_id, pdf)
@order = find_order(order_or_order_id)
attach_file("invoice-#{@order.number}.pdf", pdf)
I18n.with_locale valid_locale(@order.user) do
mail(to: @order.email,
from: from_address,
subject: mail_subject(t(:invoice), false),
reply_to: @order.distributor.contact.email)
end
end
private
# Finds an order instance from an order or from an order id
def find_order(order_or_order_id)
order_or_order_id.respond_to?(:id) ? order_or_order_id : Spree::Order.find(order_or_order_id)
end
def mail_subject(base_subject, resend)
resend_prefix = (resend ? "[#{t(:resend).upcase}] " : '')
"#{resend_prefix}#{Spree::Config[:site_name]} #{base_subject} ##{@order.number}"
end
def attach_file(filename, file)
attachments[filename] = file if file.present?
end
end

View File

@@ -1,120 +0,0 @@
require 'spec_helper'
require 'email_spec'
describe Spree::OrderMailer do
include EmailSpec::Helpers
include EmailSpec::Matchers
let(:order) do
order = stub_model(Spree::Order)
product = stub_model(Spree::Product, :name => %Q{The "BEST" product})
variant = stub_model(Spree::Variant, :product => product)
price = stub_model(Spree::Price, :variant => variant, :amount => 5.00)
line_item = stub_model(Spree::LineItem, :variant => variant, :order => order, :quantity => 1, :price => 4.99)
variant.stub(:default_price => price)
order.stub(:line_items => [line_item])
order
end
context ":from not set explicitly" do
it "falls back to spree config" do
message = Spree::OrderMailer.confirm_email(order)
message.from.should == [Spree::Config[:mails_from]]
end
end
it "doesn't aggressively escape double quotes in confirmation body" do
confirmation_email = Spree::OrderMailer.confirm_email(order)
confirmation_email.body.should_not include("&quot;")
end
it "confirm_email accepts an order id as an alternative to an Order object" do
Spree::Order.should_receive(:find).with(order.id).and_return(order)
lambda {
confirmation_email = Spree::OrderMailer.confirm_email(order.id)
}.should_not raise_error
end
it "cancel_email accepts an order id as an alternative to an Order object" do
Spree::Order.should_receive(:find).with(order.id).and_return(order)
lambda {
cancel_email = Spree::OrderMailer.cancel_email(order.id)
}.should_not raise_error
end
context "only shows eligible adjustments in emails" do
before do
order.adjustments.create(
:label => "Eligible Adjustment",
:amount => 10,
:eligible => true
)
order.adjustments.create!(
:label => "Ineligible Adjustment",
:amount => -10,
:eligible => false
)
end
let!(:confirmation_email) { Spree::OrderMailer.confirm_email(order) }
let!(:cancel_email) { Spree::OrderMailer.cancel_email(order) }
specify do
confirmation_email.body.should_not include("Ineligible Adjustment")
end
specify do
cancel_email.body.should_not include("Ineligible Adjustment")
end
end
context "displays unit costs from line item" do
# Regression test for #2772
# Tests mailer view spree/order_mailer/confirm_email.text.erb
specify do
confirmation_email = Spree::OrderMailer.confirm_email(order)
confirmation_email.body.should include("4.99")
confirmation_email.body.should_not include("5.00")
end
# Tests mailer view spree/order_mailer/cancel_email.text.erb
specify do
cancel_email = Spree::OrderMailer.cancel_email(order)
cancel_email.body.should include("4.99")
cancel_email.body.should_not include("5.00")
end
end
context "emails must be translatable" do
context "pt-BR locale" do
before do
pt_br_confirm_mail = { :spree => { :order_mailer => { :confirm_email => { :dear_customer => 'Caro Cliente,' } } } }
pt_br_cancel_mail = { :spree => { :order_mailer => { :cancel_email => { :order_summary_canceled => 'Resumo da Pedido [CANCELADA]' } } } }
I18n.backend.store_translations :'pt-BR', pt_br_confirm_mail
I18n.backend.store_translations :'pt-BR', pt_br_cancel_mail
I18n.locale = :'pt-BR'
end
after do
I18n.locale = I18n.default_locale
end
context "confirm_email" do
specify do
confirmation_email = Spree::OrderMailer.confirm_email(order)
confirmation_email.body.should include("Caro Cliente,")
end
end
context "cancel_email" do
specify do
cancel_email = Spree::OrderMailer.cancel_email(order)
cancel_email.body.should include("Resumo da Pedido [CANCELADA]")
end
end
end
end
end

View File

@@ -3,6 +3,116 @@ require 'spec_helper'
describe Spree::OrderMailer do
include OpenFoodNetwork::EmailHelper
contect "original spree specs" do
let(:order) do
order = stub_model(Spree::Order)
product = stub_model(Spree::Product, :name => %Q{The "BEST" product})
variant = stub_model(Spree::Variant, :product => product)
price = stub_model(Spree::Price, :variant => variant, :amount => 5.00)
line_item = stub_model(Spree::LineItem, :variant => variant, :order => order, :quantity => 1, :price => 4.99)
variant.stub(:default_price => price)
order.stub(:line_items => [line_item])
order
end
context ":from not set explicitly" do
it "falls back to spree config" do
message = Spree::OrderMailer.confirm_email_for_customer(order)
message.from.should == [Spree::Config[:mails_from]]
end
end
it "doesn't aggressively escape double quotes in confirmation body" do
confirmation_email = Spree::OrderMailer.confirm_email_for_customer(order)
confirmation_email.body.should_not include("&quot;")
end
it "confirm_email_for_customer accepts an order id as an alternative to an Order object" do
Spree::Order.should_receive(:find).with(order.id).and_return(order)
lambda {
confirmation_email = Spree::OrderMailer.confirm_email_for_customer(order.id)
}.should_not raise_error
end
it "cancel_email accepts an order id as an alternative to an Order object" do
Spree::Order.should_receive(:find).with(order.id).and_return(order)
lambda {
cancel_email = Spree::OrderMailer.cancel_email(order.id)
}.should_not raise_error
end
context "only shows eligible adjustments in emails" do
before do
order.adjustments.create(
:label => "Eligible Adjustment",
:amount => 10,
:eligible => true
)
order.adjustments.create!(
:label => "Ineligible Adjustment",
:amount => -10,
:eligible => false
)
end
let!(:confirmation_email) { Spree::OrderMailer.confirm_email(order) }
let!(:cancel_email) { Spree::OrderMailer.cancel_email(order) }
specify do
confirmation_email.body.should_not include("Ineligible Adjustment")
end
specify do
cancel_email.body.should_not include("Ineligible Adjustment")
end
end
context "displays unit costs from line item" do
specify do
confirmation_email = Spree::OrderMailer.confirm_email_for_customer(order)
confirmation_email.body.should include("4.99")
confirmation_email.body.should_not include("5.00")
end
specify do
cancel_email = Spree::OrderMailer.cancel_email(order)
cancel_email.body.should include("4.99")
cancel_email.body.should_not include("5.00")
end
end
context "emails must be translatable" do
context "pt-BR locale" do
before do
pt_br_confirm_mail = { :spree => { :order_mailer => { :confirm_email => { :dear_customer => 'Caro Cliente,' } } } }
pt_br_cancel_mail = { :spree => { :order_mailer => { :cancel_email => { :order_summary_canceled => 'Resumo da Pedido [CANCELADA]' } } } }
I18n.backend.store_translations :'pt-BR', pt_br_confirm_mail
I18n.backend.store_translations :'pt-BR', pt_br_cancel_mail
I18n.locale = :'pt-BR'
end
after do
I18n.locale = I18n.default_locale
end
context "confirm_email" do
specify do
confirmation_email = Spree::OrderMailer.confirm_email_for_customer(order)
confirmation_email.body.should include("Caro Cliente,")
end
end
context "cancel_email" do
specify do
cancel_email = Spree::OrderMailer.cancel_email(order)
cancel_email.body.should include("Resumo da Pedido [CANCELADA]")
end
end
end
end
end
describe "order confimation" do
let(:bill_address) { create(:address) }
let(:distributor_address) { create(:address, address1: "distributor address", city: 'The Shire', zipcode: "1234") }