diff --git a/app/presenters/response_rate_presenter.rb b/app/presenters/response_rate_presenter.rb index 14e1c5fb..bcb44a53 100644 --- a/app/presenters/response_rate_presenter.rb +++ b/app/presenters/response_rate_presenter.rb @@ -5,12 +5,17 @@ class ResponseRatePresenter @focus = focus @academic_year = academic_year @school = school - @survey_items = SurveyItem.student_survey_items if focus == :student + if focus == :student + @survey_items = Measure.all.flat_map do |measure| + measure.student_survey_items_with_sufficient_responses(school:, academic_year:) + end + end @survey_items = SurveyItem.teacher_survey_items if focus == :teacher end def date - SurveyItemResponse.where(survey_item: survey_items, school:).order(updated_at: :DESC).first&.updated_at || Date.new + SurveyItemResponse.where(survey_item: survey_items, school:, + academic_year:).order(recorded_date: :DESC).first&.recorded_date || Date.today end def percentage @@ -20,11 +25,11 @@ class ResponseRatePresenter end def color - percentage > 75 ? 'purple' : 'gold' + percentage > 75 ? "purple" : "gold" end def hover_message - "Percentages based on #{ actual_count } out of #{ respondents_count.round } #{ focus }s completing at least 25% of the survey." + "Percentages based on #{actual_count} out of #{respondents_count.round} #{focus}s completing at least 25% of the survey." end private diff --git a/spec/presenters/response_rate_presenter_spec.rb b/spec/presenters/response_rate_presenter_spec.rb index b467ffa7..ebe3b0d6 100644 --- a/spec/presenters/response_rate_presenter_spec.rb +++ b/spec/presenters/response_rate_presenter_spec.rb @@ -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 - percentage = ResponseRatePresenter.new(focus: :student, academic_year:, school:).date - expect(percentage).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 + date = ResponseRatePresenter.new(focus: :student, academic_year:, school:).date + expect(date).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 - percentage = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).date - expect(percentage).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 + date = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).date + expect(date).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