slack-ruby-client 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/{integtest.yml → integration_test.yml} +6 -5
- data/.github/workflows/{rubocop.yml → lint.yml} +5 -4
- data/.github/workflows/{danger.yml → pr_lint.yml} +8 -6
- data/.github/workflows/test.yml +4 -2
- data/.gitignore +0 -1
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +8 -14
- data/.ruby-version +1 -0
- data/CHANGELOG.md +14 -0
- data/CONTRIBUTING.md +5 -4
- data/Gemfile +1 -6
- data/README.md +60 -63
- data/RELEASING.md +1 -1
- data/UPGRADING.md +28 -0
- data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
- data/bin/commands/admin_conversations.rb +12 -11
- data/bin/commands/admin_users.rb +1 -1
- data/bin/commands/admin_users_session.rb +1 -1
- data/bin/commands/apps_connections.rb +2 -2
- data/bin/commands/bookmarks.rb +1 -0
- data/bin/commands/chat.rb +9 -6
- data/bin/commands/conversations.rb +8 -6
- data/bin/commands/files.rb +24 -0
- data/bin/commands/rtm.rb +0 -15
- data/bin/commands/views.rb +4 -2
- data/bin/commands.rb +1 -0
- data/bin/slack +1 -1
- data/lib/slack/real_time/api/message.rb +3 -2
- data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
- data/lib/slack/real_time/api/typing.rb +2 -1
- data/lib/slack/real_time/client.rb +8 -26
- data/lib/slack/real_time/config.rb +3 -3
- data/lib/slack/real_time/models/channel.rb +4 -0
- data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
- data/lib/slack/real_time/models.rb +2 -1
- data/lib/slack/real_time/stores/base.rb +25 -9
- data/lib/slack/real_time/stores/starter.rb +323 -309
- data/lib/slack/real_time/stores/store.rb +265 -198
- data/lib/slack/real_time/stores.rb +1 -7
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
- data/lib/slack/web/api/endpoints/admin_conversations.rb +30 -28
- data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
- data/lib/slack/web/api/endpoints/admin_emoji.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
- data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
- data/lib/slack/web/api/endpoints/apps.rb +2 -2
- data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
- data/lib/slack/web/api/endpoints/apps_manifest.rb +6 -6
- data/lib/slack/web/api/endpoints/bookmarks.rb +10 -8
- data/lib/slack/web/api/endpoints/bots.rb +1 -1
- data/lib/slack/web/api/endpoints/calls.rb +5 -5
- data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
- data/lib/slack/web/api/endpoints/chat.rb +36 -30
- data/lib/slack/web/api/endpoints/conversations.rb +37 -33
- data/lib/slack/web/api/endpoints/dialog.rb +2 -2
- data/lib/slack/web/api/endpoints/dnd.rb +1 -1
- data/lib/slack/web/api/endpoints/files.rb +45 -8
- data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
- data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
- data/lib/slack/web/api/endpoints/migration.rb +1 -1
- data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
- data/lib/slack/web/api/endpoints/pins.rb +3 -3
- data/lib/slack/web/api/endpoints/reactions.rb +4 -4
- data/lib/slack/web/api/endpoints/reminders.rb +5 -5
- data/lib/slack/web/api/endpoints/rtm.rb +0 -23
- data/lib/slack/web/api/endpoints/search.rb +3 -3
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
- data/lib/slack/web/api/endpoints/usergroups.rb +4 -4
- data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
- data/lib/slack/web/api/endpoints/users.rb +4 -4
- data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
- data/lib/slack/web/api/endpoints/views.rb +16 -11
- data/lib/slack/web/api/endpoints/workflows.rb +4 -4
- data/lib/slack/web/api/endpoints.rb +2 -0
- data/lib/slack/web/api/errors.rb +56 -6
- data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
- data/lib/slack/web/api/mixins/users.id.rb +1 -1
- data/lib/slack/web/api/mixins/users.search.rb +2 -1
- data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
- data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
- data/lib/slack/web/api/patches/views.view-json.patch +55 -0
- data/lib/slack/web/api/templates/method.erb +1 -1
- data/lib/slack/web/config.rb +2 -2
- data/lib/tasks/real_time.rake +44 -22
- data/lib/tasks/web.rake +9 -2
- data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
- data/spec/slack/events/config_spec.rb +2 -0
- data/spec/slack/events/request_spec.rb +4 -0
- data/spec/slack/messages/formatting_spec.rb +10 -0
- data/spec/slack/real_time/api/message_spec.rb +1 -1
- data/spec/slack/real_time/api/ping_spec.rb +1 -1
- data/spec/slack/real_time/api/typing_spec.rb +1 -1
- data/spec/slack/real_time/client_spec.rb +73 -111
- data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
- data/spec/slack/real_time/event_handlers/im_spec.rb +28 -25
- data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
- data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +24 -20
- data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
- data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
- data/spec/slack/real_time/stores/store_spec.rb +50 -0
- data/spec/slack/slack_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +17 -1
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +2 -0
- data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +13 -4
- data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
- data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
- data/spec/slack/web/api/mixins/users_spec.rb +2 -0
- data/spec/slack/web/api/pagination/cursor_spec.rb +4 -0
- data/spec/slack/web/client_spec.rb +14 -4
- data/spec/support/real_time/loaded_client.rb +120 -0
- metadata +18 -35
- data/bin/commands/admin_conversations_whitelist.rb +0 -37
- data/bin/commands/apps_permissions.rb +0 -23
- data/bin/commands/apps_permissions_resources.rb +0 -15
- data/bin/commands/apps_permissions_scopes.rb +0 -13
- data/bin/commands/apps_permissions_users.rb +0 -26
- data/bin/commands/channels.rb +0 -23
- data/bin/commands/groups.rb +0 -14
- data/bin/commands/im.rb +0 -6
- data/bin/commands/mpim.rb +0 -6
- data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
- data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
- data/lib/slack/web/api/endpoints/channels.rb +0 -25
- data/lib/slack/web/api/endpoints/groups.rb +0 -13
- data/lib/slack/web/api/endpoints/im.rb +0 -13
- data/lib/slack/web/api/endpoints/mpim.rb +0 -13
- data/lib/slack/web/api/endpoints/presence.rb +0 -23
- data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
- data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
- data/spec/fixtures/slack/web/rtm_start.yml +0 -815
- data/spec/slack/real_time/rtm_start_spec.rb +0 -14
- data/spec/slack/real_time/store_spec.rb +0 -12
data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch}
RENAMED
@@ -1,11 +1,11 @@
|
|
1
1
|
diff --git a/lib/slack/web/api/endpoints/dialog.rb b/lib/slack/web/api/endpoints/dialog.rb
|
2
|
-
index
|
2
|
+
index 05475c8..a4ff4ff 100644
|
3
3
|
--- a/lib/slack/web/api/endpoints/dialog.rb
|
4
4
|
+++ b/lib/slack/web/api/endpoints/dialog.rb
|
5
|
-
@@ -
|
5
|
+
@@ -18,6 +18,12 @@ module Slack
|
6
6
|
def dialog_open(options = {})
|
7
|
-
|
8
|
-
|
7
|
+
raise ArgumentError, 'Required arguments :dialog missing' if options[:dialog].nil?
|
8
|
+
raise ArgumentError, 'Required arguments :trigger_id missing' if options[:trigger_id].nil?
|
9
9
|
+ # dialog must be passed as an encoded JSON string
|
10
10
|
+ if options.key?(:dialog)
|
11
11
|
+ dialog = options[:dialog]
|
@@ -0,0 +1,55 @@
|
|
1
|
+
diff --git a/lib/slack/web/api/endpoints/views.rb b/lib/slack/web/api/endpoints/views.rb
|
2
|
+
index cfa83a5..038c5f0 100644
|
3
|
+
--- a/lib/slack/web/api/endpoints/views.rb
|
4
|
+
+++ b/lib/slack/web/api/endpoints/views.rb
|
5
|
+
@@ -19,6 +19,12 @@ module Slack
|
6
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.open.json
|
7
|
+
def views_open(options = {})
|
8
|
+
raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
|
9
|
+
+ raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
|
10
|
+
+ if options.key?(:view)
|
11
|
+
+ view = options[:view]
|
12
|
+
+ view = JSON.dump(view) unless view.is_a?(String)
|
13
|
+
+ options = options.merge(view: view)
|
14
|
+
+ end
|
15
|
+
post('views.open', options)
|
16
|
+
end
|
17
|
+
|
18
|
+
@@ -36,6 +42,11 @@ module Slack
|
19
|
+
def views_publish(options = {})
|
20
|
+
raise ArgumentError, 'Required arguments :user_id missing' if options[:user_id].nil?
|
21
|
+
raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
|
22
|
+
+ if options.key?(:view)
|
23
|
+
+ view = options[:view]
|
24
|
+
+ view = JSON.dump(view) unless view.is_a?(String)
|
25
|
+
+ options = options.merge(view: view)
|
26
|
+
+ end
|
27
|
+
post('views.publish', options)
|
28
|
+
end
|
29
|
+
|
30
|
+
@@ -52,6 +63,12 @@ module Slack
|
31
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.push.json
|
32
|
+
def views_push(options = {})
|
33
|
+
raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
|
34
|
+
+ raise ArgumentError, 'One of :trigger_id, :interactivity_pointer is required' unless options[:trigger_id].nil? ^ options[:interactivity_pointer].nil?
|
35
|
+
+ if options.key?(:view)
|
36
|
+
+ view = options[:view]
|
37
|
+
+ view = JSON.dump(view) unless view.is_a?(String)
|
38
|
+
+ options = options.merge(view: view)
|
39
|
+
+ end
|
40
|
+
post('views.push', options)
|
41
|
+
end
|
42
|
+
|
43
|
+
@@ -70,6 +87,12 @@ module Slack
|
44
|
+
# @see https://github.com/slack-ruby/slack-api-ref/blob/master/methods/views/views.update.json
|
45
|
+
def views_update(options = {})
|
46
|
+
raise ArgumentError, 'Required arguments :view missing' if options[:view].nil?
|
47
|
+
+ raise ArgumentError, 'One of :external_id, :view_id is required' unless options[:external_id].nil? ^ options[:view_id].nil?
|
48
|
+
+ if options.key?(:view)
|
49
|
+
+ view = options[:view]
|
50
|
+
+ view = JSON.dump(view) unless view.is_a?(String)
|
51
|
+
+ options = options.merge(view: view)
|
52
|
+
+ end
|
53
|
+
post('views.update', options)
|
54
|
+
end
|
55
|
+
end
|
@@ -35,7 +35,7 @@ module Slack
|
|
35
35
|
<% end %>
|
36
36
|
def <%= group.gsub(".", "_") %>_<%= name %>(options = {})
|
37
37
|
<% data['args'].select{ |k, v| v['required'] }.each do |arg_name, arg_v| %>
|
38
|
-
|
38
|
+
raise ArgumentError, 'Required arguments :<%= arg_name %> missing' if options[:<%= arg_name %>].nil?
|
39
39
|
<% end %>
|
40
40
|
<% if data['group'] == 'groups' && data['args']['channel'] && !data['args']['channel']['desc'].include?('Can be an encoded ID, or a name.') %>
|
41
41
|
options = options.merge(channel: groups_id(options)['group']['id']) if options[:channel]
|
data/lib/slack/web/config.rb
CHANGED
@@ -24,8 +24,8 @@ module Slack
|
|
24
24
|
def reset
|
25
25
|
self.endpoint = 'https://slack.com/api/'
|
26
26
|
self.user_agent = "Slack Ruby Client/#{Slack::VERSION}"
|
27
|
-
self.ca_path =
|
28
|
-
self.ca_file =
|
27
|
+
self.ca_path = nil
|
28
|
+
self.ca_file = nil
|
29
29
|
self.token = nil
|
30
30
|
self.proxy = nil
|
31
31
|
self.logger = nil
|
data/lib/tasks/real_time.rake
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
3
|
require 'json-schema'
|
4
4
|
require 'erubis'
|
5
5
|
|
6
|
+
# largely from https://github.com/aki017/slack-ruby-gem
|
6
7
|
namespace :slack do
|
7
8
|
namespace :real_time do
|
8
9
|
namespace :api do
|
@@ -16,39 +17,60 @@ namespace :slack do
|
|
16
17
|
name = File.basename(path, '.json')
|
17
18
|
parsed = JSON.parse(File.read(path))
|
18
19
|
JSON::Validator.validate(event_schema, parsed, insert_defaults: true)
|
19
|
-
next if
|
20
|
+
next if name == 'message'
|
20
21
|
|
21
22
|
result[name] = parsed
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
|
25
|
+
hook_template = Erubis::Eruby.new(File.read('lib/slack/real_time/api/templates/event_handler.erb'))
|
26
26
|
Dir.glob('lib/slack/real_time/stores/**/*.rb').each do |store_file|
|
27
27
|
next if File.basename(store_file) == 'base.rb'
|
28
28
|
|
29
|
-
STDOUT.write "#{File.basename(store_file)}:"
|
29
|
+
STDOUT.write "#{File.basename(store_file)}: "
|
30
30
|
|
31
31
|
store_file_contents = File.read(store_file)
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
33
|
+
unless store_file_contents.include?(REAL_TIME_EVENTS_MARKER)
|
34
|
+
puts "missing '#{REAL_TIME_EVENTS_MARKER}' line; skipping."
|
35
|
+
next
|
36
|
+
end
|
37
|
+
|
38
|
+
# Extract current hook implementations from the store class
|
39
|
+
hooks = {}
|
40
|
+
hook_matcher = /
|
41
|
+
(?:^[[:blank:]]*\R)+ # At least one blank line
|
42
|
+
(?:^[[:blank:]]*\#.*\R)* # Optional preceding comments
|
43
|
+
(?<hook> # on :event do |data|
|
44
|
+
^(?<padding>[[:blank:]]+)\#\ *on\ :(?<event>\w+)\ do\ \|[\w, ]+\|\ *\R # Commented hook
|
45
|
+
(?>^\k<padding>\#.*\R)* # Extra comments
|
46
|
+
|
|
47
|
+
^(?<padding>[[:blank:]]+)on\ :(?<event>\w+)\ do\ \|[\w, ]+\|\ *\R # Active hook
|
48
|
+
[\s\S]*? # Inside block
|
49
|
+
(?>^\k<padding>end[[:blank:]]*\R) # End of block
|
50
|
+
)
|
51
|
+
/x
|
52
|
+
store_file_contents.gsub!(hook_matcher) do
|
53
|
+
hook, event = Regexp.last_match.values_at(:hook, :event)
|
54
|
+
hooks[event] = hook
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
# Render latest event documentation with current hook implementations
|
59
|
+
rendered_hooks = events.sort.map do |event_name, event_data|
|
60
|
+
STDOUT.write(hooks.key?(event_name) ? '.' : 'x')
|
61
|
+
|
62
|
+
hook_template.result(
|
63
|
+
name: event_data['name'],
|
64
|
+
desc: event_data['desc'],
|
65
|
+
hook: hooks[event_name]
|
66
|
+
).rstrip
|
50
67
|
end
|
51
68
|
|
69
|
+
# Insert updated event hooks under RealTime Events marker
|
70
|
+
store_file_contents.gsub!(
|
71
|
+
REAL_TIME_EVENTS_MARKER,
|
72
|
+
[REAL_TIME_EVENTS_MARKER, *rendered_hooks].join("\n\n")
|
73
|
+
)
|
52
74
|
File.write(store_file, store_file_contents)
|
53
75
|
|
54
76
|
puts ' done.'
|
data/lib/tasks/web.rake
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
3
|
require 'json-schema'
|
4
4
|
require 'erubis'
|
5
5
|
require 'active_support'
|
6
6
|
require 'active_support/core_ext'
|
7
7
|
|
8
|
+
# largely from https://github.com/aki017/slack-ruby-gem
|
8
9
|
namespace :slack do
|
9
10
|
namespace :web do
|
10
11
|
namespace :api do
|
@@ -39,11 +40,17 @@ namespace :slack do
|
|
39
40
|
result[prefix][name] = parsed
|
40
41
|
end
|
41
42
|
|
43
|
+
# Start with a fresh slate
|
44
|
+
Dir.glob('lib/slack/web/api/endpoints/*.rb').each { |file| File.delete(file) }
|
45
|
+
Dir.glob('spec/slack/web/api/endpoints/*_spec.rb').each { |file| File.delete(file) }
|
46
|
+
Dir.glob('bin/commands/*.rb').each { |file| File.delete(file) }
|
47
|
+
|
42
48
|
method_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/method.erb'))
|
43
49
|
method_spec_template =
|
44
50
|
Erubis::Eruby.new(File.read('lib/slack/web/api/templates/method_spec.erb'))
|
45
51
|
command_template = Erubis::Eruby.new(File.read('lib/slack/web/api/templates/command.erb'))
|
46
|
-
|
52
|
+
|
53
|
+
data.each.with_index(1) do |(group, names), index|
|
47
54
|
printf "%2d/%2d %10s %s\n", index, data.size, group, names.keys
|
48
55
|
# method
|
49
56
|
snaked_group = group.tr('.', '_')
|
@@ -304,4 +304,88 @@ http_interactions:
|
|
304
304
|
encoding: UTF-8
|
305
305
|
string: '{"ok":false,"error":"invalid_array_arg"}'
|
306
306
|
recorded_at: Sat, 19 Jan 2019 21:25:48 GMT
|
307
|
-
|
307
|
+
- request:
|
308
|
+
method: post
|
309
|
+
uri: https://slack.com/api/rtm.connect
|
310
|
+
body:
|
311
|
+
encoding: UTF-8
|
312
|
+
string: presence_sub=true
|
313
|
+
headers:
|
314
|
+
Accept:
|
315
|
+
- application/json; charset=utf-8
|
316
|
+
User-Agent:
|
317
|
+
- Slack Ruby Client/2.0.0
|
318
|
+
Authorization:
|
319
|
+
- Bearer <SLACK_API_TOKEN>
|
320
|
+
Content-Type:
|
321
|
+
- application/x-www-form-urlencoded
|
322
|
+
Accept-Encoding:
|
323
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
324
|
+
response:
|
325
|
+
status:
|
326
|
+
code: 200
|
327
|
+
message: OK
|
328
|
+
headers:
|
329
|
+
Date:
|
330
|
+
- Sun, 25 Sep 2022 22:32:50 GMT
|
331
|
+
Server:
|
332
|
+
- Apache
|
333
|
+
X-Powered-By:
|
334
|
+
- HHVM/4.153.1
|
335
|
+
Access-Control-Allow-Origin:
|
336
|
+
- "*"
|
337
|
+
Referrer-Policy:
|
338
|
+
- no-referrer
|
339
|
+
X-Slack-Backend:
|
340
|
+
- r
|
341
|
+
X-Slack-Unique-Id:
|
342
|
+
- YzDXEnlUBjX0uWkT8kmCzwAAABM
|
343
|
+
Strict-Transport-Security:
|
344
|
+
- max-age=31536000; includeSubDomains; preload
|
345
|
+
Access-Control-Allow-Headers:
|
346
|
+
- slack-route, x-slack-version-ts, x-b3-traceid, x-b3-spanid, x-b3-parentspanid,
|
347
|
+
x-b3-sampled, x-b3-flags
|
348
|
+
Access-Control-Expose-Headers:
|
349
|
+
- x-slack-req-id, retry-after
|
350
|
+
X-Oauth-Scopes:
|
351
|
+
- identify,bot:basic
|
352
|
+
X-Accepted-Oauth-Scopes:
|
353
|
+
- rtm:stream,client
|
354
|
+
Expires:
|
355
|
+
- Mon, 26 Jul 1997 05:00:00 GMT
|
356
|
+
Cache-Control:
|
357
|
+
- private, no-cache, no-store, must-revalidate
|
358
|
+
Pragma:
|
359
|
+
- no-cache
|
360
|
+
X-Xss-Protection:
|
361
|
+
- '0'
|
362
|
+
X-Content-Type-Options:
|
363
|
+
- nosniff
|
364
|
+
X-Slack-Req-Id:
|
365
|
+
- 20417f9da55172a329704fca8e35f683
|
366
|
+
Vary:
|
367
|
+
- Accept-Encoding
|
368
|
+
Content-Length:
|
369
|
+
- '275'
|
370
|
+
Content-Type:
|
371
|
+
- application/json; charset=utf-8
|
372
|
+
X-Envoy-Upstream-Service-Time:
|
373
|
+
- '116'
|
374
|
+
X-Backend:
|
375
|
+
- main_normal main_bedrock_normal_with_overflow main_canary_with_overflow main_bedrock_canary_with_overflow
|
376
|
+
main_control_with_overflow main_bedrock_control_with_overflow
|
377
|
+
X-Server:
|
378
|
+
- slack-www-hhvm-main-iad-fbwt
|
379
|
+
X-Slack-Shared-Secret-Outcome:
|
380
|
+
- no-match
|
381
|
+
Via:
|
382
|
+
- envoy-www-iad-twh3, envoy-edge-pdx-hvfy
|
383
|
+
X-Edge-Backend:
|
384
|
+
- envoy-www
|
385
|
+
X-Slack-Edge-Shared-Secret-Outcome:
|
386
|
+
- no-match
|
387
|
+
body:
|
388
|
+
encoding: UTF-8
|
389
|
+
string: '{"ok":true,"url":"wss:\/\/wss-primary.slack.com\/websocket\/IDugmjBU5vPyDN1rGavpMHB1CdAznuJDyHl3pqAHz_DSflTYmCyuPIxH1vwqvz3aIXhyarUZMxyWiJD7zako2Wqc_poO8uiP3i6teabXYTA4vx4Hu2pa9k9PACV1apgYJFRU_iw4g2c5qeo=\/2","team":{"id":"T04KB5WQH","name":"dblock","domain":"dblockdotorg"},"self":{"id":"U0J1GAHN1","name":"travis-ci"}}'
|
390
|
+
recorded_at: Sun, 25 Sep 2022 22:32:50 GMT
|
391
|
+
recorded_with: VCR 6.1.0
|
@@ -14,9 +14,11 @@ RSpec.describe Slack::Events::Config do
|
|
14
14
|
it 'defaults signing secret to ENV[SLACK_SIGNING_SECRET]' do
|
15
15
|
expect(Slack::Events.config.signing_secret).to eq 'secret'
|
16
16
|
end
|
17
|
+
|
17
18
|
it 'defaults signature expiration to 5 minutes' do
|
18
19
|
expect(Slack::Events.config.signature_expires_in).to eq 5 * 60
|
19
20
|
end
|
21
|
+
|
20
22
|
context 'configured' do
|
21
23
|
before do
|
22
24
|
Slack::Events.configure do |config|
|
@@ -101,6 +101,7 @@ RSpec.describe Slack::Events::Request do
|
|
101
101
|
expect(request).to be_valid
|
102
102
|
expect(request).not_to be_expired
|
103
103
|
end
|
104
|
+
|
104
105
|
it 'does not raise an error and returns true' do
|
105
106
|
expect(request.verify!).to be true
|
106
107
|
end
|
@@ -115,6 +116,7 @@ RSpec.describe Slack::Events::Request do
|
|
115
116
|
expect(request).to be_valid
|
116
117
|
expect(request).to be_expired
|
117
118
|
end
|
119
|
+
|
118
120
|
it 'raises an error on verify!' do
|
119
121
|
expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
|
120
122
|
end
|
@@ -129,6 +131,7 @@ RSpec.describe Slack::Events::Request do
|
|
129
131
|
expect(request).to be_valid
|
130
132
|
expect(request).not_to be_expired
|
131
133
|
end
|
134
|
+
|
132
135
|
it 'does not raise an error on verify!' do
|
133
136
|
expect(request.verify!).to be true
|
134
137
|
end
|
@@ -143,6 +146,7 @@ RSpec.describe Slack::Events::Request do
|
|
143
146
|
expect(request).to be_valid
|
144
147
|
expect(request).to be_expired
|
145
148
|
end
|
149
|
+
|
146
150
|
it 'raises an error on verify!' do
|
147
151
|
expect { request.verify! }.to raise_error Slack::Events::Request::TimestampExpired
|
148
152
|
end
|
@@ -10,30 +10,37 @@ describe Slack::Messages::Formatting do
|
|
10
10
|
it 'plain text' do
|
11
11
|
expect(formatting.unescape('plain text')).to eq 'plain text'
|
12
12
|
end
|
13
|
+
|
13
14
|
it 'decodes an HTML-encoded message' do
|
14
15
|
expect(formatting.unescape('Hello & <world>')).to eq 'Hello & <world>'
|
15
16
|
end
|
17
|
+
|
16
18
|
it 'unescapes a user reference' do
|
17
19
|
expect(formatting.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to(
|
18
20
|
eq('Hey @bob, did you see my file?')
|
19
21
|
)
|
20
22
|
end
|
23
|
+
|
21
24
|
it 'unescapes a user reference without a name' do
|
22
25
|
expect(formatting.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
|
23
26
|
end
|
27
|
+
|
24
28
|
it 'unescapes a URL without text' do
|
25
29
|
expect(formatting.unescape('This message contains a URL <http://foo.com/>')).to(
|
26
30
|
eq('This message contains a URL http://foo.com/')
|
27
31
|
)
|
28
32
|
end
|
33
|
+
|
29
34
|
it 'unescapes a URL with text' do
|
30
35
|
expect(formatting.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to(
|
31
36
|
eq('So does this one: www.foo.com')
|
32
37
|
)
|
33
38
|
end
|
39
|
+
|
34
40
|
it 'removes mailto' do
|
35
41
|
expect(formatting.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
|
36
42
|
end
|
43
|
+
|
37
44
|
it 'unlinkifies references' do
|
38
45
|
expect(
|
39
46
|
formatting.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')
|
@@ -41,12 +48,15 @@ describe Slack::Messages::Formatting do
|
|
41
48
|
eq('Hello @bob, say hi to @everyone in #general')
|
42
49
|
)
|
43
50
|
end
|
51
|
+
|
44
52
|
it 'can handle a lone >' do
|
45
53
|
expect(formatting.unescape('Hello <@U123|bob> > file.txt')).to eq 'Hello @bob > file.txt'
|
46
54
|
end
|
55
|
+
|
47
56
|
it 'unescapes a double smart quote' do
|
48
57
|
expect(formatting.unescape('“hello”')).to eq '"hello"'
|
49
58
|
end
|
59
|
+
|
50
60
|
it 'unescapes a single smart quote' do
|
51
61
|
expect(formatting.unescape('‘hello’')).to eq "'hello'"
|
52
62
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/
|
4
|
+
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
|
5
5
|
include_context 'connected client'
|
6
6
|
|
7
7
|
describe '#message' do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/
|
4
|
+
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
|
5
5
|
include_context 'connected client'
|
6
6
|
|
7
7
|
describe '#ping' do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/
|
4
|
+
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
|
5
5
|
include_context 'connected client'
|
6
6
|
|
7
7
|
describe '#typing' do
|