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