From 7758e2abdf52114ca01120e81780ec0628a39c95 Mon Sep 17 00:00:00 2001 From: Jon Conley Date: Fri, 24 Mar 2017 09:41:15 -0600 Subject: [PATCH] Issue 95: Interactor for Volunteers#knight --- app/controllers/volunteers_controller.rb | 4 ++-- app/interactors/knight.rb | 12 ++++++++++++ spec/interactors/knight_spec.rb | 25 ++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 app/interactors/knight.rb create mode 100644 spec/interactors/knight_spec.rb diff --git a/app/controllers/volunteers_controller.rb b/app/controllers/volunteers_controller.rb index 714b62dc..fa0a4b67 100755 --- a/app/controllers/volunteers_controller.rb +++ b/app/controllers/volunteers_controller.rb @@ -222,8 +222,8 @@ def knight end volunteer = Volunteer.find(params[:volunteer_id]) - volunteer.admin = !volunteer.admin - if volunteer.save + + if Knight.call(volunteer: volunteer).success? flash[:notice] = "#{volunteer.name} Updated to Admin: #{volunteer.admin}" else flash[:error] = "#{volunteer.errors.full_messages}" diff --git a/app/interactors/knight.rb b/app/interactors/knight.rb new file mode 100644 index 00000000..dfa10eaf --- /dev/null +++ b/app/interactors/knight.rb @@ -0,0 +1,12 @@ +class Knight + include Interactor + + delegate :subject, + :fail!, + to: :context + + def call + subject.admin = !subject.admin + fail! unless subject.save + end +end diff --git a/spec/interactors/knight_spec.rb b/spec/interactors/knight_spec.rb new file mode 100644 index 00000000..a8e84965 --- /dev/null +++ b/spec/interactors/knight_spec.rb @@ -0,0 +1,25 @@ +require 'rails_helper' + +RSpec.describe Knight do + describe '::call' do + let(:volunteer) do + create(:volunteer, admin: false) + end + + subject do + described_class.call( + subject: volunteer + ) + end + + it 'sets the admin flad' do + expect(subject.success?).to eq(true) + expect(volunteer.reload.admin).to eq(true) + end + + it 'fails if it cannot save the volunteer' do + expect(volunteer).to receive(:save).and_return false + expect(subject.success?).to eq(false) + end + end +end