You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sqm-dashboards/spec/presenters/response_rate_presenter_spe...

263 lines
11 KiB

require "rails_helper"
describe ResponseRatePresenter do
let(:academic_year) { create(:academic_year, range: "2022-23") }
let(:school) { create(:school, name: "A school") }
let(:respondents) { create(:respondent, school:, academic_year:, total_students: 40, total_teachers: 40) }
let(:wrong_school) { create(:school, name: "Wrong school") }
let(:wrong_academic_year) { create(:academic_year) }
let(:wrong_respondents) do
create(:respondent, school: wrong_school, academic_year: wrong_academic_year, total_students: 40,
total_teachers: 40)
end
let(:today) { Date.today }
let(:yesterday) { Date.today - 1 }
let(:two_days_ago) { Date.today - 2 }
let(:three_days_ago) { Date.today - 3 }
let(:student_survey_item) { create(:student_survey_item) }
let(:teacher_survey_item) { create(:teacher_survey_item) }
let(:oldest_student_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: student_survey_item,
recorded_date: three_days_ago)
end
let(:newest_student_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: student_survey_item, recorded_date: yesterday)
end
let(:oldest_teacher_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item,
recorded_date: three_days_ago)
end
let(:newest_teacher_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item, recorded_date: yesterday)
end
let(:wrong_student_survey_response) do
create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year,
survey_item: student_survey_item, recorded_date: two_days_ago)
end
let(:wrong_teacher_survey_response) do
create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year,
survey_item: teacher_survey_item, recorded_date: two_days_ago)
end
let(:filler_survey_item_responses_to_meet_sufficiency) do
create_list(:survey_item_response, 10, school:, academic_year:,
survey_item: student_survey_item, recorded_date: two_days_ago)
end
context ".date" do
context "when focus is student" do
before :each do
oldest_student_survey_response
newest_student_survey_response
wrong_student_survey_response
wrong_teacher_survey_response
filler_survey_item_responses_to_meet_sufficiency
end
it "ignores all teacher items and only gets the modified date of the last student item" do
date = StudentResponseRatePresenter.new(academic_year:, school:).date
expect(date).to eq(newest_student_survey_response.recorded_date)
end
end
context "when focus is teacher" do
before :each do
oldest_teacher_survey_response
newest_teacher_survey_response
wrong_student_survey_response
wrong_teacher_survey_response
end
it "ignores all student responses and only gets the modified date of the last teacher item" do
date = TeacherResponseRatePresenter.new(academic_year:, school:).date
expect(date).to eq(newest_teacher_survey_response.recorded_date)
end
end
end
context ".percentage" do
before :each do
respondents
wrong_respondents
end
context "when no survey responses are found for a school" do
it "returns a response rate of 0" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(0)
end
end
context "when there all possible teacher respondents answered questions" do
before :each do
create_list(:survey_item_response, 40, school:, academic_year:,
survey_item: teacher_survey_item)
end
it "returns a response rate of 100" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
context "when more teachers responded than staff the school" do
before :each do
create_list(:survey_item_response, 80, school:, academic_year:,
survey_item: teacher_survey_item)
end
it "returns a response rate of 100" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
context "when three quarters of the teachers responded to the survey" do
before :each do
create_list(:survey_item_response, 30, school:, academic_year:,
survey_item: teacher_survey_item)
end
it "returns a response rate of 75" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(75)
end
end
context "when one quarter of the teachers responded to the survey" do
before :each do
create_list(:survey_item_response, 10, school:, academic_year:,
survey_item: teacher_survey_item)
end
it "returns a response rate of 25" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(25)
end
end
context "When the percentage is not a round number" do
before :each do
create_list(:survey_item_response, 9, school:, academic_year:,
survey_item: teacher_survey_item)
end
it "its rounded to the nearest integer" do
percentage = TeacherResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(23)
end
end
context "when there all possible student respondents answered questions" do
before :each do
create_list(:survey_item_response, 40, school:, academic_year:,
survey_item: student_survey_item)
end
it "returns a response rate of 100" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
context "when half of all students responded" do
before :each do
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item)
end
it "returns a response rate of 50" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(50)
end
end
context "when only a subset of grades was given the survey" do
before :each do
respondents.one = 20
respondents.two = 20
respondents.three = 20
respondents.four = 20
respondents.five = 20
respondents.save
end
context "and only first grade was given the survey" do
context "and all the first grade responded" do
before :each do
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
end
it "returns a response rate of 100" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
context "and half of first grade responded" do
before :each do
create_list(:survey_item_response, 10, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
end
it "returns a response rate of 50" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(50)
end
end
end
context "and two grades responded" do
context "and both grades responded fully" do
before :each do
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 2)
end
it "returns a response rate of 100" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
context "and half of first grade responded" do
before :each do
create_list(:survey_item_response, 10, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 2)
end
it "returns a response rate of 75" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(75)
end
end
context "and a quarter of first grade responded" do
before :each do
create_list(:survey_item_response, 5, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 2)
end
it "returns a response rate of 63 (rounded up from 62.5)" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(63)
end
end
end
context "and three grades responded" do
context "and all three grades responded fully" do
before :each do
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 1)
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 2)
create_list(:survey_item_response, 20, school:, academic_year:,
survey_item: student_survey_item, grade: 3)
end
it "returns a response rate of 100" do
percentage = StudentResponseRatePresenter.new(academic_year:, school:).percentage
expect(percentage).to eq(100)
end
end
end
end
end
end