parent
c423fcc014
commit
10e70557bd
@ -1,8 +1,26 @@
|
|||||||
class SurveyItemResponse < ActiveRecord::Base
|
class SurveyItemResponse < ActiveRecord::Base
|
||||||
|
TEACHER_RESPONSE_THRESHOLD = 17
|
||||||
|
STUDENT_RESPONSE_THRESHOLD = 196
|
||||||
|
|
||||||
belongs_to :academic_year
|
belongs_to :academic_year
|
||||||
belongs_to :school
|
belongs_to :school
|
||||||
belongs_to :survey_item
|
belongs_to :survey_item
|
||||||
|
|
||||||
scope :for_measures, ->(measures) { joins(:survey_item).where('survey_items.measure_id': measures.map(&:id)) }
|
scope :for_measures, ->(measures) { joins(:survey_item).where('survey_items.measure_id': measures.map(&:id)) }
|
||||||
scope :for_measure, ->(measure) { joins(:survey_item).where('survey_items.measure_id': measure.id) }
|
scope :for_measure, ->(measure) { joins(:survey_item).where('survey_items.measure_id': measure.id) }
|
||||||
|
|
||||||
|
def self.sufficient_data?(measure:, academic_year:, school:)
|
||||||
|
meets_teacher_threshold = true
|
||||||
|
meets_student_threshold = true
|
||||||
|
|
||||||
|
if measure.includes_teacher_survey_items?
|
||||||
|
meets_teacher_threshold = SurveyItemResponse.for_measure(measure).where("survey_items.survey_item_id LIKE 't-%'").where(academic_year: academic_year, school: school).count >= TEACHER_RESPONSE_THRESHOLD
|
||||||
|
end
|
||||||
|
|
||||||
|
if measure.includes_student_survey_items?
|
||||||
|
meets_student_threshold = SurveyItemResponse.for_measure(measure).where("survey_items.survey_item_id LIKE 's-%'").where(academic_year: academic_year, school: school).count >= STUDENT_RESPONSE_THRESHOLD
|
||||||
|
end
|
||||||
|
|
||||||
|
meets_teacher_threshold and meets_student_threshold
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.9 KiB |
@ -0,0 +1,131 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe SurveyItemResponse, type: :model do
|
||||||
|
|
||||||
|
describe '.sufficient_data?' do
|
||||||
|
let(:measure) { create(:measure) }
|
||||||
|
let(:school) { create(:school) }
|
||||||
|
let(:ay) { create(:academic_year) }
|
||||||
|
|
||||||
|
context 'when the measure includes only teacher data' do
|
||||||
|
let(:teacher_survey_item_1) { create(:survey_item, survey_item_id: 't-question-1', measure: measure) }
|
||||||
|
|
||||||
|
context 'and there is sufficient teacher data' do
|
||||||
|
before :each do
|
||||||
|
SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is truthy' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and there is insufficient teacher data' do
|
||||||
|
before :each do
|
||||||
|
(SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is falsey' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the measure includes only student data' do
|
||||||
|
let(:student_survey_item_1) { create(:survey_item, survey_item_id: 's-question-1', measure: measure) }
|
||||||
|
|
||||||
|
context 'and there is sufficient student data' do
|
||||||
|
before :each do
|
||||||
|
SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is truthy' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and there insufficient student data' do
|
||||||
|
before :each do
|
||||||
|
(SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is falsey' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the measure includes both teacher and student data' do
|
||||||
|
let(:teacher_survey_item_1) { create(:survey_item, survey_item_id: 't-question-1', measure: measure) }
|
||||||
|
let(:student_survey_item_1) { create(:survey_item, survey_item_id: 's-question-1', measure: measure) }
|
||||||
|
|
||||||
|
context 'and there is sufficient teacher data and sufficient student data' do
|
||||||
|
before :each do
|
||||||
|
SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is truthy' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and there is sufficient teacher data and insufficient student data' do
|
||||||
|
before :each do
|
||||||
|
SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
(SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is falsey' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and there is insufficient teacher data and sufficient student data' do
|
||||||
|
before :each do
|
||||||
|
(SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is falsey' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and there is insufficient teacher data and insufficient student data' do
|
||||||
|
before :each do
|
||||||
|
(SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
(SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1).times do
|
||||||
|
create(:survey_item_response, survey_item: student_survey_item_1, academic_year: ay, school: school)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is falsey' do
|
||||||
|
expect(SurveyItemResponse.sufficient_data?(measure: measure, academic_year: ay, school: school)).to be_falsey
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe 'dashboard/index.html.erb' do
|
||||||
|
|
||||||
|
let(:support_for_teaching) { create(:measure, name: 'Support For Teaching Development & Growth') }
|
||||||
|
let(:effective_leadership) { create(:measure, name: 'Effective Leadership') }
|
||||||
|
let(:professional_qualifications) { create(:measure, name: 'Professional Qualifications') }
|
||||||
|
|
||||||
|
before :each do
|
||||||
|
assign :category_presenters, []
|
||||||
|
assign :measure_graph_row_presenters, measure_graph_row_presenters
|
||||||
|
|
||||||
|
render
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there are measures for which, in the given academic year, the school has insufficient responses' do
|
||||||
|
let(:measure_graph_row_presenters) {
|
||||||
|
[
|
||||||
|
MeasureGraphRowPresenter.new(measure: support_for_teaching, score: 0, sufficient_data: false),
|
||||||
|
MeasureGraphRowPresenter.new(measure: create(:measure), score: 0, sufficient_data: true),
|
||||||
|
MeasureGraphRowPresenter.new(measure: effective_leadership, score: 0, sufficient_data: false),
|
||||||
|
MeasureGraphRowPresenter.new(measure: professional_qualifications, score: 0, sufficient_data: false)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'displays a note detailing which measures have insufficient responses for the given school & academic year' do
|
||||||
|
expect(rendered).to match /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; Effective Leadership; Professional Qualifications./
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when there are no measures for which, in the given academic year, the school has insufficient responses' do
|
||||||
|
let(:measure_graph_row_presenters) {
|
||||||
|
[
|
||||||
|
MeasureGraphRowPresenter.new(measure: create(:measure), score: 0, sufficient_data: true)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
it 'does not display a note detailing which measures have insufficient responses for the given school & academic year' do
|
||||||
|
expect(rendered).not_to match /Note: The following measures are not displayed due to limited availability of school admin data and\/or low survey response rates/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in new issue