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.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{integtest.yml → integration_test.yml} +6 -5
  3. data/.github/workflows/{rubocop.yml → lint.yml} +5 -4
  4. data/.github/workflows/{danger.yml → pr_lint.yml} +8 -6
  5. data/.github/workflows/test.yml +4 -2
  6. data/.gitignore +0 -1
  7. data/.rubocop.yml +4 -0
  8. data/.rubocop_todo.yml +8 -14
  9. data/.ruby-version +1 -0
  10. data/CHANGELOG.md +14 -0
  11. data/CONTRIBUTING.md +5 -4
  12. data/Gemfile +1 -6
  13. data/README.md +60 -63
  14. data/RELEASING.md +1 -1
  15. data/UPGRADING.md +28 -0
  16. data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
  17. data/bin/commands/admin_conversations.rb +12 -11
  18. data/bin/commands/admin_users.rb +1 -1
  19. data/bin/commands/admin_users_session.rb +1 -1
  20. data/bin/commands/apps_connections.rb +2 -2
  21. data/bin/commands/bookmarks.rb +1 -0
  22. data/bin/commands/chat.rb +9 -6
  23. data/bin/commands/conversations.rb +8 -6
  24. data/bin/commands/files.rb +24 -0
  25. data/bin/commands/rtm.rb +0 -15
  26. data/bin/commands/views.rb +4 -2
  27. data/bin/commands.rb +1 -0
  28. data/bin/slack +1 -1
  29. data/lib/slack/real_time/api/message.rb +3 -2
  30. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  31. data/lib/slack/real_time/api/typing.rb +2 -1
  32. data/lib/slack/real_time/client.rb +8 -26
  33. data/lib/slack/real_time/config.rb +3 -3
  34. data/lib/slack/real_time/models/channel.rb +4 -0
  35. data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
  36. data/lib/slack/real_time/models.rb +2 -1
  37. data/lib/slack/real_time/stores/base.rb +25 -9
  38. data/lib/slack/real_time/stores/starter.rb +323 -309
  39. data/lib/slack/real_time/stores/store.rb +265 -198
  40. data/lib/slack/real_time/stores.rb +1 -7
  41. data/lib/slack/version.rb +1 -1
  42. data/lib/slack/web/api/endpoints/admin_analytics.rb +1 -1
  43. data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
  44. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +1 -1
  45. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  46. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
  47. data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
  48. data/lib/slack/web/api/endpoints/admin_conversations.rb +30 -28
  49. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
  50. data/lib/slack/web/api/endpoints/admin_emoji.rb +7 -7
  51. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
  52. data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
  53. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
  54. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
  55. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
  56. data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
  57. data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
  58. data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
  59. data/lib/slack/web/api/endpoints/apps.rb +2 -2
  60. data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
  61. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
  62. data/lib/slack/web/api/endpoints/apps_manifest.rb +6 -6
  63. data/lib/slack/web/api/endpoints/bookmarks.rb +10 -8
  64. data/lib/slack/web/api/endpoints/bots.rb +1 -1
  65. data/lib/slack/web/api/endpoints/calls.rb +5 -5
  66. data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
  67. data/lib/slack/web/api/endpoints/chat.rb +36 -30
  68. data/lib/slack/web/api/endpoints/conversations.rb +37 -33
  69. data/lib/slack/web/api/endpoints/dialog.rb +2 -2
  70. data/lib/slack/web/api/endpoints/dnd.rb +1 -1
  71. data/lib/slack/web/api/endpoints/files.rb +45 -8
  72. data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
  73. data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
  74. data/lib/slack/web/api/endpoints/migration.rb +1 -1
  75. data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
  76. data/lib/slack/web/api/endpoints/pins.rb +3 -3
  77. data/lib/slack/web/api/endpoints/reactions.rb +4 -4
  78. data/lib/slack/web/api/endpoints/reminders.rb +5 -5
  79. data/lib/slack/web/api/endpoints/rtm.rb +0 -23
  80. data/lib/slack/web/api/endpoints/search.rb +3 -3
  81. data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
  82. data/lib/slack/web/api/endpoints/usergroups.rb +4 -4
  83. data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
  84. data/lib/slack/web/api/endpoints/users.rb +4 -4
  85. data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
  86. data/lib/slack/web/api/endpoints/views.rb +16 -11
  87. data/lib/slack/web/api/endpoints/workflows.rb +4 -4
  88. data/lib/slack/web/api/endpoints.rb +2 -0
  89. data/lib/slack/web/api/errors.rb +56 -6
  90. data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
  91. data/lib/slack/web/api/mixins/users.id.rb +1 -1
  92. data/lib/slack/web/api/mixins/users.search.rb +2 -1
  93. data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
  94. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  95. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  96. data/lib/slack/web/api/templates/method.erb +1 -1
  97. data/lib/slack/web/config.rb +2 -2
  98. data/lib/tasks/real_time.rake +44 -22
  99. data/lib/tasks/web.rake +9 -2
  100. data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
  101. data/spec/slack/events/config_spec.rb +2 -0
  102. data/spec/slack/events/request_spec.rb +4 -0
  103. data/spec/slack/messages/formatting_spec.rb +10 -0
  104. data/spec/slack/real_time/api/message_spec.rb +1 -1
  105. data/spec/slack/real_time/api/ping_spec.rb +1 -1
  106. data/spec/slack/real_time/api/typing_spec.rb +1 -1
  107. data/spec/slack/real_time/client_spec.rb +73 -111
  108. data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
  109. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
  110. data/spec/slack/real_time/event_handlers/im_spec.rb +28 -25
  111. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
  112. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +24 -20
  113. data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
  114. data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
  115. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  116. data/spec/slack/slack_spec.rb +1 -0
  117. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  118. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +17 -1
  119. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +2 -0
  120. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +13 -4
  121. data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
  122. data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
  123. data/spec/slack/web/api/mixins/users_spec.rb +2 -0
  124. data/spec/slack/web/api/pagination/cursor_spec.rb +4 -0
  125. data/spec/slack/web/client_spec.rb +14 -4
  126. data/spec/support/real_time/loaded_client.rb +120 -0
  127. metadata +18 -35
  128. data/bin/commands/admin_conversations_whitelist.rb +0 -37
  129. data/bin/commands/apps_permissions.rb +0 -23
  130. data/bin/commands/apps_permissions_resources.rb +0 -15
  131. data/bin/commands/apps_permissions_scopes.rb +0 -13
  132. data/bin/commands/apps_permissions_users.rb +0 -26
  133. data/bin/commands/channels.rb +0 -23
  134. data/bin/commands/groups.rb +0 -14
  135. data/bin/commands/im.rb +0 -6
  136. data/bin/commands/mpim.rb +0 -6
  137. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
  138. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
  139. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
  140. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
  141. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
  142. data/lib/slack/web/api/endpoints/channels.rb +0 -25
  143. data/lib/slack/web/api/endpoints/groups.rb +0 -13
  144. data/lib/slack/web/api/endpoints/im.rb +0 -13
  145. data/lib/slack/web/api/endpoints/mpim.rb +0 -13
  146. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  147. data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
  148. data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
  149. data/spec/fixtures/slack/web/rtm_start.yml +0 -815
  150. data/spec/slack/real_time/rtm_start_spec.rb +0 -14
  151. data/spec/slack/real_time/store_spec.rb +0 -12
@@ -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 01f9dfd..d017adf 100644
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
- @@ -17,6 +17,12 @@ module Slack
5
+ @@ -18,6 +18,12 @@ module Slack
6
6
  def dialog_open(options = {})
7
- throw ArgumentError.new('Required arguments :dialog missing') if options[:dialog].nil?
8
- throw ArgumentError.new('Required arguments :trigger_id missing') if options[:trigger_id].nil?
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
- throw ArgumentError.new('Required arguments :<%= arg_name %> missing') if options[:<%= arg_name %>].nil?
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]
@@ -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 = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_DIR : nil
28
- self.ca_file = defined?(OpenSSL) ? OpenSSL::X509::DEFAULT_CERT_FILE : nil
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
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
- # largely from https://github.com/aki017/slack-ruby-gem
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 %w[message hello].include?(name)
20
+ next if name == 'message'
20
21
 
21
22
  result[name] = parsed
22
23
  end
23
24
 
24
- event_handler_template =
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
- events.each_pair do |event_name, event_data|
34
- if store_file_contents.include?("on :#{event_name} do")
35
- STDOUT.write('.')
36
- else
37
- STDOUT.write('x')
38
- rendered_event_handler = event_handler_template.result(
39
- name: event_data['name'],
40
- desc: event_data['desc']
41
- )
42
-
43
- store_file_contents.gsub!(
44
- REAL_TIME_EVENTS_MARKER,
45
- REAL_TIME_EVENTS_MARKER +
46
- "\n\n" +
47
- rendered_event_handler.rstrip
48
- )
49
- end
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
- # largely from https://github.com/aki017/slack-ruby-gem
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
- data.each_with_index do |(group, names), index|
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
- recorded_with: VCR 6.0.0
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 &amp; &lt;world&gt;')).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 &gt;' do
45
53
  expect(formatting.unescape('Hello <@U123|bob> &gt; 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/rtm_start' } do
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/rtm_start' } do
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/rtm_start' } do
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