Skip to content

Commit 769a1e8

Browse files
committed
chore: Files feedback_message without NULL state
Column type string should not have a null state to avoid logical distinction between NULL and '' case. User defined tests are created without feedback_message but render a possible feedback_message. Removing the NULL case allows new records render the empty feedback_message. An edgecase remains when a test for assessment with a feedback_message is transformed to a user defined test. The feedback message will be displayed. Resolves #3014
1 parent fb06892 commit 769a1e8

File tree

5 files changed

+50
-15
lines changed

5 files changed

+50
-15
lines changed

app/models/code_ocean/file.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class File < ApplicationRecord
1616

1717
after_initialize :set_default_values
1818
before_validation :clear_weight, unless: :teacher_defined_assessment?
19+
before_validation :clear_feedback_message, unless: :teacher_defined_assessment?
1920
before_validation :hash_content, if: :content_present?
2021
before_validation :set_ancestor_values, if: :incomplete_descendent?
2122

@@ -49,7 +50,6 @@ class File < ApplicationRecord
4950
default_scope { order(path: :asc, name: :asc) }
5051

5152
validates :feedback_message, if: :teacher_defined_assessment?, presence: true
52-
validates :feedback_message, absence: true, unless: :teacher_defined_assessment?
5353
validates :hashed_content, if: :content_present?, presence: true
5454
validates :hidden, inclusion: [true, false]
5555
validates :hidden_feedback, inclusion: [true, false]
@@ -153,6 +153,11 @@ def set_default_values
153153
end
154154
private :set_default_values
155155

156+
def clear_feedback_message
157+
self.feedback_message = ''
158+
end
159+
private :clear_feedback_message
160+
156161
def visible?
157162
!hidden
158163
end

app/services/proforma_service/convert_task_to_exercise.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ def model_solution_files
8989
model_solution.files.map do |task_file|
9090
codeocean_file_from_task_file(task_file, model_solution).tap do |file|
9191
file.role ||= 'reference_implementation'
92-
file.feedback_message = nil
9392
end
9493
end
9594
end
@@ -99,7 +98,6 @@ def task_files
9998
@task.files.reject {|file| file.id == 'ms-placeholder-file' }.map do |task_file|
10099
codeocean_file_from_task_file(task_file).tap do |file|
101100
file.role ||= 'regular_file'
102-
file.feedback_message = nil
103101
end
104102
end
105103
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
class RemoveNullFromFilesFeedbackMessage < ActiveRecord::Migration[8.0]
4+
def up
5+
execute <<~SQL
6+
UPDATE files SET feedback_message = '' WHERE feedback_message IS NULL;
7+
SQL
8+
9+
change_column_default :files, :feedback_message, ''
10+
change_column_null :files, :feedback_message, false
11+
end
12+
13+
def down
14+
change_column_null :files, :feedback_message, true
15+
change_column_default :files, :feedback_message, nil
16+
end
17+
end

db/schema.rb

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/models/code_ocean/file_spec.rb

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@
33
require 'rails_helper'
44

55
RSpec.describe CodeOcean::File do
6-
let(:file) { described_class.create.tap {|file| file.update(content: nil, hidden: nil, read_only: nil) } }
6+
let(:file) do
7+
described_class.new.tap do |file|
8+
file.assign_attributes(content: nil, hidden: nil, read_only: nil)
9+
file.validate
10+
end
11+
end
712

813
it 'validates the presence of a file type' do
914
expect(file.errors[:file_type]).to be_present
1015
end
1116

1217
it 'validates the presence of the hidden flag' do
1318
expect(file.errors[:hidden]).to be_present
14-
file.update(hidden: false)
19+
file.hidden = false
20+
file.validate
1521
expect(file.errors[:hidden]).to be_blank
1622
end
1723

@@ -21,19 +27,23 @@
2127

2228
it 'validates the presence of the read-only flag' do
2329
expect(file.errors[:read_only]).to be_present
24-
file.update(read_only: false)
30+
file.read_only = false
31+
file.validate
2532
expect(file.errors[:read_only]).to be_blank
2633
end
2734

2835
context 'with a teacher-defined test' do
29-
before { file.update(role: 'teacher_defined_test') }
36+
before do
37+
file.role = 'teacher_defined_test'
38+
file.validate
39+
end
3040

3141
it 'validates the presence of a feedback message' do
3242
expect(file.errors[:feedback_message]).to be_present
3343
end
3444

3545
it 'validates the numericality of a weight' do
36-
file.update(weight: 'heavy')
46+
file.weight = 'heavy'
3747
expect(file.errors[:weight]).to be_present
3848
end
3949

@@ -43,16 +53,21 @@
4353
end
4454

4555
context 'with another file type' do
46-
before { file.update(role: 'regular_file') }
56+
before do
57+
file.role = 'regular_file'
58+
end
4759

48-
it 'validates the absence of a feedback message' do
49-
file.update(feedback_message: 'Your solution is not correct yet.')
50-
expect(file.errors[:feedback_message]).to be_present
60+
it 'removes the feedback message' do
61+
file.feedback_message = 'Your solution is not correct yet.'
62+
63+
expect { file.validate }
64+
.to change(file, :feedback_message).to('')
5165
end
5266

5367
it 'validates the absence of a weight' do
5468
allow(file).to receive(:clear_weight)
55-
file.update(weight: 1)
69+
file.weight = 1
70+
file.validate
5671
expect(file.errors[:weight]).to be_present
5772
end
5873
end

0 commit comments

Comments
 (0)