spec/isimud/event_observer_spec.rb in isimud-0.7.0 vs spec/isimud/event_observer_spec.rb in isimud-1.3.1
- old
+ new
@@ -1,32 +1,123 @@
+require 'spec_helper'
+
describe Isimud::EventObserver do
- let(:client) { Isimud.client }
+ before do
+ Isimud.model_watcher_exchange = 'isimud.test.events'
+ @client = Isimud.client
+ end
+
+ #let(:client) { Isimud.client }
let(:exchange_name) { 'events' }
- let(:user) { User.create!(first_name: 'Geo',
- last_name: 'Feil',
- encrypted_password: "itsasecret",
- email: 'george.feil@keas.com') }
- let!(:eventful) { Company.create!(name: 'Keas', description: 'Health Engagement Platform', url: 'http://keas.com') }
+ let(:company) { Company.create!(name: 'Keas', description: 'Health Engagement Platform', url: 'http://keas.com') }
+ let(:keys) { %w(a.b.c d.*.f) }
+ let(:user_params) { {first_name: 'Geo',
+ last_name: 'Feil',
+ encrypted_password: "itsasecret",
+ keys: keys,
+ email: 'george.feil@keas.com'} }
let(:time) { 1.hour.ago }
let(:params) { {'a' => 'foo', 'b' => 123} }
- let!(:evented) { User.create(routing_keys: ['model.Company.*.create', 'model.Event.*.report']) }
- let(:event) { Isimud::Event.new(user, eventful, action: :create, occurred_at: time, parameters: params) }
-
it 'registers class in observed_models' do
expect(Isimud::EventObserver.observed_models).to include(User)
end
- describe '#observe_events' do
- before(:each) do
- evented.observe_events(client, exchange_name)
+ describe 'when created' do
+ before do
+ @queue = double(:queue)
+ @exchange = Isimud.events_exchange
end
- it 'binds routing keys to the named queue in the exchange' do
- queue = client.queues["combustion.user.#{evented.id}"]
- expect(queue).to have_matching_key("model.Company.123.create")
+ it 'creates observer queue' do
+ expect(@client).to receive(:find_queue).and_return(@queue)
+ keys.each { |key| expect(@queue).to receive(:bind).with(@exchange, routing_key: key) }
+ User.create(user_params)
end
- it 'parses messages and dispatches to the handle_event method'
+ it 'does not create observer queue when listener is not enabled' do
+ expect(@client).not_to receive(:create_queue)
+ User.create(user_params.merge(deactivated: true))
+ end
+
+ it 'sets exchange_routing_keys' do
+ user = User.create(user_params)
+ expect(user.exchange_routing_keys).to eql(user.routing_keys)
+ end
+ end
+
+ describe 'when modified' do
+ before do
+ @exchange = Isimud.events_exchange
+ end
+
+ context 'for an instance that is made active on update' do
+ before do
+ @user = User.create(user_params.merge(deactivated: true))
+ @queue = @client.find_queue(@user.event_queue_name)
+ end
+
+ it 'creates the queue' do
+ expect(@client).to receive(:find_queue).with(@user.event_queue_name).and_call_original
+ @user.update_attributes(deactivated: false)
+ end
+
+ it 'binds the routing keys' do
+ @user.exchange_routing_keys.each do |k|
+ expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
+ end
+ @user.update_attributes(deactivated: false)
+ end
+ end
+
+ context 'for an already active instance' do
+ before do
+ @user = User.create(user_params)
+ @queue = @client.find_queue(@user.event_queue_name)
+ end
+
+ it 'binds new keys' do
+ @user.exchange_routing_keys.each do |k|
+ expect(@queue).to receive(:bind).with(@exchange, routing_key: k).and_call_original
+ end
+ expect(@queue).to receive(:bind).with(@exchange, routing_key: 'some_other_value').and_call_original
+ @user.transaction do
+ @user.keys << 'some_other_value'
+ @user.save!
+ end
+ end
+
+ it 'removes old keys' do
+ expect(@queue).to receive(:unbind).with(@exchange, routing_key: 'a.b.c')
+ expect(@queue).not_to receive(:unbind).with(@exchange, routing_key: 'd.*.f')
+ @user.keys.delete('a.b.c')
+ @user.save!
+ end
+ end
+ end
+
+ describe 'when destroyed' do
+ before do
+ @exchange = Isimud.events_exchange
+ @user = User.create(user_params)
+ end
+
+ it 'removes the queue' do
+ expect(@client).to receive(:delete_queue).with("combustion.user.#{@user.id}")
+ @user.destroy
+ end
+ end
+
+ describe '#observe_events' do
+ before do
+ @user = User.create(user_params.merge(keys: ['model.Company.*.create']))
+ @user.observe_events(@client)
+ end
+
+ it 'parses messages and dispatches to the handle_event method' do
+ event = Isimud::Event.new(@user, company, exchange: @exchange, action: :create, occurred_at: time, parameters: params)
+ event.publish
+ expect(@user.events).not_to be_empty
+ end
end
end
\ No newline at end of file