diff options
| -rw-r--r-- | app/models/calendar_observer.rb | 18 | ||||
| -rw-r--r-- | config/application.rb | 2 | ||||
| -rw-r--r-- | spec/models/calendar_observer_spec.rb | 43 |
3 files changed, 62 insertions, 1 deletions
diff --git a/app/models/calendar_observer.rb b/app/models/calendar_observer.rb new file mode 100644 index 000000000..789805356 --- /dev/null +++ b/app/models/calendar_observer.rb @@ -0,0 +1,18 @@ +class CalendarObserver < ActiveRecord::Observer + + def after_update calendar + return unless calendar.shared + + User.with_organisation.each do |user| + MailerJob.perform_later('CalendarMailer', 'updated', [calendar, user]) + end + end + + def after_create calendar + return unless calendar.shared + + User.with_organisation.each do |user| + MailerJob.perform_later('CalendarMailer', 'created', [calendar, user]) + end + end +end diff --git a/config/application.rb b/config/application.rb index 6c8de781d..02d2b4fc2 100644 --- a/config/application.rb +++ b/config/application.rb @@ -30,7 +30,7 @@ module ChouetteIhm # Configure Browserify to use babelify to compile ES6 config.browserify_rails.commandline_options = "-t [ babelify --presets [ react es2015 ] ]" - config.active_record.observers = :route_observer + config.active_record.observers = [:route_observer, :calendar_observer] config.active_record.raise_in_transactional_callbacks = true unless Rails.env.production? diff --git a/spec/models/calendar_observer_spec.rb b/spec/models/calendar_observer_spec.rb new file mode 100644 index 000000000..abb462d25 --- /dev/null +++ b/spec/models/calendar_observer_spec.rb @@ -0,0 +1,43 @@ +require 'rails_helper' + +RSpec.describe CalendarObserver, type: :observer do + let(:calendar) { create(:calendar, shared: true) } + let(:user) { create(:user, organisation: create(:organisation)) } + + context 'after_update' do + it 'should observe calendar updates' do + expect(CalendarObserver.instance).to receive(:after_update).with calendar + calendar.update_attribute(:name, 'edited_name') + end + + it 'should schedule mailer on calendar update' do + calendar.name = 'edited_name' + expect(MailerJob).to receive(:perform_later).with 'CalendarMailer', 'updated', [calendar, user] + calendar.save + end + + it 'should not schedule mailer for none shared calendar on update' do + calendar = create(:calendar, shared: false) + calendar.name = 'edited_name' + expect(MailerJob).to_not receive(:perform_later).with 'CalendarMailer', 'updated', [calendar, user] + calendar.save + end + end + + context 'after_create' do + it 'should observe calendar create' do + expect(CalendarObserver.instance).to receive(:after_create) + build(:calendar).save + end + + it 'should schedule mailer on calendar create' do + expect(MailerJob).to receive(:perform_later).with 'CalendarMailer', 'created', [anything, user] + build(:calendar, shared: true).save + end + + it 'should not schedule mailer for none shared calendar on create' do + expect(MailerJob).to_not receive(:perform_later).with 'CalendarMailer', 'created', [anything, user] + build(:calendar, shared: false).save + end + end +end |
