Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions app/models/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -190,39 +190,13 @@ def date_calculator
)
end

# Calculates the new late due date for an extension based on course settings.
# Returns nil if the assignment has no late due date.
# Delegates to AssignmentDateCalculator for the actual calculation.
def calculate_new_late_due_date
date_calculator.late_due_date
end

def reject(processed_user_id)
update(status: 'denied', last_processed_by_user_id: processed_user_id.id)
# Only send email if the person processing is the same as the request's user
send_email_response if course.course_settings&.enable_emails && processed_user_id.id != user_id
true
end

# Based on this request, set the right 3 assignment dates
# Always keep the assignment release date the same
# Calculate the delta from the original due date to the requested due date
# Set the due date to the requested due date
# If the current (approval) time is beyond the requested due date,
# then extend the requested due date by the delta with a max of 3 days
# If the flag EXTEND_LATE_DUE_DATE is set, then set the late due date to
# the delta beyond the requested due date, otherwise keep it the same
# If the flag EXTEND_LATE_DUE_DATE is not set, ensure that the late due date
# is at least as late as the requested due date
def calculate_new_assignment_dates
{
release_date: assignment_release_date,
due_date: requested_due_date,
late_due_date: late_due_date,
message: approval_message
}
end

def send_email_response
return unless course.course_settings&.enable_emails

Expand Down
144 changes: 0 additions & 144 deletions spec/models/request_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -611,150 +611,6 @@
end
end

describe '#calculate_new_late_due_date' do
it 'delegates to AssignmentDateCalculator#late_due_date' do
mock_calculator = instance_double(AssignmentDateCalculator)
expected_date = 5.days.from_now
allow(mock_calculator).to receive(:late_due_date).and_return(expected_date)
allow(request).to receive(:date_calculator).and_return(mock_calculator)

expect(request.calculate_new_late_due_date).to eq(expected_date)
end

# Integration tests to ensure the delegation works correctly
context 'integration with AssignmentDateCalculator' do
let(:original_due_date) { Time.zone.parse('2025-01-15 23:59:00') }
let(:original_late_due_date) { Time.zone.parse('2025-01-17 23:59:00') }
let(:requested_due_date) { Time.zone.parse('2025-01-18 23:59:00') }

let(:assignment_with_late_due_date) do
Assignment.create!(
name: 'Assignment with Late Due Date',
course_to_lms_id: course.course_to_lms(1).id,
external_assignment_id: 'ext2',
enabled: true,
due_date: original_due_date,
late_due_date: original_late_due_date
)
end

let(:assignment_without_late_due_date) do
Assignment.create!(
name: 'Assignment without Late Due Date',
course_to_lms_id: course.course_to_lms(1).id,
external_assignment_id: 'ext3',
enabled: true,
due_date: original_due_date,
late_due_date: nil
)
end

let(:request_with_late_due_date) do
described_class.create!(
user: user,
course: course,
assignment: assignment_with_late_due_date,
reason: 'Need more time',
requested_due_date: requested_due_date
)
end

let(:request_without_late_due_date) do
described_class.create!(
user: user,
course: course,
assignment: assignment_without_late_due_date,
reason: 'Need more time',
requested_due_date: requested_due_date
)
end

context 'when assignment has no late due date' do
it 'returns nil' do
expect(request_without_late_due_date.calculate_new_late_due_date).to be_nil
end
end

context 'when extend_late_due_date setting is true (default)' do
before do
CourseSettings.create!(
course: course,
enable_extensions: true,
extend_late_due_date: true
)
end

it 'shifts the late due date by the same delta as the extension' do
# Original due date: Jan 15, Late due date: Jan 17 (2 days later)
# Extension delta: Jan 18 - Jan 15 = 3 days
# New late due date: Jan 17 + 3 days = Jan 20
result = request_with_late_due_date.calculate_new_late_due_date
expected = Time.zone.parse('2025-01-20 23:59:00')
expect(result).to be_within(1.second).of(expected)
end
end
context 'when extend_late_due_date setting is false' do
before do
CourseSettings.create!(
course: course,
enable_extensions: true,
extend_late_due_date: false
)
end

context 'when original late due date is later than extended due date' do
let(:requested_due_date) { Time.zone.parse('2025-01-16 23:59:00') }

it 'returns the original late due date' do
# Extended due date (Jan 16) is before late due date (Jan 17)
# So return the original late due date
result = request_with_late_due_date.calculate_new_late_due_date
expect(result).to eq(original_late_due_date)
end
end

context 'when extended due date is later than original late due date' do
let(:requested_due_date) { Time.zone.parse('2025-01-20 23:59:00') }

it 'returns the extended due date' do
# Extended due date (Jan 20) is after late due date (Jan 17)
# So return the extended due date
result = request_with_late_due_date.calculate_new_late_due_date
expect(result).to eq(requested_due_date)
end
end
end

context 'when extend_late_due_date setting is nil (defaults to true)' do
before do
# Create settings without explicitly setting extend_late_due_date
# This simulates existing courses before the migration
cs = CourseSettings.create!(
course: course,
enable_extensions: true
)
# Manually set to nil to simulate pre-migration state
cs.update_column(:extend_late_due_date, nil)
end

it 'defaults to shifting the late due date by the extension delta' do
result = request_with_late_due_date.calculate_new_late_due_date
expected = Time.zone.parse('2025-01-20 23:59:00')
expect(result).to be_within(1.second).of(expected)
end
end

context 'when course has no course settings' do
it 'defaults to shifting the late due date (extend_late_due_date = true behavior)' do
# No course settings means nil, which defaults to true
result = request_with_late_due_date.calculate_new_late_due_date
expected = Time.zone.parse('2025-01-20 23:59:00')
expect(result).to be_within(1.second).of(expected)
end
end
end
end

describe '#send_email_response' do
before do
ENV['DEFAULT_FROM_EMAIL'] = 'flextensions@berkeley.edu'
Expand Down
21 changes: 0 additions & 21 deletions spec/services/assignment_date_calculator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -214,27 +214,6 @@
end
end

context 'when extend_late_due_date setting is nil (defaults to true)' do
it 'defaults to shifting the late due date by the extension delta' do
# Create settings without explicitly setting extend_late_due_date
cs = CourseSettings.create!(
course: course,
enable_extensions: true
)
# Manually set to nil to simulate pre-migration state
cs.update_column(:extend_late_due_date, nil)

calculator = described_class.new(
assignment: assignment_with_late_due_date,
request: request_with_late_due_date,
course_settings: cs
)

expected = Time.zone.parse('2025-01-20 23:59:00')
expect(calculator.late_due_date).to be_within(1.second).of(expected)
end
end

context 'when course_settings is nil' do
it 'defaults to shifting the late due date (extend_late_due_date = true behavior)' do
calculator = described_class.new(
Expand Down
Loading