resque-bus 0.3.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +2 -3
  6. data/README.mdown +50 -64
  7. data/Rakefile +0 -1
  8. data/lib/resque-bus.rb +21 -283
  9. data/lib/resque_bus/adapter.rb +66 -0
  10. data/lib/resque_bus/compatibility/deprecated.rb +38 -0
  11. data/lib/resque_bus/compatibility/driver.rb +10 -0
  12. data/lib/resque_bus/compatibility/heartbeat.rb +10 -0
  13. data/lib/resque_bus/compatibility/publisher.rb +13 -0
  14. data/lib/resque_bus/compatibility/rider.rb +32 -0
  15. data/lib/resque_bus/compatibility/subscriber.rb +8 -0
  16. data/lib/resque_bus/compatibility/task_manager.rb +8 -0
  17. data/lib/resque_bus/server.rb +6 -5
  18. data/lib/resque_bus/server/views/bus.erb +2 -2
  19. data/lib/resque_bus/tasks.rb +46 -46
  20. data/lib/resque_bus/version.rb +2 -4
  21. data/resque-bus.gemspec +5 -12
  22. data/spec/adapter/compatibility_spec.rb +97 -0
  23. data/spec/adapter/integration_spec.rb +111 -0
  24. data/spec/adapter/publish_at_spec.rb +50 -0
  25. data/spec/adapter/retry_spec.rb +47 -0
  26. data/spec/adapter/support.rb +23 -0
  27. data/spec/adapter_spec.rb +14 -0
  28. data/spec/application_spec.rb +62 -62
  29. data/spec/config_spec.rb +83 -0
  30. data/spec/dispatch_spec.rb +6 -6
  31. data/spec/driver_spec.rb +62 -53
  32. data/spec/heartbeat_spec.rb +4 -4
  33. data/spec/integration_spec.rb +2 -2
  34. data/spec/matcher_spec.rb +29 -29
  35. data/spec/publish_spec.rb +62 -38
  36. data/spec/publisher_spec.rb +7 -0
  37. data/spec/rider_spec.rb +14 -66
  38. data/spec/spec_helper.rb +25 -28
  39. data/spec/subscriber_spec.rb +194 -176
  40. data/spec/subscription_list_spec.rb +1 -1
  41. data/spec/subscription_spec.rb +1 -1
  42. data/spec/worker_spec.rb +32 -0
  43. metadata +75 -91
  44. data/lib/resque_bus/application.rb +0 -115
  45. data/lib/resque_bus/dispatch.rb +0 -61
  46. data/lib/resque_bus/driver.rb +0 -30
  47. data/lib/resque_bus/heartbeat.rb +0 -106
  48. data/lib/resque_bus/local.rb +0 -34
  49. data/lib/resque_bus/matcher.rb +0 -81
  50. data/lib/resque_bus/publisher.rb +0 -12
  51. data/lib/resque_bus/rider.rb +0 -54
  52. data/lib/resque_bus/subscriber.rb +0 -63
  53. data/lib/resque_bus/subscription.rb +0 -55
  54. data/lib/resque_bus/subscription_list.rb +0 -53
  55. data/lib/resque_bus/task_manager.rb +0 -52
  56. data/lib/resque_bus/util.rb +0 -42
  57. data/lib/tasks/resquebus.rake +0 -2
  58. data/spec/publish_at_spec.rb +0 -74
  59. data/spec/redis_spec.rb +0 -13
data/spec/publish_spec.rb CHANGED
@@ -1,72 +1,96 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe "Publishing an event" do
4
-
4
+
5
5
  before(:each) do
6
6
  Timecop.freeze
7
- ResqueBus.stub(:generate_uuid).and_return("idfhlkj")
7
+ QueueBus.stub(:generate_uuid).and_return("idfhlkj")
8
8
  end
9
9
  after(:each) do
10
10
  Timecop.return
11
11
  end
12
- let(:bus_attrs) { {"bus_published_at" => Time.now.to_i,
12
+ let(:bus_attrs) { {"bus_class_proxy"=>"QueueBus::Driver",
13
+ "bus_published_at" => Time.now.to_i,
13
14
  "bus_id"=>"#{Time.now.to_i}-idfhlkj",
14
15
  "bus_app_hostname" => `hostname 2>&1`.strip.sub(/.local/,'')} }
15
-
16
+
16
17
  it "should add it to Redis" do
17
18
  hash = {:one => 1, "two" => "here", "id" => 12 }
18
19
  event_name = "event_name"
19
-
20
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
20
+
21
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
21
22
  val.should == nil
22
-
23
- ResqueBus.publish(event_name, hash)
24
-
25
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
23
+
24
+ QueueBus.publish(event_name, hash)
25
+
26
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
26
27
  hash = JSON.parse(val)
27
- hash["class"].should == "ResqueBus::Driver"
28
- hash["args"].should == [ {"bus_event_type" => event_name, "two"=>"here", "one"=>1, "id" => 12}.merge(bus_attrs) ]
29
-
28
+ hash["class"].should == "QueueBus::Worker"
29
+ hash["args"].size.should == 1
30
+ JSON.parse(hash["args"].first).should == {"bus_event_type" => event_name, "two"=>"here", "one"=>1, "id" => 12}.merge(bus_attrs)
31
+
30
32
  end
31
-
33
+
32
34
  it "should use the id if given" do
33
35
  hash = {:one => 1, "two" => "here", "bus_id" => "app-given" }
34
36
  event_name = "event_name"
35
-
36
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
37
+
38
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
37
39
  val.should == nil
38
-
39
- ResqueBus.publish(event_name, hash)
40
-
41
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
40
+
41
+ QueueBus.publish(event_name, hash)
42
+
43
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
42
44
  hash = JSON.parse(val)
43
- hash["class"].should == "ResqueBus::Driver"
44
- hash["args"].should == [ {"bus_event_type" => event_name, "two"=>"here", "one"=>1}.merge(bus_attrs).merge("bus_id" => 'app-given') ]
45
+ hash["class"].should == "QueueBus::Worker"
46
+ hash["args"].size.should == 1
47
+ JSON.parse(hash["args"].first).should == {"bus_event_type" => event_name, "two"=>"here", "one"=>1}.merge(bus_attrs).merge("bus_id" => 'app-given')
48
+ end
49
+
50
+ it "should add metadata via callback" do
51
+ myval = 0
52
+ QueueBus.before_publish = lambda { |att|
53
+ att["mine"] = 4
54
+ myval += 1
55
+ }
56
+
57
+ hash = {:one => 1, "two" => "here", "bus_id" => "app-given" }
58
+ event_name = "event_name"
59
+
60
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
61
+ val.should == nil
62
+
63
+ QueueBus.publish(event_name, hash)
64
+
65
+
66
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
67
+ hash = JSON.parse(val)
68
+ att = JSON.parse(hash["args"].first)
69
+ att["mine"].should == 4
70
+ myval.should == 1
45
71
  end
46
-
47
72
 
48
-
49
73
  it "should set the timezone and locale if available" do
50
74
  defined?(I18n).should be_nil
51
- Time.respond_to?(:zone).should be_false
52
-
75
+ Time.respond_to?(:zone).should eq(false)
76
+
53
77
  stub_const("I18n", Class.new)
54
- I18n.should_receive(:locale).and_return("jp")
55
-
56
- Time.should_receive(:zone).and_return(double('zone', :name => "EST"))
57
-
78
+ I18n.stub(:locale).and_return("jp")
79
+
80
+ Time.stub(:zone).and_return(double('zone', :name => "EST"))
81
+
58
82
  hash = {:one => 1, "two" => "here", "bus_id" => "app-given" }
59
83
  event_name = "event_name"
60
-
61
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
84
+
85
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
62
86
  val.should == nil
63
-
64
- ResqueBus.publish(event_name, hash)
65
-
66
- val = ResqueBus.redis.lpop("queue:resquebus_incoming")
87
+
88
+ QueueBus.publish(event_name, hash)
89
+
90
+ val = QueueBus.redis { |redis| redis.lpop("queue:bus_incoming") }
67
91
  hash = JSON.parse(val)
68
- hash["class"].should == "ResqueBus::Driver"
69
- att = hash["args"].first
92
+ hash["class"].should == "QueueBus::Worker"
93
+ att = JSON.parse(hash["args"].first)
70
94
  att["bus_locale"].should == "jp"
71
95
  att["bus_timezone"].should == "EST"
72
96
  end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module QueueBus
4
+ describe Publisher do
5
+ it "should call publish as expected"
6
+ end
7
+ end
data/spec/rider_spec.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
- module ResqueBus
3
+ module QueueBus
4
4
  describe Rider do
5
5
  it "should call execute" do
6
- ResqueBus.should_receive(:dispatcher_execute)
6
+ QueueBus.should_receive(:dispatcher_execute)
7
7
  Rider.perform("bus_rider_app_key" => "app", "bus_rider_sub_key" => "sub", "ok" => true, "bus_event_type" => "event_name")
8
8
  end
9
-
9
+
10
10
  it "should change the value" do
11
- ResqueBus.dispatch("r1") do
11
+ QueueBus.dispatch("r1") do
12
12
  subscribe "event_name" do |attributes|
13
13
  Runner1.run(attributes)
14
14
  end
@@ -18,74 +18,22 @@ module ResqueBus
18
18
  Rider.perform("bus_rider_app_key" => "other", "bus_rider_sub_key" => "event_name", "ok" => true, "bus_event_type" => "event_name")
19
19
  Runner1.value.should == 1
20
20
  end
21
-
21
+
22
22
  it "should set the timezone and locale if present" do
23
+ QueueBus.dispatch("r1") do
24
+ subscribe "event_name" do |attributes|
25
+ Runner1.run(attributes)
26
+ end
27
+ end
28
+
23
29
  defined?(I18n).should be_nil
24
- Time.respond_to?(:zone).should be_false
30
+ Time.respond_to?(:zone).should eq(false)
25
31
 
26
32
  stub_const("I18n", Class.new)
27
33
  I18n.should_receive(:locale=).with("en")
28
34
  Time.should_receive(:zone=).with("PST")
29
-
35
+
30
36
  Rider.perform("bus_locale" => "en", "bus_timezone" => "PST", "bus_rider_app_key" => "r1", "bus_rider_sub_key" => "event_name", "ok" => true, "bus_event_type" => "event_name")
31
37
  end
32
-
33
- context "Integration Test" do
34
- before(:each) do
35
- Resque.redis = "example.com/bad"
36
- ResqueBus.original_redis = Resque.redis
37
- ResqueBus.redis = "localhost:6379"
38
-
39
-
40
- ResqueBus.enqueue_to("testing", "::ResqueBus::Rider", { "bus_rider_app_key" => "r2", "bus_rider_sub_key" => "event_name", "bus_event_type" => "event_name", "ok" => true, "bus_rider_queue" => "testing" })
41
-
42
- # like the job does
43
- Resque.redis = ResqueBus.redis
44
-
45
- @worker = Resque::Worker.new(:testing)
46
- @worker.register_worker
47
- end
48
-
49
- it "should use the app's redis within the rider" do
50
- host = Resque.redis.instance_variable_get("@redis").instance_variable_get("@client").host
51
- host.should == "localhost"
52
-
53
- ResqueBus.dispatch("r2") do
54
- subscribe "event_name" do |attributes|
55
- host = Resque.redis.instance_variable_get("@redis").instance_variable_get("@client").host
56
- if host == "example.com"
57
- Runner1.run(attributes)
58
- end
59
- end
60
- end
61
-
62
- host = Resque.redis.instance_variable_get("@redis").instance_variable_get("@client").host
63
- host.should == "localhost"
64
-
65
-
66
- Runner1.value.should == 0
67
- perform_next_job @worker
68
- Runner1.value.should == 1
69
- end
70
-
71
- it "should put it in the failed jobs" do
72
-
73
- ResqueBus.dispatch("r2") do
74
- subscribe "event_name" do |attributes|
75
- raise "boo!"
76
- end
77
- end
78
-
79
- perform_next_job @worker
80
- Resque.info[:processed].should == 1
81
- Resque.info[:failed].should == 1
82
- Resque.info[:pending].should == 1 # requeued
83
-
84
- perform_next_job @worker
85
- Resque.info[:processed].should == 2
86
- Resque.info[:failed].should == 2
87
- Resque.info[:pending].should == 0
88
- end
89
- end
90
38
  end
91
- end
39
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,73 +1,70 @@
1
1
  require 'timecop'
2
- require 'resque-bus'
3
- require 'resque/scheduler'
2
+ require 'queue-bus'
3
+ require 'adapter/support'
4
4
 
5
- module ResqueBus
5
+ reset_test_adapter
6
+
7
+ module QueueBus
6
8
  class Runner
7
9
  def self.value
8
10
  @value ||= 0
9
11
  end
10
-
12
+
11
13
  def self.attributes
12
14
  @attributes
13
15
  end
14
-
16
+
15
17
  def self.run(attrs)
16
18
  @value ||= 0
17
19
  @value += 1
18
20
  @attributes = attrs
19
21
  end
20
-
22
+
21
23
  def self.reset
22
24
  @value = nil
23
25
  @attributes = nil
24
26
  end
25
27
  end
26
-
28
+
27
29
  class Runner1 < Runner
28
30
  end
29
-
31
+
30
32
  class Runner2 < Runner
31
33
  end
32
34
  end
33
35
 
34
- def perform_next_job(worker, &block)
35
- return unless job = @worker.reserve
36
- @worker.perform(job, &block)
37
- @worker.done_working
38
- end
39
-
40
36
  def test_sub(event_name, queue="default")
41
37
  matcher = {"bus_event_type" => event_name}
42
- ResqueBus::Subscription.new(queue, event_name, "::ResqueBus::Rider", matcher, nil)
38
+ QueueBus::Subscription.new(queue, event_name, "::QueueBus::Rider", matcher, nil)
43
39
  end
44
40
 
45
41
  def test_list(*args)
46
- out = ResqueBus::SubscriptionList.new
42
+ out = QueueBus::SubscriptionList.new
47
43
  args.each do |sub|
48
44
  out.add(sub)
49
45
  end
50
46
  out
51
47
  end
52
48
 
53
-
54
- Resque::Scheduler.mute = true
55
-
56
49
  RSpec.configure do |config|
57
- config.mock_framework = :rspec
58
-
50
+ config.mock_with :rspec do |c|
51
+ c.syntax = :should
52
+ end
53
+ config.expect_with :rspec do |c|
54
+ c.syntax = :should
55
+ end
56
+
59
57
  config.before(:each) do
60
- ResqueBus.send(:reset)
58
+ reset_test_adapter
59
+ ResqueBus.show_deprecations = true
61
60
  end
62
61
  config.after(:each) do
63
62
  begin
64
- ResqueBus.redis.flushall
63
+ QueueBus.redis { |redis| redis.flushall }
65
64
  rescue
66
65
  end
67
- ResqueBus.send(:reset)
68
- ResqueBus::Runner1.reset
69
- ResqueBus::Runner2.reset
66
+ QueueBus.send(:reset)
67
+ QueueBus::Runner1.reset
68
+ QueueBus::Runner2.reset
70
69
  end
71
70
  end
72
-
73
- ResqueBus.redis.namespace = "resquebus_test"
@@ -1,78 +1,82 @@
1
1
  require 'spec_helper'
2
2
 
3
- class SubscriberTest1
4
- include ResqueBus::Subscriber
5
- @queue = "myqueue"
6
-
7
- application :my_thing
8
- subscribe :thing_filter, :x => "y"
9
- subscribe :event_sub
10
-
11
- def event_sub(attributes)
12
- ResqueBus::Runner1.run(attributes)
13
- end
14
-
15
- def thing_filter(attributes)
16
- ResqueBus::Runner2.run(attributes)
17
- end
18
- end
19
-
20
- class SubscriberTest2
21
- include ResqueBus::Subscriber
22
- application :test2
23
- subscribe :test2, "value" => :present
24
- transform :make_an_int
25
-
26
- def self.make_an_int(attributes)
27
- attributes["value"].to_s.length
28
- end
29
-
30
- def test2(int)
31
- ResqueBus::Runner1.run("transformed"=>int)
32
- end
33
- end
34
-
35
- module SubModule
36
- class SubscriberTest3
37
- include ResqueBus::Subscriber
38
-
39
- subscribe_queue :sub_queue1, :test3, :bus_event_type => "the_event"
40
- subscribe_queue :sub_queue2, :the_event
41
- subscribe :other, :bus_event_type => "other_event"
42
-
43
- def test3(attributes)
44
- ResqueBus::Runner1.run(attributes)
45
- end
46
-
47
- def the_event(attributes)
48
- ResqueBus::Runner2.run(attributes)
49
- end
50
- end
51
-
52
- class SubscriberTest4
53
- include ResqueBus::Subscriber
54
-
55
- subscribe_queue :sub_queue1, :test4
56
- end
57
- end
58
-
59
- module ResqueBus
60
- describe Subscriber do
3
+ describe QueueBus::Subscriber do
61
4
  let(:attributes) { {"x" => "y"} }
62
5
  let(:bus_attrs) { {"bus_driven_at" => Time.now.to_i} }
63
-
6
+
64
7
  before(:each) do
65
- ResqueBus::TaskManager.new(false).subscribe!
8
+ class SubscriberTest1
9
+ include QueueBus::Subscriber
10
+ @queue = "myqueue"
11
+
12
+ application :my_thing
13
+ subscribe :thing_filter, :x => "y"
14
+ subscribe :event_sub
15
+
16
+ def event_sub(attributes)
17
+ QueueBus::Runner1.run(attributes)
18
+ end
19
+
20
+ def thing_filter(attributes)
21
+ QueueBus::Runner2.run(attributes)
22
+ end
23
+ end
24
+
25
+ class SubscriberTest2
26
+ include QueueBus::Subscriber
27
+ application :test2
28
+ subscribe :test2, "value" => :present
29
+ transform :make_an_int
30
+
31
+ def self.make_an_int(attributes)
32
+ attributes["value"].to_s.length
33
+ end
34
+
35
+ def test2(int)
36
+ QueueBus::Runner1.run("transformed"=>int)
37
+ end
38
+ end
39
+
40
+ module SubModule
41
+ class SubscriberTest3
42
+ include QueueBus::Subscriber
43
+
44
+ subscribe_queue :sub_queue1, :test3, :bus_event_type => "the_event"
45
+ subscribe_queue :sub_queue2, :the_event
46
+ subscribe :other, :bus_event_type => "other_event"
47
+
48
+ def test3(attributes)
49
+ QueueBus::Runner1.run(attributes)
50
+ end
51
+
52
+ def the_event(attributes)
53
+ QueueBus::Runner2.run(attributes)
54
+ end
55
+ end
56
+
57
+ class SubscriberTest4
58
+ include QueueBus::Subscriber
59
+
60
+ subscribe_queue :sub_queue1, :test4
61
+ end
62
+ end
63
+
64
+ Timecop.freeze
65
+ QueueBus::TaskManager.new(false).subscribe!
66
66
  end
67
-
67
+
68
+ after(:each) do
69
+ Timecop.return
70
+ end
71
+
68
72
  it "should have the application" do
69
73
  SubscriberTest1.app_key.should == "my_thing"
70
74
  SubModule::SubscriberTest3.app_key.should == "sub_module"
71
75
  SubModule::SubscriberTest4.app_key.should == "sub_module"
72
76
  end
73
-
77
+
74
78
  it "should be able to transform the attributes" do
75
- dispatcher = ResqueBus.dispatcher_by_key("test2")
79
+ dispatcher = QueueBus.dispatcher_by_key("test2")
76
80
  all = dispatcher.subscriptions.all
77
81
  all.size.should == 1
78
82
 
@@ -82,154 +86,169 @@ module ResqueBus
82
86
  sub.key.should == "SubscriberTest2.test2"
83
87
  sub.matcher.filters.should == {"value"=>"bus_special_value_present"}
84
88
 
85
- Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"nice"))
86
-
87
- hash = JSON.parse(ResqueBus.redis.lpop("queue:test2_default"))
88
- hash["class"].should == "SubscriberTest2"
89
- hash["args"].should == [ {"bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
90
- "bus_event_type" => "something2", "value"=>"nice", "x"=>"y"}.merge(bus_attrs) ]
91
-
92
- Runner1.value.should == 0
93
- Runner2.value.should == 0
94
- Util.constantize(hash["class"]).perform(*hash["args"])
95
- Runner1.value.should == 1
96
- Runner2.value.should == 0
97
-
98
- Runner1.attributes.should == {"transformed" => 4}
99
-
100
-
101
- Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"12"))
102
-
103
- hash = JSON.parse(ResqueBus.redis.lpop("queue:test2_default"))
104
- hash["class"].should == "SubscriberTest2"
105
- hash["args"].should == [ {"bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
106
- "bus_event_type" => "something2", "value"=>"12", "x"=>"y"}.merge(bus_attrs) ]
107
-
108
- Runner1.value.should == 1
109
- Runner2.value.should == 0
110
- Util.constantize(hash["class"]).perform(*hash["args"])
111
- Runner1.value.should == 2
112
- Runner2.value.should == 0
113
-
114
- Runner1.attributes.should == {"transformed" => 2}
89
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"nice"))
90
+
91
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:test2_default") })
92
+ hash["class"].should == "QueueBus::Worker"
93
+ hash["args"].size.should == 1
94
+ JSON.parse(hash["args"].first).should eq({"bus_class_proxy" => "SubscriberTest2", "bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
95
+ "bus_event_type" => "something2", "value"=>"nice", "x"=>"y"}.merge(bus_attrs))
96
+
97
+ QueueBus::Runner1.value.should == 0
98
+ QueueBus::Runner2.value.should == 0
99
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
100
+ QueueBus::Runner1.value.should == 1
101
+ QueueBus::Runner2.value.should == 0
102
+
103
+ QueueBus::Runner1.attributes.should == {"transformed" => 4}
104
+
105
+
106
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "something2", "value"=>"12"))
107
+
108
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:test2_default") })
109
+ hash["class"].should == "QueueBus::Worker"
110
+ hash["args"].size.should == 1
111
+ JSON.parse(hash["args"].first).should == {"bus_class_proxy" => "SubscriberTest2", "bus_rider_app_key"=>"test2", "bus_rider_sub_key"=>"SubscriberTest2.test2", "bus_rider_queue" => "test2_default", "bus_rider_class_name"=>"SubscriberTest2",
112
+ "bus_event_type" => "something2", "value"=>"12", "x"=>"y"}.merge(bus_attrs)
113
+
114
+ QueueBus::Runner1.value.should == 1
115
+ QueueBus::Runner2.value.should == 0
116
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
117
+ QueueBus::Runner1.value.should == 2
118
+ QueueBus::Runner2.value.should == 0
119
+
120
+ QueueBus::Runner1.attributes.should == {"transformed" => 2}
115
121
  end
116
-
117
-
122
+
123
+
118
124
  it "should put in a different queue" do
119
- dispatcher = ResqueBus.dispatcher_by_key("sub_module")
125
+ dispatcher = QueueBus.dispatcher_by_key("sub_module")
120
126
  all = dispatcher.subscriptions.all
121
127
  all.size.should == 4
122
-
128
+
123
129
  sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.test3"}.first
124
130
  sub.queue_name.should == "sub_queue1"
125
131
  sub.class_name.should == "SubModule::SubscriberTest3"
126
132
  sub.key.should == "SubModule::SubscriberTest3.test3"
127
133
  sub.matcher.filters.should == {"bus_event_type"=>"the_event"}
128
-
134
+
129
135
  sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.the_event"}.first
130
136
  sub.queue_name.should == "sub_queue2"
131
137
  sub.class_name.should == "SubModule::SubscriberTest3"
132
138
  sub.key.should == "SubModule::SubscriberTest3.the_event"
133
139
  sub.matcher.filters.should == {"bus_event_type"=>"the_event"}
134
-
140
+
135
141
  sub = all.select{ |s| s.key == "SubModule::SubscriberTest3.other"}.first
136
142
  sub.queue_name.should == "sub_module_default"
137
143
  sub.class_name.should == "SubModule::SubscriberTest3"
138
144
  sub.key.should == "SubModule::SubscriberTest3.other"
139
145
  sub.matcher.filters.should == {"bus_event_type"=>"other_event"}
140
-
146
+
141
147
  sub = all.select{ |s| s.key == "SubModule::SubscriberTest4.test4"}.first
142
148
  sub.queue_name.should == "sub_queue1"
143
149
  sub.class_name.should == "SubModule::SubscriberTest4"
144
150
  sub.key.should == "SubModule::SubscriberTest4.test4"
145
151
  sub.matcher.filters.should == {"bus_event_type"=>"test4"}
146
-
147
- Driver.perform(attributes.merge("bus_event_type" => "the_event"))
148
-
149
- hash = JSON.parse(ResqueBus.redis.lpop("queue:sub_queue1"))
150
- hash["class"].should == "SubModule::SubscriberTest3"
151
- hash["args"].should == [ {"bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.test3", "bus_rider_queue" => "sub_queue1", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
152
- "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs) ]
153
-
154
- Runner1.value.should == 0
155
- Runner2.value.should == 0
156
- Util.constantize(hash["class"]).perform(*hash["args"])
157
- Runner1.value.should == 1
158
- Runner2.value.should == 0
159
-
160
- hash = JSON.parse(ResqueBus.redis.lpop("queue:sub_queue2"))
161
- hash["class"].should == "SubModule::SubscriberTest3"
162
- hash["args"].should == [ {"bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.the_event", "bus_rider_queue" => "sub_queue2", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
163
- "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs) ]
164
-
165
- Runner1.value.should == 1
166
- Runner2.value.should == 0
167
- Util.constantize(hash["class"]).perform(*hash["args"])
168
- Runner1.value.should == 1
169
- Runner2.value.should == 1
152
+
153
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "the_event"))
154
+
155
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:sub_queue1") })
156
+ hash["class"].should == "QueueBus::Worker"
157
+ hash["args"].size.should == 1
158
+ JSON.parse(hash["args"].first).should == {"bus_class_proxy" => "SubModule::SubscriberTest3", "bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.test3", "bus_rider_queue" => "sub_queue1", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
159
+ "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs)
160
+
161
+ QueueBus::Runner1.value.should == 0
162
+ QueueBus::Runner2.value.should == 0
163
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
164
+ QueueBus::Runner1.value.should == 1
165
+ QueueBus::Runner2.value.should == 0
166
+
167
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:sub_queue2") })
168
+ hash["class"].should == "QueueBus::Worker"
169
+ hash["args"].size.should == 1
170
+ JSON.parse(hash["args"].first).should == {"bus_class_proxy" => "SubModule::SubscriberTest3", "bus_rider_app_key"=>"sub_module", "bus_rider_sub_key"=>"SubModule::SubscriberTest3.the_event", "bus_rider_queue" => "sub_queue2", "bus_rider_class_name"=>"SubModule::SubscriberTest3",
171
+ "bus_event_type" => "the_event", "x" => "y"}.merge(bus_attrs)
172
+
173
+ QueueBus::Runner1.value.should == 1
174
+ QueueBus::Runner2.value.should == 0
175
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
176
+ QueueBus::Runner1.value.should == 1
177
+ QueueBus::Runner2.value.should == 1
170
178
  end
171
-
179
+
172
180
  it "should subscribe to default and attributes" do
173
- dispatcher = ResqueBus.dispatcher_by_key("my_thing")
181
+ dispatcher = QueueBus.dispatcher_by_key("my_thing")
174
182
  all = dispatcher.subscriptions.all
175
-
183
+
176
184
  sub = all.select{ |s| s.key == "SubscriberTest1.event_sub"}.first
177
185
  sub.queue_name.should == "myqueue"
178
186
  sub.class_name.should == "SubscriberTest1"
179
187
  sub.key.should == "SubscriberTest1.event_sub"
180
188
  sub.matcher.filters.should == {"bus_event_type"=>"event_sub"}
181
-
189
+
182
190
  sub = all.select{ |s| s.key == "SubscriberTest1.thing_filter"}.first
183
191
  sub.queue_name.should == "myqueue"
184
192
  sub.class_name.should == "SubscriberTest1"
185
193
  sub.key.should == "SubscriberTest1.thing_filter"
186
194
  sub.matcher.filters.should == {"x"=>"y"}
187
-
188
- Driver.perform(attributes.merge("bus_event_type" => "event_sub"))
189
- ResqueBus.redis.smembers("queues").should =~ ["myqueue"]
190
-
191
- hash = JSON.parse(ResqueBus.redis.lpop("queue:myqueue"))
192
- hash["class"].should == "SubscriberTest1"
193
- hash["args"].should == [ {"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.event_sub", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
194
- "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs) ]
195
-
196
- Runner1.value.should == 0
197
- Runner2.value.should == 0
198
- Util.constantize(hash["class"]).perform(*hash["args"])
199
- Runner1.value.should == 1
200
- Runner2.value.should == 0
201
-
202
- hash = JSON.parse(ResqueBus.redis.lpop("queue:myqueue"))
203
- hash["class"].should == "SubscriberTest1"
204
- hash["args"].should == [ {"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
205
- "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs) ]
206
-
207
- Runner1.value.should == 1
208
- Runner2.value.should == 0
209
- Util.constantize(hash["class"]).perform(*hash["args"])
210
- Runner1.value.should == 1
211
- Runner2.value.should == 1
212
-
213
- Driver.perform(attributes.merge("bus_event_type" => "event_sub_other"))
214
- ResqueBus.redis.smembers("queues").should =~ ["myqueue"]
215
-
216
- hash = JSON.parse(ResqueBus.redis.lpop("queue:myqueue"))
217
- hash["class"].should == "SubscriberTest1"
218
- hash["args"].should == [ {"bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
219
- "bus_event_type" => "event_sub_other", "x" => "y"}.merge(bus_attrs) ]
220
-
221
- Runner1.value.should == 1
222
- Runner2.value.should == 1
223
- Util.constantize(hash["class"]).perform(*hash["args"])
224
- Runner1.value.should == 1
225
- Runner2.value.should == 2
226
-
227
- Driver.perform({"x"=>"z"}.merge("bus_event_type" => "event_sub_other"))
228
- ResqueBus.redis.smembers("queues").should =~ ["myqueue"]
229
-
230
- ResqueBus.redis.lpop("queue:myqueue").should be_nil
195
+
196
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "event_sub"))
197
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
198
+
199
+ pop1 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
200
+ pop2 = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
201
+
202
+ if JSON.parse(pop1["args"].first)["bus_rider_sub_key"] == "SubscriberTest1.thing_filter"
203
+ hash1 = pop1
204
+ hash2 = pop2
205
+ else
206
+ hash1 = pop2
207
+ hash2 = pop1
208
+ end
209
+
210
+ hash1["class"].should == "QueueBus::Worker"
211
+ JSON.parse(hash1["args"].first).should eq({"bus_class_proxy" => "SubscriberTest1", "bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
212
+ "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs))
213
+
214
+ QueueBus::Runner1.value.should == 0
215
+ QueueBus::Runner2.value.should == 0
216
+ QueueBus::Util.constantize(hash1["class"]).perform(*hash1["args"])
217
+ QueueBus::Runner1.value.should == 0
218
+ QueueBus::Runner2.value.should == 1
219
+
220
+ hash2["class"].should == "QueueBus::Worker"
221
+ hash2["args"].size.should == 1
222
+ JSON.parse(hash2["args"].first).should == {"bus_class_proxy" => "SubscriberTest1", "bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.event_sub", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
223
+ "bus_event_type" => "event_sub", "x" => "y"}.merge(bus_attrs)
224
+
225
+ QueueBus::Runner1.value.should == 0
226
+ QueueBus::Runner2.value.should == 1
227
+ QueueBus::Util.constantize(hash2["class"]).perform(*hash2["args"])
228
+ QueueBus::Runner1.value.should == 1
229
+ QueueBus::Runner2.value.should == 1
230
+
231
+ QueueBus::Driver.perform(attributes.merge("bus_event_type" => "event_sub_other"))
232
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
233
+
234
+ hash = JSON.parse(QueueBus.redis { |redis| redis.lpop("queue:myqueue") })
235
+ hash["class"].should == "QueueBus::Worker"
236
+ hash["args"].size.should == 1
237
+ JSON.parse(hash["args"].first).should == {"bus_class_proxy" => "SubscriberTest1", "bus_rider_app_key"=>"my_thing", "bus_rider_sub_key"=>"SubscriberTest1.thing_filter", "bus_rider_queue" => "myqueue", "bus_rider_class_name"=>"SubscriberTest1",
238
+ "bus_event_type" => "event_sub_other", "x" => "y"}.merge(bus_attrs)
239
+
240
+ QueueBus::Runner1.value.should == 1
241
+ QueueBus::Runner2.value.should == 1
242
+ QueueBus::Util.constantize(hash["class"]).perform(*hash["args"])
243
+ QueueBus::Runner1.value.should == 1
244
+ QueueBus::Runner2.value.should == 2
245
+
246
+ QueueBus::Driver.perform({"x"=>"z"}.merge("bus_event_type" => "event_sub_other"))
247
+ QueueBus.redis { |redis| redis.smembers("queues") }.should =~ ["myqueue"]
248
+
249
+ QueueBus.redis { |redis| redis.lpop("queue:myqueue") }.should be_nil
231
250
  end
232
-
251
+
233
252
  describe ".perform" do
234
253
  let(:attributes) { {"bus_rider_sub_key"=>"SubscriberTest1.event_sub", "bus_locale" => "en", "bus_timezone" => "PST"} }
235
254
  it "should call the method based on key" do
@@ -238,15 +257,14 @@ module ResqueBus
238
257
  end
239
258
  it "should set the timezone and locale if present" do
240
259
  defined?(I18n).should be_nil
241
- Time.respond_to?(:zone).should be_false
260
+ Time.respond_to?(:zone).should eq(false)
242
261
 
243
262
  stub_const("I18n", Class.new)
244
263
  I18n.should_receive(:locale=).with("en")
245
264
  Time.should_receive(:zone=).with("PST")
246
-
265
+
247
266
  SubscriberTest1.any_instance.should_receive(:event_sub)
248
267
  SubscriberTest1.perform(attributes)
249
268
  end
250
269
  end
251
270
  end
252
- end