slack-ruby-client 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/update_api.yml +1 -1
  3. data/.rubocop_todo.yml +43 -13
  4. data/CHANGELOG.md +12 -0
  5. data/CONTRIBUTING.md +7 -7
  6. data/Gemfile +1 -0
  7. data/README.md +46 -28
  8. data/bin/commands/admin_conversations.rb +21 -0
  9. data/bin/commands/admin_users_session.rb +1 -1
  10. data/bin/commands/admin_workflows.rb +3 -1
  11. data/bin/commands/admin_workflows_triggers_types_permissions.rb +4 -4
  12. data/bin/commands/assistant_threads.rb +45 -0
  13. data/bin/commands/bookmarks.rb +1 -0
  14. data/bin/commands/canvases.rb +4 -4
  15. data/bin/commands/canvases_access.rb +3 -3
  16. data/bin/commands/chat.rb +7 -3
  17. data/bin/commands/conversations.rb +5 -5
  18. data/bin/commands/conversations_canvases.rb +2 -2
  19. data/bin/commands/conversations_requestSharedInvite.rb +48 -0
  20. data/bin/commands/files.rb +2 -1
  21. data/bin/commands/usergroups.rb +5 -0
  22. data/bin/commands/usergroups_users.rb +2 -0
  23. data/examples/files_upload_v2/.env.example +1 -0
  24. data/examples/files_upload_v2/Gemfile +5 -0
  25. data/examples/files_upload_v2/README.md +13 -0
  26. data/examples/files_upload_v2/files_upload_v2.rb +37 -0
  27. data/examples/oauth_v2/.env.example +4 -0
  28. data/examples/oauth_v2/Gemfile +7 -0
  29. data/examples/oauth_v2/README.md +33 -0
  30. data/examples/oauth_v2/oauth_v2.rb +60 -0
  31. data/lib/slack/messages/formatting.rb +1 -1
  32. data/lib/slack/version.rb +1 -1
  33. data/lib/slack/web/api/endpoints/admin_conversations.rb +35 -0
  34. data/lib/slack/web/api/endpoints/admin_users_session.rb +2 -3
  35. data/lib/slack/web/api/endpoints/admin_workflows.rb +5 -1
  36. data/lib/slack/web/api/endpoints/admin_workflows_triggers_types_permissions.rb +2 -2
  37. data/lib/slack/web/api/endpoints/assistant_threads.rb +68 -0
  38. data/lib/slack/web/api/endpoints/bookmarks.rb +2 -0
  39. data/lib/slack/web/api/endpoints/canvases.rb +2 -2
  40. data/lib/slack/web/api/endpoints/canvases_access.rb +4 -4
  41. data/lib/slack/web/api/endpoints/chat.rb +12 -3
  42. data/lib/slack/web/api/endpoints/conversations.rb +4 -4
  43. data/lib/slack/web/api/endpoints/conversations_canvases.rb +1 -1
  44. data/lib/slack/web/api/endpoints/conversations_requestSharedInvite.rb +73 -0
  45. data/lib/slack/web/api/endpoints/files.rb +3 -1
  46. data/lib/slack/web/api/endpoints/usergroups.rb +10 -0
  47. data/lib/slack/web/api/endpoints/usergroups_users.rb +4 -0
  48. data/lib/slack/web/api/endpoints.rb +4 -0
  49. data/lib/slack/web/api/errors.rb +48 -4
  50. data/lib/slack/web/api/helpers/files.rb +87 -0
  51. data/lib/slack/web/api/helpers.rb +13 -0
  52. data/lib/slack/web/api/templates/method_spec.erb +4 -3
  53. data/lib/slack/web/client.rb +1 -0
  54. data/lib/slack/web/faraday/connection.rb +13 -26
  55. data/lib/slack/web/faraday/options.rb +24 -0
  56. data/lib/slack/web/faraday/request.rb +2 -1
  57. data/lib/slack-ruby-client.rb +2 -0
  58. data/slack-ruby-client.gemspec +2 -1
  59. metadata +32 -154
  60. data/screenshots/create-app.png +0 -0
  61. data/spec/fixtures/slack/web/429_error.yml +0 -81
  62. data/spec/fixtures/slack/web/auth_test_error.yml +0 -81
  63. data/spec/fixtures/slack/web/auth_test_success.yml +0 -81
  64. data/spec/fixtures/slack/web/conversations_info.yml +0 -167
  65. data/spec/fixtures/slack/web/conversations_setTopic.yml +0 -84
  66. data/spec/fixtures/slack/web/conversations_setTopic_one_page.yml +0 -172
  67. data/spec/fixtures/slack/web/conversations_setTopic_paginated.yml +0 -253
  68. data/spec/fixtures/slack/web/paginated_users_list.yml +0 -613
  69. data/spec/fixtures/slack/web/rtm_connect.yml +0 -391
  70. data/spec/fixtures/slack/web/users_info.yml +0 -214
  71. data/spec/fixtures/slack/web/users_list.yml +0 -133
  72. data/spec/fixtures/slack/web/views_open_error.yml +0 -83
  73. data/spec/integration/integration_spec.rb +0 -207
  74. data/spec/slack/config_spec.rb +0 -16
  75. data/spec/slack/events/config_spec.rb +0 -35
  76. data/spec/slack/events/request_spec.rb +0 -199
  77. data/spec/slack/messages/formatting_spec.rb +0 -156
  78. data/spec/slack/real_time/api/message_spec.rb +0 -20
  79. data/spec/slack/real_time/api/ping_spec.rb +0 -17
  80. data/spec/slack/real_time/api/typing_spec.rb +0 -19
  81. data/spec/slack/real_time/client_spec.rb +0 -601
  82. data/spec/slack/real_time/concurrency/clients/async_spec.rb +0 -16
  83. data/spec/slack/real_time/concurrency/it_behaves_like_a_realtime_socket.rb +0 -21
  84. data/spec/slack/real_time/concurrency/with_concurrency_spec.rb +0 -10
  85. data/spec/slack/real_time/concurrency/without_concurrency_spec.rb +0 -10
  86. data/spec/slack/real_time/event_handlers/bot_spec.rb +0 -47
  87. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +0 -16
  88. data/spec/slack/real_time/event_handlers/im_spec.rb +0 -51
  89. data/spec/slack/real_time/event_handlers/private_channel_spec.rb +0 -99
  90. data/spec/slack/real_time/event_handlers/public_channel_spec.rb +0 -123
  91. data/spec/slack/real_time/event_handlers/team_spec.rb +0 -63
  92. data/spec/slack/real_time/event_handlers/user_spec.rb +0 -65
  93. data/spec/slack/real_time/rtm_connect_spec.rb +0 -14
  94. data/spec/slack/real_time/stores/store_spec.rb +0 -50
  95. data/spec/slack/slack_spec.rb +0 -93
  96. data/spec/slack/version_spec.rb +0 -8
  97. data/spec/slack/web/api/endpoints/admin_analytics_spec.rb +0 -13
  98. data/spec/slack/web/api/endpoints/admin_apps_activities_spec.rb +0 -8
  99. data/spec/slack/web/api/endpoints/admin_apps_approved_spec.rb +0 -8
  100. data/spec/slack/web/api/endpoints/admin_apps_config_spec.rb +0 -18
  101. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +0 -13
  102. data/spec/slack/web/api/endpoints/admin_apps_restricted_spec.rb +0 -8
  103. data/spec/slack/web/api/endpoints/admin_apps_spec.rb +0 -18
  104. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +0 -8
  105. data/spec/slack/web/api/endpoints/admin_auth_policy_spec.rb +0 -35
  106. data/spec/slack/web/api/endpoints/admin_barriers_spec.rb +0 -38
  107. data/spec/slack/web/api/endpoints/admin_conversations_ekm_spec.rb +0 -8
  108. data/spec/slack/web/api/endpoints/admin_conversations_restrictAccess_spec.rb +0 -32
  109. data/spec/slack/web/api/endpoints/admin_conversations_spec.rb +0 -133
  110. data/spec/slack/web/api/endpoints/admin_emoji_spec.rb +0 -37
  111. data/spec/slack/web/api/endpoints/admin_functions_permissions_spec.rb +0 -21
  112. data/spec/slack/web/api/endpoints/admin_functions_spec.rb +0 -13
  113. data/spec/slack/web/api/endpoints/admin_inviteRequests_approved_spec.rb +0 -8
  114. data/spec/slack/web/api/endpoints/admin_inviteRequests_denied_spec.rb +0 -8
  115. data/spec/slack/web/api/endpoints/admin_inviteRequests_spec.rb +0 -18
  116. data/spec/slack/web/api/endpoints/admin_roles_spec.rb +0 -30
  117. data/spec/slack/web/api/endpoints/admin_teams_admins_spec.rb +0 -13
  118. data/spec/slack/web/api/endpoints/admin_teams_owners_spec.rb +0 -13
  119. data/spec/slack/web/api/endpoints/admin_teams_settings_spec.rb +0 -53
  120. data/spec/slack/web/api/endpoints/admin_teams_spec.rb +0 -16
  121. data/spec/slack/web/api/endpoints/admin_usergroups_spec.rb +0 -37
  122. data/spec/slack/web/api/endpoints/admin_users_session_spec.rb +0 -41
  123. data/spec/slack/web/api/endpoints/admin_users_spec.rb +0 -67
  124. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +0 -8
  125. data/spec/slack/web/api/endpoints/admin_workflows_collaborators_spec.rb +0 -24
  126. data/spec/slack/web/api/endpoints/admin_workflows_permissions_spec.rb +0 -13
  127. data/spec/slack/web/api/endpoints/admin_workflows_spec.rb +0 -13
  128. data/spec/slack/web/api/endpoints/admin_workflows_triggers_types_permissions_spec.rb +0 -21
  129. data/spec/slack/web/api/endpoints/api_spec.rb +0 -8
  130. data/spec/slack/web/api/endpoints/apps_activities_spec.rb +0 -13
  131. data/spec/slack/web/api/endpoints/apps_auth_external_spec.rb +0 -13
  132. data/spec/slack/web/api/endpoints/apps_connections_spec.rb +0 -8
  133. data/spec/slack/web/api/endpoints/apps_datastore_spec.rb +0 -74
  134. data/spec/slack/web/api/endpoints/apps_event_authorizations_spec.rb +0 -13
  135. data/spec/slack/web/api/endpoints/apps_manifest_spec.rb +0 -44
  136. data/spec/slack/web/api/endpoints/apps_spec.rb +0 -16
  137. data/spec/slack/web/api/endpoints/auth_spec.rb +0 -8
  138. data/spec/slack/web/api/endpoints/auth_teams_spec.rb +0 -8
  139. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +0 -40
  140. data/spec/slack/web/api/endpoints/bots_spec.rb +0 -8
  141. data/spec/slack/web/api/endpoints/calls_participants_spec.rb +0 -24
  142. data/spec/slack/web/api/endpoints/calls_spec.rb +0 -31
  143. data/spec/slack/web/api/endpoints/canvases_access_spec.rb +0 -21
  144. data/spec/slack/web/api/endpoints/canvases_sections_spec.rb +0 -16
  145. data/spec/slack/web/api/endpoints/canvases_spec.rb +0 -21
  146. data/spec/slack/web/api/endpoints/chat_scheduledMessages_spec.rb +0 -8
  147. data/spec/slack/web/api/endpoints/chat_spec.rb +0 -134
  148. data/spec/slack/web/api/endpoints/conversations_canvases_spec.rb +0 -13
  149. data/spec/slack/web/api/endpoints/conversations_externalInvitePermissions_spec.rb +0 -19
  150. data/spec/slack/web/api/endpoints/conversations_spec.rb +0 -8
  151. data/spec/slack/web/api/endpoints/custom_specs/auth_spec.rb +0 -27
  152. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +0 -206
  153. data/spec/slack/web/api/endpoints/custom_specs/conversations_spec.rb +0 -13
  154. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +0 -40
  155. data/spec/slack/web/api/endpoints/custom_specs/users_spec.rb +0 -38
  156. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +0 -112
  157. data/spec/slack/web/api/endpoints/dialog_spec.rb +0 -14
  158. data/spec/slack/web/api/endpoints/dnd_spec.rb +0 -18
  159. data/spec/slack/web/api/endpoints/emoji_spec.rb +0 -8
  160. data/spec/slack/web/api/endpoints/files_comments_spec.rb +0 -16
  161. data/spec/slack/web/api/endpoints/files_remote_spec.rb +0 -24
  162. data/spec/slack/web/api/endpoints/files_spec.rb +0 -57
  163. data/spec/slack/web/api/endpoints/functions_distributions_permissions_spec.rb +0 -10
  164. data/spec/slack/web/api/endpoints/functions_spec.rb +0 -28
  165. data/spec/slack/web/api/endpoints/functions_workflows_steps_responses_spec.rb +0 -13
  166. data/spec/slack/web/api/endpoints/functions_workflows_steps_spec.rb +0 -13
  167. data/spec/slack/web/api/endpoints/migration_spec.rb +0 -13
  168. data/spec/slack/web/api/endpoints/oauth_spec.rb +0 -8
  169. data/spec/slack/web/api/endpoints/oauth_v2_spec.rb +0 -16
  170. data/spec/slack/web/api/endpoints/openid_connect_spec.rb +0 -8
  171. data/spec/slack/web/api/endpoints/pins_spec.rb +0 -23
  172. data/spec/slack/web/api/endpoints/reactions_spec.rb +0 -24
  173. data/spec/slack/web/api/endpoints/reminders_spec.rb +0 -31
  174. data/spec/slack/web/api/endpoints/rtm_spec.rb +0 -8
  175. data/spec/slack/web/api/endpoints/search_spec.rb +0 -23
  176. data/spec/slack/web/api/endpoints/stars_spec.rb +0 -8
  177. data/spec/slack/web/api/endpoints/team_billing_spec.rb +0 -8
  178. data/spec/slack/web/api/endpoints/team_externalTeams_spec.rb +0 -13
  179. data/spec/slack/web/api/endpoints/team_preferences_spec.rb +0 -8
  180. data/spec/slack/web/api/endpoints/team_profile_spec.rb +0 -8
  181. data/spec/slack/web/api/endpoints/team_spec.rb +0 -8
  182. data/spec/slack/web/api/endpoints/tooling_tokens_spec.rb +0 -13
  183. data/spec/slack/web/api/endpoints/usergroups_spec.rb +0 -28
  184. data/spec/slack/web/api/endpoints/usergroups_users_spec.rb +0 -21
  185. data/spec/slack/web/api/endpoints/users_admin_spec.rb +0 -18
  186. data/spec/slack/web/api/endpoints/users_discoverableContacts_spec.rb +0 -13
  187. data/spec/slack/web/api/endpoints/users_prefs_spec.rb +0 -8
  188. data/spec/slack/web/api/endpoints/users_profile_spec.rb +0 -14
  189. data/spec/slack/web/api/endpoints/users_spec.rb +0 -8
  190. data/spec/slack/web/api/endpoints/views_spec.rb +0 -65
  191. data/spec/slack/web/api/endpoints/workflows_spec.rb +0 -34
  192. data/spec/slack/web/api/endpoints/workflows_triggers_permissions_spec.rb +0 -31
  193. data/spec/slack/web/api/error_spec.rb +0 -14
  194. data/spec/slack/web/api/errors/slack_error_spec.rb +0 -33
  195. data/spec/slack/web/api/mixins/conversations_list_spec.rb +0 -21
  196. data/spec/slack/web/api/mixins/conversations_spec.rb +0 -45
  197. data/spec/slack/web/api/mixins/users_spec.rb +0 -52
  198. data/spec/slack/web/api/options_spec.rb +0 -69
  199. data/spec/slack/web/api/pagination/cursor_spec.rb +0 -102
  200. data/spec/slack/web/client_spec.rb +0 -359
  201. data/spec/slack/web/faraday/request_spec.rb +0 -80
  202. data/spec/slack/web/faraday/response/raise_error_spec.rb +0 -86
  203. data/spec/spec_helper.rb +0 -30
  204. data/spec/support/queue_with_timeout.rb +0 -35
  205. data/spec/support/real_time/concurrency/mock.rb +0 -31
  206. data/spec/support/real_time/connected_client.rb +0 -21
  207. data/spec/support/real_time/event.rb +0 -12
  208. data/spec/support/real_time/loaded_client.rb +0 -120
  209. data/spec/support/token.rb +0 -11
  210. 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