Inline the SurveyResponseAggregator

pull/1/head
Alex Basson 4 years ago
parent 25578a896f
commit 4d5335491b

@ -6,21 +6,24 @@ class DashboardController < ApplicationController
@measure_graph_row_presenters = measure_ids @measure_graph_row_presenters = measure_ids
.map { |measure_id| Measure.find_by_measure_id measure_id } .map { |measure_id| Measure.find_by_measure_id measure_id }
.map(&method(:presenter_for_measure)) .map(&method(:presenter_for_measure))
.sort().reverse .sort
.reverse
end end
private private
def measure_ids def measure_ids
Measure.all.map {|measure | Measure.all.map(&:measure_id)
measure.measure_id
}
end end
def presenter_for_measure(measure) def presenter_for_measure(measure)
score = SurveyItemResponse.for_measure(measure)
.where(academic_year: academic_year, school: school)
.average(:likert_score)
MeasureGraphRowPresenter.new( MeasureGraphRowPresenter.new(
measure: measure, measure: measure,
score: SurveyResponseAggregator.score(school: school, academic_year: academic_year, measure: measure) score: score
) )
end end
@ -30,7 +33,7 @@ class DashboardController < ApplicationController
end end
def schools def schools
@schools = School.where(district: district).sort_by { | school| school.name } @schools = School.where(district: district).sort_by(&:name)
end end
def district def district
@ -38,7 +41,7 @@ class DashboardController < ApplicationController
end end
def districts def districts
@districts = District.all.sort_by {|district| district.name} @districts = District.all.sort_by(&:name)
end end
def district_slug def district_slug

@ -1,16 +0,0 @@
# TODO inline me pls
class SurveyResponseAggregator
# Returns an average score for all SurveyItemResponses for the given AcademicYear, School, and Measure
def self.score(academic_year:, school:, measure:)
SurveyItemResponse.for_measure(measure)
.where(academic_year: academic_year, school: school)
.average(:likert_score)
end
# Returns an array of SurveyItemResponses for the given AcademicYear, School, and Measure
def self.find_responses_by_measure(academic_year:, school:, measure:)
SurveyItemResponse
.where(academic_year: academic_year, school: school)
.joins(:survey_item).where('survey_items.measure_id': measure.id)
end
end

@ -1,70 +0,0 @@
require 'rails_helper'
describe SurveyResponseAggregator do
let(:category) { SqmCategory.create }
let(:subcategory) { Subcategory.create sqm_category: category }
let(:ay_2020_21) { AcademicYear.find_by_range '2020-21' }
let(:ay_2021_22) { AcademicYear.find_by_range '2021-22' }
let(:school_a) { School.create name: 'School A' }
let(:school_b) { School.create name: 'School A' }
let(:measure_a) { Measure.create subcategory: subcategory, name: 'Measure A', measure_id: 'measure-a-id', watch_low_benchmark: 1.1, growth_low_benchmark: 2, approval_low_benchmark: 3, ideal_low_benchmark: 4 }
let(:measure_b) { Measure.create subcategory: subcategory, name: 'Measure B', measure_id: 'measure-b-id', watch_low_benchmark: 1.1, growth_low_benchmark: 2, approval_low_benchmark: 3, ideal_low_benchmark: 4 }
let(:survey_item_1_for_measure_a) { SurveyItem.create measure: measure_a, survey_item_id: 'si1a' }
let(:survey_item_2_for_measure_a) { SurveyItem.create measure: measure_a, survey_item_id: 'si2a' }
let(:survey_item_1_for_measure_b) { SurveyItem.create measure: measure_b, survey_item_id: 'si1b' }
let(:survey_item_2_for_measure_b) { SurveyItem.create measure: measure_b, survey_item_id: 'si2b' }
before :each do
SurveyItemResponse.create response_id: '01', academic_year: ay_2020_21, school: school_a, survey_item: survey_item_1_for_measure_a, likert_score: 1
SurveyItemResponse.create response_id: '02', academic_year: ay_2020_21, school: school_a, survey_item: survey_item_2_for_measure_a, likert_score: 2
SurveyItemResponse.create response_id: '03', academic_year: ay_2020_21, school: school_a, survey_item: survey_item_1_for_measure_b, likert_score: 1
SurveyItemResponse.create response_id: '04', academic_year: ay_2020_21, school: school_a, survey_item: survey_item_2_for_measure_b, likert_score: 3
SurveyItemResponse.create response_id: '05', academic_year: ay_2020_21, school: school_b, survey_item: survey_item_1_for_measure_a, likert_score: 1
SurveyItemResponse.create response_id: '06', academic_year: ay_2020_21, school: school_b, survey_item: survey_item_2_for_measure_a, likert_score: 4
SurveyItemResponse.create response_id: '07', academic_year: ay_2020_21, school: school_b, survey_item: survey_item_1_for_measure_b, likert_score: 1
SurveyItemResponse.create response_id: '08', academic_year: ay_2020_21, school: school_b, survey_item: survey_item_2_for_measure_b, likert_score: 5
SurveyItemResponse.create response_id: '09', academic_year: ay_2021_22, school: school_a, survey_item: survey_item_1_for_measure_a, likert_score: 2
SurveyItemResponse.create response_id: '10', academic_year: ay_2021_22, school: school_a, survey_item: survey_item_2_for_measure_a, likert_score: 3
SurveyItemResponse.create response_id: '11', academic_year: ay_2021_22, school: school_a, survey_item: survey_item_1_for_measure_b, likert_score: 2
SurveyItemResponse.create response_id: '12', academic_year: ay_2021_22, school: school_a, survey_item: survey_item_2_for_measure_b, likert_score: 4
SurveyItemResponse.create response_id: '13', academic_year: ay_2021_22, school: school_b, survey_item: survey_item_1_for_measure_a, likert_score: 2
SurveyItemResponse.create response_id: '14', academic_year: ay_2021_22, school: school_b, survey_item: survey_item_2_for_measure_a, likert_score: 5
SurveyItemResponse.create response_id: '15', academic_year: ay_2021_22, school: school_b, survey_item: survey_item_1_for_measure_b, likert_score: 3
SurveyItemResponse.create response_id: '16', academic_year: ay_2021_22, school: school_b, survey_item: survey_item_2_for_measure_b, likert_score: 5
end
describe '.score' do
it 'returns the average score of the survey responses for the given school, academic year, and measure' do
expect(SurveyResponseAggregator.score(academic_year: ay_2020_21, school: school_a, measure: measure_a)).to eq 1.5
expect(SurveyResponseAggregator.score(academic_year: ay_2020_21, school: school_a, measure: measure_b)).to eq 2.0
expect(SurveyResponseAggregator.score(academic_year: ay_2020_21, school: school_b, measure: measure_a)).to eq 2.5
expect(SurveyResponseAggregator.score(academic_year: ay_2020_21, school: school_b, measure: measure_b)).to eq 3.0
expect(SurveyResponseAggregator.score(academic_year: ay_2021_22, school: school_a, measure: measure_a)).to eq 2.5
expect(SurveyResponseAggregator.score(academic_year: ay_2021_22, school: school_a, measure: measure_b)).to eq 3.0
expect(SurveyResponseAggregator.score(academic_year: ay_2021_22, school: school_b, measure: measure_a)).to eq 3.5
expect(SurveyResponseAggregator.score(academic_year: ay_2021_22, school: school_b, measure: measure_b)).to eq 4.0
end
end
describe '.find_responses_by_measure' do
it 'returns all survey item responses corresponding to a year school and measure' do
expect(SurveyResponseAggregator.find_responses_by_measure(academic_year: ay_2020_21, school: school_a, measure: measure_a).count).to eq 2
end
end
end
Loading…
Cancel
Save