slack-ruby-client 1.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (239) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/integration_test.yml +45 -0
  4. data/.github/workflows/lint.yml +14 -0
  5. data/.github/workflows/pr_lint.yml +21 -0
  6. data/.github/workflows/test.yml +37 -0
  7. data/.gitignore +4 -3
  8. data/.rubocop.yml +6 -1
  9. data/.rubocop_todo.yml +88 -34
  10. data/.ruby-version +1 -0
  11. data/CHANGELOG.md +36 -0
  12. data/CONTRIBUTING.md +6 -5
  13. data/Gemfile +13 -1
  14. data/Gemfile.danger +6 -0
  15. data/README.md +78 -76
  16. data/RELEASING.md +2 -2
  17. data/SECURITY.md +9 -0
  18. data/UPGRADING.md +28 -0
  19. data/bin/commands/admin_analytics.rb +16 -10
  20. data/bin/commands/admin_apps.rb +48 -42
  21. data/bin/commands/admin_apps_approved.rb +17 -11
  22. data/bin/commands/admin_apps_requests.rb +28 -11
  23. data/bin/commands/admin_apps_restricted.rb +17 -11
  24. data/bin/commands/admin_audit_anomaly_allow.rb +29 -0
  25. data/bin/commands/admin_auth_policy.rb +37 -31
  26. data/bin/commands/admin_barriers.rb +44 -38
  27. data/bin/commands/admin_conversations.rb +221 -163
  28. data/bin/commands/admin_conversations_ekm.rb +17 -11
  29. data/bin/commands/admin_conversations_restrictAccess.rb +35 -29
  30. data/bin/commands/admin_emoji.rb +50 -44
  31. data/bin/commands/admin_inviteRequests.rb +34 -28
  32. data/bin/commands/admin_inviteRequests_approved.rb +16 -10
  33. data/bin/commands/admin_inviteRequests_denied.rb +16 -10
  34. data/bin/commands/admin_roles.rb +46 -0
  35. data/bin/commands/admin_teams.rb +26 -20
  36. data/bin/commands/admin_teams_admins.rb +16 -10
  37. data/bin/commands/admin_teams_owners.rb +16 -10
  38. data/bin/commands/admin_teams_settings.rb +59 -53
  39. data/bin/commands/admin_usergroups.rb +45 -39
  40. data/bin/commands/admin_users.rb +91 -85
  41. data/bin/commands/admin_users_session.rb +72 -66
  42. data/bin/commands/admin_users_unsupportedVersions.rb +21 -0
  43. data/bin/commands/api.rb +14 -8
  44. data/bin/commands/apps.rb +15 -9
  45. data/bin/commands/apps_connections.rb +13 -7
  46. data/bin/commands/apps_event_authorizations.rb +16 -10
  47. data/bin/commands/apps_manifest.rb +48 -41
  48. data/bin/commands/auth.rb +21 -15
  49. data/bin/commands/auth_teams.rb +16 -10
  50. data/bin/commands/bookmarks.rb +59 -0
  51. data/bin/commands/bots.rb +15 -9
  52. data/bin/commands/calls.rb +49 -43
  53. data/bin/commands/calls_participants.rb +24 -18
  54. data/bin/commands/chat.rb +150 -141
  55. data/bin/commands/chat_scheduledMessages.rb +19 -13
  56. data/bin/commands/conversations.rb +233 -225
  57. data/bin/commands/dialog.rb +15 -9
  58. data/bin/commands/dnd.rb +46 -40
  59. data/bin/commands/emoji.rb +14 -7
  60. data/bin/commands/files.rb +112 -83
  61. data/bin/commands/files_comments.rb +15 -9
  62. data/bin/commands/files_remote.rb +73 -67
  63. data/bin/commands/functions_workflows_steps.rb +22 -0
  64. data/bin/commands/functions_workflows_steps_responses.rb +22 -0
  65. data/bin/commands/migration.rb +16 -10
  66. data/bin/commands/oauth.rb +18 -12
  67. data/bin/commands/oauth_v2.rb +28 -22
  68. data/bin/commands/openid_connect.rb +26 -20
  69. data/bin/commands/pins.rb +33 -26
  70. data/bin/commands/reactions.rb +52 -46
  71. data/bin/commands/reminders.rb +53 -47
  72. data/bin/commands/rtm.rb +15 -24
  73. data/bin/commands/search.rb +43 -37
  74. data/bin/commands/stars.rb +38 -32
  75. data/bin/commands/team.rb +47 -38
  76. data/bin/commands/team_billing.rb +13 -7
  77. data/bin/commands/team_preferences.rb +13 -7
  78. data/bin/commands/team_profile.rb +14 -8
  79. data/bin/commands/tooling_tokens.rb +14 -8
  80. data/bin/commands/usergroups.rb +64 -58
  81. data/bin/commands/usergroups_users.rb +27 -21
  82. data/bin/commands/users.rb +111 -105
  83. data/bin/commands/users_admin.rb +28 -22
  84. data/bin/commands/users_prefs.rb +13 -7
  85. data/bin/commands/users_profile.rb +26 -20
  86. data/bin/commands/views.rb +47 -39
  87. data/bin/commands/workflows.rb +36 -30
  88. data/bin/slack +48 -43
  89. data/lib/slack/real_time/api/message.rb +3 -2
  90. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  91. data/lib/slack/real_time/api/typing.rb +2 -1
  92. data/lib/slack/real_time/client.rb +10 -28
  93. data/lib/slack/real_time/config.rb +3 -3
  94. data/lib/slack/real_time/models/channel.rb +4 -0
  95. data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
  96. data/lib/slack/real_time/models.rb +2 -1
  97. data/lib/slack/real_time/stores/base.rb +25 -9
  98. data/lib/slack/real_time/stores/starter.rb +323 -309
  99. data/lib/slack/real_time/stores/store.rb +265 -198
  100. data/lib/slack/real_time/stores.rb +1 -7
  101. data/lib/slack/version.rb +1 -1
  102. data/lib/slack/web/api/endpoints/admin_analytics.rb +2 -2
  103. data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
  104. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +16 -0
  105. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  106. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
  107. data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
  108. data/lib/slack/web/api/endpoints/admin_conversations.rb +110 -28
  109. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
  110. data/lib/slack/web/api/endpoints/admin_emoji.rb +9 -9
  111. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
  112. data/lib/slack/web/api/endpoints/admin_roles.rb +73 -0
  113. data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
  114. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
  115. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
  116. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
  117. data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
  118. data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
  119. data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
  120. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  121. data/lib/slack/web/api/endpoints/apps.rb +2 -2
  122. data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
  123. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
  124. data/lib/slack/web/api/endpoints/apps_manifest.rb +8 -6
  125. data/lib/slack/web/api/endpoints/bookmarks.rb +88 -0
  126. data/lib/slack/web/api/endpoints/bots.rb +1 -1
  127. data/lib/slack/web/api/endpoints/calls.rb +5 -5
  128. data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
  129. data/lib/slack/web/api/endpoints/chat.rb +37 -31
  130. data/lib/slack/web/api/endpoints/conversations.rb +38 -34
  131. data/lib/slack/web/api/endpoints/dialog.rb +2 -2
  132. data/lib/slack/web/api/endpoints/dnd.rb +1 -1
  133. data/lib/slack/web/api/endpoints/emoji.rb +2 -0
  134. data/lib/slack/web/api/endpoints/files.rb +45 -10
  135. data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
  136. data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
  137. data/lib/slack/web/api/endpoints/functions_workflows_steps.rb +28 -0
  138. data/lib/slack/web/api/endpoints/functions_workflows_steps_responses.rb +28 -0
  139. data/lib/slack/web/api/endpoints/migration.rb +1 -1
  140. data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
  141. data/lib/slack/web/api/endpoints/pins.rb +5 -3
  142. data/lib/slack/web/api/endpoints/reactions.rb +4 -4
  143. data/lib/slack/web/api/endpoints/reminders.rb +5 -5
  144. data/lib/slack/web/api/endpoints/rtm.rb +0 -23
  145. data/lib/slack/web/api/endpoints/search.rb +3 -3
  146. data/lib/slack/web/api/endpoints/team.rb +13 -1
  147. data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
  148. data/lib/slack/web/api/endpoints/usergroups.rb +5 -5
  149. data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
  150. data/lib/slack/web/api/endpoints/users.rb +4 -4
  151. data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
  152. data/lib/slack/web/api/endpoints/users_profile.rb +1 -1
  153. data/lib/slack/web/api/endpoints/views.rb +16 -11
  154. data/lib/slack/web/api/endpoints/workflows.rb +4 -4
  155. data/lib/slack/web/api/endpoints.rb +12 -0
  156. data/lib/slack/web/api/errors.rb +146 -8
  157. data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
  158. data/lib/slack/web/api/mixins/users.id.rb +1 -1
  159. data/lib/slack/web/api/mixins/users.search.rb +2 -1
  160. data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
  161. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  162. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  163. data/lib/slack/web/api/templates/command.erb +18 -12
  164. data/lib/slack/web/api/templates/method.erb +1 -1
  165. data/lib/slack/web/config.rb +2 -2
  166. data/lib/slack/web/faraday/connection.rb +4 -4
  167. data/lib/slack/web/faraday/request.rb +2 -0
  168. data/lib/slack/web/faraday/response/raise_error.rb +2 -10
  169. data/lib/slack/web/faraday/response/wrap_error.rb +1 -1
  170. data/lib/slack-ruby-client.rb +2 -1
  171. data/lib/tasks/real_time.rake +44 -24
  172. data/lib/tasks/web.rake +9 -8
  173. data/slack-ruby-client.gemspec +5 -14
  174. data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
  175. data/spec/integration/integration_spec.rb +1 -1
  176. data/spec/slack/events/config_spec.rb +2 -0
  177. data/spec/slack/events/request_spec.rb +5 -1
  178. data/spec/slack/messages/formatting_spec.rb +10 -0
  179. data/spec/slack/real_time/api/message_spec.rb +1 -1
  180. data/spec/slack/real_time/api/ping_spec.rb +1 -1
  181. data/spec/slack/real_time/api/typing_spec.rb +1 -1
  182. data/spec/slack/real_time/client_spec.rb +91 -127
  183. data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
  184. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
  185. data/spec/slack/real_time/event_handlers/im_spec.rb +30 -27
  186. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
  187. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +27 -23
  188. data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
  189. data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
  190. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  191. data/spec/slack/slack_spec.rb +5 -4
  192. data/spec/slack/version_spec.rb +1 -1
  193. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +5 -0
  194. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  195. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +31 -0
  196. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +30 -0
  197. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
  198. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
  199. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +45 -17
  200. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +6 -2
  201. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +33 -16
  202. data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
  203. data/spec/slack/web/api/endpoints/functions_workflows_steps_responses_spec.rb +13 -0
  204. data/spec/slack/web/api/endpoints/functions_workflows_steps_spec.rb +13 -0
  205. data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
  206. data/spec/slack/web/api/mixins/users_spec.rb +2 -0
  207. data/spec/slack/web/api/pagination/cursor_spec.rb +11 -7
  208. data/spec/slack/web/client_spec.rb +39 -11
  209. data/spec/slack/web/faraday/response/raise_error_spec.rb +1 -1
  210. data/spec/support/real_time/connected_client.rb +1 -1
  211. data/spec/support/real_time/loaded_client.rb +120 -0
  212. metadata +45 -197
  213. data/.travis.yml +0 -29
  214. data/bin/commands/admin_conversations_whitelist.rb +0 -37
  215. data/bin/commands/apps_permissions.rb +0 -23
  216. data/bin/commands/apps_permissions_resources.rb +0 -15
  217. data/bin/commands/apps_permissions_scopes.rb +0 -13
  218. data/bin/commands/apps_permissions_users.rb +0 -26
  219. data/bin/commands/channels.rb +0 -23
  220. data/bin/commands/groups.rb +0 -14
  221. data/bin/commands/im.rb +0 -6
  222. data/bin/commands/mpim.rb +0 -6
  223. data/bin/commands.rb +0 -66
  224. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
  225. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
  226. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
  227. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
  228. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
  229. data/lib/slack/web/api/endpoints/channels.rb +0 -25
  230. data/lib/slack/web/api/endpoints/groups.rb +0 -13
  231. data/lib/slack/web/api/endpoints/im.rb +0 -13
  232. data/lib/slack/web/api/endpoints/mpim.rb +0 -13
  233. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  234. data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
  235. data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
  236. data/lib/slack/web/api/templates/commands.erb +0 -6
  237. data/spec/fixtures/slack/web/rtm_start.yml +0 -815
  238. data/spec/slack/real_time/rtm_start_spec.rb +0 -14
  239. data/spec/slack/real_time/store_spec.rb +0 -12
@@ -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
@@ -25,6 +25,7 @@ RSpec.describe Slack::RealTime::Client do
25
25
  expect(client.token).to eq '<SLACK_API_TOKEN>'
26
26
  expect(client.web_client.token).to eq '<SLACK_API_TOKEN>'
27
27
  end
28
+
28
29
  context 'with real time config' do
29
30
  before do
30
31
  described_class.configure do |config|
@@ -37,6 +38,7 @@ RSpec.describe Slack::RealTime::Client do
37
38
  expect(client.token).to eq 'custom real time token'
38
39
  expect(client.web_client.token).to eq 'custom real time token'
39
40
  end
41
+
40
42
  it 'overrides token to specific token' do
41
43
  client = described_class.new(token: 'local token')
42
44
  expect(client.token).to eq 'local token'
@@ -64,7 +66,7 @@ RSpec.describe Slack::RealTime::Client do
64
66
  end
65
67
 
66
68
  context 'client with a full store',
67
- vcr: { cassette_name: 'web/rtm_start', allow_playback_repeats: true } do
69
+ vcr: { cassette_name: 'web/rtm_connect', allow_playback_repeats: true } do
68
70
  let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Store) }
69
71
  let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
70
72
 
@@ -73,7 +75,7 @@ RSpec.describe Slack::RealTime::Client do
73
75
 
74
76
  before do
75
77
  allow(Slack::RealTime::Socket).to(
76
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
78
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
77
79
  )
78
80
  allow(socket).to receive(:connect!)
79
81
  allow(socket).to receive(:start_sync)
@@ -84,35 +86,25 @@ RSpec.describe Slack::RealTime::Client do
84
86
  it 'sets url' do
85
87
  expect(client.url).to eq url
86
88
  end
89
+
87
90
  it 'sets team' do
88
91
  expect(client.team.domain).to eq 'dblockdotorg'
89
92
  end
93
+
90
94
  it 'sets teams' do
91
95
  expect(client.teams.count).to eq 1
92
96
  expect(client.teams.values.first).to eq client.team
93
97
  end
98
+
94
99
  it 'sets self' do
95
100
  expect(client.self.id).to eq 'U0J1GAHN1'
96
101
  end
97
- it 'sets users' do
98
- expect(client.users.count).to eq 35
102
+
103
+ it 'sets user' do
104
+ expect(client.users.count).to eq 1
99
105
  expect(client.users.values.first['id']).to eq 'U0J1GAHN1'
100
106
  end
101
- it 'sets channels' do
102
- expect(client.channels.count).to eq 156
103
- expect(client.channels.values.first['name']).to eq 'general'
104
- end
105
- it 'sets ims' do
106
- expect(client.ims.count).to eq 10
107
- expect(client.ims.values.first['user']).to eq 'U04KB5WQR'
108
- end
109
- it 'sets bots' do
110
- expect(client.bots.count).to eq 83
111
- expect(client.bots.values.first['name']).to eq 'bot'
112
- end
113
- it 'sets groups' do
114
- expect(client.groups.count).to eq 1
115
- end
107
+
116
108
  it 'includes team name in to_s' do
117
109
  expect(client.to_s).to eq(
118
110
  "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
@@ -123,14 +115,17 @@ RSpec.describe Slack::RealTime::Client do
123
115
  it 'uses web client to fetch url' do
124
116
  expect(client.web_client).to be_a Slack::Web::Client
125
117
  end
118
+
126
119
  it 'remembers socket' do
127
- expect(client.instance_variable_get('@socket')).to eq socket
120
+ expect(client.instance_variable_get(:@socket)).to eq socket
128
121
  end
122
+
129
123
  it 'cannot be invoked twice' do
130
124
  expect do
131
125
  client.start!
132
126
  end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
133
127
  end
128
+
134
129
  describe '#stop!' do
135
130
  before do
136
131
  allow(socket).to receive(:disconnect!)
@@ -138,7 +133,7 @@ RSpec.describe Slack::RealTime::Client do
138
133
  end
139
134
 
140
135
  it 'cannot be invoked twice' do
141
- client.instance_variable_set('@socket', nil) # caused by a :close callback
136
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
142
137
  expect do
143
138
  client.stop!
144
139
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
@@ -164,18 +159,18 @@ RSpec.describe Slack::RealTime::Client do
164
159
  end
165
160
 
166
161
  describe '#run_handlers' do
167
- describe 'empty events' do
162
+ context 'when store has no event hooks' do
168
163
  before do
169
- @e = client.store.class.events
170
- client.store.class.events = nil
164
+ @events = client.store.class.events.dup
165
+ client.store.class.events.clear
171
166
  end
172
167
 
173
168
  after do
174
- client.store.class.events = @e
169
+ client.store.class.events.merge!(@events)
175
170
  end
176
171
 
177
- it 'returns false when event is nil' do
178
- expect(client.send(:run_handlers, 'example', {})).to be nil
172
+ it 'returns empty array of handlers' do
173
+ expect(client.send(:run_handlers, 'example', {})).to be_empty
179
174
  end
180
175
  end
181
176
  end
@@ -186,7 +181,7 @@ RSpec.describe Slack::RealTime::Client do
186
181
 
187
182
  before do
188
183
  allow(Slack::RealTime::Socket).to(
189
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
184
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
190
185
  )
191
186
  allow(socket).to receive(:connect!)
192
187
  allow(socket).to receive(:start_async)
@@ -199,6 +194,7 @@ RSpec.describe Slack::RealTime::Client do
199
194
  expect(socket).to receive(:send_data).with('{"type":"ping","id":1}')
200
195
  client.run_ping!
201
196
  end
197
+
202
198
  it 'reconnects the websocket if it has been idle for too long' do
203
199
  allow(socket).to receive(:time_since_last_message).and_return(75)
204
200
  allow(socket).to receive(:connected?).and_return(true)
@@ -206,6 +202,7 @@ RSpec.describe Slack::RealTime::Client do
206
202
  expect(socket).to receive(:restart_async)
207
203
  client.run_ping!
208
204
  end
205
+
209
206
  [
210
207
  EOFError,
211
208
  Errno::ECONNRESET,
@@ -255,7 +252,7 @@ RSpec.describe Slack::RealTime::Client do
255
252
 
256
253
  before do
257
254
  allow(Slack::RealTime::Socket).to(
258
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
255
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
259
256
  )
260
257
  allow(socket).to receive(:connect!)
261
258
  allow(socket).to receive(:start_sync)
@@ -266,30 +263,43 @@ RSpec.describe Slack::RealTime::Client do
266
263
  it 'sets url' do
267
264
  expect(client.url).to eq url
268
265
  end
266
+
269
267
  it 'sets team' do
270
268
  expect(client.team.domain).to eq 'dblockdotorg'
271
269
  end
270
+
272
271
  it 'sets self' do
273
272
  expect(client.self.id).to eq 'U0J1GAHN1'
274
273
  end
274
+
275
+ it 'no teams' do
276
+ expect(client.teams).to be_nil
277
+ end
278
+
275
279
  it 'no users' do
276
280
  expect(client.users).to be_nil
277
281
  end
278
- it 'no teams' do
279
- expect(client.teams).to be_nil
282
+
283
+ it 'no bots' do
284
+ expect(client.bots).to be_nil
280
285
  end
281
- it 'no channels' do
282
- expect(client.channels).to be_nil
286
+
287
+ it 'no public channels' do
288
+ expect(client.public_channels).to be_nil
283
289
  end
290
+
291
+ it 'no private channels' do
292
+ expect(client.private_channels).to be_nil
293
+ end
294
+
284
295
  it 'no ims' do
285
296
  expect(client.ims).to be_nil
286
297
  end
287
- it 'no bots' do
288
- expect(client.bots).to be_nil
289
- end
290
- it 'no groups' do
291
- expect(client.groups).to be_nil
298
+
299
+ it 'no mpims' do
300
+ expect(client.mpims).to be_nil
292
301
  end
302
+
293
303
  it 'includes team name in to_s' do
294
304
  expect(client.to_s).to eq(
295
305
  "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
@@ -300,14 +310,17 @@ RSpec.describe Slack::RealTime::Client do
300
310
  it 'uses web client to fetch url' do
301
311
  expect(client.web_client).to be_a Slack::Web::Client
302
312
  end
313
+
303
314
  it 'remembers socket' do
304
- expect(client.instance_variable_get('@socket')).to eq socket
315
+ expect(client.instance_variable_get(:@socket)).to eq socket
305
316
  end
317
+
306
318
  it 'cannot be invoked twice' do
307
319
  expect do
308
320
  client.start!
309
321
  end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
310
322
  end
323
+
311
324
  describe '#stop!' do
312
325
  before do
313
326
  allow(socket).to receive(:disconnect!)
@@ -315,7 +328,7 @@ RSpec.describe Slack::RealTime::Client do
315
328
  end
316
329
 
317
330
  it 'cannot be invoked twice' do
318
- client.instance_variable_set('@socket', nil) # caused by a :close callback
331
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
319
332
  expect do
320
333
  client.stop!
321
334
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
@@ -336,8 +349,9 @@ RSpec.describe Slack::RealTime::Client do
336
349
  let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
337
350
 
338
351
  it 'sets store to nil' do
339
- expect(client.store).to be nil
352
+ expect(client.store).to be_nil
340
353
  end
354
+
341
355
  it "doesn't handle events" do
342
356
  event = Slack::RealTime::Event.new(
343
357
  'type' => 'team_rename',
@@ -346,12 +360,15 @@ RSpec.describe Slack::RealTime::Client do
346
360
  expect(client).not_to receive(:run_handlers)
347
361
  client.send(:dispatch, event)
348
362
  end
363
+
349
364
  it 'self' do
350
- expect(client.self).to be nil
365
+ expect(client.self).to be_nil
351
366
  end
367
+
352
368
  it 'team' do
353
- expect(client.team).to be nil
369
+ expect(client.team).to be_nil
354
370
  end
371
+
355
372
  describe 'to_s' do
356
373
  it 'defaults to class instance' do
357
374
  expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
@@ -366,15 +383,19 @@ RSpec.describe Slack::RealTime::Client do
366
383
  it 'sets ping' do
367
384
  expect(client.websocket_ping).to eq 30
368
385
  end
386
+
369
387
  it "doesn't set proxy" do
370
- expect(client.websocket_proxy).to be nil
388
+ expect(client.websocket_proxy).to be_nil
371
389
  end
390
+
372
391
  it 'defaults logger' do
373
392
  expect(client.send(:logger)).to be_a ::Logger
374
393
  end
394
+
375
395
  it 'sets default store_class' do
376
- expect(client.send(:store_class)).to eq Slack::RealTime::Store
396
+ expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Starter
377
397
  end
398
+
378
399
  (Slack::RealTime::Config::ATTRIBUTES - %i[logger store_class token]).each do |key|
379
400
  it "sets #{key}" do
380
401
  expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
@@ -387,6 +408,7 @@ RSpec.describe Slack::RealTime::Client do
387
408
  client.websocket_ping = 30
388
409
  expect(client.run_ping?).to be true
389
410
  end
411
+
390
412
  it 'returns false when websocket_ping is less than 1' do
391
413
  client.websocket_ping = 0
392
414
  expect(client.run_ping?).to be false
@@ -416,6 +438,7 @@ RSpec.describe Slack::RealTime::Client do
416
438
  it 'exposes public logger' do
417
439
  expect(client.logger).to be_a(::Logger)
418
440
  end
441
+
419
442
  it 'exposes public logger=' do
420
443
  expect { client.logger = nil }.not_to raise_error(NoMethodError)
421
444
  end
@@ -441,12 +464,14 @@ RSpec.describe Slack::RealTime::Client do
441
464
  it 'sets ping' do
442
465
  expect(client.websocket_ping).to eq 15
443
466
  end
444
- it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_start' } do
467
+
468
+ it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do
445
469
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to(
446
- receive(:new).with(url, nil, ping: 15).and_return(ws)
470
+ receive(:new).with(url, nil, { ping: 15 }).and_return(ws)
447
471
  )
448
472
  client.start!
449
473
  end
474
+
450
475
  it 'sets start_options' do
451
476
  expect(client.start_options).to eq(request: { timeout: 180 })
452
477
  end
@@ -470,14 +495,17 @@ RSpec.describe Slack::RealTime::Client do
470
495
  headers: { 'User-Agent' => 'ruby' }
471
496
  )
472
497
  end
473
- it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_start' } do
498
+
499
+ it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do
474
500
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
475
501
  url,
476
502
  nil,
477
- ping: 30,
478
- proxy: {
479
- origin: 'http://username:password@proxy.example.com',
480
- headers: { 'User-Agent' => 'ruby' }
503
+ {
504
+ ping: 30,
505
+ proxy: {
506
+ origin: 'http://username:password@proxy.example.com',
507
+ headers: { 'User-Agent' => 'ruby' }
508
+ }
481
509
  }
482
510
  ).and_return(ws)
483
511
  client.start!
@@ -488,14 +516,15 @@ RSpec.describe Slack::RealTime::Client do
488
516
  context 'start_options' do
489
517
  before do
490
518
  described_class.configure do |config|
491
- config.start_options = { simple_latest: true }
519
+ config.start_options = { presence_sub: true }
492
520
  end
493
521
  end
494
522
 
495
523
  describe '#initialize' do
496
524
  it 'sets start_options' do
497
- expect(client.start_options).to eq(simple_latest: true)
525
+ expect(client.start_options).to eq(presence_sub: true)
498
526
  end
527
+
499
528
  context 'start!' do
500
529
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
501
530
 
@@ -505,9 +534,9 @@ RSpec.describe Slack::RealTime::Client do
505
534
  allow(socket).to receive(:start_sync)
506
535
  end
507
536
 
508
- it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_start' } do
537
+ it 'calls rtm.connect with start options', vcr: { cassette_name: 'web/rtm_connect' } do
509
538
  expect(client.web_client).to(
510
- receive(:rtm_start).with(simple_latest: true).and_call_original
539
+ receive(:rtm_connect).with({ presence_sub: true }).and_call_original
511
540
  )
512
541
  client.start!
513
542
  end
@@ -516,7 +545,7 @@ RSpec.describe Slack::RealTime::Client do
516
545
  end
517
546
 
518
547
  context 'store_class' do
519
- context 'starter' do
548
+ context 'when configured with Starter class' do
520
549
  before do
521
550
  described_class.configure do |config|
522
551
  config.store_class = Slack::RealTime::Stores::Starter
@@ -524,13 +553,15 @@ RSpec.describe Slack::RealTime::Client do
524
553
  end
525
554
 
526
555
  describe '#initialize' do
527
- it 'can be overriden explicitly' do
528
- client = described_class.new(store_class: Slack::RealTime::Store)
529
- expect(client.send(:store_class)).to eq Slack::RealTime::Store
556
+ it 'can override the configured store class' do
557
+ client = described_class.new(store_class: Slack::RealTime::Stores::Store)
558
+ expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Store
530
559
  end
560
+
531
561
  it 'sets store_class' do
532
562
  expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter)
533
563
  end
564
+
534
565
  context 'start!' do
535
566
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
536
567
 
@@ -547,73 +578,6 @@ RSpec.describe Slack::RealTime::Client do
547
578
  end
548
579
  end
549
580
  end
550
-
551
- context 'store' do
552
- before do
553
- described_class.configure do |config|
554
- config.store_class = Slack::RealTime::Stores::Store
555
- end
556
- end
557
-
558
- describe '#initialize' do
559
- context 'start!' do
560
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
561
-
562
- before do
563
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
564
- allow(socket).to receive(:connect!)
565
- allow(socket).to receive(:start_sync)
566
- end
567
-
568
- it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do
569
- expect(client.web_client).to receive(:rtm_start).and_call_original
570
- client.start!
571
- end
572
- end
573
- end
574
- end
575
- end
576
-
577
- context 'start_method' do
578
- describe '#initialize' do
579
- it 'can be overriden explicitly' do
580
- client = described_class.new(start_method: :overriden)
581
- expect(client.send(:start_method)).to eq :overriden
582
- end
583
- context 'with start_method' do
584
- before do
585
- described_class.configure do |config|
586
- config.start_method = :overriden
587
- end
588
- end
589
-
590
- it 'sets start_method' do
591
- expect(client.send(:start_method)).to eq :overriden
592
- end
593
- it 'calls the overriden method' do
594
- expect(client.web_client).to receive(:overriden).and_raise('overriden')
595
- expect do
596
- client.start!
597
- end.to raise_error RuntimeError, 'overriden'
598
- end
599
- end
600
-
601
- context 'start!' do
602
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
603
-
604
- before do
605
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
606
- allow(socket).to receive(:connect!)
607
- allow(socket).to receive(:start_sync)
608
- end
609
-
610
- it 'defaults to :rtm_start when using full store',
611
- vcr: { cassette_name: 'web/rtm_start' } do
612
- expect(client.web_client).to receive(:rtm_start).and_call_original
613
- client.start!
614
- end
615
- end
616
- end
617
581
  end
618
582
  end
619
583
  end
@@ -1,13 +1,10 @@
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
  context 'bot' do
8
- it 'sets bot data on rtm.start' do
9
- expect(client.bots.count).to eq 83
10
- end
11
8
  it 'bot_added' do
12
9
  expect do
13
10
  event = Slack::RealTime::Event.new(
@@ -27,19 +24,24 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
27
24
  expect(bot['name']).to eq 'hugbot'
28
25
  expect(bot['icons']['image_48']).to eq 'https:\/\/slack.com\/path\/to\/hugbot_48.png'
29
26
  end
30
- it 'bot_changed' do
31
- expect do
32
- event = Slack::RealTime::Event.new(
33
- 'type' => 'bot_changed',
34
- 'bot' => {
35
- 'id' => 'B0751JU2H',
36
- 'name' => 'hugbot'
37
- }
38
- )
39
- client.send(:dispatch, event)
40
- end.not_to change(client.bots, :count)
41
- bot = client.bots['B0751JU2H']
42
- expect(bot['name']).to eq 'hugbot'
27
+
28
+ context 'with bot loaded in the store' do
29
+ include_context 'loaded client'
30
+
31
+ it 'bot_changed' do
32
+ expect do
33
+ event = Slack::RealTime::Event.new(
34
+ 'type' => 'bot_changed',
35
+ 'bot' => {
36
+ 'id' => 'B0751JU2H',
37
+ 'name' => 'hugbot'
38
+ }
39
+ )
40
+ client.send(:dispatch, event)
41
+ end.not_to change(client.bots, :count)
42
+ bot = client.bots['B0751JU2H']
43
+ expect(bot['name']).to eq 'hugbot'
44
+ end
43
45
  end
44
46
  end
45
47
  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
  it 'is not fatal' do