feat: Add income table to the database. Add seeder for income. Add a reference to income from survey item response. Update the loader to import income data from the survey response csv. Refactor analyze controller to extract presenter. Add corresponding specs. Add income graph to analyze page
parent
8e33a4178c
commit
2ac30bb107
@ -1,172 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AnalyzeController < SqmApplicationController
|
||||
before_action :assign_categories, :assign_subcategories, :assign_measures, :assign_academic_years,
|
||||
:races, :selected_races, :graph, :graphs, :background, :race_score_timestamp,
|
||||
:source, :sources, :group, :groups, :selected_grades, :grades, :slice, :selected_genders, :genders, only: [:index]
|
||||
def index; end
|
||||
|
||||
private
|
||||
|
||||
def assign_categories
|
||||
@category ||= Category.find_by_category_id(params[:category])
|
||||
@category ||= Category.order(:category_id).first
|
||||
@categories = Category.all.order(:category_id)
|
||||
end
|
||||
|
||||
def assign_subcategories
|
||||
@subcategories = @category.subcategories.order(:subcategory_id)
|
||||
@subcategory ||= Subcategory.find_by_subcategory_id(params[:subcategory])
|
||||
@subcategory ||= @subcategories.first
|
||||
end
|
||||
|
||||
def assign_measures
|
||||
@measures = @subcategory.measures.order(:measure_id).includes(%i[admin_data_items subcategory])
|
||||
end
|
||||
|
||||
def assign_academic_years
|
||||
@available_academic_years = AcademicYear.order(:range).all
|
||||
year_params = params[:academic_years]
|
||||
@academic_year_params = year_params.split(',') if year_params
|
||||
@selected_academic_years = []
|
||||
@academic_year_params ||= []
|
||||
@academic_year_params.each do |year|
|
||||
@selected_academic_years << AcademicYear.find_by_range(year)
|
||||
end
|
||||
end
|
||||
|
||||
def races
|
||||
@races ||= Race.all.order(designation: :ASC)
|
||||
end
|
||||
|
||||
def selected_races
|
||||
@selected_races ||= begin
|
||||
race_params = params[:races]
|
||||
return @selected_races = races unless race_params
|
||||
|
||||
race_list = race_params.split(',') if race_params
|
||||
if race_list
|
||||
race_list = race_list.map do |race|
|
||||
Race.find_by_slug race
|
||||
end
|
||||
end
|
||||
race_list
|
||||
end
|
||||
end
|
||||
|
||||
def graph
|
||||
graphs.each do |graph|
|
||||
@graph = graph if graph.slug == params[:graph]
|
||||
end
|
||||
|
||||
@graph ||= graphs.first
|
||||
end
|
||||
|
||||
def graphs
|
||||
@graphs ||= [Analyze::Graph::AllData.new, Analyze::Graph::StudentsAndTeachers.new, Analyze::Graph::StudentsByRace.new(races: selected_races),
|
||||
Analyze::Graph::StudentsByGrade.new(grades: selected_grades), Analyze::Graph::StudentsByGender.new(genders: selected_genders)]
|
||||
end
|
||||
|
||||
def background
|
||||
@background ||= BackgroundPresenter.new(num_of_columns: graph.columns.count)
|
||||
end
|
||||
|
||||
def race_score_timestamp
|
||||
@race_score_timestamp ||= begin
|
||||
score = RaceScore.where(school: @school,
|
||||
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
|
||||
score.updated_at
|
||||
end
|
||||
end
|
||||
|
||||
def source
|
||||
source_param = params[:source]
|
||||
sources.each do |source|
|
||||
@source = source if source.slug == source_param
|
||||
end
|
||||
|
||||
@source ||= sources.first
|
||||
end
|
||||
|
||||
def sources
|
||||
all_data_slices = [Analyze::Slice::AllData.new]
|
||||
all_data_source = Analyze::Source::AllData.new(slices: all_data_slices)
|
||||
|
||||
students_and_teachers = Analyze::Slice::StudentsAndTeachers.new
|
||||
students_by_group = Analyze::Slice::StudentsByGroup.new(races:, grades:)
|
||||
survey_data_slices = [students_and_teachers, students_by_group]
|
||||
survey_data_source = Analyze::Source::SurveyData.new(slices: survey_data_slices)
|
||||
|
||||
@sources = [all_data_source, survey_data_source]
|
||||
end
|
||||
|
||||
def slice
|
||||
slice_param = params[:slice]
|
||||
slices.each do |slice|
|
||||
@slice = slice if slice.slug == slice_param
|
||||
end
|
||||
|
||||
@slice ||= slices.first
|
||||
end
|
||||
|
||||
def slices
|
||||
source.slices
|
||||
end
|
||||
|
||||
def group
|
||||
groups.each do |group|
|
||||
@group = group if group.slug == params[:group]
|
||||
end
|
||||
|
||||
@group ||= groups.first
|
||||
end
|
||||
|
||||
def groups
|
||||
@groups = [Analyze::Group::Race.new, Analyze::Group::Grade.new, Analyze::Group::Gender.new]
|
||||
end
|
||||
|
||||
def selected_grades
|
||||
@selected_grades ||= begin
|
||||
grade_params = params[:grades]
|
||||
return @selected_grades = grades unless grade_params
|
||||
|
||||
grade_list = grade_params.split(',') if grade_params
|
||||
if grade_list
|
||||
grade_list = grade_list.map do |grade|
|
||||
grade.to_i
|
||||
end
|
||||
end
|
||||
grade_list
|
||||
end
|
||||
end
|
||||
|
||||
def grades
|
||||
@grades ||= SurveyItemResponse.where(school: @school, academic_year: @academic_year)
|
||||
.where.not(grade: nil)
|
||||
.group(:grade)
|
||||
.select(:response_id)
|
||||
.distinct(:response_id)
|
||||
.count.reject do |_key, value|
|
||||
value < 10
|
||||
end.keys
|
||||
end
|
||||
|
||||
def selected_genders
|
||||
@selected_genders ||= begin
|
||||
gender_params = params[:genders]
|
||||
return @selected_genders = genders unless gender_params
|
||||
|
||||
gender_list = gender_params.split(',') if gender_params
|
||||
if gender_list
|
||||
gender_list = gender_list.map do |gender|
|
||||
Gender.find_by_designation(gender)
|
||||
end
|
||||
end
|
||||
gender_list
|
||||
end
|
||||
end
|
||||
|
||||
def genders
|
||||
@genders ||= Gender.all
|
||||
def index
|
||||
@presenter = Analyze::Presenter.new(params:, school: @school, academic_year: @academic_year)
|
||||
@background ||= BackgroundPresenter.new(num_of_columns: @presenter.graph.columns.count)
|
||||
end
|
||||
end
|
||||
|
||||
@ -0,0 +1,7 @@
|
||||
class Income < ApplicationRecord
|
||||
scope :by_designation, -> { all.map { |income| [income.designation, income] }.to_h }
|
||||
|
||||
include FriendlyId
|
||||
|
||||
friendly_id :designation, use: [:slugged]
|
||||
end
|
||||
@ -0,0 +1,85 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
class BarPresenter
|
||||
include AnalyzeHelper
|
||||
attr_reader :score, :x_position, :academic_year, :measure_id, :measure, :color
|
||||
|
||||
MINIMUM_BAR_HEIGHT = 2
|
||||
|
||||
def initialize(measure:, academic_year:, score:, x_position:, color:)
|
||||
@score = score
|
||||
@x_position = x_position
|
||||
@academic_year = academic_year
|
||||
@measure = measure
|
||||
@measure_id = measure.measure_id
|
||||
@color = color
|
||||
end
|
||||
|
||||
def y_offset
|
||||
benchmark_height = analyze_zone_height * 2
|
||||
case zone.type
|
||||
when :ideal, :approval
|
||||
benchmark_height - bar_height_percentage
|
||||
else
|
||||
benchmark_height
|
||||
end
|
||||
end
|
||||
|
||||
def bar_color
|
||||
"fill-#{zone.type}"
|
||||
end
|
||||
|
||||
def bar_height_percentage
|
||||
bar_height = send("#{zone.type}_bar_height_percentage") || 0
|
||||
enforce_minimum_height(bar_height:)
|
||||
end
|
||||
|
||||
def percentage
|
||||
low_benchmark = zone.low_benchmark
|
||||
(score.average - low_benchmark) / (zone.high_benchmark - low_benchmark)
|
||||
end
|
||||
|
||||
def zone
|
||||
zones = Zones.new(
|
||||
watch_low_benchmark: measure.watch_low_benchmark,
|
||||
growth_low_benchmark: measure.growth_low_benchmark,
|
||||
approval_low_benchmark: measure.approval_low_benchmark,
|
||||
ideal_low_benchmark: measure.ideal_low_benchmark
|
||||
)
|
||||
zones.zone_for_score(score.average)
|
||||
end
|
||||
|
||||
def average
|
||||
average = score.average || 0
|
||||
|
||||
average.round(6)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def enforce_minimum_height(bar_height:)
|
||||
bar_height < MINIMUM_BAR_HEIGHT ? MINIMUM_BAR_HEIGHT : bar_height
|
||||
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
|
||||
@ -0,0 +1,28 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module IncomeColumn
|
||||
class Disadvantaged < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
||||
def label
|
||||
"Economically Disadvantaged"
|
||||
end
|
||||
|
||||
def show_irrelevancy_message?
|
||||
false
|
||||
end
|
||||
|
||||
def show_insufficient_data_message?
|
||||
false
|
||||
end
|
||||
|
||||
def income
|
||||
Income.find_by_designation "Economically Disadvantaged - Y"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,28 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module IncomeColumn
|
||||
class NotDisadvantaged < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
||||
def label
|
||||
"Not Disadvantaged"
|
||||
end
|
||||
|
||||
def show_irrelevancy_message?
|
||||
false
|
||||
end
|
||||
|
||||
def show_insufficient_data_message?
|
||||
false
|
||||
end
|
||||
|
||||
def income
|
||||
Income.find_by_designation "Economically Disadvantaged - N"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,28 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module IncomeColumn
|
||||
class Unknown < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
||||
def label
|
||||
"Unknown"
|
||||
end
|
||||
|
||||
def show_irrelevancy_message?
|
||||
false
|
||||
end
|
||||
|
||||
def show_insufficient_data_message?
|
||||
false
|
||||
end
|
||||
|
||||
def income
|
||||
Income.find_by_designation "Unknown"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,40 @@
|
||||
module Analyze
|
||||
module Graph
|
||||
class StudentsByIncome
|
||||
attr_reader :incomes
|
||||
|
||||
def initialize(incomes:)
|
||||
@incomes = incomes
|
||||
end
|
||||
|
||||
def to_s
|
||||
"Students by income"
|
||||
end
|
||||
|
||||
def slug
|
||||
"students-by-income"
|
||||
end
|
||||
|
||||
def columns
|
||||
[].tap do |array|
|
||||
incomes.each do |income|
|
||||
array << column_for_income_code(code: income.slug)
|
||||
end
|
||||
array << Analyze::Graph::Column::AllStudent
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def column_for_income_code(code:)
|
||||
CFR[code.to_s]
|
||||
end
|
||||
|
||||
CFR = {
|
||||
"economically-disadvantaged-y" => Analyze::Graph::Column::IncomeColumn::Disadvantaged,
|
||||
"economically-disadvantaged-n" => Analyze::Graph::Column::IncomeColumn::NotDisadvantaged,
|
||||
"unknown" => Analyze::Graph::Column::IncomeColumn::Unknown
|
||||
}.freeze
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,13 @@
|
||||
module Analyze
|
||||
module Group
|
||||
class Income
|
||||
def name
|
||||
'Income'
|
||||
end
|
||||
|
||||
def slug
|
||||
'income'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,159 @@
|
||||
module Analyze
|
||||
class Presenter
|
||||
attr_reader :params, :school, :academic_year
|
||||
|
||||
def initialize(params:, school:, academic_year:)
|
||||
@params = params
|
||||
@school = school
|
||||
@academic_year = academic_year
|
||||
end
|
||||
|
||||
def category
|
||||
@category ||= Category.find_by_category_id(params[:category]) || Category.order(:category_id).first
|
||||
end
|
||||
|
||||
def categories
|
||||
@categories = Category.all.order(:category_id)
|
||||
end
|
||||
|
||||
def subcategory
|
||||
@subcategory ||= Subcategory.find_by_subcategory_id(params[:subcategory]) || subcategories.first
|
||||
end
|
||||
|
||||
def subcategories
|
||||
@subcategories = category.subcategories.order(:subcategory_id)
|
||||
end
|
||||
|
||||
def measures
|
||||
@measures = subcategory.measures.order(:measure_id).includes(%i[admin_data_items subcategory])
|
||||
end
|
||||
|
||||
def academic_years
|
||||
@academic_years = AcademicYear.order(:range).all
|
||||
end
|
||||
|
||||
def selected_academic_years
|
||||
@selected_academic_years ||= begin
|
||||
year_params = params[:academic_years]
|
||||
return [] unless year_params
|
||||
|
||||
year_params.split(",").map { |year| AcademicYear.find_by_range(year) }.compact
|
||||
end
|
||||
end
|
||||
|
||||
def races
|
||||
@races ||= Race.all.order(designation: :ASC)
|
||||
end
|
||||
|
||||
def selected_races
|
||||
@selected_races ||= begin
|
||||
race_params = params[:races]
|
||||
return races unless race_params
|
||||
|
||||
race_params.split(",").map { |race| Race.find_by_slug race }.compact
|
||||
end
|
||||
end
|
||||
|
||||
def graphs
|
||||
@graphs ||= [Analyze::Graph::AllData.new, Analyze::Graph::StudentsAndTeachers.new, Analyze::Graph::StudentsByRace.new(races: selected_races),
|
||||
Analyze::Graph::StudentsByGrade.new(grades: selected_grades), Analyze::Graph::StudentsByGender.new(genders: selected_genders), Analyze::Graph::StudentsByIncome.new(incomes: selected_incomes)]
|
||||
end
|
||||
|
||||
def graph
|
||||
@graph ||= graphs.reduce(graphs.first) do |acc, graph|
|
||||
graph.slug == params[:graph] ? graph : acc
|
||||
end
|
||||
end
|
||||
|
||||
def selected_grades
|
||||
@selected_grades ||= begin
|
||||
grade_params = params[:grades]
|
||||
return grades unless grade_params
|
||||
|
||||
grade_params.split(",").map(&:to_i)
|
||||
end
|
||||
end
|
||||
|
||||
def selected_genders
|
||||
@selected_genders ||= begin
|
||||
gender_params = params[:genders]
|
||||
return genders unless gender_params
|
||||
|
||||
gender_params.split(",").map { |gender| Gender.find_by_designation(gender) }.compact
|
||||
end
|
||||
end
|
||||
|
||||
def genders
|
||||
@genders ||= Gender.all
|
||||
end
|
||||
|
||||
def groups
|
||||
@groups = [Analyze::Group::Gender.new, Analyze::Group::Grade.new, Analyze::Group::Income.new,
|
||||
Analyze::Group::Race.new]
|
||||
end
|
||||
|
||||
def group
|
||||
@group ||= groups.reduce(groups.first) do |acc, group|
|
||||
group.slug == params[:group] ? group : acc
|
||||
end
|
||||
end
|
||||
|
||||
def slice
|
||||
@slice ||= slices.reduce(slices.first) do |acc, slice|
|
||||
slice.slug == params[:slice] ? slice : acc
|
||||
end
|
||||
end
|
||||
|
||||
def slices
|
||||
source.slices
|
||||
end
|
||||
|
||||
def source
|
||||
@source ||= sources.reduce(sources.first) do |acc, source|
|
||||
source.slug == params[:source] ? source : acc
|
||||
end
|
||||
end
|
||||
|
||||
def sources
|
||||
all_data_slices = [Analyze::Slice::AllData.new]
|
||||
all_data_source = Analyze::Source::AllData.new(slices: all_data_slices)
|
||||
|
||||
students_and_teachers = Analyze::Slice::StudentsAndTeachers.new
|
||||
students_by_group = Analyze::Slice::StudentsByGroup.new(races:, grades:)
|
||||
survey_data_slices = [students_and_teachers, students_by_group]
|
||||
survey_data_source = Analyze::Source::SurveyData.new(slices: survey_data_slices)
|
||||
|
||||
@sources = [all_data_source, survey_data_source]
|
||||
end
|
||||
|
||||
def grades
|
||||
@grades ||= SurveyItemResponse.where(school:, academic_year:)
|
||||
.where.not(grade: nil)
|
||||
.group(:grade)
|
||||
.select(:response_id)
|
||||
.distinct(:response_id)
|
||||
.count.reject do |_key, value|
|
||||
value < 10
|
||||
end.keys
|
||||
end
|
||||
|
||||
def race_score_timestamp
|
||||
score = RaceScore.where(school: @school,
|
||||
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
|
||||
score.updated_at
|
||||
end
|
||||
|
||||
def incomes
|
||||
@incomes ||= Income.all
|
||||
end
|
||||
|
||||
def selected_incomes
|
||||
@selected_incomes ||= begin
|
||||
income_params = params[:incomes]
|
||||
return incomes unless income_params
|
||||
|
||||
income_params.split(",").map { |income| Income.find_by_slug(income) }.compact
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,8 +0,0 @@
|
||||
module Analyze
|
||||
class Ui
|
||||
attr_reader :params
|
||||
def initialize(params:)
|
||||
@params = params
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,83 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AnalyzeBarPresenter
|
||||
include AnalyzeHelper
|
||||
attr_reader :score, :x_position, :academic_year, :measure_id, :measure, :color
|
||||
|
||||
MINIMUM_BAR_HEIGHT = 2
|
||||
|
||||
def initialize(measure:, academic_year:, score:, x_position:, color:)
|
||||
@score = score
|
||||
@x_position = x_position
|
||||
@academic_year = academic_year
|
||||
@measure = measure
|
||||
@measure_id = measure.measure_id
|
||||
@color = color
|
||||
end
|
||||
|
||||
def y_offset
|
||||
benchmark_height = analyze_zone_height * 2
|
||||
case zone.type
|
||||
when :ideal, :approval
|
||||
benchmark_height - bar_height_percentage
|
||||
else
|
||||
benchmark_height
|
||||
end
|
||||
end
|
||||
|
||||
def bar_color
|
||||
"fill-#{zone.type}"
|
||||
end
|
||||
|
||||
def bar_height_percentage
|
||||
bar_height = send("#{zone.type}_bar_height_percentage") || 0
|
||||
enforce_minimum_height(bar_height:)
|
||||
end
|
||||
|
||||
def percentage
|
||||
low_benchmark = zone.low_benchmark
|
||||
(score.average - low_benchmark) / (zone.high_benchmark - low_benchmark)
|
||||
end
|
||||
|
||||
def zone
|
||||
zones = Zones.new(
|
||||
watch_low_benchmark: measure.watch_low_benchmark,
|
||||
growth_low_benchmark: measure.growth_low_benchmark,
|
||||
approval_low_benchmark: measure.approval_low_benchmark,
|
||||
ideal_low_benchmark: measure.ideal_low_benchmark
|
||||
)
|
||||
zones.zone_for_score(score.average)
|
||||
end
|
||||
|
||||
def average
|
||||
average = score.average || 0
|
||||
|
||||
average.round(6)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def enforce_minimum_height(bar_height:)
|
||||
bar_height < MINIMUM_BAR_HEIGHT ? MINIMUM_BAR_HEIGHT : bar_height
|
||||
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
|
||||
@ -0,0 +1,17 @@
|
||||
<div class="d-flex align-items-center mx-5">
|
||||
<input
|
||||
id="<%= id %>"
|
||||
class="m-3 <%= name %>-checkbox form-check-input"
|
||||
type="checkbox"
|
||||
name="<%= name %>-checkbox"
|
||||
value="<%= base_url %>"
|
||||
data-action="click->analyze#refresh"
|
||||
<%= selected_items.include?(item) ? "checked" : "" %>
|
||||
<%= @presenter.graph.slug == 'students-and-teachers' || @presenter.source.slug == 'all-data' ? "disabled" : "" %>
|
||||
<%= @presenter.group.slug == name ? "" : "hidden" %>>
|
||||
|
||||
<label for="<%= id %>"
|
||||
<%= @presenter.group.slug == name ? "" : "hidden" %>>
|
||||
<%= label_text %>
|
||||
</label>
|
||||
</div>
|
||||
@ -1,67 +1,23 @@
|
||||
<select id="select-group" name="group" class="mx-4 form-select" data-id="group-dropdown" data-action="analyze#refresh">
|
||||
<% @groups.each do |group| %>
|
||||
<option id="<%= group.slug %>" name="group-option" value="<%= base_url %>" <%= group.slug == @group.slug ? "Selected": "" %>><%= group.name %> </option>
|
||||
<% @presenter.groups.each do |group| %>
|
||||
<option id="<%= group.slug %>" name="group-option" value="<%= base_url %>" <%= group.slug == @presenter.group.slug ? "Selected": "" %>><%= group.name %> </option>
|
||||
<% end %>
|
||||
</select>
|
||||
|
||||
<p class="sub-header-5 mx-4 mt-3 font-size-14"> Select a group </p>
|
||||
|
||||
<% @races.each do |race| %>
|
||||
<div class="d-flex align-items-center mx-5">
|
||||
<input
|
||||
id="<%= race.slug %>"
|
||||
class="m-3 race-checkbox form-check-input"
|
||||
type="checkbox"
|
||||
name="race-checkbox"
|
||||
value="<%= base_url %>"
|
||||
data-action="click->analyze#refresh"
|
||||
<%= @selected_races.map(&:slug).include?(race.slug) ? "checked" : "" %>
|
||||
<%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %>
|
||||
<%= @group.slug == 'race' ? "" : "hidden" %>>
|
||||
|
||||
<label for="<%= race.qualtrics_code %>"
|
||||
<%= @group.slug == 'race' ? "" : "hidden" %>>
|
||||
<%= race.designation %>
|
||||
</label>
|
||||
</div>
|
||||
<% @presenter.races.each do |race| %>
|
||||
<%= render(partial: "checkboxes", locals: {id: "race-#{race.slug}", item: race, selected_items: @presenter.selected_races, name: "race", label_text: race.designation}) %>
|
||||
<% end %>
|
||||
|
||||
<% @grades.each do |grade| %>
|
||||
<div class="d-flex align-items-center mx-5">
|
||||
<input
|
||||
id="grade-<%= grade %>"
|
||||
class="m-3 grade-checkbox form-check-input"
|
||||
type="checkbox"
|
||||
name="grade-checkbox"
|
||||
value="<%= base_url %>"
|
||||
data-action="click->analyze#refresh"
|
||||
<%= @selected_grades.include?(grade) ? "checked" : "" %>
|
||||
<%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %>
|
||||
<%= @group.slug == 'grade' ? "" : "hidden" %>>
|
||||
|
||||
<label for="grade-<%= grade %>"
|
||||
<%= @group.slug == 'grade' ? "" : "hidden" %>>
|
||||
<%= grade %>
|
||||
</label>
|
||||
</div>
|
||||
<% @presenter.grades.each do |grade| %>
|
||||
<%= render(partial: "checkboxes", locals: {id: "grade-#{grade}", item: grade, selected_items: @presenter.selected_grades, name: "grade", label_text: grade}) %>
|
||||
<% end %>
|
||||
|
||||
<% @genders.each do |gender| %>
|
||||
<div class="d-flex align-items-center mx-5">
|
||||
<input
|
||||
id="gender-<%= gender.designation %>"
|
||||
class="m-3 gender-checkbox form-check-input"
|
||||
type="checkbox"
|
||||
name="gender-checkbox"
|
||||
value="<%= base_url %>"
|
||||
data-action="click->analyze#refresh"
|
||||
<%= @selected_genders.include?(gender) ? "checked" : "" %>
|
||||
<%= @graph.slug == 'students-and-teachers' || @source.slug == 'all-data' ? "disabled" : "" %>
|
||||
<%= @group.slug == 'gender' ? "" : "hidden" %>>
|
||||
<% @presenter.genders.each do |gender| %>
|
||||
<%= render(partial: "checkboxes", locals: {id: "gender-#{gender.designation}", item: gender, selected_items: @presenter.selected_genders, name: "gender", label_text: gender.designation}) %>
|
||||
<% end %>
|
||||
|
||||
<label for="gender-<%= gender %>"
|
||||
<%= @group.slug == 'gender' ? "" : "hidden" %>>
|
||||
<%= gender.designation %>
|
||||
</label>
|
||||
</div>
|
||||
<% @presenter.incomes.each do |income| %>
|
||||
<%= render(partial: "checkboxes", locals: {id: "income-#{income.slug}", item: income, selected_items: @presenter.selected_incomes, name: "income", label_text: income.designation}) %>
|
||||
<% end %>
|
||||
|
||||
|
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 493 B |
|
@ -0,0 +1,9 @@
|
||||
class CreateIncomes < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
create_table :incomes do |t|
|
||||
t.string :designation
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,5 @@
|
||||
class AddIncomeToSurveyItemResponses < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_reference :survey_item_responses, :income, foreign_key: true
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,6 @@
|
||||
class AddSlugToIncome < ActiveRecord::Migration[7.0]
|
||||
def change
|
||||
add_column :incomes, :slug, :string
|
||||
add_index :incomes, :slug, unique: true
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Income, type: :model do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
||||
@ -0,0 +1,468 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Analyze::Presenter do
|
||||
let(:category) { create(:category, category_id: '1', name: 'first category') }
|
||||
let(:category_2) { create(:category, category_id: '2', name: 'second category') }
|
||||
let(:wrong_category) { create(:category, category_id: '999', name: 'wrong category') }
|
||||
let(:subcategory) { create(:subcategory, subcategory_id: '1A', name: 'first subcategory', category:) }
|
||||
let(:subcategory_2) { create(:subcategory, subcategory_id: '2A', name: 'second subcategory', category: category_2) }
|
||||
let(:wrong_subcategory) do
|
||||
create(:subcategory, subcategory_id: '99A', name: 'wrong subcategory', category: wrong_category)
|
||||
end
|
||||
let(:measure) { create(:measure, measure_id: '1A-i', name: 'first measure', subcategory:) }
|
||||
let(:measure_2) { create(:measure, measure_id: '2A-i', name: 'second measure', subcategory: subcategory_2) }
|
||||
let(:wrong_measure) do
|
||||
create(:wrong_measure, measure_id: '99A', name: 'wrong measure', subcategory: wrong_subcategory)
|
||||
end
|
||||
let(:scale) { create(:student_scale, measure:) }
|
||||
let(:survey_item) { create(:student_survey_item, scale:) }
|
||||
let(:school) { create(:school) }
|
||||
let(:academic_year) { create(:academic_year) }
|
||||
let(:ay_2021_22) { create(:academic_year, range: '2021-22') }
|
||||
let(:ay_2022_23) { create(:academic_year, range: '2022-23') }
|
||||
let(:wrong_ay) { create(:academic_year, range: '9999-99') }
|
||||
let(:black) { create(:race, designation: 'black', qualtrics_code: 1) }
|
||||
let(:white) { create(:race, designation: 'white', qualtrics_code: 2) }
|
||||
let(:wrong_race) { create(:race, designation: 'wrong race', qualtrics_code: 9999) }
|
||||
let(:female) { create(:gender, designation: 'female', qualtrics_code: 1) }
|
||||
let(:male) { create(:gender, designation: 'male', qualtrics_code: 2) }
|
||||
let(:wrong_gender) { create(:gender, designation: 'wrong_gender', qualtrics_code: 2) }
|
||||
|
||||
context '.category' do
|
||||
before :each do
|
||||
category
|
||||
category_2
|
||||
wrong_category
|
||||
end
|
||||
context 'when a category is provided in the params hash' do
|
||||
it 'returns the category with the given id' do
|
||||
params = { category: '1' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.category).to eq category
|
||||
|
||||
params = { category: '2' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.category).to eq category_2
|
||||
end
|
||||
end
|
||||
|
||||
context 'when no category is provided in the params hash' do
|
||||
it 'returns the first category' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.category).to eq category
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a category that doesnt exist in the database is passed' do
|
||||
it 'returns the first category' do
|
||||
params = { category: '4' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.category).to eq category
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.categories' do
|
||||
it 'returns all categories' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.categories).to eq Category.all.order(:category_id)
|
||||
end
|
||||
end
|
||||
|
||||
context '.subcategory' do
|
||||
before :each do
|
||||
category
|
||||
category_2
|
||||
wrong_category
|
||||
subcategory
|
||||
subcategory_2
|
||||
wrong_subcategory
|
||||
end
|
||||
context 'when a subcategory is provided in the params hash' do
|
||||
it 'returns the subcategory with the given id' do
|
||||
params = { subcategory: '1A' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.subcategory).to eq subcategory
|
||||
|
||||
params = { subcategory: '2A' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.subcategory).to eq subcategory_2
|
||||
end
|
||||
end
|
||||
|
||||
context 'when no subcategory is provided in the params hash' do
|
||||
it 'returns the first subcategory' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.subcategory).to eq subcategory
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a subcategory that doesnt exist in the database is passed' do
|
||||
it 'returns the first subcategory' do
|
||||
params = { subcategory: '4A' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.subcategory).to eq subcategory
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.subcategories' do
|
||||
before :each do
|
||||
category
|
||||
wrong_category
|
||||
subcategory
|
||||
wrong_subcategory
|
||||
end
|
||||
it 'returns all subcategories for a given category' do
|
||||
params = { category: '1' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.subcategories).to eq category.subcategories.all.order(:subcategory_id)
|
||||
end
|
||||
end
|
||||
|
||||
context '.measures' do
|
||||
before :each do
|
||||
category
|
||||
subcategory
|
||||
measure
|
||||
end
|
||||
|
||||
it 'returns all measures for a given subcategory' do
|
||||
params = { category: '1' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.measures).to eq category.subcategories.flat_map(&:measures)
|
||||
end
|
||||
end
|
||||
|
||||
context '.academic_years' do
|
||||
before :each do
|
||||
ay_2021_22
|
||||
ay_2022_23
|
||||
end
|
||||
|
||||
it 'returns all academic years' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.academic_years).to eq AcademicYear.all.order(:range)
|
||||
end
|
||||
end
|
||||
|
||||
context '.selected_academic_years' do
|
||||
before :each do
|
||||
ay_2021_22
|
||||
ay_2022_23
|
||||
wrong_ay
|
||||
end
|
||||
context 'when no academic years are provided in the params hash' do
|
||||
it 'returns an empty array if no params are provided' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_academic_years).to eq []
|
||||
end
|
||||
end
|
||||
context 'when a single academic year is provided in the params hash' do
|
||||
it 'returns the academic year with the given id' do
|
||||
params = { academic_years: '2021-22' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_academic_years).to eq [AcademicYear.find_by_range('2021-22')]
|
||||
|
||||
params = { academic_years: '2022-23' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_academic_years).to eq [AcademicYear.find_by_range('2022-23')]
|
||||
end
|
||||
end
|
||||
|
||||
context 'when multiple academic years are provided in the params hash' do
|
||||
it 'returns the academic year with the given ids' do
|
||||
params = { academic_years: '2021-22,2022-23' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_academic_years).to eq [AcademicYear.find_by_range('2021-22'),
|
||||
AcademicYear.find_by_range('2022-23')]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.races' do
|
||||
before :each do
|
||||
black
|
||||
white
|
||||
wrong_race
|
||||
end
|
||||
|
||||
it 'returns all races' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.races).to eq Race.all.order(designation: :ASC)
|
||||
end
|
||||
end
|
||||
|
||||
context '.selected_races' do
|
||||
before :each do
|
||||
black
|
||||
white
|
||||
wrong_race
|
||||
end
|
||||
context 'when no races are provided in the params hash' do
|
||||
it 'returns an array with all races if no params are provided' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_races).to eq presenter.races
|
||||
end
|
||||
end
|
||||
|
||||
context 'when one race is provided in the params hash' do
|
||||
it 'returns a single race with the given slug' do
|
||||
params = { races: 'white' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_races).to eq [Race.find_by_slug('white')]
|
||||
|
||||
params = { races: 'black' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_races).to eq [Race.find_by_slug('black')]
|
||||
end
|
||||
end
|
||||
|
||||
context 'when multiple races are provided in the params hash' do
|
||||
it 'returns multiple races with the given slugs' do
|
||||
params = { races: 'white,black' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_races).to eq [Race.find_by_slug('white'), Race.find_by_slug('black')]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.graph' do
|
||||
context 'when no params are provided' do
|
||||
it 'returns the default(first) graph object' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::AllData.new.to_s
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a graph is provided in the params hash' do
|
||||
it 'returns the graph object with the given slug' do
|
||||
params = { graph: 'all_data' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::AllData.new.to_s
|
||||
|
||||
params = { graph: 'students-and-teachers' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::StudentsAndTeachers.new.to_s
|
||||
|
||||
params = { graph: 'students-by-race' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::StudentsByRace.new(races: nil).to_s
|
||||
|
||||
params = { graph: 'students-by-grade' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::StudentsByGrade.new(grades: nil).to_s
|
||||
|
||||
params = { graph: 'students-by-gender' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::StudentsByGender.new(genders: nil).to_s
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a parameter that does not match a graph is provided' do
|
||||
it 'returns the default(first) graph object' do
|
||||
params = { graph: 'invalid parameter' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.graph.to_s).to eq Analyze::Graph::AllData.new.to_s
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.grades' do
|
||||
before :each do
|
||||
school
|
||||
academic_year
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 1, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 2, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 3, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 4, survey_item:)
|
||||
end
|
||||
|
||||
context 'when no grades are provided in the params hash' do
|
||||
it 'returns the set of grades for which there are more than ten responses' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.grades).to eq [1, 2, 3, 4]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.selected_grades' do
|
||||
before :each do
|
||||
school
|
||||
academic_year
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 1, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 2, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 3, survey_item:)
|
||||
create_list(:survey_item_response, 20, school:, academic_year:, grade: 4, survey_item:)
|
||||
end
|
||||
|
||||
context 'when no grades are provided in the params hash' do
|
||||
it 'returns only the set of grades selected even if other grades have sufficient responses' do
|
||||
params = { grades: '1,2,3' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_grades).to eq [1, 2, 3]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.selected_genders' do
|
||||
before :each do
|
||||
male
|
||||
female
|
||||
wrong_gender
|
||||
end
|
||||
context 'when no parameters are provided' do
|
||||
it 'returns all genders' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_genders).to eq Gender.all
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a single gender is provided in the params hash' do
|
||||
it 'returns the gender with the given designation' do
|
||||
params = { genders: 'female' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_genders).to eq [Gender.find_by_designation('female')]
|
||||
|
||||
params = { genders: 'male' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_genders).to eq [Gender.find_by_designation('male')]
|
||||
end
|
||||
end
|
||||
|
||||
context 'when multiple genders are provided in the params hash' do
|
||||
it 'returns multilple genders with the given designations' do
|
||||
params = { genders: 'female,male' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.selected_genders).to eq [Gender.find_by_designation('female'),
|
||||
Gender.find_by_designation('male')]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.genders' do
|
||||
before :each do
|
||||
female
|
||||
male
|
||||
end
|
||||
|
||||
it 'returns all genders' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.genders).to eq Gender.all
|
||||
end
|
||||
end
|
||||
|
||||
context '.group' do
|
||||
context 'when no parameters are provided' do
|
||||
it 'returns the first item in the list of groups' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.group.slug).to eq presenter.groups.first.slug
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a group is provided in the params hash' do
|
||||
it 'returns the group with the given slug' do
|
||||
params = { group: 'gender' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.group.slug).to eq 'gender'
|
||||
|
||||
params = { group: 'grade' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.group.slug).to eq 'grade'
|
||||
|
||||
params = { group: 'race' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.group.slug).to eq 'race'
|
||||
|
||||
# Not yet implemented
|
||||
# params = { group: 'income' }
|
||||
# presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
# expect(presenter.group.slug).to eq 'income'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a parameter that does not match a group is provided' do
|
||||
it 'returns the first item in the list of groups' do
|
||||
params = { group: 'invalid group' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.group.slug).to eq presenter.groups.first.slug
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.slice' do
|
||||
context 'when no parameters are provided' do
|
||||
it 'returns the first item in the list of slices' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'all-data'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a slice is provided in the params hash' do
|
||||
it 'returns the slice with the given slug' do
|
||||
params = { source: 'survey-data-only', slice: 'students-and-teachers' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'students-and-teachers'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a slice is provided but the source is left blank ' do
|
||||
it 'returns the slice from the default source (all-data)' do
|
||||
params = { slice: 'students-and-teachers' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'all-data'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a parameter that does not match a slice is provided' do
|
||||
it 'it returns the first slice from the chosen source' do
|
||||
params = { source: 'survey-data-only', slice: 'invalid-slice' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'students-and-teachers'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context '.source' do
|
||||
context 'when no parameters are provided' do
|
||||
it 'returns the first item in the list of sources' do
|
||||
params = {}
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'all-data'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a source is provided in the params hash' do
|
||||
it 'returns the source with the given slug' do
|
||||
params = { source: 'all-data' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.source.slug).to eq 'all-data'
|
||||
|
||||
params = { source: 'survey-data-only' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.source.slug).to eq 'survey-data-only'
|
||||
end
|
||||
end
|
||||
|
||||
context 'when a parameter that does not match a source is provided' do
|
||||
it 'returns the first item in the list of sources' do
|
||||
params = { source: 'invalid-source' }
|
||||
presenter = Analyze::Presenter.new(params:, school:, academic_year:)
|
||||
expect(presenter.slice.slug).to eq 'all-data'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Reference in new issue