diff --git a/app/assets/stylesheets/partials/_overview.scss b/app/assets/stylesheets/partials/_overview.scss index d9659843..8a9156ec 100644 --- a/app/assets/stylesheets/partials/_overview.scss +++ b/app/assets/stylesheets/partials/_overview.scss @@ -89,6 +89,26 @@ width: 20px; } +.overall-response-rate-row { + width: 55%; + display: flex; + flex-direction: row; + justify-content: space-between; + margin-top: -23px; +} + +.overall-response-rate-container { + padding: 0.4em 0.7em; + width: 48%; + display: flex; + justify-content: space-between; + align-items: center; + color: $gray-1; + @extend .bg-color-gray-3; + @extend .border-radius-8; + @extend .font-size-14 +} + @media only screen and (min-width: 768px){ .measure-row-label { width: 170px; diff --git a/app/controllers/overview_controller.rb b/app/controllers/overview_controller.rb index 0ba335ca..bc7a17e5 100644 --- a/app/controllers/overview_controller.rb +++ b/app/controllers/overview_controller.rb @@ -7,6 +7,10 @@ class OverviewController < SqmApplicationController def index @variance_chart_row_presenters = measures.map(&method(:presenter_for_measure)) @category_presenters = Category.sorted.map { |category| CategoryPresenter.new(category:) } + @student_response_rate_presenter = ResponseRatePresenter.new(focus: :student, school: @school, + academic_year: @academic_year) + @teacher_response_rate_presenter = ResponseRatePresenter.new(focus: :teacher, school: @school, + academic_year: @academic_year) end private diff --git a/app/presenters/response_rate_presenter.rb b/app/presenters/response_rate_presenter.rb new file mode 100644 index 00000000..5485fec5 --- /dev/null +++ b/app/presenters/response_rate_presenter.rb @@ -0,0 +1,45 @@ +class ResponseRatePresenter + attr_reader :focus, :academic_year, :school, :survey_items + + def initialize(focus:, academic_year:, school:) + @focus = focus + @academic_year = academic_year + @school = school + @survey_items = SurveyItem.student_survey_items if focus == :student + @survey_items = SurveyItem.teacher_survey_items if focus == :teacher + end + + def date + SurveyItemResponse.where(survey_item: survey_items, school:).order(updated_at: :DESC).first&.updated_at || Date.new + end + + def percentage + cap_at_100(actual_count.to_f / respondents_count.to_f * 100).round + end + + def color + # Problem: the color (either $gold or $purple) is determined by the scss variable, but the + # percentage is decided by the presenter. Therefore the class style must be generated + # within this file and not the scss file. + # TODO: Fix this. + percentage > 75 ? "#49416D" : "#FFC857" + end + + private + + def cap_at_100(value) + value > 100 ? 100 : value + end + + def actual_count + SurveyItemResponse.where(school:, academic_year:, + survey_item: survey_items).select(:response_id).distinct.count + end + + def respondents_count + respondents = Respondent.find_by(school:, academic_year:) + count = respondents.total_students if focus == :student + count = respondents.total_teachers if focus == :teacher + count + end +end diff --git a/app/services/survey_responses_data_loader.rb b/app/services/survey_responses_data_loader.rb index 6f8e1230..8f5f2a3a 100644 --- a/app/services/survey_responses_data_loader.rb +++ b/app/services/survey_responses_data_loader.rb @@ -68,7 +68,7 @@ class SurveyResponsesDataLoader likert_score = row.likert_score(survey_item_id: survey_item.survey_item_id) || next unless likert_score.valid_likert_score? - puts "Response ID: #{row.response_id}, Likert score: #{likert_score} rejected" unless likert_score == 'NA' + puts "Response ID: #{row.response_id}, Likert score: #{likert_score} rejected" unless likert_score == "NA" next end response = row.survey_item_response(survey_item:) @@ -96,7 +96,7 @@ class SurveyResponsesDataLoader def self.get_survey_item_ids_from_headers(headers:) CSV.parse(headers).first .filter(&:present?) - .filter { |header| header.start_with? 't-', 's-' } + .filter { |header| header.start_with? "t-", "s-" } end private_class_method :process_row diff --git a/app/views/overview/_response_rate.html.erb b/app/views/overview/_response_rate.html.erb new file mode 100644 index 00000000..5ec1c145 --- /dev/null +++ b/app/views/overview/_response_rate.html.erb @@ -0,0 +1,8 @@ +
+
Response Rates as of <%= response_rate_presenter.date.to_date.strftime("%m/%d/%y") %>
+
+
<%= response_rate_presenter.focus.capitalize %>
+ <%= render partial: "response_rate_graphic", locals: {response_rate_presenter: response_rate_presenter}, cached: true %> +
<%= response_rate_presenter.percentage %>%
+
+
diff --git a/app/views/overview/_response_rate_graphic.html.erb b/app/views/overview/_response_rate_graphic.html.erb new file mode 100644 index 00000000..34798ec8 --- /dev/null +++ b/app/views/overview/_response_rate_graphic.html.erb @@ -0,0 +1,35 @@ + + +
+
+
diff --git a/app/views/overview/index.html.erb b/app/views/overview/index.html.erb index 97c869cb..b1c062c0 100644 --- a/app/views/overview/index.html.erb +++ b/app/views/overview/index.html.erb @@ -81,6 +81,12 @@ <%= render partial: "quality_framework_indicators", locals: { category_presenters: @category_presenters }, cached: true %> + +
+ <%= render partial: "response_rate", locals: {response_rate_presenter: @student_response_rate_presenter}, cached: true %> + <%= render partial: "response_rate", locals: {response_rate_presenter: @teacher_response_rate_presenter}, cached: true %> +
+

Distance From Benchmark

diff --git a/spec/fixtures/test_2020-21_student_survey_responses.csv b/spec/fixtures/test_2020-21_student_survey_responses.csv index 0ba7eb03..56d58ce0 100644 --- a/spec/fixtures/test_2020-21_student_survey_responses.csv +++ b/spec/fixtures/test_2020-21_student_survey_responses.csv @@ -6,4 +6,3 @@ Start Date,End Date,Response Type,IP Address,Progress,Duration (in seconds),Fini 2021-03-31 9:51:39,2021-03-31 10:01:36,0,73.47.153.77,100,596,1,2021-03-31T10:01:36,student_survey_response_5,567890,,,,,42.65820313,-71.30580139,anonymous,EN,3,2,1500505,6,15,109,3710,7,1,,2,2,2,,,,,,,,,,3,3,4,3,3,3,3,4,3,4,3,4,4,5,4,3,4,3,5,2,2,3,,,,,,,,,,,,1,,2,5,1,3,3,2,4,3,5,4,,,,,,,,,,,,5,4,3,4,4,4,4,4,4,,,,,,,2,,2,,EN,,,Social Studies teacher,,"1,2,3,4,5,8,6,7",888,7,4,Free Lunch,Economically Disadvantaged – Y 2021-03-31 9:51:39,2021-03-31 10:01:36,0,73.47.153.77,100,596,1,2021-03-31T10:01:36,student_survey_response_6,,,,,,42.65820313,-71.30580139,anonymous,EN,3,2,1500505,6,15,109,3710,7,1,,2,2,2,,,,,,,,,,3,3,4,3,3,3,3,4,3,4,3,4,4,5,4,3,4,3,5,2,2,3,,,,,,,,,,,,1,,2,5,1,3,3,2,4,3,5,4,,,,,,,,,,,,5,4,3,4,4,4,4,4,4,,,,,,,2,,2,,EN,,,Social Studies teacher,,"1,2,3,4,5,8",888,3,NA,Not Eligible,Economically Disadvantaged – N 2021-03-31 9:51:39,2021-03-31 10:01:36,0,73.47.153.77,100,596,1,2021-03-31T10:01:36,student_survey_response_7,,,,,,42.65820313,-71.30580139,anonymous,EN,3,2,1500505,6,15,109,3710,7,1,,2,2,2,,,,,,,,,,3,3,4,3,3,3,3,4,3,4,3,4,4,5,4,3,4,3,5,2,2,3,,,,,,,,,,,,1,,2,5,1,3,3,2,4,3,5,4,,,,,,,,,,,,5,4,3,4,4,4,4,4,4,,,,,,,2,,2,,EN,,,Social Studies teacher,,,,4,,Reduced Lunch,Economically Disadvantaged – Y -,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1,2,3,4,5,8",,,,, diff --git a/spec/presenters/response_rate_presenter_spec.rb b/spec/presenters/response_rate_presenter_spec.rb new file mode 100644 index 00000000..d3eb94d7 --- /dev/null +++ b/spec/presenters/response_rate_presenter_spec.rb @@ -0,0 +1,160 @@ +require "rails_helper" + +describe ResponseRatePresenter do + let(:academic_year) { create(:academic_year, range: "2022-23") } + let(:school) { create(:school, name: "A school") } + let(:respondents) { create(:respondent, school:, academic_year:, total_students: 40, total_teachers: 40) } + let(:wrong_school) { create(:school, name: "Wrong school") } + let(:wrong_academic_year) { create(:academic_year) } + let(:wrong_respondents) do + create(:respondent, school: wrong_school, academic_year: wrong_academic_year, total_students: 40, + total_teachers: 40) + end + + let(:student_survey_item) { create(:student_survey_item) } + let(:teacher_survey_item) { create(:teacher_survey_item) } + let(:oldest_student_survey_response) do + create(:survey_item_response, school:, academic_year:, survey_item: student_survey_item) + end + let(:newest_student_survey_response) do + create(:survey_item_response, school:, academic_year:, survey_item: student_survey_item) + end + let(:oldest_teacher_survey_response) do + create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item) + end + let(:newest_teacher_survey_response) do + create(:survey_item_response, school:, academic_year:, survey_item: teacher_survey_item) + end + + let(:wrong_student_survey_response) do + create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year, + survey_item: student_survey_item) + end + let(:wrong_teacher_survey_response) do + create(:survey_item_response, school: wrong_school, academic_year: wrong_academic_year, + survey_item: teacher_survey_item) + end + + context ".date" do + context "when focus is student" do + before :each do + oldest_student_survey_response + newest_student_survey_response + wrong_student_survey_response + wrong_teacher_survey_response + end + + it "ignores all teacher items and only gets the modified date of the last student item" do + rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).date + expect(rdate).to eq(newest_student_survey_response.updated_at) + end + end + context "when focus is teacher" do + before :each do + oldest_teacher_survey_response + newest_teacher_survey_response + wrong_student_survey_response + wrong_teacher_survey_response + end + + it "ignores all student responses and only gets the modified date of the last teacher item" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).date + expect(rdate).to eq(newest_teacher_survey_response.updated_at) + end + end + end + + context ".percentage" do + before :each do + respondents + wrong_respondents + end + context "when no survey responses are found for a school" do + it "returns a response rate of 0" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(0) + end + end + + context "when there all possible teacher respondents answered questions" do + before :each do + create_list(:survey_item_response, 40, school:, academic_year:, + survey_item: teacher_survey_item) + end + + it "returns a response rate of 100" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(100) + end + end + + context "when more teachers responded than staff the school" do + before :each do + create_list(:survey_item_response, 80, school:, academic_year:, + survey_item: teacher_survey_item) + end + + it "returns a response rate of 100" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(100) + end + end + + context "when three quarters of the teachers responded to the survey" do + before :each do + create_list(:survey_item_response, 30, school:, academic_year:, + survey_item: teacher_survey_item) + end + + it "returns a response rate of 75" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(75) + end + end + context "when one quarter of the teachers responded to the survey" do + before :each do + create_list(:survey_item_response, 10, school:, academic_year:, + survey_item: teacher_survey_item) + end + + it "returns a response rate of 25" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(25) + end + end + context "When the percentage is not a round number" do + before :each do + create_list(:survey_item_response, 9, school:, academic_year:, + survey_item: teacher_survey_item) + end + + it "its rounded to the nearest integer" do + rdate = ResponseRatePresenter.new(focus: :teacher, academic_year:, school:).percentage + expect(rdate).to eq(23) + end + end + + context "when there all possible student respondents answered questions" do + before :each do + create_list(:survey_item_response, 40, school:, academic_year:, + survey_item: student_survey_item) + end + + it "returns a response rate of 100" do + rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).percentage + expect(rdate).to eq(100) + end + end + context "when half of all students responded" do + before :each do + create_list(:survey_item_response, 20, school:, academic_year:, + survey_item: student_survey_item) + end + + it "returns a response rate of 50" do + rdate = ResponseRatePresenter.new(focus: :student, academic_year:, school:).percentage + expect(rdate).to eq(50) + end + end + end +end diff --git a/spec/services/cleaner_spec.rb b/spec/services/cleaner_spec.rb index b572572a..4372faa2 100644 --- a/spec/services/cleaner_spec.rb +++ b/spec/services/cleaner_spec.rb @@ -1,46 +1,46 @@ -require 'rails_helper' -require 'fileutils' +require "rails_helper" +require "fileutils" RSpec.describe Cleaner do - let(:district) { create(:district, name: 'Maynard Public Schools') } - let(:second_district) { create(:district, name: 'District2') } + let(:district) { create(:district, name: "Maynard Public Schools") } + let(:second_district) { create(:district, name: "District2") } let(:school) { create(:school, dese_id: 1_740_505, district:) } let(:second_school) { create(:school, dese_id: 1_740_305, district:) } let(:third_school) { create(:school, dese_id: 222_222, district: second_district) } - let(:academic_year) { create(:academic_year, range: '2022-23') } + let(:academic_year) { create(:academic_year, range: "2022-23") } let(:respondents) do create(:respondent, school:, academic_year:, one: 0, nine: 40, ten: 40, eleven: 40, twelve: 40) create(:respondent, school: second_school, academic_year:, one: 0, four: 40, five: 40, six: 40, seven: 40, eight: 40) end - let(:recorded_date) { '2023-04-01' } + let(:recorded_date) { "2023-04-01" } let(:input_filepath) do - Rails.root.join('spec', 'fixtures', 'raw') + Rails.root.join("spec", "fixtures", "raw") end let(:output_filepath) do - Rails.root.join('tmp', 'spec', 'clean') + Rails.root.join("tmp", "spec", "clean") end let(:log_filepath) do - Rails.root.join('tmp', 'spec', 'removed') + Rails.root.join("tmp", "spec", "removed") end let(:disaggregation_filepath) do - Rails.root.join('spec', 'fixtures', 'disaggregation') + Rails.root.join("spec", "fixtures", "disaggregation") end let(:path_to_sample_disaggregation_file) do - File.open(Rails.root.join('spec', 'fixtures', 'disaggregation', 'sample_maynard_disaggregation_data.csv')) + File.open(Rails.root.join("spec", "fixtures", "disaggregation", "sample_maynard_disaggregation_data.csv")) end let(:path_to_sample_raw_file) do - File.open(Rails.root.join('spec', 'fixtures', 'raw', 'sample_maynard_raw_student_survey.csv')) + File.open(Rails.root.join("spec", "fixtures", "raw", "sample_maynard_raw_student_survey.csv")) end let(:common_headers) do - ['Recorded Date', 'DeseID', 'ResponseID'] + ["Recorded Date", "Dese ID", "ResponseID"] end let(:standard_survey_items) do @@ -58,16 +58,16 @@ RSpec.describe Cleaner do end let(:short_form_survey_items) do - ([create(:survey_item, survey_item_id: 's-phys-q1', on_short_form: true), - create(:survey_item, survey_item_id: 's-phys-q2', on_short_form: true), - create(:survey_item, survey_item_id: 's-phys-q3', + ([create(:survey_item, survey_item_id: "s-phys-q1", on_short_form: true), + create(:survey_item, survey_item_id: "s-phys-q2", on_short_form: true), + create(:survey_item, survey_item_id: "s-phys-q3", on_short_form: true)].map(&:survey_item_id) << common_headers).flatten end let(:early_education_survey_items) do - ([create(:survey_item, survey_item_id: 's-emsa-es1'), - create(:survey_item, survey_item_id: 's-emsa-es2'), - create(:survey_item, survey_item_id: 's-emsa-es3')].map(&:survey_item_id) << common_headers).flatten + ([create(:survey_item, survey_item_id: "s-emsa-es1"), + create(:survey_item, survey_item_id: "s-emsa-es2"), + create(:survey_item, survey_item_id: "s-emsa-es3")].map(&:survey_item_id) << common_headers).flatten end let(:teacher_survey_items) do @@ -97,20 +97,20 @@ RSpec.describe Cleaner do respondents end - context 'Creating a new Cleaner' do - it 'creates a directory for the clean data' do + context "Creating a new Cleaner" do + it "creates a directory for the clean data" do Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).clean expect(output_filepath).to exist end - it 'creates a directory for the removed data' do + it "creates a directory for the removed data" do Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).clean expect(log_filepath).to exist end end - context '.process_raw_file' do - it 'sorts data into valid and invalid csvs' do + context ".process_raw_file" do + it "sorts data into valid and invalid csvs" do cleaner = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:) processed_data = cleaner.process_raw_file( file: path_to_sample_raw_file, disaggregation_data: cleaner.disaggregation_data @@ -141,85 +141,85 @@ RSpec.describe Cleaner do invalid_rows_are_rejected_for_the_correct_reasons(data) end - it 'adds dissaggregation data to the cleaned file ' do + it "adds dissaggregation data to the cleaned file " do cleaner = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:) processed_data = cleaner.process_raw_file( file: path_to_sample_raw_file, disaggregation_data: cleaner.disaggregation_data ) processed_data in [headers, clean_csv, log_csv, data] - expect(clean_csv.second.last).to eq 'Economically Disadvantaged - Y' + expect(clean_csv.second.last).to eq "Economically Disadvantaged - Y" - one_thousand = data.find { |row| row.response_id == '1000' } - expect(one_thousand.income).to eq 'Economically Disadvantaged - Y' + one_thousand = data.find { |row| row.response_id == "1000" } + expect(one_thousand.income).to eq "Economically Disadvantaged - Y" - one_thousand_one = data.find { |row| row.response_id == '1001' } - expect(one_thousand_one.income).to eq 'Economically Disadvantaged - N' + one_thousand_one = data.find { |row| row.response_id == "1001" } + expect(one_thousand_one.income).to eq "Economically Disadvantaged - N" end end - context '.filename' do - context 'defines a filename in the format: [district].[early_ed/short_form/standard/teacher].[year as 2022-23]' do - context 'when the file is based on standard survey items' do - it 'adds the survey type as standard to the filename' do + context ".filename" do + context "defines a filename in the format: [district].[early_ed/short_form/standard/teacher].[year as 2022-23]" do + context "when the file is based on standard survey items" do + it "adds the survey type as standard to the filename" do survey_items = SurveyItem.where(survey_item_id: standard_survey_items) - data = [SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '1_740_505' }, headers: standard_survey_items, genders: nil, survey_items:, + data = [SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "1_740_505" }, headers: standard_survey_items, genders: nil, survey_items:, schools: School.school_hash)] filename = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).filename( headers: standard_survey_items, data: ) - expect(filename).to eq 'maynard.standard.2022-23.csv' + expect(filename).to eq "maynard.standard.2022-23.csv" end - context 'when the file is based on short form survey items' do - it 'adds the survey type as short form to the filename' do + context "when the file is based on short form survey items" do + it "adds the survey type as short form to the filename" do survey_items = SurveyItem.where(survey_item_id: short_form_survey_items) - data = [SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '1_740_505' }, headers: short_form_survey_items, genders: nil, survey_items:, + data = [SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "1_740_505" }, headers: short_form_survey_items, genders: nil, survey_items:, schools: School.school_hash)] filename = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).filename( headers: short_form_survey_items, data: ) - expect(filename).to eq 'maynard.short_form.2022-23.csv' + expect(filename).to eq "maynard.short_form.2022-23.csv" end end - context 'when the file is based on early education survey items' do - it 'adds the survey type as early education to the filename' do + context "when the file is based on early education survey items" do + it "adds the survey type as early education to the filename" do survey_items = SurveyItem.where(survey_item_id: early_education_survey_items) - data = [SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '1_740_505' }, headers: early_education_survey_items, genders: nil, survey_items:, + data = [SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "1_740_505" }, headers: early_education_survey_items, genders: nil, survey_items:, schools: School.school_hash)] filename = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).filename( headers: early_education_survey_items, data: ) - expect(filename).to eq 'maynard.early_education.2022-23.csv' + expect(filename).to eq "maynard.early_education.2022-23.csv" end end - context 'when the file is based on teacher survey items' do - it 'adds the survey type as teacher to the filename' do + context "when the file is based on teacher survey items" do + it "adds the survey type as teacher to the filename" do survey_items = SurveyItem.where(survey_item_id: teacher_survey_items) - data = [SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '1_740_505' }, headers: teacher_survey_items, genders: nil, survey_items:, + data = [SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "1_740_505" }, headers: teacher_survey_items, genders: nil, survey_items:, schools: School.school_hash)] filename = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).filename( headers: teacher_survey_items, data: ) - expect(filename).to eq 'maynard.teacher.2022-23.csv' + expect(filename).to eq "maynard.teacher.2022-23.csv" end end - context 'when there is more than one district' do - it 'adds all districts to the filename' do + context "when there is more than one district" do + it "adds all districts to the filename" do survey_items = SurveyItem.where(survey_item_id: teacher_survey_items) - data = [SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '1_740_505' }, headers: teacher_survey_items, genders: nil, survey_items:, schools: School.school_hash), - SurveyItemValues.new(row: { 'Recorded Date' => recorded_date, 'Dese ID' => '222_222' }, + data = [SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "1_740_505" }, headers: teacher_survey_items, genders: nil, survey_items:, schools: School.school_hash), + SurveyItemValues.new(row: { "Recorded Date" => recorded_date, "Dese ID" => "222_222" }, headers: teacher_survey_items, genders: nil, survey_items:, schools: School.school_hash)] filename = Cleaner.new(input_filepath:, output_filepath:, log_filepath:, disaggregation_filepath:).filename( headers: teacher_survey_items, data: ) - expect(filename).to eq 'maynard.district2.teacher.2022-23.csv' + expect(filename).to eq "maynard.district2.teacher.2022-23.csv" end end end @@ -229,90 +229,90 @@ end def reads_headers_from_raw_csv(processed_data) processed_data in [headers, clean_csv, log_csv, data] - expect(headers).to eq ['StartDate', 'EndDate', 'Status', 'IPAddress', 'Progress', 'Duration (in seconds)', - 'Finished', 'RecordedDate', 'ResponseId', 'District', 'School', - 'LASID', 'Gender', 'Race', 'What grade are you in?', 's-emsa-q1', 's-emsa-q2', 's-emsa-q3', 's-tint-q1', - 's-tint-q2', 's-tint-q3', 's-tint-q4', 's-tint-q5', 's-acpr-q1', 's-acpr-q2', - 's-acpr-q3', 's-acpr-q4', 's-cure-q1', 's-cure-q2', 's-cure-q3', 's-cure-q4', 's-sten-q1', 's-sten-q2', - 's-sten-q3', 's-sper-q1', 's-sper-q2', 's-sper-q3', 's-sper-q4', 's-civp-q1', 's-civp-q2', 's-civp-q3', - 's-civp-q4', 's-grmi-q1', 's-grmi-q2', 's-grmi-q3', 's-grmi-q4', 's-appa-q1', 's-appa-q2', 's-appa-q3', - 's-peff-q1', 's-peff-q2', 's-peff-q3', 's-peff-q4', 's-peff-q5', 's-peff-q6', 's-sbel-q1', 's-sbel-q2', - 's-sbel-q3', 's-sbel-q4', 's-sbel-q5', 's-phys-q1', 's-phys-q2', 's-phys-q3', 's-phys-q4', 's-vale-q1', - 's-vale-q2', 's-vale-q3', 's-vale-q4', 's-acst-q1', 's-acst-q2', 's-acst-q3', 's-sust-q1', 's-sust-q2', - 's-grit-q1', 's-grit-q2', 's-grit-q3', 's-grit-q4', 's-expa-q1', 's-poaf-q1', 's-poaf-q2', 's-poaf-q3', - 's-poaf-q4', 's-tint-q1-1', 's-tint-q2-1', 's-tint-q3-1', 's-tint-q4-1', 's-tint-q5-1', 's-acpr-q1-1', - 's-acpr-q2-1', 's-acpr-q3-1', 's-acpr-q4-1', 's-peff-q1-1', 's-peff-q2-1', 's-peff-q3-1', 's-peff-q4-1', - 's-peff-q5-1', 's-peff-q6-1', 'Raw Income', 'Income'] + expect(headers).to eq ["StartDate", "EndDate", "Status", "IPAddress", "Progress", "Duration (in seconds)", + "Finished", "RecordedDate", "ResponseId", "District", "School", + "LASID", "Gender", "Race", "What grade are you in?", "s-emsa-q1", "s-emsa-q2", "s-emsa-q3", "s-tint-q1", + "s-tint-q2", "s-tint-q3", "s-tint-q4", "s-tint-q5", "s-acpr-q1", "s-acpr-q2", + "s-acpr-q3", "s-acpr-q4", "s-cure-q1", "s-cure-q2", "s-cure-q3", "s-cure-q4", "s-sten-q1", "s-sten-q2", + "s-sten-q3", "s-sper-q1", "s-sper-q2", "s-sper-q3", "s-sper-q4", "s-civp-q1", "s-civp-q2", "s-civp-q3", + "s-civp-q4", "s-grmi-q1", "s-grmi-q2", "s-grmi-q3", "s-grmi-q4", "s-appa-q1", "s-appa-q2", "s-appa-q3", + "s-peff-q1", "s-peff-q2", "s-peff-q3", "s-peff-q4", "s-peff-q5", "s-peff-q6", "s-sbel-q1", "s-sbel-q2", + "s-sbel-q3", "s-sbel-q4", "s-sbel-q5", "s-phys-q1", "s-phys-q2", "s-phys-q3", "s-phys-q4", "s-vale-q1", + "s-vale-q2", "s-vale-q3", "s-vale-q4", "s-acst-q1", "s-acst-q2", "s-acst-q3", "s-sust-q1", "s-sust-q2", + "s-grit-q1", "s-grit-q2", "s-grit-q3", "s-grit-q4", "s-expa-q1", "s-poaf-q1", "s-poaf-q2", "s-poaf-q3", + "s-poaf-q4", "s-tint-q1-1", "s-tint-q2-1", "s-tint-q3-1", "s-tint-q4-1", "s-tint-q5-1", "s-acpr-q1-1", + "s-acpr-q2-1", "s-acpr-q3-1", "s-acpr-q4-1", "s-peff-q1-1", "s-peff-q2-1", "s-peff-q3-1", "s-peff-q4-1", + "s-peff-q5-1", "s-peff-q6-1", "Raw Income", "Income"] end def invalid_rows_are_rejected_for_the_correct_reasons(data) - one_thousand_two = data.find { |row| row.response_id == '1002' } + one_thousand_two = data.find { |row| row.response_id == "1002" } expect(one_thousand_two.valid_progress?).to eq false expect(one_thousand_two.valid_duration?).to eq true expect(one_thousand_two.valid_grade?).to eq true expect(one_thousand_two.valid_sd?).to eq true - one_thousand_three = data.find { |row| row.response_id == '1003' } + one_thousand_three = data.find { |row| row.response_id == "1003" } expect(one_thousand_three.valid_progress?).to eq false expect(one_thousand_three.valid_duration?).to eq true expect(one_thousand_three.valid_grade?).to eq true expect(one_thousand_three.valid_sd?).to eq true - one_thousand_six = data.find { |row| row.response_id == '1006' } + one_thousand_six = data.find { |row| row.response_id == "1006" } expect(one_thousand_six.valid_progress?).to eq true expect(one_thousand_six.valid_duration?).to eq false expect(one_thousand_six.valid_grade?).to eq true expect(one_thousand_six.valid_sd?).to eq true - one_thousand_seven = data.find { |row| row.response_id == '1007' } + one_thousand_seven = data.find { |row| row.response_id == "1007" } expect(one_thousand_seven.valid_progress?).to eq true expect(one_thousand_seven.valid_duration?).to eq false expect(one_thousand_seven.valid_grade?).to eq true expect(one_thousand_seven.valid_sd?).to eq true - one_thousand_seven = data.find { |row| row.response_id == '1007' } + one_thousand_seven = data.find { |row| row.response_id == "1007" } expect(one_thousand_seven.valid_progress?).to eq true expect(one_thousand_seven.valid_duration?).to eq false expect(one_thousand_seven.valid_grade?).to eq true expect(one_thousand_seven.valid_sd?).to eq true - one_thousand_nine = data.find { |row| row.response_id == '1009' } + one_thousand_nine = data.find { |row| row.response_id == "1009" } expect(one_thousand_nine.valid_progress?).to eq true expect(one_thousand_nine.valid_duration?).to eq true expect(one_thousand_nine.valid_grade?).to eq false expect(one_thousand_nine.valid_sd?).to eq true - one_thousand_ten = data.find { |row| row.response_id == '1010' } + one_thousand_ten = data.find { |row| row.response_id == "1010" } expect(one_thousand_ten.valid_progress?).to eq true expect(one_thousand_ten.valid_duration?).to eq true expect(one_thousand_ten.valid_grade?).to eq false expect(one_thousand_ten.valid_sd?).to eq true - one_thousand_eleven = data.find { |row| row.response_id == '1011' } + one_thousand_eleven = data.find { |row| row.response_id == "1011" } expect(one_thousand_eleven.valid_progress?).to eq true expect(one_thousand_eleven.valid_duration?).to eq true expect(one_thousand_eleven.valid_grade?).to eq false expect(one_thousand_eleven.valid_sd?).to eq true - one_thousand_twenty_two = data.find { |row| row.response_id == '1022' } + one_thousand_twenty_two = data.find { |row| row.response_id == "1022" } expect(one_thousand_twenty_two.valid_progress?).to eq true expect(one_thousand_twenty_two.valid_duration?).to eq true expect(one_thousand_twenty_two.valid_grade?).to eq false expect(one_thousand_twenty_two.valid_sd?).to eq true - one_thousand_twenty_three = data.find { |row| row.response_id == '1023' } + one_thousand_twenty_three = data.find { |row| row.response_id == "1023" } expect(one_thousand_twenty_three.valid_progress?).to eq true expect(one_thousand_twenty_three.valid_duration?).to eq true expect(one_thousand_twenty_three.valid_grade?).to eq false expect(one_thousand_twenty_three.valid_sd?).to eq true - one_thousand_thirty_three = data.find { |row| row.response_id == '1033' } + one_thousand_thirty_three = data.find { |row| row.response_id == "1033" } expect(one_thousand_thirty_three.valid_progress?).to eq true expect(one_thousand_thirty_three.valid_duration?).to eq true expect(one_thousand_thirty_three.valid_grade?).to eq true expect(one_thousand_thirty_three.valid_sd?).to eq false - one_thousand_thirty_four = data.find { |row| row.response_id == '1034' } + one_thousand_thirty_four = data.find { |row| row.response_id == "1034" } expect(one_thousand_thirty_four.valid_progress?).to eq true expect(one_thousand_thirty_four.valid_duration?).to eq true expect(one_thousand_thirty_four.valid_grade?).to eq true diff --git a/spec/services/survey_item_values_spec.rb b/spec/services/survey_item_values_spec.rb index 9d41b24f..bf80ad90 100644 --- a/spec/services/survey_item_values_spec.rb +++ b/spec/services/survey_item_values_spec.rb @@ -1,30 +1,30 @@ -require 'rails_helper' +require "rails_helper" RSpec.describe SurveyItemValues, type: :model do let(:headers) do - ['StartDate', 'EndDate', 'Status', 'IPAddress', 'Progress', 'Duration (in seconds)', 'Finished', 'RecordedDate', - 'ResponseId', 'RecipientLastName', 'RecipientFirstName', 'RecipientEmail', 'ExternalReference', 'LocationLatitude', 'LocationLongitude', 'DistributionChannel', 'UserLanguage', 'District', 'School- Lee', 'School- Maynard', 'LASID', 'Grade', 's-emsa-q1', 's-emsa-q2', 's-emsa-q3', 's-tint-q1', 's-tint-q2', 's-tint-q3', 's-tint-q4', 's-tint-q5', 's-acpr-q1', 's-acpr-q2', 's-acpr-q3', 's-acpr-q4', 's-cure-q1', 's-cure-q2', 's-cure-q3', 's-cure-q4', 's-sten-q1', 's-sten-q2', 's-sten-q3', 's-sper-q1', 's-sper-q2', 's-sper-q3', 's-sper-q4', 's-civp-q1', 's-civp-q2', 's-civp-q3', 's-civp-q4', 's-grmi-q1', 's-grmi-q2', 's-grmi-q3', 's-grmi-q4', 's-appa-q1', 's-appa-q2', 's-appa-q3', 's-peff-q1', 's-peff-q2', 's-peff-q3', 's-peff-q4', 's-peff-q5', 's-peff-q6', 's-sbel-q1', 's-sbel-q2', 's-sbel-q3', 's-sbel-q4', 's-sbel-q5', 's-phys-q1', 's-phys-q2', 's-phys-q3', 's-phys-q4', 's-vale-q1', 's-vale-q2', 's-vale-q3', 's-vale-q4', 's-acst-q1', 's-acst-q2', 's-acst-q3', 's-sust-q1', 's-sust-q2', 's-grit-q1', 's-grit-q2', 's-grit-q3', 's-grit-q4', 's-expa-q1', 's-poaf-q1', 's-poaf-q2', 's-poaf-q3', 's-poaf-q4', 's-tint-q1-1', 's-tint-q2-1', 's-tint-q3-1', 's-tint-q4-1', 's-tint-q5-1', 's-acpr-q1-1', 's-acpr-q2-1', 's-acpr-q3-1', 's-acpr-q4-1', 's-peff-q1-1', 's-peff-q2-1', 's-peff-q3-1', 's-peff-q4-1', 's-peff-q5-1', 's-peff-q6-1', 'Gender', 'Race'] + ["StartDate", "EndDate", "Status", "IPAddress", "Progress", "Duration (in seconds)", "Finished", "RecordedDate", + "ResponseId", "RecipientLastName", "RecipientFirstName", "RecipientEmail", "ExternalReference", "LocationLatitude", "LocationLongitude", "DistributionChannel", "UserLanguage", "District", "School- Lee", "School- Maynard", "LASID", "Grade", "s-emsa-q1", "s-emsa-q2", "s-emsa-q3", "s-tint-q1", "s-tint-q2", "s-tint-q3", "s-tint-q4", "s-tint-q5", "s-acpr-q1", "s-acpr-q2", "s-acpr-q3", "s-acpr-q4", "s-cure-q1", "s-cure-q2", "s-cure-q3", "s-cure-q4", "s-sten-q1", "s-sten-q2", "s-sten-q3", "s-sper-q1", "s-sper-q2", "s-sper-q3", "s-sper-q4", "s-civp-q1", "s-civp-q2", "s-civp-q3", "s-civp-q4", "s-grmi-q1", "s-grmi-q2", "s-grmi-q3", "s-grmi-q4", "s-appa-q1", "s-appa-q2", "s-appa-q3", "s-peff-q1", "s-peff-q2", "s-peff-q3", "s-peff-q4", "s-peff-q5", "s-peff-q6", "s-sbel-q1", "s-sbel-q2", "s-sbel-q3", "s-sbel-q4", "s-sbel-q5", "s-phys-q1", "s-phys-q2", "s-phys-q3", "s-phys-q4", "s-vale-q1", "s-vale-q2", "s-vale-q3", "s-vale-q4", "s-acst-q1", "s-acst-q2", "s-acst-q3", "s-sust-q1", "s-sust-q2", "s-grit-q1", "s-grit-q2", "s-grit-q3", "s-grit-q4", "s-expa-q1", "s-poaf-q1", "s-poaf-q2", "s-poaf-q3", "s-poaf-q4", "s-tint-q1-1", "s-tint-q2-1", "s-tint-q3-1", "s-tint-q4-1", "s-tint-q5-1", "s-acpr-q1-1", "s-acpr-q2-1", "s-acpr-q3-1", "s-acpr-q4-1", "s-peff-q1-1", "s-peff-q2-1", "s-peff-q3-1", "s-peff-q4-1", "s-peff-q5-1", "s-peff-q6-1", "Gender", "Race"] end let(:genders) do create(:gender, qualtrics_code: 1) Gender.gender_hash end let(:survey_items) { [] } - let(:district) { create(:district, name: 'Attleboro') } + let(:district) { create(:district, name: "Attleboro") } let(:attleboro) do - create(:school, name: 'Attleboro', dese_id: 1234, district:) + create(:school, name: "Attleboro", dese_id: 1234, district:) end let(:attleboro_respondents) do create(:respondent, school: attleboro, academic_year: ay_2022_23, nine: 40, ten: 40, eleven: 40, twelve: 40) end let(:schools) { School.school_hash } - let(:recorded_date) { '2023-04-01' } + let(:recorded_date) { "2023-04-01" } let(:ay_2022_23) do - create(:academic_year, range: '2022-23') + create(:academic_year, range: "2022-23") end let(:common_headers) do - ['Recorded Date', 'DeseID', 'ResponseID', 'Duration (in seconds)', 'Gender', 'Grade'] + ["Recorded Date", "DeseID", "ResponseID", "Duration (in seconds)", "Gender", "Grade"] end let(:standard_survey_items) do @@ -42,9 +42,9 @@ RSpec.describe SurveyItemValues, type: :model do end let(:short_form_survey_items) do - survey_item_ids = [create(:survey_item, survey_item_id: 's-phys-q1', on_short_form: true), - create(:survey_item, survey_item_id: 's-phys-q2', on_short_form: true), - create(:survey_item, survey_item_id: 's-phys-q3', + survey_item_ids = [create(:survey_item, survey_item_id: "s-phys-q1", on_short_form: true), + create(:survey_item, survey_item_id: "s-phys-q2", on_short_form: true), + create(:survey_item, survey_item_id: "s-phys-q3", on_short_form: true)].map(&:survey_item_id) survey_item_ids.map do |survey_item_id| create(:survey_item, survey_item_id:) @@ -53,9 +53,9 @@ RSpec.describe SurveyItemValues, type: :model do end let(:early_education_survey_items) do - survey_item_ids = [create(:survey_item, survey_item_id: 's-emsa-es1'), - create(:survey_item, survey_item_id: 's-emsa-es2'), - create(:survey_item, survey_item_id: 's-emsa-es3')].map(&:survey_item_id) + survey_item_ids = [create(:survey_item, survey_item_id: "s-emsa-es1"), + create(:survey_item, survey_item_id: "s-emsa-es2"), + create(:survey_item, survey_item_id: "s-emsa-es3")].map(&:survey_item_id) survey_item_ids.map do |survey_item_id| create(:survey_item, survey_item_id:) end @@ -77,49 +77,50 @@ RSpec.describe SurveyItemValues, type: :model do (survey_item_ids << common_headers).flatten end - context '.recorded_date' do - it 'returns the recorded date' do - row = { 'RecordedDate' => '2017-01-01' } + context ".recorded_date" do + it "returns the recorded date" do + row = { "RecordedDate" => "2017-01-01" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) - expect(values.recorded_date).to eq Date.parse('2017-01-01') + expect(values.recorded_date).to eq Date.parse("2017-01-01") - headers = ['Recorded Date'] - row = { 'Recorded Date' => '2017-01-02' } + headers = ["Recorded Date"] + row = { "Recorded Date" => "2017-01-02" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) - expect(values.recorded_date).to eq Date.parse('2017-01-02') + expect(values.recorded_date).to eq Date.parse("2017-01-02") end end - context '.school' do - it 'returns the school that maps to the dese id provided' do + context ".school" do + it "returns the school that maps to the dese id provided" do attleboro - row = { 'Dese ID' => '1234' } + headers = ["Dese ID"] + row = { "Dese ID" => "1234" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) expect(values.school).to eq attleboro - row = { 'DeseID' => '1234' } + row = { "DeseID" => "1234" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) expect(values.school).to eq attleboro end end - context '.grade' do - it 'returns the grade that maps to the grade provided' do - row = { 'Grade' => '1' } + context ".grade" do + it "returns the grade that maps to the grade provided" do + row = { "Grade" => "1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) expect(values.grade).to eq 1 end end - context '.gender' do - it 'returns the grade that maps to the grade provided' do - row = { 'Gender' => '1' } + context ".gender" do + it "returns the grade that maps to the grade provided" do + row = { "Gender" => "1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:) expect(values.gender.qualtrics_code).to eq 1 end end - context '.respondent_type' do - it 'reads header to find the survey type' do + context ".respondent_type" do + it "reads header to find the survey type" do headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:) expect(values.respondent_type).to eq :student @@ -130,32 +131,32 @@ RSpec.describe SurveyItemValues, type: :model do end end - context '.survey_type' do - context 'when survey type is standard form' do - it 'returns the survey type' do + context ".survey_type" do + context "when survey type is standard form" do + it "returns the survey type" do headers = standard_survey_items values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:) expect(values.survey_type).to eq :standard end end - context 'when survey type is teacher form' do - it 'returns the survey type' do + context "when survey type is teacher form" do + it "returns the survey type" do headers = teacher_survey_items values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:) expect(values.survey_type).to eq :teacher end end - context 'when survey type is short form' do - it 'returns the survey type' do + context "when survey type is short form" do + it "returns the survey type" do headers = short_form_survey_items values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:) expect(values.survey_type).to eq :short_form end end - context 'when survey type is early education' do - it 'returns the survey type' do + context "when survey type is early education" do + it "returns the survey type" do headers = early_education_survey_items values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:) expect(values.survey_type).to eq :early_education @@ -163,235 +164,235 @@ RSpec.describe SurveyItemValues, type: :model do end end - context '.income' do - context 'when no disaggregation data is provided' do - it 'returns an empty string ' do + context ".income" do + context "when no disaggregation data is provided" do + it "returns an empty string " do disaggregation_data = {} values = SurveyItemValues.new(row: {}, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Unknown' + expect(values.income).to eq "Unknown" end end - context 'when disaggregation data is provided' do + context "when disaggregation data is provided" do before :each do attleboro ay_2022_23 end - it 'translates Free Lunch to Economically Disadvantaged - Y' do - headers = ['District', 'Academic Year', 'LASID', 'LowIncome'] - row = { 'District' => 'Attleboro', 'AcademicYear' => '2022-23', 'LASID' => '1', 'LowIncome' => 'Free Lunch' } + it "translates Free Lunch to Economically Disadvantaged - Y" do + headers = ["District", "Academic Year", "LASID", "LowIncome"] + row = { "District" => "Attleboro", "AcademicYear" => "2022-23", "LASID" => "1", "LowIncome" => "Free Lunch" } disaggregation_data = { %w[1 Attleboro 2022-23] => DisaggregationRow.new(row:, headers:) } - headers = ['LASID', 'Dese Id', 'RecordedDate'] - row = { 'LASID' => '1', 'DESE ID' => '1234', 'RecordedDate' => '2023-1-1' } + headers = ["LASID", "Dese Id", "RecordedDate"] + row = { "LASID" => "1", "DESE ID" => "1234", "RecordedDate" => "2023-1-1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Economically Disadvantaged - Y' + expect(values.income).to eq "Economically Disadvantaged - Y" end - it 'translates Reduced Lunch to Economically Disadvantaged - Y' do - headers = ['District', 'Academic Year', 'LASID', 'LowIncome'] - row = { 'District' => 'Attleboro', 'AcademicYear' => '2022-23', 'LASID' => '1', 'LowIncome' => 'Reduced Lunch' } + it "translates Reduced Lunch to Economically Disadvantaged - Y" do + headers = ["District", "Academic Year", "LASID", "LowIncome"] + row = { "District" => "Attleboro", "AcademicYear" => "2022-23", "LASID" => "1", "LowIncome" => "Reduced Lunch" } disaggregation_data = { %w[1 Attleboro 2022-23] => DisaggregationRow.new(row:, headers:) } - headers = ['LASID', 'Dese Id', 'RecordedDate'] - row = { 'LASID' => '1', 'DESE ID' => '1234', 'RecordedDate' => '2023-1-1' } + headers = ["LASID", "Dese Id", "RecordedDate"] + row = { "LASID" => "1", "DESE ID" => "1234", "RecordedDate" => "2023-1-1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Economically Disadvantaged - Y' + expect(values.income).to eq "Economically Disadvantaged - Y" end - it 'translates LowIncome to Economically Disadvantaged - Y' do - headers = ['District', 'Academic Year', 'LASID', 'LowIncome'] - row = { 'District' => 'Attleboro', 'AcademicYear' => '2022-23', 'LASID' => '1', 'LowIncome' => 'LowIncome' } + it "translates LowIncome to Economically Disadvantaged - Y" do + headers = ["District", "Academic Year", "LASID", "LowIncome"] + row = { "District" => "Attleboro", "AcademicYear" => "2022-23", "LASID" => "1", "LowIncome" => "LowIncome" } disaggregation_data = { %w[1 Attleboro 2022-23] => DisaggregationRow.new(row:, headers:) } - headers = ['LASID', 'Dese Id', 'RecordedDate'] - row = { 'LASID' => '1', 'DESE ID' => '1234', 'RecordedDate' => '2023-1-1' } + headers = ["LASID", "Dese Id", "RecordedDate"] + row = { "LASID" => "1", "DESE ID" => "1234", "RecordedDate" => "2023-1-1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Economically Disadvantaged - Y' + expect(values.income).to eq "Economically Disadvantaged - Y" end - it 'translates Not Eligible to Economically Disadvantaged - N' do - headers = ['District', 'Academic Year', 'LASID', 'LowIncome'] - row = { 'District' => 'Attleboro', 'AcademicYear' => '2022-23', 'LASID' => '1', 'LowIncome' => 'Not Eligible' } + it "translates Not Eligible to Economically Disadvantaged - N" do + headers = ["District", "Academic Year", "LASID", "LowIncome"] + row = { "District" => "Attleboro", "AcademicYear" => "2022-23", "LASID" => "1", "LowIncome" => "Not Eligible" } disaggregation_data = { %w[1 Attleboro 2022-23] => DisaggregationRow.new(row:, headers:) } - headers = ['LASID', 'Dese Id', 'RecordedDate'] - row = { 'LASID' => '1', 'DESE ID' => '1234', 'RecordedDate' => '2023-1-1' } + headers = ["LASID", "Dese Id", "RecordedDate"] + row = { "LASID" => "1", "DESE ID" => "1234", "RecordedDate" => "2023-1-1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Economically Disadvantaged - N' + expect(values.income).to eq "Economically Disadvantaged - N" end - it 'translates blanks to Unknown' do - headers = ['District', 'Academic Year', 'LASID', 'LowIncome'] - row = { 'District' => 'Attleboro', 'AcademicYear' => '2022-23', 'LASID' => '1', 'LowIncome' => '' } + it "translates blanks to Unknown" do + headers = ["District", "Academic Year", "LASID", "LowIncome"] + row = { "District" => "Attleboro", "AcademicYear" => "2022-23", "LASID" => "1", "LowIncome" => "" } disaggregation_data = { %w[1 Attleboro 2022-23] => DisaggregationRow.new(row:, headers:) } - headers = ['LASID', 'Dese Id', 'RecordedDate'] - row = { 'LASID' => '1', 'DESE ID' => '1234', 'RecordedDate' => '2023-1-1' } + headers = ["LASID", "Dese Id", "RecordedDate"] + row = { "LASID" => "1", "DESE ID" => "1234", "RecordedDate" => "2023-1-1" } values = SurveyItemValues.new(row:, headers:, genders:, survey_items:, schools:, disaggregation_data:) - expect(values.income).to eq 'Unknown' + expect(values.income).to eq "Unknown" end end end - context '.valid_duration' do - context 'when duration is valid' do - it 'returns true' do + context ".valid_duration" do + context "when duration is valid" do + it "returns true" do headers = standard_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '240', 'Gender' => 'Male' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "240", "Gender" => "Male" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true headers = teacher_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '300' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "300" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true headers = short_form_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '100' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "100" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true # When duration is blank or N/A or NA, we don't have enough information to kick out the row as invalid so we keep it in headers = short_form_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true headers = short_form_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => 'N/A' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "N/A" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true headers = short_form_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => 'NA' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "NA" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq true end end - context 'when duration is invalid' do - it 'returns false' do + context "when duration is invalid" do + it "returns false" do headers = standard_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '239' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "239" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq false headers = teacher_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '299' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "299" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq false headers = short_form_survey_items - values = SurveyItemValues.new(row: { 'Duration (in seconds)' => '99' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Duration (in seconds)" => "99" }, headers:, genders:, survey_items:, schools:) expect(values.valid_duration?).to eq false end end end - context '.valid_progress' do - context 'when progress is valid' do - it 'returns true' do + context ".valid_progress" do + context "when progress is valid" do + it "returns true" do headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'Progress' => '25' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Progress" => "25" }, headers:, genders:, survey_items:, schools:) expect(values.valid_progress?).to eq true # When progress is blank or N/A or NA, we don't have enough information to kick out the row as invalid so we keep it in headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'Progress' => '' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Progress" => "" }, headers:, genders:, survey_items:, schools:) expect(values.valid_progress?).to eq true headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'Progress' => 'N/A' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Progress" => "N/A" }, headers:, genders:, survey_items:, schools:) expect(values.valid_progress?).to eq true headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'Progress' => 'NA' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Progress" => "NA" }, headers:, genders:, survey_items:, schools:) expect(values.valid_progress?).to eq true end end - context 'when progress is invalid' do - it 'returns false' do + context "when progress is invalid" do + it "returns false" do headers = %w[s-sbel-q5 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'Progress' => '24' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "Progress" => "24" }, headers:, genders:, survey_items:, schools:) expect(values.valid_progress?).to eq false end end end - context '.valid_grade?' do - context 'when grade is valid' do + context ".valid_grade?" do + context "when grade is valid" do before :each do attleboro attleboro_respondents end - it 'returns true for students' do + it "returns true for students" do headers = %w[s-sbel-q5 s-phys-q2 grade RecordedDate] - values = SurveyItemValues.new(row: { 'grade' => '9', 'RecordedDate' => recorded_date, 'Dese ID' => '1234' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "grade" => "9", "RecordedDate" => recorded_date, "Dese ID" => "1234" }, headers:, genders:, survey_items:, schools:) expect(values.valid_grade?).to eq true end - it 'returns true for teachers' do + it "returns true for teachers" do headers = %w[t-sbel-q5 t-phys-q2 grade RecordedDate] - values = SurveyItemValues.new(row: { 'RecordedDate' => recorded_date, 'Dese ID' => '1234' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "RecordedDate" => recorded_date, "Dese ID" => "1234" }, headers:, genders:, survey_items:, schools:) expect(values.valid_grade?).to eq true end end - context 'when grade is invalid' do + context "when grade is invalid" do before :each do attleboro attleboro_respondents end - it 'returns false' do + it "returns false" do headers = %w[s-sbel-q5 s-phys-q2 grade RecordedDate] - values = SurveyItemValues.new(row: { 'grade' => '2', 'RecordedDate' => recorded_date, 'Dese ID' => '1234' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "grade" => "2", "RecordedDate" => recorded_date, "Dese ID" => "1234" }, headers:, genders:, survey_items:, schools: School.school_hash) expect(values.valid_grade?).to eq false end end end - context '.valid_sd?' do - context 'when the standard deviation is valid' do - it 'returns true for student questions' do + context ".valid_sd?" do + context "when the standard deviation is valid" do + it "returns true for student questions" do headers = %w[s-sbel-q5 s-phys-q1 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'RecordedDate' => recorded_date, 'Dese ID' => '1234', 's-sbel-q5' => '1', 's-phys-q1' => '', 's-phys-q2' => '5' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "RecordedDate" => recorded_date, "Dese ID" => "1234", "s-sbel-q5" => "1", "s-phys-q1" => "", "s-phys-q2" => "5" }, headers:, genders:, survey_items:, schools: School.school_hash) expect(values.valid_sd?).to eq true end - it 'returns true for teacher questions' do + it "returns true for teacher questions" do headers = %w[t-sbel-q5 t-phys-q2] - values = SurveyItemValues.new(row: { 'RecordedDate' => recorded_date, 'Dese ID' => '1234', 't-sbel-q5' => '1', 't-phys-q2' => '5' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "RecordedDate" => recorded_date, "Dese ID" => "1234", "t-sbel-q5" => "1", "t-phys-q2" => "5" }, headers:, genders:, survey_items:, schools: School.school_hash) expect(values.valid_sd?).to eq true end end - context 'when the standard deviation is invalid' do - it 'returns false for student questions' do + context "when the standard deviation is invalid" do + it "returns false for student questions" do headers = %w[s-sbel-q5 s-phys-q1 s-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'RecordedDate' => recorded_date, 'Dese ID' => '1234', 's-sbel-q5' => '1', 's-phys-q2' => '1' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "RecordedDate" => recorded_date, "Dese ID" => "1234", "s-sbel-q5" => "1", "s-phys-q2" => "1" }, headers:, genders:, survey_items:, schools: School.school_hash) expect(values.valid_sd?).to eq false end - it 'returns false for teacher questions' do + it "returns false for teacher questions" do headers = %w[t-sbel-q5 t-phys-q1 t-phys-q2 RecordedDate] - values = SurveyItemValues.new(row: { 'RecordedDate' => recorded_date, 'Dese ID' => '1234', 't-sbel-q5' => '1', 't-phys-q2' => '1' }, headers:, genders:, survey_items:, + values = SurveyItemValues.new(row: { "RecordedDate" => recorded_date, "Dese ID" => "1234", "t-sbel-q5" => "1", "t-phys-q2" => "1" }, headers:, genders:, survey_items:, schools: School.school_hash) expect(values.valid_sd?).to eq false end diff --git a/spec/services/survey_responses_data_loader_spec.rb b/spec/services/survey_responses_data_loader_spec.rb index 0558a6ce..fc52e69d 100644 --- a/spec/services/survey_responses_data_loader_spec.rb +++ b/spec/services/survey_responses_data_loader_spec.rb @@ -1,59 +1,59 @@ -require 'rails_helper' +require "rails_helper" describe SurveyResponsesDataLoader do - let(:path_to_teacher_responses) { Rails.root.join('spec', 'fixtures', 'test_2020-21_teacher_survey_responses.csv') } - let(:path_to_student_responses) { Rails.root.join('spec', 'fixtures', 'test_2020-21_student_survey_responses.csv') } + let(:path_to_teacher_responses) { Rails.root.join("spec", "fixtures", "test_2020-21_teacher_survey_responses.csv") } + let(:path_to_student_responses) { Rails.root.join("spec", "fixtures", "test_2020-21_student_survey_responses.csv") } let(:path_to_butler_student_responses) do - Rails.root.join('spec', 'fixtures', 'test_2022-23_butler_student_survey_responses.csv') + Rails.root.join("spec", "fixtures", "test_2022-23_butler_student_survey_responses.csv") end - let(:ay_2020_21) { create(:academic_year, range: '2020-21') } - let(:ay_2022_23) { create(:academic_year, range: '2022-23') } + let(:ay_2020_21) { create(:academic_year, range: "2020-21") } + let(:ay_2022_23) { create(:academic_year, range: "2022-23") } - let(:school) { create(:school, name: 'Lee Elementary School', slug: 'lee-elementary-school', dese_id: 1_500_025) } - let(:lowell) { create(:district, name: 'Lowell', slug: 'lowell') } + let(:school) { create(:school, name: "Lee Elementary School", slug: "lee-elementary-school", dese_id: 1_500_025) } + let(:lowell) { create(:district, name: "Lowell", slug: "lowell") } let(:second_school) do - create(:school, name: 'Lee Middle High School', slug: 'lee-middle-high-school', dese_id: 1_500_505, + create(:school, name: "Lee Middle High School", slug: "lee-middle-high-school", dese_id: 1_500_505, district: lowell) end let(:butler_school) do - create(:school, name: 'Butler Elementary School', slug: 'butler-elementary-school', dese_id: 1_600_310, + create(:school, name: "Butler Elementary School", slug: "butler-elementary-school", dese_id: 1_600_310, district: lowell) end - let(:t_pcom_q3) { create(:survey_item, survey_item_id: 't-pcom-q3') } - let(:t_pcom_q2) { create(:survey_item, survey_item_id: 't-pcom-q2') } - let(:t_coll_q1) { create(:survey_item, survey_item_id: 't-coll-q1') } - let(:t_coll_q2) { create(:survey_item, survey_item_id: 't-coll-q2') } - let(:t_coll_q3) { create(:survey_item, survey_item_id: 't-coll-q3') } - let(:t_sach_q1) { create(:survey_item, survey_item_id: 't-sach-q1') } - let(:t_sach_q2) { create(:survey_item, survey_item_id: 't-sach-q2') } - let(:t_sach_q3) { create(:survey_item, survey_item_id: 't-sach-q3') } - - let(:s_phys_q1) { create(:survey_item, survey_item_id: 's-phys-q1') } - let(:s_phys_q2) { create(:survey_item, survey_item_id: 's-phys-q2') } - let(:s_phys_q3) { create(:survey_item, survey_item_id: 's-phys-q3') } - let(:s_phys_q4) { create(:survey_item, survey_item_id: 's-phys-q4') } - let(:s_vale_q1) { create(:survey_item, survey_item_id: 's-phys-q1') } - let(:s_vale_q2) { create(:survey_item, survey_item_id: 's-phys-q2') } - let(:s_vale_q3) { create(:survey_item, survey_item_id: 's-phys-q3') } - let(:s_vale_q4) { create(:survey_item, survey_item_id: 's-phys-q4') } - let(:s_acst_q1) { create(:survey_item, survey_item_id: 's-acst-q1') } - let(:s_acst_q2) { create(:survey_item, survey_item_id: 's-acst-q2') } - let(:s_acst_q3) { create(:survey_item, survey_item_id: 's-acst-q3') } - let(:s_acst_q4) { create(:survey_item, survey_item_id: 's-acst-q4') } - let(:s_emsa_q1) { create(:survey_item, survey_item_id: 's-emsa-q1') } - let(:s_emsa_q2) { create(:survey_item, survey_item_id: 's-emsa-q2') } - let(:s_emsa_q3) { create(:survey_item, survey_item_id: 's-emsa-q3') } + let(:t_pcom_q3) { create(:survey_item, survey_item_id: "t-pcom-q3") } + let(:t_pcom_q2) { create(:survey_item, survey_item_id: "t-pcom-q2") } + let(:t_coll_q1) { create(:survey_item, survey_item_id: "t-coll-q1") } + let(:t_coll_q2) { create(:survey_item, survey_item_id: "t-coll-q2") } + let(:t_coll_q3) { create(:survey_item, survey_item_id: "t-coll-q3") } + let(:t_sach_q1) { create(:survey_item, survey_item_id: "t-sach-q1") } + let(:t_sach_q2) { create(:survey_item, survey_item_id: "t-sach-q2") } + let(:t_sach_q3) { create(:survey_item, survey_item_id: "t-sach-q3") } + + let(:s_phys_q1) { create(:survey_item, survey_item_id: "s-phys-q1") } + let(:s_phys_q2) { create(:survey_item, survey_item_id: "s-phys-q2") } + let(:s_phys_q3) { create(:survey_item, survey_item_id: "s-phys-q3") } + let(:s_phys_q4) { create(:survey_item, survey_item_id: "s-phys-q4") } + let(:s_vale_q1) { create(:survey_item, survey_item_id: "s-phys-q1") } + let(:s_vale_q2) { create(:survey_item, survey_item_id: "s-phys-q2") } + let(:s_vale_q3) { create(:survey_item, survey_item_id: "s-phys-q3") } + let(:s_vale_q4) { create(:survey_item, survey_item_id: "s-phys-q4") } + let(:s_acst_q1) { create(:survey_item, survey_item_id: "s-acst-q1") } + let(:s_acst_q2) { create(:survey_item, survey_item_id: "s-acst-q2") } + let(:s_acst_q3) { create(:survey_item, survey_item_id: "s-acst-q3") } + let(:s_acst_q4) { create(:survey_item, survey_item_id: "s-acst-q4") } + let(:s_emsa_q1) { create(:survey_item, survey_item_id: "s-emsa-q1") } + let(:s_emsa_q2) { create(:survey_item, survey_item_id: "s-emsa-q2") } + let(:s_emsa_q3) { create(:survey_item, survey_item_id: "s-emsa-q3") } let(:female) { create(:gender, qualtrics_code: 1) } let(:male) { create(:gender, qualtrics_code: 2) } let(:another_gender) { create(:gender, qualtrics_code: 3) } let(:non_binary) { create(:gender, qualtrics_code: 4) } let(:unknown_gender) { create(:gender, qualtrics_code: 99) } - let(:low_income) { create(:income, designation: 'Economically Disadvantaged – Y') } - let(:high_income) { create(:income, designation: 'Economically Disadvantaged – N') } - let(:unknown_income) { create(:income, designation: 'Unknown') } + let(:low_income) { create(:income, designation: "Economically Disadvantaged – Y") } + let(:high_income) { create(:income, designation: "Economically Disadvantaged – N") } + let(:unknown_income) { create(:income, designation: "Unknown") } let(:setup) do ay_2020_21 @@ -98,12 +98,12 @@ describe SurveyResponsesDataLoader do setup end - describe 'loading teacher survey responses' do + describe "loading teacher survey responses" do before do SurveyResponsesDataLoader.load_data filepath: path_to_teacher_responses end - it 'ensures teacher responses load correctly' do + it "ensures teacher responses load correctly" do assigns_academic_year_to_survey_item_responses assigns_school_to_the_survey_item_responses assigns_recorded_date_to_teacher_responses @@ -114,12 +114,12 @@ describe SurveyResponsesDataLoader do end end - describe 'student survey responses' do + describe "student survey responses" do before do SurveyResponsesDataLoader.load_data filepath: path_to_student_responses end - it 'ensures student responses load correctly' do + it "ensures student responses load correctly" do assigns_academic_year_to_student_survey_item_responses assigns_school_to_student_survey_item_responses assigns_recorded_date_to_student_responses @@ -132,82 +132,82 @@ describe SurveyResponsesDataLoader do is_idempotent_for_students end - context 'when updating student survey responses from another csv file' do + context "when updating student survey responses from another csv file" do before :each do - SurveyResponsesDataLoader.load_data filepath: Rails.root.join('spec', 'fixtures', - 'secondary_test_2020-21_student_survey_responses.csv') + SurveyResponsesDataLoader.load_data filepath: Rails.root.join("spec", "fixtures", + "secondary_test_2020-21_student_survey_responses.csv") end - it 'updates the likert score to the score on the new csv file' do - s_emsa_q1 = SurveyItem.find_by_survey_item_id 's-emsa-q1' - expect(SurveyItemResponse.where(response_id: 'student_survey_response_3', + it "updates the likert score to the score on the new csv file" do + s_emsa_q1 = SurveyItem.find_by_survey_item_id "s-emsa-q1" + expect(SurveyItemResponse.where(response_id: "student_survey_response_3", survey_item: s_emsa_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_4', + expect(SurveyItemResponse.where(response_id: "student_survey_response_4", survey_item: s_emsa_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5', + expect(SurveyItemResponse.where(response_id: "student_survey_response_5", survey_item: s_emsa_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5', + expect(SurveyItemResponse.where(response_id: "student_survey_response_5", survey_item: s_acst_q3).first.likert_score).to eq 4 end end end # figure out why this is failing - describe 'when using Lowell rules to skip rows in the csv file' do + describe "when using Lowell rules to skip rows in the csv file" do before :each do SurveyResponsesDataLoader.load_data filepath: path_to_student_responses, rules: [Rule::SkipNonLowellSchools] end - it 'rejects any non-lowell school' do - expect(SurveyItemResponse.where(response_id: 'student_survey_response_1').count).to eq 0 + it "rejects any non-lowell school" do + expect(SurveyItemResponse.where(response_id: "student_survey_response_1").count).to eq 0 expect(SurveyItemResponse.count).to eq 69 end - it 'loads the correct number of responses for lowell schools' do - expect(SurveyItemResponse.where(response_id: 'student_survey_response_2').count).to eq 0 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_3').count).to eq 12 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_4').count).to eq 15 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5').count).to eq 14 + it "loads the correct number of responses for lowell schools" do + expect(SurveyItemResponse.where(response_id: "student_survey_response_2").count).to eq 0 + expect(SurveyItemResponse.where(response_id: "student_survey_response_3").count).to eq 12 + expect(SurveyItemResponse.where(response_id: "student_survey_response_4").count).to eq 15 + expect(SurveyItemResponse.where(response_id: "student_survey_response_5").count).to eq 14 end - context 'when loading 22-23 butler survey responses' do + context "when loading 22-23 butler survey responses" do before :each do SurveyResponsesDataLoader.load_data filepath: path_to_butler_student_responses, rules: [Rule::SkipNonLowellSchools] end - it 'loads all the responses for Butler' do + it "loads all the responses for Butler" do expect(SurveyItemResponse.where(school: butler_school).count).to eq 56 end - it 'blank entries for grade get loaded as nils, not zero values' do - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_1').first.grade).to eq 7 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_2').first.grade).to eq 7 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_3').first.grade).to eq 7 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_4').first.grade).to eq 5 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_5').first.grade).to eq 7 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_6').first.grade).to eq 6 - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_7').first.grade).to eq nil - expect(SurveyItemResponse.where(response_id: 'butler_student_survey_response_8').first.grade).to eq 0 + it "blank entries for grade get loaded as nils, not zero values" do + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_1").first.grade).to eq 7 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_2").first.grade).to eq 7 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_3").first.grade).to eq 7 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_4").first.grade).to eq 5 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_5").first.grade).to eq 7 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_6").first.grade).to eq 6 + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_7").first.grade).to eq nil + expect(SurveyItemResponse.where(response_id: "butler_student_survey_response_8").first.grade).to eq 0 end end end end def assigns_academic_year_to_survey_item_responses - expect(SurveyItemResponse.find_by_response_id('teacher_survey_response_1').academic_year).to eq ay_2020_21 + expect(SurveyItemResponse.find_by_response_id("teacher_survey_response_1").academic_year).to eq ay_2020_21 end def assigns_school_to_the_survey_item_responses - expect(SurveyItemResponse.find_by_response_id('teacher_survey_response_1').school).to eq school + expect(SurveyItemResponse.find_by_response_id("teacher_survey_response_1").school).to eq school end def loads_survey_item_responses_for_a_given_survey_response - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_1').count).to eq 5 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_2').count).to eq 0 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_3').count).to eq 8 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_4').count).to eq 8 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_5').count).to eq 8 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_1").count).to eq 5 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_2").count).to eq 0 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_3").count).to eq 8 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_4").count).to eq 8 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_5").count).to eq 8 end def loads_all_survey_item_responses_for_a_given_survey_item @@ -216,20 +216,20 @@ def loads_all_survey_item_responses_for_a_given_survey_item end def captures_likert_scores_for_survey_item_responses - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_1').where(survey_item: t_pcom_q2)).to be_empty - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_1').where(survey_item: t_pcom_q3).first.likert_score).to eq 3 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_1").where(survey_item: t_pcom_q2)).to be_empty + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_1").where(survey_item: t_pcom_q3).first.likert_score).to eq 3 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_2').where(survey_item: t_pcom_q2)).to be_empty - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_2').where(survey_item: t_pcom_q3)).to be_empty + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_2").where(survey_item: t_pcom_q2)).to be_empty + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_2").where(survey_item: t_pcom_q3)).to be_empty - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_3').where(survey_item: t_pcom_q2).first.likert_score).to eq 5 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_3').where(survey_item: t_pcom_q3).first.likert_score).to eq 5 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_3").where(survey_item: t_pcom_q2).first.likert_score).to eq 5 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_3").where(survey_item: t_pcom_q3).first.likert_score).to eq 5 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_4').where(survey_item: t_pcom_q2).first.likert_score).to eq 4 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_4').where(survey_item: t_pcom_q3).first.likert_score).to eq 4 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_4").where(survey_item: t_pcom_q2).first.likert_score).to eq 4 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_4").where(survey_item: t_pcom_q3).first.likert_score).to eq 4 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_5').where(survey_item: t_pcom_q2).first.likert_score).to eq 2 - expect(SurveyItemResponse.where(response_id: 'teacher_survey_response_5').where(survey_item: t_pcom_q3).first.likert_score).to eq 4 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_5").where(survey_item: t_pcom_q2).first.likert_score).to eq 2 + expect(SurveyItemResponse.where(response_id: "teacher_survey_response_5").where(survey_item: t_pcom_q3).first.likert_score).to eq 4 end def is_idempotent @@ -241,19 +241,19 @@ def is_idempotent end def assigns_academic_year_to_student_survey_item_responses - expect(SurveyItemResponse.find_by_response_id('student_survey_response_3').academic_year).to eq ay_2020_21 + expect(SurveyItemResponse.find_by_response_id("student_survey_response_3").academic_year).to eq ay_2020_21 end def assigns_school_to_student_survey_item_responses - expect(SurveyItemResponse.find_by_response_id('student_survey_response_3').school).to eq second_school + expect(SurveyItemResponse.find_by_response_id("student_survey_response_3").school).to eq second_school end def loads_student_survey_item_response_values - expect(SurveyItemResponse.where(response_id: 'student_survey_response_1').count).to eq 3 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_2').count).to eq 0 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_3').count).to eq 12 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_4').count).to eq 15 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5').count).to eq 14 + expect(SurveyItemResponse.where(response_id: "student_survey_response_1").count).to eq 3 + expect(SurveyItemResponse.where(response_id: "student_survey_response_2").count).to eq 0 + expect(SurveyItemResponse.where(response_id: "student_survey_response_3").count).to eq 12 + expect(SurveyItemResponse.where(response_id: "student_survey_response_4").count).to eq 15 + expect(SurveyItemResponse.where(response_id: "student_survey_response_5").count).to eq 14 end def student_survey_item_response_count_matches_expected @@ -262,20 +262,20 @@ def student_survey_item_response_count_matches_expected end def captures_likert_scores_for_student_survey_item_responses - expect(SurveyItemResponse.where(response_id: 'student_survey_response_1').where(survey_item: s_phys_q1).first.likert_score).to eq 3 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_1').where(survey_item: s_phys_q2)).to be_empty + expect(SurveyItemResponse.where(response_id: "student_survey_response_1").where(survey_item: s_phys_q1).first.likert_score).to eq 3 + expect(SurveyItemResponse.where(response_id: "student_survey_response_1").where(survey_item: s_phys_q2)).to be_empty - expect(SurveyItemResponse.where(response_id: 'student_survey_response_2').where(survey_item: s_phys_q1)).to be_empty - expect(SurveyItemResponse.where(response_id: 'student_survey_response_2').where(survey_item: s_phys_q2)).to be_empty + expect(SurveyItemResponse.where(response_id: "student_survey_response_2").where(survey_item: s_phys_q1)).to be_empty + expect(SurveyItemResponse.where(response_id: "student_survey_response_2").where(survey_item: s_phys_q2)).to be_empty - expect(SurveyItemResponse.where(response_id: 'student_survey_response_3').where(survey_item: s_phys_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_3').where(survey_item: s_phys_q2).first.likert_score).to eq 3 + expect(SurveyItemResponse.where(response_id: "student_survey_response_3").where(survey_item: s_phys_q1).first.likert_score).to eq 1 + expect(SurveyItemResponse.where(response_id: "student_survey_response_3").where(survey_item: s_phys_q2).first.likert_score).to eq 3 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_4').where(survey_item: s_phys_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_4').where(survey_item: s_phys_q2).first.likert_score).to eq 1 + expect(SurveyItemResponse.where(response_id: "student_survey_response_4").where(survey_item: s_phys_q1).first.likert_score).to eq 1 + expect(SurveyItemResponse.where(response_id: "student_survey_response_4").where(survey_item: s_phys_q2).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5').where(survey_item: s_phys_q1).first.likert_score).to eq 1 - expect(SurveyItemResponse.where(response_id: 'student_survey_response_5').where(survey_item: s_phys_q2).first.likert_score).to eq 2 + expect(SurveyItemResponse.where(response_id: "student_survey_response_5").where(survey_item: s_phys_q1).first.likert_score).to eq 1 + expect(SurveyItemResponse.where(response_id: "student_survey_response_5").where(survey_item: s_phys_q2).first.likert_score).to eq 2 end def is_idempotent_for_students @@ -287,12 +287,12 @@ def is_idempotent_for_students end def assigns_grade_level_to_responses - results = { 'student_survey_response_1' => 11, - 'student_survey_response_3' => 8, - 'student_survey_response_4' => 8, - 'student_survey_response_5' => 7, - 'student_survey_response_6' => 3, - 'student_survey_response_7' => 4 } + results = { "student_survey_response_1" => 11, + "student_survey_response_3" => 8, + "student_survey_response_4" => 8, + "student_survey_response_5" => 7, + "student_survey_response_6" => 3, + "student_survey_response_7" => 4 } results.each do |key, value| expect(SurveyItemResponse.where(response_id: key).all? do |response| response.grade == value @@ -301,12 +301,12 @@ def assigns_grade_level_to_responses end def assigns_gender_to_responses - results = { 'student_survey_response_1' => female, - 'student_survey_response_3' => male, - 'student_survey_response_4' => non_binary, - 'student_survey_response_5' => non_binary, - 'student_survey_response_6' => unknown_gender, - 'student_survey_response_7' => unknown_gender } + results = { "student_survey_response_1" => female, + "student_survey_response_3" => male, + "student_survey_response_4" => non_binary, + "student_survey_response_5" => non_binary, + "student_survey_response_6" => unknown_gender, + "student_survey_response_7" => unknown_gender } results.each do |key, value| expect(SurveyItemResponse.where(response_id: key).first.gender).to eq value @@ -314,34 +314,34 @@ def assigns_gender_to_responses end def assigns_recorded_date_to_student_responses - results = { 'student_survey_response_1' => '2020-09-30T18:48:50', - 'student_survey_response_3' => '2021-03-31T09:59:02', - 'student_survey_response_4' => '2021-03-31T10:00:17', - 'student_survey_response_5' => '2021-03-31T10:01:36', - 'student_survey_response_6' => '2021-03-31T10:01:37', - 'student_survey_response_7' => '2021-03-31T10:01:38' } + results = { "student_survey_response_1" => "2020-09-30T18:48:50", + "student_survey_response_3" => "2021-03-31T09:59:02", + "student_survey_response_4" => "2021-03-31T10:00:17", + "student_survey_response_5" => "2021-03-31T10:01:36", + "student_survey_response_6" => "2021-03-31T10:01:37", + "student_survey_response_7" => "2021-03-31T10:01:38" } results.each do |key, value| expect(SurveyItemResponse.find_by_response_id(key).recorded_date).to eq Date.parse(value) end end def assigns_recorded_date_to_teacher_responses - results = { 'teacher_survey_response_1' => '2020-10-16 11:09:03', - 'teacher_survey_response_3' => '2020-12-06 8:36:52', - 'teacher_survey_response_4' => '2020-12-06 8:51:25', - 'teacher_survey_response_5' => '2020-12-06 8:55:58' } + results = { "teacher_survey_response_1" => "2020-10-16 11:09:03", + "teacher_survey_response_3" => "2020-12-06 8:36:52", + "teacher_survey_response_4" => "2020-12-06 8:51:25", + "teacher_survey_response_5" => "2020-12-06 8:55:58" } results.each do |key, value| expect(SurveyItemResponse.find_by_response_id(key).recorded_date).to eq Date.parse(value) end end def assigns_income_to_responses - results = { 'student_survey_response_1' => low_income, - 'student_survey_response_3' => low_income, - 'student_survey_response_4' => unknown_income, - 'student_survey_response_5' => low_income, - 'student_survey_response_6' => high_income, - 'student_survey_response_7' => low_income } + results = { "student_survey_response_1" => low_income, + "student_survey_response_3" => low_income, + "student_survey_response_4" => unknown_income, + "student_survey_response_5" => low_income, + "student_survey_response_6" => high_income, + "student_survey_response_7" => low_income } results.each do |key, value| expect(SurveyItemResponse.where(response_id: key).first.income).to eq value diff --git a/spec/system/journey_spec.rb b/spec/system/journey_spec.rb index 941e9aad..54cfceb1 100644 --- a/spec/system/journey_spec.rb +++ b/spec/system/journey_spec.rb @@ -1,12 +1,37 @@ +# <<<<<<< HEAD +# # require "rails_helper" +# # include AnalyzeHelper + +# # describe "District Admin", js: true do +# # let(:district) { District.find_by_slug "lee-public-schools" } +# # let(:different_district) { District.find_by_slug "maynard-public-schools" } +# # let(:school) { School.find_by_slug "lee-elementary-school" } +# # let(:school_in_same_district) { School.find_by_slug "lee-middle-high-school" } +# # let(:first_school_in_wareham) { School.find_by_slug "fowler-school" } + +# # let(:category) { Category.find_by_name("Teachers & Leadership") } +# # let(:different_category) { Category.find_by_name("School Culture") } +# # let(:subcategory) { Subcategory.find_by_name("Teachers & The Teaching Environment") } +# # let(:different_subcategory) { Subcategory.find_by_name("Relationships") } +# # let(:measures_for_subcategory) { Measure.where(subcategory:) } +# # let(:scales_for_subcategory) { Scale.where(measure: measures_for_subcategory) } +# # let(:survey_items_for_subcategory) { SurveyItem.where(scale: scales_for_subcategory) } + +# # let(:measure_1A_i) { Measure.find_by_measure_id("1A-i") } +# # let(:measure_2A_i) { Measure.find_by_measure_id("2A-i") } +# # let(:measure_2A_ii) { Measure.find_by_measure_id("2A-ii") } +# # let(:measure_4C_i) { Measure.find_by_measure_id("4C-i") } +# # let(:measure_with_no_survey_responses) { Measure.find_by_measure_id("3A-i") } +# ======= # require "rails_helper" # include AnalyzeHelper # describe "District Admin", js: true do -# let(:district) { District.find_by_slug "lee-public-schools" } -# let(:different_district) { District.find_by_slug "maynard-public-schools" } -# let(:school) { School.find_by_slug "lee-elementary-school" } -# let(:school_in_same_district) { School.find_by_slug "lee-middle-high-school" } -# let(:first_school_in_wareham) { School.find_by_slug "fowler-school" } +# let(:district) { District.find_by_slug "winchester" } +# let(:different_district) { District.find_by_slug "wareham" } +# let(:school) { School.find_by_slug "winchester-high-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(:different_category) { Category.find_by_name("School Culture") } @@ -21,12 +46,27 @@ # let(:measure_2A_ii) { Measure.find_by_measure_id("2A-ii") } # let(:measure_4C_i) { Measure.find_by_measure_id("4C-i") } # let(:measure_with_no_survey_responses) { Measure.find_by_measure_id("3A-i") } - -# let(:survey_items_for_measure_1A_i) { measure_1A_i.survey_items } -# let(:survey_items_for_measure_2A_i) { measure_2A_i.survey_items } -# let(:survey_items_for_measure_2A_ii) { measure_2A_ii.survey_items } -# let(:survey_items_for_measure_4C_i) { measure_4C_i.survey_items } - +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # let(:survey_items_for_measure_1A_i) { measure_1A_i.survey_items } +# # let(:survey_items_for_measure_2A_i) { measure_2A_i.survey_items } +# # let(:survey_items_for_measure_2A_ii) { measure_2A_ii.survey_items } +# # let(:survey_items_for_measure_4C_i) { measure_4C_i.survey_items } + +# <<<<<<< HEAD +# # let(:ay_2021_22) { AcademicYear.find_by_range "2021-22" } +# # 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(:ay_2021_22) { AcademicYear.find_by_range "2021-22" } # let(:ay_2019_20) { AcademicYear.find_by_range "2019-20" } # let(:response_rates) do @@ -34,83 +74,140 @@ # [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) +# meets_student_threshold: true, meets_teacher_threshold: true) # end # end # end # end - -# let(:username) { district.short_name } -# let(:password) { "#{district.short_name}!" } - -# let(:respondents) do -# respondent = Respondent.find_or_initialize_by(school:, academic_year: ay_2021_22) -# respondent.total_students = 8 -# respondent.total_teachers = 8 -# respondent.one = 20 -# respondent.save - -# respondent = Respondent.find_or_initialize_by(school:, academic_year: ay_2019_20) -# respondent.total_students = 8 -# respondent.total_teachers = 8 -# respondent.one = 20 -# respondent.save -# end - -# before :each do -# Rails.application.load_seed - -# respondents -# response_rates -# survey_item_responses = [] - +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # let(:username) { district.short_name } +# # let(:password) { "#{district.short_name}!" } + +# # let(:respondents) do +# # respondent = Respondent.find_or_initialize_by(school:, academic_year: ay_2021_22) +# # respondent.total_students = 8 +# # respondent.total_teachers = 8 +# # respondent.one = 20 +# # respondent.save + +# # respondent = Respondent.find_or_initialize_by(school:, academic_year: ay_2019_20) +# # respondent.total_students = 8 +# # respondent.total_teachers = 8 +# # respondent.one = 20 +# # respondent.save +# # end + +# # before :each do +# # Rails.application.load_seed + +# <<<<<<< HEAD +# # respondents +# # response_rates +# # survey_item_responses = [] + +# # survey_items_for_measure_1A_i.each do |survey_item| +# # SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do +# # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, +# # school:, survey_item:, likert_score: 4) +# # end +# # end + +# # survey_items_for_measure_2A_i.each do |survey_item| +# # SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do +# # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, +# # school:, survey_item:, likert_score: 5, grade: 1) +# # end +# # end + +# # survey_items_for_measure_2A_ii.each do |survey_item| +# # SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do +# # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, +# # school:, survey_item:, likert_score: 5, grade: 1) +# # end +# # end + +# # survey_items_for_measure_4C_i.each do |survey_item| +# # SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do +# # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, +# # school:, survey_item:, likert_score: 1, grade: 1) +# # end +# # end +# ======= # survey_items_for_measure_1A_i.each do |survey_item| # SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, -# school:, survey_item:, likert_score: 4) +# school:, survey_item:, likert_score: 4) # end # end # survey_items_for_measure_2A_i.each do |survey_item| # SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, -# school:, survey_item:, likert_score: 5, grade: 1) +# school:, survey_item:, likert_score: 5, grade: 1) # end # end # survey_items_for_measure_2A_ii.each do |survey_item| # SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, -# school:, survey_item:, likert_score: 5, grade: 1) +# school:, survey_item:, likert_score: 5, grade: 1) # end # end # survey_items_for_measure_4C_i.each do |survey_item| # SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, -# school:, survey_item:, likert_score: 1, grade: 1) +# school:, survey_item:, likert_score: 1, grade: 1) # end # end # survey_items_for_subcategory.each do |survey_item| # 2.times do # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, -# school:, survey_item:, likert_score: 4, grade: 1) +# school:, survey_item:, likert_score: 4, grade: 1) # end # end - -# SurveyItemResponse.import survey_item_responses -# end - +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # survey_items_for_subcategory.each do |survey_item| +# # 2.times do +# # survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2021_22, +# # school:, survey_item:, likert_score: 4, grade: 1) +# # end +# # end + +# # SurveyItemResponse.import survey_item_responses +# # end + +# <<<<<<< HEAD +# # it "navigates through the site" do +# # page.driver.basic_authorize(username, password) + +# # visit "/welcome" +# # expect(page).to have_text("Teachers & Leadership") +# # go_to_school_overview_from_welcome_page(district, school) +# ======= # it "navigates through the site" do -# page.driver.basic_authorize(username, password) +# # page.driver.basic_authorize(username, password) # visit "/welcome" # expect(page).to have_text("Teachers & Leadership") # go_to_school_overview_from_welcome_page(district, school) +# >>>>>>> a71ebbc (Add Overall Response Rate) -# district_admin_sees_overview_content +# # district_admin_sees_overview_content + +# <<<<<<< HEAD +# # click_on "Teachers & Leadership" +# # district_admin_sees_browse_content +# # click_on "Overview" +# # district_admin_sees_overview_content + +# # click_on "Analyze" +# # district_admin_sees_analyze_content +# ======= # click_on "Teachers & Leadership" # district_admin_sees_browse_content @@ -119,46 +216,101 @@ # click_on "Analyze" # district_admin_sees_analyze_content +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # go_to_different_category(different_category) +# # district_admin_sees_category_change -# go_to_different_category(different_category) -# district_admin_sees_category_change +# # go_to_different_subcategory(different_subcategory) +# # district_admin_sees_subcategory_change -# go_to_different_subcategory(different_subcategory) -# district_admin_sees_subcategory_change +# <<<<<<< HEAD +# # click_on "Browse" +# # district_admin_sees_browse_content +# # click_on "School Culture" +# # expect(page).to have_text("Measures the degree to which the school environment is safe, caring, and academically-oriented. It considers factors like bullying, student-teacher relationships, and student valuing of learning.") +# ======= # click_on "Browse" # district_admin_sees_browse_content # click_on "School Culture" # expect(page).to have_text("Measures the degree to which the school environment is safe, caring, and academically-oriented. It considers factors like bullying, student-teacher relationships, and student valuing of learning.") +# >>>>>>> a71ebbc (Add Overall Response Rate) -# go_to_different_school_in_same_district(school_in_same_district) -# district_admin_sees_schools_change +# # go_to_different_school_in_same_district(school_in_same_district) +# # district_admin_sees_schools_change -# go_to_different_district(different_district) -# district_admin_sees_district_change +# # go_to_different_district(different_district) +# # district_admin_sees_district_change -# go_to_different_year(ay_2019_20) -# district_admin_sees_year_change -# end -# end +# # go_to_different_year(ay_2019_20) +# # district_admin_sees_year_change +# # end +# # end -# private +# # private +# <<<<<<< HEAD +# # def district_admin_sees_professional_qualifications +# # expect(page).to have_text("Professional Qualifications") +# # expect(page).to have_css("[data-for-measure-id='1A-i']") +# ======= # def district_admin_sees_professional_qualifications # expect(page).to have_text("Professional Qualifications") # expect(page).to have_css("[data-for-measure-id='1A-i']") +# >>>>>>> a71ebbc (Add Overall Response Rate) -# # TODO: cutpoints in source of truth have changed so the cutpoints have moved and '2.99%' is no longer a valid value for this cutpoint. -# # expect(page).to have_css("[data-for-measure-id='1A-i'][width='2.99%'][x='60%']") -# end +# # # TODO: cutpoints in source of truth have changed so the cutpoints have moved and '2.99%' is no longer a valid value for this cutpoint. +# # # expect(page).to have_css("[data-for-measure-id='1A-i'][width='2.99%'][x='60%']") +# # end +# <<<<<<< HEAD +# # def district_admin_sees_student_physical_safety +# # expect(page).to have_text("Student Physical Safety") +# ======= # def district_admin_sees_student_physical_safety # expect(page).to have_text("Student Physical Safety") - -# expect(page).to have_css("[data-for-measure-id='2A-i'][width='40.0%'][x='60%']") -# end - +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # expect(page).to have_css("[data-for-measure-id='2A-i'][width='40.0%'][x='60%']") +# # end + +# <<<<<<< HEAD +# # def district_admin_sees_problem_solving_emphasis +# # expect(page).to have_text("Problem Solving") +# # expect(page).to have_css("[data-for-measure-id='4C-i'][width='60.0%'][x='0.0%']") +# # end + +# # def go_to_school_overview_from_welcome_page(district, school) +# # expect(page).to have_select("district", selected: "Select a District") +# # select district.name, from: "district-dropdown" +# # expect(page).to have_select("school", selected: "Select a School") +# # select school.name, from: "school-dropdown" +# # expect(page).to have_select("school", selected: "Lee Elementary School") + +# # expect(page).to have_xpath("//a[@class='mx-4 btn btn-secondary'][.='Go' and not(@disabled='disabled')]") +# # click_on "Go" +# # end + +# # def go_to_different_school_in_same_district(school) +# # select school.name, from: "select-school" +# # end + +# # def go_to_different_district(district) +# # page.driver.basic_authorize(different_district.short_name, "#{different_district.short_name}!") +# # select district.name, from: "select-district" +# # end + +# # def go_to_different_year(year) +# # select year.formatted_range, from: "select-academic-year" +# # end + +# # def district_admin_sees_schools_change +# # expected_path = "/districts/#{school_in_same_district.district.slug}/schools/#{school_in_same_district.slug}/browse/teachers-and-leadership?year=#{ay_2021_22.range}" +# # expect(page).to have_current_path(expected_path) +# # end +# ======= # def district_admin_sees_problem_solving_emphasis # expect(page).to have_text("Problem Solving") # expect(page).to have_css("[data-for-measure-id='4C-i'][width='60.0%'][x='0.0%']") @@ -169,9 +321,8 @@ # select district.name, from: "district-dropdown" # expect(page).to have_select("school", selected: "Select a School") # select school.name, from: "school-dropdown" -# expect(page).to have_select("school", selected: "Lee Elementary School") +# expect(page).to have_select("school", selected: "Winchester High School") -# expect(page).to have_xpath("//a[@class='mx-4 btn btn-secondary'][.='Go' and not(@disabled='disabled')]") # click_on "Go" # end @@ -180,7 +331,6 @@ # end # def go_to_different_district(district) -# page.driver.basic_authorize(different_district.short_name, "#{different_district.short_name}!") # select district.name, from: "select-district" # end @@ -188,31 +338,67 @@ # select year.formatted_range, from: "select-academic-year" # end -# def district_admin_sees_schools_change -# expected_path = "/districts/#{school_in_same_district.district.slug}/schools/#{school_in_same_district.slug}/browse/teachers-and-leadership?year=#{ay_2021_22.range}" -# expect(page).to have_current_path(expected_path) -# end - -# def district_admin_sees_district_change -# expected_path = "/districts/#{different_district.slug}/schools/#{different_district.schools.alphabetic.first.slug}/browse/teachers-and-leadership?year=#{ay_2021_22.range}" -# expect(page).to have_current_path(expected_path) +# def got_to_analyze_page # end - -# def district_admin_sees_year_change -# expected_path = "/districts/#{different_district.slug}/schools/#{different_district.schools.alphabetic.first.slug}/browse/teachers-and-leadership?year=2019-20" -# expect(page).to have_current_path(expected_path) -# end - +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # def district_admin_sees_district_change +# # expected_path = "/districts/#{different_district.slug}/schools/#{different_district.schools.alphabetic.first.slug}/browse/teachers-and-leadership?year=#{ay_2021_22.range}" +# # expect(page).to have_current_path(expected_path) +# # end + +# # def district_admin_sees_year_change +# # expected_path = "/districts/#{different_district.slug}/schools/#{different_district.schools.alphabetic.first.slug}/browse/teachers-and-leadership?year=2019-20" +# # expect(page).to have_current_path(expected_path) +# # end + +# # def district_admin_sees_overview_content +# # expect(page).to have_select("academic-year", selected: "2021 – 2022") +# # expect(page).to have_select("district", selected: "Lee Public Schools") +# # expect(page).to have_select("school", selected: "Lee Elementary School") +# # expect(page).to have_text(school.name) + +# <<<<<<< HEAD +# # district_admin_sees_professional_qualifications +# # district_admin_sees_student_physical_safety +# # district_admin_sees_problem_solving_emphasis +# ======= # def district_admin_sees_overview_content # expect(page).to have_select("academic-year", selected: "2021 – 2022") -# expect(page).to have_select("district", selected: "Lee Public Schools") -# expect(page).to have_select("school", selected: "Lee Elementary School") +# expect(page).to have_select("district", selected: "Winchester") +# expect(page).to have_select("school", selected: "Winchester High School") # expect(page).to have_text(school.name) +# >>>>>>> a71ebbc (Add Overall Response Rate) + +# # page.assert_selector(".measure-row-bar", count: 6) +# # end + +# <<<<<<< HEAD +# # def district_admin_sees_browse_content +# # expect(page).to have_text("Teachers & Leadership") +# # expect(page).to have_text("Approval") +# # end + +# # def district_admin_sees_analyze_content +# # expect(page).to have_text("1:Teachers & Leadership > 1A:Teachers & The Teaching Environment") +# # end + +# # def go_to_different_category(category) +# # select category.name, from: "select-category" +# # end + +# # def district_admin_sees_category_change +# # expect(page).to have_text "2A:Safety" +# # end -# district_admin_sees_professional_qualifications -# district_admin_sees_student_physical_safety -# district_admin_sees_problem_solving_emphasis +# # def go_to_different_subcategory(subcategory) +# # select subcategory.name, from: "select-subcategory" +# # end +# # def district_admin_sees_subcategory_change +# # expect(page).to have_text("Relationships") +# # end +# ======= # page.assert_selector(".measure-row-bar", count: 6) # end @@ -240,3 +426,4 @@ # def district_admin_sees_subcategory_change # expect(page).to have_text("Relationships") # end +# >>>>>>> a71ebbc (Add Overall Response Rate) diff --git a/spec/views/overview/index.html.erb_spec.rb b/spec/views/overview/index.html.erb_spec.rb index 81fb7577..ae37311c 100644 --- a/spec/views/overview/index.html.erb_spec.rb +++ b/spec/views/overview/index.html.erb_spec.rb @@ -1,42 +1,42 @@ -require 'rails_helper' +require "rails_helper" include VarianceHelper -describe 'overview/index' do +describe "overview/index" do subject { Nokogiri::HTML(rendered) } let(:support_for_teaching) do - measure = create(:measure, name: 'Support For Teaching Development & Growth', measure_id: '1') + measure = create(:measure, name: "Support For Teaching Development & Growth", measure_id: "1") scale = create(:scale, measure:) create(:student_survey_item, - scale:, - watch_low_benchmark: 1.5, - growth_low_benchmark: 2.5, - approval_low_benchmark: 3.5, - ideal_low_benchmark: 4.5) + scale:, + watch_low_benchmark: 1.5, + growth_low_benchmark: 2.5, + approval_low_benchmark: 3.5, + ideal_low_benchmark: 4.5) measure end let(:effective_leadership) do - measure = create(:measure, name: 'Effective Leadership', measure_id: '2') + measure = create(:measure, name: "Effective Leadership", measure_id: "2") scale = create(:scale, measure:) create(:teacher_survey_item, - scale:, - watch_low_benchmark: 1.5, - growth_low_benchmark: 2.5, - approval_low_benchmark: 3.5, - ideal_low_benchmark: 4.5) + scale:, + watch_low_benchmark: 1.5, + growth_low_benchmark: 2.5, + approval_low_benchmark: 3.5, + ideal_low_benchmark: 4.5) measure end let(:professional_qualifications) do - measure = create(:measure, name: 'Professional Qualifications', measure_id: '3') + measure = create(:measure, name: "Professional Qualifications", measure_id: "3") scale = create(:scale, measure:) create(:admin_data_item, - scale:, - watch_low_benchmark: 1.5, - growth_low_benchmark: 2.5, - approval_low_benchmark: 3.5, - ideal_low_benchmark: 4.5) + scale:, + watch_low_benchmark: 1.5, + growth_low_benchmark: 2.5, + approval_low_benchmark: 3.5, + ideal_low_benchmark: 4.5) measure end @@ -47,14 +47,19 @@ describe 'overview/index' do assign :academic_years, [@academic_year] @district = create(:district) @school = create(:school) + @student_response_rate_presenter = ResponseRatePresenter.new(focus: :student, school: @school, + academic_year: @academic_year) + @teacher_response_rate_presenter = ResponseRatePresenter.new(focus: :teacher, school: @school, + academic_year: @academic_year) + Respondent.create!(school: @school, academic_year: @academic_year, total_students: 40, total_teachers: 40) ResponseRate.create!(subcategory: Subcategory.first, school: @school, academic_year: @academic_year, - student_response_rate: 100, teacher_response_rate: 100, meets_student_threshold: true, meets_teacher_threshold: true) + student_response_rate: 100, teacher_response_rate: 100, meets_student_threshold: true, meets_teacher_threshold: true) render end - context 'when some presenters have a nil score' do + context "when some presenters have a nil score" do let(:variance_chart_row_presenters) do [ VarianceChartRowPresenter.new(measure: support_for_teaching, score: Score.new), @@ -63,49 +68,49 @@ describe 'overview/index' do ] end - it 'displays a note detailing which measures have insufficient responses for the given school & academic year' do + it "displays a note detailing which measures have insufficient responses for the given school & academic year" do expect(rendered).to match %r{Note: The following measures are not displayed due to limited availability of school admin data and/or low survey response rates: Support For Teaching Development & Growth; Professional Qualifications.} end - it 'displays a variance row and label only those presenters for which the score is not nil' do - displayed_variance_rows = subject.css('[data-for-measure-id]') + it "displays a variance row and label only those presenters for which the score is not nil" do + displayed_variance_rows = subject.css("[data-for-measure-id]") expect(displayed_variance_rows.count).to eq 1 - expect(displayed_variance_rows.first.attribute('data-for-measure-id').value).to eq '2' + expect(displayed_variance_rows.first.attribute("data-for-measure-id").value).to eq "2" - displayed_variance_labels = subject.css('[data-variance-row-label]') + displayed_variance_labels = subject.css("[data-variance-row-label]") expect(displayed_variance_labels.count).to eq 1 - expect(displayed_variance_labels.first.inner_text).to include 'Effective Leadership' + expect(displayed_variance_labels.first.inner_text).to include "Effective Leadership" end end - context 'when all the presenters have a non-nil score' do + context "when all the presenters have a non-nil score" do let(:variance_chart_row_presenters) do - measure = create(:measure, name: 'Display Me', measure_id: 'display-me') + measure = create(:measure, name: "Display Me", measure_id: "display-me") scale = create(:scale, measure:) create(:student_survey_item, - scale:, - watch_low_benchmark: 1.5, - growth_low_benchmark: 2.5, - approval_low_benchmark: 3.5, - ideal_low_benchmark: 4.5) + scale:, + watch_low_benchmark: 1.5, + growth_low_benchmark: 2.5, + approval_low_benchmark: 3.5, + ideal_low_benchmark: 4.5) [ VarianceChartRowPresenter.new(measure:, - score: Score.new(average: rand)) + score: Score.new(average: rand)) ] end - it 'does not display a note detailing which measures have insufficient responses for the given school & academic year' do + it "does not display a note detailing which measures have insufficient responses for the given school & academic year" do expect(rendered).not_to match %r{Note: The following measures are not displayed due to limited availability of school admin data and/or low survey response rates} end - it 'displays a variance row for each presenter' do - displayed_variance_rows = subject.css('[data-for-measure-id]') + it "displays a variance row for each presenter" do + displayed_variance_rows = subject.css("[data-for-measure-id]") expect(displayed_variance_rows.count).to eq 1 - expect(displayed_variance_rows.first.attribute('data-for-measure-id').value).to eq 'display-me' + expect(displayed_variance_rows.first.attribute("data-for-measure-id").value).to eq "display-me" - displayed_variance_labels = subject.css('[data-variance-row-label]') + displayed_variance_labels = subject.css("[data-variance-row-label]") expect(displayed_variance_labels.count).to eq 1 - expect(displayed_variance_labels.first.inner_text).to include 'Display Me' + expect(displayed_variance_labels.first.inner_text).to include "Display Me" end end end