Skip to content

Commit dedef25

Browse files
author
Ben Rinaca
committed
makes assignments unavailable in availability gaps
Prevents a student from being able to submit assignments when they are in between availability windows for an assignment, ex: when they're in a section that had already completed and in a section that has not yet started. fixes CNVS-24849 test plan: - make sure students in a section where an assigment is available can still submit assignments - make sure students see when their assignment will be available if their availability window has not yet started - make sure students see when their assignment was last available if their availablility window has already ended - make sure students see when their assignment will be available if they're in a gap between availability windows Change-Id: Ia2d9aa6f9a694b4c6cd434e93c1b3156d437c198 Reviewed-on: https://gerrit.instructure.com/80843 Reviewed-by: Davis McClellan <dmcclellan@instructure.com> Tested-by: Jenkins QA-Review: Michael Hargiss <mhargiss@instructure.com> Product-Review: Jason Sparks <jsparks@instructure.com>
1 parent 58c728e commit dedef25

4 files changed

Lines changed: 82 additions & 3 deletions

File tree

app/models/assignment_override.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,12 @@ def lock_at=(new_lock_at)
231231
write_attribute(:lock_at, CanvasTime.fancy_midnight(new_lock_at))
232232
end
233233

234+
def availability_expired?
235+
lock_at_overridden &&
236+
lock_at.present? &&
237+
lock_at <= Time.zone.now
238+
end
239+
234240
def as_hash
235241
{ :title => title,
236242
:due_at => due_at,

lib/assignment_override_applicator.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,9 +319,13 @@ def self.overridden_all_day_date(assignment, overrides)
319319

320320
def self.overridden_unlock_at(assignment_or_quiz, overrides)
321321
applicable_overrides = overrides.select(&:unlock_at_overridden)
322+
323+
# CNVS-24849 if the override has been locked it's unlock_at no longer applies
324+
applicable_overrides.reject!(&:availability_expired?)
325+
322326
if applicable_overrides.empty?
323327
assignment_or_quiz.unlock_at
324-
elsif override = applicable_overrides.detect{ |o| o.unlock_at.nil? }
328+
elsif applicable_overrides.any? { |o| o.unlock_at.nil? }
325329
nil
326330
else
327331
applicable_overrides.sort_by(&:unlock_at).first.unlock_at
@@ -332,7 +336,7 @@ def self.overridden_lock_at(assignment_or_quiz, overrides)
332336
applicable_overrides = overrides.select(&:lock_at_overridden)
333337
if applicable_overrides.empty?
334338
assignment_or_quiz.lock_at
335-
elsif override = applicable_overrides.detect{ |o| o.lock_at.nil? }
339+
elsif applicable_overrides.detect{ |o| o.lock_at.nil? }
336340
nil
337341
else
338342
applicable_overrides.sort_by(&:lock_at).last.lock_at

spec/lib/assignment_override_applicator_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,25 @@ def setup_overridden_assignments(section_due_at, assignment_due_at)
773773
expect(@overridden.association(:rubric).loaded?).to eq @assignment.association(:rubric).loaded?
774774
@overridden.learning_outcome_alignments.loaded? == @assignment.learning_outcome_alignments.loaded?
775775
end
776+
777+
it "should be locked in between overrides" do
778+
past_override = assignment_override_model(assignment: @assignment,
779+
unlock_at: 2.months.ago,
780+
lock_at: 1.month.ago)
781+
future_override = assignment_override_model(assignment: @assignment,
782+
unlock_at: 2.months.from_now,
783+
lock_at: 1.month.from_now)
784+
overridden = AssignmentOverrideApplicator.assignment_with_overrides(@assignment, [past_override, future_override])
785+
expect(overridden.locked_for?(@student)).to be_truthy
786+
end
787+
788+
it "should not be locked when in an override" do
789+
override = assignment_override_model(assignment: @assignment,
790+
unlock_at: 2.months.ago,
791+
lock_at: 2.months.from_now)
792+
overridden = AssignmentOverrideApplicator.assignment_with_overrides(@assignment, [override])
793+
expect(overridden.locked_for?(@student)).to be(false)
794+
end
776795
end
777796

778797
describe "collapsed_overrides" do
@@ -1021,6 +1040,13 @@ def fancy_midnight(opts={})
10211040
unlock_at = AssignmentOverrideApplicator.overridden_unlock_at(@assignment, [@override])
10221041
expect(unlock_at).to eq @override.unlock_at
10231042
end
1043+
1044+
it "should not include unlock_at for previous overrides that have already been locked" do
1045+
@override.override_unlock_at(10.days.ago)
1046+
@override.override_lock_at(5.days.ago)
1047+
unlock_at = AssignmentOverrideApplicator.overridden_unlock_at(@assignment, [@override])
1048+
expect(unlock_at).to eq @assignment.unlock_at
1049+
end
10241050
end
10251051

10261052
describe "overridden_lock_at" do

spec/models/assignment_override_spec.rb

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
@override_student = @override.assignment_override_students.build
2929
@override_student.user = @student
3030
@override_student.save!
31-
31+
3232
@override.destroy
3333
expect(AssignmentOverride.where(id: @override).first).not_to be_nil
3434
expect(@override.workflow_state).to eq 'deleted'
@@ -472,6 +472,49 @@ def fancy_midnight(opts={})
472472

473473
end
474474

475+
describe '#availability_expired?' do
476+
let(:override) { assignment_override_model }
477+
subject { override.availability_expired? }
478+
479+
context 'without an overridden lock_at' do
480+
before do
481+
override.lock_at_overridden = false
482+
end
483+
484+
it { is_expected.to be(false) }
485+
end
486+
487+
context 'with an overridden lock_at' do
488+
before do
489+
override.lock_at_overridden = true
490+
end
491+
492+
context 'never locks' do
493+
before do
494+
override.lock_at = nil
495+
end
496+
497+
it { is_expected.to be(false) }
498+
end
499+
500+
context 'not yet locked' do
501+
before do
502+
override.lock_at = 10.minutes.from_now
503+
end
504+
505+
it { is_expected.to be(false) }
506+
end
507+
508+
context 'already locked' do
509+
before do
510+
override.lock_at = 10.minutes.ago
511+
end
512+
513+
it { is_expected.to be(true) }
514+
end
515+
end
516+
end
517+
475518
describe "default_values" do
476519
let(:override) { AssignmentOverride.new }
477520
let(:quiz) { Quizzes::Quiz.new }

0 commit comments

Comments
 (0)