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...

161 lines
6.1 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(: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)
end
let(:newest_student_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: student_survey_item)
end
let(:oldest_teacher_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item)
end
let(:newest_teacher_survey_response) do
create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item)
end
let(:wrong_student_survey_response) do
create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year,
survey_item: student_survey_item)
end
let(:wrong_teacher_survey_response) do
create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year,
survey_item: teacher_survey_item)
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
end
it 'ignores all teacher items and only gets the modified date of the last student item' do
rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).date
expect(rdate).to eq(newest_student_survey_response.updated_at)
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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).date
expect(rdate).to eq(newest_teacher_survey_response.updated_at)
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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).percentage
expect(rdate).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
rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).percentage
expect(rdate).to eq(50)
end
end
end
end