diff --git a/app/mailers/spree/base_mailer.rb b/app/mailers/spree/base_mailer.rb index 7d35ecdd43..5d6e616b1f 100644 --- a/app/mailers/spree/base_mailer.rb +++ b/app/mailers/spree/base_mailer.rb @@ -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 diff --git a/app/mailers/spree/base_mailer_decorator.rb b/app/mailers/spree/base_mailer_decorator.rb deleted file mode 100644 index 4c15268676..0000000000 --- a/app/mailers/spree/base_mailer_decorator.rb +++ /dev/null @@ -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 diff --git a/app/mailers/spree/order_mailer.rb b/app/mailers/spree/order_mailer.rb index 1af6b31cb4..cb90f25b68 100644 --- a/app/mailers/spree/order_mailer.rb +++ b/app/mailers/spree/order_mailer.rb @@ -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 diff --git a/app/mailers/spree/order_mailer_decorator.rb b/app/mailers/spree/order_mailer_decorator.rb deleted file mode 100644 index fbf17013b8..0000000000 --- a/app/mailers/spree/order_mailer_decorator.rb +++ /dev/null @@ -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 diff --git a/spec/mailers/order_mailer_from_spree_spec.rb b/spec/mailers/order_mailer_from_spree_spec.rb deleted file mode 100644 index 399c097fd4..0000000000 --- a/spec/mailers/order_mailer_from_spree_spec.rb +++ /dev/null @@ -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(""") - 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 diff --git a/spec/mailers/order_mailer_spec.rb b/spec/mailers/order_mailer_spec.rb index deb5230f81..3af2b50339 100644 --- a/spec/mailers/order_mailer_spec.rb +++ b/spec/mailers/order_mailer_spec.rb @@ -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(""") + 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") }