slack-ruby-client 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/danger.yml +19 -0
  3. data/.github/workflows/integtest.yml +25 -0
  4. data/.github/workflows/rubocop.yml +13 -0
  5. data/.github/workflows/test.yml +34 -0
  6. data/.gitignore +5 -3
  7. data/.rubocop.yml +2 -1
  8. data/.rubocop_todo.yml +86 -26
  9. data/CHANGELOG.md +13 -0
  10. data/CONTRIBUTING.md +1 -1
  11. data/Gemfile +18 -1
  12. data/Gemfile.danger +6 -0
  13. data/README.md +3 -2
  14. data/RELEASING.md +1 -1
  15. data/bin/commands/admin_apps_requests.rb +11 -0
  16. data/bin/commands/admin_conversations.rb +1 -0
  17. data/bin/commands/admin_emoji.rb +2 -2
  18. data/bin/commands/admin_users_unsupportedVersions.rb +15 -0
  19. data/bin/commands/apps_manifest.rb +1 -0
  20. data/bin/commands/bookmarks.rb +52 -0
  21. data/bin/commands/team.rb +1 -0
  22. data/bin/commands.rb +2 -0
  23. data/lib/slack/real_time/client.rb +2 -2
  24. data/lib/slack/version.rb +1 -1
  25. data/lib/slack/web/api/endpoints/admin_apps_requests.rb +16 -0
  26. data/lib/slack/web/api/endpoints/admin_conversations.rb +2 -0
  27. data/lib/slack/web/api/endpoints/admin_emoji.rb +2 -2
  28. data/lib/slack/web/api/endpoints/admin_users_unsupportedVersions.rb +25 -0
  29. data/lib/slack/web/api/endpoints/apps_manifest.rb +2 -0
  30. data/lib/slack/web/api/endpoints/bookmarks.rb +86 -0
  31. data/lib/slack/web/api/endpoints/chat.rb +1 -1
  32. data/lib/slack/web/api/endpoints/team.rb +2 -0
  33. data/lib/slack/web/api/endpoints.rb +4 -0
  34. data/lib/slack/web/api/errors.rb +28 -2
  35. data/lib/slack/web/api/patches/chat.1.patch +1 -1
  36. data/lib/slack/web/faraday/connection.rb +4 -4
  37. data/lib/slack/web/faraday/request.rb +2 -0
  38. data/lib/slack/web/faraday/response/raise_error.rb +2 -10
  39. data/lib/slack/web/faraday/response/wrap_error.rb +1 -1
  40. data/lib/slack-ruby-client.rb +2 -1
  41. data/lib/tasks/real_time.rake +1 -3
  42. data/slack-ruby-client.gemspec +5 -13
  43. data/spec/integration/integration_spec.rb +1 -1
  44. data/spec/slack/events/request_spec.rb +1 -1
  45. data/spec/slack/real_time/client_spec.rb +20 -18
  46. data/spec/slack/real_time/event_handlers/channel_spec.rb +8 -8
  47. data/spec/slack/real_time/event_handlers/group_spec.rb +2 -2
  48. data/spec/slack/real_time/event_handlers/im_spec.rb +2 -2
  49. data/spec/slack/real_time/store_spec.rb +2 -2
  50. data/spec/slack/slack_spec.rb +4 -4
  51. data/spec/slack/version_spec.rb +1 -1
  52. data/spec/slack/web/api/endpoints/admin_apps_requests_spec.rb +5 -0
  53. data/spec/slack/web/api/endpoints/admin_users_unsupportedVersions_spec.rb +8 -0
  54. data/spec/slack/web/api/endpoints/bookmarks_spec.rb +40 -0
  55. data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +28 -16
  56. data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +4 -2
  57. data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +22 -14
  58. data/spec/slack/web/api/pagination/cursor_spec.rb +7 -7
  59. data/spec/slack/web/client_spec.rb +25 -7
  60. data/spec/slack/web/faraday/response/raise_error_spec.rb +1 -1
  61. data/spec/support/real_time/connected_client.rb +1 -1
  62. metadata +25 -154
  63. data/.travis.yml +0 -29
@@ -73,7 +73,7 @@ RSpec.describe Slack::RealTime::Client do
73
73
 
74
74
  before do
75
75
  allow(Slack::RealTime::Socket).to(
76
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
76
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
77
77
  )
78
78
  allow(socket).to receive(:connect!)
79
79
  allow(socket).to receive(:start_sync)
@@ -124,7 +124,7 @@ RSpec.describe Slack::RealTime::Client do
124
124
  expect(client.web_client).to be_a Slack::Web::Client
125
125
  end
126
126
  it 'remembers socket' do
127
- expect(client.instance_variable_get('@socket')).to eq socket
127
+ expect(client.instance_variable_get(:@socket)).to eq socket
128
128
  end
129
129
  it 'cannot be invoked twice' do
130
130
  expect do
@@ -138,7 +138,7 @@ RSpec.describe Slack::RealTime::Client do
138
138
  end
139
139
 
140
140
  it 'cannot be invoked twice' do
141
- client.instance_variable_set('@socket', nil) # caused by a :close callback
141
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
142
142
  expect do
143
143
  client.stop!
144
144
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
@@ -175,7 +175,7 @@ RSpec.describe Slack::RealTime::Client do
175
175
  end
176
176
 
177
177
  it 'returns false when event is nil' do
178
- expect(client.send(:run_handlers, 'example', {})).to be nil
178
+ expect(client.send(:run_handlers, 'example', {})).to be_nil
179
179
  end
180
180
  end
181
181
  end
@@ -186,7 +186,7 @@ RSpec.describe Slack::RealTime::Client do
186
186
 
187
187
  before do
188
188
  allow(Slack::RealTime::Socket).to(
189
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
189
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
190
190
  )
191
191
  allow(socket).to receive(:connect!)
192
192
  allow(socket).to receive(:start_async)
@@ -255,7 +255,7 @@ RSpec.describe Slack::RealTime::Client do
255
255
 
256
256
  before do
257
257
  allow(Slack::RealTime::Socket).to(
258
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
258
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
259
259
  )
260
260
  allow(socket).to receive(:connect!)
261
261
  allow(socket).to receive(:start_sync)
@@ -301,7 +301,7 @@ RSpec.describe Slack::RealTime::Client do
301
301
  expect(client.web_client).to be_a Slack::Web::Client
302
302
  end
303
303
  it 'remembers socket' do
304
- expect(client.instance_variable_get('@socket')).to eq socket
304
+ expect(client.instance_variable_get(:@socket)).to eq socket
305
305
  end
306
306
  it 'cannot be invoked twice' do
307
307
  expect do
@@ -315,7 +315,7 @@ RSpec.describe Slack::RealTime::Client do
315
315
  end
316
316
 
317
317
  it 'cannot be invoked twice' do
318
- client.instance_variable_set('@socket', nil) # caused by a :close callback
318
+ client.instance_variable_set(:@socket, nil) # caused by a :close callback
319
319
  expect do
320
320
  client.stop!
321
321
  end.to raise_error Slack::RealTime::Client::ClientNotStartedError
@@ -336,7 +336,7 @@ RSpec.describe Slack::RealTime::Client do
336
336
  let(:url) { 'wss://mpmulti-w5tz.slack-msgs.com/websocket/uid' }
337
337
 
338
338
  it 'sets store to nil' do
339
- expect(client.store).to be nil
339
+ expect(client.store).to be_nil
340
340
  end
341
341
  it "doesn't handle events" do
342
342
  event = Slack::RealTime::Event.new(
@@ -347,10 +347,10 @@ RSpec.describe Slack::RealTime::Client do
347
347
  client.send(:dispatch, event)
348
348
  end
349
349
  it 'self' do
350
- expect(client.self).to be nil
350
+ expect(client.self).to be_nil
351
351
  end
352
352
  it 'team' do
353
- expect(client.team).to be nil
353
+ expect(client.team).to be_nil
354
354
  end
355
355
  describe 'to_s' do
356
356
  it 'defaults to class instance' do
@@ -367,7 +367,7 @@ RSpec.describe Slack::RealTime::Client do
367
367
  expect(client.websocket_ping).to eq 30
368
368
  end
369
369
  it "doesn't set proxy" do
370
- expect(client.websocket_proxy).to be nil
370
+ expect(client.websocket_proxy).to be_nil
371
371
  end
372
372
  it 'defaults logger' do
373
373
  expect(client.send(:logger)).to be_a ::Logger
@@ -443,7 +443,7 @@ RSpec.describe Slack::RealTime::Client do
443
443
  end
444
444
  it 'creates a connection with custom ping', vcr: { cassette_name: 'web/rtm_start' } do
445
445
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to(
446
- receive(:new).with(url, nil, ping: 15).and_return(ws)
446
+ receive(:new).with(url, nil, { ping: 15 }).and_return(ws)
447
447
  )
448
448
  client.start!
449
449
  end
@@ -474,10 +474,12 @@ RSpec.describe Slack::RealTime::Client do
474
474
  expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
475
475
  url,
476
476
  nil,
477
- ping: 30,
478
- proxy: {
479
- origin: 'http://username:password@proxy.example.com',
480
- headers: { 'User-Agent' => 'ruby' }
477
+ {
478
+ ping: 30,
479
+ proxy: {
480
+ origin: 'http://username:password@proxy.example.com',
481
+ headers: { 'User-Agent' => 'ruby' }
482
+ }
481
483
  }
482
484
  ).and_return(ws)
483
485
  client.start!
@@ -507,7 +509,7 @@ RSpec.describe Slack::RealTime::Client do
507
509
 
508
510
  it 'calls rtm_start with start options', vcr: { cassette_name: 'web/rtm_start' } do
509
511
  expect(client.web_client).to(
510
- receive(:rtm_start).with(simple_latest: true).and_call_original
512
+ receive(:rtm_start).with({ simple_latest: true }).and_call_original
511
513
  )
512
514
  client.start!
513
515
  end
@@ -20,7 +20,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
20
20
  expect(channel.is_archived).to be true
21
21
  end
22
22
  it 'channel_created' do
23
- expect(client.channels['C024BE91L']).to be nil
23
+ expect(client.channels['C024BE91L']).to be_nil
24
24
  event = Slack::RealTime::Event.new(
25
25
  'type' => 'channel_created',
26
26
  'channel' => {
@@ -32,23 +32,23 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
32
32
  )
33
33
  client.send(:dispatch, event)
34
34
  channel = client.channels['C024BE91L']
35
- expect(channel).not_to be nil
35
+ expect(channel).not_to be_nil
36
36
  expect(channel.name).to eq 'fun'
37
37
  expect(channel.creator).to eq 'U04KB5WQR'
38
38
  expect(channel.created).to eq 1_360_782_804
39
39
  end
40
40
  it 'channel_deleted' do
41
- expect(client.channels['C0HLE0BBL']).not_to be nil
41
+ expect(client.channels['C0HLE0BBL']).not_to be_nil
42
42
  event = Slack::RealTime::Event.new(
43
43
  'type' => 'channel_deleted',
44
44
  'channel' => 'C0HLE0BBL'
45
45
  )
46
46
  client.send(:dispatch, event)
47
- expect(client.channels['C0HLE0BBL']).to be nil
47
+ expect(client.channels['C0HLE0BBL']).to be_nil
48
48
  end
49
49
  context 'channel_joined' do
50
50
  it 'creates channel' do
51
- expect(client.channels['CDEADBEEF']).to be nil
51
+ expect(client.channels['CDEADBEEF']).to be_nil
52
52
  event = Slack::RealTime::Event.new(
53
53
  'type' => 'channel_joined',
54
54
  'channel' => {
@@ -58,11 +58,11 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
58
58
  )
59
59
  client.send(:dispatch, event)
60
60
  channel = client.channels['CDEADBEEF']
61
- expect(channel).not_to be nil
61
+ expect(channel).not_to be_nil
62
62
  expect(channel.name).to eq 'beef'
63
63
  end
64
64
  it 'updates channel' do
65
- expect(client.channels['CDEADBEEF']).to be nil
65
+ expect(client.channels['CDEADBEEF']).to be_nil
66
66
  client.channels['CDEADBEEF'] =
67
67
  Slack::RealTime::Models::Channel.new('id' => 'CDEADBEEF', name: 'beef')
68
68
  event = Slack::RealTime::Event.new(
@@ -75,7 +75,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
75
75
  )
76
76
  client.send(:dispatch, event)
77
77
  channel = client.channels['CDEADBEEF']
78
- expect(channel).not_to be nil
78
+ expect(channel).not_to be_nil
79
79
  expect(channel.updated).to be true
80
80
  end
81
81
  end
@@ -9,7 +9,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
9
9
  expect(client.groups.count).to eq 1
10
10
  end
11
11
  it 'group_joined' do
12
- expect(client.groups['CDEADBEEF']).to be nil
12
+ expect(client.groups['CDEADBEEF']).to be_nil
13
13
  event = Slack::RealTime::Event.new(
14
14
  'type' => 'group_joined',
15
15
  'channel' => {
@@ -19,7 +19,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
19
19
  )
20
20
  client.send(:dispatch, event)
21
21
  group = client.groups['CDEADBEEF']
22
- expect(group).not_to be nil
22
+ expect(group).not_to be_nil
23
23
  expect(group.name).to eq 'beef'
24
24
  end
25
25
  it 'group_left' do
@@ -9,7 +9,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
9
9
  expect(client.ims.count).to eq 10
10
10
  end
11
11
  it 'im_created' do
12
- expect(client.ims['CDEADBEEF']).to be nil
12
+ expect(client.ims['CDEADBEEF']).to be_nil
13
13
  event = Slack::RealTime::Event.new(
14
14
  'type' => 'im_created',
15
15
  'channel' => {
@@ -19,7 +19,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
19
19
  )
20
20
  client.send(:dispatch, event)
21
21
  im = client.ims['CDEADBEEF']
22
- expect(im).not_to be nil
22
+ expect(im).not_to be_nil
23
23
  expect(im.name).to eq 'beef'
24
24
  end
25
25
  it 'im_open' do
@@ -4,9 +4,9 @@ require 'spec_helper'
4
4
  RSpec.describe Slack::RealTime::Store do
5
5
  it 'can be initialized with an empty hash' do
6
6
  store = described_class.new(Hashie::Mash.new)
7
- expect(store.self).to be nil
7
+ expect(store.self).to be_nil
8
8
  expect(store.groups.count).to eq 0
9
- expect(store.team).to be nil
9
+ expect(store.team).to be_nil
10
10
  expect(store.teams.count).to eq 0
11
11
  end
12
12
  end
@@ -22,7 +22,7 @@ describe Slack do
22
22
  context 'globals' do
23
23
  let(:command) do
24
24
  "\"#{slack}\" --vcr-cassette-name=web/auth_test_success " \
25
- '--slack-api-token=token -d auth test 2>&1'
25
+ '--slack-api-token=token -d auth test 2>&1'
26
26
  end
27
27
 
28
28
  it 'enables request and response logging with -d' do
@@ -44,7 +44,7 @@ describe Slack do
44
44
  context 'bad auth' do
45
45
  let(:command) do
46
46
  "\"#{slack}\" --vcr-cassette-name=web/auth_test_error " \
47
- '--slack-api-token=token auth test 2>&1'
47
+ '--slack-api-token=token auth test 2>&1'
48
48
  end
49
49
 
50
50
  it 'fails with an exception' do
@@ -56,7 +56,7 @@ describe Slack do
56
56
  context 'good auth' do
57
57
  let(:command) do
58
58
  "\"#{slack}\" --vcr-cassette-name=web/auth_test_success " \
59
- '--slack-api-token=token auth test 2>&1'
59
+ '--slack-api-token=token auth test 2>&1'
60
60
  end
61
61
 
62
62
  it 'succeeds' do
@@ -79,7 +79,7 @@ describe Slack do
79
79
  describe '#users' do
80
80
  let(:command) do
81
81
  "\"#{slack}\" --vcr-cassette-name=web/users_list " \
82
- '--slack-api-token=token users list --presence=true 2>&1'
82
+ '--slack-api-token=token users list --presence=true 2>&1'
83
83
  end
84
84
 
85
85
  it 'list' do
@@ -3,6 +3,6 @@ require 'spec_helper'
3
3
 
4
4
  describe Slack do
5
5
  it 'has a version' do
6
- expect(Slack::VERSION).not_to be nil
6
+ expect(Slack::VERSION).not_to be_nil
7
7
  end
8
8
  end
@@ -5,4 +5,9 @@ require 'spec_helper'
5
5
 
6
6
  RSpec.describe Slack::Web::Api::Endpoints::AdminAppsRequests do
7
7
  let(:client) { Slack::Web::Client.new }
8
+ context 'admin.apps.requests_cancel' do
9
+ it 'requires request_id' do
10
+ expect { client.admin_apps_requests_cancel }.to raise_error ArgumentError, /Required arguments :request_id missing/
11
+ end
12
+ end
8
13
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ require 'spec_helper'
5
+
6
+ RSpec.describe Slack::Web::Api::Endpoints::AdminUsersUnsupportedversions do
7
+ let(:client) { Slack::Web::Client.new }
8
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ # This file was auto-generated by lib/tasks/web.rake
3
+
4
+ require 'spec_helper'
5
+
6
+ RSpec.describe Slack::Web::Api::Endpoints::Bookmarks do
7
+ let(:client) { Slack::Web::Client.new }
8
+ context 'bookmarks_add' do
9
+ it 'requires channel_id' do
10
+ expect { client.bookmarks_add(title: %q[], type: %q[]) }.to raise_error ArgumentError, /Required arguments :channel_id missing/
11
+ end
12
+ it 'requires title' do
13
+ expect { client.bookmarks_add(channel_id: %q[], type: %q[]) }.to raise_error ArgumentError, /Required arguments :title missing/
14
+ end
15
+ it 'requires type' do
16
+ expect { client.bookmarks_add(channel_id: %q[], title: %q[]) }.to raise_error ArgumentError, /Required arguments :type missing/
17
+ end
18
+ end
19
+ context 'bookmarks_edit' do
20
+ it 'requires bookmark_id' do
21
+ expect { client.bookmarks_edit(channel_id: %q[]) }.to raise_error ArgumentError, /Required arguments :bookmark_id missing/
22
+ end
23
+ it 'requires channel_id' do
24
+ expect { client.bookmarks_edit(bookmark_id: %q[]) }.to raise_error ArgumentError, /Required arguments :channel_id missing/
25
+ end
26
+ end
27
+ context 'bookmarks_list' do
28
+ it 'requires channel_id' do
29
+ expect { client.bookmarks_list }.to raise_error ArgumentError, /Required arguments :channel_id missing/
30
+ end
31
+ end
32
+ context 'bookmarks_remove' do
33
+ it 'requires bookmark_id' do
34
+ expect { client.bookmarks_remove(channel_id: %q[]) }.to raise_error ArgumentError, /Required arguments :bookmark_id missing/
35
+ end
36
+ it 'requires channel_id' do
37
+ expect { client.bookmarks_remove(bookmark_id: %q[]) }.to raise_error ArgumentError, /Required arguments :channel_id missing/
38
+ end
39
+ end
40
+ end
@@ -14,11 +14,13 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
14
14
  it 'automatically converts attachments and blocks into JSON' do
15
15
  expect(client).to receive(:post).with(
16
16
  'chat.postEphemeral',
17
- channel: 'channel',
18
- text: 'text',
19
- user: '123',
20
- attachments: '[]',
21
- blocks: '[]'
17
+ {
18
+ channel: 'channel',
19
+ text: 'text',
20
+ user: '123',
21
+ attachments: '[]',
22
+ blocks: '[]'
23
+ }
22
24
  )
23
25
  client.chat_postEphemeral(
24
26
  channel: 'channel',
@@ -88,10 +90,12 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
88
90
  it 'automatically converts attachments and blocks into JSON' do
89
91
  expect(client).to receive(:post).with(
90
92
  'chat.postMessage',
91
- channel: 'channel',
92
- text: 'text',
93
- attachments: '[]',
94
- blocks: '[]'
93
+ {
94
+ channel: 'channel',
95
+ text: 'text',
96
+ attachments: '[]',
97
+ blocks: '[]'
98
+ }
95
99
  )
96
100
  client.chat_postMessage(channel: 'channel', text: 'text', attachments: [], blocks: [])
97
101
  end
@@ -131,11 +135,13 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
131
135
  it 'automatically converts attachments and blocks into JSON' do
132
136
  expect(client).to receive(:post).with(
133
137
  'chat.update',
134
- channel: 'channel',
135
- text: 'text',
136
- ts: ts,
137
- attachments: '[]',
138
- blocks: '[]'
138
+ {
139
+ channel: 'channel',
140
+ text: 'text',
141
+ ts: ts,
142
+ attachments: '[]',
143
+ blocks: '[]'
144
+ }
139
145
  )
140
146
  client.chat_update(channel: 'channel', text: 'text', ts: ts, attachments: [], blocks: [])
141
147
  end
@@ -148,9 +154,9 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
148
154
  end
149
155
 
150
156
  context 'text, attachment and blocks arguments' do
151
- it 'requires text, attachments or blocks' do
157
+ it 'requires text, attachments, blocks or reply_broadcast' do
152
158
  expect { client.chat_update(channel: 'channel', ts: ts) }.to(
153
- raise_error(ArgumentError, /Required arguments :text, :attachments or :blocks missing/)
159
+ raise_error(ArgumentError, /Required arguments :text, :attachments, :blocks or :reply_broadcast missing/)
154
160
  )
155
161
  end
156
162
  it 'only text' do
@@ -171,6 +177,12 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
171
177
  client.chat_update(channel: 'channel', ts: ts, blocks: [])
172
178
  end.not_to raise_error
173
179
  end
180
+ it 'only reply_broadcast' do
181
+ expect(client).to receive(:post).with('chat.update', hash_including(reply_broadcast: true))
182
+ expect do
183
+ client.chat_update(channel: 'channel', ts: ts, reply_broadcast: true)
184
+ end.not_to raise_error
185
+ end
174
186
  it 'all text, attachments and blocks' do
175
187
  expect(client).to(
176
188
  receive(:post)
@@ -8,8 +8,10 @@ RSpec.describe Slack::Web::Api::Endpoints::Dialog do
8
8
  it 'automatically converts dialog into JSON' do
9
9
  expect(client).to receive(:post).with(
10
10
  'dialog.open',
11
- trigger_id: '12345.98765.abcd2358fdea',
12
- dialog: '[]'
11
+ {
12
+ trigger_id: '12345.98765.abcd2358fdea',
13
+ dialog: '[]'
14
+ }
13
15
  )
14
16
  client.dialog_open(trigger_id: '12345.98765.abcd2358fdea', dialog: [])
15
17
  end
@@ -10,7 +10,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
10
10
  let(:view_str) { '{"celery":"man"}' }
11
11
 
12
12
  it 'automatically converts view into JSON' do
13
- expect(client).to receive(:post).with('views.open', trigger_id: trigger_id, view: view_str)
13
+ expect(client).to receive(:post).with('views.open', { trigger_id: trigger_id, view: view_str })
14
14
  client.views_open(trigger_id: trigger_id, view: { celery: 'man' })
15
15
  end
16
16
  end
@@ -19,7 +19,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
19
19
  let(:view_str) { 'celery man' }
20
20
 
21
21
  it 'leaves view as is' do
22
- expect(client).to receive(:post).with('views.open', trigger_id: trigger_id, view: view_str)
22
+ expect(client).to receive(:post).with('views.open', { trigger_id: trigger_id, view: view_str })
23
23
  client.views_open(trigger_id: trigger_id, view: 'celery man')
24
24
  end
25
25
  end
@@ -32,10 +32,14 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
32
32
  let(:view_str) { '{"celery":"man"}' }
33
33
 
34
34
  it 'automatically converts view into JSON' do
35
- expect(client).to receive(:post).with('views.publish',
36
- user_id: user_id,
37
- trigger_id: trigger_id,
38
- view: view_str)
35
+ expect(client).to receive(:post).with(
36
+ 'views.publish',
37
+ {
38
+ trigger_id: trigger_id,
39
+ user_id: user_id,
40
+ view: view_str
41
+ }
42
+ )
39
43
  client.views_publish(user_id: user_id, trigger_id: trigger_id, view: { celery: 'man' })
40
44
  end
41
45
  end
@@ -44,10 +48,14 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
44
48
  let(:view_str) { 'celery man' }
45
49
 
46
50
  it 'leaves view as is' do
47
- expect(client).to receive(:post).with('views.publish',
48
- user_id: user_id,
49
- trigger_id: trigger_id,
50
- view: view_str)
51
+ expect(client).to receive(:post).with(
52
+ 'views.publish',
53
+ {
54
+ user_id: user_id,
55
+ trigger_id: trigger_id,
56
+ view: view_str
57
+ }
58
+ )
51
59
  client.views_publish(user_id: user_id, trigger_id: trigger_id, view: 'celery man')
52
60
  end
53
61
  end
@@ -58,7 +66,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
58
66
  let(:view_str) { '{"celery":"man"}' }
59
67
 
60
68
  it 'automatically converts view into JSON' do
61
- expect(client).to receive(:post).with('views.push', trigger_id: trigger_id, view: view_str)
69
+ expect(client).to receive(:post).with('views.push', { trigger_id: trigger_id, view: view_str })
62
70
  client.views_push(trigger_id: trigger_id, view: { celery: 'man' })
63
71
  end
64
72
  end
@@ -67,7 +75,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
67
75
  let(:view_str) { 'celery man' }
68
76
 
69
77
  it 'leaves view as is' do
70
- expect(client).to receive(:post).with('views.push', trigger_id: trigger_id, view: view_str)
78
+ expect(client).to receive(:post).with('views.push', { trigger_id: trigger_id, view: view_str })
71
79
  client.views_push(trigger_id: trigger_id, view: 'celery man')
72
80
  end
73
81
  end
@@ -78,7 +86,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
78
86
  let(:view_str) { '{"celery":"man"}' }
79
87
 
80
88
  it 'automatically converts view into JSON' do
81
- expect(client).to receive(:post).with('views.update', view: view_str)
89
+ expect(client).to receive(:post).with('views.update', { view: view_str })
82
90
  client.views_update(view: { celery: 'man' })
83
91
  end
84
92
  end
@@ -87,7 +95,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
87
95
  let(:view_str) { 'celery man' }
88
96
 
89
97
  it 'leaves view as is' do
90
- expect(client).to receive(:post).with('views.update', view: view_str)
98
+ expect(client).to receive(:post).with('views.update', { view: view_str })
91
99
  client.views_update(view: 'celery man')
92
100
  end
93
101
  end
@@ -8,7 +8,7 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
8
8
  let(:cursor) { described_class.new(client, 'users_list', {}) }
9
9
 
10
10
  it 'provides a default limit' do
11
- expect(client).to receive(:users_list).with(limit: 100, cursor: nil)
11
+ expect(client).to receive(:users_list).with({ limit: 100, cursor: nil })
12
12
  cursor.first
13
13
  end
14
14
  it 'handles blank response metadata' do
@@ -36,17 +36,17 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
36
36
  it 'sleeps after a TooManyRequestsError' do
37
37
  expect(client).to(
38
38
  receive(:users_list)
39
- .with(limit: 100, cursor: nil)
39
+ .with({ limit: 100, cursor: nil })
40
40
  .ordered
41
41
  .and_return(Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }))
42
42
  )
43
43
  expect(client).to(
44
- receive(:users_list).with(limit: 100, cursor: 'next').ordered.and_raise(error)
44
+ receive(:users_list).with({ limit: 100, cursor: 'next' }).ordered.and_raise(error)
45
45
  )
46
46
  expect(cursor).to receive(:sleep).once.ordered.with(9)
47
47
  expect(client).to(
48
48
  receive(:users_list)
49
- .with(limit: 100, cursor: 'next')
49
+ .with({ limit: 100, cursor: 'next' })
50
50
  .ordered
51
51
  .and_return(Slack::Messages::Message.new)
52
52
  )
@@ -60,11 +60,11 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
60
60
  it 'raises the error after hitting the max retries' do
61
61
  expect(client).to(
62
62
  receive(:users_list)
63
- .with(limit: 100, cursor: nil)
63
+ .with({ limit: 100, cursor: nil })
64
64
  .and_return(Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }))
65
65
  )
66
66
  expect(client).to(
67
- receive(:users_list).with(limit: 100, cursor: 'next').exactly(5).times.and_raise(error)
67
+ receive(:users_list).with({ limit: 100, cursor: 'next' }).exactly(5).times.and_raise(error)
68
68
  )
69
69
  expect(cursor).to receive(:sleep).exactly(4).times.with(9)
70
70
  expect { cursor.to_a }.to raise_error(error)
@@ -77,7 +77,7 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
77
77
  let(:cursor) { described_class.new(client, 'users_list', limit: 42) }
78
78
 
79
79
  it 'overrides default limit' do
80
- expect(client).to receive(:users_list).with(limit: 42, cursor: nil)
80
+ expect(client).to receive(:users_list).with({ limit: 42, cursor: nil })
81
81
  cursor.first
82
82
  end
83
83
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'spec_helper'
3
+ require 'faraday/typhoeus'
3
4
 
4
5
  RSpec.describe Slack::Web::Client do
5
6
  before do
@@ -275,13 +276,28 @@ RSpec.describe Slack::Web::Client do
275
276
  end
276
277
 
277
278
  context 'parsing error' do
278
- before { stub_slack_request.to_return(body: '<html></html>') }
279
+ context 'when the response is not JSON' do
280
+ before do
281
+ stub_slack_request.to_return(body: '<html></html>', headers: { 'Content-Type' => 'text/html' })
282
+ end
279
283
 
280
- it 'raises ParsingError' do
281
- expect { request }.to raise_error(Slack::Web::Api::Errors::ParsingError).with_message('parsing_error')
282
- expect(exception.response.body).to eq('<html></html>')
283
- expect(exception.cause).to be_a(Faraday::ParsingError)
284
- expect(exception.cause.cause.cause).to be_a(JSON::ParserError)
284
+ it 'raises ParsingError' do
285
+ expect { request }.to raise_error(Slack::Web::Api::Errors::ParsingError).with_message('parsing_error')
286
+ expect(exception.response.body).to eq('<html></html>')
287
+ expect(exception.cause).to be_a(Faraday::ParsingError)
288
+ expect(exception.cause.cause).to be_a(JSON::ParserError)
289
+ end
290
+ end
291
+
292
+ context 'when the response is malformed JSON' do
293
+ before { stub_slack_request.to_return(body: '{') }
294
+
295
+ it 'raises ParsingError' do
296
+ expect { request }.to raise_error(Slack::Web::Api::Errors::ParsingError).with_message('parsing_error')
297
+ expect(exception.response.body).to eq('{')
298
+ expect(exception.cause).to be_a(Faraday::ParsingError)
299
+ expect(exception.cause.cause).to be_a(JSON::ParserError)
300
+ end
285
301
  end
286
302
  end
287
303
 
@@ -318,7 +334,9 @@ RSpec.describe Slack::Web::Client do
318
334
  end
319
335
 
320
336
  context 'with a HTML response' do
321
- before { stub_slack_request.to_return(status: 500, body: '<html></html>') }
337
+ before do
338
+ stub_slack_request.to_return(status: 500, body: '<html></html>', headers: { 'Content-Type' => 'text/html' })
339
+ end
322
340
 
323
341
  it 'raises UnavailableError' do
324
342
  expect { request }.to raise_error(Slack::Web::Api::Errors::UnavailableError).with_message('unavailable_error')
@@ -26,7 +26,7 @@ RSpec.describe Slack::Web::Faraday::Response::RaiseError do
26
26
  let(:body) { { 'ok' => 'true' } }
27
27
 
28
28
  it 'is nil' do
29
- expect(raise_error_obj.on_complete(env)).to eq nil
29
+ expect(raise_error_obj.on_complete(env)).to be_nil
30
30
  end
31
31
  end
32
32
 
@@ -11,7 +11,7 @@ RSpec.shared_context 'connected client' do |opts|
11
11
  config.store_class = (opts || {})[:store_class] || Slack::RealTime::Stores::Store
12
12
  end
13
13
  allow(Slack::RealTime::Socket).to(
14
- receive(:new).with(url, ping: 30, logger: Slack::Logger.default).and_return(socket)
14
+ receive(:new).with(url, { ping: 30, logger: Slack::Logger.default }).and_return(socket)
15
15
  )
16
16
  allow(socket).to receive(:start_sync)
17
17
  allow(socket).to receive(:connect!)