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.
- 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
|