diff --git a/app/models/call_for_paper.rb b/app/models/call_for_paper.rb index eab866ed..e72b0f79 100644 --- a/app/models/call_for_paper.rb +++ b/app/models/call_for_paper.rb @@ -6,6 +6,8 @@ class CallForPaper < ActiveRecord::Base validates_presence_of :start_date, :end_date validates :rating, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 10 } + validate :before_end_of_conference + validate :start_after_end_date ## # Calculates how many weeks the call for paper is. @@ -60,4 +62,19 @@ class CallForPaper < ActiveRecord::Base && !self.conference.email_settings.call_for_papers_dates_updates_subject.blank?\ && !self.conference.email_settings.call_for_papers_dates_updates_template.blank? end + + private + + def before_end_of_conference + errors. + add(:end_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && end_date && (end_date > conference.end_date) + + errors. + add(:start_date, "can't be after the conference end date (#{conference.end_date})") if conference && conference.end_date && start_date && (start_date > conference.end_date) + end + + def start_after_end_date + errors. + add(:start_date, "can't be after the end date") if start_date && end_date && start_date > end_date + end end diff --git a/spec/controllers/admin/conferences_controller_spec.rb b/spec/controllers/admin/conferences_controller_spec.rb index 7c6a4989..4e2f0d78 100644 --- a/spec/controllers/admin/conferences_controller_spec.rb +++ b/spec/controllers/admin/conferences_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Admin::ConferenceController do # It is necessary to use bang version of let to build roles before user - let(:conference) { create(:conference) } + let(:conference) { create(:conference, end_date: Date.new(2014, 05, 26) + 15) } let!(:first_user) { create(:user) } let!(:organizer_role) { create(:role, name: 'organizer', resource: conference) } diff --git a/spec/factories/call_for_paper.rb b/spec/factories/call_for_papers.rb similarity index 82% rename from spec/factories/call_for_paper.rb rename to spec/factories/call_for_papers.rb index ee99aa81..09ec6d8e 100644 --- a/spec/factories/call_for_paper.rb +++ b/spec/factories/call_for_papers.rb @@ -3,6 +3,6 @@ FactoryGirl.define do factory :call_for_paper do start_date { 1.day.ago } - end_date { 7.days.from_now } + end_date { 6.days.from_now } end end diff --git a/spec/features/cfp_spec.rb b/spec/features/cfp_spec.rb index 12f89bb7..d9610dcf 100644 --- a/spec/features/cfp_spec.rb +++ b/spec/features/cfp_spec.rb @@ -24,7 +24,7 @@ feature Conference do page.execute_script( "$('#conference-start-datepicker').val('#{today.strftime('%d/%m/%Y')}')") page.execute_script( - "$('#conference-end-datepicker').val('#{(today + 7).strftime('%d/%m/%Y')}')") + "$('#conference-end-datepicker').val('#{(today + 6).strftime('%d/%m/%Y')}')") fill_in 'call_for_paper_rating', with: '4' @@ -34,7 +34,7 @@ feature Conference do expect(flash). to eq('Call for papers successfully created.') expect(find('#start_date').text).to eq(today.strftime('%A, %B %-d. %Y')) - expect(find('#end_date').text).to eq((today + 7).strftime('%A, %B %-d. %Y')) + expect(find('#end_date').text).to eq((today + 6).strftime('%A, %B %-d. %Y')) expect(find('#rating').text).to eq('4') expect(CallForPaper.count).to eq(expected_count) @@ -57,7 +57,7 @@ feature Conference do "Start date can't be blank.") # Fill in date - today = Date.today - 7 + today = Date.today - 9 page.execute_script( "$('#conference-start-datepicker').val('#{today.strftime('%d/%m/%Y')}')") page.execute_script( diff --git a/spec/models/cfp_spec.rb b/spec/models/cfp_spec.rb new file mode 100644 index 00000000..122dca07 --- /dev/null +++ b/spec/models/cfp_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe CallForPaper do + let!(:conference) { create(:conference, end_date: Date.today) } + + describe '#before_end_of_conference' do + describe 'fails to save cfp' do + it 'when cfp end_date is after conference end_date' do + cfp = build(:call_for_paper, end_date: Date.today + 1, conference_id: conference.id) + expect(cfp.valid?).to be false + end + + it 'when cfp start_date is after conference end_date' do + cfp = build(:call_for_paper, end_date: Date.today + 1, conference_id: conference.id) + expect(cfp.valid?).to be false + end + end + + describe 'successfully saves cfp' do + it 'when cfp end_date and start_date are not after conference end_date' do + cfp = build(:call_for_paper, start_date: Date.today - 2, end_date: Date.today - 1, conference_id: conference.id) + expect(cfp.valid?).to be true + end + end + end + + describe '#start_after_end_date' do + it 'fails when cfp start_date is after cfp end_date' do + cfp = build(:call_for_paper, start_date: Date.today - 1, end_date: Date.today - 2, conference_id: conference.id) + expect(cfp.valid?).to be false + end + + it 'succeeds when cfp start_date is after cfp end_date' do + cfp = build(:call_for_paper, start_date: Date.today - 2, end_date: Date.today - 1, conference_id: conference.id) + expect(cfp.valid?).to be true + end + end +end diff --git a/spec/models/conference_spec.rb b/spec/models/conference_spec.rb index 5bb680ff..9601d1d5 100644 --- a/spec/models/conference_spec.rb +++ b/spec/models/conference_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' describe Conference do - let(:subject) { create(:conference) } + let(:subject) { create(:conference, end_date: '2014-06-30') } describe '#write_event_distribution_to_db' do diff --git a/spec/views/admin/call_for_papers/show.html.haml_spec.rb b/spec/views/admin/call_for_papers/show.html.haml_spec.rb index 48b45bd8..c6691c83 100644 --- a/spec/views/admin/call_for_papers/show.html.haml_spec.rb +++ b/spec/views/admin/call_for_papers/show.html.haml_spec.rb @@ -7,7 +7,7 @@ describe 'admin/call_for_papers/show' do assign :call_for_paper, create(:call_for_paper) render expect(rendered).to include(1.day.ago.strftime('%A, %B %-d. %Y')) - expect(rendered).to include(7.days.from_now.strftime('%A, %B %-d. %Y')) + expect(rendered).to include(6.days.from_now.strftime('%A, %B %-d. %Y')) end end