slack-ruby-client 2.3.0 → 2.5.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +22 -12
  3. data/.github/workflows/update_api.yml +1 -1
  4. data/.gitignore +1 -0
  5. data/.rubocop_todo.yml +43 -13
  6. data/CHANGELOG.md +19 -0
  7. data/CONTRIBUTING.md +7 -7
  8. data/Gemfile +1 -0
  9. data/README.md +68 -25
  10. data/bin/commands/admin_conversations.rb +21 -0
  11. data/bin/commands/admin_emoji.rb +1 -1
  12. data/bin/commands/admin_users.rb +4 -4
  13. data/bin/commands/admin_users_session.rb +1 -1
  14. data/bin/commands/admin_workflows.rb +6 -2
  15. data/bin/commands/admin_workflows_triggers_types_permissions.rb +31 -0
  16. data/bin/commands/apps_datastore.rb +46 -0
  17. data/bin/commands/assistant_threads.rb +45 -0
  18. data/bin/commands/bookmarks.rb +1 -0
  19. data/bin/commands/canvases.rb +40 -0
  20. data/bin/commands/canvases_access.rb +34 -0
  21. data/bin/commands/canvases_sections.rb +21 -0
  22. data/bin/commands/chat.rb +7 -3
  23. data/bin/commands/conversations.rb +6 -6
  24. data/bin/commands/conversations_canvases.rb +21 -0
  25. data/bin/commands/conversations_externalInvitePermissions.rb +22 -0
  26. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  27. data/bin/commands/files.rb +2 -1
  28. data/bin/commands/functions_distributions_permissions.rb +59 -0
  29. data/bin/commands/oauth.rb +2 -2
  30. data/bin/commands/oauth_v2.rb +2 -2
  31. data/bin/commands/reminders.rb +1 -1
  32. data/bin/commands/team_externalTeams.rb +35 -0
  33. data/bin/commands/usergroups.rb +5 -0
  34. data/bin/commands/usergroups_users.rb +2 -0
  35. data/bin/commands/users_discoverableContacts.rb +20 -0
  36. data/bin/commands/workflows_triggers_permissions.rb +60 -0
  37. data/examples/files_upload_v2/.env.example +1 -0
  38. data/examples/files_upload_v2/Gemfile +5 -0
  39. data/examples/files_upload_v2/README.md +13 -0
  40. data/examples/files_upload_v2/files_upload_v2.rb +37 -0
  41. data/examples/oauth_v2/.env.example +4 -0
  42. data/examples/oauth_v2/Gemfile +7 -0
  43. data/examples/oauth_v2/README.md +33 -0
  44. data/examples/oauth_v2/oauth_v2.rb +60 -0
  45. data/lib/slack/messages/formatting.rb +13 -0
  46. data/lib/slack/version.rb +1 -1
  47. data/lib/slack/web/api/endpoints/admin_conversations.rb +35 -0
  48. data/lib/slack/web/api/endpoints/admin_emoji.rb +1 -1
  49. data/lib/slack/web/api/endpoints/admin_users.rb +2 -2
  50. data/lib/slack/web/api/endpoints/admin_users_session.rb +2 -3
  51. data/lib/slack/web/api/endpoints/admin_workflows.rb +10 -2
  52. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +41 -0
  53. data/lib/slack/web/api/endpoints/apps_datastore.rb +71 -0
  54. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  55. data/lib/slack/web/api/endpoints/bookmarks.rb +2 -0
  56. data/lib/slack/web/api/endpoints/canvases.rb +52 -0
  57. data/lib/slack/web/api/endpoints/canvases_access.rb +47 -0
  58. data/lib/slack/web/api/endpoints/canvases_sections.rb +27 -0
  59. data/lib/slack/web/api/endpoints/chat.rb +12 -3
  60. data/lib/slack/web/api/endpoints/conversations.rb +5 -5
  61. data/lib/slack/web/api/endpoints/conversations_canvases.rb +26 -0
  62. data/lib/slack/web/api/endpoints/conversations_externalInvitePermissions.rb +31 -0
  63. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  64. data/lib/slack/web/api/endpoints/dnd.rb +1 -0
  65. data/lib/slack/web/api/endpoints/files.rb +3 -1
  66. data/lib/slack/web/api/endpoints/functions_distributions_permissions.rb +80 -0
  67. data/lib/slack/web/api/endpoints/oauth.rb +2 -2
  68. data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
  69. data/lib/slack/web/api/endpoints/reminders.rb +1 -1
  70. data/lib/slack/web/api/endpoints/team_externalTeams.rb +53 -0
  71. data/lib/slack/web/api/endpoints/usergroups.rb +10 -0
  72. data/lib/slack/web/api/endpoints/usergroups_users.rb +4 -0
  73. data/lib/slack/web/api/endpoints/users_discoverableContacts.rb +24 -0
  74. data/lib/slack/web/api/endpoints/workflows_triggers_permissions.rb +87 -0
  75. data/lib/slack/web/api/endpoints.rb +24 -0
  76. data/lib/slack/web/api/errors.rb +118 -8
  77. data/lib/slack/web/api/helpers/files.rb +87 -0
  78. data/lib/slack/web/api/helpers.rb +13 -0
  79. data/lib/slack/web/api/templates/method.erb +1 -0
  80. data/lib/slack/web/api/templates/method_spec.erb +6 -4
  81. data/lib/slack/web/client.rb +1 -0
  82. data/lib/slack/web/faraday/connection.rb +13 -26
  83. data/lib/slack/web/faraday/options.rb +24 -0
  84. data/lib/slack/web/faraday/request.rb +2 -1
  85. data/lib/slack-ruby-client.rb +2 -0
  86. data/slack-ruby-client.gemspec +2 -1
  87. metadata +52 -144
  88. data/screenshots/create-app.png +0 -0
  89. data/spec/fixtures/slack/web/429_error.yml +0 -81
  90. data/spec/fixtures/slack/web/auth_test_error.yml +0 -81
  91. data/spec/fixtures/slack/web/auth_test_success.yml +0 -81
  92. data/spec/fixtures/slack/web/conversations_info.yml +0 -167
  93. data/spec/fixtures/slack/web/conversations_setTopic.yml +0 -84
  94. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +0 -172
  95. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +0 -253
  96. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -613
  97. data/spec/fixtures/slack/web/rtm_connect.yml +0 -391
  98. data/spec/fixtures/slack/web/users_info.yml +0 -214
  99. data/spec/fixtures/slack/web/users_list.yml +0 -133
  100. data/spec/fixtures/slack/web/views_open_error.yml +0 -83
  101. data/spec/integration/integration_spec.rb +0 -207
  102. data/spec/slack/config_spec.rb +0 -16
  103. data/spec/slack/events/config_spec.rb +0 -35
  104. data/spec/slack/events/request_spec.rb +0 -199
  105. data/spec/slack/messages/formatting_spec.rb +0 -124
  106. data/spec/slack/real_time/api/message_spec.rb +0 -20
  107. data/spec/slack/real_time/api/ping_spec.rb +0 -17
  108. data/spec/slack/real_time/api/typing_spec.rb +0 -19
  109. data/spec/slack/real_time/client_spec.rb +0 -601
  110. data/spec/slack/real_time/concurrency/clients/async_spec.rb +0 -16
  111. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -21
  112. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +0 -10
  113. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +0 -10
  114. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -47
  115. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -16
  116. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -51
  117. data/spec/slack/real_time/event_handlers/private_channel_spec.rb +0 -99
  118. data/spec/slack/real_time/event_handlers/public_channel_spec.rb +0 -123
  119. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -63
  120. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -65
  121. data/spec/slack/real_time/rtm_connect_spec.rb +0 -14
  122. data/spec/slack/real_time/stores/store_spec.rb +0 -50
  123. data/spec/slack/slack_spec.rb +0 -93
  124. data/spec/slack/version_spec.rb +0 -8
  125. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +0 -13
  126. data/spec/slack/web/api/endpoints/admin_apps_activities_spec.rb +0 -8
  127. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +0 -8
  128. data/spec/slack/web/api/endpoints/admin_apps_config_spec.rb +0 -18
  129. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +0 -13
  130. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +0 -8
  131. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +0 -18
  132. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +0 -8
  133. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +0 -35
  134. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +0 -38
  135. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +0 -8
  136. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +0 -32
  137. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +0 -133
  138. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +0 -37
  139. data/spec/slack/web/api/endpoints/admin_functions_permissions_spec.rb +0 -21
  140. data/spec/slack/web/api/endpoints/admin_functions_spec.rb +0 -13
  141. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +0 -8
  142. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +0 -8
  143. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +0 -18
  144. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +0 -30
  145. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +0 -13
  146. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +0 -13
  147. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +0 -53
  148. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +0 -16
  149. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +0 -37
  150. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +0 -41
  151. data/spec/slack/web/api/endpoints/admin_users_spec.rb +0 -67
  152. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +0 -8
  153. data/spec/slack/web/api/endpoints/admin_workflows_collaborators_spec.rb +0 -24
  154. data/spec/slack/web/api/endpoints/admin_workflows_permissions_spec.rb +0 -13
  155. data/spec/slack/web/api/endpoints/admin_workflows_spec.rb +0 -13
  156. data/spec/slack/web/api/endpoints/api_spec.rb +0 -8
  157. data/spec/slack/web/api/endpoints/apps_activities_spec.rb +0 -13
  158. data/spec/slack/web/api/endpoints/apps_auth_external_spec.rb +0 -13
  159. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +0 -8
  160. data/spec/slack/web/api/endpoints/apps_datastore_spec.rb +0 -45
  161. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +0 -13
  162. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +0 -44
  163. data/spec/slack/web/api/endpoints/apps_spec.rb +0 -16
  164. data/spec/slack/web/api/endpoints/auth_spec.rb +0 -8
  165. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +0 -8
  166. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +0 -40
  167. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -8
  168. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +0 -24
  169. data/spec/slack/web/api/endpoints/calls_spec.rb +0 -31
  170. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +0 -8
  171. data/spec/slack/web/api/endpoints/chat_spec.rb +0 -134
  172. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -8
  173. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -27
  174. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -206
  175. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +0 -13
  176. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -40
  177. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -38
  178. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +0 -112
  179. data/spec/slack/web/api/endpoints/dialog_spec.rb +0 -14
  180. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -13
  181. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -8
  182. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -16
  183. data/spec/slack/web/api/endpoints/files_remote_spec.rb +0 -24
  184. data/spec/slack/web/api/endpoints/files_spec.rb +0 -57
  185. data/spec/slack/web/api/endpoints/functions_spec.rb +0 -28
  186. data/spec/slack/web/api/endpoints/functions_workflows_steps_responses_spec.rb +0 -13
  187. data/spec/slack/web/api/endpoints/functions_workflows_steps_spec.rb +0 -13
  188. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -13
  189. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -8
  190. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +0 -16
  191. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +0 -8
  192. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -23
  193. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -24
  194. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -31
  195. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -8
  196. data/spec/slack/web/api/endpoints/search_spec.rb +0 -23
  197. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -8
  198. data/spec/slack/web/api/endpoints/team_billing_spec.rb +0 -8
  199. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +0 -8
  200. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -8
  201. data/spec/slack/web/api/endpoints/team_spec.rb +0 -8
  202. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +0 -13
  203. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -28
  204. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -21
  205. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -18
  206. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -8
  207. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -14
  208. data/spec/slack/web/api/endpoints/users_spec.rb +0 -8
  209. data/spec/slack/web/api/endpoints/views_spec.rb +0 -65
  210. data/spec/slack/web/api/endpoints/workflows_spec.rb +0 -34
  211. data/spec/slack/web/api/error_spec.rb +0 -14
  212. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -33
  213. data/spec/slack/web/api/mixins/conversations_list_spec.rb +0 -21
  214. data/spec/slack/web/api/mixins/conversations_spec.rb +0 -45
  215. data/spec/slack/web/api/mixins/users_spec.rb +0 -52
  216. data/spec/slack/web/api/options_spec.rb +0 -69
  217. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -102
  218. data/spec/slack/web/client_spec.rb +0 -359
  219. data/spec/slack/web/faraday/request_spec.rb +0 -80
  220. data/spec/slack/web/faraday/response/raise_error_spec.rb +0 -86
  221. data/spec/spec_helper.rb +0 -30
  222. data/spec/support/queue_with_timeout.rb +0 -35
  223. data/spec/support/real_time/concurrency/mock.rb +0 -31
  224. data/spec/support/real_time/connected_client.rb +0 -21
  225. data/spec/support/real_time/event.rb +0 -12
  226. data/spec/support/real_time/loaded_client.rb +0 -120
  227. data/spec/support/token.rb +0 -11
  228. data/spec/support/vcr.rb +0 -45
@@ -1,601 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::RealTime::Client do
5
- let(:ws) { double(Slack::RealTime::Concurrency::Mock::WebSocket, on: true) }
6
-
7
- before do
8
- # supports passing tests in CI even with an actual SLACK_API_TOKEN set
9
- @token = ENV.delete('SLACK_API_TOKEN')
10
- Slack::Config.reset
11
- Slack::RealTime::Config.reset
12
- Slack::RealTime.configure do |config|
13
- config.token = '<SLACK_API_TOKEN>'
14
- config.concurrency = Slack::RealTime::Concurrency::Mock
15
- end
16
- end
17
-
18
- after do
19
- ENV['SLACK_API_TOKEN'] = @token if @token
20
- end
21
-
22
- context 'token' do
23
- it 'defaults token to global default' do
24
- client = described_class.new
25
- expect(client.token).to eq '<SLACK_API_TOKEN>'
26
- expect(client.web_client.token).to eq '<SLACK_API_TOKEN>'
27
- end
28
-
29
- context 'with real time config' do
30
- before do
31
- described_class.configure do |config|
32
- config.token = 'custom real time token'
33
- end
34
- end
35
-
36
- it 'overrides token to real time config' do
37
- client = described_class.new
38
- expect(client.token).to eq 'custom real time token'
39
- expect(client.web_client.token).to eq 'custom real time token'
40
- end
41
-
42
- it 'overrides token to specific token' do
43
- client = described_class.new(token: 'local token')
44
- expect(client.token).to eq 'local token'
45
- expect(client.web_client.token).to eq 'local token'
46
- end
47
- end
48
- end
49
-
50
- context 'websocket_ping_timer' do
51
- context 'with defaults' do
52
- let(:client) { described_class.new }
53
-
54
- it 'defaults to websocket_ping / 2' do
55
- expect(client.websocket_ping_timer).to eq 15
56
- end
57
- end
58
-
59
- context 'with websocket_ping value changed' do
60
- let(:client) { described_class.new(websocket_ping: 22) }
61
-
62
- it 'defaults to websocket_ping / 2' do
63
- expect(client.websocket_ping_timer).to eq 11
64
- end
65
- end
66
- end
67
-
68
- context 'client with a full store',
69
- vcr: { cassette_name: 'web/rtm_connect', allow_playback_repeats: true } do
70
- let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Store) }
71
- let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
72
-
73
- describe '#start!' do
74
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
75
-
76
- before do
77
- allow(Slack::RealTime::Socket).to(
78
- receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
79
- )
80
- allow(socket).to receive(:connect!)
81
- allow(socket).to receive(:start_sync)
82
- client.start!
83
- end
84
-
85
- describe 'properties provided upon connection' do
86
- it 'sets url' do
87
- expect(client.url).to eq url
88
- end
89
-
90
- it 'sets team' do
91
- expect(client.team.domain).to eq 'dblockdotorg'
92
- end
93
-
94
- it 'sets teams' do
95
- expect(client.teams.count).to eq 1
96
- expect(client.teams.values.first).to eq client.team
97
- end
98
-
99
- it 'sets self' do
100
- expect(client.self.id).to eq 'U0J1GAHN1'
101
- end
102
-
103
- it 'sets user' do
104
- expect(client.users.count).to eq 1
105
- expect(client.users.values.first['id']).to eq 'U0J1GAHN1'
106
- end
107
-
108
- it 'includes team name in to_s' do
109
- expect(client.to_s).to eq(
110
- "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
111
- )
112
- end
113
- end
114
-
115
- it 'uses web client to fetch url' do
116
- expect(client.web_client).to be_a Slack::Web::Client
117
- end
118
-
119
- it 'remembers socket' do
120
- expect(client.instance_variable_get(:@socket)).to eq socket
121
- end
122
-
123
- it 'cannot be invoked twice' do
124
- expect do
125
- client.start!
126
- end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
127
- end
128
-
129
- describe '#stop!' do
130
- before do
131
- allow(socket).to receive(:disconnect!)
132
- client.stop!
133
- end
134
-
135
- it 'cannot be invoked twice' do
136
- client.instance_variable_set(:@socket, nil) # caused by a :close callback
137
- expect do
138
- client.stop!
139
- end.to raise_error Slack::RealTime::Client::ClientNotStartedError
140
- end
141
- end
142
-
143
- describe '#next_id' do
144
- it 'increments' do
145
- previous_id = client.send(:next_id)
146
- expect(client.send(:next_id)).to eq previous_id + 1
147
- end
148
- end
149
-
150
- context 'subclassed' do
151
- it 'runs event handlers' do
152
- event = Slack::RealTime::Event.new(
153
- 'type' => 'team_rename',
154
- 'name' => 'New Team Name Inc.'
155
- )
156
- client.send(:dispatch, event)
157
- expect(client.store.team.name).to eq 'New Team Name Inc.'
158
- end
159
- end
160
-
161
- describe '#run_handlers' do
162
- before do
163
- @events = client.store.class.events.dup
164
- @async_handlers = client.async_handlers.dup
165
- client.store.class.events.clear
166
- end
167
-
168
- after do
169
- client.store.class.events.merge!(@events)
170
- client.async_handlers = @async_handlers
171
- end
172
-
173
- context 'when config#async_handlers is :all' do
174
- before do
175
- client.async_handlers = :all
176
- end
177
-
178
- it 'runs tasks async' do
179
- expect(socket).to receive(:run_async)
180
- client.send(:run_handlers, 'example', {})
181
- end
182
- end
183
-
184
- context 'when config#async_handlers is :none' do
185
- before do
186
- client.async_handlers = :none
187
- end
188
-
189
- it 'does not run tasks async' do
190
- expect(socket).not_to receive(:run_async)
191
- client.send(:run_handlers, 'example', {})
192
- end
193
- end
194
- end
195
- end
196
-
197
- describe '#start_async' do
198
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
199
-
200
- before do
201
- allow(Slack::RealTime::Socket).to(
202
- receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
203
- )
204
- allow(socket).to receive(:connect!)
205
- allow(socket).to receive(:start_async)
206
- client.start_async
207
- end
208
-
209
- describe '#run_ping!' do
210
- it 'sends ping messages when the websocket connection is idle' do
211
- allow(socket).to receive(:time_since_last_message).and_return(30)
212
- expect(socket).to receive(:send_data).with('{"type":"ping","id":1}')
213
- client.run_ping!
214
- end
215
-
216
- it 'reconnects the websocket if it has been idle for too long' do
217
- allow(socket).to receive(:time_since_last_message).and_return(75)
218
- allow(socket).to receive(:connected?).and_return(true)
219
- expect(socket).to receive(:close)
220
- expect(socket).to receive(:restart_async)
221
- client.run_ping!
222
- end
223
-
224
- [
225
- EOFError,
226
- Errno::ECONNRESET,
227
- Errno::EPIPE,
228
- Faraday::ClientError,
229
- Slack::Web::Api::Errors::SlackError
230
- ].each do |err|
231
- context "raising #{err}" do
232
- it 'does not terminate the ping worker' do
233
- allow(socket).to receive(:time_since_last_message) { raise err }
234
- expect(socket).not_to receive(:send_data)
235
- client.run_ping!
236
- end
237
- end
238
- end
239
- context 'raising Slack::Web::Api::Errors::SlackError' do
240
- %w[invalid_auth account_inactive].each do |code|
241
- context code do
242
- it 'does not terminate the ping worker' do
243
- allow(socket).to receive(:time_since_last_message) {
244
- raise Slack::Web::Api::Errors::SlackError, code
245
- }
246
- expect(socket).not_to receive(:send_data)
247
- expect do
248
- client.run_ping!
249
- end.to raise_error Slack::Web::Api::Errors::SlackError, code
250
- end
251
- end
252
- end
253
- end
254
- end
255
- end
256
-
257
- describe 'to_s' do
258
- it 'defaults to class instance' do
259
- expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
260
- end
261
- end
262
- end
263
-
264
- context 'client with starter store', vcr: { cassette_name: 'web/rtm_connect' } do
265
- let(:client) { described_class.new(store_class: Slack::RealTime::Stores::Starter) }
266
- let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
267
-
268
- describe '#start!' do
269
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
270
-
271
- before do
272
- allow(Slack::RealTime::Socket).to(
273
- receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
274
- )
275
- allow(socket).to receive(:connect!)
276
- allow(socket).to receive(:start_sync)
277
- client.start!
278
- end
279
-
280
- describe 'properties provided upon connection' do
281
- it 'sets url' do
282
- expect(client.url).to eq url
283
- end
284
-
285
- it 'sets team' do
286
- expect(client.team.domain).to eq 'dblockdotorg'
287
- end
288
-
289
- it 'sets self' do
290
- expect(client.self.id).to eq 'U0J1GAHN1'
291
- end
292
-
293
- it 'no teams' do
294
- expect(client.teams).to be_nil
295
- end
296
-
297
- it 'no users' do
298
- expect(client.users).to be_nil
299
- end
300
-
301
- it 'no bots' do
302
- expect(client.bots).to be_nil
303
- end
304
-
305
- it 'no public channels' do
306
- expect(client.public_channels).to be_nil
307
- end
308
-
309
- it 'no private channels' do
310
- expect(client.private_channels).to be_nil
311
- end
312
-
313
- it 'no ims' do
314
- expect(client.ims).to be_nil
315
- end
316
-
317
- it 'no mpims' do
318
- expect(client.mpims).to be_nil
319
- end
320
-
321
- it 'includes team name in to_s' do
322
- expect(client.to_s).to eq(
323
- "id=#{client.team.id}, name=#{client.team.name}, domain=#{client.team.domain}"
324
- )
325
- end
326
- end
327
-
328
- it 'uses web client to fetch url' do
329
- expect(client.web_client).to be_a Slack::Web::Client
330
- end
331
-
332
- it 'remembers socket' do
333
- expect(client.instance_variable_get(:@socket)).to eq socket
334
- end
335
-
336
- it 'cannot be invoked twice' do
337
- expect do
338
- client.start!
339
- end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
340
- end
341
-
342
- describe '#stop!' do
343
- before do
344
- allow(socket).to receive(:disconnect!)
345
- client.stop!
346
- end
347
-
348
- it 'cannot be invoked twice' do
349
- client.instance_variable_set(:@socket, nil) # caused by a :close callback
350
- expect do
351
- client.stop!
352
- end.to raise_error Slack::RealTime::Client::ClientNotStartedError
353
- end
354
- end
355
-
356
- describe '#next_id' do
357
- it 'increments' do
358
- previous_id = client.send(:next_id)
359
- expect(client.send(:next_id)).to eq previous_id + 1
360
- end
361
- end
362
- end
363
- end
364
-
365
- context 'client with nil store', vcr: { cassette_name: 'web/rtm_connect' } do
366
- let(:client) { described_class.new(store_class: nil) }
367
- let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
368
-
369
- it 'sets store to nil' do
370
- expect(client.store).to be_nil
371
- end
372
-
373
- it "doesn't handle events" do
374
- event = Slack::RealTime::Event.new(
375
- 'type' => 'team_rename',
376
- 'name' => 'New Team Name Inc.'
377
- )
378
- expect(client).not_to receive(:run_handlers)
379
- client.send(:dispatch, event)
380
- end
381
-
382
- it 'self' do
383
- expect(client.self).to be_nil
384
- end
385
-
386
- it 'team' do
387
- expect(client.team).to be_nil
388
- end
389
-
390
- describe 'to_s' do
391
- it 'defaults to class instance' do
392
- expect(client.to_s).to match(/^#<Slack::RealTime::Client:0x\h+>$/)
393
- end
394
- end
395
- end
396
-
397
- context 'client with defaults' do
398
- let(:client) { described_class.new }
399
-
400
- describe '#initialize' do
401
- it 'sets ping' do
402
- expect(client.websocket_ping).to eq 30
403
- end
404
-
405
- it "doesn't set proxy" do
406
- expect(client.websocket_proxy).to be_nil
407
- end
408
-
409
- it 'defaults logger' do
410
- expect(client.send(:logger)).to be_a ::Logger
411
- end
412
-
413
- it 'sets default store_class' do
414
- expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Starter
415
- end
416
-
417
- (Slack::RealTime::Config::ATTRIBUTES - %i[logger store_class token]).each do |key|
418
- it "sets #{key}" do
419
- expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
420
- end
421
- end
422
- end
423
-
424
- describe '#run_ping?' do
425
- it 'returns true when websocket_ping is greater than 0' do
426
- client.websocket_ping = 30
427
- expect(client.run_ping?).to be true
428
- end
429
-
430
- it 'returns false when websocket_ping is less than 1' do
431
- client.websocket_ping = 0
432
- expect(client.run_ping?).to be false
433
- client.websocket_ping = nil
434
- expect(client.run_ping?).to be false
435
- end
436
- end
437
- end
438
-
439
- context 'with custom settings' do
440
- describe '#initialize' do
441
- Slack::RealTime::Config::ATTRIBUTES.each do |key|
442
- context key.to_s do
443
- let(:client) { described_class.new(key => 'custom') }
444
-
445
- it "sets #{key}" do
446
- expect(client.send(key)).not_to eq Slack::RealTime::Config.send(key)
447
- expect(client.send(key)).to eq 'custom'
448
- end
449
- end
450
- end
451
- end
452
-
453
- describe 'logger accessor' do
454
- let(:client) { described_class.new }
455
-
456
- it 'exposes public logger' do
457
- expect(client.logger).to be_a(::Logger)
458
- end
459
-
460
- it 'exposes public logger=' do
461
- expect { client.logger = nil }.not_to raise_error(NoMethodError)
462
- end
463
- end
464
- end
465
-
466
- context 'global config' do
467
- after do
468
- described_class.config.reset
469
- end
470
-
471
- let(:url) { 'wss://cerberus-xxxx.lb.slack-msgs.com/websocket/uid' }
472
- let(:client) { described_class.new }
473
-
474
- context 'ping' do
475
- before do
476
- described_class.configure do |config|
477
- config.websocket_ping = 15
478
- end
479
- end
480
-
481
- describe '#initialize' do
482
- it 'sets ping' do
483
- expect(client.websocket_ping).to eq 15
484
- end
485
-
486
- it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_connect' } do
487
- expect(Slack::RealTime::Concurrency::Mock::WebSocket).to(
488
- receive(:new).with(url, nil, { ping: 15 }).and_return(ws)
489
- )
490
- client.start!
491
- end
492
-
493
- it 'sets start_options' do
494
- expect(client.start_options).to eq(request: { timeout: 180 })
495
- end
496
- end
497
- end
498
-
499
- context 'proxy' do
500
- before do
501
- described_class.configure do |config|
502
- config.websocket_proxy = {
503
- origin: 'http://username:password@proxy.example.com',
504
- headers: { 'User-Agent' => 'ruby' }
505
- }
506
- end
507
- end
508
-
509
- describe '#initialize' do
510
- it 'sets proxy' do
511
- expect(client.websocket_proxy).to eq(
512
- origin: 'http://username:password@proxy.example.com',
513
- headers: { 'User-Agent' => 'ruby' }
514
- )
515
- end
516
-
517
- it 'creates a connection with custom proxy', vcr: { cassette_name: 'web/rtm_connect' } do
518
- expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
519
- url,
520
- nil,
521
- {
522
- ping: 30,
523
- proxy: {
524
- origin: 'http://username:password@proxy.example.com',
525
- headers: { 'User-Agent' => 'ruby' }
526
- }
527
- }
528
- ).and_return(ws)
529
- client.start!
530
- end
531
- end
532
- end
533
-
534
- context 'start_options' do
535
- before do
536
- described_class.configure do |config|
537
- config.start_options = { presence_sub: true }
538
- end
539
- end
540
-
541
- describe '#initialize' do
542
- it 'sets start_options' do
543
- expect(client.start_options).to eq(presence_sub: true)
544
- end
545
-
546
- context 'start!' do
547
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
548
-
549
- before do
550
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
551
- allow(socket).to receive(:connect!)
552
- allow(socket).to receive(:start_sync)
553
- end
554
-
555
- it 'calls rtm.connect with start options', vcr: { cassette_name: 'web/rtm_connect' } do
556
- expect(client.web_client).to(
557
- receive(:rtm_connect).with({ presence_sub: true }).and_call_original
558
- )
559
- client.start!
560
- end
561
- end
562
- end
563
- end
564
-
565
- context 'store_class' do
566
- context 'when configured with Starter class' do
567
- before do
568
- described_class.configure do |config|
569
- config.store_class = Slack::RealTime::Stores::Starter
570
- end
571
- end
572
-
573
- describe '#initialize' do
574
- it 'can override the configured store class' do
575
- client = described_class.new(store_class: Slack::RealTime::Stores::Store)
576
- expect(client.send(:store_class)).to eq Slack::RealTime::Stores::Store
577
- end
578
-
579
- it 'sets store_class' do
580
- expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter)
581
- end
582
-
583
- context 'start!' do
584
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
585
-
586
- before do
587
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
588
- allow(socket).to receive(:connect!)
589
- allow(socket).to receive(:start_sync)
590
- end
591
-
592
- it 'instantiates the correct store class', vcr: { cassette_name: 'web/rtm_connect' } do
593
- client.start!
594
- expect(client.store).to be_a Slack::RealTime::Stores::Starter
595
- end
596
- end
597
- end
598
- end
599
- end
600
- end
601
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe 'Slack::RealTime::Concurrency::Async::Socket', skip: (
5
- ENV['CONCURRENCY'] != 'async-websocket'
6
- ) do
7
- context 'global config' do
8
- let(:client) { Slack::RealTime::Concurrency::Async::Socket.new(nil) }
9
-
10
- context 'run_async' do
11
- it 'returns an Async::Task' do
12
- expect(client.run_async {}).to be_a Async::Task
13
- end
14
- end
15
- end
16
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.shared_examples_for 'a realtime socket' do
5
- let(:url) { 'wss://ms174.slack-msgs.com/websocket/xyz' }
6
- let(:logger) { ::Logger.new($stdout) }
7
- let(:socket) { described_class.new(url, ping: 42, logger: logger) }
8
- describe '#initialize' do
9
- it 'sets url' do
10
- expect(socket.url).to eq url
11
- end
12
- end
13
-
14
- describe 'api' do
15
- %i[start_sync start_sync disconnect! connect! connected? send_data close].each do |m|
16
- it m do
17
- expect(socket).to respond_to(m)
18
- end
19
- end
20
- end
21
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe 'with CONCURRENCY', skip: ( # rubocop:disable RSpec/DescribeClass
5
- (!ENV['CONCURRENCY']) && 'missing CONCURRENCY'
6
- ) do
7
- it 'detects concurrency' do
8
- expect(Slack::RealTime::Config.concurrency).to eq Slack::RealTime::Concurrency::Async
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe 'without CONCURRENCY', skip: ( # rubocop:disable RSpec/DescribeClass
5
- (ENV['CONCURRENCY']) && 'CONCURRENCY is set'
6
- ) do
7
- it 'raises NoConcurrencyError' do
8
- expect { Slack::RealTime::Config.concurrency }.to raise_error Slack::RealTime::Config::NoConcurrencyError
9
- end
10
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_connect' } do
5
- include_context 'connected client'
6
-
7
- context 'bot' do
8
- it 'bot_added' do
9
- expect do
10
- event = Slack::RealTime::Event.new(
11
- 'type' => 'bot_added',
12
- 'bot' => {
13
- 'id' => 'B024BE7LH',
14
- 'name' => 'hugbot',
15
- 'icons' => {
16
- 'image_48' => 'https:\/\/slack.com\/path\/to\/hugbot_48.png'
17
- }
18
- }
19
- )
20
- client.send(:dispatch, event)
21
- end.to change(client.bots, :count).by(1)
22
- bot = client.bots['B024BE7LH']
23
- expect(bot['id']).to eq 'B024BE7LH'
24
- expect(bot['name']).to eq 'hugbot'
25
- expect(bot['icons']['image_48']).to eq 'https:\/\/slack.com\/path\/to\/hugbot_48.png'
26
- end
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
45
- end
46
- end
47
- end