aboutsummaryrefslogtreecommitdiffstats
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin_holiday_imports_controller_spec.rb73
-rw-r--r--spec/controllers/admin_holidays_controller_spec.rb3
-rw-r--r--spec/fixtures/files/ical-holidays.ics22
-rw-r--r--spec/models/holiday_import_spec.rb155
4 files changed, 252 insertions, 1 deletions
diff --git a/spec/controllers/admin_holiday_imports_controller_spec.rb b/spec/controllers/admin_holiday_imports_controller_spec.rb
new file mode 100644
index 000000000..dd23a022f
--- /dev/null
+++ b/spec/controllers/admin_holiday_imports_controller_spec.rb
@@ -0,0 +1,73 @@
+require 'spec_helper'
+
+describe AdminHolidayImportsController do
+
+ describe :new do
+
+ it 'renders the new template' do
+ get :new
+ expect(response).to render_template('new')
+ end
+
+ it 'creates an import' do
+ get :new
+ assigns[:holiday_import].should be_instance_of(HolidayImport)
+ end
+
+ describe 'if the import is valid' do
+
+ it 'populates the import' do
+ mock_import = mock(HolidayImport, :valid? => true,
+ :populate => nil)
+ HolidayImport.stub!(:new).and_return(mock_import)
+ mock_import.should_receive(:populate)
+ get :new
+ end
+
+ end
+
+ end
+
+ describe :create do
+
+ it 'creates an import' do
+ post :create
+ assigns[:holiday_import].should be_instance_of(HolidayImport)
+ end
+
+ describe 'if the import can be saved' do
+
+ before do
+ mock_import = mock(HolidayImport, :save => true)
+ HolidayImport.stub!(:new).and_return(mock_import)
+ post :create
+ end
+
+ it 'should show a success notice' do
+ flash[:notice].should == 'Holidays successfully imported'
+ end
+
+ it 'should redirect to the index' do
+ response.should redirect_to(admin_holidays_path)
+ end
+
+ end
+
+ describe 'if the import cannot be saved' do
+
+ before do
+ mock_import = mock(HolidayImport, :save => false)
+ HolidayImport.stub!(:new).and_return(mock_import)
+ post :create
+ end
+
+ it 'should render the new template' do
+ expect(response).to render_template('new')
+ end
+
+ end
+
+ end
+
+
+end
diff --git a/spec/controllers/admin_holidays_controller_spec.rb b/spec/controllers/admin_holidays_controller_spec.rb
index 1f76a7fcb..21cb51d29 100644
--- a/spec/controllers/admin_holidays_controller_spec.rb
+++ b/spec/controllers/admin_holidays_controller_spec.rb
@@ -51,7 +51,8 @@ describe AdminHolidaysController do
end
it 'creates a new holiday' do
- assigns[:holiday].should be_an_instance_of(Holiday)
+ get :new
+ assigns[:holiday].should be_instance_of(Holiday)
end
end
diff --git a/spec/fixtures/files/ical-holidays.ics b/spec/fixtures/files/ical-holidays.ics
new file mode 100644
index 000000000..6ccf31202
--- /dev/null
+++ b/spec/fixtures/files/ical-holidays.ics
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:PUBLISH
+PRODID:-//uk.gov/GOVUK calendars//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+DTEND;VALUE=DATE:20140102
+DTSTART;VALUE=DATE:20140101
+SUMMARY:New Year's Day
+UID:ca6af7456b0088abad9a69f9f620f5ac-17@gov.uk
+SEQUENCE:0
+DTSTAMP:20140916T090346Z
+END:VEVENT
+BEGIN:VEVENT
+DTEND;VALUE=DATE:20150102
+DTSTART;VALUE=DATE:20150101
+SUMMARY:New Year's Day
+UID:ca6af7456b00a69f9f620f5ac-17@gov.uk
+SEQUENCE:0
+DTSTAMP:20140916T090346Z
+END:VEVENT
+END:VCALENDAR
diff --git a/spec/models/holiday_import_spec.rb b/spec/models/holiday_import_spec.rb
new file mode 100644
index 000000000..d0be6fb98
--- /dev/null
+++ b/spec/models/holiday_import_spec.rb
@@ -0,0 +1,155 @@
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe HolidayImport do
+
+ it 'validates the presence of a feed if the source is a feed' do
+ holiday_import = HolidayImport.new(:source => 'feed')
+ holiday_import.valid?.should be_false
+ holiday_import.errors[:ical_feed_url].should == ["can't be blank"]
+ end
+
+ it 'does not validate the presence of a feed if the source is suggestions' do
+ holiday_import = HolidayImport.new(:source => 'suggestions')
+ holiday_import.valid?.should be_true
+ end
+
+ it 'validates that the source is either "feed" or "suggestions"' do
+ holiday_import = HolidayImport.new(:source => 'something')
+ holiday_import.valid?.should be_false
+ holiday_import.errors[:source].should == ["is not included in the list"]
+ end
+
+ it 'validates that all holidays create from attributes are valid' do
+ holiday_import = HolidayImport.new(:source => 'suggestions',
+ :holidays_attributes => {"0" => {:description => '',
+ "day(1i)"=>"",
+ "day(2i)"=>"",
+ "day(3i)"=>""}})
+ holiday_import.valid?.should be_false
+ holiday_import.errors[:base].should == ["These holidays could not be imported"]
+ end
+
+ it 'validates that all holidays to import are valid' do
+ holiday_import = HolidayImport.new
+ holiday_import.holidays = [ Holiday.new ]
+ holiday_import.valid?.should be_false
+ holiday_import.errors[:base].should == ['These holidays could not be imported']
+ end
+
+ it 'defaults to importing holidays for the current year' do
+ holiday_import = HolidayImport.new
+ holiday_import.start_year.should == 2014
+ holiday_import.end_year.should == 2014
+ end
+
+ it 'allows the start and end year to be set' do
+ holiday_import = HolidayImport.new(:start_year => 2011, :end_year => 2012)
+ holiday_import.start_year.should == 2011
+ holiday_import.end_year.should == 2012
+ end
+
+ it 'sets the start and end dates to the beginning and end of the year' do
+ holiday_import = HolidayImport.new(:start_year => 2011, :end_year => 2012)
+ holiday_import.start_date.should == Date.new(2011, 1, 1)
+ holiday_import.end_date.should == Date.new(2012, 12, 31)
+ end
+
+ it 'sets a default source of suggestions' do
+ holiday_import = HolidayImport.new
+ holiday_import.source.should == 'suggestions'
+ end
+
+ it 'allows the source to be set' do
+ holiday_import = HolidayImport.new(:source => 'feed')
+ holiday_import.source.should == 'feed'
+ end
+
+ it 'allows an iCal feed URL to be set' do
+ holiday_import = HolidayImport.new(:ical_feed_url => 'http://www.example.com')
+ holiday_import.ical_feed_url.should == 'http://www.example.com'
+ end
+
+ it 'sets a default populated flag to false' do
+ holiday_import = HolidayImport.new
+ holiday_import.populated.should == false
+ end
+
+ it 'returns a readable description of the period for multiple years' do
+ HolidayImport.new(:start_year => 2011, :end_year => 2012).period.should == '2011-2012'
+ end
+
+ it 'returns a readable description of the period for a single year' do
+ HolidayImport.new(:start_year => 2011, :end_year => 2011).period.should == '2011'
+ end
+
+ it 'returns the country name for which suggestions are generated' do
+ HolidayImport.new.suggestions_country_name.should == 'Germany'
+ end
+
+ describe 'when populating a set of holidays to import from suggestions' do
+
+ before do
+ holidays = [ { :date => Date.new(2014, 1, 1), :name => "New Year's Day", :regions => [:gb] } ]
+ Holidays.stub!(:between).and_return(holidays)
+ @holiday_import = HolidayImport.new(:source => 'suggestions')
+ @holiday_import.populate
+ end
+
+ it 'should populate holidays from the suggestions' do
+ @holiday_import.holidays.size.should == 1
+ holiday = @holiday_import.holidays.first
+ holiday.description.should == "New Year's Day"
+ holiday.day.should == Date.new(2014, 1, 1)
+ end
+
+ it 'should return a flag that it has been populated' do
+ @holiday_import.populated.should == true
+ end
+
+ end
+
+ describe 'when populating a set of holidays to import from a feed' do
+
+ before do
+ @holiday_import = HolidayImport.new(:source => 'feed',
+ :ical_feed_url => 'http://www.example.com')
+ end
+
+ it 'should populate holidays from the feed that are between the dates' do
+ @holiday_import.stub!(:open).and_return(load_file_fixture('ical-holidays.ics'))
+ @holiday_import.populate
+ @holiday_import.holidays.size.should == 1
+ holiday = @holiday_import.holidays.first
+ holiday.description.should == "New Year's Day"
+ holiday.day.should == Date.new(2014, 1, 1)
+ end
+
+ it 'should add an error if the calendar cannot be parsed' do
+ @holiday_import.stub!(:open).and_return('some invalid data')
+ @holiday_import.populate
+ expected = ["Sorry, there's a problem with the format of that feed."]
+ @holiday_import.errors[:ical_feed_url].should == expected
+ end
+
+ it 'should add an error if the calendar cannot be found' do
+ @holiday_import.stub!(:open).and_raise Errno::ENOENT.new('No such file or directory')
+ @holiday_import.populate
+ expected = ["Sorry we couldn't find that feed."]
+ @holiday_import.errors[:ical_feed_url].should == expected
+ end
+
+ end
+
+ describe 'when saving' do
+
+ it 'saves all holidays' do
+ holiday = Holiday.new
+ holiday_import = HolidayImport.new
+ holiday_import.holidays = [ holiday ]
+ holiday.should_receive(:save)
+ holiday_import.save
+ end
+
+ end
+
+end