slack-ruby-client-bhe 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +17 -0
  2. data/.gitignore +4 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +6 -0
  6. data/.rubocop_todo.yml +78 -0
  7. data/.travis.yml +26 -0
  8. data/CHANGELOG.md +79 -0
  9. data/CONTRIBUTING.md +157 -0
  10. data/Gemfile +5 -0
  11. data/LICENSE.md +22 -0
  12. data/README.md +385 -0
  13. data/RELEASING.md +69 -0
  14. data/Rakefile +19 -0
  15. data/UPGRADING.md +26 -0
  16. data/bin/commands.rb +21 -0
  17. data/bin/commands/api.rb +14 -0
  18. data/bin/commands/auth.rb +12 -0
  19. data/bin/commands/channels.rb +149 -0
  20. data/bin/commands/chat.rb +47 -0
  21. data/bin/commands/dnd.rb +47 -0
  22. data/bin/commands/emoji.rb +12 -0
  23. data/bin/commands/files.rb +72 -0
  24. data/bin/commands/groups.rb +167 -0
  25. data/bin/commands/im.rb +53 -0
  26. data/bin/commands/mpim.rb +53 -0
  27. data/bin/commands/oauth.rb +16 -0
  28. data/bin/commands/pins.rb +37 -0
  29. data/bin/commands/reactions.rb +53 -0
  30. data/bin/commands/rtm.rb +15 -0
  31. data/bin/commands/search.rb +40 -0
  32. data/bin/commands/stars.rb +37 -0
  33. data/bin/commands/team.rb +32 -0
  34. data/bin/commands/usergroups.rb +73 -0
  35. data/bin/commands/users.rb +57 -0
  36. data/bin/slack +50 -0
  37. data/examples/hi_real_time/Gemfile +5 -0
  38. data/examples/hi_real_time/hi.gif +0 -0
  39. data/examples/hi_real_time/hi.rb +32 -0
  40. data/examples/hi_real_time_and_web/Gemfile +5 -0
  41. data/examples/hi_real_time_and_web/hi.gif +0 -0
  42. data/examples/hi_real_time_and_web/hi.rb +24 -0
  43. data/examples/hi_real_time_async/Gemfile +5 -0
  44. data/examples/hi_real_time_async/hi.rb +29 -0
  45. data/examples/hi_web/Gemfile +3 -0
  46. data/examples/hi_web/hi.gif +0 -0
  47. data/examples/hi_web/hi.rb +12 -0
  48. data/examples/new_ticket/Gemfile +3 -0
  49. data/examples/new_ticket/new_ticket.rb +25 -0
  50. data/lib/slack-ruby-client.rb +29 -0
  51. data/lib/slack.rb +1 -0
  52. data/lib/slack/config.rb +21 -0
  53. data/lib/slack/messages/formatting.rb +30 -0
  54. data/lib/slack/real_time/api/message.rb +20 -0
  55. data/lib/slack/real_time/api/message_id.rb +14 -0
  56. data/lib/slack/real_time/api/ping.rb +16 -0
  57. data/lib/slack/real_time/api/typing.rb +17 -0
  58. data/lib/slack/real_time/client.rb +152 -0
  59. data/lib/slack/real_time/concurrency.rb +8 -0
  60. data/lib/slack/real_time/concurrency/celluloid.rb +93 -0
  61. data/lib/slack/real_time/concurrency/eventmachine.rb +39 -0
  62. data/lib/slack/real_time/config.rb +55 -0
  63. data/lib/slack/real_time/socket.rb +81 -0
  64. data/lib/slack/version.rb +3 -0
  65. data/lib/slack/web/api/endpoints.rb +53 -0
  66. data/lib/slack/web/api/endpoints/api.rb +24 -0
  67. data/lib/slack/web/api/endpoints/auth.rb +20 -0
  68. data/lib/slack/web/api/endpoints/channels.rb +220 -0
  69. data/lib/slack/web/api/endpoints/chat.rb +91 -0
  70. data/lib/slack/web/api/endpoints/dnd.rb +64 -0
  71. data/lib/slack/web/api/endpoints/emoji.rb +20 -0
  72. data/lib/slack/web/api/endpoints/files.rb +108 -0
  73. data/lib/slack/web/api/endpoints/groups.rb +247 -0
  74. data/lib/slack/web/api/endpoints/im.rb +85 -0
  75. data/lib/slack/web/api/endpoints/mpim.rb +84 -0
  76. data/lib/slack/web/api/endpoints/oauth.rb +32 -0
  77. data/lib/slack/web/api/endpoints/pins.rb +64 -0
  78. data/lib/slack/web/api/endpoints/presence.rb +23 -0
  79. data/lib/slack/web/api/endpoints/reactions.rb +89 -0
  80. data/lib/slack/web/api/endpoints/rtm.rb +27 -0
  81. data/lib/slack/web/api/endpoints/search.rb +65 -0
  82. data/lib/slack/web/api/endpoints/stars.rb +61 -0
  83. data/lib/slack/web/api/endpoints/team.rb +47 -0
  84. data/lib/slack/web/api/endpoints/usergroups.rb +113 -0
  85. data/lib/slack/web/api/endpoints/users.rb +73 -0
  86. data/lib/slack/web/api/error.rb +14 -0
  87. data/lib/slack/web/api/mixins.rb +3 -0
  88. data/lib/slack/web/api/mixins/channels.id.json +20 -0
  89. data/lib/slack/web/api/mixins/channels.id.rb +26 -0
  90. data/lib/slack/web/api/mixins/groups.id.json +20 -0
  91. data/lib/slack/web/api/mixins/groups.id.rb +26 -0
  92. data/lib/slack/web/api/mixins/users.id.json +20 -0
  93. data/lib/slack/web/api/mixins/users.id.rb +26 -0
  94. data/lib/slack/web/api/patches/chat.1.text-attachments-required.patch +13 -0
  95. data/lib/slack/web/api/patches/chat.2.attachments-json.patch +17 -0
  96. data/lib/slack/web/api/schema/group.json +14 -0
  97. data/lib/slack/web/api/schema/method.json +45 -0
  98. data/lib/slack/web/api/tasks/generate.rake +61 -0
  99. data/lib/slack/web/api/templates/command.erb +34 -0
  100. data/lib/slack/web/api/templates/commands.erb +5 -0
  101. data/lib/slack/web/api/templates/endpoints.erb +21 -0
  102. data/lib/slack/web/api/templates/method.erb +49 -0
  103. data/lib/slack/web/client.rb +28 -0
  104. data/lib/slack/web/config.rb +41 -0
  105. data/lib/slack/web/faraday/connection.rb +29 -0
  106. data/lib/slack/web/faraday/request.rb +39 -0
  107. data/lib/slack/web/faraday/response/raise_error.rb +15 -0
  108. data/lib/slack_ruby_client.rb +1 -0
  109. data/screenshots/register-bot.png +0 -0
  110. data/slack-ruby-client.gemspec +31 -0
  111. data/slack.png +0 -0
  112. data/spec/fixtures/slack/web/429_error.yml +83 -0
  113. data/spec/fixtures/slack/web/auth_test_error.yml +48 -0
  114. data/spec/fixtures/slack/web/auth_test_success.yml +57 -0
  115. data/spec/fixtures/slack/web/channels_info.yml +46 -0
  116. data/spec/fixtures/slack/web/groups_info.yml +43 -0
  117. data/spec/fixtures/slack/web/rtm_start.yml +73 -0
  118. data/spec/fixtures/slack/web/users_info.yml +130 -0
  119. data/spec/fixtures/slack/web/users_list.yml +72 -0
  120. data/spec/integration/integration_spec.rb +107 -0
  121. data/spec/slack/config_spec.rb +14 -0
  122. data/spec/slack/messages/formatting_spec.rb +43 -0
  123. data/spec/slack/real_time/api/message_spec.rb +15 -0
  124. data/spec/slack/real_time/api/ping_spec.rb +15 -0
  125. data/spec/slack/real_time/api/typing_spec.rb +15 -0
  126. data/spec/slack/real_time/client_spec.rb +198 -0
  127. data/spec/slack/real_time/concurrency/celluloid_spec.rb +58 -0
  128. data/spec/slack/real_time/concurrency/eventmachine_spec.rb +49 -0
  129. data/spec/slack/slack_spec.rb +58 -0
  130. data/spec/slack/version_spec.rb +7 -0
  131. data/spec/slack/web/api/endpoints/auth_spec.rb +20 -0
  132. data/spec/slack/web/api/endpoints/channels_spec.rb +11 -0
  133. data/spec/slack/web/api/endpoints/chat_spec.rb +33 -0
  134. data/spec/slack/web/api/endpoints/groups_spec.rb +11 -0
  135. data/spec/slack/web/api/endpoints/users_spec.rb +17 -0
  136. data/spec/slack/web/api/error_spec.rb +14 -0
  137. data/spec/slack/web/api/mixins/channels_spec.rb +31 -0
  138. data/spec/slack/web/api/mixins/groups_spec.rb +31 -0
  139. data/spec/slack/web/api/mixins/users_spec.rb +31 -0
  140. data/spec/slack/web/client_spec.rb +134 -0
  141. data/spec/spec_helper.rb +14 -0
  142. data/spec/support/queue_with_timeout.rb +34 -0
  143. data/spec/support/real_time/concurrency/mock.rb +31 -0
  144. data/spec/support/real_time/connected_client.rb +16 -0
  145. data/spec/support/token.rb +10 -0
  146. data/spec/support/vcr.rb +8 -0
  147. metadata +392 -0
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'integration test', skip: !ENV['SLACK_API_TOKEN'] && 'missing SLACK_API_TOKEN' do
4
+ around do |ex|
5
+ WebMock.allow_net_connect!
6
+ VCR.turned_off { ex.run }
7
+ WebMock.disable_net_connect!
8
+ end
9
+
10
+ before do
11
+ Thread.abort_on_exception = true
12
+ end
13
+
14
+ let(:logger) { Logger.new(STDOUT) }
15
+
16
+ let(:queue) { QueueWithTimeout.new }
17
+
18
+ let(:client) { Slack::RealTime::Client.new(token: ENV['SLACK_API_TOKEN']) }
19
+
20
+ let(:connection) do
21
+ # starts the client and pushes an item on a queue when connected
22
+ client.start_async do |driver|
23
+ driver.on :open do |data|
24
+ logger.debug "connection.on :open, data=#{data}"
25
+ queue.push nil
26
+ end
27
+ end
28
+ end
29
+
30
+ before do
31
+ client.on :hello do
32
+ logger.info "Successfully connected, welcome '#{client.self['name']}' to the '#{client.team['name']}' team at https://#{client.team['domain']}.slack.com."
33
+ end
34
+
35
+ client.on :close do
36
+ # pushes another item to the queue when disconnected
37
+ queue.push nil
38
+ end
39
+ end
40
+
41
+ def start_server
42
+ dt = rand(5) + 1
43
+ logger.debug "#start_server, waiting #{dt} second(s)"
44
+ sleep dt # prevent Slack 429 rate limit errors
45
+ # start server and wait for on :open
46
+ c = connection
47
+ logger.debug "connection is #{c}"
48
+ queue.pop_with_timeout(5)
49
+ end
50
+
51
+ def wait_for_server
52
+ logger.debug '#wait_for_server'
53
+ queue.pop_with_timeout(5)
54
+ logger.debug '#wait_for_server, joined'
55
+ end
56
+
57
+ def stop_server
58
+ logger.debug '#stop_server'
59
+ client.stop!
60
+ logger.debug '#stop_server, stopped'
61
+ end
62
+
63
+ after do
64
+ wait_for_server
65
+ end
66
+
67
+ context 'client connected' do
68
+ before do
69
+ start_server
70
+ end
71
+
72
+ let(:channel) { "@#{client.self['name']}" }
73
+
74
+ it 'responds to message' do
75
+ message = SecureRandom.hex
76
+
77
+ client.on :message do |data|
78
+ logger.debug data
79
+ # concurrent execution of tests causes messages to arrive in any order
80
+ next unless data['text'] == message
81
+ expect(data['text']).to eq message
82
+ expect(data['subtype']).to eq 'bot_message'
83
+ logger.debug 'client.stop!'
84
+ expect(client.started?).to be true
85
+ client.stop!
86
+ end
87
+
88
+ logger.debug "chat_postMessage, channel=#{channel}, message=#{message}"
89
+ client.web_client.chat_postMessage channel: channel, text: message
90
+ end
91
+
92
+ it 'sends message' do
93
+ client.message(channel: channel, text: 'Hello world!')
94
+ client.stop!
95
+ end
96
+ end
97
+
98
+ it 'gets hello' do
99
+ client.on :hello do |data|
100
+ logger.debug "client.on :hello, data=#{data}"
101
+ expect(client.started?).to be true
102
+ client.stop!
103
+ end
104
+
105
+ start_server
106
+ end
107
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe Slack::Config do
4
+ describe '#configure' do
5
+ before do
6
+ Slack.configure do |config|
7
+ config.token = 'a token'
8
+ end
9
+ end
10
+ it 'sets token' do
11
+ expect(Slack.config.token).to eq 'a token'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Slack::Messages::Formatting do
5
+ subject do
6
+ Slack::Messages::Formatting
7
+ end
8
+ context '#unescape' do
9
+ it 'plain text' do
10
+ expect(subject.unescape('plain text')).to eq 'plain text'
11
+ end
12
+ it 'decodes an HTML-encoded message' do
13
+ expect(subject.unescape('Hello &amp; &lt;world&gt;')).to eq 'Hello & <world>'
14
+ end
15
+ it 'unescapes a user reference' do
16
+ expect(subject.unescape('Hey <@U024BE7LH|bob>, did you see my file?')).to eq 'Hey @bob, did you see my file?'
17
+ end
18
+ it 'unescapes a user reference without a name' do
19
+ expect(subject.unescape('<@U02BEFY4U> ^^^')).to eq '@U02BEFY4U ^^^'
20
+ end
21
+ it 'unescapes a URL without text' do
22
+ expect(subject.unescape('This message contains a URL <http://foo.com/>')).to eq 'This message contains a URL http://foo.com/'
23
+ end
24
+ it 'unescapes a URL with text' do
25
+ expect(subject.unescape('So does this one: <http://www.foo.com|www.foo.com>')).to eq 'So does this one: www.foo.com'
26
+ end
27
+ it 'removes mailto' do
28
+ expect(subject.unescape('<mailto:bob@example.com|Bob>')).to eq 'Bob'
29
+ end
30
+ it 'unlinkifies references' do
31
+ expect(subject.unescape('Hello <@U123|bob>, say hi to <!everyone> in <#C1234|general>')).to eq 'Hello @bob, say hi to @everyone in #general'
32
+ end
33
+ it 'can handle a lone &gt;' do
34
+ expect(subject.unescape('Hello <@U123|bob> &gt; file.txt')).to eq 'Hello @bob > file.txt'
35
+ end
36
+ it 'unescapes a double smart quote' do
37
+ expect(subject.unescape('“hello”')).to eq '"hello"'
38
+ end
39
+ it 'unescapes a single smart quote' do
40
+ expect(subject.unescape('‘hello’')).to eq "'hello'"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ include_context 'connected client'
5
+
6
+ describe '#message' do
7
+ before do
8
+ allow(client).to receive(:next_id).and_return(42)
9
+ end
10
+ it 'sends message' do
11
+ expect(socket).to receive(:send_data).with({ type: 'message', id: 42, text: 'hello world', channel: 'channel' }.to_json)
12
+ client.message(text: 'hello world', channel: 'channel')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ include_context 'connected client'
5
+
6
+ describe '#ping' do
7
+ before do
8
+ allow(client).to receive(:next_id).and_return(42)
9
+ end
10
+ it 'sends message' do
11
+ expect(socket).to receive(:send_data).with({ type: 'ping', id: 42 }.to_json)
12
+ client.ping
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ include_context 'connected client'
5
+
6
+ describe '#typing' do
7
+ before do
8
+ allow(client).to receive(:next_id).and_return(42)
9
+ end
10
+ it 'sends a typing indicator' do
11
+ expect(socket).to receive(:send_data).with({ type: 'typing', id: 42, channel: 'channel' }.to_json)
12
+ client.typing(channel: 'channel')
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,198 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Slack::RealTime::Client, vcr: { cassette_name: 'web/rtm_start' } do
4
+ let(:ws) { double(Slack::RealTime::Concurrency::Mock::WebSocket, on: true) }
5
+ let(:url) { 'wss://ms173.slack-msgs.com/websocket/lqcUiAvrKTP-uuid=' }
6
+ before do
7
+ @token = ENV.delete('SLACK_API_TOKEN')
8
+ Slack::Config.reset
9
+ Slack::RealTime::Config.reset
10
+ Slack::RealTime.configure do |config|
11
+ config.concurrency = Slack::RealTime::Concurrency::Mock
12
+ end
13
+ end
14
+ after do
15
+ ENV['SLACK_API_TOKEN'] = @token if @token
16
+ end
17
+ context 'token' do
18
+ before do
19
+ Slack.configure do |config|
20
+ config.token = 'global default'
21
+ end
22
+ end
23
+ it 'defaults token to global default' do
24
+ client = Slack::RealTime::Client.new
25
+ expect(client.token).to eq 'global default'
26
+ expect(client.web_client.token).to eq 'global default'
27
+ end
28
+ context 'with real time config' do
29
+ before do
30
+ Slack::RealTime::Client.configure do |config|
31
+ config.token = 'custom real time token'
32
+ end
33
+ end
34
+ it 'overrides token to real time config' do
35
+ client = Slack::RealTime::Client.new
36
+ expect(client.token).to eq 'custom real time token'
37
+ expect(client.web_client.token).to eq 'custom real time token'
38
+ end
39
+ it 'overrides token to specific token' do
40
+ client = Slack::RealTime::Client.new(token: 'local token')
41
+ expect(client.token).to eq 'local token'
42
+ expect(client.web_client.token).to eq 'local token'
43
+ end
44
+ end
45
+ end
46
+ context 'client' do
47
+ let(:client) { Slack::RealTime::Client.new }
48
+ context 'started' do
49
+ describe '#start!' do
50
+ let(:socket) { double(Slack::RealTime::Socket, connected?: true) }
51
+ before do
52
+ allow(Slack::RealTime::Socket).to receive(:new).with(url, ping: 30).and_return(socket)
53
+ allow(socket).to receive(:connect!)
54
+ allow(socket).to receive(:start_sync).and_yield
55
+ client.start!
56
+ end
57
+ context 'properties provided upon connection' do
58
+ it 'sets url' do
59
+ expect(client.url).to eq url
60
+ end
61
+ it 'sets team' do
62
+ expect(client.team['domain']).to eq 'dblockdotorg'
63
+ end
64
+ it 'sets self' do
65
+ expect(client.self['id']).to eq 'U07518DTL'
66
+ end
67
+ it 'sets users' do
68
+ expect(client.users.count).to eq 7
69
+ expect(client.users.first['id']).to eq 'U07KECJ77'
70
+ end
71
+ it 'sets channels' do
72
+ expect(client.channels.count).to eq 8
73
+ expect(client.channels.first['name']).to eq 'demo'
74
+ end
75
+ it 'sets ims' do
76
+ expect(client.ims.count).to eq 2
77
+ expect(client.ims.first['user']).to eq 'USLACKBOT'
78
+ end
79
+ it 'sets bots' do
80
+ expect(client.bots.count).to eq 5
81
+ expect(client.bots.first['name']).to eq 'bot'
82
+ end
83
+ it 'sets groups' do
84
+ expect(client.groups.count).to eq 0
85
+ end
86
+ end
87
+ it 'uses web client to fetch url' do
88
+ expect(client.web_client).to be_a Slack::Web::Client
89
+ end
90
+ it 'remembers socket' do
91
+ expect(client.instance_variable_get('@socket')).to eq socket
92
+ end
93
+ it 'cannot be invoked twice' do
94
+ expect do
95
+ client.start!
96
+ end.to raise_error Slack::RealTime::Client::ClientAlreadyStartedError
97
+ end
98
+ describe '#stop!' do
99
+ before do
100
+ expect(socket).to receive(:disconnect!)
101
+ client.stop!
102
+ end
103
+ it 'cannot be invoked twice' do
104
+ client.instance_variable_set('@socket', nil) # caused by a :close callback
105
+ expect do
106
+ client.stop!
107
+ end.to raise_error Slack::RealTime::Client::ClientNotStartedError
108
+ end
109
+ end
110
+ describe '#next_id' do
111
+ it 'increments' do
112
+ previous_id = client.send(:next_id)
113
+ expect(client.send(:next_id)).to eq previous_id + 1
114
+ end
115
+ end
116
+ end
117
+ end
118
+ context 'with defaults' do
119
+ describe '#initialize' do
120
+ it 'sets ping' do
121
+ expect(client.websocket_ping).to eq 30
122
+ end
123
+ it "doesn't set proxy" do
124
+ expect(client.websocket_proxy).to be nil
125
+ end
126
+ Slack::RealTime::Config::ATTRIBUTES.each do |key|
127
+ it "sets #{key}" do
128
+ expect(client.send(key)).to eq Slack::RealTime::Config.send(key)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ context 'with custom settings' do
135
+ describe '#initialize' do
136
+ Slack::RealTime::Config::ATTRIBUTES.each do |key|
137
+ context key do
138
+ let(:client) { Slack::RealTime::Client.new(key => 'custom') }
139
+ it "sets #{key}" do
140
+ expect(client.send(key)).to_not eq Slack::RealTime::Config.send(key)
141
+ expect(client.send(key)).to eq 'custom'
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ context 'global config' do
148
+ after do
149
+ Slack::RealTime::Client.config.reset
150
+ end
151
+ let(:client) { Slack::RealTime::Client.new }
152
+ context 'ping' do
153
+ before do
154
+ Slack::RealTime::Client.configure do |config|
155
+ config.websocket_ping = 15
156
+ end
157
+ end
158
+ describe '#initialize' do
159
+ it 'sets ping' do
160
+ expect(client.websocket_ping).to eq 15
161
+ end
162
+ it 'creates a connection with custom ping' do
163
+ expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(url, nil, ping: 15).and_return(ws)
164
+ client.start!
165
+ end
166
+ end
167
+ end
168
+ context 'proxy' do
169
+ before do
170
+ Slack::RealTime::Client.configure do |config|
171
+ config.websocket_proxy = {
172
+ origin: 'http://username:password@proxy.example.com',
173
+ headers: { 'User-Agent' => 'ruby' }
174
+ }
175
+ end
176
+ end
177
+ describe '#initialize' do
178
+ it 'sets proxy' do
179
+ expect(client.websocket_proxy).to eq(
180
+ origin: 'http://username:password@proxy.example.com',
181
+ headers: { 'User-Agent' => 'ruby' }
182
+ )
183
+ end
184
+ it 'creates a connection with custom proxy' do
185
+ expect(Slack::RealTime::Concurrency::Mock::WebSocket).to receive(:new).with(
186
+ url,
187
+ nil,
188
+ ping: 30,
189
+ proxy: {
190
+ origin: 'http://username:password@proxy.example.com',
191
+ headers: { 'User-Agent' => 'ruby' }
192
+ }).and_return(ws)
193
+ client.start!
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ begin
4
+ RSpec.describe Slack::RealTime::Concurrency::Celluloid::Socket do
5
+ context 'with url' do
6
+ let(:url) { 'wss://echo.websocket.org/websocket/xyz' }
7
+ subject(:socket) { described_class.new(url, ping: 42) }
8
+ let(:driver) { WebSocket::Driver::Client }
9
+ let(:ws) { double(driver) }
10
+
11
+ describe '#initialize' do
12
+ it 'sets url' do
13
+ expect(socket.url).to eq url
14
+ end
15
+ end
16
+
17
+ describe '#connect!' do
18
+ before do
19
+ allow(ws).to receive(:on).with(:close)
20
+ end
21
+
22
+ xit 'connects' do
23
+ expect(socket.driver).to receive(:start)
24
+
25
+ socket.connect!
26
+ end
27
+
28
+ xit 'pings every 30s' do
29
+ expect(driver).to receive(:client).with(socket).and_return(ws)
30
+ socket.connect!
31
+ end
32
+ end
33
+
34
+ describe '#disconnect!' do
35
+ it 'closes and nils the websocket' do
36
+ socket.instance_variable_set('@driver', ws)
37
+ expect(ws).to receive(:close)
38
+ socket.disconnect!
39
+ end
40
+ end
41
+
42
+ describe 'send_data' do
43
+ let(:driver) { socket.driver }
44
+ before do
45
+ allow(driver).to receive(:start)
46
+ allow(subject).to receive(:run_loop)
47
+ socket.connect!
48
+ end
49
+
50
+ it 'sends data' do
51
+ expect(driver).to receive(:text).with('data')
52
+ subject.send_data('data')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ rescue LoadError
58
+ end