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,50 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+ require 'reactive_record/factory'
4
+
5
+ describe "many to many associations", js: true do
6
+
7
+ before(:each) do
8
+ seed_database
9
+ end
10
+
11
+ before(:each) do
12
+ # spec_helper resets the policy system after each test so we have to setup
13
+ # before each test
14
+ stub_const 'TestApplication', Class.new
15
+ stub_const 'TestApplicationPolicy', Class.new
16
+ TestApplicationPolicy.class_eval do
17
+ regulate_all_broadcasts { |policy| policy.send_all }
18
+ allow_change(to: :all, on: [:create, :update, :destroy]) { true }
19
+ end
20
+ size_window(:small, :portrait)
21
+ end
22
+
23
+ it "does not effect the base relationship count" do
24
+ expect_promise do
25
+ ReactiveRecord.load do
26
+ TodoItem.find_by_title("a todo for mitch").comments.count
27
+ end
28
+ end.to be(1)
29
+ end
30
+
31
+ it "does not effect access to attributes in the base relationship" do
32
+ expect_promise do
33
+ ReactiveRecord.load do
34
+ TodoItem.find_by_title("a todo for mitch").comments.count
35
+ end.then do
36
+ ReactiveRecord.load do
37
+ TodoItem.find_by_title("a todo for mitch").comments.first.user.email
38
+ end
39
+ end
40
+ end.to eq("adamg@catprint.com")
41
+ end
42
+
43
+ it "can be followed directly" do
44
+ expect_promise do
45
+ ReactiveRecord.load do
46
+ TodoItem.find_by_title("a todo for mitch").commenters.first.email
47
+ end
48
+ end.to eq("adamg@catprint.com")
49
+ end
50
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe "playground", js: true do
4
+
5
+ it "works!" do
6
+ mount "SuperTest::Derp" do
7
+ module SuperTest
8
+ end
9
+
10
+ SuperTest.const_set :Derp, Class.new(React::Component::Base)
11
+ SuperTest::Derp.class_eval do
12
+ inherited(self)
13
+ def render
14
+ p {"hi"}
15
+ end
16
+ end
17
+ SuperTest::Derp.hypertrace instrument: :all
18
+ end
19
+ page.should have_content('hi')
20
+ pause
21
+ end
22
+
23
+ it "works! as well" do
24
+
25
+ mount "SuperTest::Derp" do
26
+ module SuperTest
27
+ end
28
+
29
+ # YOU HAVE TO have the parens otherwise ruby rules say that
30
+ # the block will be sent to const_set (where it is ignored)
31
+
32
+ SuperTest.const_set(:Derp, Class.new(React::Component::Base) do
33
+ inherited(self)
34
+ def render
35
+ p {"hi"}
36
+ end
37
+ end)
38
+ SuperTest::Derp.hypertrace instrument: :all
39
+ end
40
+ page.should have_content('hi')
41
+ pause
42
+ end
43
+
44
+ it "works!?" do
45
+
46
+ mount "SuperTest::Derp" do
47
+ module SuperTest
48
+ end
49
+
50
+ SuperTest.const_set(:Derp, Class.new do
51
+ #include React::Component
52
+ #inherited(self)
53
+ def render
54
+ p {"hi"}
55
+ end
56
+ end)
57
+ SuperTest::Derp.hypertrace instrument: :all
58
+ end
59
+ pause
60
+ page.should have_content('hi')
61
+ pause
62
+ end
63
+
64
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ServerDataCache" do
4
+
5
+ before(:all) do
6
+ @current_pry_definition = Object.const_get("Pry") if defined? Pry
7
+ @current_pry_rescue_definition = Object.const_get("PryRescue") if defined? PryRescue
8
+ end
9
+
10
+ after(:all) do
11
+ Object.const_set("Pry", @current_pry_definition) if @current_pry_definition
12
+ Object.const_set("PryRescue", @current_pry_definition) if @current_pry_rescue_definition
13
+ end
14
+
15
+ it "behaves normally if there is no pry rescue" do
16
+ expect { ReactiveRecord::ServerDataCache[[],[], [["User", ["find", 1], "fake_attribute"]], nil] }.to raise_error(ActiveRecord::RecordNotFound)
17
+ end
18
+
19
+ context "will use pry rescue if it is defined" do
20
+
21
+ before(:all) do
22
+ pry = Class.new do
23
+ def self.rescue
24
+ yield
25
+ end
26
+ def self.rescued(e)
27
+ @last_exception = e
28
+ end
29
+ def self.last_exception
30
+ @last_exception
31
+ end
32
+ end
33
+ Object.const_set("PryRescue", true)
34
+ Object.const_set("Pry", pry)
35
+ end
36
+
37
+ it "and it will still raise an error" do
38
+ expect { ReactiveRecord::ServerDataCache[[],[], [["User", ["find", 1], "fake_attribute"]], nil] }.to raise_error(ActiveRecord::RecordNotFound)
39
+ end
40
+
41
+ it "but it will call Pry.rescued first" do
42
+ ReactiveRecord::ServerDataCache[[],[], ["User", ["new", 10852], "fake_attribute"], nil] rescue nil
43
+ expect(Pry.last_exception).to be_a(Exception)
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+ require 'reactive_record/factory'
4
+ require 'rspec-steps'
5
+
6
+ RSpec::Steps.steps "reverting records", js: true do
7
+
8
+ before(:all) do
9
+ seed_database
10
+ end
11
+
12
+ before(:step) do
13
+ # spec_helper resets the policy system after each test so we have to setup
14
+ # before each test
15
+ stub_const 'TestApplication', Class.new
16
+ stub_const 'TestApplicationPolicy', Class.new
17
+ TestApplicationPolicy.class_eval do
18
+ regulate_all_broadcasts { |policy| policy.send_all }
19
+ allow_change(to: :all, on: [:create, :update, :destroy]) { true }
20
+ end
21
+ size_window(:small, :portrait)
22
+ end
23
+
24
+ it "finds that the user Adam has not changed yet" do
25
+ expect_promise do
26
+ ReactiveRecord.load do
27
+ User.find_by_first_name("Adam")
28
+ end.then { |u| u.changed? }
29
+ end.to be_falsy
30
+ end
31
+
32
+ it "creates a new todo which should be changed (because its new)" do
33
+ expect_evaluate_ruby do
34
+ TodoItem.new({title: "Adam is not getting this todo"}).changed?
35
+ end.to be_truthy
36
+ end
37
+
38
+ it "adds the todo to adam's todos and expects adam to change" do
39
+ expect_evaluate_ruby do
40
+ adam = User.find_by_first_name("Adam")
41
+ adam.todo_items << TodoItem.find_by_title("Adam is not getting this todo")
42
+ adam.changed?
43
+ end.to be_truthy
44
+ end
45
+
46
+ it "will show that the new todo is still changed" do
47
+ expect_evaluate_ruby do
48
+ TodoItem.find_by_title("Adam is not getting this todo").changed?
49
+ end.to be_truthy
50
+ end
51
+
52
+ it "the todo now has an owner" do
53
+ expect_evaluate_ruby do
54
+ TodoItem.find_by_title("Adam is not getting this todo").user
55
+ end.not_to be_nil
56
+ end
57
+
58
+ it "can be reverted and the todo will not be changed" do
59
+ expect_evaluate_ruby do
60
+ todo = TodoItem.find_by_title("Adam is not getting this todo")
61
+ todo.revert
62
+ todo.changed?
63
+ end.not_to be_truthy
64
+ end
65
+
66
+ it "will not have changed adam" do
67
+ expect_evaluate_ruby do
68
+ User.find_by_first_name("Adam").changed?
69
+ end.not_to be_truthy
70
+ end
71
+
72
+ it "is time to test going the other way, lets give adam a todo again" do
73
+ expect_evaluate_ruby do
74
+ new_todo = TodoItem.new({title: "Adam is still not getting this todo"})
75
+ adam = User.find_by_first_name("Adam")
76
+ adam.todo_items << new_todo
77
+ adam.changed?
78
+ end.to be_truthy
79
+ end
80
+
81
+ it "can be reverted" do
82
+ expect_evaluate_ruby do
83
+ adam = User.find_by_first_name("Adam")
84
+ adam.revert
85
+ adam.changed?
86
+ end.not_to be_truthy
87
+ end
88
+
89
+ it "finds the todo is still changed" do
90
+ expect_evaluate_ruby do
91
+ TodoItem.find_by_title("Adam is still not getting this todo").changed?
92
+ end.to be_truthy
93
+ end
94
+
95
+ it "can change an attribute, revert, and make sure nothing else changes" do
96
+ original_count = User.find_by_email("mitch@catprint.com").todo_items.count
97
+ expect_promise do
98
+ mitch = nil
99
+ ReactiveRecord.load do
100
+ mitch = User.find_by_email("mitch@catprint.com")
101
+ mitch.last_name
102
+ mitch.todo_items.count
103
+ end.then do
104
+ mitch.last_name = "xxxx"
105
+ mitch.save
106
+ end.then do
107
+ mitch.revert
108
+ mitch.todo_items.count
109
+ end
110
+ end.to eq(original_count)
111
+ end
112
+ end
@@ -0,0 +1,189 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+ require 'reactive_record/factory'
4
+ require 'rspec-steps'
5
+
6
+ RSpec::Steps.steps "updating associations", js: true do
7
+
8
+ before(:all) do
9
+ seed_database
10
+ end
11
+
12
+ before(:step) do
13
+ # spec_helper resets the policy system after each test so we have to setup
14
+ # before each test
15
+ stub_const 'TestApplication', Class.new
16
+ stub_const 'TestApplicationPolicy', Class.new
17
+ TestApplicationPolicy.class_eval do
18
+ regulate_all_broadcasts { |policy| policy.send_all }
19
+ allow_change(to: :all, on: [:create, :update, :destroy]) { true }
20
+ end
21
+ size_window(:small, :portrait)
22
+ end
23
+
24
+ it "a new model will have empty has_many assocation" do
25
+ expect_evaluate_ruby do
26
+ User.new({first_name: "Jon", last_name: "Weaver"})
27
+ User.find_by_first_name("Jon").todo_items.all
28
+ end.to be_empty
29
+ end
30
+
31
+ it "the push operator returns the collection" do
32
+ expect_evaluate_ruby do
33
+ jon = User.find_by_first_name("Jon")
34
+ result = (jon.todo_items << (item = TodoItem.new({title: "Jon's first todo!"})))
35
+ result == jon.todo_items
36
+ end.to be_truthy
37
+ end
38
+
39
+ it "the push operator adds 1 to the count" do
40
+ expect_evaluate_ruby do
41
+ User.find_by_first_name("Jon").todo_items.count
42
+ end.to be(1)
43
+ end
44
+
45
+ it "will persist the new has_many association" do
46
+ evaluate_ruby do
47
+ User.find_by_first_name("Jon").save
48
+ end
49
+ wait_for { User.find_by_first_name("Jon").todo_items.count rescue nil }.to eq(1)
50
+ end
51
+
52
+ it "and will reconstruct the association and values on reloading" do
53
+ expect_promise do
54
+ React::IsomorphicHelpers.load_context
55
+ ReactiveRecord.load do
56
+ User.find_by_first_name("Jon").todo_items.collect { | todo | todo.title }
57
+ end
58
+ end.to eq(["Jon's first todo!"])
59
+ end
60
+
61
+ it "the inverse belongs_to association will be set" do
62
+ expect_evaluate_ruby do
63
+ todo = TodoItem.find_by_title("Jon's first todo!")
64
+ todo.user.first_name
65
+ end.to eq("Jon")
66
+ end
67
+
68
+ it "a model can be moved to a new owner, and will be removed from the old owner" do
69
+ expect_evaluate_ruby do
70
+ TodoItem.find_by_title("Jon's first todo!").user = User.new({first_name: "Jan", last_name: "VanDuyn"})
71
+ User.find_by_first_name("Jon").todo_items.all
72
+ end.to be_empty
73
+ end
74
+
75
+ it "and will belong to the new owner" do
76
+ expect_evaluate_ruby do
77
+ User.find_by_first_name("Jan").todo_items.all == [TodoItem.find_by_title("Jon's first todo!")]
78
+ end.to be_truthy
79
+ end
80
+
81
+ it "and can be saved and it will remember its new owner" do
82
+ evaluate_ruby do
83
+ TodoItem.find_by_title("Jon's first todo!").save
84
+ end
85
+ wait_for { TodoItem.find_by_title("Jon's first todo!").user.first_name rescue nil }.to eq('Jan')
86
+ end
87
+
88
+ it "and after saving will have been removed from original owners association" do
89
+ expect(User.find_by_first_name("Jon").todo_items).to be_empty
90
+ end
91
+
92
+ it "a belongs to association can be set to nil and the model saved" do
93
+ expect_promise do
94
+ React::IsomorphicHelpers.load_context
95
+ ReactiveRecord.load do
96
+ TodoItem.find_by_title("Jon's first todo!").tap { | todo | todo.user }
97
+ end.then do | todo |
98
+ todo.user = nil
99
+ todo.save
100
+ end.then do | response |
101
+ response[:success]
102
+ end
103
+ end.to be_truthy
104
+ end
105
+
106
+ it "and it will update on the server" do
107
+ expect(TodoItem.find_by_title("Jon's first todo!").user).to be_nil
108
+ end
109
+
110
+ it "and will not belong to the previous owner anymore" do
111
+ expect_promise do
112
+ React::IsomorphicHelpers.load_context
113
+ ReactiveRecord.load do
114
+ User.find_by_first_name("Jan").todo_items.count
115
+ end
116
+ end.to be(0)
117
+ end
118
+
119
+ it "but can be reassigned to the previous owner" do
120
+ expect_promise do
121
+ ReactiveRecord.load do
122
+ TodoItem.find_by_title("Jon's first todo!").tap { | todo | todo.user }
123
+ end.then do | todo |
124
+ todo.user = User.find_by_first_name("Jan")
125
+ todo.save
126
+ end.then do | response |
127
+ response[:success]
128
+ end
129
+ end.to be_truthy
130
+ end
131
+
132
+ it "and it will update the server on saving" do
133
+ expect(TodoItem.find_by_title("Jon's first todo!").user.first_name).to eq('Jan')
134
+ end
135
+
136
+ it "and a model in a belongs_to relationship can be deleted" do
137
+ expect_promise do
138
+ ReactiveRecord.load do
139
+ User.find_by_first_name("Jan").todo_items.collect { |item| item.itself }.first
140
+ end.then do | first |
141
+ ReactiveRecord::Collection.hypertrace instrument: :all
142
+ first.destroy.then do |response|
143
+ User.find_by_first_name("Jan").todo_items.all
144
+ end
145
+ end
146
+ end.to be_empty
147
+ end
148
+
149
+ it "will update the server properly" do
150
+ expect(User.find_by_first_name("Jan").todo_items).to be_empty
151
+ end
152
+
153
+ it "and it won't exist after being destroyed" do
154
+ expect_promise do
155
+ React::IsomorphicHelpers.load_context
156
+ ReactiveRecord.load do
157
+ TodoItem.find_by_title("Jon's first todo!").id
158
+ end
159
+ end.to be_nil
160
+ end
161
+
162
+ it "an item in a belongs_to relationship can be created without belonging to anybody" do
163
+ expect_promise do
164
+ TodoItem.new({title: "round to it"}).save
165
+ end.to be_truthy
166
+ end
167
+
168
+ it "and can be reloaded" do
169
+ expect_promise do
170
+ React::IsomorphicHelpers.load_context
171
+ ReactiveRecord.load do
172
+ TodoItem.find_by_title("round to it").id.to_i
173
+ end
174
+ end.to eq(TodoItem.find_by_title("round to it").id)
175
+ end
176
+
177
+ it "and can be deleted" do
178
+ expect_promise do
179
+ TodoItem.find_by_title("round to it").destroy.then do
180
+ TodoItem.find_by_title("round to it").destroyed?
181
+ end
182
+ end.to be_truthy
183
+ end
184
+
185
+ it "and it will be won't exist the server" do
186
+ expect(TodoItem.find_by_title('round to it')).to be_nil
187
+ end
188
+
189
+ end