Skip to content

Commit

Permalink
Sends invoice to email
Browse files Browse the repository at this point in the history
  • Loading branch information
shivamsinghchahar committed Apr 15, 2022
1 parent 2c5710d commit e274f55
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 0 deletions.
13 changes: 13 additions & 0 deletions app/mailers/invoice_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class InvoiceMailer < ApplicationMailer
after_action -> { @invoice.sent! }

def invoice
@invoice = params[:invoice]
recipients = params[:recipients]
subject = params[:subject]

mail(to: recipients, subject:)
end
end
9 changes: 9 additions & 0 deletions app/models/concerns/invoice_sendable.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# frozen_string_literal: true

module InvoiceSendable
extend ActiveSupport::Concern

def send_to_email(subject:, recipients:)
InvoiceMailer.with(invoice: self, subject:, recipients:).invoice.deliver_later
end
end
2 changes: 2 additions & 0 deletions app/models/invoice.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
# frozen_string_literal: true

class Invoice < ApplicationRecord
include InvoiceSendable

attr_accessor :sub_total

enum status: [
Expand Down
19 changes: 19 additions & 0 deletions app/views/invoice_mailer/invoice.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Invoice: <%= @invoice.invoice_number %></h1>

<p>
Hi <%= @invoice.client_name %>, You have an invoice with amount <%= @invoice.amount %>.
</p>

<p>
The due date is <%= @invoice.due_date %>.
</p>

<p>Thanks!</p>
</body>
</html>
8 changes: 8 additions & 0 deletions app/views/invoice_mailer/invoice.text.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Hi, <%= @invoice.client_name %>
===============================================

You have an invoice - <%= @invoice.invoice_number %> with amount <%= @invoice.amount %>
due date is: <%= @invoice.due_date %>.

Thanks!
Miru
2 changes: 2 additions & 0 deletions config/environments/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test

config.active_job.queue_adapter = :test

# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr

Expand Down
22 changes: 22 additions & 0 deletions spec/mailers/invoice_mailer_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true

require "rails_helper"

RSpec.describe InvoiceMailer, type: :mailer do
describe "invoice" do
let(:invoice) { create :invoice }
let(:recipients) { [invoice.client.email, "miru@example.com"] }
let(:subject) { "Invoice (#{invoice.invoice_number}) due on #{invoice.due_date}" }
let(:mail) { InvoiceMailer.with(invoice:, subject:, recipients:).invoice }

it "renders the headers" do
expect(mail.subject).to eq(subject)
expect(mail.to).to eq(recipients)
expect(mail.from).to eq(["from@example.com"])
end

it "renders the body" do
expect(mail.body.encoded).to match("You have an invoice")
end
end
end
13 changes: 13 additions & 0 deletions spec/mailers/previews/invoice_preview.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

# Preview all emails at http://localhost:3000/rails/mailers/invoice

class InvoicePreview < ActionMailer::Preview
def invoice
invoice = Invoice.first
recipients = [invoice.client.email, "miru@example.com"]
subject = "Invoice (#{invoice.invoice_number}) due on #{invoice.due_date}"

InvoiceMailer.with(invoice:, recipients:, subject:).invoice
end
end
10 changes: 10 additions & 0 deletions spec/models/invoice_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,14 @@
describe ".delegate" do
it { is_expected.to delegate_method(:name).to(:client).with_prefix(:client) }
end

describe ".send_to_email" do
let(:invoice) { create :invoice }
let(:recipients) { [invoice.client.email, "miru@example.com"] }
let(:subject) { "Invoice (#{invoice.invoice_number}) due on #{invoice.due_date}" }

it "sends the invoice on email" do
expect { invoice.send_to_email(subject:, recipients:) }.to have_enqueued_mail(InvoiceMailer, :invoice)
end
end
end
22 changes: 22 additions & 0 deletions spec/support/patch.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# frozen_string_literal: true

# This patches rspec-rails to support rails 7.0 https://github.com/rspec/rspec-rails/issues/2531
module RSpec
module Rails
module Matchers
class HaveEnqueuedMail
def legacy_mail?(job)
defined?(ActionMailer::DeliveryJob) && job[:job] <= ActionMailer::DeliveryJob
end

def parameterized_mail?(job)
RSpec::Rails::FeatureCheck.has_action_mailer_parameterized? && job[:job] <= ActionMailer::MailDeliveryJob
end

def unified_mail?(job)
RSpec::Rails::FeatureCheck.has_action_mailer_unified_delivery? && job[:job] <= ActionMailer::MailDeliveryJob
end
end
end
end
end

0 comments on commit e274f55

Please sign in to comment.