|
6 | 6 | let(:student) { create(:student, school:) } |
7 | 7 | let(:teacher) { create(:teacher, school:) } |
8 | 8 | let(:school) { create(:school, creator_id: SecureRandom.uuid) } |
| 9 | + let!(:us_school) { create(:school, country_code: 'US', district_name: 'Some District', district_nces_id: '010000000001', creator_id: SecureRandom.uuid) } |
| 10 | + let!(:ireland_school) { create(:school, country_code: 'IE', school_roll_number: '01572D', creator_id: SecureRandom.uuid) } |
9 | 11 |
|
10 | 12 | describe 'associations' do |
11 | 13 | it 'has many classes' do |
|
138 | 140 | expect(school).to be_valid |
139 | 141 | end |
140 | 142 |
|
141 | | - it 'requires reference for UK schools' do |
| 143 | + it 'does not requires reference for UK schools' do |
142 | 144 | school.country_code = 'GB' |
143 | 145 | school.reference = nil |
144 | | - expect(school).not_to be_valid |
145 | | - expect(school.errors[:reference]).to include("can't be blank") |
| 146 | + expect(school).to be_valid |
146 | 147 | end |
147 | 148 |
|
148 | 149 | it 'requires references to be unique if provided' do |
|
191 | 192 | expect { new_school.save! }.not_to raise_error |
192 | 193 | end |
193 | 194 |
|
194 | | - it 'does not require a district_nces_id for non-US schools' do |
| 195 | + it 'does not require a district_nces_id for UK schools' do |
195 | 196 | school.country_code = 'GB' |
196 | 197 | school.district_nces_id = nil |
197 | 198 | expect(school).to be_valid |
198 | 199 | end |
199 | 200 |
|
200 | | - it 'requires district_nces_id for US schools' do |
201 | | - school.country_code = 'US' |
| 201 | + it 'does not require a district_nces_id for CA schools' do |
| 202 | + school.country_code = 'CA' |
| 203 | + school.district_name = 'Some District' |
202 | 204 | school.district_nces_id = nil |
203 | | - expect(school).not_to be_valid |
204 | | - expect(school.errors[:district_nces_id]).to include("can't be blank") |
| 205 | + expect(school).to be_valid |
205 | 206 | end |
206 | 207 |
|
207 | | - it 'requires district_nces_id to be unique if provided' do |
208 | | - school.district_nces_id = '010000000001' |
209 | | - school.save! |
| 208 | + it 'requires district_nces_id for US schools' do |
| 209 | + us_school.district_nces_id = nil |
| 210 | + expect(us_school).not_to be_valid |
| 211 | + expect(us_school.errors[:district_nces_id]).to include("can't be blank") |
| 212 | + end |
| 213 | + |
| 214 | + it 'requires district_name for US schools' do |
| 215 | + us_school.district_name = nil |
| 216 | + expect(us_school).not_to be_valid |
| 217 | + expect(us_school.errors[:district_name]).to include("can't be blank") |
| 218 | + end |
| 219 | + |
| 220 | + it 'does not require district_name for non-US schools' do |
| 221 | + school.district_name = nil |
| 222 | + expect(school).to be_valid |
| 223 | + end |
| 224 | + |
| 225 | + it 'does not require district_name for CA schools' do |
| 226 | + school.country_code = 'CA' |
| 227 | + school.district_name = nil |
| 228 | + expect(school).to be_valid |
| 229 | + end |
210 | 230 |
|
211 | | - duplicate_school = build(:school, district_nces_id: '010000000001') |
| 231 | + it 'requires district_nces_id to be unique if provided' do |
| 232 | + duplicate_school = build(:school, country_code: 'US', district_nces_id: '010000000001') |
212 | 233 | expect(duplicate_school).not_to be_valid |
213 | 234 | end |
214 | 235 |
|
215 | 236 | it 'accepts a valid district_nces_id format (12 digits)' do |
216 | | - school.district_nces_id = '010000000001' |
217 | | - expect(school).to be_valid |
| 237 | + us_school.district_nces_id = '010000000001' |
| 238 | + expect(us_school).to be_valid |
218 | 239 | end |
219 | 240 |
|
220 | 241 | it 'rejects a district_nces_id with non-digit characters' do |
221 | | - school.district_nces_id = '01000000000A' |
222 | | - expect(school).not_to be_valid |
223 | | - expect(school.errors[:district_nces_id]).to include('must be 12 digits (e.g., 010000000001)') |
| 242 | + us_school.district_nces_id = '01000000000A' |
| 243 | + expect(us_school).not_to be_valid |
| 244 | + expect(us_school.errors[:district_nces_id]).to include('must be 12 digits (e.g., 010000000001)') |
224 | 245 | end |
225 | 246 |
|
226 | 247 | it 'rejects a district_nces_id with wrong length' do |
227 | | - school.district_nces_id = '12345678901' |
228 | | - expect(school).not_to be_valid |
229 | | - expect(school.errors[:district_nces_id]).to include('must be 12 digits (e.g., 010000000001)') |
| 248 | + us_school.district_nces_id = '12345678901' |
| 249 | + expect(us_school).not_to be_valid |
| 250 | + expect(us_school.errors[:district_nces_id]).to include('must be 12 digits (e.g., 010000000001)') |
230 | 251 | end |
231 | 252 |
|
232 | 253 | it 'allows district_nces_id reuse when original school is rejected' do |
233 | | - school.district_nces_id = '010000000001' |
234 | | - school.save! |
235 | | - school.reject |
| 254 | + us_school.district_nces_id = '010000000001' |
| 255 | + us_school.reject |
236 | 256 |
|
237 | 257 | new_school = build(:school, district_nces_id: '010000000001') |
238 | 258 | expect(new_school).to be_valid |
|
246 | 266 | end |
247 | 267 |
|
248 | 268 | it 'requires school_roll_number for Ireland schools' do |
249 | | - school.country_code = 'IE' |
250 | | - school.school_roll_number = nil |
251 | | - expect(school).not_to be_valid |
252 | | - expect(school.errors[:school_roll_number]).to include("can't be blank") |
| 269 | + ireland_school.school_roll_number = nil |
| 270 | + expect(ireland_school).not_to be_valid |
| 271 | + expect(ireland_school.errors[:school_roll_number]).to include("can't be blank") |
253 | 272 | end |
254 | 273 |
|
255 | 274 | it 'requires school_roll_number to be unique if provided' do |
256 | | - school.school_roll_number = '01572D' |
257 | | - school.save! |
258 | | - |
259 | | - duplicate_school = build(:school, school_roll_number: '01572d') |
| 275 | + duplicate_school = build(:school, school_roll_number: '01572D', country_code: 'IE') |
260 | 276 | expect(duplicate_school).not_to be_valid |
261 | 277 | end |
262 | 278 |
|
263 | 279 | it 'accepts a valid alphanumeric school_roll_number' do |
264 | | - school.school_roll_number = '01572D' |
265 | | - expect(school).to be_valid |
| 280 | + ireland_school.school_roll_number = '01572D' |
| 281 | + expect(ireland_school).to be_valid |
266 | 282 | end |
267 | 283 |
|
268 | 284 | it 'accepts a school_roll_number with one or more letters' do |
269 | | - school.school_roll_number = '12345ABC' |
270 | | - expect(school).to be_valid |
| 285 | + ireland_school.school_roll_number = '12345ABC' |
| 286 | + expect(ireland_school).to be_valid |
271 | 287 | end |
272 | 288 |
|
273 | 289 | it 'rejects a school_roll_number with only numbers' do |
274 | | - school.school_roll_number = '01572' |
275 | | - expect(school).not_to be_valid |
276 | | - expect(school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
| 290 | + ireland_school.school_roll_number = '01572' |
| 291 | + expect(ireland_school).not_to be_valid |
| 292 | + expect(ireland_school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
277 | 293 | end |
278 | 294 |
|
279 | 295 | it 'rejects a school_roll_number with only letters' do |
280 | | - school.school_roll_number = 'ABCDE' |
281 | | - expect(school).not_to be_valid |
282 | | - expect(school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
| 296 | + ireland_school.school_roll_number = 'ABCDE' |
| 297 | + expect(ireland_school).not_to be_valid |
| 298 | + expect(ireland_school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
283 | 299 | end |
284 | 300 |
|
285 | 301 | it 'rejects a school_roll_number with special characters' do |
286 | | - school.school_roll_number = '01572-D' |
287 | | - expect(school).not_to be_valid |
288 | | - expect(school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
| 302 | + ireland_school.school_roll_number = '01572-D' |
| 303 | + expect(ireland_school).not_to be_valid |
| 304 | + expect(ireland_school.errors[:school_roll_number]).to include('must be numbers followed by letters (e.g., 01572D)') |
289 | 305 | end |
290 | 306 |
|
291 | 307 | it 'normalizes blank school_roll_number to nil' do |
|
301 | 317 | end |
302 | 318 |
|
303 | 319 | it 'allows school_roll_number reuse when original school is rejected' do |
304 | | - school.school_roll_number = '01572D' |
305 | | - school.save! |
306 | | - school.reject |
| 320 | + ireland_school.reject |
307 | 321 |
|
308 | | - new_school = build(:school, school_roll_number: '01572D') |
| 322 | + new_school = build(:school, school_roll_number: '01572D', country_code: 'IE') |
309 | 323 | expect(new_school).to be_valid |
310 | 324 | expect { new_school.save! }.not_to raise_error |
311 | 325 | end |
|
0 commit comments