Skip to content

Commit 4feccd1

Browse files
committed
Propagate student listing errors in member lists for completion
1 parent b0c86ae commit 4feccd1

4 files changed

Lines changed: 47 additions & 6 deletions

File tree

lib/concepts/class_member/operations/list.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ 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+
if students_response.failure?
15+
response[:error] = students_response[:error]
16+
return response
17+
end
18+
19+
students = students_response.fetch(:school_students, [])
1420
class_students.each do |member|
1521
member.student = students.find { |student| student.id == member.student_id }
1622
end

lib/concepts/school_member/list.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ 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+
if students_response.failure?
20+
response[:error] = students_response[:error]
21+
return response
22+
end
23+
24+
students = build_student_members(students_response.fetch(:school_students, []))
1925
teachers = fetch_teachers(school:)
2026
owners = fetch_owners(school:)
2127

@@ -38,9 +44,11 @@ def call(school:, token:)
3844
def fetch_students(school:, token:)
3945
student_roles = Role.student.where(school:)
4046

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

43-
students_response.map do |student|
50+
def build_student_members(students)
51+
students.map do |student|
4452
SchoolMember.new(student.id, student.name, student.username, student.email, :student, student.sso_providers)
4553
end
4654
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)