slack-ruby-client 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/{integtest.yml → integration_test.yml} +6 -5
- data/.github/workflows/{rubocop.yml → lint.yml} +5 -4
- data/.github/workflows/{danger.yml → pr_lint.yml} +8 -6
- data/.github/workflows/test.yml +4 -2
- data/.gitignore +0 -1
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +8 -14
- data/.ruby-version +1 -0
- data/CHANGELOG.md +14 -0
- data/CONTRIBUTING.md +5 -4
- data/Gemfile +1 -6
- data/README.md +60 -63
- data/RELEASING.md +1 -1
- data/UPGRADING.md +28 -0
- data/bin/commands/admin_audit_anomaly_allow.rb +23 -0
- data/bin/commands/admin_conversations.rb +12 -11
- data/bin/commands/admin_users.rb +1 -1
- data/bin/commands/admin_users_session.rb +1 -1
- data/bin/commands/apps_connections.rb +2 -2
- data/bin/commands/bookmarks.rb +1 -0
- data/bin/commands/chat.rb +9 -6
- data/bin/commands/conversations.rb +8 -6
- data/bin/commands/files.rb +24 -0
- data/bin/commands/rtm.rb +0 -15
- data/bin/commands/views.rb +4 -2
- data/bin/commands.rb +1 -0
- data/bin/slack +1 -1
- data/lib/slack/real_time/api/message.rb +3 -2
- data/lib/slack/real_time/api/templates/event_handler.erb +5 -1
- data/lib/slack/real_time/api/typing.rb +2 -1
- data/lib/slack/real_time/client.rb +8 -26
- data/lib/slack/real_time/config.rb +3 -3
- data/lib/slack/real_time/models/channel.rb +4 -0
- data/lib/slack/real_time/models/{group.rb → mpim.rb} +1 -1
- data/lib/slack/real_time/models.rb +2 -1
- data/lib/slack/real_time/stores/base.rb +25 -9
- data/lib/slack/real_time/stores/starter.rb +323 -309
- data/lib/slack/real_time/stores/store.rb +265 -198
- data/lib/slack/real_time/stores.rb +1 -7
- data/lib/slack/version.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_analytics.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_apps.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_apps_requests.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_audit_anomaly_allow.rb +34 -0
- data/lib/slack/web/api/endpoints/admin_auth_policy.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_barriers.rb +8 -8
- data/lib/slack/web/api/endpoints/admin_conversations.rb +30 -28
- data/lib/slack/web/api/endpoints/admin_conversations_restrictAccess.rb +6 -6
- data/lib/slack/web/api/endpoints/admin_emoji.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_inviteRequests.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams.rb +2 -2
- data/lib/slack/web/api/endpoints/admin_teams_admins.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_teams_owners.rb +1 -1
- data/lib/slack/web/api/endpoints/admin_teams_settings.rb +11 -11
- data/lib/slack/web/api/endpoints/admin_usergroups.rb +7 -7
- data/lib/slack/web/api/endpoints/admin_users.rb +16 -16
- data/lib/slack/web/api/endpoints/admin_users_session.rb +8 -8
- data/lib/slack/web/api/endpoints/apps.rb +2 -2
- data/lib/slack/web/api/endpoints/apps_connections.rb +1 -1
- data/lib/slack/web/api/endpoints/apps_event_authorizations.rb +1 -1
- data/lib/slack/web/api/endpoints/apps_manifest.rb +6 -6
- data/lib/slack/web/api/endpoints/bookmarks.rb +10 -8
- data/lib/slack/web/api/endpoints/bots.rb +1 -1
- data/lib/slack/web/api/endpoints/calls.rb +5 -5
- data/lib/slack/web/api/endpoints/calls_participants.rb +4 -4
- data/lib/slack/web/api/endpoints/chat.rb +36 -30
- data/lib/slack/web/api/endpoints/conversations.rb +37 -33
- data/lib/slack/web/api/endpoints/dialog.rb +2 -2
- data/lib/slack/web/api/endpoints/dnd.rb +1 -1
- data/lib/slack/web/api/endpoints/files.rb +45 -8
- data/lib/slack/web/api/endpoints/files_comments.rb +2 -2
- data/lib/slack/web/api/endpoints/files_remote.rb +8 -8
- data/lib/slack/web/api/endpoints/migration.rb +1 -1
- data/lib/slack/web/api/endpoints/oauth_v2.rb +2 -2
- data/lib/slack/web/api/endpoints/pins.rb +3 -3
- data/lib/slack/web/api/endpoints/reactions.rb +4 -4
- data/lib/slack/web/api/endpoints/reminders.rb +5 -5
- data/lib/slack/web/api/endpoints/rtm.rb +0 -23
- data/lib/slack/web/api/endpoints/search.rb +3 -3
- data/lib/slack/web/api/endpoints/tooling_tokens.rb +1 -1
- data/lib/slack/web/api/endpoints/usergroups.rb +4 -4
- data/lib/slack/web/api/endpoints/usergroups_users.rb +3 -3
- data/lib/slack/web/api/endpoints/users.rb +4 -4
- data/lib/slack/web/api/endpoints/users_admin.rb +2 -2
- data/lib/slack/web/api/endpoints/views.rb +16 -11
- data/lib/slack/web/api/endpoints/workflows.rb +4 -4
- data/lib/slack/web/api/endpoints.rb +2 -0
- data/lib/slack/web/api/errors.rb +56 -6
- data/lib/slack/web/api/mixins/conversations.id.rb +1 -1
- data/lib/slack/web/api/mixins/users.id.rb +1 -1
- data/lib/slack/web/api/mixins/users.search.rb +2 -1
- data/lib/slack/web/api/patches/{chat.1.patch → chat.attachments-blocks.patch} +13 -14
- data/lib/slack/web/api/patches/{dialog.1.open-json-support.patch → dialog.encoded-json.patch} +4 -4
- data/lib/slack/web/api/patches/views.view-json.patch +55 -0
- data/lib/slack/web/api/templates/method.erb +1 -1
- data/lib/slack/web/config.rb +2 -2
- data/lib/tasks/real_time.rake +44 -22
- data/lib/tasks/web.rake +9 -2
- data/spec/fixtures/slack/web/rtm_connect.yml +85 -1
- data/spec/slack/events/config_spec.rb +2 -0
- data/spec/slack/events/request_spec.rb +4 -0
- data/spec/slack/messages/formatting_spec.rb +10 -0
- data/spec/slack/real_time/api/message_spec.rb +1 -1
- data/spec/slack/real_time/api/ping_spec.rb +1 -1
- data/spec/slack/real_time/api/typing_spec.rb +1 -1
- data/spec/slack/real_time/client_spec.rb +73 -111
- data/spec/slack/real_time/event_handlers/bot_spec.rb +19 -17
- data/spec/slack/real_time/event_handlers/event_handlers_spec.rb +1 -1
- data/spec/slack/real_time/event_handlers/im_spec.rb +28 -25
- data/spec/slack/real_time/event_handlers/{group_spec.rb → private_channel_spec.rb} +35 -27
- data/spec/slack/real_time/event_handlers/{channel_spec.rb → public_channel_spec.rb} +24 -20
- data/spec/slack/real_time/event_handlers/team_spec.rb +7 -8
- data/spec/slack/real_time/event_handlers/user_spec.rb +6 -5
- data/spec/slack/real_time/stores/store_spec.rb +50 -0
- data/spec/slack/slack_spec.rb +1 -0
- data/spec/slack/web/api/endpoints/admin_audit_anomaly_allow_spec.rb +8 -0
- data/spec/slack/web/api/endpoints/custom_specs/chat_spec.rb +17 -1
- data/spec/slack/web/api/endpoints/custom_specs/dialog_spec.rb +2 -0
- data/spec/slack/web/api/endpoints/custom_specs/views_spec.rb +13 -4
- data/spec/slack/web/api/endpoints/files_spec.rb +13 -0
- data/spec/slack/web/api/mixins/conversations_spec.rb +2 -0
- data/spec/slack/web/api/mixins/users_spec.rb +2 -0
- data/spec/slack/web/api/pagination/cursor_spec.rb +4 -0
- data/spec/slack/web/client_spec.rb +14 -4
- data/spec/support/real_time/loaded_client.rb +120 -0
- metadata +18 -35
- data/bin/commands/admin_conversations_whitelist.rb +0 -37
- data/bin/commands/apps_permissions.rb +0 -23
- data/bin/commands/apps_permissions_resources.rb +0 -15
- data/bin/commands/apps_permissions_scopes.rb +0 -13
- data/bin/commands/apps_permissions_users.rb +0 -26
- data/bin/commands/channels.rb +0 -23
- data/bin/commands/groups.rb +0 -14
- data/bin/commands/im.rb +0 -6
- data/bin/commands/mpim.rb +0 -6
- data/lib/slack/web/api/endpoints/admin_conversations_whitelist.rb +0 -64
- data/lib/slack/web/api/endpoints/apps_permissions.rb +0 -36
- data/lib/slack/web/api/endpoints/apps_permissions_resources.rb +0 -31
- data/lib/slack/web/api/endpoints/apps_permissions_scopes.rb +0 -21
- data/lib/slack/web/api/endpoints/apps_permissions_users.rb +0 -50
- data/lib/slack/web/api/endpoints/channels.rb +0 -25
- data/lib/slack/web/api/endpoints/groups.rb +0 -13
- data/lib/slack/web/api/endpoints/im.rb +0 -13
- data/lib/slack/web/api/endpoints/mpim.rb +0 -13
- data/lib/slack/web/api/endpoints/presence.rb +0 -23
- data/lib/slack/web/api/patches/views.1.view-json.patch +0 -40
- data/lib/slack/web/api/patches/views.1.views-published.patch +0 -16
- data/spec/fixtures/slack/web/rtm_start.yml +0 -815
- data/spec/slack/real_time/rtm_start_spec.rb +0 -14
- data/spec/slack/real_time/store_spec.rb +0 -12
@@ -1,15 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/
|
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 'channel' do
|
8
|
-
it 'sets channel data' do
|
9
|
-
expect(client.channels.count).to eq 156
|
10
|
-
end
|
8
|
+
context 'public channel' do
|
11
9
|
it 'channel_archive' do
|
12
|
-
channel = client.
|
10
|
+
channel = client.public_channels['C0HNTD0CW']
|
13
11
|
expect(channel.is_archived).to be false
|
14
12
|
event = Slack::RealTime::Event.new(
|
15
13
|
'type' => 'channel_archive',
|
@@ -19,36 +17,39 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
19
17
|
client.send(:dispatch, event)
|
20
18
|
expect(channel.is_archived).to be true
|
21
19
|
end
|
20
|
+
|
22
21
|
it 'channel_created' do
|
23
|
-
expect(client.
|
22
|
+
expect(client.public_channels['C024BE91L']).to be_nil
|
24
23
|
event = Slack::RealTime::Event.new(
|
25
24
|
'type' => 'channel_created',
|
26
25
|
'channel' => {
|
27
26
|
'id' => 'C024BE91L',
|
28
27
|
'name' => 'fun',
|
29
|
-
'created' =>
|
28
|
+
'created' => 1360782804,
|
30
29
|
'creator' => 'U04KB5WQR'
|
31
30
|
}
|
32
31
|
)
|
33
32
|
client.send(:dispatch, event)
|
34
|
-
channel = client.
|
33
|
+
channel = client.public_channels['C024BE91L']
|
35
34
|
expect(channel).not_to be_nil
|
36
35
|
expect(channel.name).to eq 'fun'
|
37
36
|
expect(channel.creator).to eq 'U04KB5WQR'
|
38
|
-
expect(channel.created).to eq
|
37
|
+
expect(channel.created).to eq 1360782804
|
39
38
|
end
|
39
|
+
|
40
40
|
it 'channel_deleted' do
|
41
|
-
expect(client.
|
41
|
+
expect(client.public_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.
|
47
|
+
expect(client.public_channels['C0HLE0BBL']).to be_nil
|
48
48
|
end
|
49
|
+
|
49
50
|
context 'channel_joined' do
|
50
51
|
it 'creates channel' do
|
51
|
-
expect(client.
|
52
|
+
expect(client.public_channels['CDEADBEEF']).to be_nil
|
52
53
|
event = Slack::RealTime::Event.new(
|
53
54
|
'type' => 'channel_joined',
|
54
55
|
'channel' => {
|
@@ -57,13 +58,14 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
57
58
|
}
|
58
59
|
)
|
59
60
|
client.send(:dispatch, event)
|
60
|
-
channel = client.
|
61
|
+
channel = client.public_channels['CDEADBEEF']
|
61
62
|
expect(channel).not_to be_nil
|
62
63
|
expect(channel.name).to eq 'beef'
|
63
64
|
end
|
65
|
+
|
64
66
|
it 'updates channel' do
|
65
|
-
expect(client.
|
66
|
-
client.
|
67
|
+
expect(client.public_channels['CDEADBEEF']).to be_nil
|
68
|
+
client.public_channels['CDEADBEEF'] =
|
67
69
|
Slack::RealTime::Models::Channel.new('id' => 'CDEADBEEF', name: 'beef')
|
68
70
|
event = Slack::RealTime::Event.new(
|
69
71
|
'type' => 'channel_joined',
|
@@ -74,14 +76,14 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
74
76
|
}
|
75
77
|
)
|
76
78
|
client.send(:dispatch, event)
|
77
|
-
channel = client.
|
79
|
+
channel = client.public_channels['CDEADBEEF']
|
78
80
|
expect(channel).not_to be_nil
|
79
81
|
expect(channel.updated).to be true
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
83
85
|
it 'channel_left' do
|
84
|
-
channel = client.
|
86
|
+
channel = client.public_channels['C0JHNAB5H']
|
85
87
|
expect(channel.members).to include client.self.id
|
86
88
|
event = Slack::RealTime::Event.new(
|
87
89
|
'type' => 'channel_left',
|
@@ -90,8 +92,9 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
90
92
|
client.send(:dispatch, event)
|
91
93
|
expect(channel.members).not_to include client.self.id
|
92
94
|
end
|
95
|
+
|
93
96
|
it 'channel_rename' do
|
94
|
-
channel = client.
|
97
|
+
channel = client.public_channels['C0HLE0BBL']
|
95
98
|
expect(channel.name).to eq 'gifs'
|
96
99
|
event = Slack::RealTime::Event.new(
|
97
100
|
'type' => 'channel_rename',
|
@@ -104,8 +107,9 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
104
107
|
client.send(:dispatch, event)
|
105
108
|
expect(channel.name).to eq 'updated'
|
106
109
|
end
|
110
|
+
|
107
111
|
it 'channel_unarchive' do
|
108
|
-
channel = client.
|
112
|
+
channel = client.public_channels['C0HLE0BBL']
|
109
113
|
expect(channel.is_archived).to be true
|
110
114
|
event = Slack::RealTime::Event.new(
|
111
115
|
'type' => 'channel_unarchive',
|
@@ -2,20 +2,15 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
[Slack::RealTime::Stores::Store, Slack::RealTime::Stores::Starter].each do |store_class|
|
5
|
-
|
6
|
-
RSpec.describe store_class, vcr: { cassette_name: cassette } do
|
5
|
+
RSpec.describe store_class, vcr: { cassette_name: 'web/rtm_connect' } do
|
7
6
|
include_context 'connected client', store_class: store_class
|
8
7
|
|
9
8
|
context 'team' do
|
10
|
-
it 'sets team data on rtm.
|
9
|
+
it 'sets team data on rtm.connect' do
|
11
10
|
expect(client.team.name).to eq 'dblock'
|
12
11
|
expect(client.team.domain).to eq 'dblockdotorg'
|
13
|
-
if store_class == Slack::RealTime::Stores::Store
|
14
|
-
expect(client.team.email_domain).to eq 'dblock.org'
|
15
|
-
expect(client.team.prefs.invites_only_admins).to be true
|
16
|
-
expect(client.team.plan).to eq ''
|
17
|
-
end
|
18
12
|
end
|
13
|
+
|
19
14
|
it 'team_domain_change' do
|
20
15
|
event = Slack::RealTime::Event.new(
|
21
16
|
'type' => 'team_domain_change',
|
@@ -26,6 +21,7 @@ require 'spec_helper'
|
|
26
21
|
expect(client.team.domain).to eq 'my'
|
27
22
|
expect(client.team['url']).to eq 'https://my.slack.com'
|
28
23
|
end
|
24
|
+
|
29
25
|
it 'email_domain_changed' do
|
30
26
|
event = Slack::RealTime::Event.new(
|
31
27
|
'type' => 'email_domain_changed',
|
@@ -34,6 +30,7 @@ require 'spec_helper'
|
|
34
30
|
client.send(:dispatch, event)
|
35
31
|
expect(client.team.email_domain).to eq 'example.com'
|
36
32
|
end
|
33
|
+
|
37
34
|
it 'team_pref_change' do
|
38
35
|
event = Slack::RealTime::Event.new(
|
39
36
|
'type' => 'team_pref_change',
|
@@ -43,6 +40,7 @@ require 'spec_helper'
|
|
43
40
|
client.send(:dispatch, event)
|
44
41
|
expect(client.team.prefs.invites_only_admins).to be false
|
45
42
|
end
|
43
|
+
|
46
44
|
it 'team_rename' do
|
47
45
|
event = Slack::RealTime::Event.new(
|
48
46
|
'type' => 'team_rename',
|
@@ -51,6 +49,7 @@ require 'spec_helper'
|
|
51
49
|
client.send(:dispatch, event)
|
52
50
|
expect(client.team.name).to eq 'New Team Name Inc.'
|
53
51
|
end
|
52
|
+
|
54
53
|
it 'team_plan_change' do
|
55
54
|
event = Slack::RealTime::Event.new(
|
56
55
|
'type' => 'team_plan_change',
|
@@ -1,14 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/
|
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
8
|
context 'user' do
|
8
|
-
it 'combines user and self data on rtm.start' do
|
9
|
-
expect(client.users['U0J1GAHN1'].name).to eq 'travis-ci'
|
10
|
-
expect(client.users['U0J1GAHN1']['prefs']['push_sound']).to eq 'b2.mp3'
|
11
|
-
end
|
12
9
|
it 'user_change' do
|
13
10
|
expect(client.users['U07KECJ77'].name).to eq 'aws'
|
14
11
|
event = Slack::RealTime::Event.new(
|
@@ -20,6 +17,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
20
17
|
client.send(:dispatch, event)
|
21
18
|
expect(client.users['U07KECJ77'].name).to eq 'renamed'
|
22
19
|
end
|
20
|
+
|
23
21
|
it 'team_join' do
|
24
22
|
expect do
|
25
23
|
event = Slack::RealTime::Event.new(
|
@@ -32,6 +30,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
32
30
|
end.to change(client.users, :count).by(1)
|
33
31
|
expect(client.users['DEADBEEF'].name).to eq 'added'
|
34
32
|
end
|
33
|
+
|
35
34
|
it 'pref_change' do
|
36
35
|
event = Slack::RealTime::Event.new(
|
37
36
|
'type' => 'pref_change',
|
@@ -41,6 +40,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
41
40
|
client.send(:dispatch, event)
|
42
41
|
expect(client.self.prefs['push_sound']).to eq 'updated.mp3'
|
43
42
|
end
|
43
|
+
|
44
44
|
it 'presence_change' do
|
45
45
|
expect(client.users['U07KECJ77'].presence).to eq 'away'
|
46
46
|
event = Slack::RealTime::Event.new(
|
@@ -51,6 +51,7 @@ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' }
|
|
51
51
|
client.send(:dispatch, event)
|
52
52
|
expect(client.users['U07KECJ77'].presence).to eq 'updated'
|
53
53
|
end
|
54
|
+
|
54
55
|
it 'manual_presence_change' do
|
55
56
|
expect(client.self['presence']).to eq 'away'
|
56
57
|
event = Slack::RealTime::Event.new(
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Slack::RealTime::Stores::Store do
|
6
|
+
it 'can be initialized with an empty hash' do
|
7
|
+
store = described_class.new(Hashie::Mash.new)
|
8
|
+
expect(store.team).to be_nil
|
9
|
+
expect(store.teams.count).to eq 0
|
10
|
+
expect(store.self).to be_nil
|
11
|
+
expect(store.public_channels.count).to eq 0
|
12
|
+
expect(store.private_channels.count).to eq 0
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'includes event handlers in subclasses' do
|
16
|
+
subclass = Class.new(described_class)
|
17
|
+
expect(subclass.events.key?('channel_created')).to be true
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with client started' do
|
21
|
+
let(:client) { Slack::RealTime::Client.new(store_class: described_class, concurrency: Slack::RealTime::Concurrency::Mock) }
|
22
|
+
|
23
|
+
before do
|
24
|
+
client.store = described_class.new(Hashie::Mash.new, { caches: :all })
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'initializes itself with data' do
|
28
|
+
team_info = Hashie::Mash.new(team: {})
|
29
|
+
allow(client.web_client).to receive(:team_info).and_return(team_info)
|
30
|
+
expect(client.web_client).to receive(:team_info)
|
31
|
+
expect(client.web_client).to receive(:users_list)
|
32
|
+
expect(client.web_client).to receive(:conversations_list).with(types: 'public_channel,private_channel,im,mpim')
|
33
|
+
event = Slack::RealTime::Event.new('type' => 'hello', 'start' => true)
|
34
|
+
client.send(:dispatch, event)
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when configured to only cache some types' do
|
38
|
+
before do
|
39
|
+
client.store = described_class.new(Hashie::Mash.new, { caches: %i[users public_channels] })
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'initializes specified caches with data' do
|
43
|
+
expect(client.web_client).to receive(:users_list)
|
44
|
+
expect(client.web_client).to receive(:conversations_list).with(types: 'public_channel')
|
45
|
+
event = Slack::RealTime::Event.new('type' => 'hello', 'start' => true)
|
46
|
+
client.send(:dispatch, event)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/slack/slack_spec.rb
CHANGED
@@ -30,17 +30,20 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
30
30
|
blocks: []
|
31
31
|
)
|
32
32
|
end
|
33
|
+
|
33
34
|
context 'text and user arguments' do
|
34
35
|
it 'requires text or attachments' do
|
35
36
|
expect { client.chat_postEphemeral(channel: 'channel') }.to(
|
36
37
|
raise_error(ArgumentError, /Required arguments :text, :attachments or :blocks missing/)
|
37
38
|
)
|
38
39
|
end
|
40
|
+
|
39
41
|
it 'requires user' do
|
40
42
|
expect { client.chat_postEphemeral(channel: 'channel', text: 'text') }.to(
|
41
43
|
raise_error(ArgumentError, /Required arguments :user missing/)
|
42
44
|
)
|
43
45
|
end
|
46
|
+
|
44
47
|
it 'both text and user' do
|
45
48
|
expect(client).to(
|
46
49
|
receive(:post).with('chat.postEphemeral', hash_including(text: 'text', user: '123'))
|
@@ -60,6 +63,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
60
63
|
client.chat_postEphemeral(channel: 'channel', text: 'text', user: '123', attachments: [])
|
61
64
|
end.not_to raise_error
|
62
65
|
end
|
66
|
+
|
63
67
|
it 'attachments without text' do
|
64
68
|
expect(client).to(
|
65
69
|
receive(:post).with('chat.postEphemeral', hash_including(attachments: '[]'))
|
@@ -77,6 +81,7 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
77
81
|
client.chat_postEphemeral(channel: 'channel', text: 'text', user: '123', blocks: [])
|
78
82
|
end.not_to raise_error
|
79
83
|
end
|
84
|
+
|
80
85
|
it 'blocks without text' do
|
81
86
|
expect(client).to receive(:post).with('chat.postEphemeral', hash_including(blocks: '[]'))
|
82
87
|
expect do
|
@@ -99,24 +104,29 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
99
104
|
)
|
100
105
|
client.chat_postMessage(channel: 'channel', text: 'text', attachments: [], blocks: [])
|
101
106
|
end
|
107
|
+
|
102
108
|
context 'text, attachment and blocks arguments' do
|
103
109
|
it 'requires text, attachments or blocks' do
|
104
110
|
expect { client.chat_postMessage(channel: 'channel') }.to(
|
105
111
|
raise_error(ArgumentError, /Required arguments :text, :attachments or :blocks missing/)
|
106
112
|
)
|
107
113
|
end
|
114
|
+
|
108
115
|
it 'only text' do
|
109
116
|
expect(client).to receive(:post).with('chat.postMessage', hash_including(text: 'text'))
|
110
117
|
expect { client.chat_postMessage(channel: 'channel', text: 'text') }.not_to raise_error
|
111
118
|
end
|
119
|
+
|
112
120
|
it 'only attachments' do
|
113
121
|
expect(client).to receive(:post).with('chat.postMessage', hash_including(attachments: '[]'))
|
114
122
|
expect { client.chat_postMessage(channel: 'channel', attachments: []) }.not_to raise_error
|
115
123
|
end
|
124
|
+
|
116
125
|
it 'only blocks' do
|
117
126
|
expect(client).to receive(:post).with('chat.postMessage', hash_including(blocks: '[]'))
|
118
127
|
expect { client.chat_postMessage(channel: 'channel', blocks: []) }.not_to raise_error
|
119
128
|
end
|
129
|
+
|
120
130
|
it 'all text, attachments and blocks' do
|
121
131
|
expect(client).to(
|
122
132
|
receive(:post)
|
@@ -145,11 +155,12 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
145
155
|
)
|
146
156
|
client.chat_update(channel: 'channel', text: 'text', ts: ts, attachments: [], blocks: [])
|
147
157
|
end
|
158
|
+
|
148
159
|
context 'ts arguments' do
|
149
160
|
it 'requires ts' do
|
150
161
|
expect do
|
151
162
|
client.chat_update(channel: 'channel', text: 'text')
|
152
|
-
end.to raise_error(ArgumentError, /Required arguments :ts missing
|
163
|
+
end.to raise_error(ArgumentError, /Required arguments :ts missing/)
|
153
164
|
end
|
154
165
|
end
|
155
166
|
|
@@ -159,30 +170,35 @@ RSpec.describe Slack::Web::Api::Endpoints::Chat do
|
|
159
170
|
raise_error(ArgumentError, /Required arguments :text, :attachments, :blocks or :reply_broadcast missing/)
|
160
171
|
)
|
161
172
|
end
|
173
|
+
|
162
174
|
it 'only text' do
|
163
175
|
expect(client).to receive(:post).with('chat.update', hash_including(text: 'text'))
|
164
176
|
expect do
|
165
177
|
client.chat_update(channel: 'channel', text: 'text', ts: ts)
|
166
178
|
end.not_to raise_error
|
167
179
|
end
|
180
|
+
|
168
181
|
it 'only attachments' do
|
169
182
|
expect(client).to receive(:post).with('chat.update', hash_including(attachments: '[]'))
|
170
183
|
expect do
|
171
184
|
client.chat_update(channel: 'channel', ts: ts, attachments: [])
|
172
185
|
end.not_to raise_error
|
173
186
|
end
|
187
|
+
|
174
188
|
it 'only blocks' do
|
175
189
|
expect(client).to receive(:post).with('chat.update', hash_including(blocks: '[]'))
|
176
190
|
expect do
|
177
191
|
client.chat_update(channel: 'channel', ts: ts, blocks: [])
|
178
192
|
end.not_to raise_error
|
179
193
|
end
|
194
|
+
|
180
195
|
it 'only reply_broadcast' do
|
181
196
|
expect(client).to receive(:post).with('chat.update', hash_including(reply_broadcast: true))
|
182
197
|
expect do
|
183
198
|
client.chat_update(channel: 'channel', ts: ts, reply_broadcast: true)
|
184
199
|
end.not_to raise_error
|
185
200
|
end
|
201
|
+
|
186
202
|
it 'all text, attachments and blocks' do
|
187
203
|
expect(client).to(
|
188
204
|
receive(:post)
|
@@ -22,11 +22,13 @@ RSpec.describe Slack::Web::Api::Endpoints::Dialog do
|
|
22
22
|
raise_error(ArgumentError, /Required arguments :dialog missing/)
|
23
23
|
)
|
24
24
|
end
|
25
|
+
|
25
26
|
it 'requires trigger_id' do
|
26
27
|
expect { client.dialog_open(dialog: []) }.to(
|
27
28
|
raise_error(ArgumentError, /Required arguments :trigger_id missing/)
|
28
29
|
)
|
29
30
|
end
|
31
|
+
|
30
32
|
it 'likes both dialog and trigger_id' do
|
31
33
|
expect(client).to(
|
32
34
|
receive(:post).with('dialog.open', hash_including(trigger_id: '123', dialog: '[]'))
|
@@ -4,6 +4,7 @@ require 'spec_helper'
|
|
4
4
|
RSpec.describe Slack::Web::Api::Endpoints::Views do
|
5
5
|
let(:client) { Slack::Web::Client.new }
|
6
6
|
let(:trigger_id) { '12345.98765.abcd2358fdea' }
|
7
|
+
let(:view_id) { 'abc123567' }
|
7
8
|
|
8
9
|
describe 'views_open' do
|
9
10
|
context 'with a hash for view' do
|
@@ -86,8 +87,8 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
|
|
86
87
|
let(:view_str) { '{"celery":"man"}' }
|
87
88
|
|
88
89
|
it 'automatically converts view into JSON' do
|
89
|
-
expect(client).to receive(:post).with('views.update', { view: view_str })
|
90
|
-
client.views_update(view: { celery: 'man' })
|
90
|
+
expect(client).to receive(:post).with('views.update', { view_id: view_id, view: view_str })
|
91
|
+
client.views_update(view_id: view_id, view: { celery: 'man' })
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
@@ -95,8 +96,16 @@ RSpec.describe Slack::Web::Api::Endpoints::Views do
|
|
95
96
|
let(:view_str) { 'celery man' }
|
96
97
|
|
97
98
|
it 'leaves view as is' do
|
98
|
-
expect(client).to receive(:post).with('views.update', { view: view_str })
|
99
|
-
client.views_update(view: 'celery man')
|
99
|
+
expect(client).to receive(:post).with('views.update', { view_id: view_id, view: view_str })
|
100
|
+
client.views_update(view_id: view_id, view: 'celery man')
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'with both an external_id and view_id' do
|
104
|
+
it 'raises error' do
|
105
|
+
expect do
|
106
|
+
client.views_update(external_id: trigger_id, view_id: view_id, view: 'celery man')
|
107
|
+
end.to raise_error ArgumentError, 'One of :external_id, :view_id is required'
|
108
|
+
end
|
100
109
|
end
|
101
110
|
end
|
102
111
|
end
|
@@ -5,6 +5,11 @@ require 'spec_helper'
|
|
5
5
|
|
6
6
|
RSpec.describe Slack::Web::Api::Endpoints::Files do
|
7
7
|
let(:client) { Slack::Web::Client.new }
|
8
|
+
context 'files_completeUploadExternal' do
|
9
|
+
it 'requires files' do
|
10
|
+
expect { client.files_completeUploadExternal }.to raise_error ArgumentError, /Required arguments :files missing/
|
11
|
+
end
|
12
|
+
end
|
8
13
|
context 'files_delete' do
|
9
14
|
it 'requires file' do
|
10
15
|
expect { client.files_delete }.to raise_error ArgumentError, /Required arguments :file missing/
|
@@ -18,6 +23,14 @@ RSpec.describe Slack::Web::Api::Endpoints::Files do
|
|
18
23
|
expect { client.files_edit(file: %q[F2147483862]) }.to raise_error ArgumentError, /Required arguments :title missing/
|
19
24
|
end
|
20
25
|
end
|
26
|
+
context 'files_getUploadURLExternal' do
|
27
|
+
it 'requires filename' do
|
28
|
+
expect { client.files_getUploadURLExternal(length: %q[]) }.to raise_error ArgumentError, /Required arguments :filename missing/
|
29
|
+
end
|
30
|
+
it 'requires length' do
|
31
|
+
expect { client.files_getUploadURLExternal(filename: %q[]) }.to raise_error ArgumentError, /Required arguments :length missing/
|
32
|
+
end
|
33
|
+
end
|
21
34
|
context 'files_info' do
|
22
35
|
it 'requires file' do
|
23
36
|
expect { client.files_info }.to raise_error ArgumentError, /Required arguments :file missing/
|
@@ -29,11 +29,13 @@ RSpec.describe Slack::Web::Api::Mixins::Conversations do
|
|
29
29
|
eq('ok' => true, 'channel' => { 'id' => 'C123456' })
|
30
30
|
)
|
31
31
|
end
|
32
|
+
|
32
33
|
it 'translates a channel that starts with a #' do
|
33
34
|
expect(conversations.conversations_id(channel: '#general')).to(
|
34
35
|
eq('ok' => true, 'channel' => { 'id' => 'CDEADBEEF' })
|
35
36
|
)
|
36
37
|
end
|
38
|
+
|
37
39
|
it 'fails with an exception' do
|
38
40
|
expect { conversations.conversations_id(channel: '#invalid') }.to(
|
39
41
|
raise_error(Slack::Web::Api::Errors::SlackError, 'channel_not_found')
|
@@ -28,9 +28,11 @@ RSpec.describe Slack::Web::Api::Mixins::Users do
|
|
28
28
|
it 'leaves users specified by ID alone' do
|
29
29
|
expect(users.users_id(user: 'U123456')).to eq('ok' => true, 'user' => { 'id' => 'U123456' })
|
30
30
|
end
|
31
|
+
|
31
32
|
it 'translates a user that starts with a #' do
|
32
33
|
expect(users.users_id(user: '@aws')).to eq('ok' => true, 'user' => { 'id' => 'UDEADBEEF' })
|
33
34
|
end
|
35
|
+
|
34
36
|
it 'fails with an exception' do
|
35
37
|
expect { users.users_id(user: '@foo') }.to(
|
36
38
|
raise_error(Slack::Web::Api::Errors::SlackError, 'user_not_found')
|
@@ -11,16 +11,19 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
|
|
11
11
|
expect(client).to receive(:users_list).with({ limit: 100, cursor: nil })
|
12
12
|
cursor.first
|
13
13
|
end
|
14
|
+
|
14
15
|
it 'handles blank response metadata' do
|
15
16
|
expect(client).to receive(:users_list).once.and_return(Slack::Messages::Message.new)
|
16
17
|
cursor.to_a
|
17
18
|
end
|
19
|
+
|
18
20
|
it 'handles nil response metadata' do
|
19
21
|
expect(client).to(
|
20
22
|
receive(:users_list).once.and_return(Slack::Messages::Message.new(response_metadata: nil))
|
21
23
|
)
|
22
24
|
cursor.to_a
|
23
25
|
end
|
26
|
+
|
24
27
|
it 'paginates with a cursor inside response metadata' do
|
25
28
|
expect(client).to receive(:users_list).twice.and_return(
|
26
29
|
Slack::Messages::Message.new(response_metadata: { next_cursor: 'next' }),
|
@@ -29,6 +32,7 @@ RSpec.describe Slack::Web::Api::Pagination::Cursor do
|
|
29
32
|
expect(cursor).not_to receive(:sleep)
|
30
33
|
cursor.to_a
|
31
34
|
end
|
35
|
+
|
32
36
|
context 'with rate limiting' do
|
33
37
|
let(:error) { Slack::Web::Api::Errors::TooManyRequestsError.new(OpenStruct.new(headers: { 'retry-after' => 9 })) }
|
34
38
|
|
@@ -15,6 +15,7 @@ RSpec.describe Slack::Web::Client do
|
|
15
15
|
expect(client.user_agent).to eq Slack::Web::Config.user_agent
|
16
16
|
expect(client.user_agent).to include Slack::VERSION
|
17
17
|
end
|
18
|
+
|
18
19
|
(Slack::Web::Config::ATTRIBUTES - [:logger]).each do |key|
|
19
20
|
it "sets #{key}" do
|
20
21
|
expect(client.send(key)).to eq Slack::Web::Config.send(key)
|
@@ -56,6 +57,7 @@ RSpec.describe Slack::Web::Client do
|
|
56
57
|
it 'sets user-agent' do
|
57
58
|
expect(client.user_agent).to eq 'custom/user-agent'
|
58
59
|
end
|
60
|
+
|
59
61
|
it 'creates a connection with the custom user-agent' do
|
60
62
|
expect(client.send(:connection).headers).to eq(
|
61
63
|
'Accept' => 'application/json; charset=utf-8',
|
@@ -76,6 +78,7 @@ RSpec.describe Slack::Web::Client do
|
|
76
78
|
client = described_class.new
|
77
79
|
expect(client.token).to eq 'global default'
|
78
80
|
end
|
81
|
+
|
79
82
|
context 'with web config' do
|
80
83
|
before do
|
81
84
|
described_class.configure do |config|
|
@@ -87,6 +90,7 @@ RSpec.describe Slack::Web::Client do
|
|
87
90
|
client = described_class.new
|
88
91
|
expect(client.token).to eq 'custom web token'
|
89
92
|
end
|
93
|
+
|
90
94
|
it 'overrides token to specific token' do
|
91
95
|
client = described_class.new(token: 'local token')
|
92
96
|
expect(client.token).to eq 'local token'
|
@@ -105,6 +109,7 @@ RSpec.describe Slack::Web::Client do
|
|
105
109
|
it 'sets proxy' do
|
106
110
|
expect(client.proxy).to eq 'http://localhost:8080'
|
107
111
|
end
|
112
|
+
|
108
113
|
it 'creates a connection with the proxy' do
|
109
114
|
expect(client.send(:connection).proxy.uri.to_s).to eq 'http://localhost:8080'
|
110
115
|
end
|
@@ -124,6 +129,7 @@ RSpec.describe Slack::Web::Client do
|
|
124
129
|
expect(client.ca_path).to eq '/ca_path'
|
125
130
|
expect(client.ca_file).to eq '/ca_file'
|
126
131
|
end
|
132
|
+
|
127
133
|
it 'creates a connection with ssl options' do
|
128
134
|
ssl = client.send(:connection).ssl
|
129
135
|
expect(ssl.ca_path).to eq '/ca_path'
|
@@ -145,6 +151,7 @@ RSpec.describe Slack::Web::Client do
|
|
145
151
|
it 'sets logger' do
|
146
152
|
expect(client.logger).to eq logger
|
147
153
|
end
|
154
|
+
|
148
155
|
it 'creates a connection with a logger' do
|
149
156
|
expect(client.send(:connection).builder.handlers).to include ::Faraday::Response::Logger
|
150
157
|
end
|
@@ -168,6 +175,7 @@ RSpec.describe Slack::Web::Client do
|
|
168
175
|
it 'sets adapter' do
|
169
176
|
expect(client.adapter).to eq adapter
|
170
177
|
end
|
178
|
+
|
171
179
|
it 'creates a connection with an adapter' do
|
172
180
|
expect(client.send(:connection).adapter).to eq adapter_class
|
173
181
|
end
|
@@ -188,6 +196,7 @@ RSpec.describe Slack::Web::Client do
|
|
188
196
|
it 'sets adapter' do
|
189
197
|
expect(client.adapter).to eq adapter
|
190
198
|
end
|
199
|
+
|
191
200
|
it 'creates a connection with an adapter' do
|
192
201
|
expect(client.send(:connection).adapter).to eq adapter_class
|
193
202
|
end
|
@@ -208,6 +217,7 @@ RSpec.describe Slack::Web::Client do
|
|
208
217
|
expect(client.timeout).to eq 10
|
209
218
|
expect(client.open_timeout).to eq 15
|
210
219
|
end
|
220
|
+
|
211
221
|
it 'creates a connection with timeout options' do
|
212
222
|
conn = client.send(:connection)
|
213
223
|
expect(conn.options.timeout).to eq 10
|
@@ -217,16 +227,16 @@ RSpec.describe Slack::Web::Client do
|
|
217
227
|
end
|
218
228
|
|
219
229
|
context 'per-request options' do
|
220
|
-
it 'applies timeout', vcr: { cassette_name: 'web/
|
230
|
+
it 'applies timeout', vcr: { cassette_name: 'web/rtm_connect', allow_playback_repeats: true } do
|
221
231
|
# reuse the same connection for the test, otherwise it creates a new one every time
|
222
232
|
conn = client.send(:connection)
|
223
233
|
expect(client).to receive(:connection).and_return(conn)
|
224
234
|
|
225
235
|
# get the yielded request to reuse in the next call to
|
226
|
-
#
|
236
|
+
# rtm.connect so that we can examine request.options later
|
227
237
|
request = nil
|
228
238
|
response = conn.post do |r|
|
229
|
-
r.path = 'rtm.
|
239
|
+
r.path = 'rtm.connect'
|
230
240
|
r.headers = {
|
231
241
|
'Accept' => ['application/json; charset=utf-8'],
|
232
242
|
'Authorization' => ['Bearer <SLACK_API_TOKEN>']
|
@@ -236,7 +246,7 @@ RSpec.describe Slack::Web::Client do
|
|
236
246
|
|
237
247
|
expect(conn).to receive(:post).and_yield(request).and_return(response)
|
238
248
|
|
239
|
-
client.
|
249
|
+
client.rtm_connect(request: { timeout: 3 })
|
240
250
|
|
241
251
|
expect(request.options.timeout).to eq 3
|
242
252
|
end
|