websocket-rails 0.2.1 → 0.3.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.
- data/CHANGELOG.md +10 -0
- data/README.md +20 -0
- data/lib/spec_helpers/matchers/route_matchers.rb +64 -0
- data/lib/spec_helpers/matchers/trigger_matchers.rb +113 -0
- data/lib/spec_helpers/spec_helper_event.rb +30 -0
- data/lib/websocket-rails.rb +1 -1
- data/lib/websocket_rails/event.rb +10 -8
- data/lib/websocket_rails/event_map.rb +43 -2
- data/lib/websocket_rails/spec_helpers.rb +3 -0
- data/lib/websocket_rails/version.rb +1 -1
- data/spec/dummy/log/test.log +1 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helpers/matchers/route_matchers_spec.rb +118 -0
- data/spec/spec_helpers/matchers/trigger_matchers_spec.rb +257 -0
- data/spec/spec_helpers/spec_helper_event_spec.rb +66 -0
- data/spec/unit/event_map_spec.rb +43 -9
- data/spec/unit/target_validator_spec.rb +88 -0
- metadata +29 -5
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# WebsocketRails Change Log
|
|
2
2
|
|
|
3
|
+
## Version 0.3.0
|
|
4
|
+
|
|
5
|
+
* Extend the event router DSL to accept routes similar to the routes.rb
|
|
6
|
+
shorthand `controller#action`. - Thanks to @nessche.
|
|
7
|
+
* Add a custom RSpec matcher suite for verifying event routes
|
|
8
|
+
and easily asserting that WebsocketRails controller actions are
|
|
9
|
+
triggering events correctly. - Also thanks to @nessche.
|
|
10
|
+
* Fix fiber yielded across threads bug when running in standalone mode
|
|
11
|
+
by disabling Thin threaded mode as default option.
|
|
12
|
+
|
|
3
13
|
## Version 0.2.1
|
|
4
14
|
|
|
5
15
|
* Fix default redis driver issue that was causing problems when using
|
data/README.md
CHANGED
|
@@ -46,7 +46,18 @@ Map events to controller actions using an Event Router.
|
|
|
46
46
|
````ruby
|
|
47
47
|
WebsocketRails::EventMap.describe do
|
|
48
48
|
namespace :tasks do
|
|
49
|
+
|
|
50
|
+
# using a Hash to specify the target
|
|
49
51
|
subscribe :create, :to => TaskController, :with_method => :create
|
|
52
|
+
|
|
53
|
+
# using the same syntax as routes.rb
|
|
54
|
+
subscribe :update, 'task#update'
|
|
55
|
+
|
|
56
|
+
# if your controller is not a top-level object
|
|
57
|
+
subscribe :create_admin, :to => Admin::TaskController, :with_method => :create
|
|
58
|
+
|
|
59
|
+
subscribe :update_admin, 'admin/task#update'
|
|
60
|
+
|
|
50
61
|
end
|
|
51
62
|
end
|
|
52
63
|
````
|
|
@@ -192,6 +203,15 @@ Read the [Private Channel Wiki](https://github.com/DanKnox/websocket-rails/wiki/
|
|
|
192
203
|
private channels from the JavaScript client and handling the
|
|
193
204
|
authorization in your controller.
|
|
194
205
|
|
|
206
|
+
## Credit where credit is due.
|
|
207
|
+
|
|
208
|
+
Big thanks to our
|
|
209
|
+
[contributors](https://github.com/DanKnox/websocket-rails/graphs/contributors)
|
|
210
|
+
who have helped keep this project moving.
|
|
211
|
+
|
|
212
|
+
Special thanks to [@nessche](https://github.com/nessche) who provided the improved routing DSL and
|
|
213
|
+
RSpec matcher suite.
|
|
214
|
+
|
|
195
215
|
## Development
|
|
196
216
|
|
|
197
217
|
This gem is created and maintained by Dan Knox and Kyle Whalen under the MIT License.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module WebsocketRails
|
|
2
|
+
|
|
3
|
+
module SpecHelpers
|
|
4
|
+
|
|
5
|
+
def self.verify_route(event, target, non_exclusive)
|
|
6
|
+
|
|
7
|
+
raise ArgumentError, 'event must be of type SpecHelperEvent' unless event.is_a? WebsocketRails::SpecHelperEvent
|
|
8
|
+
target_class, target_method = WebsocketRails::TargetValidator.validate_target target
|
|
9
|
+
|
|
10
|
+
result = false
|
|
11
|
+
no_of_routes = 0
|
|
12
|
+
event.dispatcher.event_map.routes_for event do |controller, method|
|
|
13
|
+
no_of_routes += 1
|
|
14
|
+
if controller.class == target_class and method == target_method
|
|
15
|
+
result = true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
result and (non_exclusive or no_of_routes == 1)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
RSpec::Matchers.define :be_routed_to do |target|
|
|
27
|
+
|
|
28
|
+
match do |event|
|
|
29
|
+
WebsocketRails::SpecHelpers.verify_route event, target, true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
failure_message_for_should do |event|
|
|
33
|
+
"expected event #{event.name} to be routed to target #{target}"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
failure_message_for_should_not do |event|
|
|
37
|
+
"expected event #{event.name} not to be routed to target #{target}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
description do
|
|
41
|
+
"be routed to target #{target}"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
RSpec::Matchers.define :be_routed_only_to do |target|
|
|
47
|
+
|
|
48
|
+
match do |event|
|
|
49
|
+
WebsocketRails::SpecHelpers.verify_route event, target, false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
failure_message_for_should do |event|
|
|
53
|
+
"expected event #{event.name} to be routed only to target #{target}"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
failure_message_for_should_not do |event|
|
|
57
|
+
"expected event #{event.name} not to be routed only to target #{target}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
description do
|
|
61
|
+
"be routed only to target #{target}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
module WebsocketRails
|
|
2
|
+
|
|
3
|
+
module SpecHelpers
|
|
4
|
+
|
|
5
|
+
def self.compare_trigger_data(event, data)
|
|
6
|
+
return true if data.nil?
|
|
7
|
+
return true if data == :any and event.data
|
|
8
|
+
return true if data == :nil and event.data.nil?
|
|
9
|
+
data.eql? event.data
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.expected_data_for_spec_message(data)
|
|
13
|
+
case data
|
|
14
|
+
when nil
|
|
15
|
+
''
|
|
16
|
+
when :nil
|
|
17
|
+
' with no data'
|
|
18
|
+
when :any
|
|
19
|
+
' with some data'
|
|
20
|
+
else
|
|
21
|
+
" with data #{data}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.actual_data_for_spec_message(data)
|
|
26
|
+
data ? "with data #{data}": 'with no data'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.actual_for_spec_message(event, success)
|
|
30
|
+
if event.triggered?
|
|
31
|
+
if success.nil?
|
|
32
|
+
"triggered message #{actual_data_for_spec_message(event.data)}"
|
|
33
|
+
else
|
|
34
|
+
"triggered #{event.success ? 'a success' : 'a failure' } message #{actual_data_for_spec_message(event.data)}"
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
'did not trigger any message'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.verify_trigger(event, data, success)
|
|
42
|
+
return false unless event.triggered?
|
|
43
|
+
return false unless compare_trigger_data(event, data)
|
|
44
|
+
success.nil? || success == event.success
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
RSpec::Matchers.define :trigger_message do |data|
|
|
53
|
+
|
|
54
|
+
match do |event|
|
|
55
|
+
WebsocketRails::SpecHelpers.verify_trigger event, data, nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
failure_message_for_should do |event|
|
|
59
|
+
"expected #{event.encoded_name} to trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, " +
|
|
60
|
+
"instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, nil}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
failure_message_for_should_not do |event|
|
|
64
|
+
"expected #{event.encoded_name} not to trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
description do
|
|
68
|
+
"trigger message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
RSpec::Matchers.define :trigger_success_message do |data|
|
|
74
|
+
|
|
75
|
+
match do |event|
|
|
76
|
+
WebsocketRails::SpecHelpers.verify_trigger event, data, true
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
failure_message_for_should do |event|
|
|
80
|
+
"expected #{event.encoded_name} to trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, "+
|
|
81
|
+
"instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, true}"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
failure_message_for_should_not do |event|
|
|
85
|
+
"expected #{event.encoded_name} not to trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
description do
|
|
89
|
+
"trigger success message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
RSpec::Matchers.define :trigger_failure_message do |data|
|
|
95
|
+
|
|
96
|
+
match do |event|
|
|
97
|
+
WebsocketRails::SpecHelpers.verify_trigger event, data, false
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
failure_message_for_should do |event|
|
|
101
|
+
"expected #{event.encoded_name} to trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}, " +
|
|
102
|
+
"instead it #{WebsocketRails::SpecHelpers.actual_for_spec_message event, true}"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
failure_message_for_should_not do |event|
|
|
106
|
+
"expected #{event.encoded_name} not to trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
description do
|
|
110
|
+
"trigger failure message#{WebsocketRails::SpecHelpers.expected_data_for_spec_message data}"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module WebsocketRails
|
|
2
|
+
|
|
3
|
+
class SpecHelperEvent < Event
|
|
4
|
+
|
|
5
|
+
attr_reader :dispatcher, :triggered
|
|
6
|
+
|
|
7
|
+
alias :triggered? :triggered
|
|
8
|
+
|
|
9
|
+
def initialize(event_name,options={})
|
|
10
|
+
super(event_name, options)
|
|
11
|
+
@triggered = false
|
|
12
|
+
@dispatcher = Dispatcher.new(nil)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def trigger
|
|
16
|
+
@triggered = true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def dispatch
|
|
20
|
+
@dispatcher.dispatch(self)
|
|
21
|
+
self
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def create_event(name, data)
|
|
29
|
+
WebsocketRails::SpecHelperEvent.new(name, {data: data})
|
|
30
|
+
end
|
data/lib/websocket-rails.rb
CHANGED
|
@@ -73,7 +73,7 @@ module WebsocketRails
|
|
|
73
73
|
:log => "#{Rails.root}/log/websocket_rails.log",
|
|
74
74
|
:tag => 'websocket_rails',
|
|
75
75
|
:rackup => "#{Rails.root}/config.ru",
|
|
76
|
-
:threaded =>
|
|
76
|
+
:threaded => false,
|
|
77
77
|
:daemonize => true,
|
|
78
78
|
:dirname => Rails.root,
|
|
79
79
|
:max_persistent_conns => 1024,
|
|
@@ -119,14 +119,6 @@ module WebsocketRails
|
|
|
119
119
|
connection.trigger self if connection
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
private
|
|
123
|
-
|
|
124
|
-
def validate_namespace(namespace)
|
|
125
|
-
namespace = [namespace] unless namespace.is_a?(Array)
|
|
126
|
-
namespace.unshift :global unless namespace.first == :global
|
|
127
|
-
namespace.map(&:to_sym) rescue [:global]
|
|
128
|
-
end
|
|
129
|
-
|
|
130
122
|
def encoded_name
|
|
131
123
|
if namespace.size > 1
|
|
132
124
|
child_namespace = namespace.dup[1..-1]
|
|
@@ -138,5 +130,15 @@ module WebsocketRails
|
|
|
138
130
|
combined_name
|
|
139
131
|
end
|
|
140
132
|
|
|
133
|
+
private
|
|
134
|
+
|
|
135
|
+
def validate_namespace(namespace)
|
|
136
|
+
namespace = [namespace] unless namespace.is_a?(Array)
|
|
137
|
+
namespace.unshift :global unless namespace.first == :global
|
|
138
|
+
namespace.map(&:to_sym) rescue [:global]
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
141
143
|
end
|
|
142
144
|
end
|
|
@@ -99,12 +99,13 @@ module WebsocketRails
|
|
|
99
99
|
# Stores controller/action pairs for events subscribed under
|
|
100
100
|
# this namespace.
|
|
101
101
|
def store(event_name,options)
|
|
102
|
-
klass
|
|
103
|
-
action = options[:with_method] || raise("Must specify a method for with_method: option in event route")
|
|
102
|
+
klass, action = TargetValidator.validate_target options
|
|
104
103
|
create_controller_instance_for klass if controllers[klass].nil?
|
|
105
104
|
actions[event_name] << [klass,action]
|
|
106
105
|
end
|
|
107
106
|
|
|
107
|
+
|
|
108
|
+
|
|
108
109
|
# Reloads the controller instances stored in the event map
|
|
109
110
|
# collection, picking up code changes in development.
|
|
110
111
|
def reload_controllers!
|
|
@@ -175,4 +176,44 @@ module WebsocketRails
|
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
end
|
|
179
|
+
|
|
180
|
+
class TargetValidator
|
|
181
|
+
|
|
182
|
+
# Parses the target and extracts controller/action pair or raises an error if target is invalid
|
|
183
|
+
def self.validate_target(target)
|
|
184
|
+
case target
|
|
185
|
+
when Hash
|
|
186
|
+
validate_hash_target target
|
|
187
|
+
when String
|
|
188
|
+
validate_string_target target
|
|
189
|
+
else
|
|
190
|
+
raise('Must specify the event target either as a string product#new_product or as a Hash to: ProductController, with_method: :new_product')
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
private
|
|
195
|
+
|
|
196
|
+
# Parses the target as a Hash, expecting keys to: and with_method:
|
|
197
|
+
def self.validate_hash_target(target)
|
|
198
|
+
klass = target[:to] || raise("Must specify a class for to: option in event route")
|
|
199
|
+
action = target[:with_method] || raise("Must specify a method for with_method: option in event route")
|
|
200
|
+
[klass, action]
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Parses the target as a String, expecting it to be in the format "product#new_product"
|
|
204
|
+
def self.validate_string_target(target)
|
|
205
|
+
strings = target.split('#')
|
|
206
|
+
raise('The string must be in a format like product#new_product') unless strings.count == 2
|
|
207
|
+
klass = constantize_controller strings[0]
|
|
208
|
+
action = strings[1].to_sym
|
|
209
|
+
[klass, action]
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def self.constantize_controller(controller_string)
|
|
213
|
+
strings = (controller_string << '_controller').split('/')
|
|
214
|
+
strings.map{|string| string.camelize}.join('::').constantize
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|
|
218
|
+
|
|
178
219
|
end
|
data/spec/dummy/log/test.log
CHANGED
data/spec/spec_helper.rb
CHANGED
|
@@ -14,6 +14,8 @@ require 'websocket-rails'
|
|
|
14
14
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
|
15
15
|
# in spec/support/ and its subdirectories.
|
|
16
16
|
Dir["./spec/support/**/*.rb"].each {|f| require f}
|
|
17
|
+
require 'websocket_rails/spec_helpers'
|
|
18
|
+
require 'rspec-matchers-matchers'
|
|
17
19
|
|
|
18
20
|
RSpec.configure do |config|
|
|
19
21
|
# == Mock Framework
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Route Matchers' do
|
|
4
|
+
|
|
5
|
+
class RouteSpecProductController < WebsocketRails::BaseController
|
|
6
|
+
|
|
7
|
+
def update_product
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def delete_product
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class RouteSpecWarehouseController < WebsocketRails::BaseController
|
|
16
|
+
|
|
17
|
+
def remove_product
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def define_route_test_events
|
|
24
|
+
WebsocketRails.route_block = nil
|
|
25
|
+
WebsocketRails::EventMap.describe do
|
|
26
|
+
|
|
27
|
+
namespace :product do
|
|
28
|
+
subscribe :update, :to => RouteSpecProductController, :with_method => :update_product
|
|
29
|
+
subscribe :delete, :to => RouteSpecProductController, :with_method => :delete_product
|
|
30
|
+
subscribe :delete, :to => RouteSpecWarehouseController, :with_method => :remove_product
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
before { define_route_test_events }
|
|
36
|
+
|
|
37
|
+
describe 'be_routed_to' do
|
|
38
|
+
|
|
39
|
+
it 'should return true when the event is routed only to the specified controller' do
|
|
40
|
+
create_event('product.update', nil).should be_routed_to 'route_spec_product#update_product'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'should return true when the event is routed also to the specified controller' do
|
|
44
|
+
create_event('product.delete', nil).should be_routed_to 'route_spec_product#delete_product'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'should return false when the event is not routed to the specified controller' do
|
|
48
|
+
create_event('product.update', nil).should_not be_routed_to 'route_spec_product#delete_product'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should produce the correct failure message' do
|
|
52
|
+
event = create_event('route_spec_product.update', nil)
|
|
53
|
+
matcher = be_routed_to 'route_spec_product#delete_product'
|
|
54
|
+
cache_messages_for_matcher(matcher, event)
|
|
55
|
+
matcher.should produce_as_failure_message 'expected event update to be routed to target route_spec_product#delete_product'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'should produce the correct negative failure message' do
|
|
59
|
+
event = create_event('product.update', nil)
|
|
60
|
+
matcher = be_routed_to 'route_spec_product#update_product'
|
|
61
|
+
cache_messages_for_matcher(matcher, event)
|
|
62
|
+
matcher.should produce_as_negative_failure_message 'expected event update not to be routed to target route_spec_product#update_product'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should produce the correct description' do
|
|
66
|
+
event = create_event('product.update', nil)
|
|
67
|
+
matcher = be_routed_to 'route_spec_product#update_product'
|
|
68
|
+
cache_messages_for_matcher(matcher, event)
|
|
69
|
+
matcher.should produce_as_description 'be routed to target route_spec_product#update_product'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe 'be_routed_only_to' do
|
|
75
|
+
|
|
76
|
+
it 'should return true when the event is routed only to the specified controller' do
|
|
77
|
+
create_event('product.update', nil).should be_routed_only_to 'route_spec_product#update_product'
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'should return false when the event is routed also to the specified controller' do
|
|
81
|
+
create_event('product.delete', nil).should_not be_routed_only_to 'route_spec_product#delete_product'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'should return false when the event is not routed to the specified controller' do
|
|
85
|
+
create_event('product.update', nil).should_not be_routed_only_to 'route_spec_product#delete_product'
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should produce the correct failure message' do
|
|
89
|
+
event = create_event('product.update', nil)
|
|
90
|
+
matcher = be_routed_only_to 'route_spec_product#delete_product'
|
|
91
|
+
cache_messages_for_matcher(matcher, event)
|
|
92
|
+
matcher.should produce_as_failure_message 'expected event update to be routed only to target route_spec_product#delete_product'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'should produce the correct negative failure message' do
|
|
96
|
+
event = create_event('product.update', nil)
|
|
97
|
+
matcher = be_routed_only_to 'route_spec_product#update_product'
|
|
98
|
+
cache_messages_for_matcher(matcher, event)
|
|
99
|
+
matcher.should produce_as_negative_failure_message 'expected event update not to be routed only to target route_spec_product#update_product'
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'should produce the correct description' do
|
|
103
|
+
event = create_event('product.update', nil)
|
|
104
|
+
matcher = be_routed_only_to 'route_spec_product#update_product'
|
|
105
|
+
cache_messages_for_matcher(matcher, event)
|
|
106
|
+
matcher.should produce_as_description 'be routed only to target route_spec_product#update_product'
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
end
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Trigger Matchers' do
|
|
4
|
+
|
|
5
|
+
class TriggerSpecProductController < WebsocketRails::BaseController
|
|
6
|
+
|
|
7
|
+
# a method that does not trigger messages
|
|
8
|
+
def update_product
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def delete_product
|
|
12
|
+
data = message[:data] ? 'Return Data' : nil
|
|
13
|
+
if message[:confirm_delete]
|
|
14
|
+
trigger_success(data)
|
|
15
|
+
else
|
|
16
|
+
trigger_failure(data)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def define_test_events
|
|
23
|
+
WebsocketRails.route_block = nil
|
|
24
|
+
WebsocketRails::EventMap.describe do
|
|
25
|
+
|
|
26
|
+
namespace :product do
|
|
27
|
+
subscribe :update, :to => TriggerSpecProductController, :with_method => :update_product
|
|
28
|
+
subscribe :delete, :to => TriggerSpecProductController, :with_method => :delete_product
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
before { define_test_events }
|
|
34
|
+
|
|
35
|
+
around(:each) do |example|
|
|
36
|
+
EM.run do
|
|
37
|
+
example.run
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
after(:each) do
|
|
42
|
+
EM.stop
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# as we have have 16 possible combinations of trigger messages and data matching pattern (data|no_data, success|failure,
|
|
46
|
+
# no_checking|checking_with_any|checking_with_nil|checking_with_exact_data) plus the case of no message at all
|
|
47
|
+
# for EACH of the matchers, resulting in a total 51 cases, we will not extensively test all cases for all matchers
|
|
48
|
+
# but we just make sure that coverage is 100%
|
|
49
|
+
|
|
50
|
+
describe 'trigger_message' do
|
|
51
|
+
|
|
52
|
+
it 'should return false when the event does not trigger any message' do
|
|
53
|
+
create_event('product.update', nil).dispatch.should_not trigger_message
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'should produce the correct failure message when no trigger is generated' do
|
|
57
|
+
event = create_event('product.update', nil).dispatch
|
|
58
|
+
matcher = trigger_message
|
|
59
|
+
cache_messages_for_matcher(matcher, event)
|
|
60
|
+
matcher.should produce_as_failure_message 'expected product.update to trigger message, instead it did not trigger any message'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should return true when the message is a failure' do
|
|
64
|
+
create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should trigger_message
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should return true when the message is a success' do
|
|
68
|
+
create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should trigger_message
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'when a message is triggered with no data' do
|
|
72
|
+
|
|
73
|
+
it 'should return true when no check is done' do
|
|
74
|
+
create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should trigger_message
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should produce the correct negative failure message when no check on data is done' do
|
|
78
|
+
event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
|
|
79
|
+
matcher = trigger_message
|
|
80
|
+
cache_messages_for_matcher(matcher, event)
|
|
81
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'should return true when explicitly checking no data' do
|
|
85
|
+
create_event('product.delete', {confirm_delete: false, data: false}).dispatch.should trigger_message :nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should produce the correct negative failure message when explicitly checking no data' do
|
|
89
|
+
event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
|
|
90
|
+
matcher = trigger_message :nil
|
|
91
|
+
cache_messages_for_matcher(matcher, event)
|
|
92
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with no data'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'should return false when checking for some data' do
|
|
96
|
+
create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should_not trigger_message :any
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'should return the correct failure message when checking for some data' do
|
|
100
|
+
event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
|
|
101
|
+
matcher = trigger_message :any
|
|
102
|
+
cache_messages_for_matcher(matcher, event)
|
|
103
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger message with some data, instead it triggered message with no data'
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it 'should return false when checking for specific data' do
|
|
107
|
+
create_event('product.delete', {confirm_delete: false, data: false}).dispatch.should_not trigger_message 'Expected Data'
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'should return the correct failure message when checking for specific data' do
|
|
111
|
+
event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
|
|
112
|
+
matcher = trigger_message 'Expected Data'
|
|
113
|
+
cache_messages_for_matcher(matcher, event)
|
|
114
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger message with data Expected Data, instead it triggered message with no data'
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context 'when a message is triggered with some data' do
|
|
120
|
+
|
|
121
|
+
it 'should return true when no check is done' do
|
|
122
|
+
create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'should return false when explicitly checking no data' do
|
|
126
|
+
create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_message :nil
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'should produce the correct failure message when explicitly checking for no data' do
|
|
130
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
131
|
+
matcher = trigger_message :nil
|
|
132
|
+
cache_messages_for_matcher(matcher, event)
|
|
133
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger message with no data, instead it triggered message with data Return Data'
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'should return true when checking for some data' do
|
|
137
|
+
create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message :any
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'should produce the correct negative failure message when checking for some data' do
|
|
141
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
142
|
+
matcher = trigger_message :any
|
|
143
|
+
cache_messages_for_matcher(matcher, event)
|
|
144
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with some data'
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it 'should return false when checking for specific data with wrong data' do
|
|
148
|
+
create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_message 'Wrong Data'
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'should produce the correct failure message when checking for specific data' do
|
|
152
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
153
|
+
matcher = trigger_message 'Wrong Data'
|
|
154
|
+
cache_messages_for_matcher(matcher, event)
|
|
155
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger message with data Wrong Data, instead it triggered message with data Return Data'
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'should return true when checking for specific data with correct data' do
|
|
159
|
+
create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message 'Return Data'
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it 'should produce the correct negative failure message when checking for specific data' do
|
|
163
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
164
|
+
matcher = trigger_message 'Return Data'
|
|
165
|
+
cache_messages_for_matcher(matcher, event)
|
|
166
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with data Return Data'
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'should produce the correct description' do
|
|
172
|
+
event = create_event('product.update', nil)
|
|
173
|
+
matcher = trigger_message 'Return Data'
|
|
174
|
+
cache_messages_for_matcher(matcher, event)
|
|
175
|
+
matcher.should produce_as_description 'trigger message with data Return Data'
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
describe 'trigger_success_message' do
|
|
182
|
+
|
|
183
|
+
it 'should return false when the method does not trigger any message' do
|
|
184
|
+
create_event('product.update', nil).dispatch.should_not trigger_success_message
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it 'should produce the correct failure message when the method does not trigger any message' do
|
|
188
|
+
event = create_event('product.update', nil).dispatch
|
|
189
|
+
matcher = trigger_success_message 'Return Data'
|
|
190
|
+
cache_messages_for_matcher(matcher, event)
|
|
191
|
+
matcher.should produce_as_failure_message 'expected product.update to trigger success message with data Return Data, instead it did not trigger any message'
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it 'should return true when the method triggers a success message' do
|
|
195
|
+
create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_success_message
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
it 'should produce the correct negative failure message when the method triggers a success message' do
|
|
199
|
+
event = create_event('product.delete', {confirm_delete: true, data: true}).dispatch
|
|
200
|
+
matcher = trigger_success_message :any
|
|
201
|
+
cache_messages_for_matcher(matcher, event)
|
|
202
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger success message with some data'
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it 'should return false when the method triggers a failure message' do
|
|
206
|
+
create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_success_message
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it 'should produce the correct failure message when the method triggers a failure message' do
|
|
210
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
211
|
+
matcher = trigger_success_message
|
|
212
|
+
cache_messages_for_matcher(matcher, event)
|
|
213
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger success message, instead it triggered a failure message with data Return Data'
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
describe 'trigger_failure_message' do
|
|
219
|
+
|
|
220
|
+
it 'should return false when the method does not trigger any message' do
|
|
221
|
+
create_event('product.update', nil).dispatch.should_not trigger_failure_message
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it 'should produce the correct failure message when the method does not trigger any message' do
|
|
225
|
+
event = create_event('product.update', nil).dispatch
|
|
226
|
+
matcher = trigger_failure_message 'Return Data'
|
|
227
|
+
cache_messages_for_matcher(matcher, event)
|
|
228
|
+
matcher.should produce_as_failure_message 'expected product.update to trigger failure message with data Return Data, instead it did not trigger any message'
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it 'should return false when the method triggers a success message' do
|
|
232
|
+
create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should_not trigger_failure_message
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it 'should produce the correct failure message when the method triggers a success message' do
|
|
236
|
+
event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
|
|
237
|
+
matcher = trigger_failure_message :any
|
|
238
|
+
cache_messages_for_matcher(matcher, event)
|
|
239
|
+
matcher.should produce_as_failure_message 'expected product.delete to trigger failure message with some data, instead it triggered a success message with no data'
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
it 'should return true when the method triggers a failure message' do
|
|
244
|
+
create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should trigger_failure_message
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
it 'should produce the correct negative failure message when the method triggers a failure message' do
|
|
248
|
+
event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
|
|
249
|
+
matcher = trigger_failure_message
|
|
250
|
+
cache_messages_for_matcher(matcher, event)
|
|
251
|
+
matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger failure message'
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module WebsocketRails
|
|
4
|
+
|
|
5
|
+
describe SpecHelperEvent do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@dispatcher = double(:dispatcher)
|
|
9
|
+
Dispatcher.stub(:new).and_return @dispatcher
|
|
10
|
+
@event = SpecHelperEvent.new('my_event', data: 'my_data')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe 'initialize' do
|
|
14
|
+
|
|
15
|
+
it 'should initialize the name and namespace of the event' do
|
|
16
|
+
@event.namespace.should == [:global]
|
|
17
|
+
@event.name.should == :my_event
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should initialize the data of the event' do
|
|
21
|
+
@event.data.should == 'my_data'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'should set the event to not triggered' do
|
|
25
|
+
@event.should_not be_triggered
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe 'trigger' do
|
|
31
|
+
|
|
32
|
+
it 'should set the triggered variable to true' do
|
|
33
|
+
@event.trigger
|
|
34
|
+
@event.should be_triggered
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe 'dispatch' do
|
|
40
|
+
|
|
41
|
+
it 'should invoke dispatch on the dispatcher object' do
|
|
42
|
+
@dispatcher.should_receive(:dispatch).with(@event)
|
|
43
|
+
@event.dispatch
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should return itself to be able to chain matchers' do
|
|
47
|
+
@dispatcher.stub(:dispatch)
|
|
48
|
+
@event.dispatch.should == @event
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe 'create_event' do
|
|
58
|
+
|
|
59
|
+
it 'should create a SpecHelperEvent with the correct parameters' do
|
|
60
|
+
event = create_event('my_event','my_data')
|
|
61
|
+
event.should be_a WebsocketRails::SpecHelperEvent
|
|
62
|
+
event.name.should == :my_event
|
|
63
|
+
event.data.should == 'my_data'
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
data/spec/unit/event_map_spec.rb
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
+
# this classes are outside the WebsocketRails namespace to better reflect the actual
|
|
4
|
+
# situation in a normal usage
|
|
5
|
+
|
|
6
|
+
class ProductController < WebsocketRails::BaseController
|
|
7
|
+
def update_product
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# name is chosen so that we know camelize is working correctly
|
|
13
|
+
class ComplexProductController < WebsocketRails::BaseController
|
|
14
|
+
|
|
15
|
+
def simplify_product
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
3
22
|
module WebsocketRails
|
|
4
23
|
describe EventMap do
|
|
5
24
|
|
|
6
|
-
|
|
7
|
-
def update_product
|
|
8
|
-
true
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
|
|
25
|
+
|
|
12
26
|
def define_test_events
|
|
13
27
|
WebsocketRails.route_block = nil
|
|
14
28
|
WebsocketRails::EventMap.describe do
|
|
@@ -17,6 +31,11 @@ module WebsocketRails
|
|
|
17
31
|
namespace :product do
|
|
18
32
|
subscribe :update, :to => ProductController, :with_method => :update_product
|
|
19
33
|
end
|
|
34
|
+
|
|
35
|
+
namespace :complex_product do
|
|
36
|
+
subscribe :simplify, 'complex_product#simplify'
|
|
37
|
+
end
|
|
38
|
+
|
|
20
39
|
end
|
|
21
40
|
end
|
|
22
41
|
|
|
@@ -55,8 +74,9 @@ module WebsocketRails
|
|
|
55
74
|
|
|
56
75
|
before { @namespace = subject.namespace }
|
|
57
76
|
|
|
58
|
-
it "should store the event in the correct
|
|
77
|
+
it "should store the event in the correct namespaces" do
|
|
59
78
|
@namespace.namespaces[:product].actions[:update].should be_present
|
|
79
|
+
@namespace.namespaces[:complex_product].actions[:simplify].should be_present
|
|
60
80
|
end
|
|
61
81
|
|
|
62
82
|
end
|
|
@@ -78,7 +98,7 @@ module WebsocketRails
|
|
|
78
98
|
end
|
|
79
99
|
|
|
80
100
|
context "with events in a child namespace" do
|
|
81
|
-
it "should yield the controller and action name for each route defined for an event" do
|
|
101
|
+
it "should yield the controller and action name for each route defined with a hash for an event" do
|
|
82
102
|
ProductController.any_instance.should_receive(:action_executed)
|
|
83
103
|
event = HelperMethods::MockEvent.new :update, [:global,:product]
|
|
84
104
|
|
|
@@ -87,7 +107,21 @@ module WebsocketRails
|
|
|
87
107
|
controller.class.should == ProductController
|
|
88
108
|
method.should == :update_product
|
|
89
109
|
end
|
|
90
|
-
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should yield the controller and action name for each route defined with a string for an event" do
|
|
114
|
+
ComplexProductController.any_instance.should_receive(:action_executed)
|
|
115
|
+
event = HelperMethods::MockEvent.new :simplify, [:global,:complex_product]
|
|
116
|
+
|
|
117
|
+
subject.routes_for(event) do |controller,method|
|
|
118
|
+
controller.action_executed
|
|
119
|
+
controller.class.should == ComplexProductController
|
|
120
|
+
method.should == :simplify
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
91
125
|
end
|
|
92
126
|
|
|
93
127
|
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ComplexProductController < WebsocketRails::BaseController
|
|
5
|
+
|
|
6
|
+
def simplify
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module MyModule
|
|
12
|
+
|
|
13
|
+
class AnotherController < WebsocketRails::BaseController
|
|
14
|
+
|
|
15
|
+
def complicate
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module MySubModule
|
|
21
|
+
|
|
22
|
+
class AThirdController < WebsocketRails::BaseController
|
|
23
|
+
|
|
24
|
+
def confuse
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
module WebsocketRails
|
|
35
|
+
|
|
36
|
+
describe TargetValidator do
|
|
37
|
+
|
|
38
|
+
describe 'validate_target' do
|
|
39
|
+
|
|
40
|
+
it 'should raise an error when target class is not supported' do
|
|
41
|
+
expect{TargetValidator.validate_target(50)}.to raise_error
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should raise if passed hash does not contain the to: key' do
|
|
45
|
+
expect{TargetValidator.validate_target(from: ComplexProductController, with_method: :simplify)}.to raise_error
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should raise if passed hash does not contain the with_method: key' do
|
|
49
|
+
expect{TargetValidator.validate_target(to: ComplexProductController, without_method: :simplify)}.to raise_error
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should raise if the string is not in the correct format' do
|
|
53
|
+
expect{TargetValidator.validate_target('malformed_string')}.to raise_error
|
|
54
|
+
expect{TargetValidator.validate_target('very#malformed#string')}.to raise_error
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should raise if the class specified in the String does not exist' do
|
|
58
|
+
expect{TargetValidator.validate_target('my_non_existent#my_method')}.to raise_error
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'should parse correctly a well-formed Hash' do
|
|
62
|
+
TargetValidator::validate_target(to: ComplexProductController, with_method: :simplify).should == [ComplexProductController, :simplify]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'when the string is well-formed' do
|
|
66
|
+
|
|
67
|
+
it 'should parse correctly when the controller is a top-level' do
|
|
68
|
+
TargetValidator::validate_target('complex_product#simplify').should == [ComplexProductController, :simplify]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'should parse correctly when the controller belongs to a module' do
|
|
72
|
+
TargetValidator::validate_target('my_module/another#complicate').should == [MyModule::AnotherController, :complicate]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it 'should parse correctly with many levels of module nesting' do
|
|
76
|
+
TargetValidator::validate_target('my_module/my_sub_module/a_third#confuse').should == [MyModule::MySubModule::AThirdController, :confuse]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: websocket-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2013-
|
|
14
|
+
date: 2013-02-06 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: rails
|
|
@@ -157,6 +157,22 @@ dependencies:
|
|
|
157
157
|
- - ! '>='
|
|
158
158
|
- !ruby/object:Gem::Version
|
|
159
159
|
version: '0'
|
|
160
|
+
- !ruby/object:Gem::Dependency
|
|
161
|
+
name: rspec-matchers-matchers
|
|
162
|
+
requirement: !ruby/object:Gem::Requirement
|
|
163
|
+
none: false
|
|
164
|
+
requirements:
|
|
165
|
+
- - ! '>='
|
|
166
|
+
- !ruby/object:Gem::Version
|
|
167
|
+
version: '0'
|
|
168
|
+
type: :development
|
|
169
|
+
prerelease: false
|
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
171
|
+
none: false
|
|
172
|
+
requirements:
|
|
173
|
+
- - ! '>='
|
|
174
|
+
- !ruby/object:Gem::Version
|
|
175
|
+
version: '0'
|
|
160
176
|
description: Seamless Ruby on Rails websocket integration.
|
|
161
177
|
email:
|
|
162
178
|
- dknox@threedotloft.com
|
|
@@ -177,6 +193,9 @@ files:
|
|
|
177
193
|
- lib/rails/app/controllers/websocket_rails/delegation_controller.rb
|
|
178
194
|
- lib/rails/config/routes.rb
|
|
179
195
|
- lib/rails/tasks/websocket_rails.tasks
|
|
196
|
+
- lib/spec_helpers/matchers/route_matchers.rb
|
|
197
|
+
- lib/spec_helpers/matchers/trigger_matchers.rb
|
|
198
|
+
- lib/spec_helpers/spec_helper_event.rb
|
|
180
199
|
- lib/websocket-rails.rb
|
|
181
200
|
- lib/websocket_rails/base_controller.rb
|
|
182
201
|
- lib/websocket_rails/channel.rb
|
|
@@ -193,6 +212,7 @@ files:
|
|
|
193
212
|
- lib/websocket_rails/event_queue.rb
|
|
194
213
|
- lib/websocket_rails/internal_events.rb
|
|
195
214
|
- lib/websocket_rails/logging.rb
|
|
215
|
+
- lib/websocket_rails/spec_helpers.rb
|
|
196
216
|
- lib/websocket_rails/synchronization.rb
|
|
197
217
|
- lib/websocket_rails/version.rb
|
|
198
218
|
- bin/thin-socketrails
|
|
@@ -251,6 +271,9 @@ files:
|
|
|
251
271
|
- spec/javascripts/websocket_rails/websocket_connection_spec.coffee
|
|
252
272
|
- spec/javascripts/websocket_rails/websocket_rails_spec.coffee
|
|
253
273
|
- spec/spec_helper.rb
|
|
274
|
+
- spec/spec_helpers/matchers/route_matchers_spec.rb
|
|
275
|
+
- spec/spec_helpers/matchers/trigger_matchers_spec.rb
|
|
276
|
+
- spec/spec_helpers/spec_helper_event_spec.rb
|
|
254
277
|
- spec/support/helper_methods.rb
|
|
255
278
|
- spec/support/mock_web_socket.rb
|
|
256
279
|
- spec/unit/channel_manager_spec.rb
|
|
@@ -266,6 +289,7 @@ files:
|
|
|
266
289
|
- spec/unit/event_spec.rb
|
|
267
290
|
- spec/unit/logging_spec.rb
|
|
268
291
|
- spec/unit/synchronization_spec.rb
|
|
292
|
+
- spec/unit/target_validator_spec.rb
|
|
269
293
|
- MIT-LICENSE
|
|
270
294
|
- Rakefile
|
|
271
295
|
- Gemfile
|
|
@@ -285,7 +309,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
285
309
|
version: '0'
|
|
286
310
|
segments:
|
|
287
311
|
- 0
|
|
288
|
-
hash:
|
|
312
|
+
hash: 3143824869554570755
|
|
289
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
290
314
|
none: false
|
|
291
315
|
requirements:
|
|
@@ -294,10 +318,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
294
318
|
version: '0'
|
|
295
319
|
segments:
|
|
296
320
|
- 0
|
|
297
|
-
hash:
|
|
321
|
+
hash: 3143824869554570755
|
|
298
322
|
requirements: []
|
|
299
323
|
rubyforge_project: websocket-rails
|
|
300
|
-
rubygems_version: 1.8.
|
|
324
|
+
rubygems_version: 1.8.24
|
|
301
325
|
signing_key:
|
|
302
326
|
specification_version: 3
|
|
303
327
|
summary: Plug and play websocket support for ruby on rails. Includes event router
|