diff --git a/app/models/scale.rb b/app/models/scale.rb index 126e6cf0..98a2d596 100644 --- a/app/models/scale.rb +++ b/app/models/scale.rb @@ -38,7 +38,7 @@ class Scale < ApplicationRecord def student_survey_items(school:, academic_year:) survey = Survey.where(school:, academic_year:).first - return survey_items.student_survey_items.short_form_items if survey.form == 'short' + return survey_items.student_survey_items.short_form_items if survey.present? && survey.form == 'short' survey_items.student_survey_items end diff --git a/app/presenters/grouped_bar_column_presenter.rb b/app/presenters/grouped_bar_column_presenter.rb index e2a5a884..d3e94346 100644 --- a/app/presenters/grouped_bar_column_presenter.rb +++ b/app/presenters/grouped_bar_column_presenter.rb @@ -1,18 +1,21 @@ class GroupedBarColumnPresenter include AnalyzeHelper - attr_reader :score, :measure_name, :measure_id, :category, :position + attr_reader :score, :measure_name, :measure_id, :category, :position, :measure, :school, :academic_year - def initialize(measure:, score:, position:) + def initialize(measure:, school:, academic_year:, position:) @measure = measure - @score = score - @meets_teacher_threshold = score.meets_teacher_threshold? - @meets_student_threshold = score.meets_student_threshold? @measure_name = @measure.name @measure_id = @measure.measure_id @category = @measure.subcategory.category + @school = school + @academic_year = academic_year @position = position end + def score + measure.score(school:, academic_year:) + end + def y_offset case zone.type when :ideal, :approval @@ -44,7 +47,7 @@ class GroupedBarColumnPresenter end def percentage - (@score.average - zone.low_benchmark) / (zone.high_benchmark - zone.low_benchmark) + (score.average - zone.low_benchmark) / (zone.high_benchmark - zone.low_benchmark) end def zone @@ -54,7 +57,7 @@ class GroupedBarColumnPresenter approval_low_benchmark: @measure.approval_low_benchmark, ideal_low_benchmark: @measure.ideal_low_benchmark ) - zones.zone_for_score(@score.average) + zones.zone_for_score(score.average) end def label diff --git a/app/presenters/student_grouped_bar_column_presenter.rb b/app/presenters/student_grouped_bar_column_presenter.rb index 3348bfc7..edf3267e 100644 --- a/app/presenters/student_grouped_bar_column_presenter.rb +++ b/app/presenters/student_grouped_bar_column_presenter.rb @@ -15,7 +15,7 @@ class StudentGroupedBarColumnPresenter < GroupedBarColumnPresenter !score.meets_student_threshold? end - # def score - # @measure.student_score(school: @school, academic_year: @academic_year) - # end + def score + measure.student_score(school:, academic_year:) + end end diff --git a/app/presenters/teacher_grouped_bar_column_presenter.rb b/app/presenters/teacher_grouped_bar_column_presenter.rb index c7f27a5e..c43883f4 100644 --- a/app/presenters/teacher_grouped_bar_column_presenter.rb +++ b/app/presenters/teacher_grouped_bar_column_presenter.rb @@ -15,7 +15,7 @@ class TeacherGroupedBarColumnPresenter < GroupedBarColumnPresenter !score.meets_teacher_threshold? end - # def score - # @measure.teacher_score(school: @school, academic_year: @academic_year) - # end + def score + measure.teacher_score(school:, academic_year:) + end end diff --git a/app/views/analyze/_grouped_bar_chart.html.erb b/app/views/analyze/_grouped_bar_chart.html.erb index fa6e8f4f..79643a86 100644 --- a/app/views/analyze/_grouped_bar_chart.html.erb +++ b/app/views/analyze/_grouped_bar_chart.html.erb @@ -31,11 +31,11 @@ -<% presenter = StudentGroupedBarColumnPresenter.new(measure: measure, score: measure.student_score(school: @school, academic_year: @academic_year), position: 1) %> +<% presenter = StudentGroupedBarColumnPresenter.new(measure: measure, school: @school, academic_year: @academic_year, position: 1) %> <%= render partial: "grouped_bar_column", locals: {presenter: presenter} %> -<% presenter = TeacherGroupedBarColumnPresenter.new(measure: measure, score: measure.teacher_score(school: @school, academic_year: @academic_year), position: 2) %> +<% presenter = TeacherGroupedBarColumnPresenter.new(measure: measure, school: @school, academic_year: @academic_year, position: 2) %> <%= render partial: "grouped_bar_column", locals: {presenter: presenter} %> -<% presenter = GroupedBarColumnPresenter.new(measure: measure, score: measure.score(school: @school, academic_year: @academic_year), position: 3) %> +<% presenter = GroupedBarColumnPresenter.new(measure: measure, school: @school, academic_year: @academic_year, position: 3) %> <%= render partial: "grouped_bar_column", locals: {presenter: presenter} %> diff --git a/spec/presenters/grouped_bar_column_presenter_spec.rb b/spec/presenters/grouped_bar_column_presenter_spec.rb index 3d33f978..de690588 100644 --- a/spec/presenters/grouped_bar_column_presenter_spec.rb +++ b/spec/presenters/grouped_bar_column_presenter_spec.rb @@ -1,42 +1,55 @@ require 'rails_helper' describe GroupedBarColumnPresenter do - let(:watch_low_benchmark) { 2.9 } - let(:growth_low_benchmark) { 3.1 } - let(:approval_low_benchmark) { 3.6 } - let(:ideal_low_benchmark) { 3.8 } - - let(:measure_with_student_survey_items) do - measure = create( - :measure, - name: 'Some Title' - ) - scale = create(:scale, measure:) - - create(:student_survey_item, scale:, + let(:school) { create(:school) } + let(:academic_year) { create(:academic_year) } + let(:watch_low_benchmark) { 2 } + let(:growth_low_benchmark) { 3 } + let(:approval_low_benchmark) { 4 } + let(:ideal_low_benchmark) { 4.5 } + + let(:measure_with_student_survey_items) { create(:measure, name: 'Student measure') } + let(:scale_with_student_survey_item) { create(:student_scale, measure: measure_with_student_survey_items) } + let(:student_survey_item) do + create(:student_survey_item, scale: scale_with_student_survey_item, watch_low_benchmark:, growth_low_benchmark:, approval_low_benchmark:, ideal_low_benchmark:) - - measure end - let(:measure_with_teacher_survey_items) do - measure = create( - :measure, - name: 'Some Title' - ) - scale = create(:scale, measure:) - - create(:teacher_survey_item, scale:, + let(:measure_with_teacher_survey_items) { create(:measure, name: 'Teacher measure') } + let(:scale_with_teacher_survey_item) { create(:teacher_scale, measure: measure_with_teacher_survey_items) } + let(:teacher_survey_item) do + create(:teacher_survey_item, scale: scale_with_teacher_survey_item, watch_low_benchmark:, growth_low_benchmark:, approval_low_benchmark:, ideal_low_benchmark:) + end - measure + let(:measure_composed_of_student_and_teacher_items) { create(:measure, name: 'Student and teacher measure') } + let(:student_scale_for_composite_measure) do + create(:student_scale, measure: measure_composed_of_student_and_teacher_items) + end + let(:student_survey_item_for_composite_measure) do + create(:student_survey_item, scale: student_scale_for_composite_measure, + watch_low_benchmark:, + growth_low_benchmark:, + approval_low_benchmark:, + ideal_low_benchmark:) + end + let(:teacher_scale_for_composite_measure) do + create(:teacher_scale, measure: measure_composed_of_teacher_and_teacher_items) + end + let(:teacher_survey_item_for_composite_measure) do + create(:teacher_survey_item, scale: teacher_scale_for_composite_measure, + watch_low_benchmark:, + growth_low_benchmark:, + approval_low_benchmark:, + ideal_low_benchmark:) end + let(:measure_without_admin_data_items) do create( :measure, @@ -45,22 +58,39 @@ describe GroupedBarColumnPresenter do end let(:student_presenter) do - GroupedBarColumnPresenter.new measure: measure_with_student_survey_items, score:, position: 1, type: :student + StudentGroupedBarColumnPresenter.new measure: measure_with_student_survey_items, school:, academic_year:, + position: 1 end let(:teacher_presenter) do - GroupedBarColumnPresenter.new measure: measure_with_teacher_survey_items, score:, position: 1, type: :teacher + TeacherGroupedBarColumnPresenter.new measure: measure_with_teacher_survey_items, school:, academic_year:, + position: 1 + end + + let(:all_data_presenter) do + GroupedBarColumnPresenter.new measure: measure_composed_of_student_and_teacher_items, school:, academic_year:, + position: 1 + end + + before do + create(:respondent, school:, academic_year:, total_students: 1, total_teachers: 1) + create(:survey, form: :normal, school:, academic_year:) end shared_examples_for 'measure_name' do it 'returns the measure name' do - expect(student_presenter.measure_name).to eq 'Some Title' + expect(student_presenter.measure_name).to eq 'Student measure' end end context 'when a measure is based on student survey items' do context 'when the score is in the Ideal zone' do - let(:score) { Score.new(4.4, true, true) } + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 5) + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 4) + end it_behaves_like 'measure_name' @@ -69,16 +99,19 @@ describe GroupedBarColumnPresenter do end it 'returns a bar width equal to the approval zone width plus the proportionate ideal zone width' do - expect(student_presenter.bar_height_percentage).to be_within(0.01).of(25.5) + expect(student_presenter.bar_height_percentage).to be_within(0.01).of(17) end it 'returns a y_offset equal to the ' do - expect(student_presenter.y_offset).to be_within(0.01).of(8.5) + expect(student_presenter.y_offset).to be_within(0.01).of(17) end end context 'when the score is in the Approval zone' do - let(:score) { Score.new(3.7, true, true) } + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 4) + end it_behaves_like 'measure_name' @@ -87,16 +120,19 @@ describe GroupedBarColumnPresenter do end it 'returns a bar width equal to the proportionate approval zone width' do - expect(student_presenter.bar_height_percentage).to be_within(0.01).of(8.5) + expect(student_presenter.bar_height_percentage).to be_within(0.01).of(0) end it 'returns an x-offset of 60%' do - expect(student_presenter.y_offset).to be_within(0.01).of(25.5) + expect(student_presenter.y_offset).to be_within(0.01).of(34) end end context 'when the score is in the Growth zone' do - let(:score) { Score.new(3.2, true, true) } + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 3) + end it_behaves_like 'measure_name' @@ -105,7 +141,7 @@ describe GroupedBarColumnPresenter do end it 'returns a bar width equal to the proportionate growth zone width' do - expect(student_presenter.bar_height_percentage).to be_within(0.01).of(13.59) + expect(student_presenter.bar_height_percentage).to be_within(0.01).of(17) end context 'in order to achieve the visual effect' do @@ -116,7 +152,10 @@ describe GroupedBarColumnPresenter do end context 'when the score is in the Watch zone' do - let(:score) { Score.new(2.9, true, true) } + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 2) + end it_behaves_like 'measure_name' @@ -136,7 +175,10 @@ describe GroupedBarColumnPresenter do end context 'when the score is in the Warning zone' do - let(:score) { Score.new(1.0, true, true) } + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:, likert_score: 1) + end it_behaves_like 'measure_name' @@ -156,53 +198,36 @@ describe GroupedBarColumnPresenter do end context 'when there are insufficient responses to calculate a score' do - let(:score) { Score.new(nil, true, false) } - it 'indicates it should show the insufficient data message' do expect(student_presenter.show_insufficient_data_message?).to eq true end end context 'when there are enough responses to calculate a score' do - let(:score) { Score.new(nil, true, true) } - + before do + create(:survey_item_response, survey_item: student_survey_item, school:, + academic_year:) + end it 'indicates it should show the insufficient data message' do expect(student_presenter.show_insufficient_data_message?).to eq false end end end - context 'when the presenter type is student but the measure is not based on student surveys' do - let(:score) { Score.new(nil, false, false) } - let(:student_presenter) do - GroupedBarColumnPresenter.new measure: measure_without_admin_data_items, score:, position: 1, type: :student - end - it 'indecates it should show the irrelevancy message' do - expect(student_presenter.show_irrelevancy_message?).to be true - end - end context 'when the measure is based on teacher survey items' do context 'when there are insufficient responses to calculate a score' do - let(:score) { Score.new(nil, false, true) } - it 'indicates it should show the insufficient data message' do expect(teacher_presenter.show_insufficient_data_message?).to eq true end end context 'when there are enough responses to calculate a score' do - let(:score) { Score.new(nil, true, true) } + before do + create(:survey_item_response, survey_item: teacher_survey_item, school:, + academic_year:) + end it 'indicates it should show the insufficient data message' do expect(teacher_presenter.show_insufficient_data_message?).to eq false end end - context 'when the presenter type is teacher but the measure is not based on teacher surveys' do - let(:score) { Score.new(nil, false, false) } - let(:teacher_presenter) do - GroupedBarColumnPresenter.new measure: measure_without_admin_data_items, score:, position: 1, type: :teacher - end - it 'indecates it should show the irrelevancy message' do - expect(teacher_presenter.show_irrelevancy_message?).to be true - end - end end end