mirror of
https://github.com/edcommonwealth/sqm-dashboards.git
synced 2026-03-09 07:28:41 -07:00
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:
parent
1ca88bf6d1
commit
d4df7cbc06
44 changed files with 1053 additions and 856 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue