mongoid_rails4 4.0.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 (659) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3213 -0
  3. data/LICENSE +20 -0
  4. data/README.md +62 -0
  5. data/Rakefile +35 -0
  6. data/lib/config/locales/en.yml +448 -0
  7. data/lib/mongoid.rb +104 -0
  8. data/lib/mongoid/atomic.rb +384 -0
  9. data/lib/mongoid/atomic/modifiers.rb +317 -0
  10. data/lib/mongoid/atomic/paths.rb +3 -0
  11. data/lib/mongoid/atomic/paths/embedded.rb +28 -0
  12. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  13. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  14. data/lib/mongoid/atomic/paths/root.rb +39 -0
  15. data/lib/mongoid/attributes.rb +284 -0
  16. data/lib/mongoid/attributes/dynamic.rb +154 -0
  17. data/lib/mongoid/attributes/nested.rb +82 -0
  18. data/lib/mongoid/attributes/processing.rb +147 -0
  19. data/lib/mongoid/attributes/readonly.rb +56 -0
  20. data/lib/mongoid/changeable.rb +379 -0
  21. data/lib/mongoid/composable.rb +104 -0
  22. data/lib/mongoid/config.rb +263 -0
  23. data/lib/mongoid/config/environment.rb +44 -0
  24. data/lib/mongoid/config/options.rb +74 -0
  25. data/lib/mongoid/config/validators.rb +3 -0
  26. data/lib/mongoid/config/validators/option.rb +25 -0
  27. data/lib/mongoid/config/validators/session.rb +140 -0
  28. data/lib/mongoid/contextual.rb +54 -0
  29. data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
  30. data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
  31. data/lib/mongoid/contextual/atomic.rb +180 -0
  32. data/lib/mongoid/contextual/command.rb +61 -0
  33. data/lib/mongoid/contextual/eager.rb +158 -0
  34. data/lib/mongoid/contextual/find_and_modify.rb +69 -0
  35. data/lib/mongoid/contextual/geo_near.rb +238 -0
  36. data/lib/mongoid/contextual/map_reduce.rb +324 -0
  37. data/lib/mongoid/contextual/memory.rb +440 -0
  38. data/lib/mongoid/contextual/mongo.rb +676 -0
  39. data/lib/mongoid/contextual/queryable.rb +25 -0
  40. data/lib/mongoid/contextual/text_search.rb +180 -0
  41. data/lib/mongoid/copyable.rb +67 -0
  42. data/lib/mongoid/criteria.rb +562 -0
  43. data/lib/mongoid/criteria/findable.rb +179 -0
  44. data/lib/mongoid/criteria/inspectable.rb +25 -0
  45. data/lib/mongoid/criteria/marshalable.rb +50 -0
  46. data/lib/mongoid/criteria/modifiable.rb +189 -0
  47. data/lib/mongoid/criteria/scopable.rb +158 -0
  48. data/lib/mongoid/document.rb +361 -0
  49. data/lib/mongoid/equality.rb +66 -0
  50. data/lib/mongoid/errors.rb +40 -0
  51. data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
  52. data/lib/mongoid/errors/callback.rb +25 -0
  53. data/lib/mongoid/errors/delete_restriction.rb +29 -0
  54. data/lib/mongoid/errors/document_not_found.rb +111 -0
  55. data/lib/mongoid/errors/eager_load.rb +22 -0
  56. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  57. data/lib/mongoid/errors/invalid_config_option.rb +27 -0
  58. data/lib/mongoid/errors/invalid_field.rb +64 -0
  59. data/lib/mongoid/errors/invalid_field_option.rb +35 -0
  60. data/lib/mongoid/errors/invalid_find.rb +19 -0
  61. data/lib/mongoid/errors/invalid_includes.rb +32 -0
  62. data/lib/mongoid/errors/invalid_index.rb +28 -0
  63. data/lib/mongoid/errors/invalid_options.rb +28 -0
  64. data/lib/mongoid/errors/invalid_path.rb +21 -0
  65. data/lib/mongoid/errors/invalid_scope.rb +24 -0
  66. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
  67. data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
  68. data/lib/mongoid/errors/invalid_time.rb +22 -0
  69. data/lib/mongoid/errors/inverse_not_found.rb +29 -0
  70. data/lib/mongoid/errors/mixed_relations.rb +32 -0
  71. data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
  72. data/lib/mongoid/errors/mongoid_error.rb +92 -0
  73. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
  74. data/lib/mongoid/errors/no_default_session.rb +23 -0
  75. data/lib/mongoid/errors/no_environment.rb +19 -0
  76. data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
  77. data/lib/mongoid/errors/no_metadata.rb +21 -0
  78. data/lib/mongoid/errors/no_parent.rb +24 -0
  79. data/lib/mongoid/errors/no_session_config.rb +22 -0
  80. data/lib/mongoid/errors/no_session_database.rb +27 -0
  81. data/lib/mongoid/errors/no_session_hosts.rb +27 -0
  82. data/lib/mongoid/errors/no_sessions_config.rb +20 -0
  83. data/lib/mongoid/errors/readonly_attribute.rb +25 -0
  84. data/lib/mongoid/errors/scope_overwrite.rb +21 -0
  85. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  86. data/lib/mongoid/errors/unknown_attribute.rb +25 -0
  87. data/lib/mongoid/errors/unsaved_document.rb +19 -0
  88. data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
  89. data/lib/mongoid/errors/validations.rb +29 -0
  90. data/lib/mongoid/evolvable.rb +19 -0
  91. data/lib/mongoid/extensions.rb +35 -0
  92. data/lib/mongoid/extensions/array.rb +180 -0
  93. data/lib/mongoid/extensions/big_decimal.rb +69 -0
  94. data/lib/mongoid/extensions/boolean.rb +21 -0
  95. data/lib/mongoid/extensions/date.rb +77 -0
  96. data/lib/mongoid/extensions/date_time.rb +73 -0
  97. data/lib/mongoid/extensions/false_class.rb +38 -0
  98. data/lib/mongoid/extensions/float.rb +56 -0
  99. data/lib/mongoid/extensions/hash.rb +209 -0
  100. data/lib/mongoid/extensions/integer.rb +67 -0
  101. data/lib/mongoid/extensions/module.rb +28 -0
  102. data/lib/mongoid/extensions/nil_class.rb +33 -0
  103. data/lib/mongoid/extensions/object.rb +274 -0
  104. data/lib/mongoid/extensions/object_id.rb +54 -0
  105. data/lib/mongoid/extensions/range.rb +79 -0
  106. data/lib/mongoid/extensions/regexp.rb +27 -0
  107. data/lib/mongoid/extensions/set.rb +55 -0
  108. data/lib/mongoid/extensions/string.rb +199 -0
  109. data/lib/mongoid/extensions/symbol.rb +54 -0
  110. data/lib/mongoid/extensions/time.rb +88 -0
  111. data/lib/mongoid/extensions/time_with_zone.rb +56 -0
  112. data/lib/mongoid/extensions/true_class.rb +38 -0
  113. data/lib/mongoid/factory.rb +46 -0
  114. data/lib/mongoid/fields.rb +542 -0
  115. data/lib/mongoid/fields/foreign_key.rb +174 -0
  116. data/lib/mongoid/fields/localized.rb +73 -0
  117. data/lib/mongoid/fields/standard.rb +273 -0
  118. data/lib/mongoid/fields/validators.rb +2 -0
  119. data/lib/mongoid/fields/validators/macro.rb +92 -0
  120. data/lib/mongoid/findable.rb +133 -0
  121. data/lib/mongoid/identity_map.rb +163 -0
  122. data/lib/mongoid/indexable.rb +147 -0
  123. data/lib/mongoid/indexable/specification.rb +115 -0
  124. data/lib/mongoid/indexable/validators/options.rb +103 -0
  125. data/lib/mongoid/inspectable.rb +59 -0
  126. data/lib/mongoid/interceptable.rb +265 -0
  127. data/lib/mongoid/loggable.rb +69 -0
  128. data/lib/mongoid/matchable.rb +152 -0
  129. data/lib/mongoid/matchable/all.rb +27 -0
  130. data/lib/mongoid/matchable/and.rb +30 -0
  131. data/lib/mongoid/matchable/default.rb +72 -0
  132. data/lib/mongoid/matchable/exists.rb +23 -0
  133. data/lib/mongoid/matchable/gt.rb +21 -0
  134. data/lib/mongoid/matchable/gte.rb +21 -0
  135. data/lib/mongoid/matchable/in.rb +24 -0
  136. data/lib/mongoid/matchable/lt.rb +21 -0
  137. data/lib/mongoid/matchable/lte.rb +21 -0
  138. data/lib/mongoid/matchable/ne.rb +21 -0
  139. data/lib/mongoid/matchable/nin.rb +21 -0
  140. data/lib/mongoid/matchable/or.rb +33 -0
  141. data/lib/mongoid/matchable/size.rb +21 -0
  142. data/lib/mongoid/persistable.rb +207 -0
  143. data/lib/mongoid/persistable/creatable.rb +189 -0
  144. data/lib/mongoid/persistable/deletable.rb +149 -0
  145. data/lib/mongoid/persistable/destroyable.rb +55 -0
  146. data/lib/mongoid/persistable/incrementable.rb +36 -0
  147. data/lib/mongoid/persistable/logical.rb +38 -0
  148. data/lib/mongoid/persistable/poppable.rb +39 -0
  149. data/lib/mongoid/persistable/pullable.rb +55 -0
  150. data/lib/mongoid/persistable/pushable.rb +62 -0
  151. data/lib/mongoid/persistable/renamable.rb +35 -0
  152. data/lib/mongoid/persistable/savable.rb +52 -0
  153. data/lib/mongoid/persistable/settable.rb +33 -0
  154. data/lib/mongoid/persistable/unsettable.rb +36 -0
  155. data/lib/mongoid/persistable/updatable.rb +151 -0
  156. data/lib/mongoid/persistable/upsertable.rb +55 -0
  157. data/lib/mongoid/positional.rb +71 -0
  158. data/lib/mongoid/railtie.rb +156 -0
  159. data/lib/mongoid/railties/database.rake +97 -0
  160. data/lib/mongoid/railties/document.rb +12 -0
  161. data/lib/mongoid/relations.rb +162 -0
  162. data/lib/mongoid/relations/accessors.rb +299 -0
  163. data/lib/mongoid/relations/auto_save.rb +106 -0
  164. data/lib/mongoid/relations/binding.rb +218 -0
  165. data/lib/mongoid/relations/bindings.rb +9 -0
  166. data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
  167. data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
  168. data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
  169. data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
  170. data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
  171. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
  172. data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
  173. data/lib/mongoid/relations/builder.rb +57 -0
  174. data/lib/mongoid/relations/builders.rb +104 -0
  175. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  176. data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
  177. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  178. data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
  179. data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
  180. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  181. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  182. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
  183. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  184. data/lib/mongoid/relations/cascading.rb +56 -0
  185. data/lib/mongoid/relations/cascading/delete.rb +44 -0
  186. data/lib/mongoid/relations/cascading/destroy.rb +43 -0
  187. data/lib/mongoid/relations/cascading/nullify.rb +35 -0
  188. data/lib/mongoid/relations/cascading/restrict.rb +39 -0
  189. data/lib/mongoid/relations/constraint.rb +49 -0
  190. data/lib/mongoid/relations/conversions.rb +34 -0
  191. data/lib/mongoid/relations/counter_cache.rb +105 -0
  192. data/lib/mongoid/relations/cyclic.rb +107 -0
  193. data/lib/mongoid/relations/embedded/batchable.rb +355 -0
  194. data/lib/mongoid/relations/embedded/in.rb +231 -0
  195. data/lib/mongoid/relations/embedded/many.rb +639 -0
  196. data/lib/mongoid/relations/embedded/one.rb +223 -0
  197. data/lib/mongoid/relations/macros.rb +356 -0
  198. data/lib/mongoid/relations/many.rb +208 -0
  199. data/lib/mongoid/relations/marshalable.rb +32 -0
  200. data/lib/mongoid/relations/metadata.rb +1174 -0
  201. data/lib/mongoid/relations/nested_builder.rb +74 -0
  202. data/lib/mongoid/relations/one.rb +48 -0
  203. data/lib/mongoid/relations/options.rb +48 -0
  204. data/lib/mongoid/relations/polymorphic.rb +39 -0
  205. data/lib/mongoid/relations/proxy.rb +270 -0
  206. data/lib/mongoid/relations/referenced/in.rb +297 -0
  207. data/lib/mongoid/relations/referenced/many.rb +787 -0
  208. data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
  209. data/lib/mongoid/relations/referenced/one.rb +290 -0
  210. data/lib/mongoid/relations/reflections.rb +62 -0
  211. data/lib/mongoid/relations/synchronization.rb +169 -0
  212. data/lib/mongoid/relations/targets.rb +2 -0
  213. data/lib/mongoid/relations/targets/enumerable.rb +473 -0
  214. data/lib/mongoid/relations/touchable.rb +94 -0
  215. data/lib/mongoid/reloadable.rb +95 -0
  216. data/lib/mongoid/scopable.rb +379 -0
  217. data/lib/mongoid/selectable.rb +59 -0
  218. data/lib/mongoid/serializable.rb +170 -0
  219. data/lib/mongoid/sessions.rb +330 -0
  220. data/lib/mongoid/sessions/factory.rb +129 -0
  221. data/lib/mongoid/sessions/mongo_uri.rb +93 -0
  222. data/lib/mongoid/sessions/options.rb +141 -0
  223. data/lib/mongoid/sessions/validators.rb +2 -0
  224. data/lib/mongoid/sessions/validators/storage.rb +49 -0
  225. data/lib/mongoid/shardable.rb +65 -0
  226. data/lib/mongoid/state.rb +97 -0
  227. data/lib/mongoid/threaded.rb +383 -0
  228. data/lib/mongoid/threaded/lifecycle.rb +164 -0
  229. data/lib/mongoid/timestamps.rb +15 -0
  230. data/lib/mongoid/timestamps/created.rb +30 -0
  231. data/lib/mongoid/timestamps/created/short.rb +19 -0
  232. data/lib/mongoid/timestamps/short.rb +10 -0
  233. data/lib/mongoid/timestamps/updated.rb +39 -0
  234. data/lib/mongoid/timestamps/updated/short.rb +19 -0
  235. data/lib/mongoid/traversable.rb +192 -0
  236. data/lib/mongoid/unit_of_work.rb +61 -0
  237. data/lib/mongoid/validatable.rb +180 -0
  238. data/lib/mongoid/validatable/associated.rb +48 -0
  239. data/lib/mongoid/validatable/format.rb +20 -0
  240. data/lib/mongoid/validatable/length.rb +20 -0
  241. data/lib/mongoid/validatable/localizable.rb +30 -0
  242. data/lib/mongoid/validatable/macros.rb +94 -0
  243. data/lib/mongoid/validatable/presence.rb +86 -0
  244. data/lib/mongoid/validatable/queryable.rb +30 -0
  245. data/lib/mongoid/validatable/uniqueness.rb +330 -0
  246. data/lib/mongoid/version.rb +4 -0
  247. data/lib/rack/mongoid.rb +2 -0
  248. data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
  249. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  250. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
  251. data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
  252. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  253. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  254. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  255. data/lib/rails/generators/mongoid_generator.rb +65 -0
  256. data/lib/rails/mongoid.rb +180 -0
  257. data/lib/support/ruby_version.rb +26 -0
  258. data/spec/app/models/account.rb +28 -0
  259. data/spec/app/models/acolyte.rb +17 -0
  260. data/spec/app/models/actor.rb +18 -0
  261. data/spec/app/models/actress.rb +2 -0
  262. data/spec/app/models/address.rb +77 -0
  263. data/spec/app/models/address_component.rb +5 -0
  264. data/spec/app/models/address_number.rb +6 -0
  265. data/spec/app/models/agency.rb +5 -0
  266. data/spec/app/models/agent.rb +12 -0
  267. data/spec/app/models/album.rb +14 -0
  268. data/spec/app/models/alert.rb +5 -0
  269. data/spec/app/models/animal.rb +25 -0
  270. data/spec/app/models/answer.rb +4 -0
  271. data/spec/app/models/appointment.rb +7 -0
  272. data/spec/app/models/article.rb +10 -0
  273. data/spec/app/models/artist.rb +66 -0
  274. data/spec/app/models/artwork.rb +4 -0
  275. data/spec/app/models/audio.rb +5 -0
  276. data/spec/app/models/augmentation.rb +11 -0
  277. data/spec/app/models/author.rb +4 -0
  278. data/spec/app/models/band.rb +26 -0
  279. data/spec/app/models/bar.rb +10 -0
  280. data/spec/app/models/basic.rb +6 -0
  281. data/spec/app/models/bed.rb +1 -0
  282. data/spec/app/models/big_palette.rb +2 -0
  283. data/spec/app/models/birthday.rb +13 -0
  284. data/spec/app/models/book.rb +13 -0
  285. data/spec/app/models/breed.rb +4 -0
  286. data/spec/app/models/browser.rb +6 -0
  287. data/spec/app/models/building.rb +5 -0
  288. data/spec/app/models/building_address.rb +5 -0
  289. data/spec/app/models/bus.rb +7 -0
  290. data/spec/app/models/business.rb +5 -0
  291. data/spec/app/models/callback_recorder.rb +25 -0
  292. data/spec/app/models/callback_test.rb +9 -0
  293. data/spec/app/models/canvas.rb +25 -0
  294. data/spec/app/models/car.rb +1 -0
  295. data/spec/app/models/cat.rb +8 -0
  296. data/spec/app/models/category.rb +8 -0
  297. data/spec/app/models/child.rb +4 -0
  298. data/spec/app/models/child_doc.rb +22 -0
  299. data/spec/app/models/church.rb +4 -0
  300. data/spec/app/models/circle.rb +3 -0
  301. data/spec/app/models/circuit.rb +4 -0
  302. data/spec/app/models/circus.rb +7 -0
  303. data/spec/app/models/code.rb +5 -0
  304. data/spec/app/models/comment.rb +16 -0
  305. data/spec/app/models/contractor.rb +5 -0
  306. data/spec/app/models/cookie.rb +6 -0
  307. data/spec/app/models/country_code.rb +8 -0
  308. data/spec/app/models/definition.rb +7 -0
  309. data/spec/app/models/description.rb +11 -0
  310. data/spec/app/models/dictionary.rb +10 -0
  311. data/spec/app/models/division.rb +10 -0
  312. data/spec/app/models/doctor.rb +12 -0
  313. data/spec/app/models/dog.rb +7 -0
  314. data/spec/app/models/dokument.rb +5 -0
  315. data/spec/app/models/dragon.rb +4 -0
  316. data/spec/app/models/driver.rb +7 -0
  317. data/spec/app/models/drug.rb +6 -0
  318. data/spec/app/models/dungeon.rb +4 -0
  319. data/spec/app/models/email.rb +6 -0
  320. data/spec/app/models/employer.rb +5 -0
  321. data/spec/app/models/entry.rb +6 -0
  322. data/spec/app/models/eraser.rb +1 -0
  323. data/spec/app/models/event.rb +22 -0
  324. data/spec/app/models/exhibition.rb +4 -0
  325. data/spec/app/models/exhibitor.rb +5 -0
  326. data/spec/app/models/eye.rb +9 -0
  327. data/spec/app/models/eye_bowl.rb +9 -0
  328. data/spec/app/models/face.rb +8 -0
  329. data/spec/app/models/favorite.rb +6 -0
  330. data/spec/app/models/filesystem.rb +5 -0
  331. data/spec/app/models/fire_hydrant.rb +6 -0
  332. data/spec/app/models/firefox.rb +4 -0
  333. data/spec/app/models/fish.rb +7 -0
  334. data/spec/app/models/folder.rb +7 -0
  335. data/spec/app/models/folder_item.rb +9 -0
  336. data/spec/app/models/fruits.rb +28 -0
  337. data/spec/app/models/game.rb +19 -0
  338. data/spec/app/models/ghost.rb +7 -0
  339. data/spec/app/models/home.rb +4 -0
  340. data/spec/app/models/house.rb +6 -0
  341. data/spec/app/models/html_writer.rb +3 -0
  342. data/spec/app/models/image.rb +22 -0
  343. data/spec/app/models/implant.rb +16 -0
  344. data/spec/app/models/item.rb +8 -0
  345. data/spec/app/models/jar.rb +7 -0
  346. data/spec/app/models/label.rb +40 -0
  347. data/spec/app/models/language.rb +5 -0
  348. data/spec/app/models/lat_lng.rb +15 -0
  349. data/spec/app/models/league.rb +11 -0
  350. data/spec/app/models/learner.rb +2 -0
  351. data/spec/app/models/line_item.rb +6 -0
  352. data/spec/app/models/location.rb +8 -0
  353. data/spec/app/models/login.rb +8 -0
  354. data/spec/app/models/manufacturer.rb +7 -0
  355. data/spec/app/models/meat.rb +4 -0
  356. data/spec/app/models/membership.rb +4 -0
  357. data/spec/app/models/mixed_drink.rb +4 -0
  358. data/spec/app/models/movie.rb +13 -0
  359. data/spec/app/models/my_hash.rb +2 -0
  360. data/spec/app/models/name.rb +23 -0
  361. data/spec/app/models/node.rb +5 -0
  362. data/spec/app/models/note.rb +12 -0
  363. data/spec/app/models/ordered_post.rb +6 -0
  364. data/spec/app/models/ordered_preference.rb +6 -0
  365. data/spec/app/models/oscar.rb +15 -0
  366. data/spec/app/models/override.rb +16 -0
  367. data/spec/app/models/ownable.rb +6 -0
  368. data/spec/app/models/owner.rb +6 -0
  369. data/spec/app/models/pack.rb +3 -0
  370. data/spec/app/models/page.rb +5 -0
  371. data/spec/app/models/page_question.rb +4 -0
  372. data/spec/app/models/palette.rb +7 -0
  373. data/spec/app/models/parent.rb +5 -0
  374. data/spec/app/models/parent_doc.rb +6 -0
  375. data/spec/app/models/passport.rb +5 -0
  376. data/spec/app/models/patient.rb +9 -0
  377. data/spec/app/models/pdf_writer.rb +3 -0
  378. data/spec/app/models/pencil.rb +1 -0
  379. data/spec/app/models/person.rb +205 -0
  380. data/spec/app/models/pet.rb +23 -0
  381. data/spec/app/models/pet_owner.rb +6 -0
  382. data/spec/app/models/phone.rb +11 -0
  383. data/spec/app/models/pizza.rb +7 -0
  384. data/spec/app/models/player.rb +35 -0
  385. data/spec/app/models/post.rb +44 -0
  386. data/spec/app/models/powerup.rb +11 -0
  387. data/spec/app/models/preference.rb +9 -0
  388. data/spec/app/models/princess.rb +8 -0
  389. data/spec/app/models/product.rb +15 -0
  390. data/spec/app/models/profile.rb +5 -0
  391. data/spec/app/models/pronunciation.rb +5 -0
  392. data/spec/app/models/purchase.rb +4 -0
  393. data/spec/app/models/question.rb +8 -0
  394. data/spec/app/models/quiz.rb +7 -0
  395. data/spec/app/models/rating.rb +8 -0
  396. data/spec/app/models/record.rb +46 -0
  397. data/spec/app/models/registry.rb +4 -0
  398. data/spec/app/models/role.rb +7 -0
  399. data/spec/app/models/root_category.rb +4 -0
  400. data/spec/app/models/sandwich.rb +4 -0
  401. data/spec/app/models/scheduler.rb +7 -0
  402. data/spec/app/models/seo.rb +7 -0
  403. data/spec/app/models/series.rb +4 -0
  404. data/spec/app/models/server.rb +13 -0
  405. data/spec/app/models/service.rb +22 -0
  406. data/spec/app/models/shape.rb +12 -0
  407. data/spec/app/models/shelf.rb +5 -0
  408. data/spec/app/models/shipping_container.rb +5 -0
  409. data/spec/app/models/shipping_pack.rb +3 -0
  410. data/spec/app/models/shop.rb +6 -0
  411. data/spec/app/models/short_agent.rb +4 -0
  412. data/spec/app/models/short_quiz.rb +5 -0
  413. data/spec/app/models/slave.rb +6 -0
  414. data/spec/app/models/song.rb +8 -0
  415. data/spec/app/models/sound.rb +5 -0
  416. data/spec/app/models/square.rb +4 -0
  417. data/spec/app/models/strategy.rb +3 -0
  418. data/spec/app/models/sub_item.rb +3 -0
  419. data/spec/app/models/subscription.rb +4 -0
  420. data/spec/app/models/survey.rb +5 -0
  421. data/spec/app/models/symptom.rb +6 -0
  422. data/spec/app/models/tag.rb +8 -0
  423. data/spec/app/models/target.rb +5 -0
  424. data/spec/app/models/template.rb +5 -0
  425. data/spec/app/models/thing.rb +9 -0
  426. data/spec/app/models/title.rb +3 -0
  427. data/spec/app/models/tool.rb +8 -0
  428. data/spec/app/models/topping.rb +5 -0
  429. data/spec/app/models/track.rb +38 -0
  430. data/spec/app/models/translation.rb +5 -0
  431. data/spec/app/models/tree.rb +9 -0
  432. data/spec/app/models/truck.rb +3 -0
  433. data/spec/app/models/user.rb +21 -0
  434. data/spec/app/models/user_account.rb +10 -0
  435. data/spec/app/models/validation_callback.rb +10 -0
  436. data/spec/app/models/vehicle.rb +11 -0
  437. data/spec/app/models/version.rb +5 -0
  438. data/spec/app/models/vet_visit.rb +5 -0
  439. data/spec/app/models/video.rb +13 -0
  440. data/spec/app/models/weapon.rb +11 -0
  441. data/spec/app/models/wiki_page.rb +14 -0
  442. data/spec/app/models/word.rb +15 -0
  443. data/spec/app/models/word_origin.rb +11 -0
  444. data/spec/app/models/writer.rb +11 -0
  445. data/spec/config/mongoid.yml +38 -0
  446. data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
  447. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
  448. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
  449. data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
  450. data/spec/mongoid/atomic/paths_spec.rb +270 -0
  451. data/spec/mongoid/atomic_spec.rb +365 -0
  452. data/spec/mongoid/attributes/nested_spec.rb +4832 -0
  453. data/spec/mongoid/attributes/readonly_spec.rb +169 -0
  454. data/spec/mongoid/attributes_spec.rb +1412 -0
  455. data/spec/mongoid/changeable_spec.rb +1507 -0
  456. data/spec/mongoid/composable_spec.rb +24 -0
  457. data/spec/mongoid/config/environment_spec.rb +83 -0
  458. data/spec/mongoid/config/options_spec.rb +56 -0
  459. data/spec/mongoid/config_spec.rb +318 -0
  460. data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
  461. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
  462. data/spec/mongoid/contextual/atomic_spec.rb +529 -0
  463. data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
  464. data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
  465. data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
  466. data/spec/mongoid/contextual/memory_spec.rb +1236 -0
  467. data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
  468. data/spec/mongoid/contextual/text_search_spec.rb +207 -0
  469. data/spec/mongoid/copyable_spec.rb +393 -0
  470. data/spec/mongoid/criteria/findable_spec.rb +1189 -0
  471. data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
  472. data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
  473. data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
  474. data/spec/mongoid/criteria/scopable_spec.rb +391 -0
  475. data/spec/mongoid/criteria_spec.rb +3821 -0
  476. data/spec/mongoid/document_spec.rb +1205 -0
  477. data/spec/mongoid/equality_spec.rb +241 -0
  478. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
  479. data/spec/mongoid/errors/callback_spec.rb +29 -0
  480. data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
  481. data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
  482. data/spec/mongoid/errors/eager_load_spec.rb +29 -0
  483. data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
  484. data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
  485. data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
  486. data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
  487. data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
  488. data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
  489. data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
  490. data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
  491. data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
  492. data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
  493. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
  494. data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
  495. data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
  496. data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
  497. data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
  498. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
  499. data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
  500. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
  501. data/spec/mongoid/errors/no_environment_spec.rb +29 -0
  502. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
  503. data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
  504. data/spec/mongoid/errors/no_parent_spec.rb +29 -0
  505. data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
  506. data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
  507. data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
  508. data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
  509. data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
  510. data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
  511. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
  512. data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
  513. data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
  514. data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
  515. data/spec/mongoid/errors/validations_spec.rb +45 -0
  516. data/spec/mongoid/extensions/array_spec.rb +638 -0
  517. data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
  518. data/spec/mongoid/extensions/binary_spec.rb +60 -0
  519. data/spec/mongoid/extensions/boolean_spec.rb +135 -0
  520. data/spec/mongoid/extensions/date_spec.rb +235 -0
  521. data/spec/mongoid/extensions/date_time_spec.rb +155 -0
  522. data/spec/mongoid/extensions/false_class_spec.rb +42 -0
  523. data/spec/mongoid/extensions/float_spec.rb +133 -0
  524. data/spec/mongoid/extensions/hash_spec.rb +333 -0
  525. data/spec/mongoid/extensions/integer_spec.rb +136 -0
  526. data/spec/mongoid/extensions/module_spec.rb +42 -0
  527. data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
  528. data/spec/mongoid/extensions/object_id_spec.rb +946 -0
  529. data/spec/mongoid/extensions/object_spec.rb +292 -0
  530. data/spec/mongoid/extensions/range_spec.rb +105 -0
  531. data/spec/mongoid/extensions/regexp_spec.rb +47 -0
  532. data/spec/mongoid/extensions/set_spec.rb +33 -0
  533. data/spec/mongoid/extensions/string_spec.rb +357 -0
  534. data/spec/mongoid/extensions/symbol_spec.rb +76 -0
  535. data/spec/mongoid/extensions/time_spec.rb +467 -0
  536. data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
  537. data/spec/mongoid/extensions/true_class_spec.rb +42 -0
  538. data/spec/mongoid/extensions_spec.rb +15 -0
  539. data/spec/mongoid/factory_spec.rb +185 -0
  540. data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
  541. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
  542. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
  543. data/spec/mongoid/fields/localized_spec.rb +386 -0
  544. data/spec/mongoid/fields/standard_spec.rb +166 -0
  545. data/spec/mongoid/fields_spec.rb +1229 -0
  546. data/spec/mongoid/findable_spec.rb +342 -0
  547. data/spec/mongoid/identity_map_spec.rb +564 -0
  548. data/spec/mongoid/indexable/specification_spec.rb +87 -0
  549. data/spec/mongoid/indexable_spec.rb +504 -0
  550. data/spec/mongoid/inspectable_spec.rb +49 -0
  551. data/spec/mongoid/interceptable_spec.rb +1564 -0
  552. data/spec/mongoid/loggable_spec.rb +21 -0
  553. data/spec/mongoid/matchable/all_spec.rb +31 -0
  554. data/spec/mongoid/matchable/and_spec.rb +162 -0
  555. data/spec/mongoid/matchable/default_spec.rb +130 -0
  556. data/spec/mongoid/matchable/exists_spec.rb +57 -0
  557. data/spec/mongoid/matchable/gt_spec.rb +75 -0
  558. data/spec/mongoid/matchable/gte_spec.rb +74 -0
  559. data/spec/mongoid/matchable/in_spec.rb +25 -0
  560. data/spec/mongoid/matchable/lt_spec.rb +74 -0
  561. data/spec/mongoid/matchable/lte_spec.rb +74 -0
  562. data/spec/mongoid/matchable/ne_spec.rb +25 -0
  563. data/spec/mongoid/matchable/nin_spec.rb +25 -0
  564. data/spec/mongoid/matchable/or_spec.rb +106 -0
  565. data/spec/mongoid/matchable/size_spec.rb +25 -0
  566. data/spec/mongoid/matchable_spec.rb +532 -0
  567. data/spec/mongoid/persistable/creatable_spec.rb +512 -0
  568. data/spec/mongoid/persistable/deletable_spec.rb +205 -0
  569. data/spec/mongoid/persistable/destroyable_spec.rb +148 -0
  570. data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
  571. data/spec/mongoid/persistable/logical_spec.rb +143 -0
  572. data/spec/mongoid/persistable/poppable_spec.rb +115 -0
  573. data/spec/mongoid/persistable/pullable_spec.rb +228 -0
  574. data/spec/mongoid/persistable/pushable_spec.rb +258 -0
  575. data/spec/mongoid/persistable/renamable_spec.rb +135 -0
  576. data/spec/mongoid/persistable/savable_spec.rb +432 -0
  577. data/spec/mongoid/persistable/settable_spec.rb +139 -0
  578. data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
  579. data/spec/mongoid/persistable/updatable_spec.rb +522 -0
  580. data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
  581. data/spec/mongoid/persistable_spec.rb +206 -0
  582. data/spec/mongoid/positional_spec.rb +227 -0
  583. data/spec/mongoid/railties/document_spec.rb +24 -0
  584. data/spec/mongoid/relations/accessors_spec.rb +736 -0
  585. data/spec/mongoid/relations/auto_save_spec.rb +261 -0
  586. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
  587. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
  588. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
  589. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
  590. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
  591. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
  592. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
  593. data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
  594. data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
  595. data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
  596. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
  597. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
  598. data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
  599. data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
  600. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
  601. data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
  602. data/spec/mongoid/relations/builders_spec.rb +226 -0
  603. data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
  604. data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
  605. data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
  606. data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
  607. data/spec/mongoid/relations/cascading_spec.rb +355 -0
  608. data/spec/mongoid/relations/constraint_spec.rb +74 -0
  609. data/spec/mongoid/relations/conversions_spec.rb +126 -0
  610. data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
  611. data/spec/mongoid/relations/cyclic_spec.rb +156 -0
  612. data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
  613. data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
  614. data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
  615. data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
  616. data/spec/mongoid/relations/macros_spec.rb +613 -0
  617. data/spec/mongoid/relations/metadata_spec.rb +1917 -0
  618. data/spec/mongoid/relations/options_spec.rb +35 -0
  619. data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
  620. data/spec/mongoid/relations/proxy_spec.rb +48 -0
  621. data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
  622. data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
  623. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
  624. data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
  625. data/spec/mongoid/relations/reflections_spec.rb +101 -0
  626. data/spec/mongoid/relations/synchronization_spec.rb +449 -0
  627. data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
  628. data/spec/mongoid/relations/touchable_spec.rb +296 -0
  629. data/spec/mongoid/relations_spec.rb +188 -0
  630. data/spec/mongoid/reloadable_spec.rb +305 -0
  631. data/spec/mongoid/scopable_spec.rb +926 -0
  632. data/spec/mongoid/selectable_spec.rb +134 -0
  633. data/spec/mongoid/serializable_spec.rb +862 -0
  634. data/spec/mongoid/sessions/factory_spec.rb +312 -0
  635. data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
  636. data/spec/mongoid/sessions/options_spec.rb +71 -0
  637. data/spec/mongoid/sessions_spec.rb +1078 -0
  638. data/spec/mongoid/shardable_spec.rb +61 -0
  639. data/spec/mongoid/state_spec.rb +102 -0
  640. data/spec/mongoid/threaded_spec.rb +258 -0
  641. data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
  642. data/spec/mongoid/timestamps/created_spec.rb +44 -0
  643. data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
  644. data/spec/mongoid/timestamps/updated_spec.rb +86 -0
  645. data/spec/mongoid/timestamps_spec.rb +112 -0
  646. data/spec/mongoid/traversable_spec.rb +244 -0
  647. data/spec/mongoid/unit_of_work_spec.rb +196 -0
  648. data/spec/mongoid/validatable/associated_spec.rb +183 -0
  649. data/spec/mongoid/validatable/format_spec.rb +83 -0
  650. data/spec/mongoid/validatable/length_spec.rb +119 -0
  651. data/spec/mongoid/validatable/numericality_spec.rb +30 -0
  652. data/spec/mongoid/validatable/presence_spec.rb +511 -0
  653. data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
  654. data/spec/mongoid/validatable_spec.rb +309 -0
  655. data/spec/mongoid_spec.rb +74 -0
  656. data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
  657. data/spec/rails/mongoid_spec.rb +462 -0
  658. data/spec/spec_helper.rb +103 -0
  659. metadata +1159 -0
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Inspectable do
4
+
5
+ describe "#inspect" do
6
+
7
+ context "when not allowing dynamic fields" do
8
+
9
+ let(:person) do
10
+ Person.new(title: "CEO")
11
+ end
12
+
13
+ let(:inspected) do
14
+ person.inspect
15
+ end
16
+
17
+ it "includes the model type" do
18
+ expect(inspected).to include("#<Person")
19
+ end
20
+
21
+ it "displays the id" do
22
+ expect(inspected).to include("_id: #{person.id}")
23
+ end
24
+
25
+ it "displays defined fields" do
26
+ expect(inspected).to include("title: \"CEO\"")
27
+ end
28
+
29
+ it "displays field aliases" do
30
+ expect(inspected).to include("t(test):")
31
+ end
32
+ end
33
+
34
+ context "when allowing dynamic fields" do
35
+
36
+ let(:person) do
37
+ Person.new(title: "CEO", some_attribute: "foo")
38
+ end
39
+
40
+ let(:inspected) do
41
+ person.inspect
42
+ end
43
+
44
+ it "includes dynamic attributes" do
45
+ expect(inspected).to include("some_attribute: \"foo\"")
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,1564 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Interceptable do
4
+
5
+ class TestClass
6
+ include Mongoid::Interceptable
7
+
8
+ attr_reader :before_save_called, :after_save_called
9
+
10
+ before_save do |object|
11
+ @before_save_called = true
12
+ end
13
+
14
+ after_save do |object|
15
+ @after_save_called = true
16
+ end
17
+ end
18
+
19
+ describe ".included" do
20
+
21
+ let(:klass) do
22
+ TestClass
23
+ end
24
+
25
+ it "includes the before_create callback" do
26
+ expect(klass).to respond_to(:before_create)
27
+ end
28
+
29
+ it "includes the after_create callback" do
30
+ expect(klass).to respond_to(:after_create)
31
+ end
32
+
33
+ it "includes the before_destroy callback" do
34
+ expect(klass).to respond_to(:before_destroy)
35
+ end
36
+
37
+ it "includes the after_destroy callback" do
38
+ expect(klass).to respond_to(:after_destroy)
39
+ end
40
+
41
+ it "includes the before_save callback" do
42
+ expect(klass).to respond_to(:before_save)
43
+ end
44
+
45
+ it "includes the after_save callback" do
46
+ expect(klass).to respond_to(:after_save)
47
+ end
48
+
49
+ it "includes the before_update callback" do
50
+ expect(klass).to respond_to(:before_update)
51
+ end
52
+
53
+ it "includes the after_update callback" do
54
+ expect(klass).to respond_to(:after_update)
55
+ end
56
+
57
+ it "includes the before_validation callback" do
58
+ expect(klass).to respond_to(:before_validation)
59
+ end
60
+
61
+ it "includes the after_validation callback" do
62
+ expect(klass).to respond_to(:after_validation)
63
+ end
64
+
65
+ it "includes the after_initialize callback" do
66
+ expect(klass).to respond_to(:after_initialize)
67
+ end
68
+
69
+ it "includes the after_build callback" do
70
+ expect(klass).to respond_to(:after_build)
71
+ end
72
+ end
73
+
74
+ describe ".after_find" do
75
+
76
+ let!(:player) do
77
+ Player.create
78
+ end
79
+
80
+ context "when the callback is on a root document" do
81
+
82
+ context "when when the document is instantiated" do
83
+
84
+ it "does not execute the callback" do
85
+ expect(player.impressions).to eq(0)
86
+ end
87
+ end
88
+
89
+ context "when the document is found via #find" do
90
+
91
+ let(:from_db) do
92
+ Player.find(player.id)
93
+ end
94
+
95
+ it "executes the callback" do
96
+ expect(from_db.impressions).to eq(1)
97
+ end
98
+ end
99
+
100
+ context "when the document is found in a criteria" do
101
+
102
+ let(:from_db) do
103
+ Player.where(id: player.id).first
104
+ end
105
+
106
+ it "executes the callback" do
107
+ expect(from_db.impressions).to eq(1)
108
+ end
109
+ end
110
+
111
+ context "when the document is reloaded" do
112
+
113
+ let(:from_db) do
114
+ Player.find(player.id)
115
+ end
116
+
117
+ before do
118
+ from_db.reload
119
+ end
120
+
121
+ it "executes the callback" do
122
+ expect(from_db.impressions).to eq(1)
123
+ end
124
+ end
125
+ end
126
+
127
+ context "when the callback is on an embedded document" do
128
+
129
+ let!(:implant) do
130
+ player.implants.create
131
+ end
132
+
133
+ context "when when the document is instantiated" do
134
+
135
+ it "does not execute the callback" do
136
+ expect(implant.impressions).to eq(0)
137
+ end
138
+ end
139
+
140
+ context "when the document is found via #find" do
141
+
142
+ let(:from_db) do
143
+ Player.find(player.id).implants.first
144
+ end
145
+
146
+ it "executes the callback" do
147
+ expect(from_db.impressions).to eq(1)
148
+ end
149
+ end
150
+
151
+ context "when the document is found in a criteria" do
152
+
153
+ let(:from_db) do
154
+ Player.find(player.id).implants.find(implant.id)
155
+ end
156
+
157
+ it "executes the callback" do
158
+ expect(from_db.impressions).to eq(1)
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ describe ".after_initialize" do
165
+
166
+ let(:game) do
167
+ Game.new
168
+ end
169
+
170
+ it "runs after document instantiation" do
171
+ expect(game.name).to eq("Testing")
172
+ end
173
+ end
174
+
175
+ describe ".after_build" do
176
+
177
+ let(:weapon) do
178
+ Player.new(frags: 5).weapons.build
179
+ end
180
+
181
+ it "runs after document build (references_many)" do
182
+ expect(weapon.name).to eq("Holy Hand Grenade (5)")
183
+ end
184
+
185
+ let(:implant) do
186
+ Player.new(frags: 5).implants.build
187
+ end
188
+
189
+ it "runs after document build (embeds_many)" do
190
+ expect(implant.name).to eq('Cochlear Implant (5)')
191
+ end
192
+
193
+ let(:powerup) do
194
+ Player.new(frags: 5).build_powerup
195
+ end
196
+
197
+ it "runs after document build (references_one)" do
198
+ expect(powerup.name).to eq("Quad Damage (5)")
199
+ end
200
+
201
+ let(:augmentation) do
202
+ Player.new(frags: 5).build_augmentation
203
+ end
204
+
205
+ it "runs after document build (embeds_one)" do
206
+ expect(augmentation.name).to eq("Infolink (5)")
207
+ end
208
+ end
209
+
210
+ describe ".before_create" do
211
+
212
+ let(:artist) do
213
+ Artist.new(name: "Depeche Mode")
214
+ end
215
+
216
+ context "callback returns true" do
217
+
218
+ before do
219
+ artist.should_receive(:before_create_stub).once.and_return(true)
220
+ artist.save
221
+ end
222
+
223
+ it "gets saved" do
224
+ expect(artist.persisted?).to be_true
225
+ end
226
+ end
227
+
228
+ context "callback returns false" do
229
+
230
+ before do
231
+ artist.should_receive(:before_create_stub).once.and_return(false)
232
+ artist.save
233
+ end
234
+
235
+ it "does not get saved" do
236
+ expect(artist.persisted?).to be_false
237
+ end
238
+ end
239
+ end
240
+
241
+ describe ".before_save" do
242
+
243
+ context "when creating" do
244
+
245
+ let(:artist) do
246
+ Artist.new(name: "Depeche Mode")
247
+ end
248
+
249
+ after do
250
+ artist.delete
251
+ end
252
+
253
+ context "when the callback returns true" do
254
+
255
+ before do
256
+ artist.should_receive(:before_save_stub).once.and_return(true)
257
+ end
258
+
259
+ it "the save returns true" do
260
+ expect(artist.save).to be_true
261
+ end
262
+ end
263
+
264
+ context "when callback returns false" do
265
+
266
+ before do
267
+ artist.should_receive(:before_save_stub).once.and_return(false)
268
+ end
269
+
270
+ it "the save returns false" do
271
+ expect(artist.save).to be_false
272
+ end
273
+ end
274
+ end
275
+
276
+ context "when updating" do
277
+
278
+ let(:artist) do
279
+ Artist.create(name: "Depeche Mode").tap do |artist|
280
+ artist.name = "The Mountain Goats"
281
+ end
282
+ end
283
+
284
+ after do
285
+ artist.delete
286
+ end
287
+
288
+ context "when the callback returns true" do
289
+
290
+ before do
291
+ artist.should_receive(:before_save_stub).once.and_return(true)
292
+ end
293
+
294
+ it "the save returns true" do
295
+ expect(artist.save).to be_true
296
+ end
297
+ end
298
+
299
+ context "when the callback returns false" do
300
+
301
+ before do
302
+ artist.should_receive(:before_save_stub).once.and_return(false)
303
+ end
304
+
305
+ it "the save returns false" do
306
+ expect(artist.save).to be_false
307
+ end
308
+ end
309
+ end
310
+ end
311
+
312
+ describe ".before_destroy" do
313
+
314
+ let(:artist) do
315
+ Artist.create(name: "Depeche Mode")
316
+ end
317
+
318
+ before do
319
+ artist.name = "The Mountain Goats"
320
+ end
321
+
322
+ after do
323
+ artist.delete
324
+ end
325
+
326
+ context "when the callback returns true" do
327
+
328
+ before do
329
+ artist.should_receive(:before_destroy_stub).once.and_return(true)
330
+ end
331
+
332
+ it "the destroy returns true" do
333
+ expect(artist.destroy).to be_true
334
+ end
335
+ end
336
+
337
+ context "when the callback returns false" do
338
+
339
+ before do
340
+ artist.should_receive(:before_destroy_stub).once.and_return(false)
341
+ end
342
+
343
+ it "the destroy returns false" do
344
+ expect(artist.destroy).to be_false
345
+ end
346
+ end
347
+
348
+ context "when cascading callbacks" do
349
+
350
+ let!(:moderat) do
351
+ Band.create!(name: "Moderat")
352
+ end
353
+
354
+ let!(:record) do
355
+ moderat.records.create(name: "Moderat")
356
+ end
357
+
358
+ before do
359
+ moderat.destroy
360
+ end
361
+
362
+ it "executes the child destroy callbacks" do
363
+ expect(record.before_destroy_called).to be_true
364
+ end
365
+ end
366
+ end
367
+
368
+ describe "#run_after_callbacks" do
369
+
370
+ let(:object) do
371
+ TestClass.new
372
+ end
373
+
374
+ before do
375
+ object.run_after_callbacks(:save)
376
+ end
377
+
378
+ it "runs the after callbacks" do
379
+ expect(object.after_save_called).to be_true
380
+ end
381
+
382
+ it "does not run the before callbacks" do
383
+ expect(object.before_save_called).to be_false
384
+ end
385
+ end
386
+
387
+ describe "#run_before_callbacks" do
388
+
389
+ let(:object) do
390
+ TestClass.new
391
+ end
392
+
393
+ before do
394
+ object.run_before_callbacks(:save)
395
+ end
396
+
397
+ it "runs the before callbacks" do
398
+ expect(object.before_save_called).to be_true
399
+ end
400
+
401
+ it "does not run the after callbacks" do
402
+ expect(object.after_save_called).to be_false
403
+ end
404
+ end
405
+
406
+ context "when cascading callbacks" do
407
+
408
+ context "when the parent has a custom callback" do
409
+
410
+ context "when the child does not have the same callback defined" do
411
+
412
+ let(:band) do
413
+ Band.new
414
+ end
415
+
416
+ let!(:record) do
417
+ band.records.build
418
+ end
419
+
420
+ context "when running the callbacks directly" do
421
+
422
+ before(:all) do
423
+ Band.define_model_callbacks(:rearrange)
424
+ end
425
+
426
+ after(:all) do
427
+ Band.reset_callbacks(:rearrange)
428
+ end
429
+
430
+ it "does not cascade to the child" do
431
+ expect(band.run_callbacks(:rearrange)).to be_true
432
+ end
433
+ end
434
+
435
+ context "when the callbacks get triggered by a destroy" do
436
+
437
+ before(:all) do
438
+ Band.define_model_callbacks(:rearrange)
439
+ Band.set_callback(:validation, :before) do
440
+ run_callbacks(:rearrange)
441
+ end
442
+ end
443
+
444
+ after(:all) do
445
+ Band.reset_callbacks(:rearrange)
446
+ end
447
+
448
+ let(:attributes) do
449
+ {
450
+ records_attributes: {
451
+ "0" => { "_id" => record.id, "_destroy" => true }
452
+ }
453
+ }
454
+ end
455
+
456
+ it "does not cascade to the child" do
457
+ Band.accepts_nested_attributes_for :records, allow_destroy: true
458
+ expect(band.update_attributes(attributes)).to be_true
459
+ end
460
+ end
461
+ end
462
+ end
463
+
464
+ context "when a document can exist in more than 1 level" do
465
+
466
+ let(:band) do
467
+ Band.new
468
+ end
469
+
470
+ let(:record) do
471
+ band.records.build
472
+ end
473
+
474
+ let(:note) do
475
+ Note.new
476
+ end
477
+
478
+ context "when adding the document at multiple levels" do
479
+
480
+ before do
481
+ band.notes.push(note)
482
+ record.notes.push(note)
483
+ end
484
+
485
+ context "when saving the root" do
486
+
487
+ it "only executes the callbacks once for each embed" do
488
+ note.should_receive(:update_saved).twice
489
+ band.save
490
+ end
491
+ end
492
+ end
493
+ end
494
+
495
+ context "when cascading after initialize" do
496
+
497
+ let!(:person) do
498
+ Person.create
499
+ end
500
+
501
+ before do
502
+ person.services.create!(sid: 1)
503
+ end
504
+
505
+ it "doesn't cascade the initialize" do
506
+ Service.any_instance.should_receive(:after_initialize_called=).never
507
+ expect(Person.find(person.id)).to eq(person)
508
+ end
509
+ end
510
+
511
+ context "when attempting to cascade on a referenced relation" do
512
+
513
+ it "raises an error" do
514
+ expect {
515
+ Band.has_and_belongs_to_many :tags, cascade_callbacks: true
516
+ }.to raise_error(Mongoid::Errors::InvalidOptions)
517
+ end
518
+ end
519
+
520
+ context "when the documents are embedded one level" do
521
+
522
+ describe "#after_create" do
523
+
524
+ context "when the child is new" do
525
+
526
+ context "when the parent is new" do
527
+
528
+ let(:band) do
529
+ Band.new(name: "Moderat")
530
+ end
531
+
532
+ let!(:label) do
533
+ band.build_label(name: "Mute")
534
+ end
535
+
536
+ before do
537
+ band.save
538
+ end
539
+
540
+ it "executes the callback" do
541
+ expect(label.after_create_called).to be_true
542
+ end
543
+ end
544
+
545
+ context "when the parent is persisted" do
546
+
547
+ let(:band) do
548
+ Band.create(name: "Moderat")
549
+ end
550
+
551
+ let!(:label) do
552
+ band.build_label(name: "Mute")
553
+ end
554
+
555
+ before do
556
+ band.save
557
+ end
558
+
559
+ it "executes the callback" do
560
+ expect(label.after_create_called).to be_true
561
+ end
562
+ end
563
+ end
564
+
565
+ context "when the child is persisted" do
566
+
567
+ let(:band) do
568
+ Band.create(name: "Moderat")
569
+ end
570
+
571
+ let!(:label) do
572
+ band.create_label(name: "Mute")
573
+ end
574
+
575
+ before do
576
+ label.after_create_called = false
577
+ band.save
578
+ end
579
+
580
+ it "does not execute the callback" do
581
+ expect(label.after_create_called).to be_false
582
+ end
583
+ end
584
+ end
585
+
586
+ describe "#after_save" do
587
+
588
+ context "when the child is new" do
589
+
590
+ context "when the parent is new" do
591
+
592
+ let(:band) do
593
+ Band.new(name: "Moderat")
594
+ end
595
+
596
+ let!(:label) do
597
+ band.build_label(name: "Mute")
598
+ end
599
+
600
+ before do
601
+ band.save
602
+ end
603
+
604
+ it "executes the callback" do
605
+ expect(label.after_save_called).to be_true
606
+ end
607
+ end
608
+
609
+ context "when the parent is persisted" do
610
+
611
+ let(:band) do
612
+ Band.create(name: "Moderat")
613
+ end
614
+
615
+ let!(:label) do
616
+ band.build_label(name: "Mute")
617
+ end
618
+
619
+ before do
620
+ band.save
621
+ end
622
+
623
+ it "executes the callback" do
624
+ expect(label.after_save_called).to be_true
625
+ end
626
+ end
627
+ end
628
+
629
+ context "when the child is persisted" do
630
+
631
+ let(:band) do
632
+ Band.create(name: "Moderat")
633
+ end
634
+
635
+ let!(:label) do
636
+ band.create_label(name: "Mute")
637
+ end
638
+
639
+ before do
640
+ band.save
641
+ end
642
+
643
+ it "executes the callback" do
644
+ expect(label.after_save_called).to be_true
645
+ end
646
+ end
647
+ end
648
+
649
+ describe "#after_update" do
650
+
651
+ context "when the child is new" do
652
+
653
+ context "when the parent is new" do
654
+
655
+ let(:band) do
656
+ Band.new(name: "Moderat")
657
+ end
658
+
659
+ let!(:label) do
660
+ band.build_label(name: "Mute")
661
+ end
662
+
663
+ before do
664
+ band.save
665
+ end
666
+
667
+ it "does not execute the callback" do
668
+ expect(label.after_update_called).to be_false
669
+ end
670
+ end
671
+
672
+ context "when the parent is persisted" do
673
+
674
+ let(:band) do
675
+ Band.create(name: "Moderat")
676
+ end
677
+
678
+ let!(:label) do
679
+ band.build_label(name: "Mute")
680
+ end
681
+
682
+ before do
683
+ band.save
684
+ end
685
+
686
+ it "does not execute the callback" do
687
+ expect(label.after_update_called).to be_false
688
+ end
689
+ end
690
+ end
691
+
692
+ context "when the child is persisted" do
693
+
694
+ let(:band) do
695
+ Band.create(name: "Moderat")
696
+ end
697
+
698
+ context "when the child is dirty" do
699
+
700
+ let!(:label) do
701
+ band.create_label(name: "Mute")
702
+ end
703
+
704
+ before do
705
+ label.name = "Nothing"
706
+ band.save
707
+ end
708
+
709
+ it "executes the callback" do
710
+ expect(label.after_update_called).to be_true
711
+ end
712
+ end
713
+
714
+ context "when the child is not dirty" do
715
+
716
+ let!(:label) do
717
+ band.build_label(name: "Mute")
718
+ end
719
+
720
+ before do
721
+ band.save
722
+ end
723
+
724
+ it "does not execute the callback" do
725
+ expect(label.after_update_called).to be_false
726
+ end
727
+ end
728
+ end
729
+ end
730
+
731
+ describe "#after_validation" do
732
+
733
+ context "when the child is new" do
734
+
735
+ context "when the parent is new" do
736
+
737
+ let(:band) do
738
+ Band.new(name: "Moderat")
739
+ end
740
+
741
+ let!(:label) do
742
+ band.build_label(name: "Mute")
743
+ end
744
+
745
+ before do
746
+ band.save
747
+ end
748
+
749
+ it "executes the callback" do
750
+ expect(label.after_validation_called).to be_true
751
+ end
752
+ end
753
+
754
+ context "when the parent is persisted" do
755
+
756
+ let(:band) do
757
+ Band.create(name: "Moderat")
758
+ end
759
+
760
+ let!(:label) do
761
+ band.build_label(name: "Mute")
762
+ end
763
+
764
+ before do
765
+ band.save
766
+ end
767
+
768
+ it "executes the callback" do
769
+ expect(label.after_validation_called).to be_true
770
+ end
771
+ end
772
+ end
773
+
774
+ context "when the child is persisted" do
775
+
776
+ let(:band) do
777
+ Band.create(name: "Moderat")
778
+ end
779
+
780
+ let!(:label) do
781
+ band.create_label(name: "Mute")
782
+ end
783
+
784
+ before do
785
+ band.save
786
+ end
787
+
788
+ it "executes the callback" do
789
+ expect(label.after_validation_called).to be_true
790
+ end
791
+ end
792
+ end
793
+
794
+ describe "#before_create" do
795
+
796
+ context "when the child is new" do
797
+
798
+ context "when the parent is new" do
799
+
800
+ let(:band) do
801
+ Band.new(name: "Moderat")
802
+ end
803
+
804
+ let!(:record) do
805
+ band.records.build(name: "Moderat")
806
+ end
807
+
808
+ before do
809
+ band.save
810
+ end
811
+
812
+ it "executes the callback" do
813
+ expect(record.before_create_called).to be_true
814
+ end
815
+ end
816
+
817
+ context "when the parent is persisted" do
818
+
819
+ let(:band) do
820
+ Band.create(name: "Moderat")
821
+ end
822
+
823
+ let!(:record) do
824
+ band.records.build(name: "Moderat")
825
+ end
826
+
827
+ before do
828
+ band.save
829
+ end
830
+
831
+ it "executes the callback" do
832
+ expect(record.before_create_called).to be_true
833
+ end
834
+ end
835
+ end
836
+
837
+ context "when the child is persisted" do
838
+
839
+ let(:band) do
840
+ Band.create(name: "Moderat")
841
+ end
842
+
843
+ let!(:record) do
844
+ band.records.create(name: "Moderat")
845
+ end
846
+
847
+ before do
848
+ record.before_create_called = false
849
+ band.save
850
+ end
851
+
852
+ it "does not execute the callback" do
853
+ expect(record.before_create_called).to be_false
854
+ end
855
+ end
856
+ end
857
+
858
+ describe "#before_save" do
859
+
860
+ context "when the child is new" do
861
+
862
+ context "when the parent is new" do
863
+
864
+ let(:band) do
865
+ Band.new(name: "Moderat")
866
+ end
867
+
868
+ let!(:record) do
869
+ band.records.build(name: "Moderat")
870
+ end
871
+
872
+ before do
873
+ band.save
874
+ end
875
+
876
+ it "executes the callback" do
877
+ expect(record.before_save_called).to be_true
878
+ end
879
+
880
+ it "persists the change" do
881
+ expect(band.reload.records.first.before_save_called).to be_true
882
+ end
883
+ end
884
+
885
+ context "when the parent is persisted" do
886
+
887
+ let(:band) do
888
+ Band.create(name: "Moderat")
889
+ end
890
+
891
+ let!(:record) do
892
+ band.records.build(name: "Moderat")
893
+ end
894
+
895
+ before do
896
+ band.save
897
+ end
898
+
899
+ it "executes the callback" do
900
+ expect(record.before_save_called).to be_true
901
+ end
902
+
903
+ it "persists the change" do
904
+ expect(band.reload.records.first.before_save_called).to be_true
905
+ end
906
+ end
907
+ end
908
+
909
+ context "when the child is persisted" do
910
+
911
+ let(:band) do
912
+ Band.create(name: "Moderat")
913
+ end
914
+
915
+ let!(:record) do
916
+ band.records.create(name: "Moderat")
917
+ end
918
+
919
+ before do
920
+ band.save
921
+ end
922
+
923
+ it "executes the callback" do
924
+ expect(record.before_save_called).to be_true
925
+ end
926
+
927
+ it "persists the change" do
928
+ expect(band.reload.records.first.before_save_called).to be_true
929
+ end
930
+ end
931
+ end
932
+
933
+ describe "#before_update" do
934
+
935
+ context "when the child is new" do
936
+
937
+ context "when the parent is new" do
938
+
939
+ let(:band) do
940
+ Band.new(name: "Moderat")
941
+ end
942
+
943
+ let!(:record) do
944
+ band.records.build(name: "Moderat")
945
+ end
946
+
947
+ before do
948
+ band.save
949
+ end
950
+
951
+ it "does not execute the callback" do
952
+ expect(record.before_update_called).to be_false
953
+ end
954
+ end
955
+
956
+ context "when the parent is persisted" do
957
+
958
+ let(:band) do
959
+ Band.create(name: "Moderat")
960
+ end
961
+
962
+ let!(:record) do
963
+ band.records.build(name: "Moderat")
964
+ end
965
+
966
+ before do
967
+ band.save
968
+ end
969
+
970
+ it "does not execute the callback" do
971
+ expect(record.before_update_called).to be_false
972
+ end
973
+ end
974
+ end
975
+
976
+ context "when the child is persisted" do
977
+
978
+ let(:band) do
979
+ Band.create(name: "Moderat")
980
+ end
981
+
982
+ let!(:record) do
983
+ band.records.create(name: "Moderat")
984
+ end
985
+
986
+ context "when the child is dirty" do
987
+
988
+ before do
989
+ record.name = "Nothing"
990
+ band.save
991
+ end
992
+
993
+ it "executes the callback" do
994
+ expect(record.before_update_called).to be_true
995
+ end
996
+
997
+ it "persists the change" do
998
+ expect(band.reload.records.first.before_update_called).to be_true
999
+ end
1000
+ end
1001
+
1002
+ context "when the child is not dirty" do
1003
+
1004
+ before do
1005
+ band.save
1006
+ end
1007
+
1008
+ it "does not execute the callback" do
1009
+ expect(record.before_update_called).to be_false
1010
+ end
1011
+ end
1012
+ end
1013
+ end
1014
+
1015
+ describe "#before_validation" do
1016
+
1017
+ context "when the child is new" do
1018
+
1019
+ context "when the parent is new" do
1020
+
1021
+ let(:band) do
1022
+ Band.new(name: "Moderat")
1023
+ end
1024
+
1025
+ let!(:record) do
1026
+ band.records.build(name: "Moderat")
1027
+ end
1028
+
1029
+ before do
1030
+ band.save
1031
+ end
1032
+
1033
+ it "executes the callback" do
1034
+ expect(record.before_validation_called).to be_true
1035
+ end
1036
+
1037
+ it "persists the change" do
1038
+ expect(band.reload.records.first.before_validation_called).to be_true
1039
+ end
1040
+ end
1041
+
1042
+ context "when the parent is persisted" do
1043
+
1044
+ let(:band) do
1045
+ Band.create(name: "Moderat")
1046
+ end
1047
+
1048
+ let!(:record) do
1049
+ band.records.build(name: "Moderat")
1050
+ end
1051
+
1052
+ before do
1053
+ band.save
1054
+ end
1055
+
1056
+ it "executes the callback" do
1057
+ expect(record.before_validation_called).to be_true
1058
+ end
1059
+
1060
+ it "persists the change" do
1061
+ expect(band.reload.records.first.before_validation_called).to be_true
1062
+ end
1063
+ end
1064
+ end
1065
+
1066
+ context "when the child is persisted" do
1067
+
1068
+ let(:band) do
1069
+ Band.create(name: "Moderat")
1070
+ end
1071
+
1072
+ let!(:record) do
1073
+ band.records.create(name: "Moderat")
1074
+ end
1075
+
1076
+ before do
1077
+ band.save
1078
+ end
1079
+
1080
+ it "executes the callback" do
1081
+ expect(record.before_validation_called).to be_true
1082
+ end
1083
+
1084
+ it "persists the change" do
1085
+ expect(band.reload.records.first.before_validation_called).to be_true
1086
+ end
1087
+ end
1088
+ end
1089
+ end
1090
+
1091
+ context "when the document is embedded multiple levels" do
1092
+
1093
+ describe "#before_create" do
1094
+
1095
+ context "when the child is new" do
1096
+
1097
+ context "when the root is new" do
1098
+
1099
+ let(:band) do
1100
+ Band.new(name: "Moderat")
1101
+ end
1102
+
1103
+ let!(:record) do
1104
+ band.records.build(name: "Moderat")
1105
+ end
1106
+
1107
+ let!(:track) do
1108
+ record.tracks.build(name: "Berlin")
1109
+ end
1110
+
1111
+ before do
1112
+ band.save
1113
+ end
1114
+
1115
+ it "executes the callback" do
1116
+ expect(track.before_create_called).to be_true
1117
+ end
1118
+ end
1119
+
1120
+ context "when the root is persisted" do
1121
+
1122
+ let(:band) do
1123
+ Band.create(name: "Moderat")
1124
+ end
1125
+
1126
+ let!(:record) do
1127
+ band.records.build(name: "Moderat")
1128
+ end
1129
+
1130
+ let!(:track) do
1131
+ record.tracks.build(name: "Berlin")
1132
+ end
1133
+
1134
+ before do
1135
+ band.save
1136
+ end
1137
+
1138
+ it "executes the callback" do
1139
+ expect(track.before_create_called).to be_true
1140
+ end
1141
+ end
1142
+ end
1143
+
1144
+ context "when the child is persisted" do
1145
+
1146
+ let(:band) do
1147
+ Band.create(name: "Moderat")
1148
+ end
1149
+
1150
+ let!(:record) do
1151
+ band.records.create(name: "Moderat")
1152
+ end
1153
+
1154
+ let!(:track) do
1155
+ record.tracks.create(name: "Berlin")
1156
+ end
1157
+
1158
+ before do
1159
+ track.before_create_called = false
1160
+ band.save
1161
+ end
1162
+
1163
+ it "does not execute the callback" do
1164
+ expect(track.before_create_called).to be_false
1165
+ end
1166
+ end
1167
+ end
1168
+
1169
+ describe "#before_save" do
1170
+
1171
+ context "when the child is new" do
1172
+
1173
+ context "when the root is new" do
1174
+
1175
+ let(:band) do
1176
+ Band.new(name: "Moderat")
1177
+ end
1178
+
1179
+ let!(:record) do
1180
+ band.records.build(name: "Moderat")
1181
+ end
1182
+
1183
+ let!(:track) do
1184
+ record.tracks.build(name: "Berlin")
1185
+ end
1186
+
1187
+ before do
1188
+ band.save
1189
+ end
1190
+
1191
+ let(:reloaded) do
1192
+ band.reload.records.first
1193
+ end
1194
+
1195
+ it "executes the callback" do
1196
+ expect(track.before_save_called).to be_true
1197
+ end
1198
+
1199
+ it "persists the change" do
1200
+ expect(reloaded.tracks.first.before_save_called).to be_true
1201
+ end
1202
+ end
1203
+
1204
+ context "when the parent is persisted" do
1205
+
1206
+ let(:band) do
1207
+ Band.create(name: "Moderat")
1208
+ end
1209
+
1210
+ let!(:record) do
1211
+ band.records.build(name: "Moderat")
1212
+ end
1213
+
1214
+ let!(:track) do
1215
+ record.tracks.build(name: "Berlin")
1216
+ end
1217
+
1218
+ before do
1219
+ band.save
1220
+ end
1221
+
1222
+ let(:reloaded) do
1223
+ band.reload.records.first
1224
+ end
1225
+
1226
+ it "executes the callback" do
1227
+ expect(track.before_save_called).to be_true
1228
+ end
1229
+
1230
+ it "persists the change" do
1231
+ expect(reloaded.tracks.first.before_save_called).to be_true
1232
+ end
1233
+ end
1234
+ end
1235
+
1236
+ context "when the child is persisted" do
1237
+
1238
+ let(:band) do
1239
+ Band.create(name: "Moderat")
1240
+ end
1241
+
1242
+ let!(:record) do
1243
+ band.records.create(name: "Moderat")
1244
+ end
1245
+
1246
+ let!(:track) do
1247
+ record.tracks.create(name: "Berlin")
1248
+ end
1249
+
1250
+ before do
1251
+ band.save
1252
+ end
1253
+
1254
+ let(:reloaded) do
1255
+ band.reload.records.first
1256
+ end
1257
+
1258
+ it "executes the callback" do
1259
+ expect(track.before_save_called).to be_true
1260
+ end
1261
+
1262
+ it "persists the change" do
1263
+ expect(reloaded.tracks.first.before_save_called).to be_true
1264
+ end
1265
+ end
1266
+ end
1267
+
1268
+ describe "#before_update" do
1269
+
1270
+ context "when the child is new" do
1271
+
1272
+ context "when the parent is new" do
1273
+
1274
+ let(:band) do
1275
+ Band.new(name: "Moderat")
1276
+ end
1277
+
1278
+ let!(:record) do
1279
+ band.records.build(name: "Moderat")
1280
+ end
1281
+
1282
+ let!(:track) do
1283
+ record.tracks.build(name: "Berlin")
1284
+ end
1285
+
1286
+ before do
1287
+ band.save
1288
+ end
1289
+
1290
+ it "does not execute the callback" do
1291
+ expect(track.before_update_called).to be_false
1292
+ end
1293
+ end
1294
+
1295
+ context "when the parent is persisted" do
1296
+
1297
+ let(:band) do
1298
+ Band.create(name: "Moderat")
1299
+ end
1300
+
1301
+ let!(:record) do
1302
+ band.records.build(name: "Moderat")
1303
+ end
1304
+
1305
+ let!(:track) do
1306
+ record.tracks.build(name: "Berlin")
1307
+ end
1308
+
1309
+ before do
1310
+ band.save
1311
+ end
1312
+
1313
+ it "does not execute the callback" do
1314
+ expect(track.before_update_called).to be_false
1315
+ end
1316
+ end
1317
+ end
1318
+
1319
+ context "when the child is persisted" do
1320
+
1321
+ let(:band) do
1322
+ Band.create(name: "Moderat")
1323
+ end
1324
+
1325
+ let!(:record) do
1326
+ band.records.create(name: "Moderat")
1327
+ end
1328
+
1329
+ let!(:track) do
1330
+ record.tracks.create(name: "Berlin")
1331
+ end
1332
+
1333
+ context "when the child is dirty" do
1334
+
1335
+ before do
1336
+ track.name = "Rusty Nails"
1337
+ band.save
1338
+ end
1339
+
1340
+ let(:reloaded) do
1341
+ band.reload.records.first
1342
+ end
1343
+
1344
+ it "executes the callback" do
1345
+ expect(track.before_update_called).to be_true
1346
+ end
1347
+
1348
+ it "persists the change" do
1349
+ expect(reloaded.tracks.first.before_update_called).to be_true
1350
+ end
1351
+ end
1352
+
1353
+ context "when the child is not dirty" do
1354
+
1355
+ before do
1356
+ band.save
1357
+ end
1358
+
1359
+ it "does not execute the callback" do
1360
+ expect(track.before_update_called).to be_false
1361
+ end
1362
+ end
1363
+ end
1364
+ end
1365
+
1366
+ describe "#before_validation" do
1367
+
1368
+ context "when the child is new" do
1369
+
1370
+ context "when the parent is new" do
1371
+
1372
+ let(:band) do
1373
+ Band.new(name: "Moderat")
1374
+ end
1375
+
1376
+ let!(:record) do
1377
+ band.records.build(name: "Moderat")
1378
+ end
1379
+
1380
+ let!(:track) do
1381
+ record.tracks.build(name: "Berlin")
1382
+ end
1383
+
1384
+ before do
1385
+ band.save
1386
+ end
1387
+
1388
+ it "executes the callback" do
1389
+ expect(track.before_validation_called).to be_true
1390
+ end
1391
+ end
1392
+
1393
+ context "when the parent is persisted" do
1394
+
1395
+ let(:band) do
1396
+ Band.create(name: "Moderat")
1397
+ end
1398
+
1399
+ let!(:record) do
1400
+ band.records.build(name: "Moderat")
1401
+ end
1402
+
1403
+ let!(:track) do
1404
+ record.tracks.build(name: "Berlin")
1405
+ end
1406
+
1407
+ before do
1408
+ band.save
1409
+ end
1410
+
1411
+ it "executes the callback" do
1412
+ expect(track.before_validation_called).to be_true
1413
+ end
1414
+ end
1415
+ end
1416
+
1417
+ context "when the child is persisted" do
1418
+
1419
+ let(:band) do
1420
+ Band.create(name: "Moderat")
1421
+ end
1422
+
1423
+ let!(:record) do
1424
+ band.records.create(name: "Moderat")
1425
+ end
1426
+
1427
+ let!(:track) do
1428
+ record.tracks.create(name: "Berlin")
1429
+ end
1430
+
1431
+ before do
1432
+ band.save
1433
+ end
1434
+
1435
+ it "executes the callback" do
1436
+ expect(track.before_validation_called).to be_true
1437
+ end
1438
+ end
1439
+ end
1440
+ end
1441
+ end
1442
+
1443
+ context "callback on valid?" do
1444
+
1445
+ it "goes in all validation callback in good order" do
1446
+ shin = ValidationCallback.new
1447
+ shin.valid?
1448
+ expect(shin.history).to eq([:before_validation, :validate, :after_validation])
1449
+ end
1450
+ end
1451
+
1452
+ context "when creating child documents in callbacks" do
1453
+
1454
+ let(:parent) do
1455
+ ParentDoc.new
1456
+ end
1457
+
1458
+ before do
1459
+ parent.save
1460
+ end
1461
+
1462
+ it "does not duplicate the child documents" do
1463
+ parent.child_docs.create(position: 1)
1464
+ expect(ParentDoc.find(parent.id).child_docs.size).to eq(1)
1465
+ end
1466
+ end
1467
+
1468
+ context "when callbacks cancel persistence" do
1469
+
1470
+ let(:address) do
1471
+ Address.new(street: "123 Sesame")
1472
+ end
1473
+
1474
+ before(:all) do
1475
+ Person.before_save do |doc|
1476
+ doc.mode != :prevent_save
1477
+ end
1478
+ end
1479
+
1480
+ after(:all) do
1481
+ Person.reset_callbacks(:save)
1482
+ end
1483
+
1484
+ context "when creating a document" do
1485
+
1486
+ let(:person) do
1487
+ Person.new(mode: :prevent_save, title: "Associate", addresses: [ address ])
1488
+ end
1489
+
1490
+ it "fails to save" do
1491
+ expect(person).to be_valid
1492
+ expect(person.save).to be_false
1493
+ end
1494
+
1495
+ it "is a new record" do
1496
+ expect(person).to be_a_new_record
1497
+ expect { person.save }.not_to change { person.new_record? }
1498
+ end
1499
+
1500
+ it "is left dirty" do
1501
+ expect(person).to be_changed
1502
+ expect { person.save }.not_to change { person.changed? }
1503
+ end
1504
+
1505
+ it "child documents are left dirty" do
1506
+ expect(address).to be_changed
1507
+ expect { person.save }.not_to change { address.changed? }
1508
+ end
1509
+ end
1510
+
1511
+ context "when updating a document" do
1512
+
1513
+ let(:person) do
1514
+ Person.create.tap do |person|
1515
+ person.attributes = {
1516
+ mode: :prevent_save,
1517
+ title: "Associate",
1518
+ addresses: [ address ]
1519
+ }
1520
+ end
1521
+ end
1522
+
1523
+ it "#save returns false" do
1524
+ expect(person).to be_valid
1525
+ expect(person.save).to be_false
1526
+ end
1527
+
1528
+ it "is a not a new record" do
1529
+ expect(person).to_not be_a_new_record
1530
+ expect { person.save }.not_to change { person.new_record? }
1531
+ end
1532
+
1533
+ it "is left dirty" do
1534
+ expect(person).to be_changed
1535
+ expect { person.save }.not_to change { person.changed? }
1536
+ end
1537
+
1538
+ it "child documents are left dirty" do
1539
+ expect(address).to be_changed
1540
+ expect { person.save }.not_to change { address.changed? }
1541
+ end
1542
+ end
1543
+ end
1544
+
1545
+ context "when loading a model multiple times" do
1546
+
1547
+ before do
1548
+ load "spec/app/models/callback_test.rb"
1549
+ load "spec/app/models/callback_test.rb"
1550
+ end
1551
+
1552
+ let(:callback) do
1553
+ CallbackTest.new
1554
+ end
1555
+
1556
+ context "when saving the document" do
1557
+
1558
+ it "only executes the callbacks once" do
1559
+ callback.should_receive(:execute).once
1560
+ callback.save
1561
+ end
1562
+ end
1563
+ end
1564
+ end