From 01f8f7540f7299313a38cd33e2c55a439dd4e2d0 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Mon, 3 Mar 2025 19:49:02 +0530 Subject: [PATCH 01/13] For Action Mailers use the mailers to get queue names --- .../workers_registry.rb | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/advanced_sneakers_activejob/workers_registry.rb b/lib/advanced_sneakers_activejob/workers_registry.rb index 44060cc..0c91154 100644 --- a/lib/advanced_sneakers_activejob/workers_registry.rb +++ b/lib/advanced_sneakers_activejob/workers_registry.rb @@ -70,15 +70,32 @@ def define_active_job_consumers active_job_classes_with_matching_adapter.each do |worker| AdvancedSneakersActiveJob.define_consumer(queue_name: worker.new.queue_name) end + + action_mailer_classes_with_matching_adapter.each do |mailer| + AdvancedSneakersActiveJob.define_consumer(queue_name: mailer.deliver_later_queue_name.to_s) + end end private def active_job_classes_with_matching_adapter ([ActiveJob::Base] + ActiveJob::Base.descendants).select do |klass| - klass.queue_adapter == ::ActiveJob::QueueAdapters::AdvancedSneakersAdapter || - klass.queue_adapter.is_a?(::ActiveJob::QueueAdapters::AdvancedSneakersAdapter) + advanced_sneakers_adapter?(klass) && + !(defined?(ActionMailer::Base) && klass <= ActionMailer::MailDeliveryJob) end end + + def action_mailer_classes_with_matching_adapter + return [] if !defined?(ActionMailer::Base) || + ActionMailer.gem_version < Gem::Version.new('6.0.0') || + !advanced_sneakers_adapter?(ActionMailer::MailDeliveryJob) + + [ActionMailer::Base] + ActionMailer::Base.descendants + end + + def advanced_sneakers_adapter?(klass) + klass.queue_adapter == ::ActiveJob::QueueAdapters::AdvancedSneakersAdapter || + klass.queue_adapter.is_a?(::ActiveJob::QueueAdapters::AdvancedSneakersAdapter) + end end end From 94d380f43c4be7a0f1e6a48fc5c084ead3188e88 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Mon, 3 Mar 2025 23:11:34 +0530 Subject: [PATCH 02/13] Upgrade Appraisal and fix issue with missing dependency --- Appraisals | 11 +++-------- advanced-sneakers-activejob.gemspec | 2 +- gemfiles/activejob_6.0.x.gemfile | 1 + gemfiles/activejob_6.1.x.gemfile | 1 + gemfiles/activejob_7.0.x.gemfile | 1 + 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Appraisals b/Appraisals index 7987d85..3a5d841 100644 --- a/Appraisals +++ b/Appraisals @@ -1,21 +1,16 @@ # frozen_string_literal: true -appraise 'activejob-4.2.x' do - gem 'rails', '~> 4.2.11' -end - -appraise 'activejob-5.2.x' do - gem 'rails', '~> 5.2.4' -end - appraise 'activejob-6.0.x' do gem 'rails', '~> 6.0.3' + gem 'concurrent-ruby', '1.3.4' end appraise 'activejob-6.1.x' do gem 'rails', '~> 6.1.0' + gem 'concurrent-ruby', '1.3.4' end appraise 'activejob-7.0.x' do gem 'rails', '~> 7.0.0' + gem 'concurrent-ruby', '1.3.4' end diff --git a/advanced-sneakers-activejob.gemspec b/advanced-sneakers-activejob.gemspec index eebc873..fd171f7 100644 --- a/advanced-sneakers-activejob.gemspec +++ b/advanced-sneakers-activejob.gemspec @@ -31,7 +31,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'bunny-publisher', '~> 0.2.0' spec.add_dependency 'sneakers', '~> 2.7' - spec.add_development_dependency 'appraisal', '~> 2.3.0' + spec.add_development_dependency 'appraisal', '~> 2.5.0' spec.add_development_dependency 'bundler' spec.add_development_dependency 'pry-byebug' spec.add_development_dependency 'rabbitmq_http_api_client', '~> 1.13' diff --git a/gemfiles/activejob_6.0.x.gemfile b/gemfiles/activejob_6.0.x.gemfile index 2e0ebbc..109780e 100644 --- a/gemfiles/activejob_6.0.x.gemfile +++ b/gemfiles/activejob_6.0.x.gemfile @@ -3,5 +3,6 @@ source "https://rubygems.org" gem "rails", "~> 6.0.3" +gem "concurrent-ruby", "1.3.4" gemspec path: "../" diff --git a/gemfiles/activejob_6.1.x.gemfile b/gemfiles/activejob_6.1.x.gemfile index dd95a47..bf4ad3b 100644 --- a/gemfiles/activejob_6.1.x.gemfile +++ b/gemfiles/activejob_6.1.x.gemfile @@ -3,5 +3,6 @@ source "https://rubygems.org" gem "rails", "~> 6.1.0" +gem "concurrent-ruby", "1.3.4" gemspec path: "../" diff --git a/gemfiles/activejob_7.0.x.gemfile b/gemfiles/activejob_7.0.x.gemfile index 9af0ae3..04654c1 100644 --- a/gemfiles/activejob_7.0.x.gemfile +++ b/gemfiles/activejob_7.0.x.gemfile @@ -3,5 +3,6 @@ source "https://rubygems.org" gem "rails", "~> 7.0.0" +gem "concurrent-ruby", "1.3.4" gemspec path: "../" From 7a8614d19fc73b8b71b3740effdeb3b1a8a9b6a4 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 00:24:55 +0530 Subject: [PATCH 03/13] Queue name from mailer is the configured queue name and does not contain prefix --- lib/advanced_sneakers_activejob/workers_registry.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/advanced_sneakers_activejob/workers_registry.rb b/lib/advanced_sneakers_activejob/workers_registry.rb index 0c91154..f1a776c 100644 --- a/lib/advanced_sneakers_activejob/workers_registry.rb +++ b/lib/advanced_sneakers_activejob/workers_registry.rb @@ -72,7 +72,7 @@ def define_active_job_consumers end action_mailer_classes_with_matching_adapter.each do |mailer| - AdvancedSneakersActiveJob.define_consumer(queue_name: mailer.deliver_later_queue_name.to_s) + AdvancedSneakersActiveJob.define_consumer(queue_name: mailer_queue_name(mailer)) end end @@ -97,5 +97,12 @@ def advanced_sneakers_adapter?(klass) klass.queue_adapter == ::ActiveJob::QueueAdapters::AdvancedSneakersAdapter || klass.queue_adapter.is_a?(::ActiveJob::QueueAdapters::AdvancedSneakersAdapter) end + + # Gets the queue name for the mailer with activejob prefix and delimiter + # Queue name from ActionMailer::Base.deliver_later_queue_name is not prefixed + # and has no delimiter, so we need to add them manually + def mailer_queue_name(mailer) + [ActiveJob::Base.queue_name_prefix, mailer.deliver_later_queue_name.to_s].compact.join(ActiveJob::Base.queue_name_delimiter) + end end end From e2dd5d0fe32fb5d7950e4b5d2cf45ffc4f244caf Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 00:25:17 +0530 Subject: [PATCH 04/13] Add support for Rails 7.1 in appraisal --- Appraisals | 4 ++++ gemfiles/activejob_7.1.x.gemfile | 7 +++++++ 2 files changed, 11 insertions(+) create mode 100644 gemfiles/activejob_7.1.x.gemfile diff --git a/Appraisals b/Appraisals index 3a5d841..4a62664 100644 --- a/Appraisals +++ b/Appraisals @@ -14,3 +14,7 @@ appraise 'activejob-7.0.x' do gem 'rails', '~> 7.0.0' gem 'concurrent-ruby', '1.3.4' end + +appraise 'activejob-7.1.x' do + gem 'rails', '~> 7.1.0' +end diff --git a/gemfiles/activejob_7.1.x.gemfile b/gemfiles/activejob_7.1.x.gemfile new file mode 100644 index 0000000..35a0ba3 --- /dev/null +++ b/gemfiles/activejob_7.1.x.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "~> 7.1.0" + +gemspec path: "../" From 049230a8e238fb06ded33571d2e7d7a530e8f70b Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 00:28:57 +0530 Subject: [PATCH 05/13] Clean up CI build matrix --- .github/workflows/main.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b82b1b..d6069cd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,18 +25,10 @@ jobs: - '2.7' - '3.0' gemfile: - - gemfiles/activejob_4.2.x.gemfile - - gemfiles/activejob_5.2.x.gemfile - gemfiles/activejob_6.0.x.gemfile - gemfiles/activejob_6.1.x.gemfile - gemfiles/activejob_7.0.x.gemfile exclude: - - ruby: '2.7' - gemfile: gemfiles/activejob_4.2.x.gemfile - - ruby: '3.0' - gemfile: gemfiles/activejob_4.2.x.gemfile - - ruby: '3.0' - gemfile: gemfiles/activejob_5.2.x.gemfile - ruby: '2.5' gemfile: gemfiles/activejob_7.0.x.gemfile - ruby: '2.6' From cd9d199e858306551a3fe147fea96ed5403b15c4 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 00:36:48 +0530 Subject: [PATCH 06/13] Add Rails 7.1 to CI matrix --- .github/workflows/main.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d6069cd..9ee6729 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,12 +28,16 @@ jobs: - gemfiles/activejob_6.0.x.gemfile - gemfiles/activejob_6.1.x.gemfile - gemfiles/activejob_7.0.x.gemfile + - gemfiles/activejob_7.1.x.gemfile exclude: - ruby: '2.5' gemfile: gemfiles/activejob_7.0.x.gemfile - ruby: '2.6' gemfile: gemfiles/activejob_7.0.x.gemfile - + - ruby: '2.5' + gemfile: gemfiles/activejob_7.1.x.gemfile + - ruby: '2.6' + gemfile: gemfiles/activejob_7.1.x.gemfile steps: - name: Checkout code uses: actions/checkout@v2 From 9edd4b6f9613fa01a82fe1f27eb48a3a84a36e20 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 11:24:13 +0530 Subject: [PATCH 07/13] Reduce scope of custom Action Mailer handling to MailDeliveryJob only --- lib/advanced_sneakers_activejob/workers_registry.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/advanced_sneakers_activejob/workers_registry.rb b/lib/advanced_sneakers_activejob/workers_registry.rb index f1a776c..72a1baa 100644 --- a/lib/advanced_sneakers_activejob/workers_registry.rb +++ b/lib/advanced_sneakers_activejob/workers_registry.rb @@ -81,7 +81,7 @@ def define_active_job_consumers def active_job_classes_with_matching_adapter ([ActiveJob::Base] + ActiveJob::Base.descendants).select do |klass| advanced_sneakers_adapter?(klass) && - !(defined?(ActionMailer::Base) && klass <= ActionMailer::MailDeliveryJob) + !(defined?(ActionMailer::Base) && klass == ActionMailer::MailDeliveryJob) end end @@ -90,7 +90,9 @@ def action_mailer_classes_with_matching_adapter ActionMailer.gem_version < Gem::Version.new('6.0.0') || !advanced_sneakers_adapter?(ActionMailer::MailDeliveryJob) - [ActionMailer::Base] + ActionMailer::Base.descendants + ([ActionMailer::Base] + ActionMailer::Base.descendants).select do |klass| + klass.delivery_job == ActionMailer::MailDeliveryJob + end end def advanced_sneakers_adapter?(klass) From 7fefb50dcf662182cbcea985173b0023fe78ae70 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 11:24:37 +0530 Subject: [PATCH 08/13] Add test cases for different configurations for action mailer --- spec/integration/consumers_spec.rb | 150 +++++++++++++++++++++++------ 1 file changed, 118 insertions(+), 32 deletions(-) diff --git a/spec/integration/consumers_spec.rb b/spec/integration/consumers_spec.rb index e5a49b3..c703804 100644 --- a/spec/integration/consumers_spec.rb +++ b/spec/integration/consumers_spec.rb @@ -78,55 +78,141 @@ class DynamicQueueJob < ApplicationJob end end - if ActiveJob.gem_version >= Gem::Version.new('5.0') - context 'when there are ActiveJob classes with custom queue adapter' do - subject do - in_app_process(adapter: :advanced_sneakers) do - class FooJob < ApplicationJob - self.queue_adapter = :async - - queue_as :bar - end + context 'when there are ActiveJob classes with custom queue adapter' do + subject do + in_app_process(adapter: :advanced_sneakers) do + class FooJob < ApplicationJob + self.queue_adapter = :async + + queue_as :bar + end + + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + end + end - AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom' # see CustomQueueJob in spec/apps/app/jobs + } - Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + expect(subject.first).to eq(expected_consumers) + end + end + + context 'when advanced_sneakers is set as custom adapter' do + subject do + in_app_process(adapter: :inline) do + class FooJob < ApplicationJob + self.queue_adapter = :advanced_sneakers + + queue_as :bar end + + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h end + end - it 'are defined for queue from matching adapter only' do - expected_consumers = { - 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer - 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer - 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom' # see CustomQueueJob in spec/apps/app/jobs - } + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BarConsumer' => 'bar' # bar queue consumer for FooJob + } - expect(subject.first).to eq(expected_consumers) + expect(subject.first).to eq(expected_consumers) + end + end + + context 'when there are ActionMailer classes with queue defined' do + subject do + in_app_process(adapter: :advanced_sneakers) do + class FooMailer < ActionMailer::Base + self.deliver_later_queue_name = 'bar' + end + + class BarMailer < ActionMailer::Base + self.deliver_later_queue_name = 'baz' + end + + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h end end - context 'when advanced_sneakers is set as custom adapter' do - subject do - in_app_process(adapter: :inline) do - class FooJob < ApplicationJob - self.queue_adapter = :advanced_sneakers + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer + 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs + } - queue_as :bar - end + expect(subject.first).to eq(expected_consumers) + end + end + + context 'when there are ActionMailer classes with custom delivery jobs' do + subject do + in_app_process(adapter: :advanced_sneakers) do + class CustomDeliveryJob < ActionMailer::MailDeliveryJob + self.queue_adapter = :async + + queue_as :bar + end - AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + class FooMailer < ActionMailer::Base + self.delivery_job = CustomDeliveryJob + self.deliver_later_queue_name = 'bar' + end - Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + class BarMailer < ActionMailer::Base + self.deliver_later_queue_name = 'baz' end + + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h end + end - it 'are defined for queue from matching adapter only' do - expected_consumers = { - 'AdvancedSneakersActiveJob::BarConsumer' => 'bar' # bar queue consumer for FooJob - } + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs + } - expect(subject.first).to eq(expected_consumers) + expect(subject.first).to eq(expected_consumers) + end + end + + context 'when ActionMailer::Base has deliver_later_queue_name globally defined' do + subject do + in_app_process(adapter: :advanced_sneakers) do + ActionMailer::Base.deliver_later_queue_name = 'bar' + + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h end end + + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs + } + + expect(subject.first).to eq(expected_consumers) + end end end From 55382e2ef04e1dfc4dafe61acae3b222363bff71 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 11:45:07 +0530 Subject: [PATCH 09/13] Conditionally run mailer specific queue tests for Rails 7.1+ only --- spec/integration/consumers_spec.rb | 103 +++++++++++++++-------------- 1 file changed, 54 insertions(+), 49 deletions(-) diff --git a/spec/integration/consumers_spec.rb b/spec/integration/consumers_spec.rb index c703804..517eaf2 100644 --- a/spec/integration/consumers_spec.rb +++ b/spec/integration/consumers_spec.rb @@ -128,16 +128,10 @@ class FooJob < ApplicationJob end end - context 'when there are ActionMailer classes with queue defined' do + context 'when ActionMailer::Base has deliver_later_queue_name globally defined' do subject do in_app_process(adapter: :advanced_sneakers) do - class FooMailer < ActionMailer::Base - self.deliver_later_queue_name = 'bar' - end - - class BarMailer < ActionMailer::Base - self.deliver_later_queue_name = 'baz' - end + ActionMailer::Base.deliver_later_queue_name = 'bar' AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } @@ -148,9 +142,7 @@ class BarMailer < ActionMailer::Base it 'are defined for queue from matching adapter only' do expected_consumers = { 'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer - 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer - 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs } @@ -158,61 +150,74 @@ class BarMailer < ActionMailer::Base end end - context 'when there are ActionMailer classes with custom delivery jobs' do - subject do - in_app_process(adapter: :advanced_sneakers) do - class CustomDeliveryJob < ActionMailer::MailDeliveryJob - self.queue_adapter = :async + # Support for mailer specific queue name was added in Rails 7.1 + # https://github.com/rails/rails/pull/47408 + if ActiveJob.gem_version >= Gem::Version.new('7.1') + context 'when there are ActionMailer classes with queue defined' do + subject do + in_app_process(adapter: :advanced_sneakers) do + class FooMailer < ActionMailer::Base + self.deliver_later_queue_name = 'bar' + end - queue_as :bar - end + class BarMailer < ActionMailer::Base + self.deliver_later_queue_name = 'baz' + end - class FooMailer < ActionMailer::Base - self.delivery_job = CustomDeliveryJob - self.deliver_later_queue_name = 'bar' - end + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } - class BarMailer < ActionMailer::Base - self.deliver_later_queue_name = 'baz' + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + ActionMailer::Base.deliver_later_queue_name.as_json end + end - AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer + 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs + } - Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + expect(subject.first).to eq(expected_consumers) end end - it 'are defined for queue from matching adapter only' do - expected_consumers = { - 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer - 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer - 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer - 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs - } + context 'when there are ActionMailer classes with custom delivery jobs' do + subject do + in_app_process(adapter: :advanced_sneakers) do + class CustomDeliveryJob < ActionMailer::MailDeliveryJob + self.queue_adapter = :async - expect(subject.first).to eq(expected_consumers) - end - end + queue_as :bar + end - context 'when ActionMailer::Base has deliver_later_queue_name globally defined' do - subject do - in_app_process(adapter: :advanced_sneakers) do - ActionMailer::Base.deliver_later_queue_name = 'bar' + class FooMailer < ActionMailer::Base + self.delivery_job = CustomDeliveryJob + self.deliver_later_queue_name = 'bar' + end - AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + class BarMailer < ActionMailer::Base + self.deliver_later_queue_name = 'baz' + end - Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } + + Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h + end end - end - it 'are defined for queue from matching adapter only' do - expected_consumers = { - 'AdvancedSneakersActiveJob::BarConsumer' => 'bar', # bar queue consumer for FooMailer - 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer - 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs - } + it 'are defined for queue from matching adapter only' do + expected_consumers = { + 'AdvancedSneakersActiveJob::BazConsumer' => 'baz', # baz queue consumer for BarMailer + 'AdvancedSneakersActiveJob::DefaultConsumer' => 'default', # default consumer + 'AdvancedSneakersActiveJob::MailersConsumer' => 'mailers', # action mailer consumer + 'AdvancedSneakersActiveJob::CustomConsumer' => 'custom', # see CustomQueueJob in spec/apps/app/jobs + } - expect(subject.first).to eq(expected_consumers) + expect(subject.first).to eq(expected_consumers) + end end end end From ae84cb2dabb1cae76327dc9c77dc0f2fe4f08827 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 11:49:06 +0530 Subject: [PATCH 10/13] Clean up line added for debugging --- spec/integration/consumers_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/integration/consumers_spec.rb b/spec/integration/consumers_spec.rb index 517eaf2..67e0ba8 100644 --- a/spec/integration/consumers_spec.rb +++ b/spec/integration/consumers_spec.rb @@ -167,7 +167,6 @@ class BarMailer < ActionMailer::Base AdvancedSneakersActiveJob.configure { |c| c.activejob_workers_strategy = :only } Sneakers::Worker::Classes.call.map { |consumer| [consumer.name, consumer.queue_name] }.to_h - ActionMailer::Base.deliver_later_queue_name.as_json end end From 34ff3d8d965b792ef985a6083e6a6fe2d066d9cf Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 11:57:55 +0530 Subject: [PATCH 11/13] Add ruby 3.1 and 3.2 to test matrix --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9ee6729..bb081b2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,6 +24,8 @@ jobs: - '2.6' - '2.7' - '3.0' + - '3.1' + - '3.2' gemfile: - gemfiles/activejob_6.0.x.gemfile - gemfiles/activejob_6.1.x.gemfile From 0bb2b2fd35050c443bddb50a506e990d4edfab6c Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 12:19:35 +0530 Subject: [PATCH 12/13] Set fail-fast to false temporarily --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bb081b2..a444bd7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,6 +18,7 @@ jobs: --health-timeout 5s --health-retries 5 strategy: + fail-fast: false matrix: ruby: - '2.5' From 322edfdd693c9d5fd7f79f2ce4724d9118612852 Mon Sep 17 00:00:00 2001 From: shashank mehra Date: Tue, 4 Mar 2025 12:24:31 +0530 Subject: [PATCH 13/13] Disable tests for Ruby 3.2 and Rails 6.x due to compatibility issues --- .github/workflows/main.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a444bd7..4cbd8f7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -18,7 +18,6 @@ jobs: --health-timeout 5s --health-retries 5 strategy: - fail-fast: false matrix: ruby: - '2.5' @@ -41,6 +40,10 @@ jobs: gemfile: gemfiles/activejob_7.1.x.gemfile - ruby: '2.6' gemfile: gemfiles/activejob_7.1.x.gemfile + - ruby: '3.2' + gemfile: gemfiles/activejob_6.0.x.gemfile + - ruby: '3.2' + gemfile: gemfiles/activejob_6.1.x.gemfile steps: - name: Checkout code uses: actions/checkout@v2