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.
263 lines
11 KiB
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
|