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,43 @@
1
+ require 'spec_helper'
2
+
3
+ use_case "reading and writting enums" do
4
+
5
+ async "can change the enum and read it back" do
6
+ React::IsomorphicHelpers.load_context
7
+ set_acting_user "super-user"
8
+ user = User.find(1)
9
+ user.test_enum = :no
10
+ user.save.then do
11
+ React::IsomorphicHelpers.load_context
12
+ ReactiveRecord.load do
13
+ User.find(1).test_enum
14
+ end.then do |test_enum|
15
+ async { expect(test_enum).to eq(:no) }
16
+ end
17
+ end
18
+ end
19
+
20
+ async "can set it back" do
21
+ React::IsomorphicHelpers.load_context
22
+ set_acting_user "super-user"
23
+ user = User.find(1)
24
+ user.test_enum = :yes
25
+ user.save.then do
26
+ React::IsomorphicHelpers.load_context
27
+ ReactiveRecord.load do
28
+ User.find(1).test_enum
29
+ end.then do |test_enum|
30
+ async { expect(test_enum).to eq(:yes) }
31
+ end
32
+ end
33
+ end
34
+
35
+ it "can change it back" do
36
+ user = User.find(1)
37
+ user.test_enum = :yes
38
+ user.save.then do |success|
39
+ expect(success).to be_truthy
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ #Opal::RSpec::Runner.autorun
3
+ class Thing < ActiveRecord::Base
4
+ end
5
+
6
+ describe "ActiveRecord" do
7
+ before(:each) { React::IsomorphicHelpers.load_context }
8
+ let(:instance) { Thing.new({attr1: 1, attr2: 2, id: 123}) }
9
+ after(:each) { React::API.clear_component_class_cache }
10
+
11
+ # uncomment if you are having trouble with tests failing. One non-async test must pass for things to work
12
+
13
+ # describe "a passing dummy test" do
14
+ # it "passes" do
15
+ # expect(true).to be(true)
16
+ # end
17
+ # end
18
+
19
+ describe "Instance Methods" do
20
+
21
+ it "will have the attributes loaded" do
22
+ expect(instance.attr1).to eq(1)
23
+ end
24
+
25
+ it "will not have a primary key if loaded from a hash" do
26
+ expect(instance.id).to be(nil)
27
+ end
28
+
29
+ it "reports being changed if new" do
30
+ expect(instance.changed?).to be_truthy
31
+ end
32
+
33
+ it "reports not being changed if loaded from db" do
34
+ expect(Thing.find(123).changed?).to be_falsy
35
+ end
36
+
37
+ it "reports being changed, if I do change it" do
38
+ Thing.find(1234).my_attribute = "new"
39
+ expect(Thing.find(1234).changed?).to be_truthy
40
+ end
41
+
42
+ it "does not think things are destroyed" do
43
+ expect(instance).not_to be_destroyed
44
+ end
45
+
46
+ it "can destroy things" do
47
+ instance.destroy
48
+ expect(instance).to be_destroyed
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe "using non-ar aggregations" do
4
+
5
+ it "is time to create a new user and add some data to it" do
6
+ React::IsomorphicHelpers.load_context
7
+ expect(User.new(first_name: "Data", data: TestData.new("hello", 3)).data.big_string).to eq("hellohellohello")
8
+ end
9
+
10
+ async "can be saved and restored" do
11
+ User.find_by_first_name("Data").save.then do
12
+ React::IsomorphicHelpers.load_context
13
+ ReactiveRecord.load do
14
+ User.find_by_first_name("Data").data
15
+ end.then do |data|
16
+ async { expect(data.big_string).to eq("hellohellohello") }
17
+ end
18
+ end
19
+ end
20
+
21
+ async "is time to change it, and force the save" do
22
+ user = User.find_by_first_name("Data")
23
+ user.data.string = "goodby"
24
+ user.save(force: true).then do
25
+ React::IsomorphicHelpers.load_context
26
+ ReactiveRecord.load do
27
+ User.find_by_first_name("Data").data
28
+ end.then do |data|
29
+ async { expect(data.big_string).to eq("goodbygoodbygoodby") }
30
+ end
31
+ end
32
+ end
33
+
34
+ async "is time to change the value completely and save it (no force needed)" do
35
+ user = User.find_by_first_name("Data")
36
+ user.data = TestData.new("the end", 1)
37
+ user.save.then do
38
+ React::IsomorphicHelpers.load_context
39
+ ReactiveRecord.load do
40
+ User.find_by_first_name("Data").data
41
+ end.then do |data|
42
+ async { expect(data.big_string).to eq("the end") }
43
+ end
44
+ end
45
+ end
46
+
47
+ async "is time to delete the value and see if returns nil after saving" do
48
+ user = User.find_by_first_name("Data")
49
+ user.data = nil
50
+ user.save.then do
51
+ React::IsomorphicHelpers.load_context
52
+ ReactiveRecord.load do
53
+ User.find_by_first_name("Data").data
54
+ end.then do |data|
55
+ async { expect(data).to be_nil }
56
+ end
57
+ end
58
+ end
59
+
60
+ it "is time to delete our user" do
61
+ User.find_by_first_name("Data").destroy.then do
62
+ expect(User.find_by_first_name("Data")).to be_destroyed
63
+ end
64
+ end
65
+
66
+ it "is time to see to make sure a nil aggregate that has never had a value returns nil" do
67
+ ReactiveRecord.load do
68
+ User.find_by_email("mitch@catprint.com").data
69
+ end.then do |data|
70
+ expect(data).to be_nil
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+ require 'hyper-trace'
3
+
4
+ # for testing convienience we do an odd thing: if acting_user is nil we treat it as a super user
5
+ # other wise we can provide an email which will be converted by the application controller into the acting_user
6
+
7
+ describe "checking permissions" do
8
+
9
+ it "will use the default permissions" do
10
+ React::IsomorphicHelpers.load_context
11
+ set_acting_user "super-user"
12
+ ReactiveRecord.load do
13
+ User.find_by_email("todd@catprint.com").id
14
+ end.then do |id|
15
+ expect(id).not_to be_nil
16
+ end
17
+ end
18
+
19
+ it "will reject a view by the wrong user" do
20
+ React::IsomorphicHelpers.load_context
21
+ ReactiveRecord.load do |failure|
22
+ if failure
23
+ failure
24
+ else
25
+ set_acting_user "todd@catprint.com"
26
+ User.find_by_email("mitch@catprint.com").id
27
+ end
28
+ end.then do |failure|
29
+ set_acting_user "super-user"
30
+ expect(failure).to include("ReactiveRecord::AccessViolation")
31
+ end
32
+ end
33
+
34
+ it "will honor a correct view permission" do
35
+ ReactiveRecord.load do
36
+ set_acting_user 'mitch@catprint.com'
37
+ User.find_by_first_name("Mitch").last_name
38
+ end.then do |last_name|
39
+ set_acting_user "super-user"
40
+ expect(last_name).to eq("VanDuyn")
41
+ end
42
+ end
43
+
44
+ it "will show data if the user is correct" do
45
+ ReactiveRecord.load do
46
+ set_acting_user 'mitch@catprint.com'
47
+ TodoItem.find_by_title("a todo for mitch").description
48
+ end.then do |description|
49
+ set_acting_user "super-user"
50
+ expect(description).not_to be_nil
51
+ end
52
+ end
53
+
54
+ it "will not show data if the user is not correct" do
55
+ React::IsomorphicHelpers.load_context
56
+ ReactiveRecord.load do |failure|
57
+ if failure
58
+ failure
59
+ else
60
+ set_acting_user 'todd@catprint.com'
61
+ TodoItem.find_by_title("a todo for mitch").description
62
+ end
63
+ end.then do |failure|
64
+ set_acting_user "super-user"
65
+ expect(failure).to include("ReactiveRecord::AccessViolation")
66
+ end
67
+ end
68
+
69
+ it "is time to make sure mitch is loaded" do
70
+ ReactiveRecord.load do
71
+ User.find_by_email("mitch@catprint.com").todo_items.collect { |todo| todo.title }
72
+ end.then do |todos|
73
+ expect(todos).not_to be_nil
74
+ end
75
+ end
76
+
77
+ it "is time to give mitch a new todo" do
78
+ mitch = User.find_by_email("mitch@catprint.com")
79
+ mitch.todo_items << TodoItem.new({title: "new todo for you"})
80
+ mitch.save.then { |result| expect(result[:success]).to be_truthy }
81
+ end
82
+
83
+ it "should let mitch update the description" do
84
+ new_todo = TodoItem.find_by_title("new todo for you")
85
+ new_todo.description = "blah blah blah"
86
+ set_acting_user 'mitch@catprint.com'
87
+ new_todo.save.then do |result|
88
+ expect(result[:success]).to be_truthy
89
+ end
90
+ end
91
+
92
+ it "should not let somebody else update the description" do
93
+ new_todo = TodoItem.find_by_title("new todo for you")
94
+ new_todo.description = "I can't do this..."
95
+ set_acting_user 'todd@catprint.com'
96
+ new_todo.save.then do |result|
97
+ expect(result[:success]).to be_falsy
98
+ end
99
+ end
100
+
101
+ async "should let users add their own comment (tests create_permitted)" do
102
+ React::IsomorphicHelpers.load_context
103
+ ReactiveRecord.load do
104
+ set_acting_user "super-user"
105
+ TodoItem.find_by_title("new todo for you").comments.all
106
+ User.find_by_email("todd@catprint.com").id
107
+ end.then do
108
+ new_todo = TodoItem.find_by_title("new todo for you")
109
+ new_todo.comments << Comment.new({comment: "a comment", user: User.find_by_email("todd@catprint.com")})
110
+ set_acting_user 'todd@catprint.com'
111
+ new_todo.save.then do |result|
112
+ async { expect(result[:success]).to be_truthy }
113
+ end
114
+ end
115
+ end
116
+
117
+ async "should not let a user add another user's comment (tests create_permitted)" do
118
+ React::IsomorphicHelpers.load_context
119
+ ReactiveRecord.load do
120
+ set_acting_user "super-user"
121
+ TodoItem.find_by_title("new todo for you").comments.count # should be count
122
+ User.find_by_email("todd@catprint.com").id
123
+ end.then do
124
+ new_todo = TodoItem.find_by_title("new todo for you")
125
+ new_todo.comments << Comment.new({comment: "another comment", user: User.find_by_email("todd@catprint.com")})
126
+ set_acting_user 'mitch@catprint.com'
127
+ new_todo.save.then do |result|
128
+ async { expect(result[:success]).to be_falsy }
129
+ end
130
+ end
131
+ end
132
+
133
+ it "is time to make sure things really did work" do
134
+ React::IsomorphicHelpers.load_context
135
+ ReactiveRecord.load do
136
+ set_acting_user "super-user"
137
+ todo = TodoItem.find_by_title("new todo for you")
138
+ [todo.user.first_name, todo.description, todo.comments.count, todo.comments.first.comment, todo.comments.first.user.email]
139
+ end.then do |results|
140
+ expect(results).to eq(["Mitch", "blah blah blah", 1, "a comment", "todd@catprint.com"])
141
+ end
142
+ end
143
+
144
+ it "is time to delete the comment - lets see if mitch can delete it" do
145
+ comment = TodoItem.find_by_title("new todo for you").comments.first
146
+ set_acting_user 'mitch@catprint.com'
147
+ comment.destroy.then { |result| expect(result[:success]).to be_falsy }
148
+ end
149
+
150
+ async "is time to delete the comment - lets do it without the promise" do
151
+ React::IsomorphicHelpers.load_context
152
+ comment = TodoItem.find_by_title("new todo for you").comments.first
153
+ set_acting_user 'mitch@catprint.com'
154
+ comment.destroy { |result, message| async { expect(result).to be_falsy; expect(message).to be_present } }
155
+ end
156
+
157
+ it "is time to really delete it" do
158
+ React::IsomorphicHelpers.load_context
159
+ set_acting_user 'todd@catprint.com'
160
+ comment = Comment.find_by_comment("a comment")
161
+ comment.destroy.then { |result| expect(result[:success]).to be_truthy }
162
+ end
163
+
164
+ it "is time to delete the todo" do
165
+ set_acting_user "super-user"
166
+ new_todo = TodoItem.find_by_title("new todo for you")
167
+ new_todo.destroy.then { |result| expect(result[:success]).to be_truthy }
168
+ end
169
+
170
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'components/test'
3
+
4
+ describe "prerendering" do
5
+
6
+ it "will not return an id before preloading" do
7
+ React::IsomorphicHelpers.load_context
8
+ expect(User.find_by_email("mitch@catprint.com").id).not_to eq(1)
9
+ end
10
+
11
+ async "preloaded the records" do
12
+ `window.ClientSidePrerenderDataInterface.ReactiveRecordInitialData = undefined` rescue nil
13
+ container = Element[Document.body].append('<div></div>').children.last
14
+ complete = lambda do
15
+ React::IsomorphicHelpers.load_context
16
+ async do
17
+ mitch = User.find_by_email("mitch@catprint.com")
18
+ expect(mitch.id).to eq(1)
19
+ expect(mitch.first_name).to eq("Mitch")
20
+ expect(mitch.todo_items.first.title).to eq("a todo for mitch")
21
+ expect(mitch.address.zip).to eq("14617")
22
+ expect(mitch.todo_items.find_string("mitch").first.title).to eq("a todo for mitch")
23
+ expect(mitch.todo_items.first.commenters.first.email).to eq("adamg@catprint.com")
24
+ expect(mitch.expensive_math(13)).to eq(169)
25
+ expect(mitch.detailed_name).to eq("M. VanDuyn - mitch@catprint.com (2 todos)")
26
+ # clear out everything before moving on otherwise the initial data screws up the next test
27
+ `delete window.ReactiveRecordInitialData`
28
+ React::IsomorphicHelpers.load_context
29
+ end
30
+ end
31
+ `container.load(#{"/test?ts=#{Time.now.to_i}"}, complete)`
32
+ end
33
+
34
+ async "does not preload everything" do
35
+ `window.ClientSidePrerenderDataInterface.ReactiveRecordInitialData = undefined` rescue nil
36
+ container = Element[Document.body].append('<div></div>').children.last
37
+ complete = lambda do
38
+ React::IsomorphicHelpers.load_context
39
+ async do
40
+ expect(User.find_by_email("mitch@catprint.com").last_name.to_s).to eq("")
41
+ # clear out everything before moving on otherwise there will be a pending load that screw up the next test
42
+ `delete window.ReactiveRecordInitialData`
43
+ React::IsomorphicHelpers.load_context
44
+ end
45
+ end
46
+ `container.load(#{"/test?ts=#{Time.now.to_i}"}, complete)`
47
+ end
48
+
49
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ReactiveRecord.load" do
4
+
5
+ it "will not find a non-existing record" do
6
+ React::IsomorphicHelpers.load_context
7
+ ReactiveRecord.load do
8
+ User.find_by_first_name("Jon").id
9
+ end.then do |id|
10
+ expect(id).to be_nil
11
+ end
12
+ end
13
+
14
+ it "will find an existing record" do
15
+ React::IsomorphicHelpers.load_context
16
+ ReactiveRecord.load do
17
+ User.find_by_email("todd@catprint.com").id
18
+ end.then do |id|
19
+ expect(id).not_to be_nil
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,221 @@
1
+ require 'spec_helper'
2
+ #require 'user'
3
+ #require 'todo_item'
4
+ #require 'address'
5
+
6
+ describe "integration with react" do
7
+
8
+ before(:each) { React::IsomorphicHelpers.load_context }
9
+
10
+ it "find by two methods will not give the same object until loaded" do
11
+ r1 = User.find_by_email("mitch@catprint.com")
12
+ r2 = User.find_by_first_name("Mitch")
13
+ expect(r1).not_to eq(r2)
14
+ end
15
+
16
+ rendering("find by two methods gives same object once loaded") do
17
+ r1 = User.find_by_email("mitch@catprint.com")
18
+ r2 = User.find_by_first_name("Mitch")
19
+ r1.id
20
+ r2.id
21
+ if r1 == r2
22
+ "SAME OBJECT"
23
+ else
24
+ "NOT YET"
25
+ end
26
+ end.should_generate do
27
+ html == "SAME OBJECT"
28
+ end
29
+
30
+ it "will find two different attributes will not be equal before loading" do
31
+ r1 = User.find_by_email("mitch@catprint.com")
32
+ expect(r1.first_name).not_to eq(r1.last_name)
33
+ end
34
+
35
+ it "will find the same attributes to be equal before loading" do
36
+ r1 = User.find_by_email("mitch@catprint.com")
37
+ expect(r1.first_name).to eq(r1.first_name)
38
+ end
39
+
40
+ rendering("find by two methods gives same attributes once loaded") do
41
+ r1 = User.find_by_email("mitch@catprint.com")
42
+ r2 = User.find_by_first_name("Mitch")
43
+ if r1.first_name == r2.first_name
44
+ "SAME VALUE"
45
+ else
46
+ "NOT YET"
47
+ end
48
+ end.should_generate do
49
+ html == "SAME VALUE"
50
+ end
51
+
52
+ it "will know that an attribute is loading" do
53
+ r1 = User.find_by_email("mitch@catprint.com")
54
+ expect(r1.first_name).to be_loading
55
+ end
56
+
57
+ rendering("an attribute will eventually set it not loading") do
58
+ User.find_by_email("mitch@catprint.com").first_name.loading? ? "LOADING" : "LOADED"
59
+ end.should_generate do
60
+ html == "LOADED"
61
+ end
62
+
63
+ it "will know that an attribute is not loaded" do
64
+ r1 = User.find_by_email("mitch@catprint.com")
65
+ expect(r1.first_name).not_to be_loaded
66
+ end
67
+
68
+ rendering("an attribute will eventually set it loaded") do
69
+ User.find_by_email("mitch@catprint.com").first_name.loaded? ? "LOADED" : "LOADING"
70
+ end.should_generate do
71
+ html == "LOADED"
72
+ end
73
+
74
+ it "present? returns true for a non-nil value" do
75
+ expect("foo").to be_present
76
+ end
77
+
78
+ it "present? returns false for nil" do
79
+ expect(false).not_to be_present
80
+ end
81
+
82
+ it "will consider a unloaded attribute not to be present" do
83
+ r1 = User.find_by_email("mitch@catprint.com")
84
+ expect(r1.first_name).not_to be_present
85
+ end
86
+
87
+ rendering("a non-nil attribute will make it present") do
88
+ User.find_by_email("mitch@catprint.com").first_name.present? ? "PRESENT" : ""
89
+ end.should_generate do
90
+ html == "PRESENT"
91
+ end
92
+
93
+ rendering("a simple find_by query") do
94
+ User.find_by_email("mitch@catprint.com").email
95
+ end.should_immediately_generate do
96
+ html == "mitch@catprint.com"
97
+ end
98
+
99
+ rendering("an attribute from the server") do
100
+ User.find_by_email("mitch@catprint.com").first_name
101
+ end.should_generate do
102
+ html == "Mitch"
103
+ end
104
+
105
+ rendering("a has_many association") do
106
+ User.find_by_email("mitch@catprint.com").todo_items.collect do |todo|
107
+ todo.title
108
+ end.join(", ")
109
+ end.should_generate do
110
+ html == "a todo for mitch, another todo for mitch"
111
+ end
112
+
113
+ rendering("only as many times as needed") do
114
+ times_up = React::State.get_state(self, "times_up")
115
+ @timer ||= after(0.5) { React::State.set_state(self, "times_up", "DONE")}
116
+ @count ||= 0
117
+ @count += 1
118
+ "#{times_up} #{@count.to_s} " + User.find_by_email("mitch@catprint.com").todo_items.collect do |todo|
119
+ todo.title
120
+ end.join(", ")
121
+ end.should_generate do
122
+ puts "trying again: #{html}"
123
+ html == "DONE 3 a todo for mitch, another todo for mitch"
124
+ end
125
+
126
+ rendering("a belongs_to association from id") do
127
+ TodoItem.find(1).user.email
128
+ end.should_generate do
129
+ html == "mitch@catprint.com"
130
+ end
131
+
132
+ rendering("a belongs_to association from an attribute") do
133
+ User.find_by_email("mitch@catprint.com").todo_items.first.user.email
134
+ end.should_generate do
135
+ html == "mitch@catprint.com"
136
+ end
137
+
138
+ rendering("an aggregation") do
139
+ User.find_by_email("mitch@catprint.com").address.city
140
+ end.should_generate do
141
+ html == "Rochester"
142
+ end
143
+
144
+ rendering("a record that is updated multiple times") do
145
+ unless @record
146
+ @record = User.new
147
+ @record.attributes[:all_done] = false
148
+ @record.attributes[:test_done] = false
149
+ @record.attributes[:counter] = 0
150
+ end
151
+ after(0.1) do
152
+ puts "update counter timer expired, @record.test_done = #{!!@record.test_done}"
153
+ @record.counter = @record.counter + 1 unless @record.test_done
154
+ end
155
+ puts "record.changed? #{!!@record.changed?}"
156
+ after(2) do
157
+ puts "all done timer expired test should get done now!"
158
+ @record.all_done = true
159
+ end unless @record.changed?
160
+ if @record.all_done
161
+ @record.all_done = nil
162
+ @record.test_done = true
163
+ "#{@record.counter}"
164
+ else
165
+ "not done yet... #{@record.changed?}, #{@record.attributes[:counter]}"
166
+ end
167
+ end.should_generate do
168
+ puts "html = #{html}"
169
+ html == "2"
170
+ end
171
+
172
+ rendering("changing an aggregate is noticed by the parent") do
173
+ @user ||= User.find_by_email("mitch@catprint.com")
174
+ after(0.1) do
175
+ @user.address.city = "Timbuktoo"
176
+ end
177
+ if @user.changed?
178
+ "#{@user.address.city}"
179
+ end
180
+ end.should_generate do
181
+ html == "Timbuktoo"
182
+ end
183
+
184
+ rendering("a server side value dynamically changed before first fetch from server") do
185
+ puts "rendering"
186
+ @update ||= after(0.001) do
187
+ puts "async update"
188
+ mitch = User.find_by_email("mitch@catprint.com")
189
+ mitch.first_name = "Robert"
190
+ mitch.detailed_name!
191
+ puts "updated"
192
+ end
193
+ User.find_by_email("mitch@catprint.com").detailed_name
194
+ end.should_generate do
195
+ puts "html = #{html}"
196
+ html == "R. VanDuyn - mitch@catprint.com (2 todos)"
197
+ end
198
+
199
+ rendering("a server side value dynamically changed after first fetch from server") do
200
+ puts "rendering"
201
+ @render_times ||= 0
202
+ @render_times += 1
203
+ after(1) do
204
+ puts "async update"
205
+ mitch = User.find_by_email("mitch@catprint.com")
206
+ mitch.first_name = "Robert"
207
+ puts "mitch.detailed_name BEFORE = #{mitch.detailed_name}"
208
+ mitch.detailed_name!
209
+ puts "mitch.detailed_name AFTER = #{mitch.detailed_name}"
210
+ puts "updated"
211
+ end if @render_times == 2
212
+ User.find_by_email("mitch@catprint.com").detailed_name
213
+ end.should_generate do
214
+ puts "html = #{html}"
215
+ if html == "R. VanDuyn - mitch@catprint.com (2 todos)"
216
+ debugger
217
+ true
218
+ end
219
+ end
220
+
221
+ end