|
201 | 201 | end |
202 | 202 | end |
203 | 203 |
|
| 204 | + describe Course::CourseUserTypeConcern do |
| 205 | + let(:course) { create(:course) } |
| 206 | + let!(:group_manager) { create(:course_manager, course: course) } |
| 207 | + let!(:student) { create(:course_student, course: course) } |
| 208 | + let!(:phantom_student) { create(:course_student, :phantom, course: course) } |
| 209 | + let!(:ta) { create(:course_teaching_assistant, course: course) } |
| 210 | + let!(:phantom_ta) { create(:course_teaching_assistant, :phantom, course: course) } |
| 211 | + let!(:group) do |
| 212 | + grp = create(:course_group, course: course) |
| 213 | + create(:course_group_manager, course: course, group: grp, course_user: group_manager) |
| 214 | + create(:course_group_student, course: course, group: grp, course_user: student) |
| 215 | + create(:course_group_student, course: course, group: grp, course_user: phantom_student) |
| 216 | + grp |
| 217 | + end |
| 218 | + |
| 219 | + describe '.valid_course_user_type?' do |
| 220 | + it 'returns true for all valid type strings' do |
| 221 | + %w[students students_w_phantom my_students my_students_w_phantom staff staff_w_phantom].each do |type| |
| 222 | + expect(Course.valid_course_user_type?(type)).to be true |
| 223 | + end |
| 224 | + end |
| 225 | + |
| 226 | + it 'returns false for nil' do |
| 227 | + expect(Course.valid_course_user_type?(nil)).to be false |
| 228 | + end |
| 229 | + |
| 230 | + it 'returns false for unknown strings' do |
| 231 | + expect(Course.valid_course_user_type?('invalid')).to be false |
| 232 | + end |
| 233 | + |
| 234 | + it 'returns false for symbol versions of valid types' do |
| 235 | + expect(Course.valid_course_user_type?(:students)).to be false |
| 236 | + end |
| 237 | + end |
| 238 | + |
| 239 | + describe '#course_users_by_type' do |
| 240 | + context 'when user is a course user' do |
| 241 | + it "returns non-phantom students for 'students'" do |
| 242 | + result = course.course_users_by_type('students', group_manager) |
| 243 | + expect(result).to include(student) |
| 244 | + expect(result).not_to include(phantom_student, ta) |
| 245 | + end |
| 246 | + |
| 247 | + it "returns all students including phantoms for 'students_w_phantom'" do |
| 248 | + result = course.course_users_by_type('students_w_phantom', group_manager) |
| 249 | + expect(result).to include(student, phantom_student) |
| 250 | + expect(result).not_to include(ta) |
| 251 | + end |
| 252 | + |
| 253 | + it "returns non-phantom group students for 'my_students'" do |
| 254 | + result = course.course_users_by_type('my_students', group_manager) |
| 255 | + expect(result).to include(student) |
| 256 | + expect(result).not_to include(phantom_student, ta) |
| 257 | + end |
| 258 | + |
| 259 | + it "returns all group students including phantoms for 'my_students_w_phantom'" do |
| 260 | + result = course.course_users_by_type('my_students_w_phantom', group_manager) |
| 261 | + expect(result).to include(student, phantom_student) |
| 262 | + expect(result).not_to include(ta) |
| 263 | + end |
| 264 | + |
| 265 | + it "returns non-phantom staff for 'staff'" do |
| 266 | + result = course.course_users_by_type('staff', group_manager) |
| 267 | + expect(result).to include(ta) |
| 268 | + expect(result).not_to include(phantom_ta, student) |
| 269 | + end |
| 270 | + |
| 271 | + it "returns all staff including phantoms for 'staff_w_phantom'" do |
| 272 | + result = course.course_users_by_type('staff_w_phantom', group_manager) |
| 273 | + expect(result).to include(ta, phantom_ta) |
| 274 | + expect(result).not_to include(student) |
| 275 | + end |
| 276 | + |
| 277 | + it 'defaults to non-phantom students for unknown types' do |
| 278 | + result = course.course_users_by_type(nil, group_manager) |
| 279 | + expect(result).to include(student) |
| 280 | + expect(result).not_to include(phantom_student, ta) |
| 281 | + end |
| 282 | + end |
| 283 | + |
| 284 | + # Regression: admins not enrolled in a course have nil as current_course_user, |
| 285 | + # which previously caused a 500 when the old CourseUser#users_in_course_by_type |
| 286 | + # was called on nil. |
| 287 | + context 'when user is nil (e.g. a system administrator not enrolled in the course)' do |
| 288 | + it "returns non-phantom students for 'students'" do |
| 289 | + result = course.course_users_by_type('students', nil) |
| 290 | + expect(result).to include(student) |
| 291 | + expect(result).not_to include(phantom_student, ta) |
| 292 | + end |
| 293 | + |
| 294 | + it "returns all students including phantoms for 'students_w_phantom'" do |
| 295 | + result = course.course_users_by_type('students_w_phantom', nil) |
| 296 | + expect(result).to include(student, phantom_student) |
| 297 | + expect(result).not_to include(ta) |
| 298 | + end |
| 299 | + |
| 300 | + it "returns an empty result for 'my_students'" do |
| 301 | + result = course.course_users_by_type('my_students', nil) |
| 302 | + expect(result).to be_a(ActiveRecord::Relation) |
| 303 | + expect(result).to be_empty |
| 304 | + end |
| 305 | + |
| 306 | + it "returns an empty result for 'my_students_w_phantom'" do |
| 307 | + result = course.course_users_by_type('my_students_w_phantom', nil) |
| 308 | + expect(result).to be_a(ActiveRecord::Relation) |
| 309 | + expect(result).to be_empty |
| 310 | + end |
| 311 | + |
| 312 | + it "returns non-phantom staff for 'staff'" do |
| 313 | + result = course.course_users_by_type('staff', nil) |
| 314 | + expect(result).to include(ta) |
| 315 | + expect(result).not_to include(phantom_ta, student) |
| 316 | + end |
| 317 | + |
| 318 | + it "returns all staff including phantoms for 'staff_w_phantom'" do |
| 319 | + result = course.course_users_by_type('staff_w_phantom', nil) |
| 320 | + expect(result).to include(ta, phantom_ta) |
| 321 | + expect(result).not_to include(student) |
| 322 | + end |
| 323 | + |
| 324 | + it 'defaults to non-phantom students for unknown types' do |
| 325 | + result = course.course_users_by_type(nil, nil) |
| 326 | + expect(result).to include(student) |
| 327 | + expect(result).not_to include(phantom_student, ta) |
| 328 | + end |
| 329 | + end |
| 330 | + end |
| 331 | + end |
| 332 | + |
204 | 333 | describe 'calculated attributes' do |
205 | 334 | let(:course) { create(:course) } |
206 | 335 | let!(:course_users) { create_list(:course_user, 2, course: course) } |
|
0 commit comments