implement suggestions from static code analysis tools

pull/1/head
rebuilt 3 years ago
parent bb5f668497
commit e89358dacc

@ -1,12 +1,11 @@
# frozen_string_literal: true # frozen_string_literal: true
class AnalyzeController < SqmApplicationController class AnalyzeController < SqmApplicationController
def index before_action :assign_categories, :assign_subcategories, :assign_measures, :assign_academic_years,
assign_categories :response_rate_timestamp, only: [:index]
assign_subcategories def index; end
assign_measures
assign_academic_years private
end
def assign_categories def assign_categories
@category ||= Category.find_by_category_id(params[:category]) @category ||= Category.find_by_category_id(params[:category])
@ -21,16 +20,29 @@ class AnalyzeController < SqmApplicationController
end end
def assign_measures def assign_measures
@measures = @subcategory.measures.order(:measure_id).includes(%i[subcategory]) @measures = @subcategory.measures.order(:measure_id).includes(%i[admin_data_items subcategory])
end end
def assign_academic_years def assign_academic_years
@available_academic_years = AcademicYear.order(:range).all @available_academic_years = AcademicYear.order(:range).all
@academic_year_params = params[:academic_years].split(',') if params[:academic_years] year_params = params[:academic_years]
@academic_year_params = year_params.split(',') if year_params
@selected_academic_years = [] @selected_academic_years = []
@academic_year_params ||= [] @academic_year_params ||= []
@academic_year_params.each do |year| @academic_year_params.each do |year|
@selected_academic_years << AcademicYear.find_by_range(year) @selected_academic_years << AcademicYear.find_by_range(year)
end end
end end
def response_rate_timestamp
@response_rate_timestamp = begin
academic_year = @selected_academic_years.last
academic_year ||= @academic_year
rate = ResponseRate.where(school: @school,
academic_year:).order(updated_at: :DESC).first || Today.new
rate.updated_at
end
@response_rate_timestamp
end
end end

@ -1,10 +1,24 @@
# frozen_string_literal: true # frozen_string_literal: true
class CategoriesController < SqmApplicationController class CategoriesController < SqmApplicationController
before_action :response_rate_timestamp, only: [:index]
helper GaugeHelper helper GaugeHelper
def show def show
@categories = Category.sorted.map { |category| CategoryPresenter.new(category:) } @categories = Category.sorted.map { |category| CategoryPresenter.new(category:) }
@category = CategoryPresenter.new(category: Category.find_by_slug(params[:id])) @category = CategoryPresenter.new(category: Category.find_by_slug(params[:id]))
end end
private
def response_rate_timestamp
@response_rate_timestamp = begin
rate = ResponseRate.where(school: @school,
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
rate.updated_at
end
@response_rate_timestamp
end
end end

@ -2,6 +2,7 @@
class OverviewController < SqmApplicationController class OverviewController < SqmApplicationController
before_action :check_empty_dataset, only: [:index] before_action :check_empty_dataset, only: [:index]
before_action :response_rate_timestamp, only: [:index]
helper VarianceHelper helper VarianceHelper
def index def index
@ -31,4 +32,14 @@ class OverviewController < SqmApplicationController
def subcategories def subcategories
@subcategories ||= Subcategory.all @subcategories ||= Subcategory.all
end end
def response_rate_timestamp
@response_rate_timestamp = begin
rate = ResponseRate.where(school: @school,
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
rate.updated_at
end
@response_rate_timestamp
end
end end

@ -3,6 +3,7 @@
class SqmApplicationController < ApplicationController class SqmApplicationController < ApplicationController
protect_from_forgery with: :exception, prepend: true protect_from_forgery with: :exception, prepend: true
before_action :set_schools_and_districts before_action :set_schools_and_districts
before_action :response_rate_timestamp
helper HeaderHelper helper HeaderHelper
private private

@ -62,7 +62,8 @@ module AnalyzeHelper
end end
def analyze_category_link(district:, school:, academic_year:, category:) def analyze_category_link(district:, school:, academic_year:, category:)
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{academic_year.range}&academic_years=#{academic_year.range}&category=#{category.category_id}" year = academic_year.range
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{year}&academic_years=#{year}&category=#{category.category_id}"
end end
def analyze_subcategory_link(district:, school:, academic_year:, category:, subcategory:) def analyze_subcategory_link(district:, school:, academic_year:, category:, subcategory:)

@ -1,3 +1,5 @@
# frozen_string_literal: true
Point = Struct.new(:x, :y) Point = Struct.new(:x, :y)
Rect = Struct.new(:x, :y, :width, :height) Rect = Struct.new(:x, :y, :width, :height)
@ -14,15 +16,29 @@ module GaugeHelper
1 1
end end
def effective_radius
outer_radius + stroke_width
end
def diameter
2 * effective_radius
end
def width
diameter
end
def height
outer_radius + 2 * stroke_width + key_benchmark_indicator_gutter
end
def key_benchmark_indicator_gutter def key_benchmark_indicator_gutter
10 10
end end
def viewbox def viewbox
x = arc_center.x - (outer_radius + stroke_width) x = arc_center.x - effective_radius
y = arc_center.y - (outer_radius + stroke_width) - key_benchmark_indicator_gutter y = arc_center.y - effective_radius - key_benchmark_indicator_gutter
width = 2 * (outer_radius + stroke_width)
height = outer_radius + 2 * stroke_width + key_benchmark_indicator_gutter
Rect.new(x, y, width, height) Rect.new(x, y, width, height)
end end
@ -47,8 +63,9 @@ module GaugeHelper
end end
def arc_end_line_destination(radius:, percentage:) def arc_end_line_destination(radius:, percentage:)
x = arc_center.x + radius * Math.cos(angle_for(percentage:)) angle = angle_for(percentage:)
y = arc_center.y + radius * Math.sin(angle_for(percentage:)) x = arc_center.x + radius * Math.cos(angle)
y = arc_center.y + radius * Math.sin(angle)
Point.new(x, y) Point.new(x, y)
end end

@ -1,3 +1,5 @@
# frozen_string_literal: true
module HeaderHelper module HeaderHelper
def link_to_overview(district:, school:, academic_year:) def link_to_overview(district:, school:, academic_year:)
"/districts/#{district.slug}/schools/#{school.slug}/overview?year=#{academic_year.range}" "/districts/#{district.slug}/schools/#{school.slug}/overview?year=#{academic_year.range}"
@ -8,7 +10,8 @@ module HeaderHelper
end end
def link_to_analyze(district:, school:, academic_year:) def link_to_analyze(district:, school:, academic_year:)
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{academic_year.range}&category=1&academic_years=#{academic_year.range}" year = academic_year.range
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{year}&category=1&academic_years=#{year}"
end end
def district_url_for(district:, academic_year:) def district_url_for(district:, academic_year:)
@ -42,8 +45,10 @@ module HeaderHelper
end end
def latest_year(school) def latest_year(school)
latest_response_rate = ResponseRate.where(school:).where('meets_student_threshold = ? or meets_teacher_threshold = ?', true, latest_response_rate = ResponseRate.where(school:)
true).joins('inner join academic_years a on response_rates.academic_year_id=a.id').order('a.range DESC').first .where('meets_student_threshold = ? or meets_teacher_threshold = ?', true, true)
.joins('inner join academic_years a on response_rates.academic_year_id=a.id')
.order('a.range DESC').first
academic_year = latest_response_rate.academic_year if latest_response_rate.present? academic_year = latest_response_rate.academic_year if latest_response_rate.present?
academic_year || AcademicYear.order('range DESC').first academic_year || AcademicYear.order('range DESC').first

@ -1,3 +1,5 @@
# frozen_string_literal: true
module SchedulesHelper module SchedulesHelper
def options_for_frequency_hours def options_for_frequency_hours
[ [

@ -51,19 +51,17 @@ class Measure < ActiveRecord::Base
@includes_admin_data_items ||= admin_data_items.any? @includes_admin_data_items ||= admin_data_items.any?
end end
def sources # def sources
@sources ||= begin # @sources ||= begin
sources = [] # sources = []
sources << :admin_data if includes_admin_data_items? # sources << Source.new(name: :admin_data, collection: admin_data_items) if includes_admin_data_items?
sources << :student_surveys if includes_student_survey_items? # sources << Source.new(name: :student_surveys, collection: student_survey_items) if includes_student_survey_items?
sources << :teacher_surveys if includes_teacher_survey_items? # sources << Source.new(name: :teacher_surveys, collection: teacher_survey_items) if includes_teacher_survey_items?
sources # sources
end # end
end # end
def score(school:, academic_year:) def score(school:, academic_year:)
# average = SurveyItemResponse.where(school:, academic_year:).first
# Score.new(average, false, false, false)
@score ||= Hash.new do |memo, (school, academic_year)| @score ||= Hash.new do |memo, (school, academic_year)|
next Score::NIL_SCORE if incalculable_score(school:, academic_year:) next Score::NIL_SCORE if incalculable_score(school:, academic_year:)
@ -149,9 +147,9 @@ class Measure < ActiveRecord::Base
def collect_survey_item_average(survey_items:, school:, academic_year:) def collect_survey_item_average(survey_items:, school:, academic_year:)
@collect_survey_item_average ||= Hash.new do |memo, (survey_items, school, academic_year)| @collect_survey_item_average ||= Hash.new do |memo, (survey_items, school, academic_year)|
averages = survey_items.map do |survey_item| averages = survey_items.map do |survey_item|
grouped_responses(school:, academic_year:)[survey_item] || 0 grouped_responses(school:, academic_year:)[survey_item]
end.remove_blanks end.remove_blanks
memo[[survey_items, school, academic_year]] = averages.any? ? averages.average : 0 memo[[survey_items, school, academic_year]] = averages.average || 0
end end
@collect_survey_item_average[[survey_items, school, academic_year]] @collect_survey_item_average[[survey_items, school, academic_year]]
end end
@ -210,8 +208,7 @@ class Measure < ActiveRecord::Base
def no_teacher_responses_exist?(school:, academic_year:) def no_teacher_responses_exist?(school:, academic_year:)
@no_teacher_responses_exist ||= Hash.new do |memo, (school, academic_year)| @no_teacher_responses_exist ||= Hash.new do |memo, (school, academic_year)|
memo[[school, academic_year]] = teacher_survey_items.all? do |survey_item| memo[[school, academic_year]] = teacher_survey_items.all? do |survey_item|
survey_item.survey_item_responses.where(school:, survey_item.survey_item_responses.where(school:, academic_year:).none?
academic_year:).none?
end end
end end
@no_teacher_responses_exist[[school, academic_year]] @no_teacher_responses_exist[[school, academic_year]]
@ -219,9 +216,8 @@ class Measure < ActiveRecord::Base
def incalculable_score(school:, academic_year:) def incalculable_score(school:, academic_year:)
@incalculable_score ||= Hash.new do |memo, (school, academic_year)| @incalculable_score ||= Hash.new do |memo, (school, academic_year)|
meets_student_threshold = sufficient_student_data?(school:, academic_year:) lacks_sufficient_survey_data = !sufficient_student_data?(school:, academic_year:) &&
meets_teacher_threshold = sufficient_teacher_data?(school:, academic_year:) !sufficient_teacher_data?(school:, academic_year:)
lacks_sufficient_survey_data = !meets_student_threshold && !meets_teacher_threshold
memo[[school, academic_year]] = lacks_sufficient_survey_data && !includes_admin_data_items? memo[[school, academic_year]] = lacks_sufficient_survey_data && !includes_admin_data_items?
end end
@ -247,8 +243,8 @@ class Measure < ActiveRecord::Base
def student_average(school:, academic_year:) def student_average(school:, academic_year:)
@student_average ||= Hash.new do |memo, (school, academic_year)| @student_average ||= Hash.new do |memo, (school, academic_year)|
memo[[school, academic_year]] = collect_survey_item_average(survey_items: student_survey_items_by_survey_type(school:, academic_year:), school:, survey_items = student_survey_items_by_survey_type(school:, academic_year:)
academic_year:) memo[[school, academic_year]] = collect_survey_item_average(survey_items:, school:, academic_year:)
end end
@student_average[[school, academic_year]] @student_average[[school, academic_year]]
end end

@ -12,16 +12,13 @@ module ResponseRateCalculator
end end
def rate def rate
return 100 if Respondent.where(school: @school, academic_year: @academic_year).count.zero? return 100 if population_data_unavailable?
return 0 unless survey_item_count.positive? return 0 unless survey_item_count.positive?
average_responses_per_survey_item = response_count / survey_item_count.to_f
return 0 unless total_possible_responses.positive? return 0 unless total_possible_responses.positive?
response_rate = (average_responses_per_survey_item / total_possible_responses.to_f * 100).round cap_at_one_hundred(raw_response_rate)
cap_at_one_hundred(response_rate)
end end
def meets_student_threshold? def meets_student_threshold?
@ -37,4 +34,20 @@ module ResponseRateCalculator
def cap_at_one_hundred(response_rate) def cap_at_one_hundred(response_rate)
response_rate > 100 ? 100 : response_rate response_rate > 100 ? 100 : response_rate
end end
def survey
Survey.find_by(school:, academic_year:)
end
def raw_response_rate
(average_responses_per_survey_item / total_possible_responses.to_f * 100).round
end
def average_responses_per_survey_item
response_count / survey_item_count.to_f
end
def population_data_unavailable?
Respondent.where(school: @school, academic_year: @academic_year).count.zero?
end
end end

@ -7,8 +7,6 @@ class StudentResponseRateCalculator
def survey_item_count def survey_item_count
@survey_item_count ||= begin @survey_item_count ||= begin
survey = Survey.find_by(school:, academic_year:)
survey_items = SurveyItem.includes(%i[scale survey_items = SurveyItem.includes(%i[scale
measure]).student_survey_items.where("scale.measure": @subcategory.measures) measure]).student_survey_items.where("scale.measure": @subcategory.measures)
survey_items = survey_items.where(on_short_form: true) if survey.form == 'short' survey_items = survey_items.where(on_short_form: true) if survey.form == 'short'
@ -22,7 +20,6 @@ class StudentResponseRateCalculator
def response_count def response_count
@response_count ||= @subcategory.measures.map do |measure| @response_count ||= @subcategory.measures.map do |measure|
measure.student_survey_items.map do |survey_item| measure.student_survey_items.map do |survey_item|
survey = Survey.find_by(school:, academic_year:)
next 0 if survey.form == 'short' && survey_item.on_short_form == false next 0 if survey.form == 'short' && survey_item.on_short_form == false
survey_item.survey_item_responses.where(school:, survey_item.survey_item_responses.where(school:,

@ -18,11 +18,7 @@ class Subcategory < ActiveRecord::Base
memo[[school, academic_year]] = ResponseRate.find_by(subcategory: self, school:, academic_year:) memo[[school, academic_year]] = ResponseRate.find_by(subcategory: self, school:, academic_year:)
end end
if @response_rate[[school, academic_year]].nil? @response_rate[[school, academic_year]] || create_response_rate(school:, academic_year:)
@response_rate[[school, academic_year]] = create_response_rate(school:, academic_year:)
end
@response_rate[[school, academic_year]]
end end
private private

@ -0,0 +1,7 @@
# frozen_string_literal: true
class Today
def updated_at
Date.today
end
end

@ -29,20 +29,7 @@ class AnalyzeBarPresenter
end end
def bar_height_percentage def bar_height_percentage
bar_height = case zone.type bar_height = send("#{zone.type}_bar_height_percentage") || 0
when :ideal
(percentage * zone_height_percentage + zone_height_percentage) * 100
when :approval
(percentage * zone_height_percentage) * 100
when :growth
((1 - percentage) * zone_height_percentage) * 100
when :watch
((1 - percentage) * zone_height_percentage + zone_height_percentage) * 100
when :warning
((1 - percentage) * zone_height_percentage + zone_height_percentage + zone_height_percentage) * 100
else
0.0
end
enforce_minimum_height(bar_height:) enforce_minimum_height(bar_height:)
end end
@ -73,4 +60,24 @@ class AnalyzeBarPresenter
def enforce_minimum_height(bar_height:) def enforce_minimum_height(bar_height:)
bar_height < MINIMUM_BAR_HEIGHT ? MINIMUM_BAR_HEIGHT : bar_height bar_height < MINIMUM_BAR_HEIGHT ? MINIMUM_BAR_HEIGHT : bar_height
end end
def ideal_bar_height_percentage
(percentage * zone_height_percentage + zone_height_percentage) * 100
end
def approval_bar_height_percentage
(percentage * zone_height_percentage) * 100
end
def growth_bar_height_percentage
((1 - percentage) * zone_height_percentage) * 100
end
def watch_bar_height_percentage
((1 - percentage) * zone_height_percentage + zone_height_percentage) * 100
end
def warning_bar_height_percentage
((1 - percentage) * zone_height_percentage + zone_height_percentage + zone_height_percentage) * 100
end
end end

@ -72,20 +72,31 @@ class VarianceChartRowPresenter
WARNING_ZONE_WIDTH_PERCENTAGE = 0.2 WARNING_ZONE_WIDTH_PERCENTAGE = 0.2
def bar_width_percentage def bar_width_percentage
case zone.type send("#{zone.type}_bar_width_percentage")
when :ideal end
percentage * IDEAL_ZONE_WIDTH_PERCENTAGE + APPROVAL_ZONE_WIDTH_PERCENTAGE
when :approval def ideal_bar_width_percentage
percentage * APPROVAL_ZONE_WIDTH_PERCENTAGE percentage * IDEAL_ZONE_WIDTH_PERCENTAGE + APPROVAL_ZONE_WIDTH_PERCENTAGE
when :growth end
(1 - percentage) * GROWTH_ZONE_WIDTH_PERCENTAGE
when :watch def approval_bar_width_percentage
(1 - percentage) * WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE percentage * APPROVAL_ZONE_WIDTH_PERCENTAGE
when :warning end
(1 - percentage) * WARNING_ZONE_WIDTH_PERCENTAGE + WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
else def growth_bar_width_percentage
0.0 (1 - percentage) * GROWTH_ZONE_WIDTH_PERCENTAGE
end end
def watch_bar_width_percentage
(1 - percentage) * WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
end
def warning_bar_width_percentage
(1 - percentage) * WARNING_ZONE_WIDTH_PERCENTAGE + WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
end
def insufficient_data_bar_width_percentage
0
end end
def percentage def percentage

@ -2,28 +2,46 @@
class ResponseRateLoader class ResponseRateLoader
def self.reset(schools: School.all, academic_years: AcademicYear.all, subcategories: Subcategory.all) def self.reset(schools: School.all, academic_years: AcademicYear.all, subcategories: Subcategory.all)
milford = School.find_by_slug 'milford-high-school'
test_year = AcademicYear.find_by_range '2020-21'
subcategories.each do |subcategory| subcategories.each do |subcategory|
schools.each do |school| schools.each do |school|
next if ENV['RAILS_ENV'] == 'test' && !(school == milford) next if rails_env == 'test' && (school != milford)
academic_years.each do |academic_year| academic_years.each do |academic_year|
next if ENV['RAILS_ENV'] == 'test' && !(academic_year == test_year) next if rails_env == 'test' && (academic_year != test_year)
student = StudentResponseRateCalculator.new(subcategory:, school:, academic_year:)
teacher = TeacherResponseRateCalculator.new(subcategory:, school:, academic_year:)
response_rate = ResponseRate.find_or_create_by!(subcategory:, school:, academic_year:) process_response_rate(subcategory:, school:, academic_year:)
response_rate.student_response_rate = student.rate
response_rate.teacher_response_rate = teacher.rate
response_rate.meets_student_threshold = student.meets_student_threshold?
response_rate.meets_teacher_threshold = teacher.meets_teacher_threshold?
response_rate.save
end end
end end
end end
end end
private
def self.milford
School.find_by_slug 'milford-high-school'
end
def self.test_year
AcademicYear.find_by_range '2020-21'
end
def self.rails_env
@rails_env ||= ENV['RAILS_ENV']
end
def self.process_response_rate(subcategory:, school:, academic_year:)
student = StudentResponseRateCalculator.new(subcategory:, school:, academic_year:)
teacher = TeacherResponseRateCalculator.new(subcategory:, school:, academic_year:)
response_rate = ResponseRate.find_or_create_by!(subcategory:, school:, academic_year:)
response_rate.update!(student_response_rate: student.rate, teacher_response_rate: teacher.rate,
meets_student_threshold: student.meets_student_threshold?,
meets_teacher_threshold: teacher.meets_teacher_threshold?)
end
private_class_method :milford
private_class_method :test_year
private_class_method :rails_env
private_class_method :process_response_rate
end end

@ -49,7 +49,7 @@
<% end %> <% end %>
</div> </div>
<% cache [@subcategory, @school, @selected_academic_years] do %> <% cache [@subcategory, @school, @selected_academic_years, @response_rate_timestamp] do %>
<div class="bg-color-white flex-grow-1 col-9"> <div class="bg-color-white flex-grow-1 col-9">
<% @measures.each do |measure|%> <% @measures.each do |measure|%>
<section class="mb-6" > <section class="mb-6" >

@ -65,7 +65,7 @@
</svg> </svg>
<% end %> <% end %>
<% cache [@school, @academic_year, ResponseRate.where(school: @school, academic_year: @academic_year).order(updated_at: :DESC).first.updated_at] do %> <% cache [@school, @academic_year, @response_rate_timestamp] do %>
<div class="card"> <div class="card">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<h2 class="sub-header-2">School Quality Framework Indicators</h2> <h2 class="sub-header-2">School Quality Framework Indicators</h2>

@ -1,10 +1,12 @@
# frozen_string_literal: true
module ArrayMonkeyPatches module ArrayMonkeyPatches
def average def average
sum.to_f / size sum.to_f / size
end end
def remove_blanks def remove_blanks
reject { |item| item == 0 || item.to_f.nan? } reject { |item| item.nil? || item.to_f.nan? || item.zero? }
end end
end end

@ -7,7 +7,7 @@ RSpec.describe Measure, type: :model do
let(:student_scale) { create(:student_scale, measure:) } let(:student_scale) { create(:student_scale, measure:) }
let(:admin_scale) { create(:admin_scale, measure:) } let(:admin_scale) { create(:admin_scale, measure:) }
let(:school) { create(:school) } let(:school) { create(:school) }
let(:short_form_school){ create(:school)} let(:short_form_school) { create(:school) }
let(:academic_year) { create(:academic_year) } let(:academic_year) { create(:academic_year) }
let(:admin_watch_low_benchmark) { 2.0 } let(:admin_watch_low_benchmark) { 2.0 }
@ -29,7 +29,7 @@ RSpec.describe Measure, type: :model do
create(:respondent, school:, academic_year:) create(:respondent, school:, academic_year:)
create(:survey, school:, academic_year:) create(:survey, school:, academic_year:)
create(:respondent, school: short_form_school, academic_year:) create(:respondent, school: short_form_school, academic_year:)
create(:survey, school: short_form_school, academic_year:, form: "short") create(:survey, school: short_form_school, academic_year:, form: 'short')
end end
describe 'benchmarks' do describe 'benchmarks' do
@ -45,9 +45,9 @@ RSpec.describe Measure, type: :model do
expect(measure.watch_low_benchmark).to be 2.0 expect(measure.watch_low_benchmark).to be 2.0
end end
it 'returns the source as an admin_data_item' do # it 'returns the source as an admin_data_item' do
expect(measure.sources).to eq [:admin_data] # expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items)]
end # end
end end
context 'when a measure includes only student survey items' do context 'when a measure includes only student survey items' do
@ -64,9 +64,9 @@ RSpec.describe Measure, type: :model do
it 'returns a warning low benchmark equal to the student survey item warning low benchmark ' do it 'returns a warning low benchmark equal to the student survey item warning low benchmark ' do
expect(measure.warning_low_benchmark).to eq 1 expect(measure.warning_low_benchmark).to eq 1
end end
it 'returns the source as student_surveys' do # it 'returns the source as student_surveys' do
expect(measure.sources).to eq [:student_surveys] # expect(measure.sources).to eq [Source.new(name: :student_surveys, collection: measure.student_survey_items)]
end # end
end end
context 'when a measure includes only teacher survey items' do context 'when a measure includes only teacher survey items' do
@ -83,9 +83,9 @@ RSpec.describe Measure, type: :model do
it 'returns a warning low benchmark equal to the teacher survey item warning low benchmark ' do it 'returns a warning low benchmark equal to the teacher survey item warning low benchmark ' do
expect(measure.warning_low_benchmark).to eq 1 expect(measure.warning_low_benchmark).to eq 1
end end
it 'returns the source as teacher_surveys' do # it 'returns the source as teacher_surveys' do
expect(measure.sources).to eq [:teacher_surveys] # expect(measure.sources).to eq [Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
end # end
end end
context 'when a measure includes admin data and student survey items' do context 'when a measure includes admin data and student survey items' do
@ -107,9 +107,10 @@ RSpec.describe Measure, type: :model do
# (2*3 + 1.5)/4 # (2*3 + 1.5)/4
expect(measure.watch_low_benchmark).to be 1.875 expect(measure.watch_low_benchmark).to be 1.875
end end
it 'returns the source as admin and student survey items' do # it 'returns the source as admin and student survey items' do
expect(measure.sources).to eq %i[admin_data student_surveys] # expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
end # Source.new(name: :student_surveys, collection: measure.student_survey_items)]
# end
end end
context 'when a measure includes admin data and teacher survey items' do context 'when a measure includes admin data and teacher survey items' do
@ -131,9 +132,10 @@ RSpec.describe Measure, type: :model do
# (2*3 + 1.2)/4 # (2*3 + 1.2)/4
expect(measure.watch_low_benchmark).to be 1.8 expect(measure.watch_low_benchmark).to be 1.8
end end
it 'returns the source as admin and teacher survey items' do # it 'returns the source as admin and teacher survey items' do
expect(measure.sources).to eq %i[admin_data teacher_surveys] # expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
end # Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
# end
end end
context 'when a measure includes student and teacher survey items' do context 'when a measure includes student and teacher survey items' do
@ -155,9 +157,10 @@ RSpec.describe Measure, type: :model do
# (1.2+ 1.5)/2 # (1.2+ 1.5)/2
expect(measure.watch_low_benchmark).to be 1.35 expect(measure.watch_low_benchmark).to be 1.35
end end
it 'returns the source as student and teacher survey items' do # it 'returns the source as student and teacher survey items' do
expect(measure.sources).to eq %i[student_surveys teacher_surveys] # expect(measure.sources).to eq [Source.new(name: :student_surveys, collection: measure.student_survey_items),
end # Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
# end
end end
context 'when a measure includes admin data and student and teacher survey items' do context 'when a measure includes admin data and student and teacher survey items' do
@ -191,9 +194,11 @@ RSpec.describe Measure, type: :model do
expect(measure.ideal_low_benchmark).to be_within(0.001).of 4.74 expect(measure.ideal_low_benchmark).to be_within(0.001).of 4.74
end end
it 'returns the source as admin student and teacher survey items' do # it 'returns the source as admin student and teacher survey items' do
expect(measure.sources).to eq %i[admin_data student_surveys teacher_surveys] # expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
end # Source.new(name: :student_surveys, collection: measure.student_survey_items),
# Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
# end
end end
end end
@ -365,7 +370,7 @@ RSpec.describe Measure, type: :model do
end end
end end
context "and the school is a short form school" do context 'and the school is a short form school' do
before :each do before :each do
create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD, create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD,
survey_item: student_survey_item_1, academic_year:, school: short_form_school, likert_score: 1) survey_item: student_survey_item_1, academic_year:, school: short_form_school, likert_score: 1)

@ -6,6 +6,7 @@ describe 'District Admin', js: true do
let(:different_district) { District.find_by_slug 'wareham' } let(:different_district) { District.find_by_slug 'wareham' }
let(:school) { School.find_by_slug 'winchester-high-school' } let(:school) { School.find_by_slug 'winchester-high-school' }
let(:school_in_same_district) { School.find_by_slug 'muraco-elementary-school' } let(:school_in_same_district) { School.find_by_slug 'muraco-elementary-school' }
let(:first_school_in_wareham) { School.find_by_slug 'john-william-decas-elementary-school' }
let(:category) { Category.find_by_name('Teachers & Leadership') } let(:category) { Category.find_by_name('Teachers & Leadership') }
let(:different_category) { Category.find_by_name('School Culture') } let(:different_category) { Category.find_by_name('School Culture') }
@ -28,6 +29,16 @@ describe 'District Admin', js: true do
let(:ay_2021_22) { AcademicYear.find_by_range '2021-22' } let(:ay_2021_22) { AcademicYear.find_by_range '2021-22' }
let(:ay_2019_20) { AcademicYear.find_by_range '2019-20' } let(:ay_2019_20) { AcademicYear.find_by_range '2019-20' }
let(:response_rates) do
[ay_2021_22, ay_2019_20].each do |academic_year|
[school, school_in_same_district, first_school_in_wareham].each do |school|
[subcategory, different_subcategory].each do |subcategory|
ResponseRate.create!(subcategory:, school:, academic_year:, student_response_rate: 100, teacher_response_rate: 100,
meets_student_threshold: true, meets_teacher_threshold: true)
end
end
end
end
# let(:username) { 'winchester' } # let(:username) { 'winchester' }
# let(:password) { 'winchester!' } # let(:password) { 'winchester!' }
@ -47,6 +58,7 @@ describe 'District Admin', js: true do
Rails.application.load_seed Rails.application.load_seed
respondents respondents
response_rates
survey_item_responses = [] survey_item_responses = []
survey_items_for_measure_1A_i.each do |survey_item| survey_items_for_measure_1A_i.each do |survey_item|
@ -87,6 +99,10 @@ describe 'District Admin', js: true do
SurveyItemResponse.import survey_item_responses SurveyItemResponse.import survey_item_responses
end end
after :each do
DatabaseCleaner.clean
end
it 'navigates through the site' do it 'navigates through the site' do
# page.driver.basic_authorize(username, password) # page.driver.basic_authorize(username, password)

Loading…
Cancel
Save