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