From 74b95b567da430be045268d2c61f05a39b9eeba0 Mon Sep 17 00:00:00 2001 From: Will Spurgin Date: Mon, 31 Jul 2023 16:18:34 -0500 Subject: [PATCH 1/4] Refactor to use a general context matcher --- .../sidekiq/matchers/have_enqueued_job.rb | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb index 34d388e..f709a48 100644 --- a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb +++ b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb @@ -17,16 +17,26 @@ def initialize(job) @job = job end - def matches?(option, value) - raise ArgumentError, "Option `#{option}` is not defined." unless %w[at].include?(option.to_s) - send("#{option}_evaluator", value) + def matches?(options) + with_context(**options) end private def at_evaluator(value) - return false if job['at'].to_s.empty? - value == Time.at(job['at']).to_i + return false if job["at"].to_s.empty? + value == Time.at(job["at"]).to_i + end + + def with_context(**expected_context) + expected_context.all? do |key, value| + if key == "at" + # send to custom evaluator + at_evaluator(value) + else + job.context.has_key?(key) && job.context[key] == value + end + end end end @@ -92,7 +102,7 @@ def args end def context - @context||= job.except("args") + @context ||= job.except("args") end end @@ -121,10 +131,9 @@ def arguments_matches?(job, arguments) end def options_matches?(job, options) - options.all? do |option, value| - parser = JobOptionParser.new(job) - parser.matches?(option, value) - end + parser = JobOptionParser.new(job) + + parser.matches?(options) end def unwrap_jobs(jobs) @@ -151,12 +160,12 @@ def matches?(klass) end def at(timestamp) - @expected_options['at'] = timestamp.to_time.to_i + @expected_options["at"] = timestamp.to_time.to_i self end def in(interval) - @expected_options['at'] = (Time.now.to_f + interval.to_f).to_i + @expected_options["at"] = (Time.now.to_f + interval.to_f).to_i self end From dddee3ab34985ac93fff6df5643300a662a9bf27 Mon Sep 17 00:00:00 2001 From: Will Spurgin Date: Mon, 31 Jul 2023 16:18:51 -0500 Subject: [PATCH 2/4] Specify that we depend on rspec-expectations too We have since https://github.com/wspurgin/rspec-sidekiq/commit/ecf3d7647309c4b70efb8f878fbf05b84a677082 but we forgot to add it in the dependencies in https://github.com/wspurgin/rspec-sidekiq/commit/e01bb6f6bb3859d5fc51cda01921942d82569119 when we were sliming down which gems we depended on. --- rspec-sidekiq.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/rspec-sidekiq.gemspec b/rspec-sidekiq.gemspec index 91f5533..8fb9519 100644 --- a/rspec-sidekiq.gemspec +++ b/rspec-sidekiq.gemspec @@ -11,6 +11,7 @@ Gem::Specification.new do |s| s.license = "MIT" s.add_dependency "rspec-core", "~> 3.0" + s.add_dependency "rspec-expectations", "~> 3.0" s.add_dependency "sidekiq", ">= 5", "< 8" s.add_development_dependency "pry" From 64f5d4db725598ce52a67e5d193617cd08b56727 Mon Sep 17 00:00:00 2001 From: Will Spurgin Date: Mon, 31 Jul 2023 16:30:41 -0500 Subject: [PATCH 3/4] Add #on implementation for testing queue --- lib/rspec/sidekiq/matchers/have_enqueued_job.rb | 5 +++++ .../sidekiq/matchers/have_enqueued_job_spec.rb | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb index f709a48..a42e496 100644 --- a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb +++ b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb @@ -169,6 +169,11 @@ def in(interval) self end + def on(queue) + @expected_options["queue"] = queue + self + end + def description "have an enqueued #{klass} job with arguments #{expected_arguments}" end diff --git a/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb b/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb index e082bd6..8f73cfc 100644 --- a/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb +++ b/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb @@ -55,6 +55,20 @@ expect(worker).to have_enqueued_sidekiq_job(*worker_args_at).at(tomorrow) end end + + context "#on queue" do + it "matches the queue in the context" do + worker.perform_async(*worker_args) + expect(worker).to have_enqueued_sidekiq_job(*worker_args).on("default") + end + + context "when setting queue at runtime" do + it "matches the queue set" do + worker.set(queue: "highest").perform_async(*worker_args) + expect(worker).to have_enqueued_sidekiq_job(*worker_args).on("highest") + end + end + end end context 'ActiveJob' do From ed22bbc3b1484b91dca5fa267b78f4429396fbea Mon Sep 17 00:00:00 2001 From: Will Spurgin Date: Mon, 31 Jul 2023 16:35:05 -0500 Subject: [PATCH 4/4] Add docs for `#on` --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 50b8ba4..0213f24 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,28 @@ AwesomeJob.perform_in 5.minutes, 'Awesome', true expect(AwesomeJob).to have_enqueued_sidekiq_job('Awesome', true).in(5.minutes) ``` +#### Testing queue set for job + +Use the chainable `#on` matcher + +```ruby +class AwesomeJob + include Sidekiq::Job + + sidekiq_options queue: :low +end + +AwesomeJob.perform_async("a little awesome") + +# test with.. +expect(AwesomeJob).to have_enqueued_sidekiq_job("a little awesome").on("low") + +# Setting the queue when enqueuing +AwesomeJob.set(queue: "high").perform_async("Very Awesome!") + +expect(AwesomeJob).to have_enqueued_sidekiq_job("Very Awesome!").on("high") +``` + #### Testing ActiveMailer jobs