refactored ConferencesController#calendar: separated calendar event creation into an specific service
This commit is contained in:
parent
6e276b2787
commit
69c06b4229
6 changed files with 249 additions and 34 deletions
|
|
@ -49,4 +49,44 @@ describe ConferencesController do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'GET#calendar' do
|
||||
let(:i_calendar) do
|
||||
instance_double(Icalendar::Calendar, publish: true, to_ical: true)
|
||||
end
|
||||
let!(:conference) { create(:conference) }
|
||||
let(:params) { { full: double(:full), format: :ics } }
|
||||
let(:user) { create :user, is_admin: true }
|
||||
|
||||
setup do
|
||||
user.update!(is_admin: true)
|
||||
|
||||
sign_in user
|
||||
|
||||
allow(Conference::Calendar::EventBuilder)
|
||||
.to receive(:call)
|
||||
|
||||
allow(Icalendar::Calendar)
|
||||
.to receive(:new)
|
||||
.and_return(i_calendar)
|
||||
end
|
||||
|
||||
it 'calls Conference::Calendar::EventBuilder with correct params' do
|
||||
expect(Conference::Calendar::EventBuilder)
|
||||
.to receive(:call)
|
||||
.with(
|
||||
conference: conference,
|
||||
conference_url: conference_url(conference.short_title),
|
||||
calendar: i_calendar,
|
||||
is_full_calendar: params[:full].to_s
|
||||
)
|
||||
|
||||
get :calendar, params: params
|
||||
end
|
||||
|
||||
it 'calls calendar#publish' do
|
||||
expect(i_calendar).to receive(:publish)
|
||||
|
||||
get :calendar, params: params
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
64
spec/services/conference/calendar/event_builder_spec.rb
Normal file
64
spec/services/conference/calendar/event_builder_spec.rb
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
describe Conference::Calendar::EventBuilder, type: :serializer do
|
||||
describe '.call' do
|
||||
let(:conference_url) { 'www.sample.com' }
|
||||
let!(:calendar) { Icalendar::Calendar.new }
|
||||
let(:conference) { create :full_conference }
|
||||
|
||||
context 'when is a full calendar' do
|
||||
let(:proposals_calendar) { double(:proposals_calendar) }
|
||||
|
||||
setup do
|
||||
allow_any_instance_of(ConferenceHelper)
|
||||
.to receive(:icalendar_proposals)
|
||||
.and_return(proposals_calendar)
|
||||
end
|
||||
|
||||
it 'returns icalendar_proposals' do
|
||||
result = described_class.call(
|
||||
conference: conference,
|
||||
calendar: calendar,
|
||||
is_full_calendar: true,
|
||||
conference_url: conference_url
|
||||
)
|
||||
|
||||
expect(result).to eq(proposals_calendar)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when is a not full calendar' do
|
||||
let(:venue) { conference.venue }
|
||||
setup do
|
||||
venue.update(latitude: '-100', longitude:'-200')
|
||||
end
|
||||
|
||||
it 'set callendar params' do
|
||||
calendar = Icalendar::Calendar.new
|
||||
described_class.call(
|
||||
conference: conference,
|
||||
calendar: calendar,
|
||||
is_full_calendar: false,
|
||||
conference_url: conference_url
|
||||
)
|
||||
event = calendar.events.first
|
||||
|
||||
expect(event.location).to eq("#{venue.street}, #{venue.postalcode} #{venue.city}, #{venue.country_name}")
|
||||
expect(event.dtstart).to eq(conference.start_date)
|
||||
expect(event.dtstart.ical_params).to eq({ 'VALUE'=>'DATE' })
|
||||
expect(event.dtend).to eq(conference.end_date)
|
||||
expect(event.dtend.ical_params).to eq({ 'VALUE'=>'DATE' })
|
||||
expect(event.duration.present?).to eq(true)
|
||||
expect(event.created).to eq(conference.created_at)
|
||||
expect(event.last_modified).to eq(conference.updated_at)
|
||||
expect(event.summary).to eq(conference.title)
|
||||
expect(event.description).to eq(conference.description)
|
||||
expect(event.uid).to eq(conference.guid)
|
||||
expect(event.url.value_ical).to eq(conference_url)
|
||||
expect(event.geo).to eq([conference.venue.latitude.to_f, conference.venue.longitude.to_f])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue