Skip to content
This repository was archived by the owner on Jul 24, 2020. It is now read-only.

[1309] Refactor User Mailer Spec #1602

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
252 changes: 78 additions & 174 deletions spec/mailers/user_mailer_spec.rb
Original file line number Diff line number Diff line change
@@ -1,208 +1,112 @@
require 'spec_helper'
include EnvHelpers

shared_examples_for 'valid user email' do
it 'sends to the reserver' do
expect(@mail.to.size).to eq(1)
expect(@mail.to.first).to eq(reserver.email)
end
it 'sends an email' do
expect(ActionMailer::Base.deliveries.count).to eq(1)
end
# FIXME: Workaround for #398 disables this functionality for RSpec testing
# it "is from the admin" do
# expect(@mail.from.size).to eq(1)
# expect(@mail.from.first).to eq(AppConfig.first.admin_email)
# end
end

shared_examples_for 'contains reservation' do
it 'has reservation link' do
# body contains link to the reservation
expect(@mail.body).to \
include("<a href=\"http://0.0.0.0:3000/reservations/#{@res.id}\"")
describe UserMailer, type: :mailer do
include EnvHelpers
def send_email(res_type, override: '', **attrs)
unless AppConfig.first
mock_app_config(admin_email: '[email protected]',
disable_user_emails: false)
end
res = FactoryGirl.build_stubbed(res_type, **attrs)
UserMailer.reservation_status_update(res, override)
end
end

describe UserMailer, type: :mailer do
before(:each) do
@ac = mock_app_config(admin_email: '[email protected]',
disable_user_emails: false)
def configure_mailer
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
ActionMailer::Base.deliveries = []
@res = FactoryGirl.create(:valid_reservation,
reserver: reserver,
start_date: Time.zone.today + 1)
end
let!(:reserver) { FactoryGirl.create(:user) }

describe 'reservation_status_update' do
it 'sends to the reserver' do
# force a request email; there is not an email for a basic reservation
@mail = UserMailer.reservation_status_update(@res,
'requested').deliver_now
expect(@mail.to.size).to eq(1)
expect(@mail.to.first).to eq(reserver.email)
shared_examples 'email' do |subject, type, override: '', **attrs|
it 'sends the appropriate email' do
mail = send_email(type, override: override, **attrs)
expect(mail.subject).to include(subject)
end

it 'sends an email' do
# force a request email; there is not an email for a basic reservation
@mail = UserMailer.reservation_status_update(@res,
'requested').deliver_now
expect(ActionMailer::Base.deliveries.count).to eq(1)
mock_app_config(admin_email: '[email protected]',
disable_user_emails: false)
configure_mailer
reserver = FactoryGirl.build_stubbed(:user)
res = FactoryGirl.build_stubbed(type, reserver: reserver, **attrs)
expect { UserMailer.reservation_status_update(res, override).deliver_now }
.to change { ActionMailer::Base.deliveries.count }.by(1)
end
end

describe 'reservation_status_update' do
it 'sends to the reserver' do
user = FactoryGirl.build_stubbed(:user)
allow(User).to receive(:find).with(user.id).and_return(user)
mail = send_email(:valid_reservation, override: 'requested',
reserver: user)
expect(mail.to.size).to eq(1)
expect(mail.to.first).to eq(user.email)
end
it 'logs if the env is set' do
env_wrapper('LOG_EMAILS' => '1') do
configure_mailer
expect(Rails.logger).to receive(:info).with(/Sent/).once
# force a request email; there is not an email for a basic reservation
@mail = UserMailer.reservation_status_update(@res,
'requested').deliver_now
send_email(:valid_reservation, override: 'requested').deliver_now
end
end

it "doesn't log if the env is not set" do
expect(ENV['LOG_EMAILS']).to be_nil
configure_mailer
expect(Rails.logger).to receive(:info).with(/Sent/).exactly(0).times
# force a request email; there is not an email for a basic reservation
@mail = UserMailer.reservation_status_update(@res,
'requested').deliver_now
end

it 'sends denied notifications' do
@res.update_attributes(status: 'denied')
expect(@res.denied?).to be_truthy
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Denied")
end

it 'sends approved request notifications' do
@res.update_attributes(status: 'reserved',
flags: Reservation::FLAGS[:request])
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Request Approved")
end

it 'sends approved request notifications for requests starting today' do
@res.update_attributes(status: 'reserved',
flags: Reservation::FLAGS[:request],
start_date: Time.zone.today,
due_date: Time.zone.today + 1)
@mail =
UserMailer.reservation_status_update(@res,
'request approved').deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Request Approved")
send_email(:valid_reservation, override: 'requested').deliver_now
end

it 'sends expired request notifications' do
@res.update_attributes(status: 'denied',
flags: (Reservation::FLAGS[:request] |
Reservation::FLAGS[:expired]))
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Request Expired")
end

it 'sends reminders to check-out' do
@res.update_attributes(FactoryGirl.attributes_for(:upcoming_reservation))
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Starts Today")
end

it 'sends missed notifications' do
@res.update_attributes(FactoryGirl.attributes_for(:missed_reservation))
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Missed")
end

it 'sends check-out receipts' do
@res.update_attributes(
FactoryGirl.attributes_for(:checked_out_reservation)
)
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Checked Out")
end

it "doesn't sends check-out receipts if not checked out" do
@res.update_attributes(FactoryGirl.attributes_for(:valid_reservation))
expect(@res.checked_out).to be_nil
@mail =
UserMailer.reservation_status_update(@res, 'checked out').deliver_now
expect(@mail).to be_nil
end

it 'sends check-out receipts for reservations due today' do
@res.update_attributes(
FactoryGirl.attributes_for(:checked_out_reservation,
due_date: Time.zone.today)
)
@mail =
UserMailer.reservation_status_update(@res, 'checked out').deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Checked Out")
end

it 'sends check-out receipts for overdue reservations' do
@res.update_attributes(FactoryGirl.attributes_for(:overdue_reservation))
@mail =
UserMailer.reservation_status_update(@res, 'checked out').deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Checked Out")
end

it 'sends reminders to check-in' do
@res.update_attributes(
FactoryGirl.attributes_for(:checked_out_reservation,
due_date: Time.zone.today)
)
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Due Today")
end

it 'sends check-in receipts' do
@res.update_attributes(
FactoryGirl.attributes_for(:checked_in_reservation)
)
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Returned")
end

it 'sends overdue equipment reminders' do
@res.update_attributes(FactoryGirl.attributes_for(:overdue_reservation))
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Overdue")
end

it 'sends fine emails for overdue equipment' do
@res.update_attributes(FactoryGirl.attributes_for(:checked_in_reservation,
:overdue))
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail.subject).to \
eq("[Reservations] #{@res.equipment_model.name} Returned Overdue")
it "doesn't send check-out receipts if not checked out" do
configure_mailer
mail = send_email(:valid_reservation, override: 'checked out').deliver_now
expect(mail).to be_nil
end

it "doesn't send fine emails when there is no late fee" do
@res.update_attributes(FactoryGirl.attributes_for(:checked_in_reservation,
:overdue))
@res.equipment_model.update_attributes(late_fee: 0)
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail).to be_nil
configure_mailer
mock_app_config(admin_email: '[email protected]',
disable_user_emails: false)
res = FactoryGirl.build_stubbed(:overdue_returned_reservation)
allow(res.equipment_model).to receive(:late_fee).and_return(0)
mail = UserMailer.reservation_status_update(res).deliver_now
expect(mail).to be_nil
end

it "doesn't send at all if disable_user_emails is set" do
allow(@ac).to receive(:disable_user_emails).and_return(true)
@mail = UserMailer.reservation_status_update(@res).deliver_now
expect(@mail).to be_nil
end
configure_mailer
mock_app_config(admin_email: '[email protected]', disable_user_emails: true)
mail = send_email(:valid_reservation).deliver_now
expect(mail).to be_nil
end

it_behaves_like 'email', 'Denied', :request, status: 'denied'
it_behaves_like 'email', 'Missed', :missed_reservation
it_behaves_like 'email', 'Checked Out', :checked_out_reservation
it_behaves_like 'email', 'Overdue', :overdue_reservation
it_behaves_like 'email', 'Returned', :checked_in_reservation
it_behaves_like 'email', 'Returned Overdue', :overdue_returned_reservation

it_behaves_like 'email', 'Request Approved', :valid_reservation,
start_date: Time.zone.today + 1.day,
due_date: Time.zone.today + 2.days,
flags: Reservation::FLAGS[:request]
it_behaves_like 'email', 'Request Approved', :valid_reservation,
override: 'request approved',
flags: Reservation::FLAGS[:request]
it_behaves_like 'email', 'Request Expired', :request,
status: 'denied', flags: (Reservation::FLAGS[:request] |
Reservation::FLAGS[:expired])

it_behaves_like 'email', 'Starts Today', :upcoming_reservation
it_behaves_like 'email', 'Due Today', :checked_out_reservation,
due_date: Time.zone.today

it_behaves_like 'email', 'Checked Out', :checked_out_reservation,
override: 'checked out', due_date: Time.zone.today
it_behaves_like 'email', 'Checked Out', :overdue_reservation,
override: 'checked out'
end
end