slack-ruby-client 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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