hkroger-websocket-rails 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +328 -0
  3. data/Gemfile +27 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +237 -0
  6. data/Rakefile +72 -0
  7. data/bin/thin-socketrails +45 -0
  8. data/lib/assets/javascripts/websocket_rails/abstract_connection.js.coffee +45 -0
  9. data/lib/assets/javascripts/websocket_rails/channel.js.coffee +70 -0
  10. data/lib/assets/javascripts/websocket_rails/event.js.coffee +42 -0
  11. data/lib/assets/javascripts/websocket_rails/http_connection.js.coffee +66 -0
  12. data/lib/assets/javascripts/websocket_rails/main.js +6 -0
  13. data/lib/assets/javascripts/websocket_rails/websocket_connection.js.coffee +29 -0
  14. data/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee +158 -0
  15. data/lib/config.ru +3 -0
  16. data/lib/generators/websocket_rails/install/install_generator.rb +33 -0
  17. data/lib/generators/websocket_rails/install/templates/events.rb +14 -0
  18. data/lib/generators/websocket_rails/install/templates/websocket_rails.rb +63 -0
  19. data/lib/hkroger-websocket-rails.rb +1 -0
  20. data/lib/rails/app/controllers/websocket_rails/delegation_controller.rb +13 -0
  21. data/lib/rails/config/routes.rb +7 -0
  22. data/lib/rails/tasks/websocket_rails.tasks +42 -0
  23. data/lib/spec_helpers/matchers/route_matchers.rb +65 -0
  24. data/lib/spec_helpers/matchers/trigger_matchers.rb +113 -0
  25. data/lib/spec_helpers/spec_helper_event.rb +34 -0
  26. data/lib/websocket-rails.rb +108 -0
  27. data/lib/websocket_rails/base_controller.rb +197 -0
  28. data/lib/websocket_rails/channel.rb +97 -0
  29. data/lib/websocket_rails/channel_manager.rb +55 -0
  30. data/lib/websocket_rails/configuration.rb +169 -0
  31. data/lib/websocket_rails/connection_adapters.rb +195 -0
  32. data/lib/websocket_rails/connection_adapters/http.rb +120 -0
  33. data/lib/websocket_rails/connection_adapters/web_socket.rb +36 -0
  34. data/lib/websocket_rails/connection_manager.rb +119 -0
  35. data/lib/websocket_rails/controller_factory.rb +80 -0
  36. data/lib/websocket_rails/data_store.rb +145 -0
  37. data/lib/websocket_rails/dispatcher.rb +129 -0
  38. data/lib/websocket_rails/engine.rb +26 -0
  39. data/lib/websocket_rails/event.rb +189 -0
  40. data/lib/websocket_rails/event_map.rb +184 -0
  41. data/lib/websocket_rails/event_queue.rb +33 -0
  42. data/lib/websocket_rails/internal_events.rb +37 -0
  43. data/lib/websocket_rails/logging.rb +133 -0
  44. data/lib/websocket_rails/spec_helpers.rb +3 -0
  45. data/lib/websocket_rails/synchronization.rb +182 -0
  46. data/lib/websocket_rails/user_manager.rb +276 -0
  47. data/lib/websocket_rails/version.rb +3 -0
  48. data/spec/dummy/Rakefile +7 -0
  49. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  50. data/spec/dummy/app/controllers/chat_controller.rb +53 -0
  51. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  52. data/spec/dummy/app/models/user.rb +2 -0
  53. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  54. data/spec/dummy/config.ru +4 -0
  55. data/spec/dummy/config/application.rb +45 -0
  56. data/spec/dummy/config/boot.rb +10 -0
  57. data/spec/dummy/config/database.yml +22 -0
  58. data/spec/dummy/config/environment.rb +5 -0
  59. data/spec/dummy/config/environments/development.rb +26 -0
  60. data/spec/dummy/config/environments/production.rb +49 -0
  61. data/spec/dummy/config/environments/test.rb +34 -0
  62. data/spec/dummy/config/events.rb +7 -0
  63. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  64. data/spec/dummy/config/initializers/inflections.rb +10 -0
  65. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  66. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  67. data/spec/dummy/config/initializers/session_store.rb +8 -0
  68. data/spec/dummy/config/locales/en.yml +5 -0
  69. data/spec/dummy/config/routes.rb +58 -0
  70. data/spec/dummy/db/development.sqlite3 +0 -0
  71. data/spec/dummy/db/migrate/20130902222552_create_users.rb +10 -0
  72. data/spec/dummy/db/schema.rb +23 -0
  73. data/spec/dummy/db/test.sqlite3 +0 -0
  74. data/spec/dummy/log/development.log +17 -0
  75. data/spec/dummy/log/production.log +0 -0
  76. data/spec/dummy/log/server.log +0 -0
  77. data/spec/dummy/public/404.html +26 -0
  78. data/spec/dummy/public/422.html +26 -0
  79. data/spec/dummy/public/500.html +26 -0
  80. data/spec/dummy/public/favicon.ico +0 -0
  81. data/spec/dummy/public/javascripts/application.js +2 -0
  82. data/spec/dummy/public/javascripts/controls.js +965 -0
  83. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  84. data/spec/dummy/public/javascripts/effects.js +1123 -0
  85. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  86. data/spec/dummy/public/javascripts/rails.js +202 -0
  87. data/spec/dummy/script/rails +6 -0
  88. data/spec/integration/connection_manager_spec.rb +135 -0
  89. data/spec/javascripts/support/jasmine.yml +52 -0
  90. data/spec/javascripts/support/jasmine_helper.rb +38 -0
  91. data/spec/javascripts/support/vendor/sinon-1.7.1.js +4343 -0
  92. data/spec/javascripts/websocket_rails/channel_spec.coffee +112 -0
  93. data/spec/javascripts/websocket_rails/event_spec.coffee +69 -0
  94. data/spec/javascripts/websocket_rails/helpers.coffee +6 -0
  95. data/spec/javascripts/websocket_rails/websocket_connection_spec.coffee +158 -0
  96. data/spec/javascripts/websocket_rails/websocket_rails_spec.coffee +274 -0
  97. data/spec/spec_helper.rb +41 -0
  98. data/spec/spec_helpers/matchers/route_matchers_spec.rb +109 -0
  99. data/spec/spec_helpers/matchers/trigger_matchers_spec.rb +247 -0
  100. data/spec/spec_helpers/spec_helper_event_spec.rb +66 -0
  101. data/spec/support/helper_methods.rb +42 -0
  102. data/spec/support/mock_web_socket.rb +41 -0
  103. data/spec/unit/base_controller_spec.rb +74 -0
  104. data/spec/unit/channel_manager_spec.rb +58 -0
  105. data/spec/unit/channel_spec.rb +169 -0
  106. data/spec/unit/connection_adapters/http_spec.rb +88 -0
  107. data/spec/unit/connection_adapters/web_socket_spec.rb +30 -0
  108. data/spec/unit/connection_adapters_spec.rb +259 -0
  109. data/spec/unit/connection_manager_spec.rb +148 -0
  110. data/spec/unit/controller_factory_spec.rb +76 -0
  111. data/spec/unit/data_store_spec.rb +106 -0
  112. data/spec/unit/dispatcher_spec.rb +203 -0
  113. data/spec/unit/event_map_spec.rb +120 -0
  114. data/spec/unit/event_queue_spec.rb +36 -0
  115. data/spec/unit/event_spec.rb +181 -0
  116. data/spec/unit/logging_spec.rb +162 -0
  117. data/spec/unit/synchronization_spec.rb +150 -0
  118. data/spec/unit/target_validator_spec.rb +88 -0
  119. data/spec/unit/user_manager_spec.rb +165 -0
  120. metadata +320 -0
@@ -0,0 +1,41 @@
1
+ ENV["RAILS_ENV"] ||= 'test'
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start if ENV["COVERAGE"]
5
+
6
+ require File.expand_path("../../spec/dummy/config/environment", __FILE__)
7
+ require 'rspec/rails'
8
+ require 'rspec/autorun'
9
+ require 'thin'
10
+
11
+ $:.push File.expand_path("../../lib", __FILE__)
12
+ require 'websocket-rails'
13
+
14
+ # Requires supporting ruby files with custom matchers and macros, etc,
15
+ # in spec/support/ and its subdirectories.
16
+ Dir["./spec/support/**/*.rb"].each {|f| require f}
17
+ require 'websocket_rails/spec_helpers'
18
+ require 'rspec-matchers-matchers'
19
+
20
+ RSpec.configure do |config|
21
+ # == Mock Framework
22
+ #
23
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
24
+ #
25
+ # config.mock_with :mocha
26
+ # config.mock_with :flexmock
27
+ # config.mock_with :rr
28
+ config.mock_with :rspec
29
+
30
+ config.include WebsocketRails::HelperMethods
31
+
32
+ # If true, the base class of anonymous controllers will be inferred
33
+ # automatically. This will be the default behavior in future versions of
34
+ # rspec-rails.
35
+ config.infer_base_class_for_anonymous_controllers = false
36
+
37
+ config.before(:each) do
38
+ WebsocketRails.config.logger = Logger.new(StringIO.new)
39
+ end
40
+
41
+ end
@@ -0,0 +1,109 @@
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
+ def define_route_test_events
23
+ WebsocketRails.config.route_block = nil
24
+ WebsocketRails::EventMap.describe do
25
+
26
+ namespace :product do
27
+ subscribe :update, :to => RouteSpecProductController, :with_method => :update_product
28
+ subscribe :delete, :to => RouteSpecProductController, :with_method => :delete_product
29
+ subscribe :delete, :to => RouteSpecWarehouseController, :with_method => :remove_product
30
+ end
31
+ end
32
+ end
33
+
34
+ before { define_route_test_events }
35
+
36
+ describe 'be_routed_to' do
37
+
38
+ it 'should return true when the event is routed only to the specified controller' do
39
+ create_event('product.update', nil).should be_routed_to 'route_spec_product#update_product'
40
+ end
41
+
42
+ it 'should return true when the event is routed also to the specified controller' do
43
+ create_event('product.delete', nil).should be_routed_to 'route_spec_product#delete_product'
44
+ end
45
+
46
+ it 'should return false when the event is not routed to the specified controller' do
47
+ create_event('product.update', nil).should_not be_routed_to 'route_spec_product#delete_product'
48
+ end
49
+
50
+ it 'should produce the correct failure message' do
51
+ event = create_event('route_spec_product.update', nil)
52
+ matcher = be_routed_to 'route_spec_product#delete_product'
53
+ cache_messages_for_matcher(matcher, event)
54
+ matcher.should produce_as_failure_message 'expected event update to be routed to target route_spec_product#delete_product'
55
+ end
56
+
57
+ it 'should produce the correct negative failure message' do
58
+ event = create_event('product.update', nil)
59
+ matcher = be_routed_to 'route_spec_product#update_product'
60
+ cache_messages_for_matcher(matcher, event)
61
+ matcher.should produce_as_negative_failure_message 'expected event update not to be routed to target route_spec_product#update_product'
62
+ end
63
+
64
+ it 'should produce the correct description' do
65
+ event = create_event('product.update', nil)
66
+ matcher = be_routed_to 'route_spec_product#update_product'
67
+ cache_messages_for_matcher(matcher, event)
68
+ matcher.should produce_as_description 'be routed to target route_spec_product#update_product'
69
+ end
70
+
71
+ end
72
+
73
+ describe 'be_routed_only_to' do
74
+
75
+ it 'should return true when the event is routed only to the specified controller' do
76
+ create_event('product.update', nil).should be_routed_only_to 'route_spec_product#update_product'
77
+ end
78
+
79
+ it 'should return false when the event is routed also to the specified controller' do
80
+ create_event('product.delete', nil).should_not be_routed_only_to 'route_spec_product#delete_product'
81
+ end
82
+
83
+ it 'should return false when the event is not routed to the specified controller' do
84
+ create_event('product.update', nil).should_not be_routed_only_to 'route_spec_product#delete_product'
85
+ end
86
+
87
+ it 'should produce the correct failure message' do
88
+ event = create_event('product.update', nil)
89
+ matcher = be_routed_only_to 'route_spec_product#delete_product'
90
+ cache_messages_for_matcher(matcher, event)
91
+ matcher.should produce_as_failure_message 'expected event update to be routed only to target route_spec_product#delete_product'
92
+ end
93
+
94
+ it 'should produce the correct negative failure message' do
95
+ event = create_event('product.update', nil)
96
+ matcher = be_routed_only_to 'route_spec_product#update_product'
97
+ cache_messages_for_matcher(matcher, event)
98
+ matcher.should produce_as_negative_failure_message 'expected event update not to be routed only to target route_spec_product#update_product'
99
+ end
100
+
101
+ it 'should produce the correct description' do
102
+ event = create_event('product.update', nil)
103
+ matcher = be_routed_only_to 'route_spec_product#update_product'
104
+ cache_messages_for_matcher(matcher, event)
105
+ matcher.should produce_as_description 'be routed only to target route_spec_product#update_product'
106
+ end
107
+
108
+ end
109
+ end
@@ -0,0 +1,247 @@
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.config.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
+ # as we have have 16 possible combinations of trigger messages and data matching pattern (data|no_data, success|failure,
36
+ # no_checking|checking_with_any|checking_with_nil|checking_with_exact_data) plus the case of no message at all
37
+ # for EACH of the matchers, resulting in a total 51 cases, we will not extensively test all cases for all matchers
38
+ # but we just make sure that coverage is 100%
39
+
40
+ describe 'trigger_message' do
41
+
42
+ it 'should return false when the event does not trigger any message' do
43
+ create_event('product.update', nil).dispatch.should_not trigger_message
44
+ end
45
+
46
+ it 'should produce the correct failure message when no trigger is generated' do
47
+ event = create_event('product.update', nil).dispatch
48
+ matcher = trigger_message
49
+ cache_messages_for_matcher(matcher, event)
50
+ matcher.should produce_as_failure_message 'expected product.update to trigger message, instead it did not trigger any message'
51
+ end
52
+
53
+ it 'should return true when the message is a failure' do
54
+ create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should trigger_message
55
+ end
56
+
57
+ it 'should return true when the message is a success' do
58
+ create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should trigger_message
59
+ end
60
+
61
+ context 'when a message is triggered with no data' do
62
+
63
+ it 'should return true when no check is done' do
64
+ create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should trigger_message
65
+ end
66
+
67
+ it 'should produce the correct negative failure message when no check on data is done' do
68
+ event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
69
+ matcher = trigger_message
70
+ cache_messages_for_matcher(matcher, event)
71
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message'
72
+ end
73
+
74
+ it 'should return true when explicitly checking no data' do
75
+ create_event('product.delete', {confirm_delete: false, data: false}).dispatch.should trigger_message :nil
76
+ end
77
+
78
+ it 'should produce the correct negative failure message when explicitly checking no data' do
79
+ event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
80
+ matcher = trigger_message :nil
81
+ cache_messages_for_matcher(matcher, event)
82
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with no data'
83
+ end
84
+
85
+ it 'should return false when checking for some data' do
86
+ create_event('product.delete', {confirm_delete: true, data: false}).dispatch.should_not trigger_message :any
87
+ end
88
+
89
+ it 'should return the correct failure message when checking for some data' do
90
+ event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
91
+ matcher = trigger_message :any
92
+ cache_messages_for_matcher(matcher, event)
93
+ matcher.should produce_as_failure_message 'expected product.delete to trigger message with some data, instead it triggered message with no data'
94
+ end
95
+
96
+ it 'should return false when checking for specific data' do
97
+ create_event('product.delete', {confirm_delete: false, data: false}).dispatch.should_not trigger_message 'Expected Data'
98
+ end
99
+
100
+ it 'should return the correct failure message when checking for specific data' do
101
+ event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
102
+ matcher = trigger_message 'Expected Data'
103
+ cache_messages_for_matcher(matcher, event)
104
+ matcher.should produce_as_failure_message 'expected product.delete to trigger message with data Expected Data, instead it triggered message with no data'
105
+ end
106
+
107
+ end
108
+
109
+ context 'when a message is triggered with some data' do
110
+
111
+ it 'should return true when no check is done' do
112
+ create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message
113
+ end
114
+
115
+ it 'should return false when explicitly checking no data' do
116
+ create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_message :nil
117
+ end
118
+
119
+ it 'should produce the correct failure message when explicitly checking for no data' do
120
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
121
+ matcher = trigger_message :nil
122
+ cache_messages_for_matcher(matcher, event)
123
+ matcher.should produce_as_failure_message 'expected product.delete to trigger message with no data, instead it triggered message with data Return Data'
124
+ end
125
+
126
+ it 'should return true when checking for some data' do
127
+ create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message :any
128
+ end
129
+
130
+ it 'should produce the correct negative failure message when checking for some data' do
131
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
132
+ matcher = trigger_message :any
133
+ cache_messages_for_matcher(matcher, event)
134
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with some data'
135
+ end
136
+
137
+ it 'should return false when checking for specific data with wrong data' do
138
+ create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_message 'Wrong Data'
139
+ end
140
+
141
+ it 'should produce the correct failure message when checking for specific data' do
142
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
143
+ matcher = trigger_message 'Wrong Data'
144
+ cache_messages_for_matcher(matcher, event)
145
+ matcher.should produce_as_failure_message 'expected product.delete to trigger message with data Wrong Data, instead it triggered message with data Return Data'
146
+ end
147
+
148
+ it 'should return true when checking for specific data with correct data' do
149
+ create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_message 'Return Data'
150
+ end
151
+
152
+ it 'should produce the correct negative failure message when checking for specific data' do
153
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
154
+ matcher = trigger_message 'Return Data'
155
+ cache_messages_for_matcher(matcher, event)
156
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger message with data Return Data'
157
+ end
158
+
159
+ end
160
+
161
+ it 'should produce the correct description' do
162
+ event = create_event('product.update', nil)
163
+ matcher = trigger_message 'Return Data'
164
+ cache_messages_for_matcher(matcher, event)
165
+ matcher.should produce_as_description 'trigger message with data Return Data'
166
+ end
167
+
168
+
169
+ end
170
+
171
+ describe 'trigger_success_message' do
172
+
173
+ it 'should return false when the method does not trigger any message' do
174
+ create_event('product.update', nil).dispatch.should_not trigger_success_message
175
+ end
176
+
177
+ it 'should produce the correct failure message when the method does not trigger any message' do
178
+ event = create_event('product.update', nil).dispatch
179
+ matcher = trigger_success_message 'Return Data'
180
+ cache_messages_for_matcher(matcher, event)
181
+ matcher.should produce_as_failure_message 'expected product.update to trigger success message with data Return Data, instead it did not trigger any message'
182
+ end
183
+
184
+ it 'should return true when the method triggers a success message' do
185
+ create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should trigger_success_message
186
+ end
187
+
188
+ it 'should produce the correct negative failure message when the method triggers a success message' do
189
+ event = create_event('product.delete', {confirm_delete: true, data: true}).dispatch
190
+ matcher = trigger_success_message :any
191
+ cache_messages_for_matcher(matcher, event)
192
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger success message with some data'
193
+ end
194
+
195
+ it 'should return false when the method triggers a failure message' do
196
+ create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should_not trigger_success_message
197
+ end
198
+
199
+ it 'should produce the correct failure message when the method triggers a failure message' do
200
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
201
+ matcher = trigger_success_message
202
+ cache_messages_for_matcher(matcher, event)
203
+ matcher.should produce_as_failure_message 'expected product.delete to trigger success message, instead it triggered a failure message with data Return Data'
204
+ end
205
+
206
+ end
207
+
208
+ describe 'trigger_failure_message' do
209
+
210
+ it 'should return false when the method does not trigger any message' do
211
+ create_event('product.update', nil).dispatch.should_not trigger_failure_message
212
+ end
213
+
214
+ it 'should produce the correct failure message when the method does not trigger any message' do
215
+ event = create_event('product.update', nil).dispatch
216
+ matcher = trigger_failure_message 'Return Data'
217
+ cache_messages_for_matcher(matcher, event)
218
+ matcher.should produce_as_failure_message 'expected product.update to trigger failure message with data Return Data, instead it did not trigger any message'
219
+ end
220
+
221
+ it 'should return false when the method triggers a success message' do
222
+ create_event('product.delete', {confirm_delete: true, data: true}).dispatch.should_not trigger_failure_message
223
+ end
224
+
225
+ it 'should produce the correct failure message when the method triggers a success message' do
226
+ event = create_event('product.delete', {confirm_delete: true, data: false}).dispatch
227
+ matcher = trigger_failure_message :any
228
+ cache_messages_for_matcher(matcher, event)
229
+ 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'
230
+ end
231
+
232
+
233
+ it 'should return true when the method triggers a failure message' do
234
+ create_event('product.delete', {confirm_delete: false, data: true}).dispatch.should trigger_failure_message
235
+ end
236
+
237
+ it 'should produce the correct negative failure message when the method triggers a failure message' do
238
+ event = create_event('product.delete', {confirm_delete: false, data: true}).dispatch
239
+ matcher = trigger_failure_message
240
+ cache_messages_for_matcher(matcher, event)
241
+ matcher.should produce_as_negative_failure_message 'expected product.delete not to trigger failure message'
242
+ end
243
+
244
+ end
245
+
246
+
247
+ 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