require 'rails_helper' RSpec.describe Scale, type: :model do let(:school) { create(:school) } let(:academic_year) { create(:academic_year) } let(:scale) { create(:scale) } describe '.score' do let(:teacher_survey_item_1) { create(:teacher_survey_item, scale:) } let(:teacher_survey_item_2) { create(:teacher_survey_item, scale:) } let(:teacher_survey_item_3) { create(:teacher_survey_item, scale:) } let(:student_survey_item_1) { create(:student_survey_item, scale:) } context 'when only teacher survey items exist' do before :each do create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year:, school:, likert_score: 3) create(:survey_item_response, survey_item: teacher_survey_item_2, academic_year:, school:, likert_score: 4) create(:survey_item_response, survey_item: teacher_survey_item_3, academic_year:, school:, likert_score: 5) end it 'returns the average of the likert scores of the survey items' do expect(scale.score(school:, academic_year:)).to eq 4 end context 'when other scales exist' do before :each do create(:survey_item_response, academic_year:, school:, likert_score: 1) create(:survey_item_response, academic_year:, school:, likert_score: 1) create(:survey_item_response, academic_year:, school:, likert_score: 1) end it 'does not affect the score for the original scale' do expect(scale.score(school:, academic_year:)).to eq 4 end end end context 'when both teacher and student survey items exist' do before :each do create(:survey_item_response, survey_item: teacher_survey_item_1, academic_year:, school:, likert_score: 3) create(:survey_item_response, survey_item: teacher_survey_item_2, academic_year:, school:, likert_score: 4) create(:survey_item_response, survey_item: teacher_survey_item_3, academic_year:, school:, likert_score: 5) end context 'but no survey item responses are linked to student survey items' do before :each do student_survey_item_1 end it 'returns a score that only averages teacher survey items' do expect(scale.score(school:, academic_year:)).to eq 4 end end context 'and some survey item responses exist for a student survey item' do before :each do create(:survey_item_response, survey_item: student_survey_item_1, academic_year:, school:, likert_score: 2) end it 'returns a score that gives equal weight to student and teacher survey items' do expect(scale.score(school:, academic_year:)).to eq 3 end end end end end