Skip to content
Open
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
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
- Update autotest settings form UI (#7777)
- Store start and end date for courses (#7783)
- Update batch test runs table UI (#7790)
- Remove QR code name size limit (#7796)

### 🐛 Bug fixes
- Fixed the editing form of marking schemes to include newly added assessments (#7788)
Expand Down
6 changes: 4 additions & 2 deletions app/controllers/exam_templates_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ def create
redirect_to edit_course_exam_template_path(current_course, exam_template)
return
else
flash_message(:error, t('exam_templates.create.failure'))
errors = exam_template&.errors&.full_messages&.join(', ')
flash_message(:error, t('exam_templates.create.failure', errors: errors.present? ? ": #{errors}" : ''))
end
end
redirect_to course_assignment_exam_templates_path(current_course, assignment)
Expand Down Expand Up @@ -71,7 +72,8 @@ def update
if old_exam_template.update(exam_template_params)
flash_message(:success, t('exam_templates.update.success'))
else
flash_message(:error, t('exam_templates.update.failure'))
errors = old_exam_template.errors.full_messages.join(', ')
flash_message(:error, t('exam_templates.update.failure', errors: errors.present? ? ": #{errors}" : ''))
end
else
new_template_filename = new_uploaded_io.original_filename
Expand Down
3 changes: 2 additions & 1 deletion app/models/exam_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ class ExamTemplate < ApplicationRecord
has_one :course, through: :assignment
validates :filename, :num_pages, :name, presence: true
validates :name,
uniqueness: { scope: :assignment }
uniqueness: { scope: :assignment },
length: { maximum: 20, message: 'must be at most 20 characters' }
validates :num_pages, numericality: { greater_than_or_equal_to: 0,
only_integer: true }

Expand Down
4 changes: 2 additions & 2 deletions config/locales/views/exam_templates/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ en:
create:
add_division: Add Template Division
add_new: Add Exam Template
failure: Exam Template not successfully created
failure: Exam Template not successfully created%{errors}
success: Exam Template successfully created
upload: Upload Template
delete:
Expand Down Expand Up @@ -94,7 +94,7 @@ en:
scan_error: Some files have not been scanned properly.
submission_in_progress: Scanning QR codes done, now preparing PDF pages for grading
update:
failure: Exam Template has not been successfully updated
failure: Exam Template has not been successfully updated%{errors}
instruction: Replace template file
success: Exam Template has been successfully updated
upload_scans:
Expand Down
38 changes: 38 additions & 0 deletions spec/controllers/exam_templates_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,24 @@
it('should respond with 302') { expect(response).to have_http_status :found }
end

describe '#create with a name that is too long' do
let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf', 'application/pdf') }
let(:params) do
{ create_template: { file_io: file_io, name: 'Test_Midterm_Exam_Template_V2' },
assignment_id: exam_template.assignment.id, course_id: course.id }
end

before { post_as user, :create, params: params }

it 'does not create an ExamTemplate' do
expect(ExamTemplate.find_by(name: 'Test_Midterm_Exam_Template_V2')).to be_nil
end

it 'displays a flash error about name length' do
expect(flash[:error].first).to include('Name must be at most 20 characters')
end
end

describe '#create with empty filename' do
let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf', 'application/pdf') }
let(:params) do
Expand Down Expand Up @@ -84,6 +102,26 @@
end
end

context 'when updating with a name that is too long' do
let(:params) do
{ exam_template: { name: 'Test_Midterm_Exam_Template_V2' },
id: exam_template.id, course_id: course.id }
end

it 'does not update the exam template name' do
original_name = exam_template.name
expect(exam_template.reload.name).to eq original_name
end

it 'displays a flash error about name length' do
expect(flash[:error].first).to include('Name must be at most 20 characters')
end

it 'responds with 302' do
expect(response).to have_http_status :found
end
end

context 'when replacing the exam template file with a PDF file' do
let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf') }
let(:params) do
Expand Down