slack-ruby-client 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{integtest.yml → integration_test.yml} +6 -5
  3. data/.github/workflows/{rubocop.yml → lint.yml} +5 -4
  4. data/.github/workflows/{danger.yml → pr_lint.yml} +8 -6
  5. data/.github/workflows/test.yml +4 -2
  6. data/.gitignore +0 -1
  7. data/.rubocop.yml +4 -0
  8. data/.rubocop_todo.yml +8 -14
  9. data/.ruby-version +1 -0
  10. data/CHANGELOG.md +14 -0
  11. data/CONTRIBUTING.md +5 -4
  12. data/Gemfile +1 -6
  13. data/README.md +60 -63
  14. data/RELEASING.md +1 -1
  15. data/UPGRADING.md +28 -0
  16. data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
  17. data/bin/commands/admin_conversations.rb +12 -11
  18. data/bin/commands/admin_users.rb +1 -1
  19. data/bin/commands/admin_users_session.rb +1 -1
  20. data/bin/commands/apps_connections.rb +2 -2
  21. data/bin/commands/bookmarks.rb +1 -0
  22. data/bin/commands/chat.rb +9 -6
  23. data/bin/commands/conversations.rb +8 -6
  24. data/bin/commands/files.rb +24 -0
  25. data/bin/commands/rtm.rb +0 -15
  26. data/bin/commands/views.rb +4 -2
  27. data/bin/commands.rb +1 -0
  28. data/bin/slack +1 -1
  29. data/lib/slack/real_time/api/message.rb +3 -2
  30. data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
  31. data/lib/slack/real_time/api/typing.rb +2 -1
  32. data/lib/slack/real_time/client.rb +8 -26
  33. data/lib/slack/real_time/config.rb +3 -3
  34. data/lib/slack/real_time/models/channel.rb +4 -0
  35. data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
  36. data/lib/slack/real_time/models.rb +2 -1
  37. data/lib/slack/real_time/stores/base.rb +25 -9
  38. data/lib/slack/real_time/stores/starter.rb +323 -309
  39. data/lib/slack/real_time/stores/store.rb +265 -198
  40. data/lib/slack/real_time/stores.rb +1 -7
  41. data/lib/slack/version.rb +1 -1
  42. data/lib/slack/web/api/endpoints/admin_analytics.rb +1 -1
  43. data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
  44. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +1 -1
  45. data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
  46. data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
  47. data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
  48. data/lib/slack/web/api/endpoints/admin_conversations.rb +30 -28
  49. data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
  50. data/lib/slack/web/api/endpoints/admin_emoji.rb +7 -7
  51. data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
  52. data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
  53. data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
  54. data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
  55. data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
  56. data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
  57. data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
  58. data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
  59. data/lib/slack/web/api/endpoints/apps.rb +2 -2
  60. data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
  61. data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
  62. data/lib/slack/web/api/endpoints/apps_manifest.rb +6 -6
  63. data/lib/slack/web/api/endpoints/bookmarks.rb +10 -8
  64. data/lib/slack/web/api/endpoints/bots.rb +1 -1
  65. data/lib/slack/web/api/endpoints/calls.rb +5 -5
  66. data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
  67. data/lib/slack/web/api/endpoints/chat.rb +36 -30
  68. data/lib/slack/web/api/endpoints/conversations.rb +37 -33
  69. data/lib/slack/web/api/endpoints/dialog.rb +2 -2
  70. data/lib/slack/web/api/endpoints/dnd.rb +1 -1
  71. data/lib/slack/web/api/endpoints/files.rb +45 -8
  72. data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
  73. data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
  74. data/lib/slack/web/api/endpoints/migration.rb +1 -1
  75. data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
  76. data/lib/slack/web/api/endpoints/pins.rb +3 -3
  77. data/lib/slack/web/api/endpoints/reactions.rb +4 -4
  78. data/lib/slack/web/api/endpoints/reminders.rb +5 -5
  79. data/lib/slack/web/api/endpoints/rtm.rb +0 -23
  80. data/lib/slack/web/api/endpoints/search.rb +3 -3
  81. data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
  82. data/lib/slack/web/api/endpoints/usergroups.rb +4 -4
  83. data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
  84. data/lib/slack/web/api/endpoints/users.rb +4 -4
  85. data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
  86. data/lib/slack/web/api/endpoints/views.rb +16 -11
  87. data/lib/slack/web/api/endpoints/workflows.rb +4 -4
  88. data/lib/slack/web/api/endpoints.rb +2 -0
  89. data/lib/slack/web/api/errors.rb +56 -6
  90. data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
  91. data/lib/slack/web/api/mixins/users.id.rb +1 -1
  92. data/lib/slack/web/api/mixins/users.search.rb +2 -1
  93. data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
  94. data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
  95. data/lib/slack/web/api/patches/views.view-json.patch +55 -0
  96. data/lib/slack/web/api/templates/method.erb +1 -1
  97. data/lib/slack/web/config.rb +2 -2
  98. data/lib/tasks/real_time.rake +44 -22
  99. data/lib/tasks/web.rake +9 -2
  100. data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
  101. data/spec/slack/events/config_spec.rb +2 -0
  102. data/spec/slack/events/request_spec.rb +4 -0
  103. data/spec/slack/messages/formatting_spec.rb +10 -0
  104. data/spec/slack/real_time/api/message_spec.rb +1 -1
  105. data/spec/slack/real_time/api/ping_spec.rb +1 -1
  106. data/spec/slack/real_time/api/typing_spec.rb +1 -1
  107. data/spec/slack/real_time/client_spec.rb +73 -111
  108. data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
  109. data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
  110. data/spec/slack/real_time/event_handlers/im_spec.rb +28 -25
  111. data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
  112. data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +24 -20
  113. data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
  114. data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
  115. data/spec/slack/real_time/stores/store_spec.rb +50 -0
  116. data/spec/slack/slack_spec.rb +1 -0
  117. data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
  118. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +17 -1
  119. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +2 -0
  120. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +13 -4
  121. data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
  122. data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
  123. data/spec/slack/web/api/mixins/users_spec.rb +2 -0
  124. data/spec/slack/web/api/pagination/cursor_spec.rb +4 -0
  125. data/spec/slack/web/client_spec.rb +14 -4
  126. data/spec/support/real_time/loaded_client.rb +120 -0
  127. metadata +18 -35
  128. data/bin/commands/admin_conversations_whitelist.rb +0 -37
  129. data/bin/commands/apps_permissions.rb +0 -23
  130. data/bin/commands/apps_permissions_resources.rb +0 -15
  131. data/bin/commands/apps_permissions_scopes.rb +0 -13
  132. data/bin/commands/apps_permissions_users.rb +0 -26
  133. data/bin/commands/channels.rb +0 -23
  134. data/bin/commands/groups.rb +0 -14
  135. data/bin/commands/im.rb +0 -6
  136. data/bin/commands/mpim.rb +0 -6
  137. data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
  138. data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
  139. data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
  140. data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
  141. data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
  142. data/lib/slack/web/api/endpoints/channels.rb +0 -25
  143. data/lib/slack/web/api/endpoints/groups.rb +0 -13
  144. data/lib/slack/web/api/endpoints/im.rb +0 -13
  145. data/lib/slack/web/api/endpoints/mpim.rb +0 -13
  146. data/lib/slack/web/api/endpoints/presence.rb +0 -23
  147. data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
  148. data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
  149. data/spec/fixtures/slack/web/rtm_start.yml +0 -815
  150. data/spec/slack/real_time/rtm_start_spec.rb +0 -14
  151. data/spec/slack/real_time/store_spec.rb +0 -12
@@ -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
 
@@ -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
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!)
@@ -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
@@ -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,
@@ -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
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!)
@@ -338,6 +351,7 @@ RSpec.describe Slack::RealTime::Client do
338
351
  it 'sets store to nil' do
339
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
365
  expect(client.self).to be_nil
351
366
  end
367
+
352
368
  it 'team' do
353
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
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
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,7 +495,8 @@ 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,
@@ -490,14 +516,15 @@ RSpec.describe Slack::RealTime::Client do
490
516
  context 'start_options' do
491
517
  before do
492
518
  described_class.configure do |config|
493
- config.start_options = { simple_latest: true }
519
+ config.start_options = { presence_sub: true }
494
520
  end
495
521
  end
496
522
 
497
523
  describe '#initialize' do
498
524
  it 'sets start_options' do
499
- expect(client.start_options).to eq(simple_latest: true)
525
+ expect(client.start_options).to eq(presence_sub: true)
500
526
  end
527
+
501
528
  context 'start!' do
502
529
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
503
530
 
@@ -507,9 +534,9 @@ RSpec.describe Slack::RealTime::Client do
507
534
  allow(socket).to receive(:start_sync)
508
535
  end
509
536
 
510
- 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
511
538
  expect(client.web_client).to(
512
- receive(:rtm_start).with({ simple_latest: true }).and_call_original
539
+ receive(:rtm_connect).with({ presence_sub: true }).and_call_original
513
540
  )
514
541
  client.start!
515
542
  end
@@ -518,7 +545,7 @@ RSpec.describe Slack::RealTime::Client do
518
545
  end
519
546
 
520
547
  context 'store_class' do
521
- context 'starter' do
548
+ context 'when configured with Starter class' do
522
549
  before do
523
550
  described_class.configure do |config|
524
551
  config.store_class = Slack::RealTime::Stores::Starter
@@ -526,13 +553,15 @@ RSpec.describe Slack::RealTime::Client do
526
553
  end
527
554
 
528
555
  describe '#initialize' do
529
- it 'can be overriden explicitly' do
530
- client = described_class.new(store_class: Slack::RealTime::Store)
531
- 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
532
559
  end
560
+
533
561
  it 'sets store_class' do
534
562
  expect(client.send(:store_class)).to eq(Slack::RealTime::Stores::Starter)
535
563
  end
564
+
536
565
  context 'start!' do
537
566
  let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
538
567
 
@@ -549,73 +578,6 @@ RSpec.describe Slack::RealTime::Client do
549
578
  end
550
579
  end
551
580
  end
552
-
553
- context 'store' do
554
- before do
555
- described_class.configure do |config|
556
- config.store_class = Slack::RealTime::Stores::Store
557
- end
558
- end
559
-
560
- describe '#initialize' do
561
- context 'start!' do
562
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
563
-
564
- before do
565
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
566
- allow(socket).to receive(:connect!)
567
- allow(socket).to receive(:start_sync)
568
- end
569
-
570
- it 'calls rtm_start and not rtm_connect', vcr: { cassette_name: 'web/rtm_start' } do
571
- expect(client.web_client).to receive(:rtm_start).and_call_original
572
- client.start!
573
- end
574
- end
575
- end
576
- end
577
- end
578
-
579
- context 'start_method' do
580
- describe '#initialize' do
581
- it 'can be overriden explicitly' do
582
- client = described_class.new(start_method: :overriden)
583
- expect(client.send(:start_method)).to eq :overriden
584
- end
585
- context 'with start_method' do
586
- before do
587
- described_class.configure do |config|
588
- config.start_method = :overriden
589
- end
590
- end
591
-
592
- it 'sets start_method' do
593
- expect(client.send(:start_method)).to eq :overriden
594
- end
595
- it 'calls the overriden method' do
596
- expect(client.web_client).to receive(:overriden).and_raise('overriden')
597
- expect do
598
- client.start!
599
- end.to raise_error RuntimeError, 'overriden'
600
- end
601
- end
602
-
603
- context 'start!' do
604
- let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
605
-
606
- before do
607
- allow(Slack::RealTime::Socket).to receive(:new).and_return(socket)
608
- allow(socket).to receive(:connect!)
609
- allow(socket).to receive(:start_sync)
610
- end
611
-
612
- it 'defaults to :rtm_start when using full store',
613
- vcr: { cassette_name: 'web/rtm_start' } do
614
- expect(client.web_client).to receive(:rtm_start).and_call_original
615
- client.start!
616
- end
617
- end
618
- end
619
581
  end
620
582
  end
621
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
@@ -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 'im' do
8
- it 'sets im data' do
9
- expect(client.ims.count).to eq 10
10
- end
11
8
  it 'im_created' do
12
9
  expect(client.ims['CDEADBEEF']).to be_nil
13
10
  event = Slack::RealTime::Event.new(
@@ -22,27 +19,33 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
22
19
  expect(im).not_to be_nil
23
20
  expect(im.name).to eq 'beef'
24
21
  end
25
- it 'im_open' do
26
- im = client.ims['D0J1H6QTV']
27
- expect(im).not_to be_nil
28
- im.is_open = false
29
- event = Slack::RealTime::Event.new(
30
- 'type' => 'im_open',
31
- 'channel' => 'D0J1H6QTV'
32
- )
33
- client.send(:dispatch, event)
34
- expect(im.is_open).to be true
35
- end
36
- it 'im_close' do
37
- im = client.ims['D0J1H6QTV']
38
- expect(im).not_to be_nil
39
- expect(im.is_open).to be true
40
- event = Slack::RealTime::Event.new(
41
- 'type' => 'im_close',
42
- 'channel' => 'D0J1H6QTV'
43
- )
44
- client.send(:dispatch, event)
45
- expect(im.is_open).to be false
22
+
23
+ context 'with im loaded in the store' do
24
+ include_context 'loaded client'
25
+
26
+ it 'im_open' do
27
+ im = client.ims['D0J1H6QTV']
28
+ expect(im).not_to be_nil
29
+ im.is_open = false
30
+ event = Slack::RealTime::Event.new(
31
+ 'type' => 'im_open',
32
+ 'channel' => 'D0J1H6QTV'
33
+ )
34
+ client.send(:dispatch, event)
35
+ expect(im.is_open).to be true
36
+ end
37
+
38
+ it 'im_close' do
39
+ im = client.ims['D0J1H6QTV']
40
+ expect(im).not_to be_nil
41
+ expect(im.is_open).to be true
42
+ event = Slack::RealTime::Event.new(
43
+ 'type' => 'im_close',
44
+ 'channel' => 'D0J1H6QTV'
45
+ )
46
+ client.send(:dispatch, event)
47
+ expect(im.is_open).to be false
48
+ end
46
49
  end
47
50
  end
48
51
  end
@@ -1,15 +1,17 @@
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
+ include_context 'loaded client'
6
7
 
7
- context 'group' do
8
- it 'sets group data' do
9
- expect(client.groups.count).to eq 1
8
+ context 'private channel' do
9
+ it 'sets private channel data' do
10
+ expect(client.private_channels.count).to eq 1
10
11
  end
12
+
11
13
  it 'group_joined' do
12
- expect(client.groups['CDEADBEEF']).to be_nil
14
+ expect(client.private_channels['CDEADBEEF']).to be_nil
13
15
  event = Slack::RealTime::Event.new(
14
16
  'type' => 'group_joined',
15
17
  'channel' => {
@@ -18,43 +20,47 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
18
20
  }
19
21
  )
20
22
  client.send(:dispatch, event)
21
- group = client.groups['CDEADBEEF']
22
- expect(group).not_to be_nil
23
- expect(group.name).to eq 'beef'
23
+ channel = client.private_channels['CDEADBEEF']
24
+ expect(channel).not_to be_nil
25
+ expect(channel.name).to eq 'beef'
24
26
  end
27
+
25
28
  it 'group_left' do
26
- group = client.groups['G0K7EV5A7']
27
- expect(group.members).to include client.self.id
29
+ channel = client.private_channels['G0K7EV5A7']
30
+ expect(channel.members).to include client.self.id
28
31
  event = Slack::RealTime::Event.new(
29
32
  'type' => 'group_left',
30
33
  'channel' => 'G0K7EV5A7'
31
34
  )
32
35
  client.send(:dispatch, event)
33
- expect(group.members).not_to include client.self.id
36
+ expect(client.private_channels['G0K7EV5A7']).to be_nil
34
37
  end
38
+
35
39
  it 'group_archive' do
36
- group = client.groups['G0K7EV5A7']
37
- expect(group.is_archived).to be false
40
+ channel = client.private_channels['G0K7EV5A7']
41
+ expect(channel.is_archived).to be false
38
42
  event = Slack::RealTime::Event.new(
39
43
  'type' => 'group_archive',
40
44
  'channel' => 'G0K7EV5A7'
41
45
  )
42
46
  client.send(:dispatch, event)
43
- expect(group.is_archived).to be true
47
+ expect(channel.is_archived).to be true
44
48
  end
49
+
45
50
  it 'group_unarchive' do
46
- group = client.groups['G0K7EV5A7']
47
- group.is_archived = true
51
+ channel = client.private_channels['G0K7EV5A7']
52
+ channel.is_archived = true
48
53
  event = Slack::RealTime::Event.new(
49
54
  'type' => 'group_unarchive',
50
55
  'channel' => 'G0K7EV5A7'
51
56
  )
52
57
  client.send(:dispatch, event)
53
- expect(group.is_archived).to be false
58
+ expect(channel.is_archived).to be false
54
59
  end
60
+
55
61
  it 'group_rename' do
56
- group = client.groups['G0K7EV5A7']
57
- expect(group.name).to eq 'mpdm-dblock--rubybot--player1-1'
62
+ channel = client.private_channels['G0K7EV5A7']
63
+ expect(channel.name).to eq 'mpdm-dblock--rubybot--player1-1'
58
64
  event = Slack::RealTime::Event.new(
59
65
  'type' => 'group_rename',
60
66
  'channel' => {
@@ -64,28 +70,30 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
64
70
  }
65
71
  )
66
72
  client.send(:dispatch, event)
67
- expect(group.name).to eq 'updated'
73
+ expect(channel.name).to eq 'updated'
68
74
  end
75
+
69
76
  it 'group_open' do
70
- group = client.groups['G0K7EV5A7']
71
- expect(group).not_to be_nil
77
+ channel = client.private_channels['G0K7EV5A7']
78
+ expect(channel).not_to be_nil
72
79
  event = Slack::RealTime::Event.new(
73
80
  'type' => 'group_open',
74
81
  'channel' => 'G0K7EV5A7'
75
82
  )
76
83
  client.send(:dispatch, event)
77
- expect(group.is_open).to be true
84
+ expect(channel.is_open).to be true
78
85
  end
86
+
79
87
  it 'group_close' do
80
- group = client.groups['G0K7EV5A7']
81
- expect(group).not_to be_nil
82
- group.is_open = true
88
+ channel = client.private_channels['G0K7EV5A7']
89
+ expect(channel).not_to be_nil
90
+ channel.is_open = true
83
91
  event = Slack::RealTime::Event.new(
84
92
  'type' => 'group_close',
85
93
  'channel' => 'G0K7EV5A7'
86
94
  )
87
95
  client.send(:dispatch, event)
88
- expect(group.is_open).to be false
96
+ expect(channel.is_open).to be false
89
97
  end
90
98
  end
91
99
  end