Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions lib/ical_filter_proxy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,13 @@

require_relative 'ical_filter_proxy/calendar'
require_relative 'ical_filter_proxy/filter_rule'
require_relative 'ical_filter_proxy/calendar_builder'
require_relative 'ical_filter_proxy/filterable_event_adapter'

module IcalFilterProxy
def self.calendars
config.each_with_object({}) do |(calendar_name, filter_config), calendars|
calendar = Calendar.new(filter_config["ical_url"], filter_config["api_key"], filter_config["timezone"])

filter_config["rules"].each do |rule|
calendar.add_rule(rule["field"], rule["operator"], rule["val"])
end

calendars[calendar_name] = calendar
config.transform_values do |calendar_config|
CalendarBuilder.new(calendar_config).build
end
end

Expand Down
37 changes: 37 additions & 0 deletions lib/ical_filter_proxy/calendar_builder.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module IcalFilterProxy
class CalendarBuilder

attr_reader :calendar_config, :calendar

def initialize(calendar_config)
@calendar_config = calendar_config
end

def build
create_calendar
add_rules

calendar
end

private

def create_calendar
@calendar = Calendar.new(calendar_config["ical_url"],
calendar_config["api_key"],
calendar_config["timezone"])
end

def add_rules
rules = calendar_config["rules"]
return unless rules

rules.each do |rule|
calendar.add_rule(rule["field"],
rule["operator"],
rule["val"])
end
end

end
end
57 changes: 57 additions & 0 deletions spec/calendar_builder_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require 'spec_helper'

require 'spec_helper'

RSpec.describe IcalFilterProxy::CalendarBuilder do

subject { described_class.new(example_config) }

let(:example_config) do
{
'ical_url' => 'https://url-to-calendar.ical',
'api_key' => 'abc12',
'rules' => [
{ 'field' => 'start_time', 'operator' => 'equals', 'val' => '09:00' }
]
}
end

describe '#build' do
let(:calendar) { subject.build }

it 'builds a Calendar' do
expect(calendar).to be_a(IcalFilterProxy::Calendar)
end

it 'adds ical_url to the Calendar object' do
expect(calendar.ical_url).to eq('https://url-to-calendar.ical')
end

it 'adds api_key to the Calenar object' do
expect(calendar.api_key).to eq('abc12')
end

it 'adds filter rules to the Calendar object' do
filter_rule = calendar.filter_rules.first

expect(filter_rule).to be_a(IcalFilterProxy::FilterRule)
expect(filter_rule.field).to eq('start_time')
expect(filter_rule.operator).to eq('equals')
expect(filter_rule.values).to eq('09:00')
end

context 'when no fitler rules are present' do
let(:example_config) do
{
'ical_url' => 'https://url-to-calendar.ical',
'api_key' => 'abc12',
}
end

it 'does not attempt to add any rules' do
expect(calendar.filter_rules).to be_empty
end
end
end

end
33 changes: 11 additions & 22 deletions spec/ical_filter_proxy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,33 +22,23 @@

let(:calendars) { described_class.calendars }

it "builds a hash" do
expect(calendars).to be_a(Hash)
end

it "has an entry for each calendar in the config file" do
expect(calendars).to have_key('rota')
end

it 'creates a Calenar object for each entry' do
expect(calendars['rota']).to be_a(IcalFilterProxy::Calendar)
end

it 'adds ical_url to the Calendar object' do
expect(calendars['rota'].ical_url).to eq('https://url-to-calendar.ical')
end

it 'adds api_key to the Calenar object' do
expect(calendars['rota'].api_key).to eq('abc12')
end
it 'calls CalendarBuilder#build for each entry and stores the return' do
calendar_builder = instance_double(IcalFilterProxy::CalendarBuilder)
expect(IcalFilterProxy::CalendarBuilder)
.to receive(:new)
.with(example_config['rota'])
.and_return(calendar_builder)

it 'adds filters to the Calendar object' do
filter_rule = calendars['rota'].filter_rules.first
calendar = instance_double(IcalFilterProxy::CalendarBuilder)
expect(calendar_builder)
.to receive(:build)
.and_return(calendar)

expect(filter_rule).to be_a(IcalFilterProxy::FilterRule)
expect(filter_rule.field).to eq('start_time')
expect(filter_rule.operator).to eq('equals')
expect(filter_rule.values).to eq('09:00')
expect(calendars['rota']).to eq(calendar)
end
end

Expand All @@ -64,5 +54,4 @@ def example_config
}
end


end