sidekiq-bus 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ module SidekiqBus
2
+ VERSION = "0.5.2"
3
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "sidekiq_bus/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sidekiq-bus"
7
+ s.version = SidekiqBus::VERSION
8
+ s.authors = ["Brian Leonard"]
9
+ s.email = ["brian@bleonard.com"]
10
+ s.homepage = "https://github.com/queue-bus/sidekiq-bus"
11
+ s.summary = %q{A simple event bus on top of Resque}
12
+ s.description = %q{A simple event bus on top of Resque. Publish and subscribe to events as they occur through a queue.}
13
+
14
+ s.rubyforge_project = "sidekiq-bus"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency('queue-bus', '0.5.2')
22
+ s.add_dependency('sidekiq', ['>= 3.0.0', '< 4.0'])
23
+
24
+ s.add_development_dependency("rspec")
25
+ s.add_development_dependency("timecop")
26
+ s.add_development_dependency("json_pure")
27
+ end
@@ -0,0 +1,14 @@
1
+ require 'sidekiq-bus'
2
+
3
+ def reset_test_adapter
4
+ QueueBus.send(:reset)
5
+ QueueBus.adapter = QueueBus::Adapters::Sidekiq.new
6
+ end
7
+
8
+ def adapter_under_test_class
9
+ QueueBus::Adapters::Sidekiq
10
+ end
11
+
12
+ def adapter_under_test_symbol
13
+ :sidekiq
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe "adapter is set" do
4
+ it "should call it's enabled! method on init" do
5
+ QueueBus.send(:reset)
6
+ adapter_under_test_class.any_instance.should_receive(:enabled!)
7
+ instance = adapter_under_test_class.new
8
+ QueueBus.send(:reset)
9
+ end
10
+
11
+ it "should be defaulting to Data from spec_helper" do
12
+ QueueBus.adapter.is_a?(adapter_under_test_class).should == true
13
+ end
14
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe Application do
5
+ describe ".all" do
6
+ it "should return empty array when none" do
7
+ Application.all.should == []
8
+ end
9
+ it "should return registered applications when there are some" do
10
+ Application.new("One").subscribe(test_list(test_sub("fdksjh")))
11
+ Application.new("Two").subscribe(test_list(test_sub("fdklhf")))
12
+ Application.new("Three").subscribe(test_list(test_sub("fkld")))
13
+
14
+ Application.all.collect(&:app_key).should =~ ["one", "two", "three"]
15
+
16
+ Application.new("two").unsubscribe
17
+ Application.all.collect(&:app_key).should =~ ["one", "three"]
18
+ end
19
+ end
20
+
21
+ describe ".new" do
22
+ it "should have a key" do
23
+ Application.new("something").app_key.should == "something"
24
+
25
+ Application.new("some thing").app_key.should == "some_thing"
26
+ Application.new("some-thing").app_key.should == "some_thing"
27
+ Application.new("some_thing").app_key.should == "some_thing"
28
+ Application.new("Some Thing").app_key.should == "some_thing"
29
+ end
30
+
31
+ it "should raise an error if not valid" do
32
+ lambda {
33
+ Application.new("")
34
+ }.should raise_error
35
+
36
+ lambda {
37
+ Application.new(nil)
38
+ }.should raise_error
39
+
40
+ lambda {
41
+ Application.new("/")
42
+ }.should raise_error
43
+ end
44
+ end
45
+
46
+ describe "#read_redis_hash" do
47
+ it "should handle old and new values" do
48
+
49
+ QueueBus.redis { |redis| redis.hset("bus_app:myapp", "new_one", QueueBus::Util.encode("queue_name" => "x", "bus_event_type" => "event_name") ) }
50
+ QueueBus.redis { |redis| redis.hset("bus_app:myapp", "old_one", "oldqueue_name") }
51
+ app = Application.new("myapp")
52
+ val = app.send(:read_redis_hash)
53
+ val.should == {"new_one" => {"queue_name" => "x", "bus_event_type" => "event_name"}, "old_one" => "oldqueue_name"}
54
+ end
55
+ end
56
+
57
+ describe "#subscribe" do
58
+ let(:sub1) { test_sub("event_one", "default") }
59
+ let(:sub2) { test_sub("event_two", "default") }
60
+ let(:sub3) { test_sub("event_three", "other") }
61
+ it "should add array to redis" do
62
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
63
+ Application.new("myapp").subscribe(test_list(sub1, sub2))
64
+
65
+ QueueBus.redis { |redis| redis.hgetall("bus_app:myapp") }.should == {"event_two"=>"{\"queue_name\":\"default\",\"key\":\"event_two\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_two\"}}",
66
+ "event_one"=>"{\"queue_name\":\"default\",\"key\":\"event_one\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_one\"}}"}
67
+ QueueBus.redis { |redis| redis.hkeys("bus_app:myapp") }.should =~ ["event_one", "event_two"]
68
+ QueueBus.redis { |redis| redis.smembers("bus_apps") }.should =~ ["myapp"]
69
+ end
70
+ it "should add string to redis" do
71
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
72
+ Application.new("myapp").subscribe(test_list(sub1))
73
+
74
+ QueueBus.redis { |redis| redis.hgetall("bus_app:myapp") }.should == {"event_one"=>"{\"queue_name\":\"default\",\"key\":\"event_one\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_one\"}}"}
75
+ QueueBus.redis { |redis| redis.hkeys("bus_app:myapp") }.should =~ ["event_one"]
76
+ QueueBus.redis { |redis| redis.smembers("bus_apps") }.should =~ ["myapp"]
77
+ end
78
+ it "should multiple queues to redis" do
79
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
80
+ Application.new("myapp").subscribe(test_list(sub1, sub2, sub3))
81
+ QueueBus.redis { |redis| redis.hgetall("bus_app:myapp") }.should == {"event_two"=>"{\"queue_name\":\"default\",\"key\":\"event_two\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_two\"}}", "event_one"=>"{\"queue_name\":\"default\",\"key\":\"event_one\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_one\"}}",
82
+ "event_three"=>"{\"queue_name\":\"other\",\"key\":\"event_three\",\"class\":\"::QueueBus::Rider\",\"matcher\":{\"bus_event_type\":\"event_three\"}}"}
83
+ QueueBus.redis { |redis| redis.hkeys("bus_app:myapp") }.should =~ ["event_three", "event_two", "event_one"]
84
+ QueueBus.redis { |redis| redis.smembers("bus_apps") }.should =~ ["myapp"]
85
+ end
86
+
87
+ it "should do nothing if nil or empty" do
88
+
89
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
90
+
91
+ Application.new("myapp").subscribe(nil)
92
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
93
+
94
+ Application.new("myapp").subscribe([])
95
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
96
+ end
97
+
98
+ it "should call unsubscribe" do
99
+ app = Application.new("myapp")
100
+ app.should_receive(:unsubscribe)
101
+ app.subscribe([])
102
+ end
103
+ end
104
+
105
+ describe "#unsubscribe" do
106
+ it "should remove items" do
107
+ QueueBus.redis { |redis| redis.sadd("bus_apps", "myapp") }
108
+ QueueBus.redis { |redis| redis.sadd("bus_apps", "other") }
109
+ QueueBus.redis { |redis| redis.hset("bus_app:myapp", "event_one", "myapp_default") }
110
+
111
+ Application.new("myapp").unsubscribe
112
+
113
+ QueueBus.redis { |redis| redis.smembers("bus_apps") }.should == ["other"]
114
+ QueueBus.redis { |redis| redis.get("bus_app:myapp") }.should be_nil
115
+ end
116
+ end
117
+
118
+ describe "#subscription_matches" do
119
+ it "should return if it is there" do
120
+ Application.new("myapp").subscription_matches("bus_event_type"=>"three").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
121
+
122
+ subs = test_list(test_sub("one_x"), test_sub("one_y"), test_sub("one"), test_sub("two"))
123
+ Application.new("myapp").subscribe(subs)
124
+ Application.new("myapp").subscription_matches("bus_event_type"=>"three").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
125
+
126
+ Application.new("myapp").subscription_matches("bus_event_type"=>"two").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "two", "default", "::QueueBus::Rider"]]
127
+ Application.new("myapp").subscription_matches("bus_event_type"=>"one").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "one", "default", "::QueueBus::Rider"]]
128
+ end
129
+
130
+ it "should handle * wildcards" do
131
+ subs = test_list(test_sub("one.+"), test_sub("one"), test_sub("one_.*"), test_sub("two"))
132
+ Application.new("myapp").subscribe(subs)
133
+ Application.new("myapp").subscription_matches("bus_event_type"=>"three").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
134
+
135
+ Application.new("myapp").subscription_matches("bus_event_type"=>"onex").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "one.+", "default", "::QueueBus::Rider"]]
136
+ Application.new("myapp").subscription_matches("bus_event_type"=>"one").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "one", "default", "::QueueBus::Rider"]]
137
+ Application.new("myapp").subscription_matches("bus_event_type"=>"one_x").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "one.+","default", "::QueueBus::Rider"], ["myapp", "one_.*", "default", "::QueueBus::Rider"]]
138
+ end
139
+
140
+ it "should handle actual regular expressions" do
141
+ subs = test_list(test_sub(/one.+/), test_sub("one"), test_sub(/one_.*/), test_sub("two"))
142
+ Application.new("myapp").subscribe(subs)
143
+ Application.new("myapp").subscription_matches("bus_event_type"=>"three").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
144
+
145
+ Application.new("myapp").subscription_matches("bus_event_type"=>"onex").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "(?-mix:one.+)", "default", "::QueueBus::Rider"]]
146
+ Application.new("myapp").subscription_matches("bus_event_type"=>"donex").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "(?-mix:one.+)", "default", "::QueueBus::Rider"]]
147
+ Application.new("myapp").subscription_matches("bus_event_type"=>"one").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "one" ,"default", "::QueueBus::Rider"]]
148
+ Application.new("myapp").subscription_matches("bus_event_type"=>"one_x").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["myapp", "(?-mix:one.+)", "default", "::QueueBus::Rider"], ["myapp", "(?-mix:one_.*)", "default", "::QueueBus::Rider"]]
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ module Adapters
5
+ class TestOne
6
+
7
+ end
8
+ end
9
+ end
10
+
11
+ describe "QueueBus config" do
12
+ it "should set the default app key" do
13
+ QueueBus.default_app_key.should == nil
14
+
15
+ QueueBus.default_app_key = "my_app"
16
+ QueueBus.default_app_key.should == "my_app"
17
+
18
+ QueueBus.default_app_key = "something here"
19
+ QueueBus.default_app_key.should == "something_here"
20
+ end
21
+
22
+ it "should set the default queue" do
23
+ QueueBus.default_queue.should == nil
24
+
25
+ QueueBus.default_queue = "my_queue"
26
+ QueueBus.default_queue.should == "my_queue"
27
+ end
28
+
29
+ it "should set the local mode" do
30
+ QueueBus.local_mode.should == nil
31
+ QueueBus.local_mode = :standalone
32
+ QueueBus.local_mode.should == :standalone
33
+ end
34
+
35
+ it "should set the hostname" do
36
+ QueueBus.hostname.should_not == nil
37
+ QueueBus.hostname = "whatever"
38
+ QueueBus.hostname.should == "whatever"
39
+ end
40
+
41
+ it "should set before_publish callback" do
42
+ QueueBus.before_publish = lambda {|attributes| 42 }
43
+ QueueBus.before_publish_callback({}).should == 42
44
+ end
45
+
46
+
47
+ it "should use the default Redis connection" do
48
+ QueueBus.redis { |redis| redis }.should_not eq(nil)
49
+ end
50
+
51
+ it "should default to given adapter" do
52
+ QueueBus.adapter.is_a?(adapter_under_test_class).should == true
53
+
54
+ # and should raise if already set
55
+ lambda {
56
+ QueueBus.adapter = :data
57
+ }.should raise_error
58
+ end
59
+
60
+ context "with a fresh load" do
61
+ before(:each) do
62
+ QueueBus.send(:reset)
63
+ end
64
+
65
+ it "should be able to be set to resque" do
66
+ QueueBus.adapter = adapter_under_test_symbol
67
+ QueueBus.adapter.is_a?(adapter_under_test_class).should == true
68
+
69
+ # and should raise if already set
70
+ lambda {
71
+ QueueBus.adapter = :data
72
+ }.should raise_error
73
+ end
74
+
75
+ it "should be able to be set to something else" do
76
+
77
+ QueueBus.adapter = :test_one
78
+ QueueBus.adapter.is_a?(QueueBus::Adapters::TestOne).should == true
79
+ end
80
+ end
81
+
82
+
83
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe Dispatch do
5
+ it "should not start with any applications" do
6
+ Dispatch.new("d").subscriptions.size.should == 0
7
+ end
8
+
9
+ it "should register code to run and execute it" do
10
+ dispatch = Dispatch.new("d")
11
+ dispatch.subscribe("my_event") do |attrs|
12
+ Runner1.run(attrs)
13
+ end
14
+ sub = dispatch.subscriptions.key("my_event")
15
+ sub.send(:executor).is_a?(Proc).should == true
16
+
17
+ Runner.value.should == 0
18
+ dispatch.execute("my_event", {"bus_event_type" => "my_event", "ok" => true})
19
+ Runner1.value.should == 1
20
+ Runner1.attributes.should == {"bus_event_type" => "my_event", "ok" => true}
21
+
22
+ end
23
+
24
+ it "should not crash if not there" do
25
+ lambda {
26
+ Dispatch.new("d").execute("fdkjh", "bus_event_type" => "fdkjh")
27
+ }.should_not raise_error
28
+ end
29
+
30
+ describe "Top Level" do
31
+ before(:each) do
32
+ QueueBus.dispatch("testit") do
33
+ subscribe "event1" do |attributes|
34
+ Runner2.run(attributes)
35
+ end
36
+
37
+ subscribe "event2" do
38
+ Runner2.run({})
39
+ end
40
+
41
+ high "event3" do
42
+ Runner2.run({})
43
+ end
44
+
45
+ low /^patt.+ern/ do
46
+ Runner.run({})
47
+ end
48
+ end
49
+ end
50
+
51
+ it "should register and run" do
52
+ Runner2.value.should == 0
53
+ QueueBus.dispatcher_execute("testit", "event2", "bus_event_type" => "event2")
54
+ Runner2.value.should == 1
55
+ QueueBus.dispatcher_execute("testit", "event1", "bus_event_type" => "event1")
56
+ Runner2.value.should == 2
57
+ QueueBus.dispatcher_execute("testit", "event1", "bus_event_type" => "event1")
58
+ Runner2.value.should == 3
59
+ end
60
+
61
+ it "should return the subscriptions" do
62
+ dispatcher = QueueBus.dispatcher_by_key("testit")
63
+ subs = dispatcher.subscriptions.all
64
+ tuples = subs.collect{ |sub| [sub.key, sub.queue_name]}
65
+ tuples.should =~ [ ["event1", "testit_default"],
66
+ ["event2", "testit_default"],
67
+ ["event3", "testit_high"],
68
+ [ "(?-mix:^patt.+ern)", "testit_low"]
69
+ ]
70
+ end
71
+
72
+ end
73
+ end
74
+
75
+ end
76
+
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe Driver do
5
+ before(:each) do
6
+ Application.new("app1").subscribe(test_list(test_sub("event1"), test_sub("event2"), test_sub("event3")))
7
+ Application.new("app2").subscribe(test_list(test_sub("event2","other"), test_sub("event4", "more")))
8
+ Application.new("app3").subscribe(test_list(test_sub("event[45]"), test_sub("event5"), test_sub("event6")))
9
+ Timecop.freeze
10
+ end
11
+ after(:each) do
12
+ Timecop.return
13
+ end
14
+
15
+ let(:bus_attrs) { {"bus_driven_at" => Time.now.to_i, "bus_rider_class_name"=>"::QueueBus::Rider", "bus_class_proxy" => "::QueueBus::Rider"} }
16
+
17
+ describe ".subscription_matches" do
18
+ it "return empty array when none" do
19
+ Driver.subscription_matches("bus_event_type" => "else").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
20
+ Driver.subscription_matches("bus_event_type" => "event").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should == []
21
+ end
22
+ it "should return a match" do
23
+ Driver.subscription_matches("bus_event_type" => "event1").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["app1", "event1", "default", "::QueueBus::Rider"]]
24
+ Driver.subscription_matches("bus_event_type" => "event6").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["app3", "event6", "default", "::QueueBus::Rider"]]
25
+ end
26
+ it "should match multiple apps" do
27
+ Driver.subscription_matches("bus_event_type" => "event2").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["app1", "event2", "default", "::QueueBus::Rider"], ["app2", "event2", "other", "::QueueBus::Rider"]]
28
+ end
29
+ it "should match multiple apps with patterns" do
30
+ Driver.subscription_matches("bus_event_type" => "event4").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["app3", "event[45]", "default", "::QueueBus::Rider"], ["app2", "event4", "more", "::QueueBus::Rider"]]
31
+ end
32
+ it "should match multiple events in same app" do
33
+ Driver.subscription_matches("bus_event_type" => "event5").collect{|s| [s.app_key, s.key, s.queue_name, s.class_name]}.should =~ [["app3", "event[45]", "default", "::QueueBus::Rider"], ["app3", "event5", "default", "::QueueBus::Rider"]]
34
+ end
35
+ end
36
+
37
+ describe ".perform" do
38
+ let(:attributes) { {"x" => "y", "bus_class_proxy" => "ResqueBus::Driver"} }
39
+
40
+ before(:each) do
41
+ QueueBus.redis { |redis| redis.smembers("queues") }.should == []
42
+ QueueBus.redis { |redis| redis.lpop("queue:app1_default") }.should be_nil
43
+ QueueBus.redis { |redis| redis.lpop("queue:app2_default") }.should be_nil
44
+ QueueBus.redis { |redis| redis.lpop("queue:app3_default") }.should be_nil
45
+ end
46
+
47
+ it "should do nothing when empty" do
48
+ Driver.perform(attributes.merge("bus_event_type" => "else"))
49
+ QueueBus.redis { |redis| redis.smembers("queues") }.should == []
50
+ end
51
+
52
+ it "should queue up the riders in redis" do
53
+ QueueBus.redis { |redis| redis.lpop("queue:app1_default") }.should be_nil
54
+ Driver.perform(attributes.merge("bus_event_type" => "event1"))
55
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["default"]
56
+
57
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:default") })
58
+ hash["class"].should == "QueueBus::Worker"
59
+ hash["args"].size.should == 1
60
+ JSON.parse(hash["args"].first).should == {"bus_rider_app_key"=>"app1", "x" => "y", "bus_event_type" => "event1", "bus_rider_sub_key"=>"event1", "bus_rider_queue" => "default"}.merge(bus_attrs)
61
+ end
62
+
63
+ it "should queue up to multiple" do
64
+ Driver.perform(attributes.merge("bus_event_type" => "event4"))
65
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["default", "more"]
66
+
67
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:more") })
68
+ hash["class"].should == "QueueBus::Worker"
69
+ hash["args"].size.should == 1
70
+ JSON.parse(hash["args"].first).should == {"bus_rider_app_key"=>"app2", "x" => "y", "bus_event_type" => "event4", "bus_rider_sub_key"=>"event4", "bus_rider_queue" => "more"}.merge(bus_attrs)
71
+
72
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:default") })
73
+ hash["class"].should == "QueueBus::Worker"
74
+ hash["args"].size.should == 1
75
+ JSON.parse(hash["args"].first).should == {"bus_rider_app_key"=>"app3", "x" => "y", "bus_event_type" => "event4", "bus_rider_sub_key"=>"event[45]", "bus_rider_queue" => "default"}.merge(bus_attrs)
76
+ end
77
+
78
+ it "should queue up to the same" do
79
+ Driver.perform(attributes.merge("bus_event_type" => "event5"))
80
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["default"]
81
+
82
+ QueueBus.redis { |redis| redis.llen("queue:default") }.should == 2
83
+
84
+ pop1 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:default") })
85
+ pop2 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:default") })
86
+
87
+ pargs1 = JSON.parse(pop1["args"].first)
88
+ pargs2 = JSON.parse(pop2["args"].first)
89
+ if pargs1["bus_rider_sub_key"] == "event5"
90
+ hash1 = pop1
91
+ hash2 = pop2
92
+ args1 = pargs1
93
+ args2 = pargs2
94
+ else
95
+ hash1 = pop2
96
+ hash2 = pop1
97
+ args1 = pargs2
98
+ args2 = pargs1
99
+ end
100
+
101
+ hash1["class"].should == "QueueBus::Worker"
102
+ args1.should == {"bus_rider_app_key"=>"app3", "x" => "y", "bus_event_type" => "event5", "bus_rider_sub_key"=>"event5", "bus_rider_queue" => "default"}.merge(bus_attrs)
103
+
104
+ hash2["class"].should == "QueueBus::Worker"
105
+ args2.should == {"bus_rider_app_key"=>"app3", "x" => "y", "bus_event_type" => "event5", "bus_rider_sub_key"=>"event[45]", "bus_rider_queue" => "default"}.merge(bus_attrs)
106
+ end
107
+ end
108
+ end
109
+ end