diff --git a/app/models/assignment.rb b/app/models/assignment.rb index 5bdb4dec732..fe9a41257a4 100644 --- a/app/models/assignment.rb +++ b/app/models/assignment.rb @@ -521,6 +521,13 @@ class Assignment < ActiveRecord::Base # have to use peer_reviews_due_at here because it's the column name self.peer_reviews_assigned = false if peer_reviews_due_at_changed? self.points_possible = nil unless self.graded? + [ + :all_day, :could_be_locked, :grade_group_students_individually, + :anonymous_peer_reviews, :turnitin_enabled, :vericite_enabled, + :moderated_grading, :omit_from_final_grade, :freeze_on_copy, + :copied, :only_visible_to_overrides, :post_to_sis, :peer_reviews_assigned, + :peer_reviews, :automatic_peer_reviews, :muted, :intra_group_peer_reviews + ].each { |attr| self[attr] = false if self[attr].nil? } end protected :default_values diff --git a/app/models/discussion_topic.rb b/app/models/discussion_topic.rb index d902ffa8ed7..56a0ee1958b 100644 --- a/app/models/discussion_topic.rb +++ b/app/models/discussion_topic.rb @@ -120,6 +120,12 @@ class DiscussionTopic < ActiveRecord::Base if self.has_group_category? self.subtopics_refreshed_at ||= Time.parse("Jan 1 2000") end + + [ + :could_be_locked, :podcast_enabled, :podcast_has_student_posts, + :require_initial_post, :pinned, :locked, :allow_rating, + :only_graders_can_rate, :sort_by_rating + ].each { |attr| self[attr] = false if self[attr].nil? } end protected :default_values diff --git a/app/models/quizzes/quiz.rb b/app/models/quizzes/quiz.rb index 009ed313b1c..60c2a25e311 100644 --- a/app/models/quizzes/quiz.rb +++ b/app/models/quizzes/quiz.rb @@ -139,6 +139,14 @@ class Quizzes::Quiz < ActiveRecord::Base self.question_count = self.question_count(true) @update_existing_submissions = true if self.for_assignment? && self.quiz_type_changed? @stored_questions = nil + + [ + :shuffle_answers, :could_be_locked, :anonymous_submissions, + :require_lockdown_browser, :require_lockdown_browser_for_results, + :one_question_at_a_time, :cant_go_back, :require_lockdown_browser_monitor, + :only_visible_to_overrides, :one_time_results, :show_correct_answers_last_attempt + ].each { |attr| self[attr] = false if self[attr].nil? } + self[:show_correct_answers] = true if self[:show_correct_answers].nil? end # quizzes differ from other publishable objects in that they require we diff --git a/spec/models/assignment_spec.rb b/spec/models/assignment_spec.rb index 7d6444c9f61..83ee893035b 100644 --- a/spec/models/assignment_spec.rb +++ b/spec/models/assignment_spec.rb @@ -96,6 +96,121 @@ describe Assignment do expect(@assignment.errors[:grading_type]).not_to be_nil end + describe "default values for boolean attributes" do + before(:once) do + @assignment = @course.assignments.create! + end + + let(:values) do + Assignment.where(id: @assignment).pluck( + :could_be_locked, + :grade_group_students_individually, + :anonymous_peer_reviews, + :turnitin_enabled, + :vericite_enabled, + :moderated_grading, + :omit_from_final_grade, + :freeze_on_copy, + :copied, + :only_visible_to_overrides, + :post_to_sis, + :peer_reviews_assigned, + :peer_reviews, + :automatic_peer_reviews, + :muted, + :intra_group_peer_reviews + ).first + end + + it "saves boolean attributes as false if they are set to nil" do + @assignment.update!( + could_be_locked: nil, + grade_group_students_individually: nil, + anonymous_peer_reviews: nil, + turnitin_enabled: nil, + vericite_enabled: nil, + moderated_grading: nil, + omit_from_final_grade: nil, + freeze_on_copy: nil, + copied: nil, + only_visible_to_overrides: nil, + post_to_sis: nil, + peer_reviews_assigned: nil, + peer_reviews: nil, + automatic_peer_reviews: nil, + muted: nil, + intra_group_peer_reviews: nil + ) + + expect(values).to eq([false] * values.length) + end + + it "saves boolean attributes as false if they are set to false" do + @assignment.update!( + could_be_locked: false, + grade_group_students_individually: false, + anonymous_peer_reviews: false, + turnitin_enabled: false, + vericite_enabled: false, + moderated_grading: false, + omit_from_final_grade: false, + freeze_on_copy: false, + copied: false, + only_visible_to_overrides: false, + post_to_sis: false, + peer_reviews_assigned: false, + peer_reviews: false, + automatic_peer_reviews: false, + muted: false, + intra_group_peer_reviews: false + ) + + expect(values).to eq([false] * values.length) + end + + it "saves boolean attributes as true if they are set to true" do + # exluding the moderated_grading attribute because it cannot be + # true when peer_reviews is true + @assignment.update!( + could_be_locked: true, + grade_group_students_individually: true, + anonymous_peer_reviews: true, + turnitin_enabled: true, + vericite_enabled: true, + omit_from_final_grade: true, + freeze_on_copy: true, + copied: true, + only_visible_to_overrides: true, + post_to_sis: true, + peer_reviews_assigned: true, + peer_reviews: true, + automatic_peer_reviews: true, + muted: true, + intra_group_peer_reviews: true + ) + + values = Assignment.where(id: @assignment).pluck( + :could_be_locked, + :grade_group_students_individually, + :anonymous_peer_reviews, + :turnitin_enabled, + :vericite_enabled, + :omit_from_final_grade, + :freeze_on_copy, + :copied, + :only_visible_to_overrides, + :post_to_sis, + :peer_reviews_assigned, + :peer_reviews, + :automatic_peer_reviews, + :muted, + :intra_group_peer_reviews + ).first + + expect(values).to eq([true] * values.length) + end + end + describe '#tool_settings_tool=' do let(:stub_response){ double(code: 200, body: {}.to_json, parsed_response: {'Id' => 'test-id'}, ok?: true) } let(:subscription_helper){ class_double(Lti::AssignmentSubscriptionsHelper).as_stubbed_const } diff --git a/spec/models/discussion_topic_spec.rb b/spec/models/discussion_topic_spec.rb index 7b599734009..42f865e0039 100644 --- a/spec/models/discussion_topic_spec.rb +++ b/spec/models/discussion_topic_spec.rb @@ -24,6 +24,74 @@ describe DiscussionTopic do student_in_course(:active_all => true) end + describe "default values for boolean attributes" do + before(:once) do + @topic = @course.discussion_topics.create! + end + + let(:values) do + DiscussionTopic.where(id: @topic).pluck( + :could_be_locked, + :podcast_enabled, + :podcast_has_student_posts, + :require_initial_post, + :pinned, + :locked, + :allow_rating, + :only_graders_can_rate, + :sort_by_rating + ).first + end + + it "saves boolean attributes as false if they are set to nil" do + @topic.update!( + could_be_locked: nil, + podcast_enabled: nil, + podcast_has_student_posts: nil, + require_initial_post: nil, + pinned: nil, + locked: nil, + allow_rating: nil, + only_graders_can_rate: nil, + sort_by_rating: nil + ) + + expect(values).to eq([false] * values.length) + end + + it "saves boolean attributes as false if they are set to false" do + @topic.update!( + could_be_locked: false, + podcast_enabled: false, + podcast_has_student_posts: false, + require_initial_post: false, + pinned: false, + locked: false, + allow_rating: false, + only_graders_can_rate: false, + sort_by_rating: false + ) + + expect(values).to eq([false] * values.length) + end + + it "saves boolean attributes as true if they are set to true" do + @topic.update!( + could_be_locked: true, + podcast_enabled: true, + podcast_has_student_posts: true, + require_initial_post: true, + pinned: true, + locked: true, + allow_rating: true, + only_graders_can_rate: true, + sort_by_rating: true + ) + + expect(values).to eq([true] * values.length) + end + end + it "should santize message" do @course.discussion_topics.create!(:message => "only this should stay") expect(@course.discussion_topics.first.message).to eql("only this should stay") diff --git a/spec/models/quizzes/quiz_spec.rb b/spec/models/quizzes/quiz_spec.rb index 74ec3c6c40f..e7da5bfc3f6 100644 --- a/spec/models/quizzes/quiz_spec.rb +++ b/spec/models/quizzes/quiz_spec.rb @@ -25,6 +25,101 @@ describe Quizzes::Quiz do course_factory end + describe "default values for boolean attributes" do + before(:once) do + @quiz = @course.quizzes.create!(title: "hello") + end + + let(:default_false_values) do + Quizzes::Quiz.where(id: @quiz).pluck( + :shuffle_answers, + :could_be_locked, + :anonymous_submissions, + :require_lockdown_browser, + :require_lockdown_browser_for_results, + :one_question_at_a_time, + :cant_go_back, + :require_lockdown_browser_monitor, + :only_visible_to_overrides, + :one_time_results, + :show_correct_answers_last_attempt + ).first + end + + it "saves boolean attributes as false if they are set to nil" do + @quiz.update!( + shuffle_answers: nil, + could_be_locked: nil, + anonymous_submissions: nil, + require_lockdown_browser: nil, + require_lockdown_browser_for_results: nil, + one_question_at_a_time: nil, + cant_go_back: nil, + require_lockdown_browser_monitor: nil, + only_visible_to_overrides: nil, + one_time_results: nil, + show_correct_answers_last_attempt: nil + ) + + expect(default_false_values).to eq([false] * default_false_values.length) + end + + it "saves show_correct_answers as true if it is set to nil" do + @quiz.update!(show_correct_answers: nil) + expect(@quiz.show_correct_answers).to eq(true) + end + + it "saves boolean attributes as false if they are set to false" do + @quiz.update!( + shuffle_answers: false, + could_be_locked: false, + anonymous_submissions: false, + require_lockdown_browser: false, + require_lockdown_browser_for_results: false, + one_question_at_a_time: false, + cant_go_back: false, + require_lockdown_browser_monitor: false, + only_visible_to_overrides: false, + one_time_results: false, + show_correct_answers_last_attempt: false + ) + + expect(default_false_values).to eq([false] * default_false_values.length) + end + + it "saves show_correct_answers as false if it is set to false" do + @quiz.update!(show_correct_answers: false) + expect(@quiz.show_correct_answers).to eq(false) + end + + it "saves boolean attributes as true if they are set to true" do + Quizzes::Quiz.stubs(:lockdown_browser_plugin_enabled?).returns(true) + @quiz.update!( + shuffle_answers: true, + could_be_locked: true, + anonymous_submissions: true, + require_lockdown_browser: true, + require_lockdown_browser_for_results: true, + one_question_at_a_time: true, + cant_go_back: true, + require_lockdown_browser_monitor: true, + only_visible_to_overrides: true, + one_time_results: true, + show_correct_answers_last_attempt: true, + # if allowed_attempts is <= 1, show_correct_answers_last_attempt + # cannot be set to true + allowed_attempts: 2 + ) + + expect(default_false_values).to eq([true] * default_false_values.length) + end + + it "saves show_correct_answers as true if it is set to true" do + @quiz.update!(show_correct_answers: true) + expect(@quiz.show_correct_answers).to eq(true) + end + end + describe ".mark_quiz_edited" do it "should mark a quiz as having unpublished changes" do quiz = nil