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,1289 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongoid::Relations::Referenced::One do
4
+
5
+ describe "#=" do
6
+
7
+ context "when the relationship is an illegal embedded reference" do
8
+
9
+ let(:game) do
10
+ Game.new
11
+ end
12
+
13
+ let(:video) do
14
+ Video.new
15
+ end
16
+
17
+ it "raises a mixed relation error" do
18
+ expect {
19
+ game.video = video
20
+ }.to raise_error(Mongoid::Errors::MixedRelations)
21
+ end
22
+ end
23
+
24
+ context "when the relation is cyclic" do
25
+
26
+ let(:user) do
27
+ User.new
28
+ end
29
+
30
+ let(:role) do
31
+ Role.new
32
+ end
33
+
34
+ before do
35
+ user.role = role
36
+ end
37
+
38
+ it "does not raise an error" do
39
+ expect(user.role).to eq(role)
40
+ end
41
+ end
42
+
43
+ context "when the relation is not polymorphic" do
44
+
45
+ context "when the parent is a new record" do
46
+
47
+ let(:person) do
48
+ Person.new
49
+ end
50
+
51
+ let(:game) do
52
+ Game.new
53
+ end
54
+
55
+ let(:metadata) do
56
+ Game.relations["person"]
57
+ end
58
+
59
+ before do
60
+ metadata.should_receive(:criteria).never
61
+ person.game = game
62
+ end
63
+
64
+ it "sets the target of the relation" do
65
+ expect(person.game.target).to eq(game)
66
+ end
67
+
68
+ it "sets the foreign key on the relation" do
69
+ expect(game.person_id).to eq(person.id)
70
+ end
71
+
72
+ it "sets the base on the inverse relation" do
73
+ expect(game.person).to eq(person)
74
+ end
75
+
76
+ it "sets the same instance on the inverse relation" do
77
+ expect(game.person).to eql(person)
78
+ end
79
+
80
+ it "does not save the target" do
81
+ expect(game).to_not be_persisted
82
+ end
83
+ end
84
+
85
+ context "when the parent is not a new record" do
86
+
87
+ let(:person) do
88
+ Person.create
89
+ end
90
+
91
+ let(:game) do
92
+ Game.new
93
+ end
94
+
95
+ before do
96
+ person.game = game
97
+ end
98
+
99
+ it "sets the target of the relation" do
100
+ expect(person.game.target).to eq(game)
101
+ end
102
+
103
+ it "sets the foreign key of the relation" do
104
+ expect(game.person_id).to eq(person.id)
105
+ end
106
+
107
+ it "sets the base on the inverse relation" do
108
+ expect(game.person).to eq(person)
109
+ end
110
+
111
+ it "sets the same instance on the inverse relation" do
112
+ expect(game.person).to eql(person)
113
+ end
114
+
115
+ it "saves the target" do
116
+ expect(game).to be_persisted
117
+ end
118
+
119
+ context "when reloading the parent" do
120
+
121
+ before do
122
+ person.reload
123
+ end
124
+
125
+ context "when setting a new document on the relation" do
126
+
127
+ before do
128
+ person.game = Game.new
129
+ end
130
+
131
+ it "detaches the previous relation" do
132
+ expect {
133
+ game.reload
134
+ }.to raise_error(Mongoid::Errors::DocumentNotFound)
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ context "when relation have a different primary_key" do
141
+
142
+ let(:person) do
143
+ Person.create
144
+ end
145
+
146
+ let(:cat) do
147
+ Cat.new
148
+ end
149
+
150
+ before do
151
+ person.cat = cat
152
+ end
153
+
154
+ it "sets the target of the relation" do
155
+ expect(person.cat.target).to eq(cat)
156
+ end
157
+
158
+ it "sets the foreign key of the relation" do
159
+ expect(cat.person_id).to eq(person.username)
160
+ end
161
+
162
+ it "sets the base on the inverse relation" do
163
+ expect(cat.person).to eq(person)
164
+ end
165
+
166
+ it "sets the same instance on the inverse relation" do
167
+ expect(cat.person).to eql(person)
168
+ end
169
+
170
+ it "saves the target" do
171
+ expect(cat).to be_persisted
172
+ end
173
+ end
174
+ end
175
+
176
+ context "when the relation is polymorphic" do
177
+
178
+ context "when the parent is a new record" do
179
+
180
+ let(:bar) do
181
+ Bar.new
182
+ end
183
+
184
+ let(:rating) do
185
+ Rating.new
186
+ end
187
+
188
+ before do
189
+ bar.rating = rating
190
+ end
191
+
192
+ it "sets the target of the relation" do
193
+ expect(bar.rating.target).to eq(rating)
194
+ end
195
+
196
+ it "sets the foreign key on the relation" do
197
+ expect(rating.ratable_id).to eq(bar.id)
198
+ end
199
+
200
+ it "sets the base on the inverse relation" do
201
+ expect(rating.ratable).to eq(bar)
202
+ end
203
+
204
+ it "sets the same instance on the inverse relation" do
205
+ expect(rating.ratable).to eql(bar)
206
+ end
207
+
208
+ it "does not save the target" do
209
+ expect(rating).to_not be_persisted
210
+ end
211
+ end
212
+
213
+ context "when the parent is not a new record" do
214
+
215
+ let(:bar) do
216
+ Bar.create
217
+ end
218
+
219
+ let(:rating) do
220
+ Rating.new
221
+ end
222
+
223
+ before do
224
+ bar.rating = rating
225
+ end
226
+
227
+ it "sets the target of the relation" do
228
+ expect(bar.rating.target).to eq(rating)
229
+ end
230
+
231
+ it "sets the foreign key of the relation" do
232
+ expect(rating.ratable_id).to eq(bar.id)
233
+ end
234
+
235
+ it "sets the base on the inverse relation" do
236
+ expect(rating.ratable).to eq(bar)
237
+ end
238
+
239
+ it "sets the same instance on the inverse relation" do
240
+ expect(rating.ratable).to eql(bar)
241
+ end
242
+
243
+ it "saves the target" do
244
+ expect(rating).to be_persisted
245
+ end
246
+ end
247
+
248
+ context "when replacing an existing persisted (dependent: :destroy) relation" do
249
+
250
+ let!(:person) do
251
+ Person.create
252
+ end
253
+
254
+ let!(:game) do
255
+ person.create_game(name: "Starcraft")
256
+ end
257
+
258
+ context "with a new one created via the parent" do
259
+
260
+ let!(:new_game) do
261
+ person.create_game(name: "Starcraft 2")
262
+ end
263
+
264
+ it "sets the new relation on the parent" do
265
+ expect(person.game).to eq(new_game)
266
+ end
267
+
268
+ it "removes the old foreign key reference" do
269
+ expect(game.person_id).to be_nil
270
+ end
271
+
272
+ it "removes the reference to the parent" do
273
+ expect(game.person).to be_nil
274
+ end
275
+
276
+ it "destroys the old child" do
277
+ expect(game).to be_destroyed
278
+ end
279
+
280
+ it "leaves the old child unpersisted" do
281
+ expect(game.persisted?).to be_false
282
+ end
283
+
284
+ it "leaves the new child persisted" do
285
+ expect(new_game.persisted?).to be_true
286
+ end
287
+ end
288
+
289
+ context "with a new one built via the parent" do
290
+
291
+ let!(:new_game) do
292
+ person.build_game(name: "Starcraft 2")
293
+ end
294
+
295
+ it "sets the new relation on the parent" do
296
+ expect(person.game).to eq(new_game)
297
+ end
298
+
299
+ it "removes the old foreign key reference" do
300
+ expect(game.person_id).to be_nil
301
+ end
302
+
303
+ it "removes the reference to the parent" do
304
+ expect(game.person).to be_nil
305
+ end
306
+
307
+ it "does not destroy the old child" do
308
+ expect(game).to_not be_destroyed
309
+ end
310
+
311
+ it "leaves the old child persisted" do
312
+ expect(game.persisted?).to be_true
313
+ end
314
+
315
+ it "leaves the new child unpersisted" do
316
+ expect(new_game.persisted?).to be_false
317
+ end
318
+ end
319
+ end
320
+
321
+ context "when replacing an existing unpersisted (dependent: :destroy) relation" do
322
+
323
+ let!(:person) do
324
+ Person.create
325
+ end
326
+
327
+ let!(:game) do
328
+ person.build_game(name: "Starcraft")
329
+ end
330
+
331
+ context "with a new one created via the parent" do
332
+
333
+ let!(:new_game) do
334
+ person.create_game(name: "Starcraft 2")
335
+ end
336
+
337
+ it "sets the new relation on the parent" do
338
+ expect(person.game).to eq(new_game)
339
+ end
340
+
341
+ it "removes the old foreign key reference" do
342
+ expect(game.person_id).to be_nil
343
+ end
344
+
345
+ it "removes the reference to the parent" do
346
+ expect(game.person).to be_nil
347
+ end
348
+
349
+ it "destroys the old child" do
350
+ expect(game).to be_destroyed
351
+ end
352
+
353
+ it "leaves the old child unpersisted" do
354
+ expect(game.persisted?).to be_false
355
+ end
356
+
357
+ it "leaves the new child persisted" do
358
+ expect(new_game.persisted?).to be_true
359
+ end
360
+ end
361
+
362
+ context "with a new one built via the parent" do
363
+
364
+ let!(:new_game) do
365
+ person.build_game(name: "Starcraft 2")
366
+ end
367
+
368
+ it "sets the new relation on the parent" do
369
+ expect(person.game).to eq(new_game)
370
+ end
371
+
372
+ it "removes the old foreign key reference" do
373
+ expect(game.person_id).to be_nil
374
+ end
375
+
376
+ it "removes the reference to the parent" do
377
+ expect(game.person).to be_nil
378
+ end
379
+
380
+ it "does not destroy the old child" do
381
+ expect(game).to_not be_destroyed
382
+ end
383
+
384
+ it "leaves the old child unpersisted" do
385
+ expect(game.persisted?).to be_false
386
+ end
387
+
388
+ it "leaves the new child unpersisted" do
389
+ expect(new_game.persisted?).to be_false
390
+ end
391
+ end
392
+ end
393
+
394
+ context "when replacing an existing persisted (dependent: :nullify) relation" do
395
+
396
+ let!(:person) do
397
+ Person.create
398
+ end
399
+
400
+ let!(:cat) do
401
+ person.create_cat(name: "Cuddles")
402
+ end
403
+
404
+ context "with a new one created via the parent" do
405
+
406
+ let!(:new_cat) do
407
+ person.create_cat(name: "Brutus")
408
+ end
409
+
410
+ it "sets the new relation on the parent" do
411
+ expect(person.cat).to eq(new_cat)
412
+ end
413
+
414
+ it "removes the old foreign key reference" do
415
+ expect(cat.person_id).to be_nil
416
+ end
417
+
418
+ it "removes the reference to the parent" do
419
+ expect(cat.person).to be_nil
420
+ end
421
+
422
+ it "does not destroy the old child" do
423
+ expect(cat).to_not be_destroyed
424
+ end
425
+
426
+ it "leaves the old child persisted" do
427
+ expect(cat.persisted?).to be_true
428
+ end
429
+
430
+ it "leaves the new child persisted" do
431
+ expect(new_cat.persisted?).to be_true
432
+ end
433
+ end
434
+
435
+ context "with a new one built via the parent" do
436
+
437
+ let!(:new_cat) do
438
+ person.build_cat(name: "Brutus")
439
+ end
440
+
441
+ it "sets the new relation on the parent" do
442
+ expect(person.cat).to eq(new_cat)
443
+ end
444
+
445
+ it "removes the old foreign key reference" do
446
+ expect(cat.person_id).to be_nil
447
+ end
448
+
449
+ it "removes the reference to the parent" do
450
+ expect(cat.person).to be_nil
451
+ end
452
+
453
+ it "does not destroy the old child" do
454
+ expect(cat).to_not be_destroyed
455
+ end
456
+
457
+ it "leaves the old child persisted" do
458
+ expect(cat.persisted?).to be_true
459
+ end
460
+
461
+ it "leaves the new child unpersisted" do
462
+ expect(new_cat.persisted?).to be_false
463
+ end
464
+ end
465
+ end
466
+
467
+ context "when replacing an existing unpersisted (dependent: :nullify) relation" do
468
+
469
+ let!(:person) do
470
+ Person.create
471
+ end
472
+
473
+ let!(:cat) do
474
+ person.build_cat(name: "Cuddles")
475
+ end
476
+
477
+ context "with a new one created via the parent" do
478
+
479
+ let!(:new_cat) do
480
+ person.create_cat(name: "Brutus")
481
+ end
482
+
483
+ it "sets the new relation on the parent" do
484
+ expect(person.cat).to eq(new_cat)
485
+ end
486
+
487
+ it "removes the old foreign key reference" do
488
+ expect(cat.person_id).to be_nil
489
+ end
490
+
491
+ it "removes the reference to the parent" do
492
+ expect(cat.person).to be_nil
493
+ end
494
+
495
+ it "does not destroy the old child" do
496
+ expect(cat).to_not be_destroyed
497
+ end
498
+
499
+ it "leaves the old child unpersisted" do
500
+ expect(cat.persisted?).to be_false
501
+ end
502
+
503
+ it "leaves the new child persisted" do
504
+ expect(new_cat.persisted?).to be_true
505
+ end
506
+ end
507
+
508
+ context "with a new one built via the parent" do
509
+
510
+ let!(:new_cat) do
511
+ person.build_cat(name: "Brutus")
512
+ end
513
+
514
+ it "sets the new relation on the parent" do
515
+ expect(person.cat).to eq(new_cat)
516
+ end
517
+
518
+ it "removes the old foreign key reference" do
519
+ expect(cat.person_id).to be_nil
520
+ end
521
+
522
+ it "removes the reference to the parent" do
523
+ expect(cat.person).to be_nil
524
+ end
525
+
526
+ it "does not destroy the old child" do
527
+ expect(cat).to_not be_destroyed
528
+ end
529
+
530
+ it "leaves the old child unpersisted" do
531
+ expect(cat.persisted?).to be_false
532
+ end
533
+
534
+ it "leaves the new child unpersisted" do
535
+ expect(new_cat.persisted?).to be_false
536
+ end
537
+ end
538
+ end
539
+
540
+ context "when replacing an existing relation with a new one" do
541
+
542
+ let!(:person) do
543
+ Person.create
544
+ end
545
+
546
+ context "when dependent is destroy" do
547
+
548
+ let!(:game) do
549
+ person.create_game(name: "Starcraft")
550
+ end
551
+
552
+ let!(:new_game) do
553
+ Game.create(name: "Starcraft 2")
554
+ end
555
+
556
+ before do
557
+ person.game = new_game
558
+ end
559
+
560
+ it "sets the new relation on the parent" do
561
+ expect(person.game).to eq(new_game)
562
+ end
563
+
564
+ it "removes the old foreign key reference" do
565
+ expect(game.person_id).to be_nil
566
+ end
567
+
568
+ it "removes the reference to the parent" do
569
+ expect(game.person).to be_nil
570
+ end
571
+
572
+ it "destroys the old child" do
573
+ expect(game).to be_destroyed
574
+ end
575
+ end
576
+
577
+ context "when dependent is not set" do
578
+
579
+ let!(:account) do
580
+ person.create_account(name: "savings")
581
+ end
582
+
583
+ let!(:new_account) do
584
+ Account.create(name: "checking")
585
+ end
586
+
587
+ before do
588
+ person.account = new_account
589
+ end
590
+
591
+ it "sets the new relation on the parent" do
592
+ expect(person.account).to eq(new_account)
593
+ end
594
+
595
+ it "removes the old foreign key reference" do
596
+ expect(account.person_id).to be_nil
597
+ end
598
+
599
+ it "removes the reference to the parent" do
600
+ expect(account.person).to be_nil
601
+ end
602
+
603
+ it "nullifies the old child" do
604
+ expect(account).to_not be_destroyed
605
+ end
606
+ end
607
+ end
608
+ end
609
+ end
610
+
611
+ describe "#= nil" do
612
+
613
+ context "when the relation is not polymorphic" do
614
+
615
+ context "when the parent is a new record" do
616
+
617
+ let(:person) do
618
+ Person.new
619
+ end
620
+
621
+ let(:game) do
622
+ Game.new
623
+ end
624
+
625
+ before do
626
+ person.game = game
627
+ person.game = nil
628
+ end
629
+
630
+ it "sets the relation to nil" do
631
+ expect(person.game).to be_nil
632
+ end
633
+
634
+ it "removed the inverse relation" do
635
+ expect(game.person).to be_nil
636
+ end
637
+
638
+ it "removes the foreign key value" do
639
+ expect(game.person_id).to be_nil
640
+ end
641
+ end
642
+
643
+ context "when the parent is not a new record" do
644
+
645
+ let(:person) do
646
+ Person.create
647
+ end
648
+
649
+ let(:game) do
650
+ Game.new
651
+ end
652
+
653
+ before do
654
+ person.game = game
655
+ person.game = nil
656
+ end
657
+
658
+ it "sets the relation to nil" do
659
+ expect(person.game).to be_nil
660
+ end
661
+
662
+ it "removed the inverse relation" do
663
+ expect(game.person).to be_nil
664
+ end
665
+
666
+ it "removes the foreign key value" do
667
+ expect(game.person_id).to be_nil
668
+ end
669
+
670
+ it "deletes the target from the database" do
671
+ expect(game).to be_destroyed
672
+ end
673
+ end
674
+ end
675
+
676
+ context "when the relation is polymorphic" do
677
+
678
+ context "when the parent is a new record" do
679
+
680
+ let(:bar) do
681
+ Bar.new
682
+ end
683
+
684
+ let(:rating) do
685
+ Rating.new
686
+ end
687
+
688
+ before do
689
+ bar.rating = rating
690
+ bar.rating = nil
691
+ end
692
+
693
+ it "sets the relation to nil" do
694
+ expect(bar.rating).to be_nil
695
+ end
696
+
697
+ it "removed the inverse relation" do
698
+ expect(rating.ratable).to be_nil
699
+ end
700
+
701
+ it "removes the foreign key value" do
702
+ expect(rating.ratable_id).to be_nil
703
+ end
704
+ end
705
+
706
+ context "when the parent is not a new record" do
707
+
708
+ let(:bar) do
709
+ Bar.create
710
+ end
711
+
712
+ let(:rating) do
713
+ Rating.new
714
+ end
715
+
716
+ before do
717
+ bar.rating = rating
718
+ bar.rating = nil
719
+ end
720
+
721
+ it "sets the relation to nil" do
722
+ expect(bar.rating).to be_nil
723
+ end
724
+
725
+ it "removed the inverse relation" do
726
+ expect(rating.ratable).to be_nil
727
+ end
728
+
729
+ it "removes the foreign key value" do
730
+ expect(rating.ratable_id).to be_nil
731
+ end
732
+
733
+ it "applies the appropriate dependent option" do
734
+ expect(rating).to_not be_destroyed
735
+ end
736
+ end
737
+ end
738
+ end
739
+
740
+ describe "#build_#\{name}" do
741
+
742
+ context "when the relationship is an illegal embedded reference" do
743
+
744
+ let(:game) do
745
+ Game.new
746
+ end
747
+
748
+ it "raises a mixed relation error" do
749
+ expect {
750
+ game.build_video(title: "Tron")
751
+ }.to raise_error(Mongoid::Errors::MixedRelations)
752
+ end
753
+ end
754
+
755
+ context "when the relation is not polymorphic" do
756
+
757
+ context "when using object ids" do
758
+
759
+ let(:person) do
760
+ Person.create
761
+ end
762
+
763
+ let(:game) do
764
+ person.build_game(score: 50)
765
+ end
766
+
767
+ it "returns a new document" do
768
+ expect(game.score).to eq(50)
769
+ end
770
+
771
+ it "sets the foreign key on the document" do
772
+ expect(game.person_id).to eq(person.id)
773
+ end
774
+
775
+ it "sets the inverse relation" do
776
+ expect(game.person).to eq(person)
777
+ end
778
+
779
+ it "does not save the built document" do
780
+ expect(game).to_not be_persisted
781
+ end
782
+ end
783
+
784
+ context "when providing no attributes" do
785
+
786
+ let(:person) do
787
+ Person.create
788
+ end
789
+
790
+ let(:game) do
791
+ person.build_game
792
+ end
793
+
794
+ it "sets the foreign key on the document" do
795
+ expect(game.person_id).to eq(person.id)
796
+ end
797
+
798
+ it "sets the inverse relation" do
799
+ expect(game.person).to eq(person)
800
+ end
801
+
802
+ it "does not save the built document" do
803
+ expect(game).to_not be_persisted
804
+ end
805
+ end
806
+
807
+ context "when providing nil attributes" do
808
+
809
+ let(:person) do
810
+ Person.create
811
+ end
812
+
813
+ let(:game) do
814
+ person.build_game(nil)
815
+ end
816
+
817
+ it "sets the foreign key on the document" do
818
+ expect(game.person_id).to eq(person.id)
819
+ end
820
+
821
+ it "sets the inverse relation" do
822
+ expect(game.person).to eq(person)
823
+ end
824
+
825
+ it "does not save the built document" do
826
+ expect(game).to_not be_persisted
827
+ end
828
+ end
829
+ end
830
+
831
+ context "when the relation is polymorphic" do
832
+
833
+ context "when using object ids" do
834
+
835
+ let(:bar) do
836
+ Bar.create
837
+ end
838
+
839
+ let(:rating) do
840
+ bar.build_rating(value: 5)
841
+ end
842
+
843
+ it "returns a new document" do
844
+ expect(rating.value).to eq(5)
845
+ end
846
+
847
+ it "sets the foreign key on the document" do
848
+ expect(rating.ratable_id).to eq(bar.id)
849
+ end
850
+
851
+ it "sets the inverse relation" do
852
+ expect(rating.ratable).to eq(bar)
853
+ end
854
+
855
+ it "does not save the built document" do
856
+ expect(rating).to_not be_persisted
857
+ end
858
+ end
859
+ end
860
+ end
861
+
862
+ describe ".builder" do
863
+
864
+ let(:builder_klass) do
865
+ Mongoid::Relations::Builders::Referenced::One
866
+ end
867
+
868
+ let(:document) do
869
+ double
870
+ end
871
+
872
+ let(:metadata) do
873
+ double(extension?: false)
874
+ end
875
+
876
+ it "returns the embedded in builder" do
877
+ expect(
878
+ described_class.builder(nil, metadata, document)
879
+ ).to be_a_kind_of(builder_klass)
880
+ end
881
+ end
882
+
883
+ describe "#create_#\{name}" do
884
+
885
+ context "when the relationship is an illegal embedded reference" do
886
+
887
+ let(:game) do
888
+ Game.new
889
+ end
890
+
891
+ it "raises a mixed relation error" do
892
+ expect {
893
+ game.create_video(title: "Tron")
894
+ }.to raise_error(Mongoid::Errors::MixedRelations)
895
+ end
896
+ end
897
+
898
+ context "when the relation is not polymorphic" do
899
+
900
+ let(:person) do
901
+ Person.create
902
+ end
903
+
904
+ let(:game) do
905
+ person.create_game(score: 50)
906
+ end
907
+
908
+ it "returns a new document" do
909
+ expect(game.score).to eq(50)
910
+ end
911
+
912
+ it "sets the foreign key on the document" do
913
+ expect(game.person_id).to eq(person.id)
914
+ end
915
+
916
+ it "sets the inverse relation" do
917
+ expect(game.person).to eq(person)
918
+ end
919
+
920
+ it "saves the document" do
921
+ expect(game).to be_persisted
922
+ end
923
+ end
924
+
925
+ context "when providing no attributes" do
926
+
927
+ let(:person) do
928
+ Person.create
929
+ end
930
+
931
+ let(:game) do
932
+ person.create_game
933
+ end
934
+
935
+ it "sets the foreign key on the document" do
936
+ expect(game.person_id).to eq(person.id)
937
+ end
938
+
939
+ it "sets the inverse relation" do
940
+ expect(game.person).to eq(person)
941
+ end
942
+
943
+ it "saves the document" do
944
+ expect(game).to be_persisted
945
+ end
946
+ end
947
+
948
+ context "when providing nil attributes" do
949
+
950
+ let(:person) do
951
+ Person.create
952
+ end
953
+
954
+ let(:game) do
955
+ person.create_game(nil)
956
+ end
957
+
958
+ it "sets the foreign key on the document" do
959
+ expect(game.person_id).to eq(person.id)
960
+ end
961
+
962
+ it "sets the inverse relation" do
963
+ expect(game.person).to eq(person)
964
+ end
965
+
966
+ it "saves the document" do
967
+ expect(game).to be_persisted
968
+ end
969
+ end
970
+
971
+ context "when the relation is polymorphic" do
972
+
973
+ let(:bar) do
974
+ Bar.create
975
+ end
976
+
977
+ let(:rating) do
978
+ bar.create_rating(value: 5)
979
+ end
980
+
981
+ it "returns a new document" do
982
+ expect(rating.value).to eq(5)
983
+ end
984
+
985
+ it "sets the foreign key on the document" do
986
+ expect(rating.ratable_id).to eq(bar.id)
987
+ end
988
+
989
+ it "sets the inverse relation" do
990
+ expect(rating.ratable).to eq(bar)
991
+ end
992
+
993
+ it "saves the document" do
994
+ expect(rating).to be_persisted
995
+ end
996
+ end
997
+ end
998
+
999
+ describe ".criteria" do
1000
+
1001
+ let(:id) do
1002
+ Moped::BSON::ObjectId.new
1003
+ end
1004
+
1005
+ context "when the relation is polymorphic" do
1006
+
1007
+ let(:metadata) do
1008
+ Book.relations["rating"]
1009
+ end
1010
+
1011
+ let(:criteria) do
1012
+ described_class.criteria(metadata, id, Book)
1013
+ end
1014
+
1015
+ it "includes the type in the criteria" do
1016
+ expect(criteria.selector).to eq(
1017
+ {
1018
+ "ratable_id" => id,
1019
+ "ratable_type" => "Book"
1020
+ }
1021
+ )
1022
+ end
1023
+ end
1024
+
1025
+ context "when the relation is not polymorphic" do
1026
+
1027
+ let(:metadata) do
1028
+ Person.relations["game"]
1029
+ end
1030
+
1031
+ let(:criteria) do
1032
+ described_class.criteria(metadata, id, Person)
1033
+ end
1034
+
1035
+ it "does not include the type in the criteria" do
1036
+ expect(criteria.selector).to eq({ "person_id" => id })
1037
+ end
1038
+ end
1039
+ end
1040
+
1041
+ describe ".eager_load" do
1042
+
1043
+ before do
1044
+ Mongoid.identity_map_enabled = true
1045
+ end
1046
+
1047
+ after do
1048
+ Mongoid.identity_map_enabled = false
1049
+ end
1050
+
1051
+ context "when the relation is not polymorphic" do
1052
+
1053
+ let!(:person) do
1054
+ Person.create
1055
+ end
1056
+
1057
+ let!(:game) do
1058
+ person.create_game(name: "Tron")
1059
+ end
1060
+
1061
+ let(:metadata) do
1062
+ Person.relations["game"]
1063
+ end
1064
+
1065
+ let!(:eager) do
1066
+ described_class.eager_load(metadata, Person.all.map(&:_id))
1067
+ end
1068
+
1069
+ let(:map) do
1070
+ Mongoid::IdentityMap.get(Game, {"person_id" => person.id})
1071
+ end
1072
+
1073
+ it "puts the documents in the identity map" do
1074
+ expect(map).to eq(game)
1075
+ end
1076
+ end
1077
+
1078
+ context "when the relation is polymorphic" do
1079
+
1080
+ let!(:book) do
1081
+ Book.create(name: "Game of Thrones")
1082
+ end
1083
+
1084
+ let!(:movie) do
1085
+ Movie.create(name: "Bladerunner")
1086
+ end
1087
+
1088
+ let!(:movie_rating) do
1089
+ movie.ratings.create(value: 10)
1090
+ end
1091
+
1092
+ let!(:book_rating) do
1093
+ book.create_rating(value: 10)
1094
+ end
1095
+
1096
+ let(:metadata) do
1097
+ Book.relations["rating"]
1098
+ end
1099
+
1100
+ let!(:eager) do
1101
+ described_class.eager_load(metadata, Book.all.map(&:_id))
1102
+ end
1103
+
1104
+ let(:map) do
1105
+ Mongoid::IdentityMap.get(Rating, {"ratable_id" => book.id})
1106
+ end
1107
+
1108
+ it "puts the documents in the identity map" do
1109
+ expect(map).to eq(book_rating)
1110
+ end
1111
+ end
1112
+ end
1113
+
1114
+ describe ".embedded?" do
1115
+
1116
+ it "returns false" do
1117
+ expect(described_class).to_not be_embedded
1118
+ end
1119
+ end
1120
+
1121
+ describe ".foreign_key_suffix" do
1122
+
1123
+ it "returns _id" do
1124
+ expect(described_class.foreign_key_suffix).to eq("_id")
1125
+ end
1126
+ end
1127
+
1128
+ describe ".macro" do
1129
+
1130
+ it "returns has_one" do
1131
+ expect(described_class.macro).to eq(:has_one)
1132
+ end
1133
+ end
1134
+
1135
+ describe "#nullify" do
1136
+
1137
+ let(:person) do
1138
+ Person.create
1139
+ end
1140
+
1141
+ let!(:game) do
1142
+ person.create_game(name: "Starcraft II")
1143
+ end
1144
+
1145
+ context "when the instance has been set" do
1146
+
1147
+ before do
1148
+ person.game.nullify
1149
+ end
1150
+
1151
+ it "removes the foreign key from the target" do
1152
+ expect(game.person_id).to be_nil
1153
+ end
1154
+
1155
+ it "removes the reference from the target" do
1156
+ expect(game.person).to be_nil
1157
+ end
1158
+ end
1159
+
1160
+ context "when the instance has been reloaded" do
1161
+
1162
+ let(:from_db) do
1163
+ Person.find(person.id)
1164
+ end
1165
+
1166
+ let(:game_reloaded) do
1167
+ Game.find(game.id)
1168
+ end
1169
+
1170
+ before do
1171
+ from_db.game.nullify
1172
+ end
1173
+
1174
+ it "removes the foreign key from the target" do
1175
+ expect(game_reloaded.person_id).to be_nil
1176
+ end
1177
+
1178
+ it "removes the reference from the target" do
1179
+ expect(game_reloaded.person).to be_nil
1180
+ end
1181
+ end
1182
+ end
1183
+
1184
+ describe "#respond_to?" do
1185
+
1186
+ let(:person) do
1187
+ Person.new
1188
+ end
1189
+
1190
+ let!(:game) do
1191
+ person.build_game(name: "Tron")
1192
+ end
1193
+
1194
+ let(:document) do
1195
+ person.game
1196
+ end
1197
+
1198
+ Mongoid::Document.public_instance_methods(true).each do |method|
1199
+
1200
+ context "when checking #{method}" do
1201
+
1202
+ it "returns true" do
1203
+ expect(document.respond_to?(method)).to be_true
1204
+ end
1205
+ end
1206
+ end
1207
+ end
1208
+
1209
+ describe ".stores_foreign_key?" do
1210
+
1211
+ it "returns false" do
1212
+ expect(described_class.stores_foreign_key?).to be_false
1213
+ end
1214
+ end
1215
+
1216
+ describe ".valid_options" do
1217
+
1218
+ it "returns the valid options" do
1219
+ expect(described_class.valid_options).to eq(
1220
+ [ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
1221
+ )
1222
+ end
1223
+ end
1224
+
1225
+ describe ".validation_default" do
1226
+
1227
+ it "returns true" do
1228
+ expect(described_class.validation_default).to be_true
1229
+ end
1230
+ end
1231
+
1232
+ context "when reloading the relation" do
1233
+
1234
+ let!(:person) do
1235
+ Person.create
1236
+ end
1237
+
1238
+ let!(:game_one) do
1239
+ Game.create(name: "Warcraft 3")
1240
+ end
1241
+
1242
+ let!(:game_two) do
1243
+ Game.create(name: "Starcraft 2")
1244
+ end
1245
+
1246
+ before do
1247
+ person.game = game_one
1248
+ end
1249
+
1250
+ context "when the relation references the same document" do
1251
+
1252
+ before do
1253
+ Game.collection.find({ _id: game_one.id }).
1254
+ update({ "$set" => { name: "Diablo 2" }})
1255
+ end
1256
+
1257
+ let(:reloaded) do
1258
+ person.game(true)
1259
+ end
1260
+
1261
+ it "reloads the document from the database" do
1262
+ expect(reloaded.name).to eq("Diablo 2")
1263
+ end
1264
+
1265
+ it "sets a new document instance" do
1266
+ expect(reloaded).to_not equal(game_one)
1267
+ end
1268
+ end
1269
+
1270
+ context "when the relation references a different document" do
1271
+
1272
+ before do
1273
+ person.game = game_two
1274
+ end
1275
+
1276
+ let(:reloaded) do
1277
+ person.game(true)
1278
+ end
1279
+
1280
+ it "reloads the new document from the database" do
1281
+ expect(reloaded.name).to eq("Starcraft 2")
1282
+ end
1283
+
1284
+ it "sets a new document instance" do
1285
+ expect(reloaded).to_not equal(game_one)
1286
+ end
1287
+ end
1288
+ end
1289
+ end