refactored ConferencesController#calendar: separated calendar event creation into an specific service

This commit is contained in:
Carlos Daniel Pohlod 2022-11-09 17:15:28 -03:00 committed by Henne Vogelsang
parent 6e276b2787
commit 69c06b4229
6 changed files with 249 additions and 34 deletions

View file

@ -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

View 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