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,125 @@
1
+ require 'spec_helper'
2
+
3
+ describe "simple record update and save" do
4
+
5
+ it "can find an existing model" do
6
+ React::IsomorphicHelpers.load_context
7
+ ReactiveRecord.load do
8
+ User.find_by_email("mitch@catprint.com").first_name
9
+ end.then do |first_name|
10
+ expect(first_name).to be("Mitch")
11
+ end
12
+ end
13
+
14
+ it "doesn't find the model changed" do
15
+ expect(User.find_by_email("mitch@catprint.com")).not_to be_changed
16
+ end
17
+
18
+ it "the model is not new" do
19
+ expect(User.find_by_email("mitch@catprint.com")).not_to be_new
20
+ end
21
+
22
+ it "the model is not saving" do
23
+ expect(User.find_by_email("mitch@catprint.com")).not_to be_saving
24
+ end
25
+
26
+ it "an attribute can be changed" do
27
+ mitch = User.find_by_email("mitch@catprint.com")
28
+ mitch.first_name = "Mitchell"
29
+ expect(mitch.first_name).to eq("Mitchell")
30
+ end
31
+
32
+ it "and the attribute will be marked as changed"do
33
+ expect(User.find_by_email("mitch@catprint.com")).to be_changed
34
+ end
35
+
36
+ it "saving? is true while the model is being saved" do
37
+ mitch = User.find_by_email("mitch@catprint.com")
38
+ mitch.save.then {}.tap { expect(mitch).to be_saving }
39
+ end
40
+
41
+ it "after saving changed? will be false" do
42
+ expect(User.find_by_email("mitch@catprint.com")).not_to be_changed
43
+ end
44
+
45
+ it "after saving saving? will be false" do
46
+ expect(User.find_by_email("mitch@catprint.com")).not_to be_saving
47
+ end
48
+
49
+ it "the data has been persisted to the database" do
50
+ React::IsomorphicHelpers.load_context
51
+ ReactiveRecord.load do
52
+ User.find_by_email("mitch@catprint.com").first_name
53
+ end.then do |first_name|
54
+ expect(first_name).to eq("Mitchell")
55
+ end
56
+ end
57
+
58
+ it "after saving within the block saving? will be false" do
59
+ mitchell = User.find_by_email("mitch@catprint.com")
60
+ mitchell.first_name = "Mitch"
61
+ mitchell.save.then do
62
+ expect(mitchell).not_to be_saving
63
+ end
64
+ end
65
+
66
+ async "the save block receives the correct block parameters" do
67
+ mitch = User.find_by_email("mitch@catprint.com")
68
+ mitch.first_name = "Mitchell"
69
+ mitch.save do | success, message, models |
70
+ async do
71
+ expect(success).to be_truthy
72
+ expect(message).to be_nil
73
+ expect(models).to eq([mitch])
74
+ expect(mitch.errors).to be_empty
75
+ end
76
+ end
77
+ end
78
+
79
+ it "the save promise receives the response hash" do
80
+ mitch = User.find_by_email("mitch@catprint.com")
81
+ mitch.first_name = "Mitch"
82
+ mitch.save.then do | response |
83
+ expect(response[:success]).to be_truthy
84
+ expect(response[:message]).to be_nil
85
+ expect(response[:models]).to eq([mitch])
86
+ end
87
+ end
88
+
89
+ async "the save will fail if validation fails" do
90
+ mitch = User.find_by_email("mitch@catprint.com")
91
+ mitch.email = "mitch at catprint dot com"
92
+ mitch.save do |success, message, models|
93
+ async do
94
+ expect(success).to be_falsy
95
+ expect(message).to be_present
96
+ expect(models).to eq([mitch])
97
+ end
98
+ end
99
+ end
100
+
101
+ it "validation errors are put in the errors object" do
102
+ mitch = User.find_by_email("mitch@catprint.com")
103
+ mitch.email = "mitch at catprint dot com"
104
+ mitch.save.then do |success, message, models|
105
+ expect(mitch.errors[:email]).to eq(["is invalid"])
106
+ end
107
+ end
108
+
109
+ it "within the save block saving? is false if validation fails" do
110
+ mitch = User.find_by_email("mitch@catprint.com")
111
+ mitch.email = "mitch at catprint dot com"
112
+ mitch.save.then do
113
+ expect(mitch).not_to be_saving
114
+ end
115
+ end
116
+
117
+ it "if validation fails changed? is still true" do
118
+ mitch = User.find_by_email("mitch@catprint.com")
119
+ mitch.email = "mitch at catprint dot com"
120
+ mitch.save.then do
121
+ expect(mitch).to be_changed
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe "can scope models" do
4
+
5
+ it "scopes todos by string" do
6
+ React::IsomorphicHelpers.load_context
7
+ ReactiveRecord.load do
8
+ User.find_by_email("mitch@catprint.com").todo_items.find_string("mitch").first.title
9
+ end.then do |title|
10
+ expect(title).to be("a todo for mitch")
11
+ end
12
+ end
13
+
14
+ it "can apply multiple simple scopes" do
15
+ React::IsomorphicHelpers.load_context
16
+ ReactiveRecord.load do
17
+ User.find_by_email("mitch@catprint.com").todo_items.active.important.first.title
18
+ end.then do |title|
19
+ expect(title).to be("another todo for mitch")
20
+ end
21
+ end
22
+
23
+ it "can apply multiple scopes" do
24
+ ReactiveRecord.load do
25
+ User.find_by_email("mitch@catprint.com").todo_items.find_string("mitch").find_string("another").count
26
+ end.then do |count|
27
+ expect(count).to be(1)
28
+ end
29
+ end
30
+
31
+ it "can apply scopes to model" do
32
+ ReactiveRecord.load do
33
+ TodoItem.find_string("mitch").first.title
34
+ end.then do |title|
35
+ expect(title).to be("a todo for mitch")
36
+ end
37
+ end
38
+
39
+ it "works for an empty set" do
40
+ ReactiveRecord.load do
41
+ User.find_by_email("adamg@catprint.com").todo_items.find_string("mitch").find_string("another").collect do |item|
42
+ item.title
43
+ end
44
+ end.then do |result|
45
+ expect(result).to eq([])
46
+ end
47
+ end
48
+
49
+
50
+ it "works for an empty set even if other items are retrieved" do
51
+ React::IsomorphicHelpers.load_context
52
+ ReactiveRecord.load do
53
+ user = User.find(3)
54
+ user.todo_items.find_string("mitch").find_string("another").collect do |item|
55
+ item.title
56
+ end
57
+ end.then do |result|
58
+ expect(result).to eq([])
59
+ end
60
+ end
61
+
62
+ it "reports that a collection is loading" do
63
+ React::IsomorphicHelpers.load_context
64
+ expect(User.find_by_email("mitch@catprint.com").todo_items).to be_loading
65
+ end
66
+
67
+ it "reports that a collection has loaded" do
68
+ ReactiveRecord.load do
69
+ User.find_by_email("mitch@catprint.com").todo_items.first.title
70
+ end.then do |title|
71
+ expect(User.find_by_email("mitch@catprint.com").todo_items).to be_loaded
72
+ end
73
+ end
74
+
75
+ it "can return the count of a collection without loading the collection" do
76
+ React::IsomorphicHelpers.load_context
77
+ ReactiveRecord.load do
78
+ User.find_by_email("mitch@catprint.com").todo_items.count
79
+ end.then do |count|
80
+ expect(count).to be(2)
81
+ expect(User.find_by_email("mitch@catprint.com").todo_items).to be_loading
82
+ end
83
+ end # BROKEN BROKEN BROKEN
84
+
85
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe "updating aggregations" do
4
+
5
+ before(:all) do
6
+ React::IsomorphicHelpers.load_context
7
+ User.new({first_name: "Jon", last_name: "Weaver"})
8
+ end
9
+
10
+ it "a hash can be assigned to initialize an aggregate" do
11
+ expect(User.new(address: Address.new(zip:12345)).address.zip).to eq(12345)
12
+ end
13
+
14
+ it "a new model will have a blank aggregate" do
15
+ expect(User.find_by_first_name("Jon").address.attributes[:zip]).to be_blank
16
+ end
17
+
18
+ it "an aggregate can be updated through the parent model" do
19
+ User.find_by_first_name("Jon").address.zip = "14609"
20
+ expect(User.find_by_first_name("Jon").address.zip).to eq("14609")
21
+ end
22
+
23
+ async "saving a model, saves the aggregate values" do
24
+ User.find_by_first_name("Jon").save.then do
25
+ React::IsomorphicHelpers.load_context
26
+ ReactiveRecord.load do
27
+ User.find_by_first_name("Jon").address.zip
28
+ end.then do |zip|
29
+ async { expect(zip).to eq("14609") }
30
+ end
31
+ end
32
+ end
33
+
34
+ it "an aggregate can be assigned" do
35
+ user = User.find_by_first_name("Jon")
36
+ user.address = Address.new({zip: "14622", city: "Rochester"})
37
+ expect([user.address.zip, user.address.city]).to eq(["14622", "Rochester"])
38
+ end
39
+
40
+ async "and saving the model will save the address" do
41
+ User.find_by_first_name("Jon").save.then do
42
+ React::IsomorphicHelpers.load_context
43
+ ReactiveRecord.load do
44
+ [User.find_by_first_name("Jon").address.zip, User.find_by_first_name("Jon").address.city]
45
+ end.then do |zip_and_city|
46
+ async { expect(zip_and_city).to eq(["14622", "Rochester"]) }
47
+ end
48
+ end
49
+ end
50
+
51
+ it "two aggregates of the same type don't not get mixed up" do
52
+ ReactiveRecord.load do
53
+ User.find_by_first_name("Jon").address2.zip
54
+ end.then do |zip|
55
+ expect(zip).to be_nil
56
+ end
57
+ end
58
+
59
+ async "can assign a model to an aggregate attribute" do
60
+ address = Address.new({zip: "14622", city: "Rochester"})
61
+ address.save do
62
+ user = User.new
63
+ user.address = address
64
+ ReactiveRecord.load do
65
+ user.verify_zip
66
+ end.then do |value|
67
+ async { expect(value).to eq("14622") }
68
+ end
69
+ end
70
+ end
71
+
72
+ after(:all) do
73
+ Promise.when(Address.all.last.destroy, User.find_by_first_name("Jon").destroy)
74
+ end
75
+
76
+ end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ describe "creating and updating a record" do
4
+
5
+ before(:all) do
6
+ React::IsomorphicHelpers.load_context
7
+ end
8
+
9
+ it "can create a new record" do
10
+ jon = User.new({first_name: "Jon", last_name: "Weaver"})
11
+ expect(jon.attributes).to eq({first_name: "Jon", last_name: "Weaver"})
12
+ end
13
+
14
+ it "after creating it will have no id" do
15
+ jon = User.find_by_first_name("Jon")
16
+ expect(jon.id).to be_nil
17
+ end
18
+
19
+ it "after creating it will be new" do
20
+ jon = User.find_by_first_name("Jon")
21
+ expect(jon).to be_new
22
+ end
23
+
24
+ it "after creating it will be changed" do
25
+ jon = User.find_by_first_name("Jon")
26
+ expect(jon.changed?).to be_truthy
27
+ end
28
+
29
+ it "it can calculate server side attributes before saving" do
30
+ ReactiveRecord.load do
31
+ User.find_by_first_name("Jon").detailed_name
32
+ end.then do |name|
33
+ expect(name).to eq("J. Weaver")
34
+ end
35
+ end
36
+
37
+ it "can be saved and will have an id" do
38
+ jon = User.find_by_first_name("Jon")
39
+ jon.save.then { expect(jon.id).not_to be_nil }
40
+ end
41
+
42
+ it "can be reloaded" do
43
+ React::IsomorphicHelpers.load_context
44
+ ReactiveRecord.load do
45
+ User.find_by_first_name("Jon").last_name
46
+ end.then do |last_name|
47
+ expect(last_name).to be("Weaver")
48
+ end
49
+ end
50
+
51
+ it "will still have an id" do
52
+ jon = User.find_by_first_name("Jon")
53
+ expect(jon.id).not_to be_nil
54
+ end
55
+
56
+ it "can be updated and it will get new server side values before saving" do
57
+ jon = User.find_by_last_name("Weaver")
58
+ jon.email = "jonny@catprint.com"
59
+ ReactiveRecord.load do
60
+ jon.detailed_name
61
+ end.then do |detailed_name|
62
+ expect(detailed_name).to eq("J. Weaver - jonny@catprint.com")
63
+ end
64
+ end
65
+
66
+ it "can be updated but it won't see the new server side values" do
67
+ jon = User.find_by_last_name("Weaver")
68
+ jon.email = "jon@catprint.com"
69
+ ReactiveRecord.load do
70
+ jon.detailed_name
71
+ end.then do |detailed_name|
72
+ expect(detailed_name).to eq("J. Weaver - jonny@catprint.com")
73
+ end
74
+ end
75
+
76
+ it "but the bang method forces a refresh" do
77
+ jon = User.find_by_last_name("Weaver")
78
+ ReactiveRecord.load do
79
+ jon.detailed_name! unless jon.detailed_name == "J. Weaver - jon@catprint.com"
80
+ jon.detailed_name
81
+ end.then do |detailed_name|
82
+ expect(detailed_name).to eq("J. Weaver - jon@catprint.com")
83
+ end
84
+ end
85
+
86
+ async "can be saved and will remember the new values" do
87
+ jon = User.find_by_last_name("Weaver")
88
+ jon.email = "jon@catprint.com"
89
+ jon.save.then do
90
+ React::IsomorphicHelpers.load_context
91
+ ReactiveRecord.load do
92
+ User.find_by_last_name("Weaver").email
93
+ end.then do |email|
94
+ async { expect(email).to be("jon@catprint.com") }
95
+ end
96
+ end
97
+ end
98
+
99
+ it "can be deleted" do
100
+ jon = User.find_by_last_name("Weaver")
101
+ jon.destroy.then { expect(jon.id).to be_nil }
102
+ end
103
+
104
+ it "does not exist in the database" do
105
+ React::IsomorphicHelpers.load_context
106
+ ReactiveRecord.load do
107
+ User.find_by_first_name("Jon").id
108
+ end.then do |id|
109
+ expect(id).to be_nil
110
+ end
111
+ end
112
+
113
+ async "it can have a one way writable attribute (might be used for a password - see the user model)" do
114
+ jon = User.new({name: "Jon Weaver"})
115
+ jon.save.then do
116
+ React::IsomorphicHelpers.load_context
117
+ ReactiveRecord.load do
118
+ User.find_by_last_name("Weaver").first_name
119
+ end.then do |first_name|
120
+ async { expect(first_name).to be("Jon") }
121
+ end
122
+ end
123
+ end
124
+
125
+ async "load method with no block and one attribute" do
126
+ React::IsomorphicHelpers.load_context
127
+ user = User.find_by_email("mitch@catprint.com")
128
+ user.first_name = "Robert"
129
+ user.todo_items << TodoItem.new(title: "test")
130
+ user.load(:detailed_name).then do |detailed_name|
131
+ async do
132
+ expect(detailed_name).to be("R. VanDuyn - mitch@catprint.com (3 todos)")
133
+ end
134
+ end
135
+ end #BROKEN BROKEN BROKEN
136
+
137
+ async "load method with no block and multiple attributes" do
138
+ React::IsomorphicHelpers.load_context
139
+ user = User.find_by_email("mitch@catprint.com")
140
+ user.first_name = "Robert"
141
+ user.load(:detailed_name, :name).then do |detailed_name, name|
142
+ async do
143
+ expect(detailed_name).to be("R. VanDuyn - mitch@catprint.com (2 todos)")
144
+ expect(name).to be("Robert VanDuyn")
145
+ end
146
+ end
147
+ end
148
+
149
+ async "load method with a block and one attribute" do
150
+ React::IsomorphicHelpers.load_context
151
+ loop_count = 0
152
+ user = User.find_by_email("mitch@catprint.com")
153
+ user.first_name = "Robert"
154
+ user.load(:detailed_name) do |detailed_name|
155
+ loop_count += 1
156
+ detailed_name
157
+ end.then do |detailed_name|
158
+ async do
159
+ expect(loop_count).to eq(2)
160
+ expect(detailed_name).to be("R. VanDuyn - mitch@catprint.com (2 todos)")
161
+ end
162
+ end
163
+ end
164
+
165
+ async "load method with a block and multiple attributes" do
166
+ React::IsomorphicHelpers.load_context
167
+ loop_count = 0
168
+ user = User.find_by_email("mitch@catprint.com")
169
+ user.first_name = "Robert"
170
+ user.load(:detailed_name, :name) do |*args|
171
+ loop_count += 1
172
+ args
173
+ end.then do |detailed_name, name|
174
+ async do
175
+ expect(loop_count).to eq(2)
176
+ expect(detailed_name).to be("R. VanDuyn - mitch@catprint.com (2 todos)")
177
+ expect(name).to be("Robert VanDuyn")
178
+ end
179
+ end
180
+ end
181
+
182
+ after(:all) do
183
+ User.find_by_last_name("Weaver").destroy
184
+ end
185
+
186
+ end