Skip to content

Commit ef732ad

Browse files
committed
Propagate student listing errors in member lists
1 parent a135a63 commit ef732ad

4 files changed

Lines changed: 53 additions & 6 deletions

File tree

lib/concepts/class_member/operations/list.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ def call(school_class:, class_students:, token:)
1010
begin
1111
school = school_class.school
1212
student_ids = class_students.pluck(:student_id)
13-
students = SchoolStudent::List.call(school:, token:, student_ids:).fetch(:school_students, [])
13+
students_response = SchoolStudent::List.call(school:, token:, student_ids:)
14+
return failure_response(response, students_response[:error]) if students_response.failure?
15+
16+
students = students_response.fetch(:school_students, [])
1417
class_students.each do |member|
1518
member.student = students.find { |student| student.id == member.student_id }
1619
end
@@ -29,6 +32,13 @@ def call(school_class:, class_students:, token:)
2932

3033
response
3134
end
35+
36+
private
37+
38+
def failure_response(response, error)
39+
response[:error] = error
40+
response
41+
end
3242
end
3343
end
3444
end

lib/concepts/school_member/list.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ def call(school:, token:)
1515
response[:school_members] = []
1616

1717
begin
18-
students = fetch_students(school:, token:)
18+
students_response = fetch_students(school:, token:)
19+
return failure_response(response, students_response[:error]) if students_response.failure?
20+
21+
students = build_student_members(students_response.fetch(:school_students, []))
1922
teachers = fetch_teachers(school:)
2023
owners = fetch_owners(school:)
2124

@@ -38,9 +41,11 @@ def call(school:, token:)
3841
def fetch_students(school:, token:)
3942
student_roles = Role.student.where(school:)
4043

41-
students_response = student_roles.any? ? SchoolStudent::List.call(school:, token:).fetch(:school_students, []) : []
44+
student_roles.any? ? SchoolStudent::List.call(school:, token:) : OperationResponse[school_students: []]
45+
end
4246

43-
students_response.map do |student|
47+
def build_student_members(students)
48+
students.map do |student|
4449
SchoolMember.new(student.id, student.name, student.username, student.email, :student, student.sso_providers)
4550
end
4651
end
@@ -60,6 +65,11 @@ def fetch_owners(school:)
6065
SchoolMember.new(owner.id, owner.name, nil, owner.email, :owner, [])
6166
end
6267
end
68+
69+
def failure_response(response, error)
70+
response[:error] = error
71+
response
72+
end
6373
end
6474
end
6575
end

spec/concepts/class_member/list_spec.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,23 @@
7272
expect(Sentry).to have_received(:capture_exception).with(instance_of(StandardError))
7373
end
7474

75+
it 'propagates student listing operation errors' do
76+
students.each do |student|
77+
create(:class_student, school_class:, student_id: student.id)
78+
end
79+
allow(SchoolStudent::List).to receive(:call).and_return(
80+
OperationResponse[error: 'Error listing school students: Some API error']
81+
)
82+
83+
response = described_class.call(school_class:, class_students:, token:)
84+
85+
expect(response.failure?).to be(true)
86+
expect(response[:error]).to eq('Error listing school students: Some API error')
87+
expect(response[:class_members]).to eq([])
88+
end
89+
7590
it 'returns an empty array when no ids match' do
76-
allow(SchoolStudent::List).to receive(:call).and_return({ school_students: [] })
91+
allow(SchoolStudent::List).to receive(:call).and_return(OperationResponse[school_students: []])
7792
allow(SchoolTeacher::List).to receive(:call).and_return({ school_teachers: [] })
7893

7994
response = described_class.call(school_class:, class_students:, token:)

spec/concepts/school_member/list_spec.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,20 @@
114114
expect(Sentry).to have_received(:capture_exception).with(instance_of(StandardError))
115115
end
116116

117+
it 'propagates student listing operation errors' do
118+
allow(SchoolStudent::List).to receive(:call).and_return(
119+
OperationResponse[error: 'Error listing school students: Some API error']
120+
)
121+
122+
response = described_class.call(school:, token:)
123+
124+
expect(response.failure?).to be(true)
125+
expect(response[:error]).to eq('Error listing school students: Some API error')
126+
expect(response[:school_members]).to eq([])
127+
end
128+
117129
it 'returns an empty array when no ids match' do
118-
allow(SchoolStudent::List).to receive(:call).and_return({ school_students: [] })
130+
allow(SchoolStudent::List).to receive(:call).and_return(OperationResponse[school_students: []])
119131
allow(SchoolTeacher::List).to receive(:call).and_return({ school_teachers: [] })
120132

121133
response = described_class.call(school:, token:)

0 commit comments

Comments
 (0)