diff --git a/app/models/session_date.rb b/app/models/session_date.rb index cf8cf9011..52c34c73e 100644 --- a/app/models/session_date.rb +++ b/app/models/session_date.rb @@ -22,5 +22,22 @@ class SessionDate < ApplicationRecord belongs_to :session - validates :value, uniqueness: { scope: :session } + validates :value, + uniqueness: { + scope: :session + }, + comparison: { + greater_than_or_equal_to: :earliest_possible_value, + less_than_or_equal_to: :latest_possible_value + } + + private + + def earliest_possible_value + Date.new((session || Date.current).academic_year, 9, 1) + end + + def latest_possible_value + Date.new((session || Date.current).academic_year + 1, 8, 31) + end end diff --git a/spec/models/session_date_spec.rb b/spec/models/session_date_spec.rb index ce53c6b3e..b10b820a4 100644 --- a/spec/models/session_date_spec.rb +++ b/spec/models/session_date_spec.rb @@ -18,7 +18,17 @@ # fk_rails_... (session_id => sessions.id) # describe SessionDate do - subject(:session_date) { build(:session_date) } + subject(:session_date) { build(:session_date, session:) } - it { should be_valid } + let(:session) { create(:session, academic_year: 2024) } + + describe "validations" do + it "validates that the date is within the academic year" do + expect(session_date).to validate_comparison_of( + :value + ).is_greater_than_or_equal_to( + Date.new(2024, 9, 1) + ).is_less_than_or_equal_to(Date.new(2025, 8, 31)) + end + end end