Add scales to framework. Change calculations to first group and then

average those groupings and the way up the framework.  Likert scores for
a survey_item are averaged.  Then all the survey_items in a scale are
averaged.  Then student scales in a measure are averaged.  And teacher
scales in a measure are averaged.  Then the average of those two
calculations becomes the score for a measure.  Then the measures in a
subcategory are averaged.
This commit is contained in:
rebuilt 2022-02-16 20:40:32 +01:00
parent 1ca88bf6d1
commit d4df7cbc06
44 changed files with 1053 additions and 856 deletions

View file

@ -1,8 +1,8 @@
require 'rails_helper'
describe GaugePresenter do
let(:scale) do
Scale.new(
let(:zones) do
Zones.new(
watch_low_benchmark: 1.5,
growth_low_benchmark: 2.5,
approval_low_benchmark: 3.5,
@ -11,7 +11,7 @@ describe GaugePresenter do
end
let(:score) { 3 }
let(:gauge_presenter) { GaugePresenter.new(scale: scale, score: score) }
let(:gauge_presenter) { GaugePresenter.new(zones: zones, score: score) }
it 'returns the key benchmark percentage for the gauge' do
expect(gauge_presenter.key_benchmark_percentage).to eq 0.625
@ -98,8 +98,8 @@ describe GaugePresenter do
end
context 'when there are no benchmarks or score for the gauge' do
let(:scale) do
Scale.new(
let(:zones) do
Zones.new(
watch_low_benchmark: nil,
growth_low_benchmark: nil,
approval_low_benchmark: nil,

View file

@ -4,7 +4,10 @@ describe MeasurePresenter do
let(:academic_year) { create(:academic_year, range: '1989-90') }
let(:school) { create(:school, name: 'Best School') }
let(:measure) { create(:measure, measure_id: 'measure-id') }
let(:measure_presenter) { MeasurePresenter.new(measure: measure, academic_year: academic_year, school: school) }
let(:teacher_scale) { create(:teacher_scale, measure:) }
let(:student_scale) { create(:student_scale, measure:) }
let(:admin_scale) { create(:scale, measure:) }
let(:measure_presenter) { MeasurePresenter.new(measure:, academic_year:, school:) }
it 'returns the id of the measure' do
expect(measure_presenter.id).to eq 'measure-id'
@ -16,13 +19,13 @@ describe MeasurePresenter do
context 'when the measure contains only teacher data' do
before :each do
survey_item1 = create(:teacher_survey_item, measure: measure, prompt: 'A teacher survey item prompt')
survey_item2 = create(:teacher_survey_item, measure: measure, prompt: 'Another teacher survey item prompt')
survey_item1 = create(:teacher_survey_item, scale: teacher_scale, prompt: 'A teacher survey item prompt')
survey_item2 = create(:teacher_survey_item, scale: teacher_scale, prompt: 'Another teacher survey item prompt')
create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item1,
academic_year: academic_year, school: school, likert_score: 1)
academic_year:, school:, likert_score: 1)
create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item2,
academic_year: academic_year, school: school, likert_score: 5)
academic_year:, school:, likert_score: 5)
end
it 'creates a gauge presenter that presents the average likert score' do
@ -41,10 +44,10 @@ describe MeasurePresenter do
context 'when the measure contains both teacher data and admin data' do
before :each do
create(:teacher_survey_item, measure: measure, prompt: 'A teacher survey item prompt')
create(:teacher_survey_item, measure: measure, prompt: 'Another teacher survey item prompt')
create(:admin_data_item, measure: measure, description: 'An admin data item description')
create(:admin_data_item, measure: measure, description: 'Another admin data item description')
create(:teacher_survey_item, scale: teacher_scale, prompt: 'A teacher survey item prompt')
create(:teacher_survey_item, scale: teacher_scale, prompt: 'Another teacher survey item prompt')
create(:admin_data_item, scale: admin_scale, description: 'An admin data item description')
create(:admin_data_item, scale: admin_scale, description: 'Another admin data item description')
end
it 'returns a list of data item presenters with two elements' do
@ -68,13 +71,13 @@ describe MeasurePresenter do
context 'when the measure has partial data for teachers and students' do
before :each do
teacher_survey_item = create(:teacher_survey_item, measure: measure)
student_survey_item = create(:student_survey_item, measure: measure)
teacher_survey_item = create(:teacher_survey_item, scale: teacher_scale)
student_survey_item = create(:student_survey_item, scale: student_scale)
create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD,
survey_item: teacher_survey_item, academic_year: academic_year, school: school)
survey_item: teacher_survey_item, academic_year:, school:)
create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1,
survey_item: student_survey_item, academic_year: academic_year, school: school)
survey_item: student_survey_item, academic_year:, school:)
end
it 'tracks which parts of the data are sufficient' do
@ -91,9 +94,9 @@ describe MeasurePresenter do
context 'when the measure has insufficient admin data and insufficient teacher/student data' do
before :each do
create(:admin_data_item, measure: measure)
create(:teacher_survey_item, measure: measure)
create(:student_survey_item, measure: measure)
create(:admin_data_item, scale: admin_scale)
create(:teacher_survey_item, scale: teacher_scale)
create(:student_survey_item, scale: student_scale)
end
it 'tracks the reason for their insufficiency' do

View file

@ -1,30 +1,30 @@
require 'rails_helper'
describe Scale do
describe Zones do
describe '#zone_for_score' do
let(:scale) do
Scale.new watch_low_benchmark: 1.5, growth_low_benchmark: 2.5, approval_low_benchmark: 3.5,
let(:zones) do
Zones.new watch_low_benchmark: 1.5, growth_low_benchmark: 2.5, approval_low_benchmark: 3.5,
ideal_low_benchmark: 4.5
end
context 'when the score is 1.0' do
it 'returns the warning zone' do
expect(scale.zone_for_score(1.0)).to eq scale.warning_zone
expect(zones.zone_for_score(1.0)).to eq zones.warning_zone
end
end
context 'when the score is 5.0' do
it 'returns the ideal zone' do
expect(scale.zone_for_score(5.0)).to eq scale.ideal_zone
expect(zones.zone_for_score(5.0)).to eq zones.ideal_zone
end
end
context 'when the score is right on the benchmark' do
it 'returns the higher zone' do
expect(scale.zone_for_score(1.5)).to eq scale.watch_zone
expect(scale.zone_for_score(2.5)).to eq scale.growth_zone
expect(scale.zone_for_score(3.5)).to eq scale.approval_zone
expect(scale.zone_for_score(4.5)).to eq scale.ideal_zone
expect(zones.zone_for_score(1.5)).to eq zones.watch_zone
expect(zones.zone_for_score(2.5)).to eq zones.growth_zone
expect(zones.zone_for_score(3.5)).to eq zones.approval_zone
expect(zones.zone_for_score(4.5)).to eq zones.ideal_zone
end
end
end

View file

@ -1,8 +1,8 @@
require 'rails_helper'
describe SubcategoryCardPresenter do
let(:scale) do
Scale.new(
let(:zones) do
Zones.new(
watch_low_benchmark: 1.5,
growth_low_benchmark: 2.5,
approval_low_benchmark: 3.5,
@ -10,7 +10,7 @@ describe SubcategoryCardPresenter do
)
end
let(:subcategory_card_presenter) { SubcategoryCardPresenter.new(name: 'Card name', scale: scale, score: score) }
let(:subcategory_card_presenter) { SubcategoryCardPresenter.new(name: 'Card name', zones: zones, score: score) }
context 'when the given score is in the Warning zone for the given scale' do
let(:score) { 1 }

View file

@ -13,9 +13,11 @@ describe SubcategoryPresenter do
let(:subcategory_presenter) do
survey_respondents
measure1 = create(:measure, subcategory:)
survey_item1 = create(:teacher_survey_item, measure: measure1, watch_low_benchmark: 4, growth_low_benchmark: 4.25,
teacher_scale_1 = create(:teacher_scale, measure: measure1)
student_scale_1 = create(:student_scale, measure: measure1)
survey_item1 = create(:teacher_survey_item, scale: teacher_scale_1, watch_low_benchmark: 4, growth_low_benchmark: 4.25,
approval_low_benchmark: 4.5, ideal_low_benchmark: 4.75)
survey_item2 = create(:student_survey_item, measure: measure1, watch_low_benchmark: 4, growth_low_benchmark: 4.25,
survey_item2 = create(:student_survey_item, scale: student_scale_1, watch_low_benchmark: 4, growth_low_benchmark: 4.25,
approval_low_benchmark: 4.5, ideal_low_benchmark: 4.75)
create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item1,
academic_year:, school:, likert_score: 1)
@ -27,9 +29,12 @@ describe SubcategoryPresenter do
academic_year:, school:, likert_score: 3)
measure2 = create(:measure, subcategory:)
survey_item3 = create(:teacher_survey_item, measure: measure2, watch_low_benchmark: 1.25,
teacher_scale_2 = create(:teacher_scale, measure: measure2)
student_scale_2 = create(:student_scale, measure: measure2)
survey_item3 = create(:teacher_survey_item, scale: teacher_scale_2, watch_low_benchmark: 1.25,
growth_low_benchmark: 1.5, approval_low_benchmark: 1.75, ideal_low_benchmark: 2.0)
survey_item4 = create(:student_survey_item, measure: measure2, watch_low_benchmark: 1.25,
survey_item4 = create(:student_survey_item, scale: student_scale_2, watch_low_benchmark: 1.25,
growth_low_benchmark: 1.5, approval_low_benchmark: 1.75, ideal_low_benchmark: 2.0)
create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item3,
academic_year:, school:, likert_score: 1)
@ -100,8 +105,9 @@ describe SubcategoryPresenter do
context 'and the measure does not include high-school-only admin data items' do
before do
measure_of_only_admin_data = create(:measure, subcategory:)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: false)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: false)
scale_of_only_admin_data = create(:scale, measure: measure_of_only_admin_data)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: false)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: false)
end
it 'returns the admin collection rate' do
expect(subcategory_presenter.admin_collection_rate).to eq [0, 2]
@ -111,8 +117,9 @@ describe SubcategoryPresenter do
context 'and the measure includes high-school-only items' do
before do
measure_of_only_admin_data = create(:measure, subcategory:)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: true)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: true)
scale_of_only_admin_data = create(:scale, measure: measure_of_only_admin_data)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: true)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: true)
end
it 'returns the admin collection rate' do
expect(subcategory_presenter.admin_collection_rate).to eq %w[N A]
@ -126,8 +133,9 @@ describe SubcategoryPresenter do
school.is_hs = true
school.save
measure_of_only_admin_data = create(:measure, subcategory:)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: false)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: false)
scale_of_only_admin_data = create(:scale, measure: measure_of_only_admin_data)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: false)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: false)
end
it 'returns the admin collection rate' do
expect(subcategory_presenter.admin_collection_rate).to eq [0, 2]
@ -139,8 +147,9 @@ describe SubcategoryPresenter do
school.is_hs = true
school.save
measure_of_only_admin_data = create(:measure, subcategory:)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: true)
create(:admin_data_item, measure: measure_of_only_admin_data, hs_only_item: true)
scale_of_only_admin_data = create(:scale, measure: measure_of_only_admin_data)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: true)
create(:admin_data_item, scale: scale_of_only_admin_data, hs_only_item: true)
end
it 'returns the admin collection rate' do
expect(subcategory_presenter.admin_collection_rate).to eq [0, 2]

View file

@ -11,12 +11,13 @@ describe VarianceChartRowPresenter do
:measure,
name: 'Some Title'
)
scale = create(:scale, measure:)
create(:student_survey_item, measure: measure,
watch_low_benchmark: watch_low_benchmark,
growth_low_benchmark: growth_low_benchmark,
approval_low_benchmark: approval_low_benchmark,
ideal_low_benchmark: ideal_low_benchmark)
create(:student_survey_item, scale:,
watch_low_benchmark:,
growth_low_benchmark:,
approval_low_benchmark:,
ideal_low_benchmark:)
measure
end
@ -29,7 +30,7 @@ describe VarianceChartRowPresenter do
end
let(:presenter) do
VarianceChartRowPresenter.new measure: measure, score: score
VarianceChartRowPresenter.new measure:, score:
end
shared_examples_for 'measure_name' do
@ -155,8 +156,9 @@ describe VarianceChartRowPresenter do
:measure,
name: 'Some Title'
)
scale_with_admin_data = create(:scale, measure: measure_with_admin_data)
create :admin_data_item,
measure: measure_with_admin_data,
scale: scale_with_admin_data,
watch_low_benchmark: watch_low_benchmark,
growth_low_benchmark: growth_low_benchmark,
approval_low_benchmark: approval_low_benchmark,
@ -172,7 +174,8 @@ describe VarianceChartRowPresenter do
context 'when a measure contains teacher survey items' do
before :each do
create :teacher_survey_item, measure: measure
scale = create(:scale, measure:)
create :teacher_survey_item, scale:
end
context 'when there are insufficient teacher survey item responses' do
@ -193,7 +196,8 @@ describe VarianceChartRowPresenter do
context 'when a measure contains student survey items' do
before :each do
create :student_survey_item, measure: measure
scale = create(:scale, measure:)
create :student_survey_item, scale:
end
context 'when there are insufficient student survey item responses' do
@ -205,7 +209,8 @@ describe VarianceChartRowPresenter do
context 'where there are also admin data items' do
before :each do
create :admin_data_item, measure: measure
scale = create(:scale, measure:)
create :admin_data_item, scale:
end
it 'returns the sources for partial results of administrative data and student survey results' do
@ -224,12 +229,13 @@ describe VarianceChartRowPresenter do
context 'sorting scores' do
it 'selects a longer bar before a shorter bar for measures in the approval/ideal zones' do
scale_with_student_survey_items = create(:scale, measure:)
create(:student_survey_item,
measure: measure,
watch_low_benchmark: watch_low_benchmark,
growth_low_benchmark: growth_low_benchmark,
approval_low_benchmark: approval_low_benchmark,
ideal_low_benchmark: ideal_low_benchmark)
scale: scale_with_student_survey_items,
watch_low_benchmark:,
growth_low_benchmark:,
approval_low_benchmark:,
ideal_low_benchmark:)
approval_presenter = VarianceChartRowPresenter.new measure: measure, score: Score.new(3.7, true, true)
ideal_presenter = VarianceChartRowPresenter.new measure: measure, score: Score.new(4.4, true, true)
expect(ideal_presenter <=> approval_presenter).to be < 0