From 8b04b477211d247e34cb5acf2ebe78b733307582 Mon Sep 17 00:00:00 2001 From: Hauke Klement Date: Sat, 21 Feb 2015 11:11:04 +0100 Subject: [PATCH] added tests --- app/models/exercise.rb | 2 +- spec/controllers/exercises_controller_spec.rb | 18 ++++++++++++++ spec/models/exercise_spec.rb | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/models/exercise.rb b/app/models/exercise.rb index f3461f9d..7fa73bd7 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -27,7 +27,7 @@ class Exercise < ActiveRecord::Base ActiveRecord::Base.connection.execute("SELECT AVG(score) AS average_score FROM (SELECT MAX(score) AS score FROM submissions WHERE cause = 'submit' AND exercise_id = '#{id}' GROUP BY user_id) AS maximum_scores")[0]['average_score'].to_f.round(2) end - def duplicate(attributes) + def duplicate(attributes = {}) exercise = dup exercise.attributes = attributes files.each { |file| exercise.files << file.dup } diff --git a/spec/controllers/exercises_controller_spec.rb b/spec/controllers/exercises_controller_spec.rb index d78287c2..f80f843b 100644 --- a/spec/controllers/exercises_controller_spec.rb +++ b/spec/controllers/exercises_controller_spec.rb @@ -5,6 +5,24 @@ describe ExercisesController do let(:user) { FactoryGirl.create(:admin) } before(:each) { allow(controller).to receive(:current_user).and_return(user) } + describe 'POST #clone' do + let(:request) { proc { post :clone, id: exercise.id } } + before(:each) { request.call } + + 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 + describe 'POST #create' do let(:exercise_attributes) { FactoryGirl.build(:dummy).attributes } diff --git a/spec/models/exercise_spec.rb b/spec/models/exercise_spec.rb index aa63dc7e..d58643ff 100644 --- a/spec/models/exercise_spec.rb +++ b/spec/models/exercise_spec.rb @@ -27,4 +27,28 @@ describe Exercise do expect(exercise.errors[:user_id]).to be_present expect(exercise.errors[:user_type]).to be_present end + + describe '#duplicate' do + let(:exercise) { FactoryGirl.create(:fibonacci) } + after(:each) { exercise.duplicate } + + it 'duplicates the exercise' do + expect(exercise).to receive(:dup).and_call_original + end + + it 'overwrites the supplied attributes' do + title = Forgery(:basic).text + expect(exercise.duplicate(title: title).title).to eq(title) + end + + it 'duplicates all associated files' do + exercise.files.each do + |file| expect(file).to receive(:dup).and_call_original + end + end + + it 'returns the duplicated exercise' do + expect(exercise.duplicate).to be_an(Exercise) + end + end end