diff --git a/lib/telegram/bot/updates_controller.rb b/lib/telegram/bot/updates_controller.rb index 493d97a..8d37353 100644 --- a/lib/telegram/bot/updates_controller.rb +++ b/lib/telegram/bot/updates_controller.rb @@ -1,5 +1,6 @@ require 'abstract_controller' require 'active_support/callbacks' +require 'active_support/version' module Telegram module Bot @@ -7,6 +8,16 @@ module Telegram abstract! include AbstractController::Callbacks + # Redefine callbacks with default terminator. + if ActiveSupport.gem_version >= Gem::Version.new('5') + define_callbacks :process_action, + skip_after_callbacks_if_terminated: true + else + define_callbacks :process_action, + terminator: ->(_, result) { result == false }, + skip_after_callbacks_if_terminated: true + end + include AbstractController::Translation require 'telegram/bot/updates_controller/log_subscriber' diff --git a/spec/telegram/bot/updates_controller_spec.rb b/spec/telegram/bot/updates_controller_spec.rb index e39e761..a42609d 100644 --- a/spec/telegram/bot/updates_controller_spec.rb +++ b/spec/telegram/bot/updates_controller_spec.rb @@ -143,4 +143,45 @@ RSpec.describe Telegram::Bot::UpdatesController do it { should eq bot.username } end end + + describe '#process_action' do + subject { -> { instance.process_action(:action) } } + + context 'when callbacks are defined' do + let(:instance) { controller_class.new } + let(:controller_class) do + Class.new(described_class) do + before_action :hook + attr_reader :acted, :hooked + + def action + @acted = true + end + + private + + def hook + @hooked = true + end + end + end + + it { should change(instance, :hooked).to true } + it { should change(instance, :acted).to true } + + context 'when callback returns false' do + before do + controller_class.prepend(Module.new do + def hook + super + false + end + end) + end + + it { should change(instance, :hooked).to true } + it { should_not change(instance, :acted).from nil } + end + end + end end