From 7e02f4ef3baacc50f0a503b1fc6497a67d852ba2 Mon Sep 17 00:00:00 2001 From: Sri Prasanna Date: Thu, 26 Jan 2023 17:30:16 +0000 Subject: [PATCH 1/3] Adding support to handle block action id by interactive handler --- .github/workflows/run_tests.yml | 4 +- app/controllers/slackify/slack_controller.rb | 16 +++--- slackify.gemspec | 1 + test/dummy/config/application.rb | 4 +- test/integration/slack_controller_test.rb | 6 +++ test/slack_test_helper.rb | 51 ++++++++++++++++++++ 6 files changed, 73 insertions(+), 9 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 93fb4ba..d35a7fc 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -9,10 +9,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up Ruby 2.6 is + - name: Set up Ruby 3.1.3 is uses: actions/setup-ruby@v1 with: - ruby-version: 2.6.x + ruby-version: 3.1.3 - uses: actions/cache@v1 with: path: vendor/bundle diff --git a/app/controllers/slackify/slack_controller.rb b/app/controllers/slackify/slack_controller.rb index a7979f9..52988bc 100644 --- a/app/controllers/slackify/slack_controller.rb +++ b/app/controllers/slackify/slack_controller.rb @@ -21,12 +21,16 @@ def event_callback def interactive_callback parsed_payload = JSON.parse(params[:payload]) - - callback_id = if parsed_payload.key?('view') - parsed_payload.dig('view', 'callback_id') - else - parsed_payload['callback_id'] - end + if parsed_payload['type'] == 'interactive_message' + callback_id = if parsed_payload.key?('view') + parsed_payload.dig('view', 'callback_id') + else + parsed_payload['callback_id'] + end + + elsif parsed_payload['type'] == 'block_actions' + callback_id = parsed_payload['actions'].first['action_id'] + end response = handler_from_callback_id(callback_id).call(parsed_payload) if !response.nil? diff --git a/slackify.gemspec b/slackify.gemspec index 695ba96..e24a683 100644 --- a/slackify.gemspec +++ b/slackify.gemspec @@ -24,4 +24,5 @@ Gem::Specification.new do |s| s.add_development_dependency 'mocha' s.add_development_dependency 'rake' s.add_development_dependency 'rubocop' + s.add_development_dependency 'sprockets-rails' end diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb index a819b6f..2108dac 100644 --- a/test/dummy/config/application.rb +++ b/test/dummy/config/application.rb @@ -16,8 +16,10 @@ module Dummy class Application < Rails::Application + load 'test/dummy/app/models/user_param.rb' + load 'test/dummy/app/handlers/dummy_handler.rb' # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 5.2 + # config.load_defaults 5.2 # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers diff --git a/test/integration/slack_controller_test.rb b/test/integration/slack_controller_test.rb index 34e9951..95fa4e7 100644 --- a/test/integration/slack_controller_test.rb +++ b/test/integration/slack_controller_test.rb @@ -79,6 +79,12 @@ class SlackControllerTest < ActionDispatch::IntegrationTest post @interactive_callback_url, as: :json, headers: build_webhook_headers(params), params: params end + test "#interactive_callback call the proper handler when action_id is sent" do + DummyHandler.expects(:cool_command).once + params = build_slack_interactive_action + post @interactive_callback_url, as: :json, headers: build_webhook_headers(params), params: params + end + test "#interactive_callback returns the proper following blocks" do # Setting up the Slack Ruby Client Mock options = { view: { callback_id: "dummy_handler#button_clicked" }, actions: [{ "name" => "btn1", "value" => "btn1", "type" => "button" }] } diff --git a/test/slack_test_helper.rb b/test/slack_test_helper.rb index ce862ca..f602f4c 100644 --- a/test/slack_test_helper.rb +++ b/test/slack_test_helper.rb @@ -76,6 +76,57 @@ def build_slack_interactive_callback(**options) } end + def build_slack_interactive_action(**options) + { + payload: { + "type": "block_actions", + "user": { + "id": "USER_ID", + "username": "USERNAME", + "name": "USERNAME", + "team_id": "TEAM_ID" + }, + "api_app_id": "API_APP_ID", + "token": "TOKEN", + "container": { + "type": "message", + "message_ts": "1674752364.004700", + "channel_id": "CHANNEL_ID", + "is_ephemeral": true + }, + "trigger_id": "TRIGGER_ID", + "team": { + "id": "TEAM_ID", + "domain": "TEAM_DOMAIN" + }, + "is_enterprise_install": false, + "channel": { + "id": "CHANNEL_ID", + "name": "CHANNEL_NAME" + }, + "state": { + "values": {} + }, + "response_url": "https://hooks.slack.com/actions/ABC/IJK/XYZ", + "actions": [ + { + "action_id": "dummy_handler#cool_command", + "block_id": "BLOCK_ID", + "text": { + "type": "plain_text", + "text": "Click Me", + "emoji": true + }, + "value": "click_me_123", + "style": "primary", + "type": "button", + "action_ts": "1674752368.385612" + } + ] + }.deep_merge(options).to_json, + } + end + def build_legacy_slack_interactive_callback(**options) { payload: { From 118bb4cb0ecf680a075bd11881c3d4969b38773e Mon Sep 17 00:00:00 2001 From: Sri Prasanna Date: Thu, 26 Jan 2023 18:36:39 +0000 Subject: [PATCH 2/3] Making interactive_message as the default type --- app/controllers/slackify/slack_controller.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/controllers/slackify/slack_controller.rb b/app/controllers/slackify/slack_controller.rb index 52988bc..93f374b 100644 --- a/app/controllers/slackify/slack_controller.rb +++ b/app/controllers/slackify/slack_controller.rb @@ -21,16 +21,13 @@ def event_callback def interactive_callback parsed_payload = JSON.parse(params[:payload]) - if parsed_payload['type'] == 'interactive_message' - callback_id = if parsed_payload.key?('view') - parsed_payload.dig('view', 'callback_id') - else - parsed_payload['callback_id'] - end - - elsif parsed_payload['type'] == 'block_actions' - callback_id = parsed_payload['actions'].first['action_id'] - end + callback_id = if parsed_payload['type'] == 'block_actions' + parsed_payload['actions'].first['action_id'] + elsif parsed_payload.key?('view') + parsed_payload.dig('view', 'callback_id') + else + parsed_payload['callback_id'] + end response = handler_from_callback_id(callback_id).call(parsed_payload) if !response.nil? From 8cb1da00dac8b11031b3c2ad4efcba18515eb362 Mon Sep 17 00:00:00 2001 From: Sri Prasanna Date: Thu, 26 Jan 2023 18:38:48 +0000 Subject: [PATCH 3/3] Bumping up version --- slackify.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slackify.gemspec b/slackify.gemspec index e24a683..7db9023 100644 --- a/slackify.gemspec +++ b/slackify.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |s| s.name = 'slackify' - s.version = '0.4.2' + s.version = '0.4.3' s.date = '2019-12-11' s.summary = 'Slackbot framework for Rails using the Events API' s.description = 'Slackbot framework for Rails using the Events API. Supports events, interactive messages and slash commands.'