hyper-mesh 0.4.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.
Files changed (469) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +27 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +11 -0
  5. data/.travis.yml +4 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +396 -0
  10. data/Rakefile +6 -0
  11. data/app/controllers/reactive_record/application_controller.rb +4 -0
  12. data/app/controllers/reactive_record/reactive_record_controller.rb +49 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +7 -0
  15. data/codeship.database.yml +18 -0
  16. data/config/routes.rb +7 -0
  17. data/docs/action_cable_quickstart.md +151 -0
  18. data/docs/authorization-policies.md +449 -0
  19. data/docs/client_side_scoping.md +103 -0
  20. data/docs/pusher_quickstart.md +0 -0
  21. data/docs/simple_poller_quickstart.md +121 -0
  22. data/docs/todo-example.md +116 -0
  23. data/docs/words-example.md +65 -0
  24. data/examples/action-cable/.gitignore +21 -0
  25. data/examples/action-cable/Gemfile +58 -0
  26. data/examples/action-cable/Gemfile.lock +247 -0
  27. data/examples/action-cable/README.md +24 -0
  28. data/examples/action-cable/Rakefile +6 -0
  29. data/examples/action-cable/app/assets/config/manifest.js +3 -0
  30. data/examples/action-cable/app/assets/javascripts/application.js +18 -0
  31. data/examples/action-cable/app/assets/stylesheets/application.css +15 -0
  32. data/examples/action-cable/app/controllers/application_controller.rb +3 -0
  33. data/examples/action-cable/app/controllers/test_controller.rb +6 -0
  34. data/examples/action-cable/app/models/models.rb +2 -0
  35. data/examples/action-cable/app/models/public/application_record.rb +3 -0
  36. data/examples/action-cable/app/models/public/word.rb +2 -0
  37. data/examples/action-cable/app/policies/application_policy.rb +6 -0
  38. data/examples/action-cable/app/views/components.rb +17 -0
  39. data/examples/action-cable/app/views/components/app.rb +18 -0
  40. data/examples/action-cable/app/views/layouts/application.html.erb +14 -0
  41. data/examples/action-cable/app/views/layouts/mailer.html.erb +13 -0
  42. data/examples/action-cable/app/views/layouts/mailer.text.erb +1 -0
  43. data/examples/action-cable/bin/bundle +3 -0
  44. data/examples/action-cable/bin/rails +9 -0
  45. data/examples/action-cable/bin/rake +9 -0
  46. data/examples/action-cable/bin/setup +34 -0
  47. data/examples/action-cable/bin/spring +15 -0
  48. data/examples/action-cable/bin/update +29 -0
  49. data/examples/action-cable/config.ru +5 -0
  50. data/examples/action-cable/config/application.rb +30 -0
  51. data/examples/action-cable/config/boot.rb +3 -0
  52. data/examples/action-cable/config/cable.yml +9 -0
  53. data/examples/action-cable/config/database.yml +25 -0
  54. data/examples/action-cable/config/environment.rb +5 -0
  55. data/examples/action-cable/config/environments/development.rb +45 -0
  56. data/examples/action-cable/config/environments/production.rb +86 -0
  57. data/examples/action-cable/config/environments/test.rb +42 -0
  58. data/examples/action-cable/config/initializers/application_controller_renderer.rb +6 -0
  59. data/examples/action-cable/config/initializers/assets.rb +11 -0
  60. data/examples/action-cable/config/initializers/backtrace_silencers.rb +7 -0
  61. data/examples/action-cable/config/initializers/cookies_serializer.rb +5 -0
  62. data/examples/action-cable/config/initializers/filter_parameter_logging.rb +4 -0
  63. data/examples/action-cable/config/initializers/inflections.rb +16 -0
  64. data/examples/action-cable/config/initializers/mime_types.rb +4 -0
  65. data/examples/action-cable/config/initializers/new_framework_defaults.rb +24 -0
  66. data/examples/action-cable/config/initializers/session_store.rb +3 -0
  67. data/examples/action-cable/config/initializers/synchromesh.rb +5 -0
  68. data/examples/action-cable/config/initializers/wrap_parameters.rb +14 -0
  69. data/examples/action-cable/config/locales/en.yml +23 -0
  70. data/examples/action-cable/config/puma.rb +47 -0
  71. data/examples/action-cable/config/routes.rb +5 -0
  72. data/examples/action-cable/config/secrets.yml +22 -0
  73. data/examples/action-cable/config/spring.rb +6 -0
  74. data/examples/action-cable/db/migrate/20160921223808_create_words.rb +9 -0
  75. data/examples/action-cable/db/schema.rb +21 -0
  76. data/examples/action-cable/log/.keep +0 -0
  77. data/examples/action-cable/public/404.html +67 -0
  78. data/examples/action-cable/public/422.html +67 -0
  79. data/examples/action-cable/public/500.html +66 -0
  80. data/examples/action-cable/public/apple-touch-icon-precomposed.png +0 -0
  81. data/examples/action-cable/public/apple-touch-icon.png +0 -0
  82. data/examples/action-cable/public/favicon.ico +0 -0
  83. data/examples/action-cable/public/robots.txt +5 -0
  84. data/examples/action-cable/rails_cache_dir2/C91/480/synchromesh_active_connections +0 -0
  85. data/examples/action-cable/tmp/.keep +0 -0
  86. data/examples/action-cable/vendor/assets/javascripts/.keep +0 -0
  87. data/examples/action-cable/vendor/assets/stylesheets/.keep +0 -0
  88. data/examples/simple-poller/.gitignore +21 -0
  89. data/examples/simple-poller/Gemfile +64 -0
  90. data/examples/simple-poller/Gemfile.lock +272 -0
  91. data/examples/simple-poller/README.md +24 -0
  92. data/examples/simple-poller/Rakefile +6 -0
  93. data/examples/simple-poller/app/assets/config/manifest.js +3 -0
  94. data/examples/simple-poller/app/assets/images/.keep +0 -0
  95. data/examples/simple-poller/app/assets/javascripts/application.js +20 -0
  96. data/examples/simple-poller/app/assets/javascripts/channels/.keep +0 -0
  97. data/examples/simple-poller/app/assets/stylesheets/application.css +15 -0
  98. data/examples/simple-poller/app/channels/application_cable/channel.rb +4 -0
  99. data/examples/simple-poller/app/channels/application_cable/connection.rb +4 -0
  100. data/examples/simple-poller/app/controllers/application_controller.rb +3 -0
  101. data/examples/simple-poller/app/controllers/concerns/.keep +0 -0
  102. data/examples/simple-poller/app/controllers/test_controller.rb +6 -0
  103. data/examples/simple-poller/app/helpers/application_helper.rb +2 -0
  104. data/examples/simple-poller/app/jobs/application_job.rb +2 -0
  105. data/examples/simple-poller/app/mailers/application_mailer.rb +4 -0
  106. data/examples/simple-poller/app/models/concerns/.keep +0 -0
  107. data/examples/simple-poller/app/models/models.rb +2 -0
  108. data/examples/simple-poller/app/models/public/.keep +0 -0
  109. data/examples/simple-poller/app/models/public/application_record.rb +3 -0
  110. data/examples/simple-poller/app/models/public/word.rb +2 -0
  111. data/examples/simple-poller/app/policies/application_policy.rb +5 -0
  112. data/examples/simple-poller/app/views/components.rb +18 -0
  113. data/examples/simple-poller/app/views/components/.keep +0 -0
  114. data/examples/simple-poller/app/views/components/app.rb +40 -0
  115. data/examples/simple-poller/app/views/layouts/application.html.erb +14 -0
  116. data/examples/simple-poller/app/views/layouts/mailer.html.erb +13 -0
  117. data/examples/simple-poller/app/views/layouts/mailer.text.erb +1 -0
  118. data/examples/simple-poller/bin/bundle +3 -0
  119. data/examples/simple-poller/bin/rails +9 -0
  120. data/examples/simple-poller/bin/rake +9 -0
  121. data/examples/simple-poller/bin/setup +34 -0
  122. data/examples/simple-poller/bin/spring +16 -0
  123. data/examples/simple-poller/bin/update +29 -0
  124. data/examples/simple-poller/config.ru +5 -0
  125. data/examples/simple-poller/config/application.rb +20 -0
  126. data/examples/simple-poller/config/boot.rb +3 -0
  127. data/examples/simple-poller/config/cable.yml +9 -0
  128. data/examples/simple-poller/config/database.yml +25 -0
  129. data/examples/simple-poller/config/environment.rb +5 -0
  130. data/examples/simple-poller/config/environments/development.rb +44 -0
  131. data/examples/simple-poller/config/environments/production.rb +86 -0
  132. data/examples/simple-poller/config/environments/test.rb +42 -0
  133. data/examples/simple-poller/config/initializers/application_controller_renderer.rb +6 -0
  134. data/examples/simple-poller/config/initializers/assets.rb +11 -0
  135. data/examples/simple-poller/config/initializers/backtrace_silencers.rb +7 -0
  136. data/examples/simple-poller/config/initializers/cookies_serializer.rb +5 -0
  137. data/examples/simple-poller/config/initializers/filter_parameter_logging.rb +4 -0
  138. data/examples/simple-poller/config/initializers/inflections.rb +16 -0
  139. data/examples/simple-poller/config/initializers/mime_types.rb +4 -0
  140. data/examples/simple-poller/config/initializers/new_framework_defaults.rb +24 -0
  141. data/examples/simple-poller/config/initializers/session_store.rb +3 -0
  142. data/examples/simple-poller/config/initializers/synchromesh.rb +15 -0
  143. data/examples/simple-poller/config/initializers/wrap_parameters.rb +14 -0
  144. data/examples/simple-poller/config/locales/en.yml +23 -0
  145. data/examples/simple-poller/config/puma.rb +47 -0
  146. data/examples/simple-poller/config/routes.rb +5 -0
  147. data/examples/simple-poller/config/secrets.yml +22 -0
  148. data/examples/simple-poller/config/spring.rb +6 -0
  149. data/examples/simple-poller/db/migrate/20161013220135_create_words.rb +9 -0
  150. data/examples/simple-poller/db/schema.rb +21 -0
  151. data/examples/simple-poller/db/seeds.rb +7 -0
  152. data/examples/simple-poller/lib/assets/.keep +0 -0
  153. data/examples/simple-poller/lib/tasks/.keep +0 -0
  154. data/examples/simple-poller/log/.keep +0 -0
  155. data/examples/simple-poller/public/404.html +67 -0
  156. data/examples/simple-poller/public/422.html +67 -0
  157. data/examples/simple-poller/public/500.html +66 -0
  158. data/examples/simple-poller/public/apple-touch-icon-precomposed.png +0 -0
  159. data/examples/simple-poller/public/apple-touch-icon.png +0 -0
  160. data/examples/simple-poller/public/favicon.ico +0 -0
  161. data/examples/simple-poller/public/robots.txt +5 -0
  162. data/examples/simple-poller/test/controllers/.keep +0 -0
  163. data/examples/simple-poller/test/fixtures/.keep +0 -0
  164. data/examples/simple-poller/test/fixtures/files/.keep +0 -0
  165. data/examples/simple-poller/test/fixtures/words.yml +7 -0
  166. data/examples/simple-poller/test/helpers/.keep +0 -0
  167. data/examples/simple-poller/test/integration/.keep +0 -0
  168. data/examples/simple-poller/test/mailers/.keep +0 -0
  169. data/examples/simple-poller/test/models/.keep +0 -0
  170. data/examples/simple-poller/test/models/word_test.rb +7 -0
  171. data/examples/simple-poller/test/test_helper.rb +10 -0
  172. data/examples/simple-poller/tmp/.keep +0 -0
  173. data/examples/simple-poller/vendor/assets/javascripts/.keep +0 -0
  174. data/examples/simple-poller/vendor/assets/stylesheets/.keep +0 -0
  175. data/examples/words/.gitignore +21 -0
  176. data/examples/words/Gemfile +58 -0
  177. data/examples/words/Gemfile.lock +247 -0
  178. data/examples/words/README.md +24 -0
  179. data/examples/words/Rakefile +6 -0
  180. data/examples/words/app/assets/config/manifest.js +3 -0
  181. data/examples/words/app/assets/javascripts/application.js +18 -0
  182. data/examples/words/app/assets/stylesheets/application.css +15 -0
  183. data/examples/words/app/controllers/application_controller.rb +3 -0
  184. data/examples/words/app/controllers/test_controller.rb +6 -0
  185. data/examples/words/app/models/models.rb +2 -0
  186. data/examples/words/app/models/public/application_record.rb +3 -0
  187. data/examples/words/app/models/public/word.rb +10 -0
  188. data/examples/words/app/policies/application_policy.rb +6 -0
  189. data/examples/words/app/views/components.rb +16 -0
  190. data/examples/words/app/views/components/app.rb +31 -0
  191. data/examples/words/app/views/layouts/application.html.erb +14 -0
  192. data/examples/words/app/views/layouts/mailer.html.erb +13 -0
  193. data/examples/words/app/views/layouts/mailer.text.erb +1 -0
  194. data/examples/words/bin/bundle +3 -0
  195. data/examples/words/bin/rails +9 -0
  196. data/examples/words/bin/rake +9 -0
  197. data/examples/words/bin/setup +34 -0
  198. data/examples/words/bin/spring +15 -0
  199. data/examples/words/bin/update +29 -0
  200. data/examples/words/config.ru +5 -0
  201. data/examples/words/config/application.rb +30 -0
  202. data/examples/words/config/boot.rb +3 -0
  203. data/examples/words/config/cable.yml +9 -0
  204. data/examples/words/config/database.yml +25 -0
  205. data/examples/words/config/environment.rb +5 -0
  206. data/examples/words/config/environments/development.rb +45 -0
  207. data/examples/words/config/environments/production.rb +86 -0
  208. data/examples/words/config/environments/test.rb +42 -0
  209. data/examples/words/config/initializers/application_controller_renderer.rb +6 -0
  210. data/examples/words/config/initializers/assets.rb +11 -0
  211. data/examples/words/config/initializers/backtrace_silencers.rb +7 -0
  212. data/examples/words/config/initializers/cookies_serializer.rb +5 -0
  213. data/examples/words/config/initializers/filter_parameter_logging.rb +4 -0
  214. data/examples/words/config/initializers/inflections.rb +16 -0
  215. data/examples/words/config/initializers/mime_types.rb +4 -0
  216. data/examples/words/config/initializers/new_framework_defaults.rb +24 -0
  217. data/examples/words/config/initializers/session_store.rb +3 -0
  218. data/examples/words/config/initializers/synchromesh.rb +5 -0
  219. data/examples/words/config/initializers/wrap_parameters.rb +14 -0
  220. data/examples/words/config/locales/en.yml +23 -0
  221. data/examples/words/config/puma.rb +47 -0
  222. data/examples/words/config/routes.rb +5 -0
  223. data/examples/words/config/secrets.yml +22 -0
  224. data/examples/words/config/spring.rb +6 -0
  225. data/examples/words/db/migrate/20160921223808_create_words.rb +9 -0
  226. data/examples/words/db/schema.rb +28 -0
  227. data/examples/words/log/.keep +0 -0
  228. data/examples/words/public/404.html +67 -0
  229. data/examples/words/public/422.html +67 -0
  230. data/examples/words/public/500.html +66 -0
  231. data/examples/words/public/apple-touch-icon-precomposed.png +0 -0
  232. data/examples/words/public/apple-touch-icon.png +0 -0
  233. data/examples/words/public/favicon.ico +0 -0
  234. data/examples/words/public/robots.txt +5 -0
  235. data/examples/words/tmp/.keep +0 -0
  236. data/examples/words/vendor/assets/javascripts/.keep +0 -0
  237. data/examples/words/vendor/assets/stylesheets/.keep +0 -0
  238. data/hyper-mesh.gemspec +82 -0
  239. data/lib/active_record_base.rb +152 -0
  240. data/lib/enumerable/pluck.rb +6 -0
  241. data/lib/hyper-mesh.rb +62 -0
  242. data/lib/hypermesh/version.rb +3 -0
  243. data/lib/opal/equality_patches.rb +15 -0
  244. data/lib/opal/parse_patch.rb +14 -0
  245. data/lib/opal/set_patches.rb +8 -0
  246. data/lib/reactive_record/active_record/aggregations.rb +69 -0
  247. data/lib/reactive_record/active_record/associations.rb +111 -0
  248. data/lib/reactive_record/active_record/base.rb +9 -0
  249. data/lib/reactive_record/active_record/class_methods.rb +177 -0
  250. data/lib/reactive_record/active_record/error.rb +26 -0
  251. data/lib/reactive_record/active_record/instance_methods.rb +129 -0
  252. data/lib/reactive_record/active_record/public_columns_hash.rb +19 -0
  253. data/lib/reactive_record/active_record/reactive_record/base.rb +520 -0
  254. data/lib/reactive_record/active_record/reactive_record/collection.rb +517 -0
  255. data/lib/reactive_record/active_record/reactive_record/column_types.rb +67 -0
  256. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +218 -0
  257. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +532 -0
  258. data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +189 -0
  259. data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +62 -0
  260. data/lib/reactive_record/active_record/reactive_record/unscoped_collection.rb +16 -0
  261. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +299 -0
  262. data/lib/reactive_record/engine.rb +13 -0
  263. data/lib/reactive_record/interval.rb +190 -0
  264. data/lib/reactive_record/permissions.rb +102 -0
  265. data/lib/reactive_record/pry.rb +13 -0
  266. data/lib/reactive_record/reactive_scope.rb +18 -0
  267. data/lib/reactive_record/scope_description.rb +108 -0
  268. data/lib/reactive_record/serializers.rb +7 -0
  269. data/lib/reactive_record/server_data_cache.rb +347 -0
  270. data/lib/reactive_record/version.rb +3 -0
  271. data/lib/sources/hyper-mesh/pusher.js +98 -0
  272. data/lib/synchromesh/action_cable.rb +39 -0
  273. data/lib/synchromesh/client_drivers.rb +357 -0
  274. data/lib/synchromesh/configuration.rb +40 -0
  275. data/lib/synchromesh/connection.rb +144 -0
  276. data/lib/synchromesh/policy.rb +504 -0
  277. data/lib/synchromesh/reactive_record/permission_patches.rb +43 -0
  278. data/lib/synchromesh/synchromesh.rb +155 -0
  279. data/lib/synchromesh/synchromesh_controller.rb +154 -0
  280. data/logo.jpg +0 -0
  281. data/path_release_steps.md +0 -0
  282. data/reactive_record_test_app/Gemfile +15 -0
  283. data/reactive_record_test_app/Gemfile.lock +209 -0
  284. data/reactive_record_test_app/README.rdoc +261 -0
  285. data/reactive_record_test_app/Rakefile +7 -0
  286. data/reactive_record_test_app/app/assets/javascripts/application.rb +5 -0
  287. data/reactive_record_test_app/app/assets/javascripts/components/another_component.rb +24 -0
  288. data/reactive_record_test_app/app/assets/javascripts/components/empty_component.rb +6 -0
  289. data/reactive_record_test_app/app/assets/javascripts/components/todo_item_component.js.rb +16 -0
  290. data/reactive_record_test_app/app/assets/javascripts/components/todos_component.js.rb +42 -0
  291. data/reactive_record_test_app/app/assets/javascripts/components/todos_main_component.rb +49 -0
  292. data/reactive_record_test_app/app/assets/javascripts/react_js_test_only.js +21618 -0
  293. data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +2 -0
  294. data/reactive_record_test_app/app/assets/javascripts/spec/reactive_record_xspec.js.rb +42 -0
  295. data/reactive_record_test_app/app/assets/stylesheets/application.css +13 -0
  296. data/reactive_record_test_app/app/controllers/application_controller.rb +8 -0
  297. data/reactive_record_test_app/app/controllers/home_controller.rb +7 -0
  298. data/reactive_record_test_app/app/controllers/test_controller.rb +7 -0
  299. data/reactive_record_test_app/app/helpers/application_helper.rb +2 -0
  300. data/reactive_record_test_app/app/mailers/.gitkeep +0 -0
  301. data/reactive_record_test_app/app/models/.gitkeep +0 -0
  302. data/reactive_record_test_app/app/policies/application_policy.rb +5 -0
  303. data/reactive_record_test_app/app/views/components.rb +4 -0
  304. data/reactive_record_test_app/app/views/components/test.rb +18 -0
  305. data/reactive_record_test_app/app/views/home/index.html.erb +1 -0
  306. data/reactive_record_test_app/app/views/layouts/application.html.erb +17 -0
  307. data/reactive_record_test_app/app/views/models.rb +1 -0
  308. data/reactive_record_test_app/app/views/models/address.rb +13 -0
  309. data/reactive_record_test_app/app/views/models/comment.rb +19 -0
  310. data/reactive_record_test_app/app/views/models/todo_item.rb +36 -0
  311. data/reactive_record_test_app/app/views/models/user.rb +78 -0
  312. data/reactive_record_test_app/config.ru +33 -0
  313. data/reactive_record_test_app/config/application.rb +73 -0
  314. data/reactive_record_test_app/config/boot.rb +10 -0
  315. data/reactive_record_test_app/config/database.yml +25 -0
  316. data/reactive_record_test_app/config/environment.rb +5 -0
  317. data/reactive_record_test_app/config/environments/development.rb +43 -0
  318. data/reactive_record_test_app/config/environments/production.rb +70 -0
  319. data/reactive_record_test_app/config/environments/test.rb +41 -0
  320. data/reactive_record_test_app/config/initializers/backtrace_silencers.rb +7 -0
  321. data/reactive_record_test_app/config/initializers/inflections.rb +15 -0
  322. data/reactive_record_test_app/config/initializers/mime_types.rb +5 -0
  323. data/reactive_record_test_app/config/initializers/secret_token.rb +7 -0
  324. data/reactive_record_test_app/config/initializers/session_store.rb +8 -0
  325. data/reactive_record_test_app/config/initializers/wrap_parameters.rb +14 -0
  326. data/reactive_record_test_app/config/locales/en.yml +5 -0
  327. data/reactive_record_test_app/config/routes.rb +7 -0
  328. data/reactive_record_test_app/db/migrate/20150617002932_create_todo_items.rb +11 -0
  329. data/reactive_record_test_app/db/migrate/20150617134028_create_users.rb +14 -0
  330. data/reactive_record_test_app/db/migrate/20150729195556_add_address_to_user.rb +20 -0
  331. data/reactive_record_test_app/db/migrate/20150826142045_create_comments.rb +10 -0
  332. data/reactive_record_test_app/db/migrate/20150828172008_add_single_comment_to_todo_item.rb +5 -0
  333. data/reactive_record_test_app/db/migrate/20150908184118_add_address_id_to_user.rb +5 -0
  334. data/reactive_record_test_app/db/migrate/20150917220236_add_second_address_to_user.rb +10 -0
  335. data/reactive_record_test_app/db/migrate/20151009000111_add_test_data_attributes_to_user.rb +6 -0
  336. data/reactive_record_test_app/db/migrate/20160129182544_add_test_enum_to_user.rb +5 -0
  337. data/reactive_record_test_app/db/schema.rb +63 -0
  338. data/reactive_record_test_app/db/seeds.rb +60 -0
  339. data/reactive_record_test_app/public/404.html +26 -0
  340. data/reactive_record_test_app/public/422.html +26 -0
  341. data/reactive_record_test_app/public/500.html +25 -0
  342. data/reactive_record_test_app/public/favicon.ico +0 -0
  343. data/reactive_record_test_app/script/rails +6 -0
  344. data/reactive_record_test_app/spec-opal/active-record/aggregations_spec.rb +41 -0
  345. data/reactive_record_test_app/spec-opal/active-record/associations_spec.rb +75 -0
  346. data/reactive_record_test_app/spec-opal/active-record/base_spec.rb +126 -0
  347. data/reactive_record_test_app/spec-opal/active-record/dummy_value_spec.rb +27 -0
  348. data/reactive_record_test_app/spec-opal/active-record/edge_cases_spec.rb +116 -0
  349. data/reactive_record_test_app/spec-opal/active-record/enum_spec.rb +43 -0
  350. data/reactive_record_test_app/spec-opal/active-record/instance_methods_spec.rb +53 -0
  351. data/reactive_record_test_app/spec-opal/active-record/non_ar_aggregations_spec.rb +74 -0
  352. data/reactive_record_test_app/spec-opal/active-record/permissions_spec.rb +170 -0
  353. data/reactive_record_test_app/spec-opal/active-record/prerendering_spec.rb +49 -0
  354. data/reactive_record_test_app/spec-opal/active-record/reactive_record_load_spec.rb +23 -0
  355. data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +221 -0
  356. data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +125 -0
  357. data/reactive_record_test_app/spec-opal/active-record/scope_spec.rb +85 -0
  358. data/reactive_record_test_app/spec-opal/active-record/update_aggregations_spec.rb +76 -0
  359. data/reactive_record_test_app/spec-opal/active-record/update_attributes_spec.rb +186 -0
  360. data/reactive_record_test_app/spec-opal/active-record/virtual_methods_spec.rb +71 -0
  361. data/reactive_record_test_app/spec-opal/index.html.erb +11 -0
  362. data/reactive_record_test_app/spec-opal/spec_helper.js.rb +268 -0
  363. data/reactive_record_test_app/spec-opal/vendor/es5-shim.min.js +6 -0
  364. data/reactive_record_test_app/spec_dont_run/README.md +26 -0
  365. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzmany_to_many_spec_moved_to_main_suite.rb +30 -0
  366. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzrevert_record_spec_moved.rb +78 -0
  367. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_associations_spec_moved.rb +142 -0
  368. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_scopes_movedspec.rb +48 -0
  369. data/remote.md +115 -0
  370. data/spec/bin/firebug-2.0.13-fx.xpi +0 -0
  371. data/spec/component_helpers_xspec.rb +49 -0
  372. data/spec/factories/child_model.rb +5 -0
  373. data/spec/factories/comment.rb +5 -0
  374. data/spec/factories/test_models.rb +5 -0
  375. data/spec/factories/todo.rb +5 -0
  376. data/spec/factories/user.rb +5 -0
  377. data/spec/reactive_record/edge_cases_spec.rb +31 -0
  378. data/spec/reactive_record/factory.rb +62 -0
  379. data/spec/reactive_record/many_to_many_spec.rb +50 -0
  380. data/spec/reactive_record/play.rb +64 -0
  381. data/spec/reactive_record/pry_rescue_xspec.rb +48 -0
  382. data/spec/reactive_record/revert_spec.rb +112 -0
  383. data/spec/reactive_record/update_associations_spec.rb +189 -0
  384. data/spec/reactive_record/update_scopes_spec.rb +53 -0
  385. data/spec/spec_helper.rb +366 -0
  386. data/spec/support/component_helpers.rb +351 -0
  387. data/spec/synchromesh/column_types/column_type_spec.rb +302 -0
  388. data/spec/synchromesh/connection_spec.rb +144 -0
  389. data/spec/synchromesh/crud_access_regulation/broadcast_controls_access_spec.rb +105 -0
  390. data/spec/synchromesh/crud_access_regulation/model_policies_spec.rb +131 -0
  391. data/spec/synchromesh/examples/dictionary.rb +239 -0
  392. data/spec/synchromesh/examples/dictionary_with_client_scopes.rb +196 -0
  393. data/spec/synchromesh/examples/random_examples.rb +100 -0
  394. data/spec/synchromesh/examples/scoped_todos_spec.rb +167 -0
  395. data/spec/synchromesh/integration/authorization_spec.rb +111 -0
  396. data/spec/synchromesh/integration/default_scope_spec.rb +121 -0
  397. data/spec/synchromesh/integration/has_many_through_spec.rb +173 -0
  398. data/spec/synchromesh/integration/relationships_spec.rb +263 -0
  399. data/spec/synchromesh/integration/scope_spec.rb +553 -0
  400. data/spec/synchromesh/integration/synchromesh_spec.rb +80 -0
  401. data/spec/synchromesh/integration/test_components.rb +18 -0
  402. data/spec/synchromesh/integration/transports_spec.rb +308 -0
  403. data/spec/synchromesh/policies/auto_connect_spec.rb +60 -0
  404. data/spec/synchromesh/policies/auto_loader_spec.rb +34 -0
  405. data/spec/synchromesh/policies/policy_methods_spec.rb +85 -0
  406. data/spec/synchromesh/policies/regulate_all_broadcasts_spec.rb +315 -0
  407. data/spec/synchromesh/policies/regulate_broadcast_spec.rb +370 -0
  408. data/spec/synchromesh/policies/regulate_class_connection_spec.rb +50 -0
  409. data/spec/synchromesh/policies/regulate_instance_connection_spec.rb +66 -0
  410. data/spec/test_app/Gemfile +61 -0
  411. data/spec/test_app/Gemfile.lock +253 -0
  412. data/spec/test_app/Rakefile +6 -0
  413. data/spec/test_app/app/assets/javascripts/application.js +6 -0
  414. data/spec/test_app/app/assets/stylesheets/application.css +15 -0
  415. data/spec/test_app/app/controllers/application_controller.rb +13 -0
  416. data/spec/test_app/app/controllers/test_controller.rb +5 -0
  417. data/spec/test_app/app/models/_react_public_models.rb +2 -0
  418. data/spec/test_app/app/models/public/address.rb +13 -0
  419. data/spec/test_app/app/models/public/child_model.rb +3 -0
  420. data/spec/test_app/app/models/public/comment.rb +25 -0
  421. data/spec/test_app/app/models/public/test_model.rb +5 -0
  422. data/spec/test_app/app/models/public/todo.rb +6 -0
  423. data/spec/test_app/app/models/public/todo_item.rb +36 -0
  424. data/spec/test_app/app/models/public/user.rb +88 -0
  425. data/spec/test_app/app/policies/auto_loader_test_classa_policy.rb +3 -0
  426. data/spec/test_app/app/policies/auto_loader_test_classb_policy.rb +3 -0
  427. data/spec/test_app/app/policies/auto_loader_test_classc_policy.rb +3 -0
  428. data/spec/test_app/app/policies/auto_loader_test_classd_policy.rb +3 -0
  429. data/spec/test_app/app/views/components.rb +14 -0
  430. data/spec/test_app/app/views/components/show.rb +5 -0
  431. data/spec/test_app/app/views/layouts/application.html.erb +14 -0
  432. data/spec/test_app/bin/bundle +3 -0
  433. data/spec/test_app/bin/rails +4 -0
  434. data/spec/test_app/bin/rake +4 -0
  435. data/spec/test_app/bin/setup +29 -0
  436. data/spec/test_app/config.ru +4 -0
  437. data/spec/test_app/config/application.rb +42 -0
  438. data/spec/test_app/config/boot.rb +6 -0
  439. data/spec/test_app/config/cable.yml +10 -0
  440. data/spec/test_app/config/database.yml +47 -0
  441. data/spec/test_app/config/environment.rb +5 -0
  442. data/spec/test_app/config/environments/development.rb +41 -0
  443. data/spec/test_app/config/environments/production.rb +79 -0
  444. data/spec/test_app/config/environments/test.rb +42 -0
  445. data/spec/test_app/config/initializers/assets.rb +11 -0
  446. data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
  447. data/spec/test_app/config/initializers/cookies_serializer.rb +3 -0
  448. data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
  449. data/spec/test_app/config/initializers/inflections.rb +16 -0
  450. data/spec/test_app/config/initializers/mime_types.rb +4 -0
  451. data/spec/test_app/config/initializers/session_store.rb +3 -0
  452. data/spec/test_app/config/initializers/synchromesh.rb +11 -0
  453. data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
  454. data/spec/test_app/config/locales/en.yml +23 -0
  455. data/spec/test_app/config/routes.rb +61 -0
  456. data/spec/test_app/config/secrets.yml +22 -0
  457. data/spec/test_app/db/development.sqlite3 +0 -0
  458. data/spec/test_app/db/migrate/20160731182106_create_test_models.rb +75 -0
  459. data/spec/test_app/db/schema.rb +88 -0
  460. data/spec/test_app/db/seeds.rb +7 -0
  461. data/spec/test_app/lib/assets/.keep +0 -0
  462. data/spec/test_app/log/.keep +0 -0
  463. data/spec/test_app/public/404.html +67 -0
  464. data/spec/test_app/public/422.html +67 -0
  465. data/spec/test_app/public/500.html +66 -0
  466. data/spec/test_app/public/favicon.ico +0 -0
  467. data/spec/vendor/es5-shim.min.js +6 -0
  468. data/terminal.md +66 -0
  469. metadata +1175 -0
@@ -0,0 +1,80 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+
4
+ describe "HyperMesh", js: true do
5
+
6
+ before(:all) do
7
+ require 'pusher'
8
+ require 'pusher-fake'
9
+ Pusher.app_id = "MY_TEST_ID"
10
+ Pusher.key = "MY_TEST_KEY"
11
+ Pusher.secret = "MY_TEST_SECRET"
12
+ require "pusher-fake/support/base"
13
+
14
+ HyperMesh.configuration do |config|
15
+ config.transport = :pusher
16
+ config.channel_prefix = "synchromesh"
17
+ config.opts = {app_id: Pusher.app_id, key: Pusher.key, secret: Pusher.secret}.merge(PusherFake.configuration.web_options)
18
+ end
19
+ end
20
+
21
+ before(:each) do
22
+ # spec_helper resets the policy system after each test so we have to setup
23
+ # before each test
24
+ stub_const 'TestApplicationPolicy', Class.new
25
+ TestApplicationPolicy.class_eval do
26
+ always_allow_connection
27
+ regulate_all_broadcasts { |policy| policy.send_all }
28
+ end
29
+ size_window(:small, :portrait)
30
+ end
31
+
32
+ it "will synchronize on an attribute update" do
33
+ mount "TestComponent"
34
+ FactoryGirl.create(:test_model, test_attribute: "hello")
35
+ page.should have_content("hello")
36
+ TestModel.first.update_attribute(:test_attribute, 'goodby')
37
+ page.should have_content("goodby")
38
+ end
39
+
40
+ describe "the .all method" do
41
+ before(:each) do
42
+ mount "TestComponent"
43
+ 5.times { |i| FactoryGirl.create(:test_model, test_attribute: "I am item #{i}") }
44
+ page.should have_content("5 items")
45
+ end
46
+
47
+ it "will synchronize on create" do
48
+ TestModel.new(test_attribute: "I'm new here!").save
49
+ page.should have_content("6 items")
50
+ end
51
+
52
+ it "will synchronize on destroy" do
53
+ TestModel.first.destroy
54
+ page.should have_content("4 items")
55
+ end
56
+ end
57
+
58
+ describe "scopes" do
59
+ before(:each) do
60
+ mount "TestComponent", scope: :active
61
+ 5.times { |i| FactoryGirl.create(:test_model, test_attribute: "I am item #{i}", completed: false) }
62
+ page.should have_content("5 items")
63
+ end
64
+
65
+ it "will synchronize on create" do
66
+ TestModel.new(test_attribute: "I'm new here!", completed: false).save
67
+ page.should have_content("6 items")
68
+ end
69
+
70
+ it "will synchronize on destroy" do
71
+ TestModel.first.destroy
72
+ page.should have_content("4 items")
73
+ end
74
+
75
+ it "will syncronize on an update" do
76
+ TestModel.first.update_attribute(:completed, true)
77
+ page.should have_content("4 items")
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,18 @@
1
+ RSpec.configure do |config|
2
+ config.before(:all) do
3
+ on_client do
4
+ class TestComponent < React::Component::Base
5
+ param scope: :all
6
+ render(:div) do
7
+ div { "#{TestModel.send(params.scope).count} items" }
8
+ ul { TestModel.send(params.scope).each { |model| li { model.test_attribute }}}
9
+ end
10
+ end
11
+ class TestComponent2 < React::Component::Base
12
+ render do
13
+ "hello"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,308 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+
4
+ SKIP_MESSAGE = 'Pusher credentials not specified. '\
5
+ 'To run set env variable PUSHER=xxxx-yyy-zzz (app id - key - secret)'
6
+
7
+ def pusher_credentials
8
+ Hash[*[:app_id, :key, :secret].zip(ENV['PUSHER'].split('-')).flatten]
9
+ rescue
10
+ nil
11
+ end
12
+
13
+ describe "Transport Tests", js: true do
14
+
15
+ before(:each) do
16
+ 5.times { |i| FactoryGirl.create(:test_model, test_attribute: "I am item #{i}") }
17
+ end
18
+
19
+ before(:each) do
20
+ ApplicationController.acting_user = nil
21
+ # spec_helper resets the policy system after each test so we have to setup
22
+ # before each test
23
+ stub_const 'TestApplicationPolicy', Class.new
24
+ TestApplicationPolicy.class_eval do
25
+ regulate_class_connection { !self }
26
+ regulate_all_broadcasts { |policy| policy.send_all }
27
+ end
28
+ size_window(:small, :portrait)
29
+ on_client do
30
+ # patch HyperMesh.connect so it doesn't execute until we say so
31
+ # this is NOT used by the polling connection FYI
32
+ module HyperMesh
33
+ class << self
34
+ alias old_connect connect
35
+ def go_ahead_and_connect
36
+ old_connect(*@connect_args)
37
+ end
38
+ def connect(*args)
39
+ @connect_args = args
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ after(:each) do
47
+ Timecop.return
48
+ wait_for_ajax
49
+ end
50
+
51
+ context "Pusher-Fake" do
52
+ before(:all) do
53
+
54
+ require 'pusher'
55
+ require 'pusher-fake'
56
+ Pusher.app_id = "MY_TEST_ID"
57
+ Pusher.key = "MY_TEST_KEY"
58
+ Pusher.secret = "MY_TEST_SECRET"
59
+ require "pusher-fake/support/base"
60
+
61
+ HyperMesh.configuration do |config|
62
+ config.transport = :pusher
63
+ config.channel_prefix = "synchromesh"
64
+ config.opts = {
65
+ app_id: Pusher.app_id,
66
+ key: Pusher.key,
67
+ secret: Pusher.secret,
68
+ auth: {headers: {'X-CSRF-Token': "123"}},
69
+ authEndpoint: "rr/synchromesh-pusher-auth"
70
+ }.merge(PusherFake.configuration.web_options)
71
+ end
72
+ end
73
+
74
+ it "opens the connection" do
75
+ mount "TestComponent"
76
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
77
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
78
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
79
+ end
80
+
81
+ it "will not keep the temporary polled connection open" do
82
+ mount "TestComponent"
83
+ HyperMesh::Connection.active.should =~ ['TestApplication']
84
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
85
+ wait_for { HyperMesh::Connection.active }.to eq([])
86
+ end
87
+
88
+ it "sees the connection going offline" do
89
+ mount "TestComponent"
90
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
91
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
92
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
93
+ ApplicationController.acting_user = true
94
+ mount "TestComponent"
95
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
96
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.refresh_channels_every)
97
+ wait_for { HyperMesh::Connection.active }.to eq([])
98
+ end
99
+
100
+ it "receives change notifications" do
101
+ # one tricky thing about synchromesh is that we want to capture all
102
+ # changes to the database that might be made while the client connections
103
+ # is still being initialized. To do this we establish a server side
104
+ # queue of all messages sent between the time the page begins rendering
105
+ # until the connection is established.
106
+
107
+ # mount our test component
108
+ mount "TestComponent"
109
+ # add a model
110
+ TestModel.new(test_attribute: "I'm new here!").save
111
+ # until we connect there should only be 5 items
112
+ page.should have_content("5 items")
113
+ # okay now we can go ahead and connect (this runs on the client)
114
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
115
+ # once we connect it should change to 6
116
+ page.should have_content("6 items")
117
+ # now that we are connected the UI should keep updating
118
+ TestModel.new(test_attribute: "I'm also new here!").save
119
+ page.should have_content("7 items")
120
+ end
121
+
122
+ it "receives destroy notifications" do
123
+ mount "TestComponent"
124
+ TestModel.first.destroy
125
+ page.should have_content("5 items")
126
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
127
+ page.should have_content("4 items")
128
+ end
129
+ end
130
+
131
+ context "Simple Polling" do
132
+
133
+ before(:all) do
134
+ HyperMesh.configuration do |config|
135
+ config.transport = :simple_poller
136
+ # slow down the polling so wait_for_ajax works
137
+ config.opts = { seconds_between_poll: 2 }
138
+ end
139
+ end
140
+
141
+ it "opens the connection" do
142
+ mount "TestComponent"
143
+ HyperMesh::Connection.active.should =~ ['TestApplication']
144
+ end
145
+
146
+ it "sees the connection going offline" do
147
+ mount "TestComponent"
148
+ wait_for_ajax
149
+ ApplicationController.acting_user = true
150
+ mount "TestComponent"
151
+ HyperMesh::Connection.active.should =~ ['TestApplication']
152
+ Timecop.travel(Time.now+HyperMesh.expire_polled_connection_in)
153
+ wait(10.seconds).for { HyperMesh::Connection.active }.to eq([])
154
+ end
155
+
156
+ it "receives change notifications" do
157
+ mount "TestComponent"
158
+ TestModel.new(test_attribute: "I'm new here!").save
159
+ HyperMesh::Connection.active.should =~ ['TestApplication']
160
+ page.should have_content("6 items")
161
+ HyperMesh::Connection.active.should =~ ['TestApplication']
162
+ end
163
+
164
+ it "receives destroy notifications" do
165
+ mount "TestComponent"
166
+ TestModel.first.destroy
167
+ page.should have_content("4 items")
168
+ end
169
+
170
+ end
171
+
172
+ context "Real Pusher Account", skip: (pusher_credentials ? false : SKIP_MESSAGE) do
173
+
174
+ before(:each) do
175
+ require 'pusher'
176
+ Object.send(:remove_const, :PusherFake) if defined?(PusherFake)
177
+
178
+ HyperMesh.configuration do |config|
179
+ config.transport = :pusher
180
+ config.channel_prefix = "synchromesh"
181
+ config.opts = pusher_credentials
182
+ end
183
+ end
184
+
185
+ it "opens the connection" do
186
+ mount "TestComponent"
187
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
188
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
189
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
190
+ end
191
+
192
+ it "will not keep the temporary polled connection open" do
193
+ mount "TestComponent"
194
+ HyperMesh::Connection.active.should =~ ['TestApplication']
195
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
196
+ wait_for { HyperMesh::Connection.active }.to eq([])
197
+ end
198
+
199
+ it "sees the connection going offline" do
200
+ mount "TestComponent"
201
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
202
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
203
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
204
+ ApplicationController.acting_user = true
205
+ mount "TestComponent"
206
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
207
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.refresh_channels_every)
208
+ wait_for { HyperMesh::Connection.active }.to eq([])
209
+ end
210
+
211
+ it "receives change notifications" do
212
+ # one tricky thing about synchromesh is that we want to capture all
213
+ # changes to the database that might be made while the client connections
214
+ # is still being initialized. To do this we establish a server side
215
+ # queue of all messages sent between the time the page begins rendering
216
+ # until the connection is established.
217
+
218
+ # mount our test component
219
+ mount "TestComponent"
220
+ # add a model
221
+ TestModel.new(test_attribute: "I'm new here!").save
222
+ # until we connect there should only be 5 items
223
+ page.should have_content("5 items")
224
+ # okay now we can go ahead and connect (this runs on the client)
225
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
226
+ # once we connect it should change to 6
227
+ page.should have_content("6 items")
228
+ # now that we are connected the UI should keep updating
229
+ TestModel.new(test_attribute: "I'm also new here!").save
230
+ page.should have_content("7 items")
231
+ end
232
+
233
+ it "receives destroy notifications" do
234
+ mount "TestComponent"
235
+ TestModel.first.destroy
236
+ page.should have_content("5 items")
237
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
238
+ page.should have_content("4 items")
239
+ end
240
+
241
+ end
242
+
243
+ context "Action Cable" do
244
+
245
+ before(:each) do
246
+ HyperMesh.configuration do |config|
247
+ config.transport = :action_cable
248
+ config.channel_prefix = "synchromesh"
249
+ end
250
+ end
251
+
252
+ it "opens the connection" do
253
+ mount "TestComponent"
254
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
255
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
256
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
257
+ end
258
+
259
+ it "will not keep the temporary polled connection open" do
260
+ mount "TestComponent"
261
+ HyperMesh::Connection.active.should =~ ['TestApplication']
262
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
263
+ wait_for { HyperMesh::Connection.active }.to eq([])
264
+ end
265
+
266
+ it "sees the connection going offline" do
267
+ mount "TestComponent"
268
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
269
+ Timecop.travel(Time.now+HyperMesh::Connection.transport.expire_new_connection_in)
270
+ wait_for { HyperMesh::Connection.active }.to eq(['TestApplication'])
271
+ ApplicationController.acting_user = true
272
+ mount "TestComponent"
273
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
274
+ wait_for { HyperMesh::Connection.active }.to eq([])
275
+ end
276
+
277
+ it "receives change notifications" do
278
+ # one tricky thing about synchromesh is that we want to capture all
279
+ # changes to the database that might be made while the client connections
280
+ # is still being initialized. To do this we establish a server side
281
+ # queue of all messages sent between the time the page begins rendering
282
+ # until the connection is established.
283
+
284
+ # mount our test component
285
+ mount "TestComponent"
286
+ # add a model
287
+ TestModel.new(test_attribute: "I'm new here!").save
288
+ # until we connect there should only be 5 items
289
+ page.should have_content("5 items")
290
+ # okay now we can go ahead and connect (this runs on the client)
291
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
292
+ # once we connect it should change to 6
293
+ page.should have_content("6 items")
294
+ # now that we are connected the UI should keep updating
295
+ TestModel.new(test_attribute: "I'm also new here!").save
296
+ page.should have_content("7 items")
297
+ end
298
+
299
+ it "receives destroy notifications" do
300
+ mount "TestComponent"
301
+ TestModel.first.destroy
302
+ page.should have_content("5 items")
303
+ evaluate_ruby "HyperMesh.go_ahead_and_connect"
304
+ page.should have_content("4 items")
305
+ end
306
+
307
+ end
308
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'channel auto connect' do
4
+
5
+ before(:each) do
6
+ stub_const 'ApplicationPolicy', Class.new
7
+ stub_const 'TestModelPolicy', Class.new
8
+ stub_const 'TestModel', Class.new
9
+ TestModel.class_eval do
10
+ def initialize(id)
11
+ @id = id
12
+ end
13
+ def self.find(id)
14
+ new(id)
15
+ end
16
+ def id
17
+ @id
18
+ end
19
+ end
20
+ end
21
+
22
+ it 'will autoconnect' do
23
+ ApplicationPolicy.always_allow_connection
24
+ expect(HyperMesh::AutoConnect.channels(0, nil)).to eq(["Application"])
25
+ end
26
+
27
+ it 'will autoconnect to multiple channels' do
28
+ ApplicationPolicy.regulate_class_connection { true }
29
+ ApplicationPolicy.regulate_class_connection('AnotherChannel') { true }
30
+ expect(HyperMesh::AutoConnect.channels(0, nil)).to eq(['Application', 'AnotherChannel'])
31
+ end
32
+
33
+ it 'will not autoconnect a class channel if disabled' do
34
+ ApplicationPolicy.regulate_class_connection(auto_connect: false) { true }
35
+ ApplicationPolicy.regulate_instance_connections(TestModel) { self }
36
+ expect(HyperMesh::AutoConnect.channels(0, TestModel.find(1))).to eq([['TestModel',1]])
37
+ end
38
+
39
+ it 'will not autoconnect an instance channel if disabled' do
40
+ ApplicationPolicy.regulate_class_connection { true }
41
+ ApplicationPolicy.regulate_instance_connections(TestModel, auto_connect: false) { self }
42
+ expect(HyperMesh::AutoConnect.channels(0, TestModel.find(1))).to eq(['Application'])
43
+ end
44
+
45
+ it 'can autoconnect to an instance' do
46
+ TestModelPolicy.regulate_instance_connections { self }
47
+ expect(HyperMesh::AutoConnect.channels(0, TestModel.find(1))).to eq([['TestModel', 1]])
48
+ end
49
+
50
+ it 'can autoconnect to an instance and class' do
51
+ TestModelPolicy.always_allow_connection
52
+ TestModelPolicy.regulate_instance_connections { self }
53
+ expect(HyperMesh::AutoConnect.channels(0, TestModel.find(1))).to eq(['TestModel', ['TestModel', 1]])
54
+ end
55
+
56
+ it 'can autoconnect to multiple instances' do
57
+ TestModelPolicy.regulate_instance_connections { [TestModel.find(1), TestModel.find(2)] if self == 'acting_user'}
58
+ expect(HyperMesh::AutoConnect.channels(0, 'acting_user')).to eq([['TestModel', 1], ['TestModel', 2]])
59
+ end
60
+ end