# frozen_string_literal: true require 'spec_helper' describe 'Publishing an event' do before(:each) do Timecop.freeze allow(QueueBus).to receive(:generate_uuid).and_return('idfhlkj') end after(:each) do Timecop.return end let(:bus_attrs) do { 'bus_class_proxy' => 'QueueBus::Driver', 'bus_published_at' => Time.now.to_i, 'bus_id' => "#{Time.now.to_i}-idfhlkj", 'bus_app_hostname' => Socket.gethostname } end it 'should add it to Redis' do hash = { :one => 1, 'two' => 'here', 'id' => 12 } event_name = 'event_name' val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } expect(val).to eq(nil) QueueBus.publish(event_name, hash) val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } hash = JSON.parse(val) expect(hash['class']).to eq('QueueBus::Worker') expect(hash['args'].size).to eq(1) expect(JSON.parse(hash['args'].first)).to eq({ 'bus_event_type' => event_name, 'two' => 'here', 'one' => 1, 'id' => 12 }.merge(bus_attrs)) end it 'should use the id if given' do hash = { :one => 1, 'two' => 'here', 'bus_id' => 'app-given' } event_name = 'event_name' val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } expect(val).to eq(nil) QueueBus.publish(event_name, hash) val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } hash = JSON.parse(val) expect(hash['class']).to eq('QueueBus::Worker') expect(hash['args'].size).to eq(1) expect(JSON.parse(hash['args'].first)).to eq({ 'bus_event_type' => event_name, 'two' => 'here', 'one' => 1 }.merge(bus_attrs).merge('bus_id' => 'app-given')) end it 'should add metadata via callback' do myval = 0 QueueBus.before_publish = lambda { |att| att['mine'] = 4 myval += 1 } hash = { :one => 1, 'two' => 'here', 'bus_id' => 'app-given' } event_name = 'event_name' val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } expect(val).to eq(nil) QueueBus.publish(event_name, hash) val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } hash = JSON.parse(val) att = JSON.parse(hash['args'].first) expect(att['mine']).to eq(4) expect(myval).to eq(1) end it 'should set the timezone and locale if available' do expect(defined?(I18n)).to be_nil expect(Time.respond_to?(:zone)).to eq(false) stub_const('I18n', Class.new) allow(I18n).to receive(:locale).and_return('jp') allow(Time).to receive(:zone).and_return(double('zone', name: 'EST')) hash = { :one => 1, 'two' => 'here', 'bus_id' => 'app-given' } event_name = 'event_name' val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } expect(val).to eq(nil) QueueBus.publish(event_name, hash) val = QueueBus.redis { |redis| redis.lpop('queue:bus_incoming') } hash = JSON.parse(val) expect(hash['class']).to eq('QueueBus::Worker') att = JSON.parse(hash['args'].first) expect(att['bus_locale']).to eq('jp') expect(att['bus_timezone']).to eq('EST') end end