test/unit/queue_tests.rb in qs-0.3.0 vs test/unit/queue_tests.rb in qs-0.4.0
- old
+ new
@@ -6,26 +6,25 @@
class Qs::Queue
class UnitTests < Assert::Context
desc "Qs::Queue"
setup do
- @queue = Qs::Queue.new do
- name Factory.string
- end
+ @queue = Qs::Queue.new{ name Factory.string }
end
subject{ @queue }
- should have_readers :routes, :enqueued_jobs
- should have_imeths :name, :redis_key, :job_handler_ns, :job
+ should have_readers :routes, :event_route_names, :enqueued_jobs
+ should have_imeths :name, :redis_key
+ should have_imeths :job_handler_ns, :job
+ should have_imeths :event_handler_ns, :event
should have_imeths :enqueue, :add
- should have_imeths :reset!
+ should have_imeths :sync_subscriptions, :clear_subscriptions
+ should have_imeths :published_events, :reset!
- should "default its routes to an empty array" do
+ should "default its routes, event route names and enqueued jobs" do
assert_equal [], subject.routes
- end
-
- should "default its enqueued jobs to an empty array" do
+ assert_equal [], subject.event_route_names
assert_equal [], subject.enqueued_jobs
end
should "allow setting its name" do
name = Factory.string
@@ -47,39 +46,128 @@
namespace = Factory.string
subject.job_handler_ns namespace
assert_equal namespace, subject.job_handler_ns
end
- should "allow adding routes using `job`" do
- job_name = Factory.string
+ should "not have an event handler ns by default" do
+ assert_nil subject.event_handler_ns
+ end
+
+ should "allow setting its event handler ns" do
+ namespace = Factory.string
+ subject.event_handler_ns namespace
+ assert_equal namespace, subject.event_handler_ns
+ end
+
+ should "allow adding job routes using `job`" do
+ job_name = Factory.string
handler_name = Factory.string
subject.job job_name, handler_name
route = subject.routes.last
assert_instance_of Qs::Route, route
- assert_equal job_name, route.name
+ exp = Qs::Message::RouteId.new(Qs::Job::PAYLOAD_TYPE, job_name)
+ assert_equal exp, route.id
assert_equal handler_name, route.handler_class_name
end
- should "use its job handler ns when adding routes" do
+ should "use its job handler ns when adding job routes" do
namespace = Factory.string
subject.job_handler_ns namespace
- job_name = Factory.string
+ job_name = Factory.string
handler_name = Factory.string
subject.job job_name, handler_name
route = subject.routes.last
- expected = "#{namespace}::#{handler_name}"
- assert_equal expected, route.handler_class_name
+ exp = "#{namespace}::#{handler_name}"
+ assert_equal exp, route.handler_class_name
end
+ should "not use its job handler ns with a top-level handler name" do
+ namespace = Factory.string
+ subject.job_handler_ns namespace
+
+ job_name = Factory.string
+ handler_name = "::#{Factory.string}"
+ subject.job job_name, handler_name
+
+ route = subject.routes.last
+ assert_equal handler_name, route.handler_class_name
+ end
+
+ should "allow adding event routes using `event`" do
+ event_channel = Factory.string
+ event_name = Factory.string
+ handler_name = Factory.string
+ subject.event event_channel, event_name, handler_name
+
+ route = subject.routes.last
+ assert_instance_of Qs::Route, route
+ route_name = Qs::Event::RouteName.new(event_channel, event_name)
+ exp = Qs::Message::RouteId.new(Qs::Event::PAYLOAD_TYPE, route_name)
+ assert_equal exp, route.id
+ assert_equal handler_name, route.handler_class_name
+ end
+
+ should "use its event handler ns when adding event routes" do
+ namespace = Factory.string
+ subject.event_handler_ns namespace
+
+ event_channel = Factory.string
+ event_name = Factory.string
+ handler_name = Factory.string
+ subject.event event_channel, event_name, handler_name
+
+ route = subject.routes.last
+ exp = "#{namespace}::#{handler_name}"
+ assert_equal exp, route.handler_class_name
+ end
+
+ should "not use its event handler ns with a top-level handler name" do
+ namespace = Factory.string
+ subject.event_handler_ns namespace
+
+ event_channel = Factory.string
+ event_name = Factory.string
+ handler_name = "::#{Factory.string}"
+ subject.event event_channel, event_name, handler_name
+
+ route = subject.routes.last
+ assert_equal handler_name, route.handler_class_name
+ end
+
+ should "track its configured event route names" do
+ event_channel = Factory.string
+ event_name = Factory.string
+ handler_name = Factory.string
+ subject.event event_channel, event_name, handler_name
+
+ exp = Qs::Event::RouteName.new(event_channel, event_name)
+ assert_equal [exp], subject.event_route_names
+ end
+
+ should "return the enqueued jobs events using `published_events`" do
+ dispatch_jobs = Factory.integer(3).times.map do
+ Factory.dispatch_job.tap{ |j| subject.enqueued_jobs << j }
+ end
+ assert_equal dispatch_jobs.map(&:event), subject.published_events
+ end
+
+ should "clear its enqueued jobs when reset" do
+ Factory.integer(3).times.map{ subject.enqueued_jobs << Factory.job }
+ assert_not_empty subject.enqueued_jobs
+ subject.reset!
+ assert_empty subject.enqueued_jobs
+ end
+
should "know its custom inspect" do
reference = '0x0%x' % (subject.object_id << 1)
expected = "#<#{subject.class}:#{reference} " \
"@name=#{subject.name.inspect} " \
- "@job_handler_ns=#{subject.job_handler_ns.inspect}>"
+ "@job_handler_ns=#{subject.job_handler_ns.inspect} " \
+ "@event_handler_ns=#{subject.event_handler_ns.inspect}>"
assert_equal expected, subject.inspect
end
should "require a name when initialized" do
assert_raises(InvalidError){ Qs::Queue.new }
@@ -106,9 +194,29 @@
should "add jobs using `add`" do
result = subject.add(@job_name, @job_params)
exp = [subject, @job_name, @job_params]
assert_equal exp, @enqueue_args
assert_equal @enqueue_args, result
+ end
+
+ end
+
+ class SubscriptionsTests < UnitTests
+ setup do
+ @sync_args = nil
+ Assert.stub(Qs, :sync_subscriptions){ |*args| @sync_args = args }
+ @clear_args = nil
+ Assert.stub(Qs, :clear_subscriptions){ |*args| @clear_args = args }
+ end
+
+ should "use Qs to sync its subscriptions" do
+ subject.sync_subscriptions
+ assert_equal [subject], @sync_args
+ end
+
+ should "use Qs to clear its subscriptions" do
+ subject.clear_subscriptions
+ assert_equal [subject], @clear_args
end
end
class RedisKeyTests < UnitTests