canvas-lms/spec/integration/quizzes_spec.rb

202 lines
7.9 KiB
Ruby

require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe Quizzes::QuizzesController do
def create_section_override(section, due_at)
override = assignment_override_model(:quiz => @quiz)
override.set = section
override.override_due_at(due_at)
override.save!
end
context "#show" do
before :each do
course_with_teacher_logged_in(:active_all => true)
assignment_model(:course => @course)
quiz_model(:course => @course, :assignment_id => @assignment.id)
@quiz.update_attribute :due_at, 5.days.from_now
@cs1 = @course.default_section
@cs2 = @course.course_sections.create!
end
context "with overridden due dates" do
include TextHelper
context "with no overrides" do
it "should show a due date for 'Everyone'" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css(".assignment_dates").text).to include "Everyone"
expect(doc.css(".assignment_dates").text).not_to include "Everyone else"
end
end
context "with some sections overridden" do
before do
@due_at = 3.days.from_now
create_section_override(@cs1, @due_at)
end
it "should show an overridden due date for student" do
@course.enroll_user(user, 'StudentEnrollment')
user_session(@user)
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css("#quiz_student_details .value").first.text).to include(datetime_string(@due_at))
end
it "should show 'Everyone else' when some sections have a due date override" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css(".assignment_dates").text).to include "Everyone else"
end
end
context "with all sections overridden" do
before do
@due_at1, @due_at2 = 3.days.from_now, 4.days.from_now
create_section_override(@cs1, @due_at1)
create_section_override(@cs2, @due_at2)
end
it "should show multiple due dates to teachers" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css(".assignment_dates tbody tr").count).to be 2
expect(doc.css(".assignment_dates tbody tr > td:first-child").text).
to include(datetime_string(@due_at1), datetime_string(@due_at2))
end
it "should not show a date for 'Everyone else'" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css(".assignment_dates").text).not_to include "Everyone"
end
end
end
context "SpeedGrader" do
it "should link to SpeedGrader when not large_roster" do
@course.large_roster = false
@course.save!
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
expect(response.body).to match(%r{SpeedGrader})
end
it "should not link to SpeedGrader when large_roster" do
@course.large_roster = true
@course.save!
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
expect(response.body).not_to match(%r{SpeedGrader})
end
end
end
context "show_student" do
before :each do
course_with_student_logged_in(:active_all => true)
course_quiz true
post "courses/#{@course.id}/quizzes/#{@quiz.id}/take?user_id=#{@student.id}"
get "courses/#{@course.id}/quizzes/#{@quiz.id}/take"
end
context "Show Center resume button" do
it "should show resume button in the center" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css("#not_right_side .take_quiz_button").text).to include "Resume Quiz"
end
end
context "Not show right_side resume button" do
it "should not show resume button on right_side" do
get "courses/#{@course.id}/quizzes/#{@quiz.id}"
doc = Nokogiri::HTML(response.body)
expect(doc.css("#right-side .rs-margin-top").text).not_to include "Resume Quiz"
end
end
end
context "#history" do
context "pending_review" do
def mkquiz
quiz_with_graded_submission([{:question_data => {:name => 'question 1', :points_possible => 1, 'question_type' => 'essay_question'}},
{:question_data => {:name => 'question 2', :points_possible => 1, 'question_type' => 'essay_question'}}])
course_with_teacher_logged_in(:active_all => true, :course => @course)
end
def mksurvey
survey_with_submission([{:question_data => {:name => 'question 1', :points_possible => 1, 'question_type' => 'essay_question'}},
{:question_data => {:name => 'question 2', :points_possible => 1, 'question_type' => 'essay_question'}}])
course_with_teacher_logged_in(:active_all => true, :course => @course)
end
it "should list the questions needing review" do
mkquiz
get "courses/#{@course.id}/quizzes/#{@quiz.id}/history?quiz_submission_id=#{@quiz_submission.id}"
expect(response.body).to match(%r{The following questions need review})
expect(response.body).not_to match(%r{The quiz has changed significantly since this submission was made})
doc = Nokogiri::HTML(response.body)
needing_review = doc.at_css('#questions_needing_review')
expect(needing_review).to be_present
expect(needing_review.children.css('li a').map { |n| n.text }).to eq @quiz.quiz_data.map { |qq| qq['name'] }
end
it "should display message about the quiz changing significantly" do
Quizzes::Quiz.any_instance.stubs(:changed_significantly_since?).returns(true)
mkquiz
@quiz_submission.update_if_needs_review
@quiz_submission.submission_data.each { |q| q[:correct] = "false" }
@quiz_submission.save
get "courses/#{@course.id}/quizzes/#{@quiz.id}/history?quiz_submission_id=#{@quiz_submission.id}"
expect(response.body).not_to match(%r{The following questions need review})
expect(response.body).to match(%r{The quiz has changed significantly since this submission was made})
end
it "should display both messages" do
Quizzes::Quiz.any_instance.stubs(:changed_significantly_since?).returns(true)
mkquiz
get "courses/#{@course.id}/quizzes/#{@quiz.id}/history?quiz_submission_id=#{@quiz_submission.id}"
expect(response.body).to match(%r{The following questions need review})
expect(response.body).to match(%r{The quiz has changed significantly since this submission was made})
doc = Nokogiri::HTML(response.body)
needing_review = doc.at_css('#questions_needing_review')
expect(needing_review).to be_present
expect(needing_review.children.css('li a').map { |n| n.text }).to eq @quiz.quiz_data.map { |qq| qq['name'] }
end
it "shoudn't show the user's name/email when it's an anonymous submission" do
mksurvey
# add some crazy names and email address that are unlikely to be matched accidentally
crazy_unlikely_to_be_matched_name = "1p3h5Yns[y>s^*:]zi^1|h,M"
@student.name = crazy_unlikely_to_be_matched_name
@student.sortable_name = crazy_unlikely_to_be_matched_name
pseudonym @student, :username => '1p3h5Ynsyszi1hM@1p3h5Ynsyszi1hM.com'
@student.save!
@student.reload
get "courses/#{@course.id}/quizzes/#{@quiz.id}/history?quiz_submission_id=#{@quiz_submission.id}"
expect(response.body).not_to match @student.name
expect(response.body).not_to match @student.sortable_name
expect(response.body).not_to match @student.email
end
end
end
def course_quiz(active=false)
@quiz = @course.quizzes.create
@quiz.workflow_state = "available" if active
@quiz.save!
@quiz
end
end