fix issue with regrades changing displayed points of questions within a group

fixes CNVS-10533

test plan:
- as a teacher
  - create a quiz with a question group that has Pick: 1, Points: 25
  - create a question within the group that has Points: 1

- as a student
  - take the quiz, get the answer correct

- as a teacher
  - change the answer for the question, choose first regrade option
  - save the quiz

- as a student
  - view your quiz results
  - point values should continue to show 25/25 points

- poke around with points within a quiz group when regrading
- poke around with regrading stuff in general to try and break point scoring

Change-Id: Id5cacf44012d967a812e2208df0404c3d532f2c5
Reviewed-on: https://gerrit.instructure.com/29002
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Jason Madsen <jmadsen@instructure.com>
QA-Review: Caleb Guanzon <cguanzon@instructure.com>
Product-Review: Derek DeVries <ddevries@instructure.com>
This commit is contained in:
Derek DeVries 2014-01-21 13:42:19 -07:00
parent be4f66b08b
commit ac13d2faa5
3 changed files with 53 additions and 13 deletions

View File

@ -52,7 +52,16 @@ class QuizRegrader::Submission
id = question[:id] id = question[:id]
if submitted_answer_ids.include?(id) if submitted_answer_ids.include?(id)
question.keep_if {|k, v| %w{id position published_at}.include?(k) } question.keep_if {|k, v| %w{id position published_at}.include?(k) }
question.merge(question_regrades[id].question_data.to_hash)
quiz_question = question_regrades[id].quiz_question
data = quiz_question.question_data
group = quiz_question.quiz_group
if group && group.pick_count
data[:points_possible] = group.question_points
end
question.merge(data.to_hash)
else else
question question
end end

View File

@ -8,9 +8,13 @@ describe QuizRegrader::AttemptVersion do
{1 => 'no_regrade', 2 => 'full_credit', 3 => 'current_correct_only' } {1 => 'no_regrade', 2 => 'full_credit', 3 => 'current_correct_only' }
end end
let(:question_group) do
stub(:pick_count => 1, :question_points => 25)
end
let(:question_regrades) do let(:question_regrades) do
1.upto(3).each_with_object({}) do |i, hash| 1.upto(3).each_with_object({}) do |i, hash|
hash[i] = stub(:quiz_question => stub(:id => i, :question_data => {:id => i}), hash[i] = stub(:quiz_question => stub(:id => i, :question_data => {:id => i}, :quiz_group => question_group),
:question_data => {:id => i}, :question_data => {:id => i},
:regrade_option => regrade_options[i]) :regrade_option => regrade_options[i])
end end
@ -25,10 +29,13 @@ describe QuizRegrader::AttemptVersion do
end end
let(:submission) do let(:submission) do
stub(:score => 0, stub(:score => 0,
:quiz_data => quiz_data, :score_before_regrade => 1,
:submission_data => submission_data, :quiz_data => quiz_data,
:write_attribute => {}) :score= => nil,
:score_before_regrade= => nil,
:submission_data => submission_data,
:write_attribute => {})
end end
let(:version) do let(:version) do
@ -66,7 +73,7 @@ describe QuizRegrader::AttemptVersion do
submission.expects(:score=).with(3) submission.expects(:score=).with(3)
submission.expects(:score_before_regrade).returns nil submission.expects(:score_before_regrade).returns nil
submission.expects(:score_before_regrade=).with(0) submission.expects(:score_before_regrade=).with(0)
submission.expects(:quiz_data=).with(question_regrades.map { |id, q| q.question_data }) submission.expects(:quiz_data=)
version.expects(:model=) version.expects(:model=)
version.expects(:save!) version.expects(:save!)

View File

@ -8,9 +8,13 @@ describe QuizRegrader::Submission do
{1 => 'no_regrade', 2 => 'full_credit', 3 => 'current_correct_only' } {1 => 'no_regrade', 2 => 'full_credit', 3 => 'current_correct_only' }
end end
let(:question_group) do
stub(:pick_count => 1, :question_points => 25)
end
let(:question_regrades) do let(:question_regrades) do
1.upto(3).each_with_object({}) do |i, hash| 1.upto(3).each_with_object({}) do |i, hash|
hash[i] = stub(:quiz_question => stub(:id => i, :question_data => {:id => i}), hash[i] = stub(:quiz_question => stub(:id => i, :question_data => {:id => i}, :quiz_group => question_group),
:question_data => {:id => i}, :question_data => {:id => i},
:regrade_option => regrade_options[i]) :regrade_option => regrade_options[i])
end end
@ -25,10 +29,13 @@ describe QuizRegrader::Submission do
end end
let(:submission) do let(:submission) do
stub(:score => 0, stub(:score => 0,
:quiz_data => quiz_data, :score_before_regrade => 1,
:submission_data => submission_data, :quiz_data => quiz_data,
:write_attribute => {}) :score= => nil,
:score_before_regrade= => nil,
:submission_data => submission_data,
:write_attribute => {})
end end
let(:wrapper) do let(:wrapper) do
@ -64,11 +71,28 @@ describe QuizRegrader::Submission do
submission.expects(:score=).with(3) submission.expects(:score=).with(3)
submission.expects(:score_before_regrade).returns nil submission.expects(:score_before_regrade).returns nil
submission.expects(:score_before_regrade=).with(0) submission.expects(:score_before_regrade=).with(0)
submission.expects(:quiz_data=).with(question_regrades.map { |id, q| q.question_data }) submission.expects(:quiz_data=)
submission.expects(:attempts => stub(:last_versions => [])) submission.expects(:attempts => stub(:last_versions => []))
wrapper.regrade! wrapper.regrade!
end end
end end
describe "#rescored_submission" do
it "scores the submission based on the regraded answers" do
params = question_regrades.map do |key, qr|
{:id => key, :points_possible => question_group.question_points}
end
submission.expects(:quiz_data=).with(params)
regrade_submission = QuizRegrader::Submission.new(
:submission => submission,
:question_regrades => question_regrades)
regrade_submission.expects(:answers_to_grade).returns []
regrade_submission.rescored_submission
end
end
end end