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,1014 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Embedded::One do
4
+
5
+ describe "#===" do
6
+
7
+ let(:base) do
8
+ Person.new
9
+ end
10
+
11
+ let(:target) do
12
+ Name.new
13
+ end
14
+
15
+ let(:metadata) do
16
+ Person.relations["name"]
17
+ end
18
+
19
+ let(:relation) do
20
+ described_class.new(base, target, metadata)
21
+ end
22
+
23
+ context "when the proxied document is same class" do
24
+
25
+ it "returns true" do
26
+ expect((relation === Name.new)).to be_true
27
+ end
28
+ end
29
+ end
30
+
31
+ describe "#=" do
32
+
33
+ context "when the relation is not cyclic" do
34
+
35
+ context "when the parent is a new record" do
36
+
37
+ let(:person) do
38
+ Person.new
39
+ end
40
+
41
+ let(:name) do
42
+ Name.new
43
+ end
44
+
45
+ before do
46
+ person.name = name
47
+ end
48
+
49
+ it "sets the target of the relation" do
50
+ expect(person.name).to eq(name)
51
+ end
52
+
53
+ it "sets the base on the inverse relation" do
54
+ expect(name.namable).to eq(person)
55
+ end
56
+
57
+ it "sets the same instance on the inverse relation" do
58
+ expect(name.namable).to eql(person)
59
+ end
60
+
61
+ it "does not save the target" do
62
+ expect(name).to_not be_persisted
63
+ end
64
+
65
+ context "with overwritten getter" do
66
+
67
+ before do
68
+ person.name = nil
69
+ def person.name_with_default
70
+ name_without_default or (self.name = Name.new)
71
+ end
72
+ class << person
73
+ alias_method_chain :name, :default
74
+ end
75
+ end
76
+
77
+ it "sets the target without an invinite recursion" do
78
+ person.name = name
79
+ expect(person.name).to be_present
80
+ end
81
+ end
82
+ end
83
+
84
+ context "when the parent is not a new record" do
85
+
86
+ let(:person) do
87
+ Person.create
88
+ end
89
+
90
+ let(:name) do
91
+ Name.new
92
+ end
93
+
94
+ context "when setting with a hash" do
95
+
96
+ before do
97
+ person.name = {}
98
+ end
99
+
100
+ let!(:child_name) do
101
+ person.name
102
+ end
103
+
104
+ it "sets the target of the relation" do
105
+ expect(person.name).to eq(child_name)
106
+ end
107
+
108
+ it "sets the base on the inverse relation" do
109
+ expect(child_name.namable).to eq(person)
110
+ end
111
+
112
+ it "sets the same instance on the inverse relation" do
113
+ expect(child_name.namable).to eql(person)
114
+ end
115
+
116
+ it "saves the target" do
117
+ expect(child_name).to be_persisted
118
+ end
119
+
120
+ context "when replacing a relation with a hash" do
121
+
122
+ before do
123
+ person.name = {}
124
+ end
125
+
126
+ it "sets the relation with the proper object" do
127
+ expect(person.name).to be_a(Name)
128
+ end
129
+ end
130
+ end
131
+
132
+ context "when setting to the same document" do
133
+
134
+ before do
135
+ person.name = name
136
+ person.name = person.name
137
+ end
138
+
139
+ it "does not change the relation" do
140
+ expect(person.name).to eq(name)
141
+ end
142
+
143
+ it "does not persist any change" do
144
+ expect(person.reload.name).to eq(name)
145
+ end
146
+ end
147
+
148
+ context "when setting directly" do
149
+
150
+ before do
151
+ person.name = name
152
+ end
153
+
154
+ it "sets the target of the relation" do
155
+ expect(person.name).to eq(name)
156
+ end
157
+
158
+ it "sets the base on the inverse relation" do
159
+ expect(name.namable).to eq(person)
160
+ end
161
+
162
+ it "sets the same instance on the inverse relation" do
163
+ expect(name.namable).to eql(person)
164
+ end
165
+
166
+ it "saves the target" do
167
+ expect(name).to be_persisted
168
+ end
169
+
170
+ context "when replacing an exising document" do
171
+
172
+ let(:pet_owner) do
173
+ PetOwner.create
174
+ end
175
+
176
+ let(:pet_one) do
177
+ Pet.new
178
+ end
179
+
180
+ let(:pet_two) do
181
+ Pet.new
182
+ end
183
+
184
+ before do
185
+ pet_owner.pet = pet_one
186
+ pet_owner.pet = pet_two
187
+ end
188
+
189
+ it "runs the destroy callbacks on the old document" do
190
+ expect(pet_one.destroy_flag).to be_true
191
+ end
192
+ end
193
+ end
194
+
195
+ context "when setting via the parent attributes" do
196
+
197
+ before do
198
+ person.attributes = { name: name }
199
+ end
200
+
201
+ it "sets the target of the relation" do
202
+ expect(person.name).to eq(name)
203
+ end
204
+
205
+ it "does not save the target" do
206
+ expect(name).to_not be_persisted
207
+ end
208
+ end
209
+ end
210
+ end
211
+
212
+ context "when the relation is cyclic" do
213
+
214
+ context "when the parent is a new record" do
215
+
216
+ let(:parent_shelf) do
217
+ Shelf.new
218
+ end
219
+
220
+ let(:child_shelf) do
221
+ Shelf.new
222
+ end
223
+
224
+ before do
225
+ parent_shelf.child_shelf = child_shelf
226
+ end
227
+
228
+ it "sets the target of the relation" do
229
+ expect(parent_shelf.child_shelf).to eq(child_shelf)
230
+ end
231
+
232
+ it "sets the base on the inverse relation" do
233
+ expect(child_shelf.parent_shelf).to eq(parent_shelf)
234
+ end
235
+
236
+ it "sets the same instance on the inverse relation" do
237
+ expect(child_shelf.parent_shelf).to eql(parent_shelf)
238
+ end
239
+
240
+ it "does not save the target" do
241
+ expect(child_shelf).to_not be_persisted
242
+ end
243
+ end
244
+
245
+ context "when the parent is not a new record" do
246
+
247
+ let(:parent_shelf) do
248
+ Shelf.create
249
+ end
250
+
251
+ let(:child_shelf) do
252
+ Shelf.new
253
+ end
254
+
255
+ before do
256
+ parent_shelf.child_shelf = child_shelf
257
+ end
258
+
259
+ it "sets the target of the relation" do
260
+ expect(parent_shelf.child_shelf).to eq(child_shelf)
261
+ end
262
+
263
+ it "sets the base on the inverse relation" do
264
+ expect(child_shelf.parent_shelf).to eq(parent_shelf)
265
+ end
266
+
267
+ it "sets the same instance on the inverse relation" do
268
+ expect(child_shelf.parent_shelf).to eql(parent_shelf)
269
+ end
270
+
271
+ it "saves the target" do
272
+ expect(child_shelf).to be_persisted
273
+ end
274
+ end
275
+ end
276
+
277
+ context "when setting a new document multiple times in a row" do
278
+
279
+ let(:parent) do
280
+ Parent.create
281
+ end
282
+
283
+ before do
284
+ parent.first_child = Child.new
285
+ parent.first_child = Child.new
286
+ parent.first_child = Child.new
287
+ end
288
+
289
+ it "saves the child document" do
290
+ expect(parent.first_child).to be_a(Child)
291
+ end
292
+ end
293
+ end
294
+
295
+ describe "#= nil" do
296
+
297
+ context "when the relation is not cyclic" do
298
+
299
+ context "when the parent is a new record" do
300
+
301
+ let(:person) do
302
+ Person.new
303
+ end
304
+
305
+ let(:name) do
306
+ Name.new
307
+ end
308
+
309
+ before do
310
+ person.name = name
311
+ person.name = nil
312
+ end
313
+
314
+ it "sets the relation to nil" do
315
+ expect(person.name).to be_nil
316
+ end
317
+
318
+ it "removes the inverse relation" do
319
+ expect(name.namable).to be_nil
320
+ end
321
+ end
322
+
323
+ context "when the inverse is already nil" do
324
+
325
+ let(:person) do
326
+ Person.new
327
+ end
328
+
329
+ before do
330
+ person.name = nil
331
+ end
332
+
333
+ it "sets the relation to nil" do
334
+ expect(person.name).to be_nil
335
+ end
336
+ end
337
+
338
+ context "when the parent is persisted" do
339
+
340
+ let(:person) do
341
+ Person.create
342
+ end
343
+
344
+ let(:name) do
345
+ Name.new
346
+ end
347
+
348
+ context "when setting directly" do
349
+
350
+ before do
351
+ person.name = name
352
+ person.name = nil
353
+ end
354
+
355
+ it "sets the relation to nil" do
356
+ expect(person.name).to be_nil
357
+ end
358
+
359
+ it "removed the inverse relation" do
360
+ expect(name.namable).to be_nil
361
+ end
362
+
363
+ it "deletes the child document" do
364
+ expect(name).to be_destroyed
365
+ end
366
+ end
367
+
368
+ context "when setting via parent attributes" do
369
+
370
+ before do
371
+ person.name = name
372
+ person.attributes = { name: nil }
373
+ end
374
+
375
+ it "sets the relation to nil" do
376
+ expect(person.name).to be_nil
377
+ end
378
+
379
+ it "does not delete the child document" do
380
+ expect(name).to_not be_destroyed
381
+ end
382
+ end
383
+ end
384
+ end
385
+
386
+ context "when the relation is cyclic" do
387
+
388
+ context "when the parent is a new record" do
389
+
390
+ let(:parent_shelf) do
391
+ Shelf.new
392
+ end
393
+
394
+ let(:child_shelf) do
395
+ Shelf.new
396
+ end
397
+
398
+ before do
399
+ parent_shelf.child_shelf = child_shelf
400
+ parent_shelf.child_shelf = nil
401
+ end
402
+
403
+ it "sets the relation to nil" do
404
+ expect(parent_shelf.child_shelf).to be_nil
405
+ end
406
+
407
+ it "removes the inverse relation" do
408
+ expect(child_shelf.parent_shelf).to be_nil
409
+ end
410
+ end
411
+
412
+ context "when the inverse is already nil" do
413
+
414
+ let(:parent_shelf) do
415
+ Shelf.new
416
+ end
417
+
418
+ before do
419
+ parent_shelf.child_shelf = nil
420
+ end
421
+
422
+ it "sets the relation to nil" do
423
+ expect(parent_shelf.child_shelf).to be_nil
424
+ end
425
+ end
426
+
427
+ context "when the documents are not new records" do
428
+
429
+ let(:parent_shelf) do
430
+ Shelf.create
431
+ end
432
+
433
+ let(:child_shelf) do
434
+ Shelf.new
435
+ end
436
+
437
+ before do
438
+ parent_shelf.child_shelf = child_shelf
439
+ parent_shelf.child_shelf = nil
440
+ end
441
+
442
+ it "sets the relation to nil" do
443
+ expect(parent_shelf.child_shelf).to be_nil
444
+ end
445
+
446
+ it "removed the inverse relation" do
447
+ expect(child_shelf.parent_shelf).to be_nil
448
+ end
449
+
450
+ it "deletes the child document" do
451
+ expect(child_shelf).to be_destroyed
452
+ end
453
+ end
454
+ end
455
+ end
456
+
457
+ describe "#build_#\{name}" do
458
+
459
+ context "when the relation is not cyclic" do
460
+
461
+ context "when the parent is a new record" do
462
+
463
+ context "when not providing any attributes" do
464
+
465
+ context "when building once" do
466
+
467
+ let(:person) do
468
+ Person.new
469
+ end
470
+
471
+ let!(:name) do
472
+ person.build_name
473
+ end
474
+
475
+ it "sets the target of the relation" do
476
+ expect(person.name).to eq(name)
477
+ end
478
+
479
+ it "sets the base on the inverse relation" do
480
+ expect(name.namable).to eq(person)
481
+ end
482
+
483
+ it "sets no attributes" do
484
+ expect(name.first_name).to be_nil
485
+ end
486
+
487
+ it "does not save the target" do
488
+ expect(name).to_not be_persisted
489
+ end
490
+ end
491
+
492
+ context "when building twice" do
493
+
494
+ let(:person) do
495
+ Person.new
496
+ end
497
+
498
+ let!(:name) do
499
+ person.build_name
500
+ person.build_name
501
+ end
502
+
503
+ it "sets the target of the relation" do
504
+ expect(person.name).to eq(name)
505
+ end
506
+
507
+ it "sets the base on the inverse relation" do
508
+ expect(name.namable).to eq(person)
509
+ end
510
+
511
+ it "sets no attributes" do
512
+ expect(name.first_name).to be_nil
513
+ end
514
+
515
+ it "does not save the target" do
516
+ expect(name).to_not be_persisted
517
+ end
518
+ end
519
+ end
520
+
521
+ context "when passing nil as the attributes" do
522
+
523
+ let(:person) do
524
+ Person.new
525
+ end
526
+
527
+ let!(:name) do
528
+ person.build_name(nil)
529
+ end
530
+
531
+ it "sets the target of the relation" do
532
+ expect(person.name).to eq(name)
533
+ end
534
+
535
+ it "sets the base on the inverse relation" do
536
+ expect(name.namable).to eq(person)
537
+ end
538
+
539
+ it "sets no attributes" do
540
+ expect(name.first_name).to be_nil
541
+ end
542
+
543
+ it "does not save the target" do
544
+ expect(name).to_not be_persisted
545
+ end
546
+ end
547
+
548
+ context "when providing attributes" do
549
+
550
+ let(:person) do
551
+ Person.new
552
+ end
553
+
554
+ let!(:name) do
555
+ person.build_name(first_name: "James")
556
+ end
557
+
558
+ it "sets the target of the relation" do
559
+ expect(person.name).to eq(name)
560
+ end
561
+
562
+ it "sets the base on the inverse relation" do
563
+ expect(name.namable).to eq(person)
564
+ end
565
+
566
+ it "sets the attributes" do
567
+ expect(name.first_name).to eq("James")
568
+ end
569
+
570
+ it "does not save the target" do
571
+ expect(name).to_not be_persisted
572
+ end
573
+ end
574
+ end
575
+
576
+ context "when the parent is not a new record" do
577
+
578
+ let(:person) do
579
+ Person.create
580
+ end
581
+
582
+ let!(:name) do
583
+ person.build_name(first_name: "James")
584
+ end
585
+
586
+ it "does not save the target" do
587
+ expect(name).to_not be_persisted
588
+ end
589
+ end
590
+ end
591
+
592
+ context "when the relation is cyclic" do
593
+
594
+ context "when the parent is a new record" do
595
+
596
+ let(:parent_shelf) do
597
+ Shelf.new
598
+ end
599
+
600
+ let!(:child_shelf) do
601
+ parent_shelf.build_child_shelf(level: 1)
602
+ end
603
+
604
+ it "sets the target of the relation" do
605
+ expect(parent_shelf.child_shelf).to eq(child_shelf)
606
+ end
607
+
608
+ it "sets the base on the inverse relation" do
609
+ expect(child_shelf.parent_shelf).to eq(parent_shelf)
610
+ end
611
+
612
+ it "sets the attributes" do
613
+ expect(child_shelf.level).to eq(1)
614
+ end
615
+
616
+ it "does not save the target" do
617
+ expect(child_shelf).to_not be_persisted
618
+ end
619
+ end
620
+
621
+ context "when the parent is not a new record" do
622
+
623
+ let(:parent_shelf) do
624
+ Shelf.create
625
+ end
626
+
627
+ let!(:child_shelf) do
628
+ parent_shelf.build_child_shelf(level: 2)
629
+ end
630
+
631
+ it "does not save the target" do
632
+ expect(child_shelf).to_not be_persisted
633
+ end
634
+ end
635
+ end
636
+ end
637
+
638
+ describe ".builder" do
639
+
640
+ let(:base) do
641
+ Person.new
642
+ end
643
+
644
+ let(:target) do
645
+ Name.new
646
+ end
647
+
648
+ let(:metadata) do
649
+ Person.relations["name"]
650
+ end
651
+
652
+ let(:builder_klass) do
653
+ Mongoid::Relations::Builders::Embedded::One
654
+ end
655
+
656
+ it "returns the embedded one builder" do
657
+ expect(described_class.builder(base, metadata, target)).to be_a(builder_klass)
658
+ end
659
+ end
660
+
661
+ describe "#create_#\{name}" do
662
+
663
+ context "when the parent is a new record" do
664
+
665
+ context "when not providing any attributes" do
666
+
667
+ let(:person) do
668
+ Person.new
669
+ end
670
+
671
+ let!(:name) do
672
+ person.create_name
673
+ end
674
+
675
+ it "sets the target of the relation" do
676
+ expect(person.name).to eq(name)
677
+ end
678
+
679
+ it "sets the base on the inverse relation" do
680
+ expect(name.namable).to eq(person)
681
+ end
682
+
683
+ it "sets no attributes" do
684
+ expect(name.first_name).to be_nil
685
+ end
686
+
687
+ it "saves the target" do
688
+ expect(name).to be_persisted
689
+ end
690
+ end
691
+
692
+ context "when passing nil as the attributes" do
693
+
694
+ let(:person) do
695
+ Person.new
696
+ end
697
+
698
+ let!(:name) do
699
+ person.create_name(nil)
700
+ end
701
+
702
+ it "sets the target of the relation" do
703
+ expect(person.name).to eq(name)
704
+ end
705
+
706
+ it "sets the base on the inverse relation" do
707
+ expect(name.namable).to eq(person)
708
+ end
709
+
710
+ it "sets no attributes" do
711
+ expect(name.first_name).to be_nil
712
+ end
713
+
714
+ it "saves the target" do
715
+ expect(name).to be_persisted
716
+ end
717
+ end
718
+
719
+ context "when providing attributes" do
720
+
721
+ let(:person) do
722
+ Person.new
723
+ end
724
+
725
+ let!(:name) do
726
+ person.create_name(first_name: "James")
727
+ end
728
+
729
+ it "sets the target of the relation" do
730
+ expect(person.name).to eq(name)
731
+ end
732
+
733
+ it "sets the base on the inverse relation" do
734
+ expect(name.namable).to eq(person)
735
+ end
736
+
737
+ it "sets the attributes" do
738
+ expect(name.first_name).to eq("James")
739
+ end
740
+
741
+ it "saves the target" do
742
+ expect(name).to be_persisted
743
+ end
744
+ end
745
+
746
+ context "when the parent is not a new record" do
747
+
748
+ let(:person) do
749
+ Person.create
750
+ end
751
+
752
+ let!(:name) do
753
+ person.create_name(first_name: "James")
754
+ end
755
+
756
+ it "does not save the target" do
757
+ expect(name).to be_persisted
758
+ end
759
+ end
760
+ end
761
+ end
762
+
763
+ describe ".embedded?" do
764
+
765
+ it "returns true" do
766
+ expect(described_class).to be_embedded
767
+ end
768
+ end
769
+
770
+ describe ".foreign_key_suffix" do
771
+
772
+ it "returns nil" do
773
+ expect(described_class.foreign_key_suffix).to be_nil
774
+ end
775
+ end
776
+
777
+ describe ".macro" do
778
+
779
+ it "returns embeds_one" do
780
+ expect(described_class.macro).to eq(:embeds_one)
781
+ end
782
+ end
783
+
784
+ describe ".nested_builder" do
785
+
786
+ let(:nested_builder_klass) do
787
+ Mongoid::Relations::Builders::NestedAttributes::One
788
+ end
789
+
790
+ let(:metadata) do
791
+ Person.relations["name"]
792
+ end
793
+
794
+ let(:attributes) do
795
+ {}
796
+ end
797
+
798
+ it "returns the single nested builder" do
799
+ expect(
800
+ described_class.nested_builder(metadata, attributes, {})
801
+ ).to be_a(nested_builder_klass)
802
+ end
803
+ end
804
+
805
+ describe "#respond_to?" do
806
+
807
+ let(:person) do
808
+ Person.new
809
+ end
810
+
811
+ let!(:name) do
812
+ person.build_name(first_name: "Tony")
813
+ end
814
+
815
+ let(:document) do
816
+ person.name
817
+ end
818
+
819
+ Mongoid::Document.public_instance_methods(true).each do |method|
820
+
821
+ context "when checking #{method}" do
822
+
823
+ it "returns true" do
824
+ expect(document.respond_to?(method)).to be_true
825
+ end
826
+ end
827
+ end
828
+
829
+ it "responds to persisted?" do
830
+ expect(document).to respond_to(:persisted?)
831
+ end
832
+ end
833
+
834
+ describe ".valid_options" do
835
+
836
+ it "returns the valid options" do
837
+ expect(described_class.valid_options).to eq(
838
+ [ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
839
+ )
840
+ end
841
+ end
842
+
843
+ describe ".validation_default" do
844
+
845
+ it "returns true" do
846
+ expect(described_class.validation_default).to be_true
847
+ end
848
+ end
849
+
850
+ context "when the embedded document has an array field" do
851
+
852
+ let!(:person) do
853
+ Person.create
854
+ end
855
+
856
+ let!(:name) do
857
+ person.create_name(
858
+ first_name: "Syd",
859
+ last_name: "Vicious",
860
+ aliases: nil
861
+ )
862
+ end
863
+
864
+ context "when saving the array on a persisted document" do
865
+
866
+ let(:from_db) do
867
+ Person.find(person.id).name
868
+ end
869
+
870
+ before do
871
+ from_db.aliases = [ "Syd", "Sydney" ]
872
+ from_db.save
873
+ end
874
+
875
+ it "sets the values of the array" do
876
+ expect(from_db.aliases).to eq([ "Syd", "Sydney" ])
877
+ end
878
+
879
+ it "persists the array" do
880
+ expect(Person.find(person.id).name.aliases).to eq([ "Syd", "Sydney" ])
881
+ end
882
+ end
883
+ end
884
+
885
+ context "when embedding a many under a one" do
886
+
887
+ let!(:person) do
888
+ Person.create
889
+ end
890
+
891
+ before do
892
+ person.create_name
893
+ end
894
+
895
+ context "when the documents are reloaded from the database" do
896
+
897
+ let(:from_db) do
898
+ Person.first
899
+ end
900
+
901
+ context "when adding a new many" do
902
+
903
+ let(:name) do
904
+ from_db.name
905
+ end
906
+
907
+ let!(:translation) do
908
+ name.translations.new
909
+ end
910
+
911
+ context "when saving the root" do
912
+
913
+ before do
914
+ from_db.save
915
+ end
916
+
917
+ it "persists the new document on the first save" do
918
+ expect(from_db.reload.name.translations).to_not be_empty
919
+ end
920
+ end
921
+ end
922
+ end
923
+ end
924
+
925
+ context "when embedding a one under a many" do
926
+
927
+ let!(:person) do
928
+ Person.create
929
+ end
930
+
931
+ let!(:address_one) do
932
+ person.addresses.create(street: "hobrecht")
933
+ end
934
+
935
+ let!(:address_two) do
936
+ person.addresses.create(street: "kreuzberg")
937
+ end
938
+
939
+ context "when a parent was removed outside of mongoid" do
940
+
941
+ before do
942
+ person.collection.where(_id: person.id).update(
943
+ "$pull" => { "addresses" => { _id: address_one.id }}
944
+ )
945
+ end
946
+
947
+ it "reloads the correct number" do
948
+ expect(person.reload.addresses.count).to eq(1)
949
+ end
950
+
951
+ context "when adding a child" do
952
+
953
+ let(:code) do
954
+ Code.new
955
+ end
956
+
957
+ before do
958
+ address_two.code = code
959
+ end
960
+
961
+ it "reloads the correct number" do
962
+ expect(person.reload.addresses.count).to eq(1)
963
+ end
964
+ end
965
+ end
966
+ end
967
+
968
+ context "when embedded documents are stored without ids" do
969
+
970
+ let!(:band) do
971
+ Band.create(name: "Moderat")
972
+ end
973
+
974
+ before do
975
+ band.collection.
976
+ find(_id: band.id).
977
+ update("$set" => { label: { name: "Mute" }})
978
+ end
979
+
980
+ context "when loading the documents" do
981
+
982
+ before do
983
+ band.reload
984
+ end
985
+
986
+ let(:label) do
987
+ band.label
988
+ end
989
+
990
+ it "creates proper documents from the db" do
991
+ expect(label.name).to eq("Mute")
992
+ end
993
+
994
+ it "assigns ids to the documents" do
995
+ expect(label.id).to_not be_nil
996
+ end
997
+
998
+ context "when subsequently updating the documents" do
999
+
1000
+ before do
1001
+ label.update_attribute(:name, "Interscope")
1002
+ end
1003
+
1004
+ it "updates the document" do
1005
+ expect(label.name).to eq("Interscope")
1006
+ end
1007
+
1008
+ it "persists the change" do
1009
+ expect(label.reload.name).to eq("Interscope")
1010
+ end
1011
+ end
1012
+ end
1013
+ end
1014
+ end