diff --git a/features/fixtures/que/app/app.rb b/features/fixtures/que/app/app.rb index 5ff701ee..3f984f80 100644 --- a/features/fixtures/que/app/app.rb +++ b/features/fixtures/que/app/app.rb @@ -1,79 +1,3 @@ -require 'pg' -require 'que' -require 'socket' -require 'bugsnag' -require 'active_record' +require_relative "setup-que" -QUE_VERSION = ENV.fetch("QUE_VERSION") - -Bugsnag.configure do |config| - puts "Configuring `api_key` to #{ENV['BUGSNAG_API_KEY']}" - config.api_key = ENV['BUGSNAG_API_KEY'] - puts "Configuring `endpoint` to #{ENV['BUGSNAG_ENDPOINT']}" - config.endpoint = ENV['BUGSNAG_ENDPOINT'] -end - -postgres_ready = false -attempts = 0 -MAX_ATTEMPTS = 10 - -until postgres_ready || attempts >= MAX_ATTEMPTS - begin - Timeout::timeout(5) { TCPSocket.new('postgres', 5432).close } - - postgres_ready = true - rescue Exception - attempts += 1 - sleep 1 - end -end - -raise 'postgres was not ready in time!' unless postgres_ready - -ActiveRecord::Base.establish_connection( - adapter: 'postgresql', - database: 'postgres', - username: 'postgres', - password: 'test_password', - host: 'postgres' -) - -Que.connection = ActiveRecord Que.migrate!(version: Que::Migrations::CURRENT_VERSION) - -# Workaround a bug in que/pg -# see https://github.com/que-rb/que/issues/247 -if QUE_VERSION == '0.14' - Que::Adapters::Base::CAST_PROCS[1184] = lambda do |value| - case value - when Time then value - when String then Time.parse(value) - else raise "Unexpected time class: #{value.class} (#{value.inspect})" - end - end -end - -class UnhandledJob < Que::Job - def run - raise RuntimeError.new("Unhandled error") - end - - def handle_error(error) - destroy - end -end - -class HandledJob < Que::Job - def run - raise RuntimeError.new("Handled error") - rescue => exception - Bugsnag.notify(exception) - end -end - -case ARGV[0] -when "unhandled" - UnhandledJob.enqueue -when "handled" - HandledJob.enqueue -end diff --git a/features/fixtures/que/app/enqueue-job.rb b/features/fixtures/que/app/enqueue-job.rb new file mode 100644 index 00000000..0589274c --- /dev/null +++ b/features/fixtures/que/app/enqueue-job.rb @@ -0,0 +1,8 @@ +require_relative "setup-que" + +case ARGV[0] +when "unhandled" + UnhandledJob.enqueue +when "handled" + HandledJob.enqueue +end diff --git a/features/fixtures/que/app/setup-que.rb b/features/fixtures/que/app/setup-que.rb new file mode 100644 index 00000000..d96f53f7 --- /dev/null +++ b/features/fixtures/que/app/setup-que.rb @@ -0,0 +1,71 @@ +require 'pg' +require 'que' +require 'socket' +require 'bugsnag' +require 'active_record' + +QUE_VERSION = ENV.fetch("QUE_VERSION") + +Bugsnag.configure do |config| + puts "Configuring `api_key` to #{ENV['BUGSNAG_API_KEY']}" + config.api_key = ENV['BUGSNAG_API_KEY'] + puts "Configuring `endpoint` to #{ENV['BUGSNAG_ENDPOINT']}" + config.endpoint = ENV['BUGSNAG_ENDPOINT'] +end + +postgres_ready = false +attempts = 0 +MAX_ATTEMPTS = 10 + +until postgres_ready || attempts >= MAX_ATTEMPTS + begin + Timeout::timeout(5) { TCPSocket.new('postgres', 5432).close } + + postgres_ready = true + rescue Exception + attempts += 1 + sleep 1 + end +end + +raise 'postgres was not ready in time!' unless postgres_ready + +ActiveRecord::Base.establish_connection( + adapter: 'postgresql', + database: 'postgres', + username: 'postgres', + password: 'test_password', + host: 'postgres' +) + +Que.connection = ActiveRecord + +# Workaround a bug in que/pg +# see https://github.com/que-rb/que/issues/247 +if QUE_VERSION == '0.14' + Que::Adapters::Base::CAST_PROCS[1184] = lambda do |value| + case value + when Time then value + when String then Time.parse(value) + else raise "Unexpected time class: #{value.class} (#{value.inspect})" + end + end +end + +class UnhandledJob < Que::Job + def run + raise RuntimeError.new("Unhandled error") + end + + def handle_error(error) + destroy + end +end + +class HandledJob < Que::Job + def run + raise RuntimeError.new("Handled error") + rescue => exception + Bugsnag.notify(exception) + end +end diff --git a/features/que.feature b/features/que.feature index c143b8c6..efe0174a 100644 --- a/features/que.feature +++ b/features/que.feature @@ -2,7 +2,7 @@ Feature: Errors are delivered to Bugsnag from Que Scenario: Que will deliver unhandled errors Given I start the service "que" - When I execute the command "bundle exec ruby app.rb unhandled" in the service "que" + When I execute the command "bundle exec ruby enqueue-job.rb unhandled" in the service "que" And I wait to receive an error Then the error is valid for the error reporting API version "4.0" for the "Ruby Bugsnag Notifier" notifier And the event "unhandled" is true @@ -15,7 +15,7 @@ Scenario: Que will deliver unhandled errors Scenario: Que will deliver handled errors Given I start the service "que" - When I execute the command "bundle exec ruby app.rb handled" in the service "que" + When I execute the command "bundle exec ruby enqueue-job.rb handled" in the service "que" And I wait to receive an error Then the error is valid for the error reporting API version "4.0" for the "Ruby Bugsnag Notifier" notifier And the event "unhandled" is false