@@ -373,4 +373,89 @@ def create_school_student
373
373
described_class . create_school_student ( token :, username :, password :, name :, school :)
374
374
end
375
375
end
376
+
377
+ describe '.list_school_student' do
378
+ let ( :school ) { build ( :school , id : SecureRandom . uuid ) }
379
+ let ( :list_students_url ) { "#{ api_url } /api/v1/schools/#{ school . id } /students/list" }
380
+
381
+ before do
382
+ stub_request ( :post , list_students_url ) . to_return ( status : 200 , body : '[]' )
383
+ end
384
+
385
+ it 'makes a request to the profile api host' do
386
+ list_school_students
387
+ expect ( WebMock ) . to have_requested ( :post , list_students_url )
388
+ end
389
+
390
+ it 'includes token in the authorization request header' do
391
+ list_school_students
392
+ expect ( WebMock ) . to have_requested ( :post , list_students_url ) . with ( headers : { authorization : "Bearer #{ token } " } )
393
+ end
394
+
395
+ it 'includes the profile api key in the x-api-key request header' do
396
+ list_school_students
397
+ expect ( WebMock ) . to have_requested ( :post , list_students_url ) . with ( headers : { 'x-api-key' => api_key } )
398
+ end
399
+
400
+ it 'sets content-type of request to json' do
401
+ list_school_students
402
+ expect ( WebMock ) . to have_requested ( :post , list_students_url ) . with ( headers : { 'content-type' => 'application/json' } )
403
+ end
404
+
405
+ it 'sets accept header to json' do
406
+ list_school_students
407
+ expect ( WebMock ) . to have_requested ( :post , list_students_url ) . with ( headers : { 'accept' => 'application/json' } )
408
+ end
409
+
410
+ it 'sets body to the IDs of the students in the school' do
411
+ student_role = Role . student . create! ( school :, user_id : SecureRandom . uuid )
412
+ Role . teacher . create! ( school :, user_id : SecureRandom . uuid )
413
+ Role . owner . create! ( school :, user_id : SecureRandom . uuid )
414
+ list_school_students
415
+ expect ( WebMock ) . to have_requested ( :post , list_students_url ) . with ( body : [ student_role . user_id ] )
416
+ end
417
+
418
+ # rubocop:disable RSpec/ExampleLength
419
+ it 'returns a hash representing the student(s) if successful' do
420
+ response = [
421
+ {
422
+ id : '549e4674-6ffd-4ac6-9a97-b4d7e5c0e5c5' ,
423
+ schoolId : '132383f1-702a-46a0-9eb2-a40dd4f212e3' ,
424
+ name : 'student-name' ,
425
+ username : 'student-username' ,
426
+ createdAt : '2024-07-03T13:00:40.041Z' ,
427
+ updatedAt : '2024-07-03T13:00:40.041Z' ,
428
+ discardedAt : nil
429
+ }
430
+ ]
431
+ stub_request ( :post , list_students_url )
432
+ . to_return ( status : 200 , body : response . to_json )
433
+ expect ( list_school_students ) . to eq ( response )
434
+ end
435
+ # rubocop:enable RSpec/ExampleLength
436
+
437
+ it "returns empty array if the API returns a 404 because one or more of the student IDs aren't found" do
438
+ stub_request ( :post , list_students_url )
439
+ . to_return ( status : 404 , body : '' )
440
+ expect ( list_school_students ) . to eq ( [ ] )
441
+ end
442
+
443
+ it 'raises exception if anything other than a 200 status code is returned' do
444
+ stub_request ( :post , list_students_url )
445
+ . to_return ( status : 500 )
446
+
447
+ expect { list_school_students } . to raise_error ( RuntimeError )
448
+ end
449
+
450
+ it 'includes details of underlying response when exception is raised' do
451
+ stub_request ( :post , list_students_url )
452
+ . to_return ( status : 401 )
453
+
454
+ expect { list_school_students } . to raise_error ( 'Students cannot be listed in Profile API. HTTP response code: 401' )
455
+ end
456
+
457
+ def list_school_students
458
+ described_class . list_school_students ( token :, school :)
459
+ end
460
+ end
376
461
end
0 commit comments