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