Skip to content

Commit 218bda0

Browse files
committed
fixing ability and adding feedback delte tests
1 parent f10006d commit 218bda0

2 files changed

Lines changed: 106 additions & 1 deletion

File tree

app/models/ability.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def define_school_owner_abilities(school:)
6969
can(%i[read create create_batch update destroy], :school_student)
7070
can(%i[create create_copy], Lesson, school_id: school.id)
7171
can(%i[read update destroy], Lesson, school_id: school.id, visibility: %w[teachers students public])
72-
can(%i[read destroy], Feedback, school_id: school.id)
72+
can(%i[read destroy], Feedback, school_project: { school_id: school.id })
7373
can(%i[exchange_code], :google_auth)
7474
end
7575

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'Delete feedback requests', type: :request do
6+
let(:headers) { { Authorization: UserProfileMock::TOKEN } }
7+
let(:school) { create(:school) }
8+
let(:student) { create(:student, school:) }
9+
let(:teacher) { create(:teacher, school:) }
10+
let(:school_class) { create(:school_class, teacher_ids: [teacher.id], school:) }
11+
let(:class_student) { create(:class_student, school_class:, student_id: student.id) }
12+
let(:lesson) { create(:lesson, school:, school_class:, user_id: teacher.id, visibility: 'students') }
13+
let(:teacher_project) { create(:project, user_id: teacher.id, school:, lesson:) }
14+
let(:student_project) { create(:project, user_id: class_student.student_id, school:, parent: teacher_project) }
15+
let!(:feedback) { create(:feedback, school_project: student_project.school_project, user_id: teacher.id, content: 'Excellent work!') }
16+
17+
context 'when logged in as the class teacher' do
18+
before do
19+
authenticated_in_hydra_as(teacher)
20+
end
21+
22+
context 'when deleting feedback on student work' do
23+
before do
24+
delete("/api/projects/#{student_project.identifier}/feedback/#{feedback.id}", headers:)
25+
student_project.reload
26+
end
27+
28+
it 'returns no content response' do
29+
expect(response).to have_http_status(:no_content)
30+
end
31+
32+
it 'removes the feedback from the school project' do
33+
expect(student_project.school_project.feedback.count).to eq(0)
34+
end
35+
end
36+
37+
context 'when attempting to delete non-existent feedback' do
38+
before do
39+
delete("/api/projects/#{student_project.identifier}/feedback/invalid-id", headers:)
40+
end
41+
42+
it 'returns unprocessable entity response' do
43+
expect(response).to have_http_status(:not_found)
44+
end
45+
46+
it 'returns an error message' do
47+
data = JSON.parse(response.body, symbolize_names: true)
48+
expect(data[:error]).to match(/Couldn't find Feedback with 'id'="invalid-id"/)
49+
end
50+
end
51+
end
52+
53+
context 'when logged in as the school owner' do
54+
let(:owner) { create(:owner, school:) }
55+
before do
56+
authenticated_in_hydra_as(owner)
57+
delete("/api/projects/#{student_project.identifier}/feedback/#{feedback.id}", headers:)
58+
student_project.reload
59+
end
60+
61+
it 'returns no content response' do
62+
expect(response).to have_http_status(:no_content)
63+
end
64+
65+
it 'removes the feedback from the school project' do
66+
expect(student_project.school_project.feedback.count).to eq(0)
67+
end
68+
end
69+
70+
context 'when logged in as a teacher not in the class' do
71+
let(:other_teacher) { create(:teacher, school:) }
72+
before do
73+
authenticated_in_hydra_as(other_teacher)
74+
delete("/api/projects/#{student_project.identifier}/feedback/#{feedback.id}", headers:)
75+
student_project.reload
76+
end
77+
78+
it 'returns forbidden response' do
79+
expect(response).to have_http_status(:forbidden)
80+
end
81+
82+
it 'does not remove the feedback from the school project' do
83+
expect(student_project.school_project.feedback.count).to eq(1)
84+
end
85+
end
86+
87+
context 'when logged in as a school student' do
88+
before do
89+
authenticated_in_hydra_as(student)
90+
delete("/api/projects/#{student_project.identifier}/feedback/#{feedback.id}", headers:)
91+
end
92+
93+
it 'returns forbidden response' do
94+
expect(response).to have_http_status(:forbidden)
95+
end
96+
97+
it 'does not remove the feedback from the school project' do
98+
expect(student_project.school_project.feedback.count).to eq(1)
99+
end
100+
end
101+
end
102+
103+
104+
105+

0 commit comments

Comments
 (0)