aboutsummaryrefslogtreecommitdiffstats
path: root/spec/models/calendar_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/calendar_spec.rb')
-rw-r--r--spec/models/calendar_spec.rb109
1 files changed, 109 insertions, 0 deletions
diff --git a/spec/models/calendar_spec.rb b/spec/models/calendar_spec.rb
new file mode 100644
index 000000000..1143c6615
--- /dev/null
+++ b/spec/models/calendar_spec.rb
@@ -0,0 +1,109 @@
+require 'rails_helper'
+
+RSpec.describe Calendar, :type => :model do
+
+ it { should belong_to(:organisation) }
+
+ it { is_expected.to validate_presence_of(:organisation) }
+ it { is_expected.to validate_presence_of(:name) }
+ it { is_expected.to validate_presence_of(:short_name) }
+ it { is_expected.to validate_uniqueness_of(:short_name) }
+
+ describe 'validations' do
+ it 'validates that dates and date_ranges do not overlap' do
+ calendar = build(:calendar, dates: [Date.today], date_ranges: [Date.today..Date.tomorrow])
+ expect {
+ calendar.save!
+ }.to raise_error(ActiveRecord::RecordInvalid)
+ expect(calendar.errors.messages[:dates]).to eq([I18n.t('activerecord.errors.models.calendar.attributes.dates.date_in_date_ranges')])
+ end
+ end
+
+ describe 'DateRange' do
+
+ subject { date_range }
+
+ def date_range(attributes = {})
+ return @date_range if attributes.empty? and @date_range
+ Calendar::DateRange.new(attributes).tap do |date_range|
+ @date_range = date_range if attributes.empty?
+ end
+ end
+
+ it 'should support mark_for_destruction (required by cocoon)' do
+ date_range.mark_for_destruction
+ expect(date_range).to be_marked_for_destruction
+ end
+
+ it 'should support _destroy attribute (required by coocon)' do
+ date_range._destroy = true
+ expect(date_range).to be_marked_for_destruction
+ end
+
+ it 'should support new_record? (required by cocoon)' do
+ expect(Calendar::DateRange.new).to be_new_record
+ expect(date_range(id: 42)).not_to be_new_record
+ end
+
+ it 'should cast begin as date attribute' do
+ expect(date_range(begin: '2016-11-22').begin).to eq(Date.new(2016,11,22))
+ end
+
+ it 'should cast end as date attribute' do
+ expect(date_range(end: '2016-11-22').end).to eq(Date.new(2016,11,22))
+ end
+
+ it { is_expected.to validate_presence_of(:begin) }
+ it { is_expected.to validate_presence_of(:end) }
+
+ it 'should validate that end is greather than or equlals to begin' do
+ expect(date_range(begin: '2016-11-21', end: '2016-11-22')).to be_valid
+ expect(date_range(begin: '2016-11-21', end: '2016-11-21')).to be_valid
+ expect(date_range(begin: '2016-11-22', end: '2016-11-21')).to_not be_valid
+ end
+
+ describe 'intersect?' do
+
+ it 'should detect date in common with other date_ranges' do
+ november = date_range(begin: '2016-11-01', end: '2016-11-30')
+ mid_november_mid_december = date_range(begin: '2016-11-15', end: '2016-12-15')
+ expect(november.intersect?(mid_november_mid_december)).to be(true)
+ end
+
+ it 'should not intersect when no date is in common' do
+ november = date_range(begin: '2016-11-01', end: '2016-11-30')
+ december = date_range(begin: '2016-12-01', end: '2016-12-31')
+
+ expect(november.intersect?(december)).to be(false)
+
+ january = date_range(begin: '2017-01-01', end: '2017-01-31')
+ expect(november.intersect?(december, january)).to be(false)
+ end
+
+ it 'should not intersect itself' do
+ date_range = date_range(id: 42, begin: '2016-11-01', end: '2016-11-30')
+ expect(date_range.intersect?(date_range)).to be(false)
+ end
+
+ end
+
+ end
+
+ describe 'before_validation' do
+ let(:calendar) { create(:calendar, date_ranges: []) }
+
+ it 'shoud fill date_ranges with date ranges' do
+ expected_ranges = [
+ Range.new(Date.today, Date.tomorrow)
+ ]
+ expected_ranges.each_with_index do |range, index|
+ calendar.date_ranges << Calendar::DateRange.from_range(index, range)
+ end
+ calendar.valid?
+
+ expect(calendar.date_ranges.map { |date_range| date_range.begin..date_range.end }).to eq(expected_ranges)
+ end
+ end
+
+end
+