diff --git a/app/models/response_rate.rb b/app/models/response_rate.rb index e287cd8c..1fde6a7c 100644 --- a/app/models/response_rate.rb +++ b/app/models/response_rate.rb @@ -9,6 +9,8 @@ module ResponseRate end def rate + return 100 if Respondent.where(school: @school, academic_year: @academic_year).count.zero? + return 0 unless survey_item_count.positive? average_responses_per_survey_item = response_count / survey_item_count.to_f diff --git a/app/presenters/subcategory_presenter.rb b/app/presenters/subcategory_presenter.rb index 7667c5c6..c978c38d 100644 --- a/app/presenters/subcategory_presenter.rb +++ b/app/presenters/subcategory_presenter.rb @@ -30,11 +30,14 @@ class SubcategoryPresenter end def student_response_rate - @subcategory.student_response_rate(school: @school, academic_year: @academic_year).rate + return 'N / A' if Respondent.where(school: @school, academic_year: @academic_year).count.zero? + + "#{@subcategory.student_response_rate(school: @school, academic_year: @academic_year).rate}%" end def teacher_response_rate - @subcategory.teacher_response_rate(school: @school, academic_year: @academic_year).rate + return 'N / A' if Respondent.where(school: @school, academic_year: @academic_year).count.zero? + "#{@subcategory.teacher_response_rate(school: @school, academic_year: @academic_year).rate}%" end def admin_collection_rate diff --git a/app/views/categories/_subcategory_section.html.erb b/app/views/categories/_subcategory_section.html.erb index 20a16710..c49a283c 100644 --- a/app/views/categories/_subcategory_section.html.erb +++ b/app/views/categories/_subcategory_section.html.erb @@ -16,11 +16,11 @@

school admin data sources

-

<%= subcategory.student_response_rate %>%

+

<%= subcategory.student_response_rate %>

of students responded

-

<%= subcategory.teacher_response_rate %>%

+

<%= subcategory.teacher_response_rate %>

of teachers responded

diff --git a/spec/models/response_rate_spec.rb b/spec/models/response_rate_spec.rb index ffde1e39..a679c238 100644 --- a/spec/models/response_rate_spec.rb +++ b/spec/models/response_rate_spec.rb @@ -3,9 +3,6 @@ require 'rails_helper' describe ResponseRate, type: :model do let(:school) { create(:school) } let(:academic_year) { create(:academic_year) } - let(:survey_respondents) do - create(:respondent, school:, academic_year:) - end describe StudentResponseRate do let(:subcategory) { create(:subcategory) } @@ -18,7 +15,6 @@ describe ResponseRate, type: :model do let(:sufficient_student_survey_item_2) { create(:student_survey_item, scale: sufficient_scale_2) } before :each do - survey_respondents create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: sufficient_teacher_survey_item, academic_year:, school:, likert_score: 1) create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD, survey_item: sufficient_student_survey_item_1, @@ -28,6 +24,7 @@ describe ResponseRate, type: :model do end context 'when a students take a regular survey' do before :each do + create(:respondent, school:, academic_year:) create(:survey, school:, academic_year:) end @@ -41,6 +38,7 @@ describe ResponseRate, type: :model do context 'when students take the short form survey' do before :each do + create(:respondent, school:, academic_year:) create(:survey, form: :short, school:, academic_year:) end @@ -67,6 +65,25 @@ describe ResponseRate, type: :model do end end end + + context 'when the average number of teacher responses is greater than the total possible responses' do + before do + create(:respondent, school:, academic_year:) + create(:survey, school:, academic_year:) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD * 11, survey_item: sufficient_student_survey_item_2, + academic_year:, school:, likert_score: 1) + end + it 'returns 100 percent' do + expect(StudentResponseRate.new(subcategory:, school:, + academic_year:).rate).to eq 100 + end + end + + context 'when no survey information exists for that school or year' do + it 'returns 100 percent' do + expect(StudentResponseRate.new(subcategory:, school:, academic_year:).rate).to eq 100 + end + end end describe TeacherResponseRate do @@ -81,7 +98,6 @@ describe ResponseRate, type: :model do let(:sufficient_student_survey_item_1) { create(:student_survey_item, scale: sufficient_scale_1) } before :each do - survey_respondents create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: sufficient_teacher_survey_item_1, academic_year:, school:, likert_score: 1) create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: sufficient_teacher_survey_item_2, @@ -91,6 +107,10 @@ describe ResponseRate, type: :model do end context 'when the average number of teacher responses per question in a subcategory is at the threshold' do + before :each do + create(:respondent, school:, academic_year:) + create(:survey, school:, academic_year:) + end it 'returns 25 percent' do expect(TeacherResponseRate.new(subcategory:, school:, academic_year:).rate).to eq 25 @@ -99,6 +119,8 @@ describe ResponseRate, type: :model do context 'when the teacher response rate is not a whole number. eg 29.166%' do before do + create(:respondent, school:, academic_year:) + create(:survey, school:, academic_year:) create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD + 1, survey_item: sufficient_teacher_survey_item_3, academic_year:, school:, likert_score: 1) end @@ -110,6 +132,8 @@ describe ResponseRate, type: :model do context 'when the average number of teacher responses is greater than the total possible responses' do before do + create(:respondent, school:, academic_year:) + create(:survey, school:, academic_year:) create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD * 11, survey_item: sufficient_teacher_survey_item_3, academic_year:, school:, likert_score: 1) end @@ -118,5 +142,12 @@ describe ResponseRate, type: :model do academic_year:).rate).to eq 100 end end + + context 'when no survey information exists for that school and academic_year' do + it 'returns 100 percent' do + expect(TeacherResponseRate.new(subcategory:, school:, + academic_year:).rate).to eq 100 + end + end end end diff --git a/spec/presenters/subcategory_presenter_spec.rb b/spec/presenters/subcategory_presenter_spec.rb index e2c0e16e..79878c19 100644 --- a/spec/presenters/subcategory_presenter_spec.rb +++ b/spec/presenters/subcategory_presenter_spec.rb @@ -68,11 +68,11 @@ describe SubcategoryPresenter do end it 'returns the student response rate' do - expect(subcategory_presenter.student_response_rate).to eq 25 + expect(subcategory_presenter.student_response_rate).to eq "25%" end it 'returns the teacher response rate' do - expect(subcategory_presenter.teacher_response_rate).to eq 50 + expect(subcategory_presenter.teacher_response_rate).to eq "50%" end it 'returns the admin collection rate' do