|
63 | 63 | school_class.name = ' '
|
64 | 64 | expect(school_class).to be_invalid
|
65 | 65 | end
|
| 66 | + |
| 67 | + it 'assigns class code before validating' do |
| 68 | + school_class.code = nil |
| 69 | + school_class.valid? |
| 70 | + expect(school_class.code).to match(/\d\d-\d\d-\d\d/) |
| 71 | + end |
| 72 | + |
| 73 | + it 'requires a unique class code within the same school' do |
| 74 | + school_class.save! |
| 75 | + school_class_with_duplicate_code = build(:school_class, school: school_class.school, code: school_class.code) |
| 76 | + school_class_with_duplicate_code.valid? |
| 77 | + expect(school_class_with_duplicate_code.errors[:code]).to include('has already been taken') |
| 78 | + end |
| 79 | + |
| 80 | + it 'permits a duplicate class code in a different school' do |
| 81 | + school_class.save! |
| 82 | + school_class_with_duplicate_code = build(:school_class, school: build(:school), code: school_class.code) |
| 83 | + expect(school_class_with_duplicate_code).to be_valid |
| 84 | + end |
| 85 | + |
| 86 | + it 'requires a valid class code format' do |
| 87 | + school_class.code = 'invalid' |
| 88 | + expect(school_class).to be_invalid |
| 89 | + end |
| 90 | + |
| 91 | + it 'accepts a valid class code format' do |
| 92 | + school_class.code = '12-34-56' |
| 93 | + expect(school_class).to be_valid |
| 94 | + end |
| 95 | + |
| 96 | + it 'does not allow the class code to be changed' do |
| 97 | + school_class.code = '12-34-56' |
| 98 | + school_class.save! |
| 99 | + school_class.code = '65-43-21' |
| 100 | + expect(school_class).to be_invalid |
| 101 | + end |
66 | 102 | end
|
67 | 103 |
|
68 | 104 | describe '.teachers' do
|
|
141 | 177 | end
|
142 | 178 | end
|
143 | 179 |
|
| 180 | + describe '#assign_class_code' do |
| 181 | + it 'assigns a class code if not already present' do |
| 182 | + school_class = build(:school_class, code: nil, school:) |
| 183 | + school_class.assign_class_code |
| 184 | + expect(school_class.code).to match(/\d\d-\d\d-\d\d/) |
| 185 | + end |
| 186 | + |
| 187 | + it 'does not assign a class code if already present' do |
| 188 | + school_class = build(:school_class, code: '12-34-56', school:) |
| 189 | + school_class.assign_class_code |
| 190 | + expect(school_class.code).to eq('12-34-56') |
| 191 | + end |
| 192 | + |
| 193 | + it 'retries 5 times if the school code is not unique within the school' do |
| 194 | + school_class = create(:school_class, code: '12-34-56', school:) |
| 195 | + allow(ForEducationCodeGenerator).to receive(:generate).and_return(*([school_class.code] * 4), '00-00-00') |
| 196 | + another_school_class = create(:school_class, school: school_class.school, code: nil) |
| 197 | + another_school_class.assign_class_code |
| 198 | + expect(another_school_class.code).to eq('00-00-00') |
| 199 | + end |
| 200 | + |
| 201 | + it 'raises adds error if unique code cannot be generated in 5 retries' do |
| 202 | + school_class = create(:school_class, code: '12-34-56', school:) |
| 203 | + allow(ForEducationCodeGenerator).to receive(:generate).and_return(*([school_class.code] * 5)) |
| 204 | + another_school_class = build(:school_class, school: school_class.school, code: nil) |
| 205 | + another_school_class.assign_class_code |
| 206 | + expect(another_school_class.errors[:code]).to include('could not be generated') |
| 207 | + end |
| 208 | + |
| 209 | + it 'does not add error if class code shared by class from another school' do |
| 210 | + school_class = create(:school_class, code: '12-34-56', school:) |
| 211 | + allow(ForEducationCodeGenerator).to receive(:generate).and_return(school_class.code) |
| 212 | + another_school_class = build(:school_class, school: build(:school), code: nil) |
| 213 | + another_school_class.assign_class_code |
| 214 | + expect(another_school_class.errors[:code]).to be_empty |
| 215 | + end |
| 216 | + end |
| 217 | + |
144 | 218 | describe 'auditing' do
|
145 | 219 | subject(:school_class) { create(:school_class, teacher_ids: [teacher.id], school:) }
|
146 | 220 |
|
|
0 commit comments