diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..a73a866 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,41 @@ +# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake +# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby + +name: main build +run-name: ${{ github.actor }} 🚀 ${{github.ref_name}} +on: [push] + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + ruby-version: + - '2.7' + - '3.0' + - '3.1' + - '3.2' + gemfile: + - 'Gemfile' + - 'gemfiles/sidekiq5_rails6.gemfile' + - 'gemfiles/sidekiq6_4_rails6.gemfile' + - 'gemfiles/sidekiq6_4_rails7.gemfile' + - 'gemfiles/sidekiq6_5_rails6.gemfile' + - 'gemfiles/sidekiq6_5_rails7.gemfile' + env: + BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }} + steps: + - uses: actions/checkout@v3 + - name: Set up using Ruby ${{ matrix.ruby-version }} with Gemfile '${{ matrix.gemfile }}' + # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby, + # change this to (see https://github.com/ruby/setup-ruby#versioning): + # uses: ruby/setup-ruby@v1 + uses: ruby/setup-ruby@ee2113536afb7f793eed4ce60e8d3b26db912da4 # v1.127.0 + with: + ruby-version: ${{ matrix.ruby-version }} + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: Run tests + run: bundle exec rspec spec diff --git a/.gitignore b/.gitignore index a8177f3..44c830f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ Gemfile.lock -tmp \ No newline at end of file +tmp +/gemfiles/*.lock +.tool-versions +.rspec diff --git a/.rspec b/.rspec deleted file mode 100644 index d020721..0000000 --- a/.rspec +++ /dev/null @@ -1,4 +0,0 @@ ---colour ---tty ---format Fuubar ---format html --out tmp/spec_result/index.html diff --git a/.rspec.example b/.rspec.example new file mode 100644 index 0000000..262c08b --- /dev/null +++ b/.rspec.example @@ -0,0 +1,3 @@ +--colour +--tty +--format documentation diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..ff365e0 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +3.1.3 diff --git a/.simplecov b/.simplecov deleted file mode 100644 index 4e8921f..0000000 --- a/.simplecov +++ /dev/null @@ -1,5 +0,0 @@ -SimpleCov.start do - add_filter '/spec/' - - coverage_dir 'tmp/spec_coverage' -end diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a22b063..0000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: ruby -rvm: - - 2.5.7 - - 2.6.5 - - jruby - - rbx-2 - -gemfile: - - gemfiles/sidekiq52_rails42.gemfile - - gemfiles/sidekiq52_rails52.gemfile - - gemfiles/sidekiq60_rails52.gemfile - -script: "bundle exec rspec spec" - -before_install: - - gem install bundler:1.17.3 - -matrix: - allow_failures: - - rvm: jruby - - rvm: rbx-2 diff --git a/CHANGES.md b/CHANGES.md index a471426..e24cc70 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,13 @@ +Unreleased - 4.0.0 +--- +* [BREAKING] Dropped support for matching jobs on ActiveJob's private API args, (e.g. `_aj_globalid` and `_aj_ruby2_keywords`). `_aj_globalid` can be replaced with the object itself, e.g. `have_enqueued_sidekiq_job(user)`. +* [BREAKING] Dropped support for Ruby 2.6 +* [Possible breaking] Dropped support for Sidekiq 5 +* [Possible breaking] Dropped support for Rails 5 +* Clarified `have_enqueued_sidekiq_job` error message to make it clear that the "actual arguments" list is a list of argument-lists across all jobs. +* Switched to GitHub Actions for CI +* README updates to clarify new author and build links + 3.1.0 --- * Add support for latest ruby and Rails 5 (coding-bunny #156) diff --git a/Gemfile b/Gemfile index 42d44f3..b6ce399 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,6 @@ source 'https://rubygems.org' platforms :rbx do - gem 'rubysl', '~> 2.0' gem 'psych' gem 'rubinius-developer_tools' end diff --git a/README.md b/README.md index 7b747bd..59c6a30 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,11 @@ -**Welcome @packrat386 as new maintainer for `rspec-sidekiq`!** +**Welcome @wspurgin as new maintainer for `rspec-sidekiq`!** # RSpec for Sidekiq [![RubyGems][gem_version_badge]][ruby_gems] -[![Code Climate][code_climate_badge]][code_climate] -[![Travis CI][travis_ci_badge]][travis_ci] -[![Coveralls][coveralls_badge]][coveralls] -[![Gemnasium][gemnasium_badge]][gemnasium] - -***Simple testing of Sidekiq jobs via a collection of matchers and helpers*** - -[RubyGems][ruby_gems] | -[Code Climate][code_climate] | -[GitHub][github] | -[Travis CI][travis_ci] | -[Coveralls][coveralls] | -[Gemnasium][gemnasium] | -[RubyDoc][ruby_doc] | -[Ruby Toolbox][ruby_toolbox] +[![Github Actions CI][github_actions_badge]][github_actions] + +Simple testing of Sidekiq jobs via a collection of matchers and helpers. [Jump to Matchers »](#matchers) | [Jump to Helpers »](#helpers) @@ -108,7 +96,7 @@ sidekiq_options backtrace: 5 # test with... expect(AwesomeJob).to save_backtrace # or it { is_expected.to save_backtrace } -# ...or alternatively specifiy the number of lines that should be saved +# ...or alternatively specify the number of lines that should be saved expect(AwesomeJob).to save_backtrace 5 # or it { is_expected.to save_backtrace 5 } # ...or when it should not save the backtrace @@ -153,7 +141,9 @@ expect(AwesomeJob).to have_enqueued_job('Awesome', true) ``` #### Testing scheduled jobs + *Use chainable matchers `#at` and `#in`* + ```ruby time = 5.minutes.from_now Awesomejob.perform_at time, 'Awesome', true @@ -166,6 +156,21 @@ Awesomejob.perform_in 5.minutes, 'Awesome', true expect(AwesomeJob).to have_enqueued_sidekiq_job('Awesome', true).in(5.minutes) ``` +#### Testing ActiveMailer jobs + +```ruby +user = User.first +AwesomeActionMailer.invite(user, true).deliver_later + +expect(Sidekiq::Worker).to have_enqueued_sidekiq_job( + "AwesomeActionMailer", + "invite", + "deliver_now", + user, + true +) +``` + ## Example matcher usage ```ruby require 'spec_helper' @@ -203,9 +208,15 @@ FooClass.within_sidekiq_retries_exhausted_block { ``` ## Testing -```bundle exec rspec spec``` +``` +bundle exec rspec spec +``` ## Maintainers +* @wspurgin + +### Alumni + * @packrat386 * @philostler @@ -214,19 +225,13 @@ Please do! If there's a feature missing that you'd love to see then get in on th Issues/Pull Requests/Comments all welcome... -[code_climate]: https://codeclimate.com/github/philostler/rspec-sidekiq -[code_climate_badge]: https://codeclimate.com/github/philostler/rspec-sidekiq.svg -[coveralls]: https://coveralls.io/r/philostler/rspec-sidekiq -[coveralls_badge]: https://img.shields.io/coveralls/philostler/rspec-sidekiq.svg?branch=develop [gem_version_badge]: https://badge.fury.io/rb/rspec-sidekiq.svg -[gemnasium]: https://gemnasium.com/philostler/rspec-sidekiq -[gemnasium_badge]: https://gemnasium.com/philostler/rspec-sidekiq.svg [github]: http://github.com/philostler/rspec-sidekiq [ruby_doc]: http://rubydoc.info/gems/rspec-sidekiq/frames [ruby_gems]: http://rubygems.org/gems/rspec-sidekiq [ruby_toolbox]: http://www.ruby-toolbox.com/projects/rspec-sidekiq -[travis_ci]: http://travis-ci.org/philostler/rspec-sidekiq -[travis_ci_badge]: https://travis-ci.org/philostler/rspec-sidekiq.svg?branch=develop +[github_actions]: https://github.com/adsteel/rspec-sidekiq/actions +[github_actions_badge]: https://github.com/adsteel/rspec-sidekiq/actions/workflows/main.yml/badge.svg [rspec_sidekiq_wiki_faq_&_troubleshooting]: https://github.com/philostler/rspec-sidekiq/wiki/FAQ-&-Troubleshooting [sidekiq_wiki_batches]: https://github.com/mperham/sidekiq/wiki/Batches diff --git a/gemfiles/sidekiq52_rails42.gemfile b/gemfiles/sidekiq52_rails42.gemfile deleted file mode 100644 index cb8e3d1..0000000 --- a/gemfiles/sidekiq52_rails42.gemfile +++ /dev/null @@ -1,12 +0,0 @@ -source 'https://rubygems.org' - -gem 'sidekiq', '~> 5.2.2' -gem 'nokogiri', '~> 1.8.5' -gem 'rspec-core', '~> 3.8' -gem 'activejob', '~> 4.2' -gem 'actionmailer', '~> 4.2' -gem 'activerecord', '~> 4.2' -gem "activemodel", "~> 4.2" -gem "railties", "~> 4.2" - -gemspec :path => '../' \ No newline at end of file diff --git a/gemfiles/sidekiq52_rails52.gemfile b/gemfiles/sidekiq52_rails52.gemfile deleted file mode 100644 index 6717fd0..0000000 --- a/gemfiles/sidekiq52_rails52.gemfile +++ /dev/null @@ -1,12 +0,0 @@ -source 'https://rubygems.org' - -gem 'sidekiq', '~> 5.2.2' -gem 'nokogiri', '~> 1.8.5' -gem 'rspec-core', '~> 3.8' -gem 'activejob', '~> 5.2' -gem 'actionmailer', '~> 5.2' -gem 'activerecord', '~> 5.2' -gem "activemodel", "~> 5.2" -gem "railties", "~> 5.2" - -gemspec :path => '../' diff --git a/gemfiles/sidekiq5_rails6.gemfile b/gemfiles/sidekiq5_rails6.gemfile new file mode 100644 index 0000000..b78dd69 --- /dev/null +++ b/gemfiles/sidekiq5_rails6.gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem 'sidekiq', '~> 5.0' +gem 'activejob', '~> 6.0' +gem 'actionmailer', '~> 6.0' +gem 'activerecord', '~> 6.0' +gem "activemodel", "~> 6.0" +gem "railties", "~> 6.0" + +gemspec :path => '../' diff --git a/gemfiles/sidekiq60_rails52.gemfile b/gemfiles/sidekiq60_rails52.gemfile deleted file mode 100644 index 560e86c..0000000 --- a/gemfiles/sidekiq60_rails52.gemfile +++ /dev/null @@ -1,12 +0,0 @@ -source 'https://rubygems.org' - -gem 'sidekiq', '~> 6.0' -gem 'nokogiri', '~> 1.8.5' -gem 'rspec-core', '~> 3.8' -gem 'activejob', '~> 5.2' -gem 'actionmailer', '~> 5.2' -gem 'activerecord', '~> 5.2' -gem "activemodel", "~> 5.2" -gem "railties", "~> 5.2" - -gemspec :path => '../' diff --git a/gemfiles/sidekiq6_4_rails6.gemfile b/gemfiles/sidekiq6_4_rails6.gemfile new file mode 100644 index 0000000..25b5f44 --- /dev/null +++ b/gemfiles/sidekiq6_4_rails6.gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem 'sidekiq', '~> 6.4.0' +gem 'activejob', '~> 6.0' +gem 'actionmailer', '~> 6.0' +gem 'activerecord', '~> 6.0' +gem "activemodel", "~> 6.0" +gem "railties", "~> 6.0" + +gemspec :path => '../' diff --git a/gemfiles/sidekiq6_4_rails7.gemfile b/gemfiles/sidekiq6_4_rails7.gemfile new file mode 100644 index 0000000..58989be --- /dev/null +++ b/gemfiles/sidekiq6_4_rails7.gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem 'sidekiq', '~> 6.4.0' +gem 'activejob', '~> 7.0' +gem 'actionmailer', '~> 7.0' +gem 'activerecord', '~> 7.0' +gem "activemodel", "~> 7.0" +gem "railties", "~> 7.0" + +gemspec :path => '../' diff --git a/gemfiles/sidekiq6_5_rails6.gemfile b/gemfiles/sidekiq6_5_rails6.gemfile new file mode 100644 index 0000000..ff45a40 --- /dev/null +++ b/gemfiles/sidekiq6_5_rails6.gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem 'sidekiq', '~> 6.5' +gem 'activejob', '~> 6.0' +gem 'actionmailer', '~> 6.0' +gem 'activerecord', '~> 6.0' +gem "activemodel", "~> 6.0" +gem "railties", "~> 6.0" + +gemspec :path => '../' diff --git a/gemfiles/sidekiq6_5_rails7.gemfile b/gemfiles/sidekiq6_5_rails7.gemfile new file mode 100644 index 0000000..6f38fad --- /dev/null +++ b/gemfiles/sidekiq6_5_rails7.gemfile @@ -0,0 +1,10 @@ +source 'https://rubygems.org' + +gem 'sidekiq', '~> 6.5' +gem 'activejob', '~> 7.0' +gem 'actionmailer', '~> 7.0' +gem 'activerecord', '~> 7.0' +gem "activemodel", "~> 7.0" +gem "railties", "~> 7.0" + +gemspec :path => '../' diff --git a/lib/rspec/sidekiq/matchers/be_delayed.rb b/lib/rspec/sidekiq/matchers/be_delayed.rb index 0ac783d..d8c67c1 100644 --- a/lib/rspec/sidekiq/matchers/be_delayed.rb +++ b/lib/rspec/sidekiq/matchers/be_delayed.rb @@ -58,7 +58,12 @@ def until(time) def find_job(method, arguments, &block) job = (::Sidekiq::Extensions::DelayedClass.jobs + ::Sidekiq::Extensions::DelayedModel.jobs + ::Sidekiq::Extensions::DelayedMailer.jobs).find do |job| - yaml = YAML.load(job['args'].first) + arg = job['args'].first + yaml = begin + YAML.load(arg, aliases: true) # Psych 4 required syntax + rescue ArgumentError + YAML.load(arg) # Pysch < 4 syntax + end @expected_method_receiver == yaml[0] && @expected_method.name == yaml[1] && (@expected_arguments <=> yaml[2]) == 0 end diff --git a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb index dd96ee9..4ab86df 100644 --- a/lib/rspec/sidekiq/matchers/have_enqueued_job.rb +++ b/lib/rspec/sidekiq/matchers/have_enqueued_job.rb @@ -35,15 +35,71 @@ def in_evaluator(value) end end - class JobMatcher - attr_reader :jobs + class JobArguments + def initialize(job) + self.job = job + end + attr_accessor :job + + def matches?(expected_args) + RSpec::Matchers::BuiltIn::ContainExactly.new(expected_args).matches?(unwrapped_arguments) + end + + def unwrapped_arguments + args = job['args'] + + return deserialized_active_job_args if active_job? + + args + end + + private + + def active_job? + job["class"] == "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper" + end + + def deserialized_active_job_args + _deserialized_active_job_args = ActiveJob::Arguments.deserialize(active_job_original_args) + + # ActiveJob 7 (aj7) changed deserialization structure, adding passed arguments + # in an aj-specific hash under the :args key + aj7_args_hash = _deserialized_active_job_args.detect { |arg| arg.respond_to?(:key) && arg.key?(:args) } + + return _deserialized_active_job_args if aj7_args_hash.nil? + + _deserialized_active_job_args.delete(aj7_args_hash) + _deserialized_active_job_args.concat(aj7_args_hash[:args]) + end + + def active_job_original_args + _active_job_args = job["args"].detect { |arg| arg.is_a?(Hash) && arg.key?("arguments") } + _active_job_args ||= {} + _active_job_args["arguments"] || [] + end + end + + class EnqueuedJobs + attr_reader :jobs, :actual_arguments, :actual_options def initialize(klass) @jobs = unwrap_jobs(klass.jobs) end - def present?(arguments, options) - !!find_job(arguments, options) + def includes?(arguments, options) + !!jobs.find { |job| matches?(job, arguments, options) } + end + + def actual_arguments + @actual_arguments ||= jobs.map { |job| JobArguments.new(job).unwrapped_arguments } + end + + def actual_options + @actual_options ||= if jobs.is_a?(Hash) + jobs.values + else + jobs.flatten.map { |j| { 'at' => j['at'] } } + end end private @@ -54,8 +110,9 @@ def matches?(job, arguments, options) end def arguments_matches?(job, arguments) - arguments_got = job_arguments(job) - contain_exactly?(arguments, arguments_got) + job_arguments = JobArguments.new(job) + + job_arguments.matches?(arguments) end def options_matches?(job, options) @@ -65,40 +122,30 @@ def options_matches?(job, options) end end - def find_job(arguments, options) - jobs.find { |job| matches?(job, arguments, options) } - end - - def job_arguments(job) - args = job['args'] - return args[0]['arguments'] if args.is_a?(Array) && args[0].is_a?(Hash) && args[0].has_key?('arguments') - args - end - def unwrap_jobs(jobs) return jobs if jobs.is_a?(Array) jobs.values.flatten end - - def contain_exactly?(expected, got) - exactly = RSpec::Matchers::BuiltIn::ContainExactly.new(expected) - exactly.matches?(got) - end end class HaveEnqueuedJob attr_reader :klass, :expected_arguments, :actual_arguments, :expected_options, :actual_options def initialize(expected_arguments) - @expected_arguments = normalize_arguments(expected_arguments) + @expected_arguments = expected_arguments @expected_options = {} end + def matches?(klass) @klass = klass - @actual_arguments = unwrapped_job_arguments(klass.jobs) - @actual_options = unwrapped_job_options(klass.jobs) - JobMatcher.new(klass).present?(expected_arguments, expected_options) + + enqueued_jobs = EnqueuedJobs.new(klass) + + @actual_arguments = enqueued_jobs.actual_arguments + @actual_options = enqueued_jobs.actual_options + + enqueued_jobs.includes?(jsonified_expected_arguments, expected_options) end def at(timestamp) @@ -117,11 +164,13 @@ def description def failure_message message = ["expected to have an enqueued #{klass} job"] - message << " arguments: #{expected_arguments}" if expected_arguments - message << " options: #{expected_options}" if expected_options.any? - message << "found" - message << " arguments: #{actual_arguments}" if expected_arguments - message << " options: #{actual_options}" if expected_options.any? + message << " with arguments:" if expected_arguments + message << " -#{expected_arguments.inspect}" if expected_arguments + message << " with options:" if expected_options.any? + message << " -#{expected_options}" if expected_options.any? + message << "but have enqueued only jobs" + message.concat([" with arguments:"], actual_arguments.sort_by { |a| a[0].to_s }.map { |a| " -#{a}" }) if expected_arguments + message.concat([" with options:"], actual_options.sort_by { |a| a.to_a[0].to_s }.map { |o| " -#{o}" }) if expected_options.any? message.join("\n") end @@ -132,49 +181,18 @@ def failure_message_when_negated message.join("\n") end - private - - def unwrapped_job_options(jobs) - jobs = jobs.values if jobs.is_a?(Hash) - jobs.flatten.map do |job| - { 'at' => job['at'] } - end - end - - def unwrapped_job_arguments(jobs) - if jobs.is_a? Hash - jobs.values.flatten.map do |job| - map_arguments(job) - end - else - map_arguments(jobs) - end.map { |job| job.flatten } - end - - def map_arguments(job) - args = job_arguments(job) || job - if args.respond_to?(:any?) && args.any? { |e| e.is_a? Hash } - args.map { |a| map_arguments(a) } - else - args - end - end - - def job_arguments(hash) - hash['arguments'] || hash['args'] if hash.is_a? Hash - end - - def normalize_arguments(args) - if args.is_a?(Array) - args.map{ |x| normalize_arguments(x) } - elsif args.is_a?(Hash) - args.each_with_object({}) do |(key, value), hash| - hash[key.to_s] = normalize_arguments(value) + def jsonified_expected_arguments + # We would just cast-to-parse-json, but we need to support + # RSpec matcher args like #kind_of + @jsonified_expected_arguments ||= begin + expected_arguments.map do |arg| + case arg.class + when Symbol then arg.to_s + when Hash then JSON.parse(arg.to_json) + else + arg + end end - elsif args.is_a?(Symbol) - args.to_s - else - args end end end diff --git a/rspec-sidekiq.gemspec b/rspec-sidekiq.gemspec index 44f71ed..586fd7d 100644 --- a/rspec-sidekiq.gemspec +++ b/rspec-sidekiq.gemspec @@ -12,8 +12,11 @@ Gem::Specification.new do |s| s.license = 'MIT' s.add_dependency 'rspec-core', '~> 3.0', '>= 3.0.0' - s.add_dependency 'sidekiq', '>= 2.4.0' + s.add_dependency 'sidekiq', '>= 2.4.0', '< 7' + s.add_development_dependency 'pry' + s.add_development_dependency 'pry-doc' + s.add_development_dependency 'pry-nav' s.add_development_dependency 'rspec' s.add_development_dependency 'coveralls' s.add_development_dependency 'fuubar' @@ -27,8 +30,6 @@ Gem::Specification.new do |s| s.files = Dir['.gitattributes'] + Dir['.gitignore'] + Dir['.rspec'] + - Dir['.simplecov'] + - Dir['.travis'] + Dir['CHANGES.md'] + Dir['Gemfile'] + Dir['LICENSE'] + diff --git a/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb b/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb index dff4e93..e5d3eea 100644 --- a/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb +++ b/spec/rspec/sidekiq/matchers/have_enqueued_job_spec.rb @@ -6,16 +6,17 @@ let(:argument_subject) { RSpec::Sidekiq::Matchers::HaveEnqueuedJob.new worker_args } let(:matcher_subject) { RSpec::Sidekiq::Matchers::HaveEnqueuedJob.new [be_a(String), be_a(Integer), true, be_a(Hash)] } let(:worker) { create_worker } - let(:worker_args) { ['string', 1, true, { key: 'value', bar: :foo, nested: [{hash: true}] }] } + let(:worker_args) { ['string', 1, true, { "key" => 'value', "bar" => "foo", "nested" => [{"hash" => true}] }] } let(:active_job) { create_active_job :mailers } let(:resource) { TestResource.new } before(:each) do GlobalID.app = 'rspec-sidekiq' + allow(GlobalID::Locator).to receive(:locate).and_return(resource) worker.perform_async *worker_args - active_job.perform_later 'someResource' + active_job.perform_later "someResource", *worker_args active_job.perform_later(resource) - TestActionMailer.testmail.deliver_later + TestActionMailer.testmail(*worker_args).deliver_later TestActionMailer.testmail(resource).deliver_later end @@ -56,11 +57,11 @@ context 'ActiveJob' do it 'matches on an enqueued ActiveJob' do - expect(Sidekiq::Worker).to have_enqueued_sidekiq_job 'someResource' + expect(Sidekiq::Worker).to have_enqueued_sidekiq_job 'someResource', *worker_args end - it 'matches on an enqueued ActiveJob by global_id' do - expect(Sidekiq::Worker).to have_enqueued_sidekiq_job('_aj_globalid' => resource.to_global_id.uri.to_s) + it 'matches on an enqueued ActiveJob by global_id-capable object' do + expect(Sidekiq::Worker).to have_enqueued_sidekiq_job(resource) end end @@ -69,7 +70,8 @@ expect(Sidekiq::Worker).to have_enqueued_sidekiq_job( 'TestActionMailer', 'testmail', - 'deliver_now' + 'deliver_now', + *worker_args ) end @@ -78,7 +80,7 @@ 'TestActionMailer', 'testmail', 'deliver_now', - { '_aj_globalid' => resource.to_global_id.uri.to_s } + resource ) end end @@ -88,19 +90,9 @@ it 'returns instance' do expect(have_enqueued_sidekiq_job).to be_a RSpec::Sidekiq::Matchers::HaveEnqueuedJob end - end - - describe '#have_enqueued_job' do - it 'returns instance' do - expect(have_enqueued_job).to be_a RSpec::Sidekiq::Matchers::HaveEnqueuedJob - end - - it 'provides deprecation warning' do - expect { have_enqueued_job }.to output(/[DEPRECATION]/).to_stderr - end it 'matches the same way have_enqueued_sidekiq_job does' do - expect(worker).to have_enqueued_job *worker_args + expect(worker).to have_enqueued_sidekiq_job *worker_args end end @@ -116,9 +108,11 @@ argument_subject.matches? worker expect(argument_subject.failure_message).to eq <<-eos.gsub(/^ {6}/, '').strip expected to have an enqueued #{worker} job - arguments: [\"string\", 1, true, {\"key\"=>\"value\", \"bar\"=>\"foo\", \"nested\"=>[{\"hash\"=>true}]}] - found - arguments: [[\"string\", 1, true, {\"key\"=>\"value\", \"bar\"=>\"foo\", \"nested\"=>[{\"hash\"=>true}]}]] + with arguments: + -[\"string\", 1, true, {\"key\"=>\"value\", \"bar\"=>\"foo\", \"nested\"=>[{\"hash\"=>true}]}] + but have enqueued only jobs + with arguments: + -[\"string\", 1, true, {\"key\"=>\"value\", \"bar\"=>\"foo\", \"nested\"=>[{\"hash\"=>true}]}] eos end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8dbc90c..a841556 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,4 @@ -require 'simplecov' -require 'coveralls' +require 'pry' require 'sidekiq' require 'rspec-sidekiq' @@ -9,11 +8,6 @@ require_relative 'support/init' -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new( - [Coveralls::SimpleCov::Formatter, SimpleCov::Formatter::HTMLFormatter] -) -SimpleCov.start - RSpec.configure do |config| config.disable_monkey_patching! @@ -21,6 +15,7 @@ end ActiveJob::Base.queue_adapter = :sidekiq +ActiveJob::Base.logger.level = :warn if Gem::Dependency.new('sidekiq', '>= 5.0.0').matching_specs.any? require 'active_record'