slack-ruby-client-bhe 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
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