diff --git a/example_app/app/models/invitation.rb b/example_app/app/models/invitation.rb index dcf0556..0d004ca 100644 --- a/example_app/app/models/invitation.rb +++ b/example_app/app/models/invitation.rb @@ -15,10 +15,8 @@ def to_param end def deliver - unless unsubscribed? - body = InvitationMessage.new(self).body - Mailer.invitation_notification(self, body).deliver - end + body = InvitationMessage.new(self).body + Mailer.invitation_notification(self, body).deliver end private @@ -26,8 +24,4 @@ def deliver def set_token self.token = SecureRandom.urlsafe_base64 end - - def unsubscribed? - Unsubscribe.where(email: recipient_email).exists? - end end diff --git a/example_app/app/models/survey_inviter.rb b/example_app/app/models/survey_inviter.rb index 186e9c9..d9d9cc7 100644 --- a/example_app/app/models/survey_inviter.rb +++ b/example_app/app/models/survey_inviter.rb @@ -31,7 +31,7 @@ def deliver_invitations def create_invitations Invitation.transaction do recipients.map do |recipient_email| - Invitation.create!( + UnsubscribeableInvitation.create!( survey: survey, sender: sender, recipient_email: recipient_email, diff --git a/example_app/app/models/unsubscribeable_invitation.rb b/example_app/app/models/unsubscribeable_invitation.rb new file mode 100644 index 0000000..b9f41bb --- /dev/null +++ b/example_app/app/models/unsubscribeable_invitation.rb @@ -0,0 +1,13 @@ +class UnsubscribeableInvitation < Invitation + def deliver + unless unsubscribed? + super + end + end + + private + + def unsubscribed? + Unsubscribe.where(email: recipient_email).exists? + end +end diff --git a/example_app/spec/models/invitation_spec.rb b/example_app/spec/models/invitation_spec.rb index c41af77..c06b014 100644 --- a/example_app/spec/models/invitation_spec.rb +++ b/example_app/spec/models/invitation_spec.rb @@ -26,22 +26,8 @@ message.should have_body_text(survey_url(invitation.survey)) end - it 'sends nothing to users that have unsubscribed' do - unsubscribe = create(:unsubscribe) - deliver_invitation(recipient_email: unsubscribe.email) - - find_email(unsubscribe.email).should be_nil - end - def deliver_invitation(overrides = {}) - attributes = { - message: 'hello', - survey: create(:survey) - }.merge(overrides) - - create(:invitation, attributes).tap do |invitation| - invitation.deliver - end + InvitationDeliverer.new(Invitation).deliver_invitation(overrides) end end diff --git a/example_app/spec/models/survey_inviter_spec.rb b/example_app/spec/models/survey_inviter_spec.rb index 12d6afc..b653339 100644 --- a/example_app/spec/models/survey_inviter_spec.rb +++ b/example_app/spec/models/survey_inviter_spec.rb @@ -23,7 +23,11 @@ it "doesn't send emails if any invitations fail to save" do invitation = stub('invitation', deliver: true) error = StandardError.new('failure') - Invitation.stubs(:create!).returns(invitation).then.raises(error) + UnsubscribeableInvitation. + stubs(:create!). + returns(invitation). + then. + raises(error) params = valid_params(recipients: 'one@example.com,two@example.com') inviter = SurveyInviter.new(params) diff --git a/example_app/spec/models/unsubscribeable_invitation_spec.rb b/example_app/spec/models/unsubscribeable_invitation_spec.rb new file mode 100644 index 0000000..04410f2 --- /dev/null +++ b/example_app/spec/models/unsubscribeable_invitation_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe UnsubscribeableInvitation, '#deliver' do + include Rails.application.routes.url_helpers + self.default_url_options = ActionMailer::Base.default_url_options + + it 'sends email notifications to new users' do + invitation = deliver_invitation + + find_email(invitation.recipient_email). + should have_body_text(invitation.message) + end + + it 'sends nothing to users that have unsubscribed' do + unsubscribe = create(:unsubscribe) + deliver_invitation(recipient_email: unsubscribe.email) + + find_email(unsubscribe.email).should be_nil + end + + def deliver_invitation(overrides = {}) + InvitationDeliverer.new(UnsubscribeableInvitation). + deliver_invitation(overrides) + end +end diff --git a/example_app/spec/support/invitation_deliverer.rb b/example_app/spec/support/invitation_deliverer.rb new file mode 100644 index 0000000..3d5072c --- /dev/null +++ b/example_app/spec/support/invitation_deliverer.rb @@ -0,0 +1,19 @@ +class InvitationDeliverer + include FactoryGirl::Syntax::Methods + + def initialize(factory) + @factory = factory + end + + def deliver_invitation(overrides = {}) + attributes = { + message: 'hello', + survey: create(:survey) + }.merge(overrides) + invitation_attributes = create(:invitation, attributes).attributes + + @factory.new(invitation_attributes).tap do |invitation| + invitation.deliver + end + end +end