spec/models/concerns/publishable_spec.rb in reactor-0.8.3 vs spec/models/concerns/publishable_spec.rb in reactor-0.9.0
- old
+ new
@@ -1,9 +1,9 @@
require 'spec_helper'
+require 'sidekiq/testing'
class Auction < ActiveRecord::Base
- attr_accessor :we_want_it
belongs_to :pet
def ring_timeout
start_at + 30.seconds
end
@@ -13,11 +13,11 @@
end
publishes :bell
publishes :ring, at: :ring_timeout, watch: :start_at
publishes :begin, at: :start_at, additional_info: 'curtis was here'
- publishes :conditional_event_on_save, if: -> { we_want_it }
+ publishes :conditional_event_on_save, at: :start_at, if: -> { we_want_it }
publishes :woof, actor: :pet, target: :self
end
class TestSubscriber < Reactor::Subscriber
@@called = false
@@ -33,11 +33,11 @@
TestSubscriber.class_variable_set(:@@called, false)
end
describe 'publish' do
let(:pet) { Pet.create! }
- let(:auction) { Auction.create!(pet: pet, start_at: DateTime.new(2012,12,21)) }
+ let(:auction) { Auction.create!(pet: pet, start_at: Time.current + 1.day, we_want_it: false) }
it 'publishes an event with actor_id and actor_type set as self' do
auction
expect(Reactor::Event).to receive(:publish).with(:an_event, what: 'the', actor: auction)
auction.publish(:an_event, {what: 'the'})
@@ -50,71 +50,91 @@
end
it 'reschedules an event when the :at time changes' do
start_at = auction.start_at
new_start_at = start_at + 1.week
- expect(Reactor::Event).to receive(:reschedule).with :ring, anything
- expect(Reactor::Event).to receive(:reschedule).with(:begin,
+
+ allow(Reactor::Event).to receive(:reschedule)
+
+ auction.start_at = new_start_at
+ auction.save!
+
+ expect(Reactor::Event).to have_received(:reschedule).with(:begin,
a_hash_including(
at: new_start_at,
actor: auction,
was: start_at,
additional_info: 'curtis was here'
)
)
- auction.start_at = new_start_at
- auction.save!
end
it 'reschedules an event when the :watch field changes' do
ring_time = auction.ring_timeout
new_start_at = auction.start_at + 1.week
new_ring_time = new_start_at + 30.seconds
- expect(Reactor::Event).to receive(:reschedule).with :begin, anything
- expect(Reactor::Event).to receive(:reschedule).with(:ring,
+
+ allow(Reactor::Event).to receive(:reschedule)
+
+ auction.start_at = new_start_at
+ auction.save!
+
+ expect(Reactor::Event).to have_received(:reschedule).with(:ring,
a_hash_including(
at: new_ring_time,
actor: auction,
was: ring_time
)
)
- auction.start_at = new_start_at
- auction.save!
end
+ context 'conditional firing' do
+ before do
+ Sidekiq::Testing.fake!
+ Sidekiq::Worker.clear_all
+ TestSubscriber.create! event_name: :conditional_event_on_save
+ auction
+ job = Reactor::Event.jobs.detect do |job|
+ job['class'] == 'Reactor::Event' && job['args'].first == 'conditional_event_on_save'
+ end
+ @job_args = job['args']
+ end
+
+ after do
+ Sidekiq::Testing.inline!
+ end
+
+ it 'calls the subscriber when if is set to true' do
+ auction.we_want_it = true
+ auction.start_at = 3.day.from_now
+ auction.save!
+
+ expect{ Reactor::Event.perform(@job_args[0], @job_args[1]) }.to change{ Sidekiq::Extensions::DelayedClass.jobs.size }
+ end
+
+ it 'does not call the subscriber when if is set to false' do
+ auction.we_want_it = false
+ auction.start_at = 3.days.from_now
+ auction.save!
+
+ expect{ Reactor::Event.perform(@job_args[0], @job_args[1]) }.to_not change{ Sidekiq::Extensions::DelayedClass.jobs.size }
+ end
+ end
+
it 'supports immediate events (on create) that get fired once' do
TestSubscriber.create! event_name: :bell
auction
expect(TestSubscriber.class_variable_get(:@@called)).to be_truthy
TestSubscriber.class_variable_set(:@@called, false)
auction.start_at = 1.day.from_now
auction.save
expect(TestSubscriber.class_variable_get(:@@called)).to be_falsey
end
- it 'does not publish an event scheduled for the past' do
- TestSubscriber.create! event_name: :begin
- auction
- expect(TestSubscriber.class_variable_get(:@@called)).to be_falsey
- end
-
it 'does publish an event scheduled for the future' do
TestSubscriber.create! event_name: :begin
Auction.create!(pet: pet, start_at: Time.current + 1.week)
- expect(TestSubscriber.class_variable_get(:@@called)).to be_truthy
- end
-
- it 'can fire events onsave for any condition' do
- TestSubscriber.create! event_name: :conditional_event_on_save
- auction
- TestSubscriber.class_variable_set(:@@called, false)
- auction.start_at = 1.day.from_now
- auction.save
- expect(TestSubscriber.class_variable_get(:@@called)).to be_falsey
- auction.start_at = 2.days.from_now
- auction.we_want_it = true
- auction.save
expect(TestSubscriber.class_variable_get(:@@called)).to be_truthy
end
end
end