websocket-rails 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +32 -0
  3. data/Gemfile +2 -1
  4. data/README.md +29 -34
  5. data/lib/assets/javascripts/websocket_rails/abstract_connection.js.coffee +45 -0
  6. data/lib/assets/javascripts/websocket_rails/channel.js.coffee +34 -17
  7. data/lib/assets/javascripts/websocket_rails/event.js.coffee +13 -11
  8. data/lib/assets/javascripts/websocket_rails/http_connection.js.coffee +44 -45
  9. data/lib/assets/javascripts/websocket_rails/main.js +1 -0
  10. data/lib/assets/javascripts/websocket_rails/websocket_connection.js.coffee +20 -34
  11. data/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee +60 -15
  12. data/lib/generators/websocket_rails/install/templates/websocket_rails.rb +15 -0
  13. data/lib/rails/config/routes.rb +1 -1
  14. data/lib/rails/tasks/websocket_rails.tasks +6 -2
  15. data/lib/websocket_rails/channel.rb +28 -2
  16. data/lib/websocket_rails/channel_manager.rb +16 -0
  17. data/lib/websocket_rails/configuration.rb +26 -1
  18. data/lib/websocket_rails/connection_adapters/http.rb +7 -0
  19. data/lib/websocket_rails/connection_adapters/web_socket.rb +3 -1
  20. data/lib/websocket_rails/connection_manager.rb +1 -1
  21. data/lib/websocket_rails/controller_factory.rb +1 -1
  22. data/lib/websocket_rails/event.rb +9 -2
  23. data/lib/websocket_rails/logging.rb +0 -1
  24. data/lib/websocket_rails/synchronization.rb +11 -7
  25. data/lib/websocket_rails/version.rb +1 -1
  26. data/spec/javascripts/generated/assets/abstract_connection.js +71 -0
  27. data/spec/javascripts/generated/assets/channel.js +58 -34
  28. data/spec/javascripts/generated/assets/event.js +12 -16
  29. data/spec/javascripts/generated/assets/http_connection.js +67 -65
  30. data/spec/javascripts/generated/assets/websocket_connection.js +36 -51
  31. data/spec/javascripts/generated/assets/websocket_rails.js +68 -21
  32. data/spec/javascripts/generated/specs/channel_spec.js +102 -19
  33. data/spec/javascripts/generated/specs/helpers.js +17 -0
  34. data/spec/javascripts/generated/specs/websocket_connection_spec.js +72 -19
  35. data/spec/javascripts/generated/specs/websocket_rails_spec.js +146 -47
  36. data/spec/javascripts/support/jasmine.yml +10 -2
  37. data/spec/javascripts/support/jasmine_helper.rb +38 -0
  38. data/spec/javascripts/websocket_rails/channel_spec.coffee +66 -12
  39. data/spec/javascripts/websocket_rails/event_spec.coffee +7 -7
  40. data/spec/javascripts/websocket_rails/helpers.coffee +6 -0
  41. data/spec/javascripts/websocket_rails/websocket_connection_spec.coffee +53 -15
  42. data/spec/javascripts/websocket_rails/websocket_rails_spec.coffee +108 -25
  43. data/spec/unit/base_controller_spec.rb +41 -0
  44. data/spec/unit/channel_manager_spec.rb +21 -0
  45. data/spec/unit/channel_spec.rb +43 -3
  46. data/spec/unit/connection_adapters/http_spec.rb +24 -3
  47. data/spec/unit/connection_adapters_spec.rb +2 -2
  48. data/spec/unit/connection_manager_spec.rb +1 -1
  49. data/spec/unit/event_spec.rb +25 -1
  50. data/spec/unit/logging_spec.rb +1 -1
  51. metadata +57 -67
  52. data/spec/javascripts/support/jasmine_config.rb +0 -63
@@ -1,20 +1,64 @@
1
1
  describe 'WebSocketRails.Channel:', ->
2
2
  beforeEach ->
3
- @dispatcher =
3
+ @dispatcher = new class WebSocketRailsStub
4
4
  new_message: -> true
5
5
  dispatch: -> true
6
6
  trigger_event: (event) -> true
7
7
  state: 'connected'
8
- connection_id: 12345
9
- @channel = new WebSocketRails.Channel('public',@dispatcher)
8
+ _conn:
9
+ connection_id: 12345
10
+ @channel = new WebSocketRails.Channel('public', @dispatcher)
10
11
  sinon.spy @dispatcher, 'trigger_event'
11
12
 
12
13
  afterEach ->
13
14
  @dispatcher.trigger_event.restore()
14
15
 
16
+ describe '.bind', ->
17
+ it 'should add a function to the callbacks collection', ->
18
+ test_func = ->
19
+ @channel.bind 'event_name', test_func
20
+ expect(@channel._callbacks['event_name'].length).toBe 1
21
+ expect(@channel._callbacks['event_name']).toContain test_func
22
+
23
+ describe '.trigger', ->
24
+ describe 'before the channel token is set', ->
25
+ it 'queues the events', ->
26
+ @channel.trigger 'someEvent', 'someData'
27
+ queue = @channel._queue
28
+ expect(queue[0].name).toEqual 'someEvent'
29
+ expect(queue[0].data).toEqual 'someData'
30
+
31
+ describe 'when channel token is set', ->
32
+ it 'adds token to event metadata and dispatches event', ->
33
+ @channel._token = 'valid token'
34
+ @channel.trigger 'someEvent', 'someData'
35
+ expect(@dispatcher.trigger_event.calledWith(['someEvent',{token: 'valid token', data: 'someData'}]))
36
+
37
+ describe '.destroy', ->
38
+ it 'should destroy all callbacks', ->
39
+ event_callback = -> true
40
+ @channel.bind('new_message', @event_callback)
41
+
42
+ @channel.destroy()
43
+
44
+ expect(@channel._callbacks).toEqual {}
45
+
46
+ describe 'when this channel\'s connection is still active', ->
47
+ it 'should send unsubscribe event', ->
48
+ @channel.destroy()
49
+ expect(@dispatcher.trigger_event.args[0][0].name).toEqual 'websocket_rails.unsubscribe'
50
+
51
+ describe 'when this channel\'s connection is no more active', ->
52
+ beforeEach ->
53
+ @dispatcher._conn.connection_id++
54
+
55
+ it 'should not send unsubscribe event', ->
56
+ @channel.destroy()
57
+ expect(@dispatcher.trigger_event.notCalled).toEqual true
58
+
15
59
  describe 'public channels', ->
16
60
  beforeEach ->
17
- @channel = new WebSocketRails.Channel('forchan',@dispatcher,false)
61
+ @channel = new WebSocketRails.Channel('forchan', @dispatcher, false)
18
62
  @event = @dispatcher.trigger_event.lastCall.args[0]
19
63
 
20
64
  it 'should trigger an event containing the channel name', ->
@@ -30,22 +74,32 @@ describe 'WebSocketRails.Channel:', ->
30
74
  it 'should be public', ->
31
75
  expect(@channel.is_private).toBeFalsy
32
76
 
33
- describe '.bind', ->
34
- it 'should add a function to the callbacks collection', ->
35
- test_func = ->
36
- @channel.bind 'event_name', test_func
37
- expect(@channel._callbacks['event_name'].length).toBe 1
38
- expect(@channel._callbacks['event_name']).toContain test_func
77
+ describe 'channel tokens', ->
78
+ it 'should set token when event_name is websocket_rails.channel_token', ->
79
+ @channel.dispatch('websocket_rails.channel_token', {token: 'abc123'})
80
+ expect(@channel._token).toEqual 'abc123'
81
+
82
+ it "should refresh channel's connection_id after channel_token has been received", ->
83
+ # this is needed in case we would init the channel connection
84
+ # just before the connection has been established
85
+ @channel.connection_id = null
86
+ @channel.dispatch('websocket_rails.channel_token', {token: 'abc123'})
87
+ expect(@channel.connection_id).toEqual @dispatcher._conn.connection_id
88
+
89
+ it 'should flush the event queue after setting token', ->
90
+ @channel.trigger 'someEvent', 'someData'
91
+ @channel.dispatch('websocket_rails.channel_token', {token: 'abc123'})
92
+ expect(@channel._queue.length).toEqual(0)
39
93
 
40
94
  describe 'private channels', ->
41
95
  beforeEach ->
42
- @channel = new WebSocketRails.Channel('forchan',@dispatcher,true)
96
+ @channel = new WebSocketRails.Channel('forchan', @dispatcher, true)
43
97
  @event = @dispatcher.trigger_event.lastCall.args[0]
44
98
 
45
99
  it 'should trigger a subscribe_private event when created', ->
46
100
  expect(@event.name).toEqual 'websocket_rails.subscribe_private'
47
101
 
48
102
  it 'should be private', ->
49
- expect(@channel.is_private).toBe true
103
+ expect(@channel.is_private).toBeTruthy
50
104
 
51
105
 
@@ -2,7 +2,7 @@ describe 'WebSocketRails.Event', ->
2
2
 
3
3
  describe 'standard events', ->
4
4
  beforeEach ->
5
- @data = ['event',{data: { message: 'test'} },12345]
5
+ @data = ['event', {data: { message: 'test'} }, 12345]
6
6
  @event = new WebSocketRails.Event(@data)
7
7
 
8
8
  it 'should generate an ID', ->
@@ -51,19 +51,19 @@ describe 'WebSocketRails.Event', ->
51
51
  data
52
52
  failure_func = (data) ->
53
53
  data
54
- @data = ['event',{data: { message: 'test'} },12345]
55
- @event = new WebSocketRails.Event(@data,success_func,failure_func)
54
+ @data = ['event', {data: { message: 'test'} }, 12345]
55
+ @event = new WebSocketRails.Event(@data, success_func, failure_func)
56
56
 
57
57
  describe 'when successful', ->
58
58
  it 'should run the success callback when passed true', ->
59
- expect(@event.run_callbacks(true,'success')).toEqual 'success'
59
+ expect(@event.run_callbacks(true, 'success')).toEqual 'success'
60
60
 
61
61
  it 'should not run the failure callback', ->
62
- expect(@event.run_callbacks(true,'success')).toBeUndefined
62
+ expect(@event.run_callbacks(true, 'success')).toBeUndefined
63
63
 
64
64
  describe 'when failure', ->
65
65
  it 'should run the failure callback when passed true', ->
66
- expect(@event.run_callbacks(false,'failure')).toEqual 'failure'
66
+ expect(@event.run_callbacks(false, 'failure')).toEqual 'failure'
67
67
 
68
68
  it 'should not run the failure callback', ->
69
- expect(@event.run_callbacks(false,'failure')).toBeUndefined
69
+ expect(@event.run_callbacks(false, 'failure')).toBeUndefined
@@ -0,0 +1,6 @@
1
+ window.helpers =
2
+ startConnection: (dispatcher, connection_id = 1) ->
3
+ message =
4
+ data:
5
+ connection_id: connection_id
6
+ dispatcher.new_message [['client_connected', message]]
@@ -1,23 +1,34 @@
1
1
  describe 'WebsocketRails.WebSocketConnection:', ->
2
+ SAMPLE_EVENT_DATA = ['event','message']
3
+ SAMPLE_EVENT =
4
+ data: JSON.stringify(SAMPLE_EVENT_DATA)
5
+
2
6
  beforeEach ->
3
- dispatcher =
7
+ @dispatcher =
4
8
  new_message: -> true
5
9
  dispatch: -> true
6
10
  state: 'connected'
7
11
  # Have to stub the WebSocket object due to Firefox error during jasmine:ci
8
- window.WebSocket = (url) ->
9
- @url = url
10
- @send = -> true
11
- @dispatcher = dispatcher
12
- @connection = new WebSocketRails.WebSocketConnection('localhost:3000/websocket', dispatcher)
12
+ window.WebSocket = class WebSocketStub
13
+ constructor: (@url, @dispatcher) ->
14
+ send: -> true
15
+ close: -> @onclose(null)
16
+ @connection = new WebSocketRails.WebSocketConnection('localhost:3000/websocket', @dispatcher)
17
+ @dispatcher._conn = @connection
13
18
 
14
19
  describe 'constructor', ->
15
20
 
16
- it 'should set the onmessage event on the WebSocket object to this.on_message', ->
17
- expect(@connection._conn.onmessage).toEqual @connection.on_message
21
+ it 'should redirect onmessage events\' data from the WebSocket object to this.on_message', ->
22
+ mock_connection = sinon.mock @connection
23
+ mock_connection.expects('on_message').once().withArgs SAMPLE_EVENT_DATA
24
+ @connection._conn.onmessage(SAMPLE_EVENT)
25
+ mock_connection.verify()
18
26
 
19
- it 'should set the onclose event on the WebSocket object to this.on_close', ->
20
- expect(@connection._conn.onclose).toEqual @connection.on_close
27
+ it 'should redirect onclose events from the WebSocket object to this.on_close', ->
28
+ mock_connection = sinon.mock @connection
29
+ mock_connection.expects('on_close').once().withArgs SAMPLE_EVENT
30
+ @connection._conn.onclose(SAMPLE_EVENT)
31
+ mock_connection.verify()
21
32
 
22
33
  describe 'with ssl', ->
23
34
  it 'should not add the ws:// prefix to the URL', ->
@@ -28,6 +39,11 @@ describe 'WebsocketRails.WebSocketConnection:', ->
28
39
  it 'should add the ws:// prefix to the URL', ->
29
40
  expect(@connection.url).toEqual 'ws://localhost:3000/websocket'
30
41
 
42
+ describe '.close', ->
43
+ it 'should close the connection', ->
44
+ @connection.close()
45
+ expect(@dispatcher.state).toEqual 'disconnected'
46
+
31
47
  describe '.trigger', ->
32
48
 
33
49
  describe 'before the connection has been fully established', ->
@@ -51,14 +67,13 @@ describe 'WebsocketRails.WebSocketConnection:', ->
51
67
  describe '.on_message', ->
52
68
 
53
69
  it 'should decode the message and pass it to the dispatcher', ->
54
- encoded_data = JSON.stringify ['event','message']
55
- event =
56
- data: encoded_data
57
70
  mock_dispatcher = sinon.mock @connection.dispatcher
58
- mock_dispatcher.expects('new_message').once().withArgs JSON.parse encoded_data
59
- @connection.on_message event
71
+ mock_dispatcher.expects('new_message').once().withArgs SAMPLE_EVENT_DATA
72
+ @connection.on_message SAMPLE_EVENT_DATA
60
73
  mock_dispatcher.verify()
61
74
 
75
+
76
+
62
77
  describe '.on_close', ->
63
78
  it 'should dispatch the connection_closed event and pass the original event', ->
64
79
  event = new WebSocketRails.Event ['event','message']
@@ -100,6 +115,29 @@ describe 'WebsocketRails.WebSocketConnection:', ->
100
115
 
101
116
  expect(@dispatcher.state).toEqual('disconnected')
102
117
 
118
+ describe "it's no longer active connection", ->
119
+ beforeEach ->
120
+ @new_connection = new WebSocketRails.WebSocketConnection('localhost:3000/websocket', @dispatcher)
121
+ @dispatcher._conn = @new_connection
122
+
123
+ it ".on_error should not react to the event response", ->
124
+ mock_dispatcher = sinon.mock @connection.dispatcher
125
+ mock_dispatcher.expects('dispatch').never()
126
+ @connection.on_error SAMPLE_EVENT_DATA
127
+ mock_dispatcher.verify()
128
+
129
+ it ".on_close should not react to the event response", ->
130
+ mock_dispatcher = sinon.mock @connection.dispatcher
131
+ mock_dispatcher.expects('dispatch').never()
132
+ @connection.on_close SAMPLE_EVENT_DATA
133
+ mock_dispatcher.verify()
134
+
135
+ it ".on_message should not react to the event response", ->
136
+ mock_dispatcher = sinon.mock @connection.dispatcher
137
+ mock_dispatcher.expects('new_message').never()
138
+ @connection.on_message SAMPLE_EVENT_DATA
139
+ mock_dispatcher.verify()
140
+
103
141
  describe '.flush_queue', ->
104
142
  beforeEach ->
105
143
  @event = new WebSocketRails.Event ['event','message']
@@ -1,15 +1,17 @@
1
1
  describe 'WebSocketRails:', ->
2
2
  beforeEach ->
3
3
  @url = 'localhost:3000/websocket'
4
- WebSocketRails.WebSocketConnection = ->
4
+ WebSocketRails.WebSocketConnection = class WebSocketConnectionStub extends WebSocketRails.AbstractConnection
5
5
  connection_type: 'websocket'
6
- flush_queue: -> true
7
- WebSocketRails.HttpConnection = ->
6
+ WebSocketRails.HttpConnection = class HttpConnectionStub extends WebSocketRails.AbstractConnection
8
7
  connection_type: 'http'
9
- flush_queue: -> true
10
8
  @dispatcher = new WebSocketRails @url
11
9
 
12
10
  describe 'constructor', ->
11
+ it 'should start connection automatically', ->
12
+ expect(@dispatcher.state).toEqual 'connecting'
13
+
14
+ describe '.connect', ->
13
15
 
14
16
  it 'should set the new_message method on connection to this.new_message', ->
15
17
  expect(@dispatcher._conn.new_message).toEqual @dispatcher.new_message
@@ -22,7 +24,7 @@ describe 'WebSocketRails:', ->
22
24
  dispatcher = new WebSocketRails @url, true
23
25
  expect(dispatcher._conn.connection_type).toEqual 'websocket'
24
26
 
25
- describe 'when use_webosckets is false', ->
27
+ describe 'when use_websockets is false', ->
26
28
  it 'should use the Http Connection', ->
27
29
  dispatcher = new WebSocketRails @url, false
28
30
  expect(dispatcher._conn.connection_type).toEqual 'http'
@@ -33,39 +35,110 @@ describe 'WebSocketRails:', ->
33
35
  dispatcher = new WebSocketRails @url, true
34
36
  expect(dispatcher._conn.connection_type).toEqual 'http'
35
37
 
38
+ describe '.disconnect', ->
39
+ beforeEach ->
40
+ @dispatcher.disconnect()
41
+
42
+ it 'should close the connection', ->
43
+ expect(@dispatcher.state).toEqual 'disconnected'
44
+
45
+ it 'existing connection should be destroyed', ->
46
+ expect(@dispatcher._conn).toBeUndefined()
47
+
48
+ describe '.reconnect', ->
49
+ OLD_CONNECTION_ID = 1
50
+ NEW_CONNECTION_ID = 2
51
+
52
+ it 'should connect, when disconnected', ->
53
+ mock_dispatcher = sinon.mock @dispatcher
54
+ mock_dispatcher.expects('connect').once()
55
+ @dispatcher.disconnect()
56
+ @dispatcher.reconnect()
57
+ mock_dispatcher.verify()
58
+
59
+ it 'should recreate the connection', ->
60
+ helpers.startConnection(@dispatcher, OLD_CONNECTION_ID)
61
+ @dispatcher.reconnect()
62
+ helpers.startConnection(@dispatcher, NEW_CONNECTION_ID)
63
+
64
+ expect(@dispatcher._conn.connection_id).toEqual NEW_CONNECTION_ID
65
+
66
+ it 'should resend all uncompleted events', ->
67
+ event = @dispatcher.trigger('create_post')
68
+
69
+ helpers.startConnection(@dispatcher, OLD_CONNECTION_ID)
70
+ @dispatcher.reconnect()
71
+ helpers.startConnection(@dispatcher, NEW_CONNECTION_ID)
72
+
73
+ expect(@dispatcher.queue[event.id].connection_id).toEqual NEW_CONNECTION_ID
74
+
75
+ it 'should not resend completed events', ->
76
+ event = @dispatcher.trigger('create_post')
77
+ event.run_callbacks(true, {})
78
+
79
+ helpers.startConnection(@dispatcher, OLD_CONNECTION_ID)
80
+ @dispatcher.reconnect()
81
+ helpers.startConnection(@dispatcher, NEW_CONNECTION_ID)
82
+
83
+ expect(@dispatcher.queue[event.id].connection_id).toEqual OLD_CONNECTION_ID
84
+
85
+ it 'should reconnect to all channels', ->
86
+ mock_dispatcher = sinon.mock @dispatcher
87
+ mock_dispatcher.expects('reconnect_channels').once()
88
+ @dispatcher.reconnect()
89
+ mock_dispatcher.verify()
90
+
91
+ describe '.reconnect_channels', ->
92
+ beforeEach ->
93
+ @channel_callback = -> true
94
+ helpers.startConnection(@dispatcher, 1)
95
+ @dispatcher.subscribe('public 4chan')
96
+ @dispatcher.subscribe_private('private 4chan')
97
+ @dispatcher.channels['public 4chan'].bind('new_post', @channel_callback)
98
+
99
+ it 'should recreate existing channels, keeping their private/public type', ->
100
+ @dispatcher.reconnect_channels()
101
+ expect(@dispatcher.channels['public 4chan'].is_private).toEqual false
102
+ expect(@dispatcher.channels['private 4chan'].is_private).toEqual true
103
+
104
+ it 'should move all existing callbacks from old channel objects to new ones', ->
105
+ old_public_channel = @dispatcher.channels['public 4chan']
106
+
107
+ @dispatcher.reconnect_channels()
108
+
109
+ expect(old_public_channel._callbacks).toEqual {}
110
+ expect(@dispatcher.channels['public 4chan']._callbacks).toEqual {new_post: [@channel_callback]}
111
+
36
112
  describe '.new_message', ->
37
113
 
38
114
  describe 'when this.state is "connecting"', ->
39
115
  beforeEach ->
40
- @message =
41
- data:
42
- connection_id: 123
43
- @data = [['client_connected', @message]]
116
+ @connection_id = 123
44
117
 
45
118
  it 'should call this.connection_established on the "client_connected" event', ->
46
119
  mock_dispatcher = sinon.mock @dispatcher
47
- mock_dispatcher.expects('connection_established').once().withArgs @message.data
48
- @dispatcher.new_message @data
120
+ mock_dispatcher.expects('connection_established').once().withArgs(connection_id: @connection_id)
121
+ helpers.startConnection(@dispatcher, @connection_id)
49
122
  mock_dispatcher.verify()
50
123
 
51
124
  it 'should set the state to connected', ->
52
- @dispatcher.new_message @data
125
+ helpers.startConnection(@dispatcher, @connection_id)
53
126
  expect(@dispatcher.state).toEqual 'connected'
54
127
 
55
128
  it 'should flush any messages queued before the connection was established', ->
56
129
  mock_con = sinon.mock @dispatcher._conn
57
130
  mock_con.expects('flush_queue').once()
58
- @dispatcher.new_message @data
131
+ helpers.startConnection(@dispatcher, @connection_id)
59
132
  mock_con.verify()
60
133
 
61
134
  it 'should set the correct connection_id', ->
62
- @dispatcher.new_message @data
63
- expect(@dispatcher.connection_id).toEqual 123
135
+ helpers.startConnection(@dispatcher, @connection_id)
136
+ expect(@dispatcher._conn.connection_id).toEqual 123
64
137
 
65
138
  it 'should call the user defined on_open callback', ->
66
139
  spy = sinon.spy()
67
140
  @dispatcher.on_open = spy
68
- @dispatcher.new_message @data
141
+ helpers.startConnection(@dispatcher, @connection_id)
69
142
  expect(spy.calledOnce).toEqual true
70
143
 
71
144
  describe 'after the connection has been established', ->
@@ -96,12 +169,17 @@ describe 'WebSocketRails:', ->
96
169
  @event = { run_callbacks: (data) -> }
97
170
  @event_mock = sinon.mock @event
98
171
  @dispatcher.queue[1] = @event
172
+ @event_data = [['event',@attributes]]
99
173
 
100
174
  it 'should run callbacks for result events', ->
101
- data = [['event',@attributes]]
102
- @event_mock.expects('run_callbacks').once()
103
- @dispatcher.new_message data
104
- @event_mock.verify()
175
+ @event_mock.expects('run_callbacks').once()
176
+ @dispatcher.new_message @event_data
177
+ @event_mock.verify()
178
+
179
+ it 'should remove the event from the queue', ->
180
+ @dispatcher.new_message @event_data
181
+ expect(@dispatcher.queue[1]).toBeUndefined()
182
+
105
183
 
106
184
  describe '.bind', ->
107
185
 
@@ -121,18 +199,23 @@ describe 'WebSocketRails:', ->
121
199
 
122
200
  describe 'triggering events with', ->
123
201
  beforeEach ->
124
- @dispatcher.connection_id = 123
125
202
  @dispatcher._conn =
203
+ connection_id: 123
126
204
  trigger: ->
127
- trigger_channel: ->
128
205
 
129
206
  describe '.trigger', ->
207
+ it 'should add the event to the queue', ->
208
+ event = @dispatcher.trigger 'event', 'message'
209
+ expect(@dispatcher.queue[event.id]).toEqual event
130
210
 
131
211
  it 'should delegate to the connection object', ->
132
- con_trigger = sinon.spy @dispatcher._conn, 'trigger'
212
+ conn_trigger = sinon.spy @dispatcher._conn, 'trigger'
213
+ @dispatcher.trigger 'event', 'message'
214
+ expect(conn_trigger.called).toEqual true
215
+
216
+ it "should not delegate to the connection object, if it's not available", ->
217
+ @dispatcher._conn = null
133
218
  @dispatcher.trigger 'event', 'message'
134
- event = new WebSocketRails.Event ['websocket_rails.subscribe', {channel: 'awesome'}, 123]
135
- expect(con_trigger.called).toEqual true
136
219
 
137
220
  describe '.connection_stale', ->
138
221
  describe 'when state is connected', ->