From f3c632ea2a0f49e6182e9eb06ae0bad8c0653c98 Mon Sep 17 00:00:00 2001 From: Liam Morley Date: Thu, 28 Oct 2021 08:47:08 -0400 Subject: [PATCH] Take sufficient data requirements into account when calculating score for subcategory --- app/models/survey_item_response.rb | 6 +++-- spec/models/survey_item_response_spec.rb | 33 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb index a6572203..f108ecfc 100644 --- a/app/models/survey_item_response.rb +++ b/app/models/survey_item_response.rb @@ -9,13 +9,15 @@ class SurveyItemResponse < ActiveRecord::Base scope :for_measure, ->(measure) { joins(:survey_item).where('survey_items.measure_id': measure.id) } def self.score_for_subcategory(subcategory:, school:, academic_year:) - SurveyItemResponse.for_measures(subcategory.measures) + measures = subcategory.measures.select { |measure| sufficient_data?(measure: measure, school: school, academic_year: academic_year) } + + SurveyItemResponse.for_measures(measures) .where(academic_year: academic_year, school: school) .average(:likert_score) end def self.score_for_measure(measure:, school:, academic_year:) - return nil unless SurveyItemResponse.sufficient_data?(measure: measure, school: school, academic_year: academic_year) + return nil unless sufficient_data?(measure: measure, school: school, academic_year: academic_year) SurveyItemResponse.for_measure(measure) .where(academic_year: academic_year, school: school) diff --git a/spec/models/survey_item_response_spec.rb b/spec/models/survey_item_response_spec.rb index bd6a4f26..586b7a36 100644 --- a/spec/models/survey_item_response_spec.rb +++ b/spec/models/survey_item_response_spec.rb @@ -1,10 +1,11 @@ require 'rails_helper' describe SurveyItemResponse, type: :model do + let(:school) { create(:school) } + let(:ay) { create(:academic_year) } + describe '.score_for_measure' do let(:measure) { create(:measure) } - let(:school) { create(:school) } - let(:ay) { create(:academic_year) } context 'when the measure includes only teacher data' do let(:teacher_survey_item_1) { create(:survey_item, survey_item_id: 't-question-1', measure: measure) } @@ -229,4 +230,32 @@ describe SurveyItemResponse, type: :model do end end end + + describe '.score_for_subcategory' do + let(:subcategory) { create(:subcategory) } + let(:sufficient_measure_1) { create(:measure, subcategory: subcategory) } + let(:sufficient_measure_2) { create(:measure, subcategory: subcategory) } + let(:insufficient_measure) { create(:measure, subcategory: subcategory) } + let(:sufficient_teacher_survey_item) { create(:survey_item, survey_item_id: 't-question-1', measure: sufficient_measure_1) } + let(:insufficient_teacher_survey_item) { create(:survey_item, survey_item_id: 't-question-2', measure: insufficient_measure) } + let(:sufficient_student_survey_item) { create(:survey_item, survey_item_id: 's-question-1', measure: sufficient_measure_2) } + let(:insufficient_student_survey_item) { create(:survey_item, survey_item_id: 's-question-2', measure: insufficient_measure) } + + before :each do + [SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD].max.times do + create(:survey_item_response, survey_item: sufficient_teacher_survey_item, academic_year: ay, school: school, likert_score: 1) + create(:survey_item_response, survey_item: sufficient_student_survey_item, academic_year: ay, school: school, likert_score: 4) + end + (SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1).times do + create(:survey_item_response, survey_item: insufficient_teacher_survey_item, academic_year: ay, school: school, likert_score: 1) + end + (SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1).times do + create(:survey_item_response, survey_item: insufficient_student_survey_item, academic_year: ay, school: school, likert_score: 1) + end + end + + it 'returns the average score of all survey item responses for measures meeting their respective thresholds' do + expect(SurveyItemResponse.score_for_subcategory(subcategory: subcategory, school: school, academic_year: ay)).to eq 2.5 + end + end end