@ -1,55 +1,67 @@
require 'rails_helper'
require " rails_helper "
describe ResponseRatePresenter do
let ( :academic_year ) { create ( :academic_year , range : '2022-23' ) }
let ( :school ) { create ( :school , name : 'A school' ) }
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_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 )
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 )
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 )
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 )
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 )
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 )
survey_item : teacher_survey_item , recorded_date : two_days_ago )
end
context '.date' do
context 'when focus is student' do
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
percentag e = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . date
expect ( percentag e) . to eq ( newest_student_survey_response . updated_at )
it " ignores all teacher items and only gets the modified date of the last student item " do
dat e = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . date
expect ( dat e) . to eq ( newest_student_survey_response . recorded_date )
end
end
context 'when focus is teacher' do
context " when focus is teacher " do
before :each do
oldest_teacher_survey_response
newest_teacher_survey_response
@ -57,107 +69,107 @@ describe ResponseRatePresenter do
wrong_teacher_survey_response
end
it 'ignores all student responses and only gets the modified date of the last teacher item' do
percentag e = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . date
expect ( percentag e) . to eq ( newest_teacher_survey_response . updated_at )
it " ignores all student responses and only gets the modified date of the last teacher item " do
dat e = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . date
expect ( dat e) . to eq ( newest_teacher_survey_response . recorded_date )
end
end
end
context '.percentage' do
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
context " when no survey responses are found for a school " do
it " returns a response rate of 0 " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 0 )
end
end
context 'when there all possible teacher respondents answered questions' do
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end
end
context 'when more teachers responded than staff the school' do
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end
end
context 'when three quarters of the teachers responded to the survey' do
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
it " returns a response rate of 75 " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 75 )
end
end
context 'when one quarter of the teachers responded to the survey' do
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
it " returns a response rate of 25 " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 25 )
end
end
context 'When the percentage is not a round number' do
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
it " its rounded to the nearest integer " do
percentage = ResponseRatePresenter . new ( focus : :teacher , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 23 )
end
end
context 'when there all possible student respondents answered questions' do
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end
end
context 'when half of all students responded' do
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
it " returns a response rate of 50 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 50 )
end
end
context 'when only a subset of grades was given the survey' do
context " when only a subset of grades was given the survey " do
before :each do
respondents . one = 20
respondents . two = 20
@ -166,71 +178,71 @@ describe ResponseRatePresenter do
respondents . five = 20
respondents . save
end
context 'and only first grade was given the survey' do
context 'and all the first grade responded' do
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end
end
context 'and half of first grade responded' do
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
it " returns a response rate of 50 " do
percentage = ResponseRatePresenter . new ( focus : :student , 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
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end
end
context 'and half of first grade responded' do
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
it " returns a response rate of 75 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 75 )
end
end
context 'and a quarter of first grade responded' do
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
it " returns a response rate of 63 (rounded up from 62.5) " do
percentage = ResponseRatePresenter . new ( focus : :student , 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
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 )
@ -239,7 +251,7 @@ describe ResponseRatePresenter do
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
it " returns a response rate of 100 " do
percentage = ResponseRatePresenter . new ( focus : :student , academic_year : , school : ) . percentage
expect ( percentage ) . to eq ( 100 )
end