diff --git a/spec/controllers/exercises_controller_spec.rb b/spec/controllers/exercises_controller_spec.rb index f80f843b..763f3103 100644 --- a/spec/controllers/exercises_controller_spec.rb +++ b/spec/controllers/exercises_controller_spec.rb @@ -7,20 +7,35 @@ describe ExercisesController do describe 'POST #clone' do let(:request) { proc { post :clone, id: exercise.id } } - before(:each) { request.call } - expect_assigns(exercise: Exercise) + context 'when saving succeeds' do + before(:each) { request.call } - it 'clones the exercise' do - expect_any_instance_of(Exercise).to receive(:duplicate).with(hash_including(public: false, user: user)).and_call_original - expect { request.call }.to change(Exercise, :count).by(1) + expect_assigns(exercise: Exercise) + + it 'clones the exercise' do + expect_any_instance_of(Exercise).to receive(:duplicate).with(hash_including(public: false, user: user)).and_call_original + expect { request.call }.to change(Exercise, :count).by(1) + end + + it 'generates a new token' do + expect(Exercise.last.token).not_to eq(exercise.token) + end + + expect_redirect end - it 'generates a new token' do - expect(Exercise.last.token).not_to eq(exercise.token) - end + context 'when saving fails' do + before(:each) do + expect_any_instance_of(Exercise).to receive(:save).and_return(false) + request.call + end - expect_redirect + expect_assigns(exercise: Exercise) + + expect_flash_message(:danger) + expect_redirect(:exercise) + end end describe 'POST #create' do diff --git a/spec/support/controllers.rb b/spec/support/controllers.rb index 6081ab2e..75444fea 100644 --- a/spec/support/controllers.rb +++ b/spec/support/controllers.rb @@ -21,9 +21,13 @@ def expect_content_type(content_type) end end -def expect_flash_message(type, message) +def expect_flash_message(type, message = nil) it 'displays a flash message' do - expect(flash[type]).to eq(message.is_a?(String) ? message : I18n.t(message)) + if message + expect(flash[type]).to eq(message.is_a?(String) ? message : I18n.t(message)) + else + expect(flash[type]).to be_present + end end end