celluloid_pubsub 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +2 -2
- data/Rakefile +6 -3
- data/celluloid_pubsub.gemspec +1 -1
- data/lib/celluloid_pubsub/reactor.rb +11 -15
- data/lib/celluloid_pubsub/version.rb +1 -1
- data/lib/celluloid_pubsub/web_server.rb +3 -0
- data/spec/lib/celluloid_pubsub/client_pubsub_spec.rb +128 -0
- data/spec/lib/celluloid_pubsub/reactor_spec.rb +208 -0
- data/spec/lib/celluloid_pubsub/registry_spec.rb +4 -0
- data/spec/lib/celluloid_pubsub/web_server_spec.rb +43 -0
- data/spec/spec_helper.rb +8 -0
- metadata +12 -70
- data/bin/appraisal +0 -16
- data/bin/autospec +0 -16
- data/bin/bundler +0 -16
- data/bin/cdiff +0 -16
- data/bin/coderay +0 -16
- data/bin/colortab +0 -16
- data/bin/coveralls +0 -16
- data/bin/decolor +0 -16
- data/bin/erubis +0 -16
- data/bin/guard +0 -16
- data/bin/htmldiff +0 -16
- data/bin/inch +0 -16
- data/bin/ldiff +0 -16
- data/bin/listen +0 -16
- data/bin/nokogiri +0 -16
- data/bin/phare +0 -16
- data/bin/pry +0 -16
- data/bin/rackup +0 -16
- data/bin/rails +0 -16
- data/bin/rake +0 -16
- data/bin/restclient +0 -16
- data/bin/rspec +0 -16
- data/bin/rubocop +0 -16
- data/bin/ruby-parse +0 -16
- data/bin/ruby-rewrite +0 -16
- data/bin/sass +0 -16
- data/bin/sass-convert +0 -16
- data/bin/scss +0 -16
- data/bin/scss-lint +0 -16
- data/bin/sparkr +0 -16
- data/bin/term_display +0 -16
- data/bin/term_mandel +0 -16
- data/bin/thor +0 -16
- data/bin/yard +0 -16
- data/bin/yardoc +0 -16
- data/bin/yardstick +0 -16
- data/bin/yri +0 -16
- data/doc/CelluloidPubsub/Client/PubSubWorker.html +0 -3676
- data/doc/CelluloidPubsub/Client.html +0 -340
- data/doc/CelluloidPubsub/Reactor.html +0 -3502
- data/doc/CelluloidPubsub/Registry.html +0 -234
- data/doc/CelluloidPubsub/VERSION.html +0 -204
- data/doc/CelluloidPubsub/WebServer.html +0 -4275
- data/doc/CelluloidPubsub.html +0 -225
- data/doc/_index.html +0 -184
- data/doc/class_list.html +0 -58
- data/doc/css/common.css +0 -1
- data/doc/css/full_list.css +0 -57
- data/doc/css/style.css +0 -339
- data/doc/file.README.html +0 -150
- data/doc/file_list.html +0 -60
- data/doc/frames.html +0 -26
- data/doc/index.html +0 -150
- data/doc/js/app.js +0 -219
- data/doc/js/full_list.js +0 -181
- data/doc/js/jquery.js +0 -4
- data/doc/method_list.html +0 -357
- data/doc/top-level-namespace.html +0 -112
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e2bb403ba535ddc3097815566d5d19936ea86e1
|
4
|
+
data.tar.gz: 4919d72301e1b6bd5afb05742a28e897cbd0b194
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 830e2d740aec3fe17a899f1623f0a7a4844ac9fe69348df0b3ce335f4a27decf0dea5af19039259da9dc3875061a1d6017aec676bda51003eab6d6c006cb4421
|
7
|
+
data.tar.gz: 558c3876da55ee779fea5d336f984fff2163b8420dae64a95b4680950eb9931db5ce6b551a2464250fe01987b0af55bceadfa8fb664c059f7efd46fbc78a3a30
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -3,6 +3,7 @@ require 'bundler/gem_tasks'
|
|
3
3
|
require 'rspec/core/rake_task'
|
4
4
|
require 'coveralls/rake/task'
|
5
5
|
require 'yard'
|
6
|
+
require 'yard-rspec'
|
6
7
|
Coveralls::RakeTask.new
|
7
8
|
|
8
9
|
RSpec::Core::RakeTask.new(:spec) do |spec|
|
@@ -16,10 +17,12 @@ end
|
|
16
17
|
# Dummy::Application.load_tasks
|
17
18
|
# Rake::Task["db:test:prepare"].invoke
|
18
19
|
# end
|
20
|
+
YARD::Config.options[:load_plugins] = true
|
21
|
+
YARD::Config.load_plugins
|
19
22
|
|
20
23
|
YARD::Rake::YardocTask.new do |t|
|
21
|
-
t.files = ['lib/**/*.rb'] # optional
|
22
|
-
t.options = ['--any', '--extra', '--opts', '--markup-provider=redcarpet', '--markup=markdown'] # optional
|
24
|
+
t.files = ['lib/**/*.rb', 'spec/**/*_spec.rb'] # optional
|
25
|
+
t.options = ['--any', '--extra', '--opts', '--markup-provider=redcarpet', '--markup=markdown', '--debug'] # optional
|
23
26
|
t.stats_options = ['--list-undoc'] # optional
|
24
27
|
end
|
25
28
|
|
@@ -44,7 +47,7 @@ task :all do |_t|
|
|
44
47
|
if ENV['TRAVIS']
|
45
48
|
exec(' bundle exec phare && bundle exec rake spec && bundle exec rake coveralls:push')
|
46
49
|
else
|
47
|
-
exec('bundle exec phare && bundle exec rake spec')
|
50
|
+
exec('bundle exec rubocop -a . && bundle exec phare && bundle exec rake spec')
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
data/celluloid_pubsub.gemspec
CHANGED
@@ -33,8 +33,8 @@ Gem::Specification.new do |s|
|
|
33
33
|
|
34
34
|
s.add_development_dependency 'rubocop', '0.29'
|
35
35
|
s.add_development_dependency 'phare', '~> 0.6', '>= 0.6'
|
36
|
-
s.add_development_dependency 'scss-lint', '~> 0.34', '>= 0.34'
|
37
36
|
s.add_development_dependency 'yard', '~> 0.8.7', '>= 0.8.7'
|
37
|
+
s.add_development_dependency 'yard-rspec', '~> 0.1', '>= 0.1'
|
38
38
|
s.add_development_dependency 'redcarpet', '~> 3.2.2', '>= 3.2.2'
|
39
39
|
s.add_development_dependency 'github-markup', '~> 1.3.3', '>= 1.3.3'
|
40
40
|
s.add_development_dependency 'inch', '~> 0.5.10'
|
@@ -2,15 +2,13 @@ require_relative './registry'
|
|
2
2
|
module CelluloidPubsub
|
3
3
|
# The reactor handles new connections. Based on what the client sends it either subscribes to a channel
|
4
4
|
# or will publish to a channel or just dispatch to the server if command is neither subscribe, publish or unsubscribe
|
5
|
+
#
|
5
6
|
# @!attribute websocket
|
6
7
|
# @return [Reel::WebSocket] websocket connection
|
7
8
|
#
|
8
9
|
# @!attribute server
|
9
10
|
# @return [CelluloidPubsub::Webserver] the server actor to which the reactor is connected to
|
10
11
|
#
|
11
|
-
# @!attribute mutex
|
12
|
-
# @return [Mutex] mutex used to lock when subscribing to a channel
|
13
|
-
#
|
14
12
|
# @!attribute channels
|
15
13
|
# @return [Array] array of channels to which the current reactor has subscribed to
|
16
14
|
class Reactor
|
@@ -18,10 +16,10 @@ module CelluloidPubsub
|
|
18
16
|
include Celluloid::IO
|
19
17
|
include Celluloid::Logger
|
20
18
|
|
21
|
-
attr_accessor :websocket, :server, :
|
19
|
+
attr_accessor :websocket, :server, :channels
|
22
20
|
|
23
21
|
# rececives a new socket connection from the server
|
24
|
-
# and
|
22
|
+
# and listens for messages
|
25
23
|
#
|
26
24
|
# @param [Reel::WebSocket] websocket
|
27
25
|
#
|
@@ -30,7 +28,6 @@ module CelluloidPubsub
|
|
30
28
|
# @api public
|
31
29
|
def work(websocket, server)
|
32
30
|
@server = server
|
33
|
-
@mutex = Mutex.new
|
34
31
|
@channels = []
|
35
32
|
@websocket = websocket
|
36
33
|
info "Streaming changes for #{websocket.url}" if @server.debug_enabled?
|
@@ -44,11 +41,14 @@ module CelluloidPubsub
|
|
44
41
|
# @return [void]
|
45
42
|
#
|
46
43
|
# @api public
|
44
|
+
#
|
45
|
+
# :nocov:
|
47
46
|
def run
|
48
47
|
while message = @websocket.read
|
49
48
|
handle_websocket_message(message)
|
50
49
|
end
|
51
50
|
end
|
51
|
+
# :nocov:
|
52
52
|
|
53
53
|
# method used to parse a JSON object into a Hash object
|
54
54
|
#
|
@@ -170,11 +170,11 @@ module CelluloidPubsub
|
|
170
170
|
# @api public
|
171
171
|
def unsubscribe_client(channel)
|
172
172
|
return unless channel.present?
|
173
|
-
@channels.delete(channel)
|
173
|
+
@channels.delete(channel) unless @channels.blank?
|
174
174
|
@websocket.close if @channels.blank?
|
175
175
|
@server.subscribers[channel].delete_if do |hash|
|
176
176
|
hash[:reactor] == Actor.current
|
177
|
-
end
|
177
|
+
end if @server.subscribers[channel].present?
|
178
178
|
end
|
179
179
|
|
180
180
|
# the method will terminate the current actor
|
@@ -200,13 +200,9 @@ module CelluloidPubsub
|
|
200
200
|
# @api public
|
201
201
|
def start_subscriber(channel, message)
|
202
202
|
return unless channel.present?
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
@websocket << message.merge('client_action' => 'successful_subscription', 'channel' => channel).to_json
|
207
|
-
rescue => e
|
208
|
-
raise [e, e.respond_to?(:backtrace) ? e.backtrace : '', channel, message].inspect
|
209
|
-
end
|
203
|
+
add_subscriber_to_channel(channel, message)
|
204
|
+
debug "Subscribed to #{channel} with #{message}" if @server.debug_enabled?
|
205
|
+
@websocket << message.merge('client_action' => 'successful_subscription', 'channel' => channel).to_json
|
210
206
|
end
|
211
207
|
|
212
208
|
# adds the curent actor the list of the subscribers for a particular channel
|
@@ -51,12 +51,15 @@ module CelluloidPubsub
|
|
51
51
|
# @return [void]
|
52
52
|
#
|
53
53
|
# @api public
|
54
|
+
#
|
55
|
+
# :nocov:
|
54
56
|
def initialize(options = {})
|
55
57
|
parse_options(options)
|
56
58
|
@subscribers = {}
|
57
59
|
info "CelluloidPubsub::WebServer example starting on #{@hostname}:#{@port}" if debug_enabled?
|
58
60
|
super(@hostname, @port, { spy: @spy, backlog: @backlog }, &method(:on_connection))
|
59
61
|
end
|
62
|
+
# :nocov:
|
60
63
|
|
61
64
|
# receives a list of options that are used to configure the webserver
|
62
65
|
#
|
@@ -3,7 +3,135 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe CelluloidPubsub::Client do
|
6
|
+
let(:options) { {} }
|
7
|
+
let(:blk) { proc { |a| puts a } }
|
8
|
+
|
9
|
+
it 'runs the connect method' do
|
10
|
+
expected = nil
|
11
|
+
CelluloidPubsub::Client::PubSubWorker.stubs(:new).returns(expected)
|
12
|
+
res = CelluloidPubsub::Client.connect(options, &blk)
|
13
|
+
res.should eq expected
|
14
|
+
end
|
6
15
|
end
|
7
16
|
|
8
17
|
describe CelluloidPubsub::Client::PubSubWorker do
|
18
|
+
let(:blk) { proc { |a| puts a } }
|
19
|
+
let(:options) { {} }
|
20
|
+
let(:socket) { mock }
|
21
|
+
let(:actor) { mock }
|
22
|
+
|
23
|
+
before(:each) do
|
24
|
+
Celluloid::WebSocket::Client.stubs(:new).returns(socket)
|
25
|
+
socket.stubs(:text)
|
26
|
+
@worker = CelluloidPubsub::Client::PubSubWorker.new({ 'actor' => actor }, &blk)
|
27
|
+
@worker.stubs(:client).returns(socket)
|
28
|
+
@worker.stubs(:debug)
|
29
|
+
@worker.stubs(:async).returns(@worker)
|
30
|
+
actor.stubs(:async).returns(actor)
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#initialize' do
|
34
|
+
it 'creates a object' do
|
35
|
+
@worker.connect_blk.should_not be_nil
|
36
|
+
@worker.actor.should eq actor
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#parse_options' do
|
41
|
+
let(:actor) { mock }
|
42
|
+
let(:hostname) { '127.0.0.1' }
|
43
|
+
let(:port) { 9999 }
|
44
|
+
let(:path) { '/some_path' }
|
45
|
+
let(:custom_options) { { actor: actor, hostname: hostname, port: port, path: path } }
|
46
|
+
|
47
|
+
it 'parses options' do
|
48
|
+
@worker.parse_options(custom_options)
|
49
|
+
@worker.actor.should eq(actor)
|
50
|
+
@worker.hostname.should eq(hostname)
|
51
|
+
@worker.port.should eq(port)
|
52
|
+
@worker.path.should eq(path)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'sets defaults' do
|
56
|
+
@worker.parse_options({})
|
57
|
+
@worker.actor.should eq(nil)
|
58
|
+
@worker.hostname.should eq('0.0.0.0')
|
59
|
+
@worker.port.should eq(1234)
|
60
|
+
@worker.path.should eq('/ws')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#debug_enabled?' do
|
65
|
+
it 'checks if debug is enabled' do
|
66
|
+
CelluloidPubsub::WebServer.expects(:debug_enabled?).returns(true)
|
67
|
+
act = @worker.debug_enabled?
|
68
|
+
act.should eq(true)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#subscribe' do
|
73
|
+
let(:channel) { 'some_channel' }
|
74
|
+
it 'chats with the server' do
|
75
|
+
@worker.expects(:chat).with('client_action' => 'subscribe', 'channel' => channel)
|
76
|
+
@worker.subscribe(channel)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#publish' do
|
81
|
+
let(:channel) { 'some_channel' }
|
82
|
+
let(:data) { 'some_message' }
|
83
|
+
it 'chats with the server' do
|
84
|
+
@worker.expects(:chat).with('client_action' => 'publish', 'channel' => channel, 'data' => data)
|
85
|
+
@worker.publish(channel, data)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#on_open' do
|
90
|
+
let(:channel) { 'some_channel' }
|
91
|
+
let(:data) { 'some_message' }
|
92
|
+
it 'chats with the server' do
|
93
|
+
@worker.connect_blk.expects(:call)
|
94
|
+
@worker.on_open
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe '#on_message' do
|
99
|
+
let(:channel) { 'some_channel' }
|
100
|
+
let(:data) { 'some_message' }
|
101
|
+
it 'chats with the server' do
|
102
|
+
JSON.expects(:parse).with(data).returns(data)
|
103
|
+
@worker.actor.expects(:async).returns(actor)
|
104
|
+
@worker.actor.expects(:on_message).with(data)
|
105
|
+
@worker.on_message(data)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#on_close' do
|
110
|
+
let(:channel) { 'some_channel' }
|
111
|
+
let(:code) { 'some_message' }
|
112
|
+
let(:reason) { 'some reason' }
|
113
|
+
|
114
|
+
it 'chats with the server' do
|
115
|
+
@worker.client.expects(:terminate)
|
116
|
+
@worker.actor.expects(:on_close).with(code, reason)
|
117
|
+
@worker.on_close(code, reason)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#chat' do
|
122
|
+
let(:channel) { 'some_channel' }
|
123
|
+
let(:data) { 'some_message' }
|
124
|
+
let(:data_hash) { { a: 'some mesage ' } }
|
125
|
+
let(:json) { { action: 'message', message: data } }
|
126
|
+
it 'chats witout hash' do
|
127
|
+
JSON.expects(:dump).with(json).returns(json)
|
128
|
+
@worker.client.expects(:text).with(json)
|
129
|
+
@worker.send(:chat, data)
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'chats with a hash' do
|
133
|
+
@worker.client.expects(:text).with(data_hash.to_json)
|
134
|
+
@worker.send(:chat, data_hash)
|
135
|
+
end
|
136
|
+
end
|
9
137
|
end
|
@@ -3,4 +3,212 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe CelluloidPubsub::Reactor do
|
6
|
+
let(:websocket) { mock }
|
7
|
+
let(:server) { mock }
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
subject.stubs(:async).returns(subject)
|
11
|
+
server.stubs(:debug_enabled?).returns(false)
|
12
|
+
server.stubs(:async).returns(server)
|
13
|
+
server.stubs(:handle_dispatched_message)
|
14
|
+
server.stubs(:subscribers).returns({})
|
15
|
+
websocket.stubs(:read)
|
16
|
+
subject.stubs(:inspect).returns(subject)
|
17
|
+
subject.stubs(:run)
|
18
|
+
subject.work(websocket, server)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#work' do
|
22
|
+
it 'works ' do
|
23
|
+
subject.expects(:run)
|
24
|
+
subject.work(websocket, server)
|
25
|
+
subject.websocket.should eq websocket
|
26
|
+
subject.server.should eq server
|
27
|
+
subject.channels.should eq []
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# describe '#rub' do
|
32
|
+
# let(:data) { 'some message' }
|
33
|
+
#
|
34
|
+
# it 'works ' do
|
35
|
+
# subject.unstub(:run)
|
36
|
+
# websocket.stubs(:read).returns(data)
|
37
|
+
# subject.expects(:handle_websocket_message).with(data)
|
38
|
+
# subject.run
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
|
42
|
+
describe '#parse_json_data' do
|
43
|
+
let(:data) { 'some message' }
|
44
|
+
let(:expected) { data.to_json }
|
45
|
+
|
46
|
+
it 'works with hash ' do
|
47
|
+
JSON.expects(:parse).with(data).returns(expected)
|
48
|
+
actual = subject.parse_json_data(data)
|
49
|
+
actual.should eq expected
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'works with exception parsing ' do
|
53
|
+
JSON.expects(:parse).with(data).raises(StandardError)
|
54
|
+
actual = subject.parse_json_data(data)
|
55
|
+
actual.should eq data
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#handle_websocket_message' do
|
60
|
+
let(:data) { 'some message' }
|
61
|
+
let(:json_data) { { a: 'b' } }
|
62
|
+
|
63
|
+
it 'handle_websocket_message' do
|
64
|
+
subject.expects(:parse_json_data).with(data).returns(json_data)
|
65
|
+
subject.expects(:handle_parsed_websocket_message).with(json_data)
|
66
|
+
subject.handle_websocket_message(data)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#handle_parsed_websocket_message' do
|
71
|
+
it 'handle_websocket_message with a hash' do
|
72
|
+
data = { 'client_action' => 'b' }
|
73
|
+
data.expects(:stringify_keys).returns(data)
|
74
|
+
subject.expects(:delegate_action).with(data)
|
75
|
+
subject.handle_parsed_websocket_message(data)
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'handle_websocket_message with something else than a hash' do
|
79
|
+
data = 'some message'
|
80
|
+
subject.expects(:handle_unknown_action).with(data)
|
81
|
+
subject.handle_parsed_websocket_message(data)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe '#delegate_action' do
|
86
|
+
it 'unsubscribes all' do
|
87
|
+
data = { 'client_action' => 'unsubscribe_all' }
|
88
|
+
subject.expects(:unsubscribe_all).returns('bla')
|
89
|
+
subject.delegate_action(data)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'unsubscribes all' do
|
93
|
+
data = { 'client_action' => 'unsubscribe', 'channel' => 'some channel' }
|
94
|
+
subject.expects(:unsubscribe_client).with(data['channel'])
|
95
|
+
subject.delegate_action(data)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'subscribes to channell' do
|
99
|
+
data = { 'client_action' => 'subscribe', 'channel' => 'some channel' }
|
100
|
+
subject.expects(:start_subscriber).with(data['channel'], data)
|
101
|
+
subject.delegate_action(data)
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'publish' do
|
105
|
+
data = { 'client_action' => 'publish', 'channel' => 'some channel', 'data' => 'some data' }
|
106
|
+
server.expects(:publish_event).with(data['channel'], data['data'].to_json)
|
107
|
+
subject.delegate_action(data)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'handles unknown' do
|
111
|
+
data = { 'client_action' => 'some action', 'channel' => 'some channel' }
|
112
|
+
subject.expects(:handle_unknown_action).with(data)
|
113
|
+
subject.delegate_action(data)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '#handle_unknown_action' do
|
118
|
+
it 'handles unknown' do
|
119
|
+
data = 'some data'
|
120
|
+
server.expects(:handle_dispatched_message)
|
121
|
+
subject.handle_unknown_action(data)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#unsubscribe_client' do
|
126
|
+
let(:channel) { 'some channel' }
|
127
|
+
it 'returns nil' do
|
128
|
+
act = subject.unsubscribe_client('')
|
129
|
+
act.should eq(nil)
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'unsubscribes' do
|
133
|
+
subject.channels.stubs(:blank?).returns(false)
|
134
|
+
subject.channels.expects(:delete).with(channel)
|
135
|
+
act = subject.unsubscribe_client(channel)
|
136
|
+
act.should eq(nil)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'unsubscribes' do
|
140
|
+
subject.channels.stubs(:blank?).returns(true)
|
141
|
+
subject.websocket.expects(:close)
|
142
|
+
act = subject.unsubscribe_client(channel)
|
143
|
+
act.should eq(nil)
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'unsubscribes' do
|
147
|
+
subject.channels.stubs(:blank?).returns(false)
|
148
|
+
subject.channels.stubs(:delete)
|
149
|
+
server.stubs(:subscribers).returns("#{channel}" => [{ reactor: subject }])
|
150
|
+
subject.unsubscribe_client(channel)
|
151
|
+
server.subscribers[channel].should eq([])
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#shutdown' do
|
156
|
+
it 'shutdowns' do
|
157
|
+
subject.expects(:terminate)
|
158
|
+
subject.shutdown
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#start_subscriber' do
|
163
|
+
let(:channel) { 'some channel' }
|
164
|
+
let(:message) { { a: 'b' } }
|
165
|
+
|
166
|
+
it 'subscribes ' do
|
167
|
+
act = subject.start_subscriber('', message)
|
168
|
+
act.should eq(nil)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'subscribes ' do
|
172
|
+
subject.stubs(:add_subscriber_to_channel).with(channel, message)
|
173
|
+
subject.websocket.expects(:<<).with(message.merge('client_action' => 'successful_subscription', 'channel' => channel).to_json)
|
174
|
+
subject.start_subscriber(channel, message)
|
175
|
+
end
|
176
|
+
|
177
|
+
# it 'raises error' do
|
178
|
+
# subject.stubs(:add_subscriber_to_channel).raises(StandardError)
|
179
|
+
#
|
180
|
+
# expect do
|
181
|
+
# subject.start_subscriber(channel, message)
|
182
|
+
# end.to raise_error(StandardError) { |e|
|
183
|
+
# expect(e.message).to include(channel)
|
184
|
+
# }
|
185
|
+
# end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe '#add_subscriber_to_channel' do
|
189
|
+
let(:channel) { 'some channel' }
|
190
|
+
let(:message) { { a: 'b' } }
|
191
|
+
|
192
|
+
it 'adds subscribed' do
|
193
|
+
CelluloidPubsub::Registry.channels.stubs(:include?).with(channel).returns(false)
|
194
|
+
CelluloidPubsub::Registry.channels.expects(:<<).with(channel)
|
195
|
+
server.subscribers[channel] = []
|
196
|
+
server.subscribers[channel].expects(:<<).with(reactor: subject, message: message)
|
197
|
+
subject.add_subscriber_to_channel(channel, message)
|
198
|
+
subject.channels.should include(channel)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe '#unsubscribe_all' do
|
203
|
+
let(:channel) { 'some channel' }
|
204
|
+
let(:message) { { a: 'b' } }
|
205
|
+
|
206
|
+
it 'adds subscribed' do
|
207
|
+
CelluloidPubsub::Registry.stubs(:channels).returns([channel])
|
208
|
+
server.subscribers.stubs(:[]).with(channel).returns([{ reactor: subject, message: message }])
|
209
|
+
subject.websocket.expects(:close)
|
210
|
+
subject.expects(:shutdown)
|
211
|
+
subject.unsubscribe_all
|
212
|
+
end
|
213
|
+
end
|
6
214
|
end
|
@@ -3,4 +3,47 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe CelluloidPubsub::WebServer do
|
6
|
+
it 'should have host constant' do
|
7
|
+
CelluloidPubsub::WebServer::HOST.should eq('0.0.0.0')
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should have host constant' do
|
11
|
+
CelluloidPubsub::WebServer::PORT.should eq(1234)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should have host constant' do
|
15
|
+
CelluloidPubsub::WebServer::PATH.should eq('/ws')
|
16
|
+
end
|
17
|
+
let(:options) { {} }
|
18
|
+
let(:web_server) { mock }
|
19
|
+
|
20
|
+
before(:each) do
|
21
|
+
CelluloidPubsub::WebServer.stubs(:new).returns(web_server)
|
22
|
+
end
|
23
|
+
|
24
|
+
# it '#initialize with default values ' do
|
25
|
+
# web_server.parse_options({})
|
26
|
+
# web_server.hostname.should eq(CelluloidPubsub::WebServer::HOST)
|
27
|
+
# web_server.port.should eq(CelluloidPubsub::WebServer::PORT)
|
28
|
+
# web_server.path.should eq(CelluloidPubsub::WebServer::PATH)
|
29
|
+
# web_server.backlog.should eq(1024)
|
30
|
+
# web_server.spy.should eq(false)
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# describe '#with custom values' do
|
34
|
+
# let(:hostname) { '192.0.0.1' }
|
35
|
+
# let(:port) { 13_456 }
|
36
|
+
# let(:path) { '/pathy' }
|
37
|
+
# let(:backlog) { 2048 }
|
38
|
+
# let(:spy) { true }
|
39
|
+
#
|
40
|
+
# it '#initialize with custom values ' do
|
41
|
+
# web_server.parse_options(hostname: hostname, port: port, path: path, spy: spy, backlog: backlog)
|
42
|
+
# web_server.hostname.should eq(hostname)
|
43
|
+
# web_server.port.should eq(port)
|
44
|
+
# web_server.path.should eq(path)
|
45
|
+
# web_server.backlog.should eq(backlog)
|
46
|
+
# web_server.spy.should eq(spy)
|
47
|
+
# end
|
48
|
+
# end
|
6
49
|
end
|