mongoid 3.1.5 → 8.0.2

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 (1501) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +636 -33
  4. data/LICENSE +2 -1
  5. data/README.md +32 -24
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +301 -132
  8. data/lib/mongoid/association/accessors.rb +431 -0
  9. data/lib/mongoid/association/bindable.rb +227 -0
  10. data/lib/mongoid/association/builders.rb +86 -0
  11. data/lib/mongoid/association/constrainable.rb +42 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +57 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +398 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +74 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +135 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +42 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +571 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +53 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +164 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +228 -0
  30. data/lib/mongoid/association/many.rb +202 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +192 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +200 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +74 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +83 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +124 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +345 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +273 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +494 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +551 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +108 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +489 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +41 -61
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +24 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -34
  73. data/lib/mongoid/atomic/paths/root.rb +4 -20
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +52 -69
  76. data/lib/mongoid/attributes/dynamic.rb +141 -0
  77. data/lib/mongoid/attributes/nested.rb +93 -0
  78. data/lib/mongoid/attributes/processing.rb +35 -97
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +27 -10
  81. data/lib/mongoid/attributes.rb +159 -181
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +420 -0
  84. data/lib/mongoid/clients/factory.rb +105 -0
  85. data/lib/mongoid/clients/options.rb +111 -0
  86. data/lib/mongoid/clients/sessions.rb +113 -0
  87. data/lib/mongoid/clients/storage_options.rb +79 -0
  88. data/lib/mongoid/clients/validators/storage.rb +58 -0
  89. data/lib/mongoid/clients/validators.rb +3 -0
  90. data/lib/mongoid/clients.rb +79 -0
  91. data/lib/mongoid/composable.rb +128 -0
  92. data/lib/mongoid/config/environment.rb +51 -13
  93. data/lib/mongoid/config/options.rb +30 -18
  94. data/lib/mongoid/config/validators/client.rb +128 -0
  95. data/lib/mongoid/config/validators/option.rb +3 -4
  96. data/lib/mongoid/config/validators.rb +3 -2
  97. data/lib/mongoid/config.rb +170 -89
  98. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +33 -36
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +80 -79
  103. data/lib/mongoid/contextual/command.rb +8 -11
  104. data/lib/mongoid/contextual/geo_near.rb +42 -44
  105. data/lib/mongoid/contextual/map_reduce.rb +33 -127
  106. data/lib/mongoid/contextual/memory.rb +226 -88
  107. data/lib/mongoid/contextual/mongo.rb +466 -293
  108. data/lib/mongoid/contextual/none.rb +193 -0
  109. data/lib/mongoid/contextual/queryable.rb +3 -4
  110. data/lib/mongoid/contextual.rb +11 -11
  111. data/lib/mongoid/copyable.rb +68 -20
  112. data/lib/mongoid/criteria/findable.rb +143 -0
  113. data/lib/mongoid/criteria/includable.rb +92 -0
  114. data/lib/mongoid/criteria/inspectable.rb +24 -0
  115. data/lib/mongoid/criteria/marshalable.rb +55 -0
  116. data/lib/mongoid/criteria/modifiable.rb +235 -0
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +71 -0
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +151 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +57 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +63 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +52 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +163 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +182 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +102 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +74 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +60 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +66 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +434 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +380 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +937 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +287 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +128 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +90 -0
  149. data/lib/mongoid/criteria/scopable.rb +166 -0
  150. data/lib/mongoid/criteria.rb +177 -189
  151. data/lib/mongoid/deprecable.rb +36 -0
  152. data/lib/mongoid/deprecation.rb +25 -0
  153. data/lib/mongoid/document.rb +193 -139
  154. data/lib/mongoid/equality.rb +35 -18
  155. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  156. data/lib/mongoid/errors/callback.rb +2 -3
  157. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  158. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  159. data/lib/mongoid/errors/document_not_destroyed.rb +22 -0
  160. data/lib/mongoid/errors/document_not_found.rb +36 -21
  161. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  162. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +19 -0
  163. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  164. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  165. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  166. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  167. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  168. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  169. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  170. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  171. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  172. data/lib/mongoid/errors/invalid_field.rb +10 -9
  173. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  174. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  175. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  176. data/lib/mongoid/errors/invalid_find.rb +2 -3
  177. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  178. data/lib/mongoid/errors/invalid_index.rb +2 -3
  179. data/lib/mongoid/errors/invalid_options.rb +4 -5
  180. data/lib/mongoid/errors/invalid_path.rb +2 -3
  181. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  182. data/lib/mongoid/errors/invalid_query.rb +40 -0
  183. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  184. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  185. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  186. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  187. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  188. data/lib/mongoid/errors/invalid_storage_options.rb +4 -5
  189. data/lib/mongoid/errors/invalid_storage_parent.rb +25 -0
  190. data/lib/mongoid/errors/invalid_time.rb +2 -3
  191. data/lib/mongoid/errors/inverse_not_found.rb +4 -5
  192. data/lib/mongoid/errors/mixed_client_configuration.rb +27 -0
  193. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  194. data/lib/mongoid/errors/mongoid_error.rb +22 -23
  195. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  196. data/lib/mongoid/errors/no_client_config.rb +21 -0
  197. data/lib/mongoid/errors/no_client_database.rb +26 -0
  198. data/lib/mongoid/errors/no_client_hosts.rb +26 -0
  199. data/lib/mongoid/errors/no_clients_config.rb +19 -0
  200. data/lib/mongoid/errors/no_default_client.rb +22 -0
  201. data/lib/mongoid/errors/no_environment.rb +2 -3
  202. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  203. data/lib/mongoid/errors/no_metadata.rb +2 -3
  204. data/lib/mongoid/errors/no_parent.rb +2 -3
  205. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  206. data/lib/mongoid/errors/readonly_document.rb +21 -0
  207. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  208. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  209. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  210. data/lib/mongoid/errors/unknown_model.rb +24 -0
  211. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  212. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  213. data/lib/mongoid/errors/validations.rb +2 -1
  214. data/lib/mongoid/errors.rb +30 -9
  215. data/lib/mongoid/evolvable.rb +4 -5
  216. data/lib/mongoid/extensions/array.rb +45 -52
  217. data/lib/mongoid/extensions/big_decimal.rb +41 -22
  218. data/lib/mongoid/extensions/binary.rb +42 -0
  219. data/lib/mongoid/extensions/boolean.rb +19 -17
  220. data/lib/mongoid/extensions/date.rb +33 -23
  221. data/lib/mongoid/extensions/date_time.rb +5 -13
  222. data/lib/mongoid/extensions/decimal128.rb +36 -0
  223. data/lib/mongoid/extensions/false_class.rb +5 -8
  224. data/lib/mongoid/extensions/float.rb +11 -16
  225. data/lib/mongoid/extensions/hash.rb +88 -49
  226. data/lib/mongoid/extensions/integer.rb +10 -18
  227. data/lib/mongoid/extensions/module.rb +3 -4
  228. data/lib/mongoid/extensions/nil_class.rb +2 -5
  229. data/lib/mongoid/extensions/object.rb +38 -62
  230. data/lib/mongoid/extensions/object_id.rb +7 -12
  231. data/lib/mongoid/extensions/range.rb +46 -17
  232. data/lib/mongoid/extensions/regexp.rb +15 -8
  233. data/lib/mongoid/extensions/set.rb +17 -15
  234. data/lib/mongoid/extensions/string.rb +40 -80
  235. data/lib/mongoid/extensions/symbol.rb +7 -23
  236. data/lib/mongoid/extensions/time.rb +42 -25
  237. data/lib/mongoid/extensions/time_with_zone.rb +27 -10
  238. data/lib/mongoid/extensions/true_class.rb +5 -8
  239. data/lib/mongoid/extensions.rb +31 -13
  240. data/lib/mongoid/factory.rb +99 -11
  241. data/lib/mongoid/fields/foreign_key.rb +26 -34
  242. data/lib/mongoid/fields/localized.rb +24 -13
  243. data/lib/mongoid/fields/standard.rb +19 -73
  244. data/lib/mongoid/fields/validators/macro.rb +56 -15
  245. data/lib/mongoid/fields/validators.rb +2 -1
  246. data/lib/mongoid/fields.rb +342 -87
  247. data/lib/mongoid/findable.rb +219 -0
  248. data/lib/mongoid/indexable/specification.rb +103 -0
  249. data/lib/mongoid/indexable/validators/options.rb +110 -0
  250. data/lib/mongoid/indexable.rb +148 -0
  251. data/lib/mongoid/inspectable.rb +52 -0
  252. data/lib/mongoid/interceptable.rb +312 -0
  253. data/lib/mongoid/loggable.rb +15 -18
  254. data/lib/mongoid/matchable.rb +23 -0
  255. data/lib/mongoid/matcher/all.rb +22 -0
  256. data/lib/mongoid/matcher/and.rb +21 -0
  257. data/lib/mongoid/matcher/bits.rb +41 -0
  258. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  259. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  260. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  261. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  262. data/lib/mongoid/matcher/elem_match.rb +36 -0
  263. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  264. data/lib/mongoid/matcher/eq.rb +11 -0
  265. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  266. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  267. data/lib/mongoid/matcher/exists.rb +15 -0
  268. data/lib/mongoid/matcher/expression.rb +35 -0
  269. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  270. data/lib/mongoid/matcher/field_expression.rb +62 -0
  271. data/lib/mongoid/matcher/field_operator.rb +54 -0
  272. data/lib/mongoid/matcher/gt.rb +17 -0
  273. data/lib/mongoid/matcher/gte.rb +17 -0
  274. data/lib/mongoid/matcher/in.rb +25 -0
  275. data/lib/mongoid/matcher/lt.rb +17 -0
  276. data/lib/mongoid/matcher/lte.rb +17 -0
  277. data/lib/mongoid/matcher/mod.rb +17 -0
  278. data/lib/mongoid/matcher/ne.rb +16 -0
  279. data/lib/mongoid/matcher/nin.rb +11 -0
  280. data/lib/mongoid/matcher/nor.rb +25 -0
  281. data/lib/mongoid/matcher/not.rb +29 -0
  282. data/lib/mongoid/matcher/or.rb +21 -0
  283. data/lib/mongoid/matcher/regex.rb +41 -0
  284. data/lib/mongoid/matcher/size.rb +26 -0
  285. data/lib/mongoid/matcher/type.rb +99 -0
  286. data/lib/mongoid/matcher.rb +115 -0
  287. data/lib/mongoid/persistable/creatable.rb +181 -0
  288. data/lib/mongoid/persistable/deletable.rb +132 -0
  289. data/lib/mongoid/persistable/destroyable.rb +57 -0
  290. data/lib/mongoid/persistable/incrementable.rb +35 -0
  291. data/lib/mongoid/persistable/logical.rb +36 -0
  292. data/lib/mongoid/persistable/poppable.rb +36 -0
  293. data/lib/mongoid/persistable/pullable.rb +50 -0
  294. data/lib/mongoid/persistable/pushable.rb +66 -0
  295. data/lib/mongoid/persistable/renamable.rb +37 -0
  296. data/lib/mongoid/persistable/savable.rb +47 -0
  297. data/lib/mongoid/persistable/settable.rb +93 -0
  298. data/lib/mongoid/persistable/unsettable.rb +36 -0
  299. data/lib/mongoid/persistable/updatable.rb +165 -0
  300. data/lib/mongoid/persistable/upsertable.rb +51 -0
  301. data/lib/mongoid/persistable.rb +305 -0
  302. data/lib/mongoid/persistence_context.rb +239 -0
  303. data/lib/mongoid/positional.rb +72 -0
  304. data/lib/mongoid/query_cache.rb +64 -0
  305. data/lib/mongoid/railtie.rb +35 -78
  306. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  307. data/lib/mongoid/railties/database.rake +18 -25
  308. data/lib/mongoid/reloadable.rb +94 -0
  309. data/lib/mongoid/scopable.rb +324 -0
  310. data/lib/mongoid/selectable.rb +49 -0
  311. data/lib/mongoid/serializable.rb +170 -0
  312. data/lib/mongoid/shardable.rb +130 -0
  313. data/lib/mongoid/stateful.rb +134 -0
  314. data/lib/mongoid/stringified_symbol.rb +52 -0
  315. data/lib/mongoid/tasks/database.rake +38 -0
  316. data/lib/mongoid/tasks/database.rb +194 -0
  317. data/lib/mongoid/threaded/lifecycle.rb +28 -70
  318. data/lib/mongoid/threaded.rb +142 -219
  319. data/lib/mongoid/timestamps/created/short.rb +2 -1
  320. data/lib/mongoid/timestamps/created.rb +9 -5
  321. data/lib/mongoid/timestamps/short.rb +2 -1
  322. data/lib/mongoid/timestamps/timeless.rb +52 -16
  323. data/lib/mongoid/timestamps/updated/short.rb +4 -3
  324. data/lib/mongoid/timestamps/updated.rb +14 -9
  325. data/lib/mongoid/timestamps.rb +4 -3
  326. data/lib/mongoid/touchable.rb +131 -0
  327. data/lib/mongoid/traversable.rb +337 -0
  328. data/lib/mongoid/validatable/associated.rb +47 -0
  329. data/lib/mongoid/validatable/format.rb +21 -0
  330. data/lib/mongoid/validatable/length.rb +21 -0
  331. data/lib/mongoid/validatable/localizable.rb +29 -0
  332. data/lib/mongoid/validatable/macros.rb +89 -0
  333. data/lib/mongoid/validatable/presence.rb +81 -0
  334. data/lib/mongoid/validatable/queryable.rb +29 -0
  335. data/lib/mongoid/validatable/uniqueness.rb +304 -0
  336. data/lib/mongoid/validatable.rb +160 -0
  337. data/lib/mongoid/version.rb +3 -2
  338. data/lib/mongoid/warnings.rb +28 -0
  339. data/lib/mongoid.rb +68 -109
  340. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  341. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +150 -45
  342. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -3
  343. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -4
  344. data/lib/rails/generators/mongoid_generator.rb +5 -41
  345. data/lib/rails/mongoid.rb +6 -129
  346. data/spec/README.md +33 -0
  347. data/spec/config/mongoid.yml +56 -25
  348. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  349. data/spec/integration/app_spec.rb +345 -0
  350. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  351. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  352. data/spec/integration/associations/embedded_spec.rb +283 -0
  353. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  354. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  355. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  356. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  357. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  358. data/spec/integration/associations/has_many_spec.rb +128 -0
  359. data/spec/integration/associations/has_one_spec.rb +272 -0
  360. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  361. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  362. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  363. data/spec/integration/associations/scope_option_spec.rb +101 -0
  364. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  365. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  366. data/spec/integration/callbacks_models.rb +155 -0
  367. data/spec/integration/callbacks_spec.rb +450 -0
  368. data/spec/integration/contextual/empty_spec.rb +141 -0
  369. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  370. data/spec/integration/criteria/date_field_spec.rb +40 -0
  371. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  372. data/spec/integration/criteria/logical_spec.rb +124 -0
  373. data/spec/integration/criteria/range_spec.rb +359 -0
  374. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  375. data/spec/integration/discriminator_key_spec.rb +392 -0
  376. data/spec/integration/discriminator_value_spec.rb +206 -0
  377. data/spec/integration/document_spec.rb +51 -0
  378. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  379. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  380. data/spec/integration/matcher_examples_spec.rb +765 -0
  381. data/spec/integration/matcher_operator_data/all.yml +140 -0
  382. data/spec/integration/matcher_operator_data/and.yml +93 -0
  383. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  384. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  385. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  386. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  387. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  388. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  389. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  390. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  391. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  392. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  393. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  394. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  395. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  396. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  398. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  399. data/spec/integration/matcher_operator_data/in.yml +210 -0
  400. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  401. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  402. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  403. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  404. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  405. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  406. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  407. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  408. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  409. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  410. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  411. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  412. data/spec/integration/matcher_operator_data/not.yml +196 -0
  413. data/spec/integration/matcher_operator_data/or.yml +137 -0
  414. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  415. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  416. data/spec/integration/matcher_operator_data/size.yml +174 -0
  417. data/spec/integration/matcher_operator_data/type.yml +70 -0
  418. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  419. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  420. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  421. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  422. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  423. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  424. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  425. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  426. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  428. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  429. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  430. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  431. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  432. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  433. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  434. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  435. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  436. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  437. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  438. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  439. data/spec/integration/matcher_operator_spec.rb +122 -0
  440. data/spec/integration/matcher_spec.rb +283 -0
  441. data/spec/integration/persistence/range_field_spec.rb +350 -0
  442. data/spec/integration/server_query_spec.rb +141 -0
  443. data/spec/integration/shardable_spec.rb +148 -0
  444. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  445. data/spec/lite_spec_helper.rb +83 -0
  446. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  447. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  448. data/spec/mongoid/association/builders_spec.rb +255 -0
  449. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  450. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  451. data/spec/mongoid/association/depending_spec.rb +959 -0
  452. data/spec/mongoid/association/eager_spec.rb +282 -0
  453. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  454. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  455. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +174 -0
  456. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +90 -0
  457. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +619 -0
  458. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  459. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  460. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +218 -0
  461. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4863 -0
  462. data/spec/mongoid/association/embedded/embeds_many_models.rb +226 -0
  463. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  464. data/spec/mongoid/association/embedded/embeds_many_spec.rb +932 -0
  465. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  466. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +106 -0
  467. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  468. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  469. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  470. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  471. data/spec/mongoid/association/embedded/embeds_one_spec.rb +984 -0
  472. data/spec/mongoid/association/macros_spec.rb +1116 -0
  473. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  474. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  475. data/spec/mongoid/association/options_spec.rb +1323 -0
  476. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  477. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +244 -0
  478. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +292 -0
  479. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  480. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1388 -0
  481. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  482. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  483. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  484. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  485. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  486. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  487. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  488. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3836 -0
  489. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  490. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  491. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1104 -0
  492. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  493. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +251 -0
  494. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  495. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  496. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  497. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4161 -0
  498. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  499. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  500. data/spec/mongoid/association/referenced/has_many_spec.rb +1273 -0
  501. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  502. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  503. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  504. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1248 -0
  505. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  506. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  507. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  508. data/spec/mongoid/association/reflections_spec.rb +92 -0
  509. data/spec/mongoid/association/syncable_spec.rb +513 -0
  510. data/spec/mongoid/association_spec.rb +191 -0
  511. data/spec/mongoid/atomic/modifiers_spec.rb +88 -39
  512. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +10 -49
  513. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +9 -49
  514. data/spec/mongoid/atomic/paths/root_spec.rb +5 -61
  515. data/spec/mongoid/atomic/paths_spec.rb +115 -35
  516. data/spec/mongoid/atomic_spec.rb +89 -42
  517. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  518. data/spec/mongoid/attributes/nested_spec.rb +5000 -0
  519. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  520. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  521. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  522. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  523. data/spec/mongoid/attributes/readonly_spec.rb +166 -64
  524. data/spec/mongoid/attributes_spec.rb +1418 -409
  525. data/spec/mongoid/cacheable_spec.rb +114 -0
  526. data/spec/mongoid/changeable_spec.rb +1914 -0
  527. data/spec/mongoid/clients/factory_spec.rb +426 -0
  528. data/spec/mongoid/clients/options_spec.rb +521 -0
  529. data/spec/mongoid/clients/sessions_spec.rb +297 -0
  530. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  531. data/spec/mongoid/clients_spec.rb +1084 -0
  532. data/spec/mongoid/composable_spec.rb +33 -0
  533. data/spec/mongoid/config/environment_spec.rb +138 -17
  534. data/spec/mongoid/config/options_spec.rb +26 -7
  535. data/spec/mongoid/config_spec.rb +607 -93
  536. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  537. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  538. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  539. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +221 -56
  540. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  541. data/spec/mongoid/contextual/atomic_spec.rb +577 -162
  542. data/spec/mongoid/contextual/geo_near_spec.rb +104 -38
  543. data/spec/mongoid/contextual/map_reduce_spec.rb +137 -142
  544. data/spec/mongoid/contextual/memory_spec.rb +1880 -269
  545. data/spec/mongoid/contextual/mongo_spec.rb +2523 -601
  546. data/spec/mongoid/contextual/none_spec.rb +123 -0
  547. data/spec/mongoid/copyable_spec.rb +833 -76
  548. data/spec/mongoid/copyable_spec_models.rb +47 -0
  549. data/spec/mongoid/criteria/findable_spec.rb +1132 -0
  550. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  551. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  552. data/spec/mongoid/criteria/inspectable_spec.rb +29 -0
  553. data/spec/mongoid/criteria/marshalable_spec.rb +47 -0
  554. data/spec/mongoid/criteria/modifiable_spec.rb +1812 -0
  555. data/spec/mongoid/criteria/options_spec.rb +31 -0
  556. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  557. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  558. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +513 -0
  559. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +169 -0
  560. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  561. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  562. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +343 -0
  563. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +434 -0
  564. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  565. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  566. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +314 -0
  567. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  568. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  569. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  570. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  571. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  572. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  573. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  574. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  575. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  576. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  577. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +406 -0
  578. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +387 -0
  579. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  580. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  581. data/spec/mongoid/criteria/queryable/optional_spec.rb +1317 -0
  582. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  583. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  584. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  585. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2119 -0
  586. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  587. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2462 -0
  588. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  589. data/spec/mongoid/criteria/queryable/selector_spec.rb +895 -0
  590. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  591. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  592. data/spec/mongoid/criteria/scopable_spec.rb +601 -0
  593. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  594. data/spec/mongoid/criteria_spec.rb +1828 -3572
  595. data/spec/mongoid/document_fields_spec.rb +262 -0
  596. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  597. data/spec/mongoid/document_query_spec.rb +89 -0
  598. data/spec/mongoid/document_spec.rb +452 -221
  599. data/spec/mongoid/equality_spec.rb +155 -52
  600. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +8 -6
  601. data/spec/mongoid/errors/callback_spec.rb +5 -3
  602. data/spec/mongoid/errors/delete_restriction_spec.rb +7 -5
  603. data/spec/mongoid/errors/document_not_destroyed_spec.rb +35 -0
  604. data/spec/mongoid/errors/document_not_found_spec.rb +89 -11
  605. data/spec/mongoid/errors/invalid_collection_spec.rb +5 -3
  606. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  607. data/spec/mongoid/errors/invalid_config_option_spec.rb +5 -3
  608. data/spec/mongoid/errors/invalid_field_option_spec.rb +5 -3
  609. data/spec/mongoid/errors/invalid_field_spec.rb +6 -4
  610. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  611. data/spec/mongoid/errors/invalid_find_spec.rb +5 -3
  612. data/spec/mongoid/errors/invalid_includes_spec.rb +5 -3
  613. data/spec/mongoid/errors/invalid_index_spec.rb +5 -3
  614. data/spec/mongoid/errors/invalid_options_spec.rb +7 -5
  615. data/spec/mongoid/errors/invalid_path_spec.rb +5 -3
  616. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  617. data/spec/mongoid/errors/invalid_scope_spec.rb +7 -5
  618. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +5 -3
  619. data/spec/mongoid/errors/invalid_storage_options_spec.rb +5 -3
  620. data/spec/mongoid/errors/invalid_time_spec.rb +5 -3
  621. data/spec/mongoid/errors/inverse_not_found_spec.rb +6 -4
  622. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +31 -0
  623. data/spec/mongoid/errors/mixed_relations_spec.rb +5 -3
  624. data/spec/mongoid/errors/mongoid_error_spec.rb +45 -10
  625. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +8 -6
  626. data/spec/mongoid/errors/no_client_config_spec.rb +31 -0
  627. data/spec/mongoid/errors/no_client_database_spec.rb +31 -0
  628. data/spec/mongoid/errors/no_client_hosts_spec.rb +31 -0
  629. data/spec/mongoid/errors/no_clients_config_spec.rb +31 -0
  630. data/spec/mongoid/errors/no_environment_spec.rb +8 -6
  631. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +5 -3
  632. data/spec/mongoid/errors/no_metadata_spec.rb +5 -3
  633. data/spec/mongoid/errors/no_parent_spec.rb +6 -4
  634. data/spec/mongoid/errors/readonly_attribute_spec.rb +5 -3
  635. data/spec/mongoid/errors/readonly_document_spec.rb +31 -0
  636. data/spec/mongoid/errors/scope_overwrite_spec.rb +5 -3
  637. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +6 -4
  638. data/spec/mongoid/errors/unknown_attribute_spec.rb +7 -5
  639. data/spec/mongoid/errors/unsaved_document_spec.rb +6 -4
  640. data/spec/mongoid/errors/unsupported_javascript_spec.rb +5 -3
  641. data/spec/mongoid/errors/validations_spec.rb +9 -7
  642. data/spec/mongoid/extensions/array_spec.rb +108 -116
  643. data/spec/mongoid/extensions/big_decimal_spec.rb +838 -49
  644. data/spec/mongoid/extensions/binary_spec.rb +55 -18
  645. data/spec/mongoid/extensions/boolean_spec.rb +76 -74
  646. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  647. data/spec/mongoid/extensions/date_spec.rb +59 -145
  648. data/spec/mongoid/extensions/date_time_spec.rb +35 -76
  649. data/spec/mongoid/extensions/decimal128_spec.rb +46 -0
  650. data/spec/mongoid/extensions/false_class_spec.rb +7 -5
  651. data/spec/mongoid/extensions/float_spec.rb +69 -62
  652. data/spec/mongoid/extensions/hash_spec.rb +197 -30
  653. data/spec/mongoid/extensions/integer_spec.rb +63 -65
  654. data/spec/mongoid/extensions/module_spec.rb +4 -2
  655. data/spec/mongoid/extensions/nil_class_spec.rb +3 -1
  656. data/spec/mongoid/extensions/object_id_spec.rb +136 -134
  657. data/spec/mongoid/extensions/object_spec.rb +53 -57
  658. data/spec/mongoid/extensions/range_spec.rb +287 -28
  659. data/spec/mongoid/extensions/regexp_spec.rb +71 -21
  660. data/spec/mongoid/extensions/set_spec.rb +112 -4
  661. data/spec/mongoid/extensions/string_spec.rb +188 -89
  662. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  663. data/spec/mongoid/extensions/symbol_spec.rb +25 -30
  664. data/spec/mongoid/extensions/time_spec.rb +703 -110
  665. data/spec/mongoid/extensions/time_with_zone_spec.rb +82 -67
  666. data/spec/mongoid/extensions/true_class_spec.rb +7 -5
  667. data/spec/mongoid/extensions_spec.rb +43 -0
  668. data/spec/mongoid/factory_spec.rb +374 -25
  669. data/spec/mongoid/fields/foreign_key_spec.rb +116 -92
  670. data/spec/mongoid/fields/localized_spec.rb +177 -35
  671. data/spec/mongoid/fields/standard_spec.rb +15 -13
  672. data/spec/mongoid/fields_spec.rb +952 -238
  673. data/spec/mongoid/findable_spec.rb +632 -0
  674. data/spec/mongoid/indexable/specification_spec.rb +129 -0
  675. data/spec/mongoid/indexable_spec.rb +643 -0
  676. data/spec/mongoid/inspectable_spec.rb +86 -0
  677. data/spec/mongoid/interceptable_spec.rb +2373 -0
  678. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  679. data/spec/mongoid/loggable_spec.rb +3 -1
  680. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  681. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  682. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  683. data/spec/mongoid/mongoizable_spec.rb +285 -0
  684. data/spec/mongoid/persistable/creatable_spec.rb +662 -0
  685. data/spec/mongoid/persistable/deletable_spec.rb +514 -0
  686. data/spec/mongoid/persistable/destroyable_spec.rb +455 -0
  687. data/spec/mongoid/persistable/incrementable_spec.rb +241 -0
  688. data/spec/mongoid/persistable/logical_spec.rb +159 -0
  689. data/spec/mongoid/persistable/poppable_spec.rb +131 -0
  690. data/spec/mongoid/persistable/pullable_spec.rb +258 -0
  691. data/spec/mongoid/persistable/pushable_spec.rb +353 -0
  692. data/spec/mongoid/persistable/renamable_spec.rb +151 -0
  693. data/spec/mongoid/persistable/savable_spec.rb +684 -0
  694. data/spec/mongoid/persistable/settable_spec.rb +544 -0
  695. data/spec/mongoid/persistable/unsettable_spec.rb +171 -0
  696. data/spec/mongoid/persistable/updatable_spec.rb +760 -0
  697. data/spec/mongoid/persistable/upsertable_spec.rb +122 -0
  698. data/spec/mongoid/persistable_spec.rb +321 -0
  699. data/spec/mongoid/persistence_context_spec.rb +745 -0
  700. data/spec/mongoid/positional_spec.rb +223 -0
  701. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  702. data/spec/mongoid/query_cache_spec.rb +870 -0
  703. data/spec/mongoid/relations/proxy_spec.rb +125 -47
  704. data/spec/mongoid/reloadable_spec.rb +665 -0
  705. data/spec/mongoid/scopable_spec.rb +1234 -0
  706. data/spec/mongoid/selectable_spec.rb +136 -0
  707. data/spec/mongoid/serializable_spec.rb +963 -0
  708. data/spec/mongoid/shardable_models.rb +61 -0
  709. data/spec/mongoid/shardable_spec.rb +204 -0
  710. data/spec/mongoid/stateful_spec.rb +157 -0
  711. data/spec/mongoid/tasks/database_rake_spec.rb +287 -0
  712. data/spec/mongoid/tasks/database_spec.rb +181 -0
  713. data/spec/mongoid/threaded_spec.rb +88 -78
  714. data/spec/mongoid/timestamps/created/short_spec.rb +9 -7
  715. data/spec/mongoid/timestamps/created_spec.rb +8 -6
  716. data/spec/mongoid/timestamps/timeless_spec.rb +29 -10
  717. data/spec/mongoid/timestamps/updated/short_spec.rb +16 -14
  718. data/spec/mongoid/timestamps/updated_spec.rb +14 -16
  719. data/spec/mongoid/timestamps_spec.rb +406 -18
  720. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  721. data/spec/mongoid/touchable_spec.rb +704 -0
  722. data/spec/mongoid/touchable_spec_models.rb +57 -0
  723. data/spec/mongoid/traversable_spec.rb +1410 -0
  724. data/spec/mongoid/validatable/associated_spec.rb +208 -0
  725. data/spec/mongoid/validatable/format_spec.rb +85 -0
  726. data/spec/mongoid/validatable/length_spec.rb +225 -0
  727. data/spec/mongoid/validatable/numericality_spec.rb +32 -0
  728. data/spec/mongoid/validatable/presence_spec.rb +592 -0
  729. data/spec/mongoid/validatable/uniqueness_spec.rb +2504 -0
  730. data/spec/mongoid/validatable_spec.rb +327 -0
  731. data/spec/mongoid/warnings_spec.rb +35 -0
  732. data/spec/mongoid_spec.rb +20 -20
  733. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  734. data/spec/rails/mongoid_spec.rb +37 -354
  735. data/spec/shared/LICENSE +20 -0
  736. data/spec/shared/bin/get-mongodb-download-url +17 -0
  737. data/spec/shared/bin/s3-copy +45 -0
  738. data/spec/shared/bin/s3-upload +69 -0
  739. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  740. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  741. data/spec/shared/lib/mrss/constraints.rb +378 -0
  742. data/spec/shared/lib/mrss/docker_runner.rb +291 -0
  743. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  744. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  745. data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
  746. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  747. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  748. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  749. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  750. data/spec/shared/lib/mrss/utils.rb +15 -0
  751. data/spec/shared/share/Dockerfile.erb +325 -0
  752. data/spec/shared/share/haproxy-1.conf +16 -0
  753. data/spec/shared/share/haproxy-2.conf +17 -0
  754. data/spec/shared/shlib/config.sh +27 -0
  755. data/spec/shared/shlib/distro.sh +74 -0
  756. data/spec/shared/shlib/server.sh +392 -0
  757. data/spec/shared/shlib/set_env.sh +169 -0
  758. data/spec/spec_helper.rb +163 -42
  759. data/spec/support/authorization.rb +15 -0
  760. data/spec/support/client_registry.rb +9 -0
  761. data/spec/support/constraints.rb +77 -0
  762. data/spec/support/expectations.rb +32 -0
  763. data/spec/support/helpers.rb +11 -0
  764. data/spec/support/macros.rb +81 -0
  765. data/spec/support/models/account.rb +38 -0
  766. data/spec/support/models/acolyte.rb +19 -0
  767. data/spec/support/models/actor.rb +20 -0
  768. data/spec/support/models/actress.rb +4 -0
  769. data/spec/support/models/address.rb +85 -0
  770. data/spec/support/models/address_component.rb +7 -0
  771. data/spec/support/models/address_number.rb +8 -0
  772. data/spec/support/models/agency.rb +7 -0
  773. data/spec/support/models/agent.rb +18 -0
  774. data/spec/support/models/album.rb +20 -0
  775. data/spec/support/models/alert.rb +9 -0
  776. data/spec/support/models/animal.rb +28 -0
  777. data/spec/support/models/answer.rb +8 -0
  778. data/spec/support/models/appointment.rb +9 -0
  779. data/spec/support/models/armrest.rb +9 -0
  780. data/spec/support/models/array_field.rb +7 -0
  781. data/spec/support/models/article.rb +14 -0
  782. data/spec/support/models/artist.rb +91 -0
  783. data/spec/support/models/artwork.rb +6 -0
  784. data/spec/support/models/audible_sound.rb +3 -0
  785. data/spec/support/models/audio.rb +7 -0
  786. data/spec/support/models/augmentation.rb +25 -0
  787. data/spec/support/models/author.rb +8 -0
  788. data/spec/support/models/baby.rb +6 -0
  789. data/spec/support/models/band.rb +40 -0
  790. data/spec/support/models/bar.rb +12 -0
  791. data/spec/support/models/basic.rb +8 -0
  792. data/spec/support/models/bed.rb +3 -0
  793. data/spec/support/models/big_palette.rb +4 -0
  794. data/spec/support/models/birthday.rb +15 -0
  795. data/spec/support/models/bolt.rb +7 -0
  796. data/spec/support/models/bomb.rb +6 -0
  797. data/spec/support/models/book.rb +18 -0
  798. data/spec/support/models/breed.rb +6 -0
  799. data/spec/support/models/browser.rb +8 -0
  800. data/spec/support/models/building.rb +8 -0
  801. data/spec/support/models/building_address.rb +9 -0
  802. data/spec/support/models/bus.rb +9 -0
  803. data/spec/support/models/business.rb +7 -0
  804. data/spec/support/models/callback_test.rb +11 -0
  805. data/spec/support/models/canvas.rb +27 -0
  806. data/spec/support/models/car.rb +3 -0
  807. data/spec/support/models/cat.rb +10 -0
  808. data/spec/support/models/catalog.rb +24 -0
  809. data/spec/support/models/category.rb +10 -0
  810. data/spec/support/models/child.rb +6 -0
  811. data/spec/support/models/child_doc.rb +24 -0
  812. data/spec/support/models/church.rb +8 -0
  813. data/spec/support/models/circle.rb +5 -0
  814. data/spec/support/models/circuit.rb +6 -0
  815. data/spec/support/models/circus.rb +12 -0
  816. data/spec/support/models/code.rb +15 -0
  817. data/spec/support/models/coding/pull_request.rb +11 -0
  818. data/spec/support/models/coding.rb +3 -0
  819. data/spec/support/models/comment.rb +18 -0
  820. data/spec/support/models/company.rb +7 -0
  821. data/spec/support/models/consumption_period.rb +9 -0
  822. data/spec/support/models/contextable_item.rb +7 -0
  823. data/spec/support/models/contractor.rb +7 -0
  824. data/spec/support/models/cookie.rb +8 -0
  825. data/spec/support/models/country_code.rb +12 -0
  826. data/spec/support/models/courier_job.rb +6 -0
  827. data/spec/support/models/crate.rb +12 -0
  828. data/spec/support/models/customer.rb +10 -0
  829. data/spec/support/models/customer_address.rb +11 -0
  830. data/spec/support/models/deed.rb +7 -0
  831. data/spec/support/models/definition.rb +11 -0
  832. data/spec/support/models/delegating_patient.rb +15 -0
  833. data/spec/support/models/description.rb +13 -0
  834. data/spec/support/models/dictionary.rb +18 -0
  835. data/spec/support/models/division.rb +12 -0
  836. data/spec/support/models/doctor.rb +14 -0
  837. data/spec/support/models/dog.rb +9 -0
  838. data/spec/support/models/dokument.rb +8 -0
  839. data/spec/support/models/draft.rb +11 -0
  840. data/spec/support/models/dragon.rb +6 -0
  841. data/spec/support/models/driver.rb +9 -0
  842. data/spec/support/models/drug.rb +8 -0
  843. data/spec/support/models/dungeon.rb +6 -0
  844. data/spec/support/models/edit.rb +7 -0
  845. data/spec/support/models/email.rb +8 -0
  846. data/spec/support/models/employer.rb +7 -0
  847. data/spec/support/models/entry.rb +8 -0
  848. data/spec/support/models/eraser.rb +3 -0
  849. data/spec/support/models/even.rb +9 -0
  850. data/spec/support/models/event.rb +24 -0
  851. data/spec/support/models/exhibition.rb +6 -0
  852. data/spec/support/models/exhibitor.rb +8 -0
  853. data/spec/support/models/explosion.rb +6 -0
  854. data/spec/support/models/eye.rb +11 -0
  855. data/spec/support/models/eye_bowl.rb +11 -0
  856. data/spec/support/models/face.rb +10 -0
  857. data/spec/support/models/fanatic.rb +8 -0
  858. data/spec/support/models/favorite.rb +8 -0
  859. data/spec/support/models/filesystem.rb +7 -0
  860. data/spec/support/models/fire_hydrant.rb +8 -0
  861. data/spec/support/models/firefox.rb +6 -0
  862. data/spec/support/models/fish.rb +9 -0
  863. data/spec/support/models/folder.rb +9 -0
  864. data/spec/support/models/folder_item.rb +11 -0
  865. data/spec/support/models/fruits.rb +36 -0
  866. data/spec/support/models/game.rb +21 -0
  867. data/spec/support/models/ghost.rb +9 -0
  868. data/spec/support/models/guitar.rb +4 -0
  869. data/spec/support/models/hole.rb +12 -0
  870. data/spec/support/models/home.rb +6 -0
  871. data/spec/support/models/house.rb +8 -0
  872. data/spec/support/models/html_writer.rb +5 -0
  873. data/spec/support/models/id_key.rb +8 -0
  874. data/spec/support/models/idnodef.rb +7 -0
  875. data/spec/support/models/image.rb +24 -0
  876. data/spec/support/models/implant.rb +27 -0
  877. data/spec/support/models/instrument.rb +8 -0
  878. data/spec/support/models/item.rb +10 -0
  879. data/spec/support/models/jar.rb +9 -0
  880. data/spec/support/models/kaleidoscope.rb +8 -0
  881. data/spec/support/models/kangaroo.rb +6 -0
  882. data/spec/support/models/label.rb +52 -0
  883. data/spec/support/models/language.rb +7 -0
  884. data/spec/support/models/lat_lng.rb +17 -0
  885. data/spec/support/models/league.rb +13 -0
  886. data/spec/support/models/learner.rb +4 -0
  887. data/spec/support/models/line_item.rb +8 -0
  888. data/spec/support/models/location.rb +10 -0
  889. data/spec/support/models/login.rb +10 -0
  890. data/spec/support/models/manufacturer.rb +9 -0
  891. data/spec/support/models/meat.rb +6 -0
  892. data/spec/support/models/membership.rb +7 -0
  893. data/spec/support/models/message.rb +13 -0
  894. data/spec/support/models/minim.rb +6 -0
  895. data/spec/support/models/mixed_drink.rb +6 -0
  896. data/spec/support/models/mop.rb +24 -0
  897. data/spec/support/models/movie.rb +15 -0
  898. data/spec/support/models/my_hash.rb +4 -0
  899. data/spec/support/models/name.rb +26 -0
  900. data/spec/support/models/name_only.rb +8 -0
  901. data/spec/support/models/node.rb +7 -0
  902. data/spec/support/models/note.rb +19 -0
  903. data/spec/support/models/nut.rb +7 -0
  904. data/spec/support/models/odd.rb +9 -0
  905. data/spec/support/models/order.rb +12 -0
  906. data/spec/support/models/ordered_post.rb +13 -0
  907. data/spec/support/models/ordered_preference.rb +8 -0
  908. data/spec/support/models/oscar.rb +16 -0
  909. data/spec/support/models/other_owner_object.rb +4 -0
  910. data/spec/support/models/override.rb +18 -0
  911. data/spec/support/models/ownable.rb +8 -0
  912. data/spec/support/models/owner.rb +10 -0
  913. data/spec/support/models/pack.rb +5 -0
  914. data/spec/support/models/page.rb +18 -0
  915. data/spec/support/models/page_question.rb +6 -0
  916. data/spec/support/models/palette.rb +9 -0
  917. data/spec/support/models/parent.rb +7 -0
  918. data/spec/support/models/parent_doc.rb +8 -0
  919. data/spec/support/models/passport.rb +22 -0
  920. data/spec/support/models/patient.rb +11 -0
  921. data/spec/support/models/pdf_writer.rb +5 -0
  922. data/spec/support/models/pencil.rb +3 -0
  923. data/spec/support/models/person.rb +231 -0
  924. data/spec/support/models/pet.rb +25 -0
  925. data/spec/support/models/pet_owner.rb +8 -0
  926. data/spec/support/models/phone.rb +13 -0
  927. data/spec/support/models/piano.rb +4 -0
  928. data/spec/support/models/pizza.rb +9 -0
  929. data/spec/support/models/player.rb +39 -0
  930. data/spec/support/models/post.rb +52 -0
  931. data/spec/support/models/post_genre.rb +8 -0
  932. data/spec/support/models/powerup.rb +25 -0
  933. data/spec/support/models/preference.rb +11 -0
  934. data/spec/support/models/princess.rb +12 -0
  935. data/spec/support/models/product.rb +19 -0
  936. data/spec/support/models/profile.rb +17 -0
  937. data/spec/support/models/pronunciation.rb +7 -0
  938. data/spec/support/models/pub.rb +8 -0
  939. data/spec/support/models/publication/encyclopedia.rb +11 -0
  940. data/spec/support/models/publication/review.rb +13 -0
  941. data/spec/support/models/publication.rb +4 -0
  942. data/spec/support/models/purchase.rb +6 -0
  943. data/spec/support/models/purchased_item.rb +10 -0
  944. data/spec/support/models/question.rb +10 -0
  945. data/spec/support/models/quiz.rb +9 -0
  946. data/spec/support/models/rating.rb +10 -0
  947. data/spec/support/models/record.rb +54 -0
  948. data/spec/support/models/registry.rb +7 -0
  949. data/spec/support/models/role.rb +9 -0
  950. data/spec/support/models/root_category.rb +6 -0
  951. data/spec/support/models/sandwich.rb +11 -0
  952. data/spec/support/models/scheduler.rb +9 -0
  953. data/spec/support/models/school.rb +14 -0
  954. data/spec/support/models/scribe.rb +7 -0
  955. data/spec/support/models/sealer.rb +7 -0
  956. data/spec/support/models/seat.rb +24 -0
  957. data/spec/support/models/seo.rb +9 -0
  958. data/spec/support/models/series.rb +7 -0
  959. data/spec/support/models/server.rb +15 -0
  960. data/spec/support/models/service.rb +24 -0
  961. data/spec/support/models/shape.rb +14 -0
  962. data/spec/support/models/shelf.rb +7 -0
  963. data/spec/support/models/shield.rb +18 -0
  964. data/spec/support/models/shipment_address.rb +5 -0
  965. data/spec/support/models/shipping_container.rb +7 -0
  966. data/spec/support/models/shipping_pack.rb +5 -0
  967. data/spec/support/models/shirt.rb +11 -0
  968. data/spec/support/models/shop.rb +8 -0
  969. data/spec/support/models/short_agent.rb +6 -0
  970. data/spec/support/models/short_quiz.rb +7 -0
  971. data/spec/support/models/simple.rb +7 -0
  972. data/spec/support/models/slave.rb +8 -0
  973. data/spec/support/models/song.rb +10 -0
  974. data/spec/support/models/sound.rb +7 -0
  975. data/spec/support/models/spacer.rb +7 -0
  976. data/spec/support/models/square.rb +6 -0
  977. data/spec/support/models/staff.rb +9 -0
  978. data/spec/support/models/store_as_dup_test1.rb +7 -0
  979. data/spec/support/models/store_as_dup_test2.rb +7 -0
  980. data/spec/support/models/store_as_dup_test3.rb +7 -0
  981. data/spec/support/models/store_as_dup_test4.rb +7 -0
  982. data/spec/support/models/strategy.rb +5 -0
  983. data/spec/support/models/student.rb +14 -0
  984. data/spec/support/models/sub_item.rb +5 -0
  985. data/spec/support/models/subscription.rb +7 -0
  986. data/spec/support/models/survey.rb +7 -0
  987. data/spec/support/models/symptom.rb +8 -0
  988. data/spec/support/models/system_role.rb +7 -0
  989. data/spec/support/models/tag.rb +10 -0
  990. data/spec/support/models/target.rb +7 -0
  991. data/spec/support/models/template.rb +7 -0
  992. data/spec/support/models/thing.rb +11 -0
  993. data/spec/support/models/threadlocker.rb +7 -0
  994. data/spec/support/models/title.rb +5 -0
  995. data/spec/support/models/tool.rb +10 -0
  996. data/spec/support/models/topping.rb +7 -0
  997. data/spec/support/models/toy.rb +9 -0
  998. data/spec/support/models/track.rb +40 -0
  999. data/spec/support/models/translation.rb +7 -0
  1000. data/spec/support/models/tree.rb +11 -0
  1001. data/spec/support/models/truck.rb +7 -0
  1002. data/spec/support/models/updatable.rb +7 -0
  1003. data/spec/support/models/user.rb +23 -0
  1004. data/spec/support/models/user_account.rb +12 -0
  1005. data/spec/support/models/validation_callback.rb +12 -0
  1006. data/spec/support/models/vehicle.rb +18 -0
  1007. data/spec/support/models/version.rb +7 -0
  1008. data/spec/support/models/vertex.rb +8 -0
  1009. data/spec/support/models/vet_visit.rb +7 -0
  1010. data/spec/support/models/video.rb +15 -0
  1011. data/spec/support/models/video_game.rb +3 -0
  1012. data/spec/support/models/washer.rb +7 -0
  1013. data/spec/support/models/weapon.rb +25 -0
  1014. data/spec/support/models/wiki_page.rb +17 -0
  1015. data/spec/support/models/word.rb +17 -0
  1016. data/spec/support/models/word_origin.rb +13 -0
  1017. data/spec/support/models/writer.rb +13 -0
  1018. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1019. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1020. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1021. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1022. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1023. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1024. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1025. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1026. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1027. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1028. data/spec/support/shared/time.rb +53 -0
  1029. data/spec/support/spec_config.rb +64 -0
  1030. data.tar.gz.sig +0 -0
  1031. metadata +1582 -912
  1032. metadata.gz.sig +0 -0
  1033. data/lib/mongoid/atomic/positionable.rb +0 -73
  1034. data/lib/mongoid/callbacks.rb +0 -314
  1035. data/lib/mongoid/components.rb +0 -93
  1036. data/lib/mongoid/config/inflections.rb +0 -6
  1037. data/lib/mongoid/config/validators/session.rb +0 -140
  1038. data/lib/mongoid/contextual/eager.rb +0 -158
  1039. data/lib/mongoid/contextual/find_and_modify.rb +0 -69
  1040. data/lib/mongoid/criterion/findable.rb +0 -179
  1041. data/lib/mongoid/criterion/inspection.rb +0 -25
  1042. data/lib/mongoid/criterion/marshalable.rb +0 -48
  1043. data/lib/mongoid/criterion/modifiable.rb +0 -189
  1044. data/lib/mongoid/criterion/scoping.rb +0 -158
  1045. data/lib/mongoid/dirty.rb +0 -376
  1046. data/lib/mongoid/errors/eager_load.rb +0 -22
  1047. data/lib/mongoid/errors/mixed_session_configuration.rb +0 -28
  1048. data/lib/mongoid/errors/no_default_session.rb +0 -23
  1049. data/lib/mongoid/errors/no_session_config.rb +0 -22
  1050. data/lib/mongoid/errors/no_session_database.rb +0 -27
  1051. data/lib/mongoid/errors/no_session_hosts.rb +0 -27
  1052. data/lib/mongoid/errors/no_sessions_config.rb +0 -20
  1053. data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
  1054. data/lib/mongoid/finders.rb +0 -130
  1055. data/lib/mongoid/hierarchy.rb +0 -188
  1056. data/lib/mongoid/identity_map.rb +0 -163
  1057. data/lib/mongoid/indexes/validators/options.rb +0 -102
  1058. data/lib/mongoid/indexes.rb +0 -154
  1059. data/lib/mongoid/inspection.rb +0 -55
  1060. data/lib/mongoid/json.rb +0 -16
  1061. data/lib/mongoid/matchers/all.rb +0 -27
  1062. data/lib/mongoid/matchers/and.rb +0 -30
  1063. data/lib/mongoid/matchers/default.rb +0 -72
  1064. data/lib/mongoid/matchers/exists.rb +0 -23
  1065. data/lib/mongoid/matchers/gt.rb +0 -21
  1066. data/lib/mongoid/matchers/gte.rb +0 -21
  1067. data/lib/mongoid/matchers/in.rb +0 -24
  1068. data/lib/mongoid/matchers/lt.rb +0 -21
  1069. data/lib/mongoid/matchers/lte.rb +0 -21
  1070. data/lib/mongoid/matchers/ne.rb +0 -21
  1071. data/lib/mongoid/matchers/nin.rb +0 -21
  1072. data/lib/mongoid/matchers/or.rb +0 -33
  1073. data/lib/mongoid/matchers/size.rb +0 -21
  1074. data/lib/mongoid/matchers/strategies.rb +0 -97
  1075. data/lib/mongoid/matchers.rb +0 -32
  1076. data/lib/mongoid/multi_parameter_attributes.rb +0 -105
  1077. data/lib/mongoid/nested_attributes.rb +0 -78
  1078. data/lib/mongoid/observer.rb +0 -192
  1079. data/lib/mongoid/paranoia.rb +0 -137
  1080. data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
  1081. data/lib/mongoid/persistence/atomic/bit.rb +0 -35
  1082. data/lib/mongoid/persistence/atomic/inc.rb +0 -45
  1083. data/lib/mongoid/persistence/atomic/operation.rb +0 -154
  1084. data/lib/mongoid/persistence/atomic/pop.rb +0 -32
  1085. data/lib/mongoid/persistence/atomic/pull.rb +0 -32
  1086. data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
  1087. data/lib/mongoid/persistence/atomic/push.rb +0 -25
  1088. data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
  1089. data/lib/mongoid/persistence/atomic/rename.rb +0 -30
  1090. data/lib/mongoid/persistence/atomic/sets.rb +0 -28
  1091. data/lib/mongoid/persistence/atomic/unset.rb +0 -27
  1092. data/lib/mongoid/persistence/atomic.rb +0 -231
  1093. data/lib/mongoid/persistence/deletion.rb +0 -32
  1094. data/lib/mongoid/persistence/insertion.rb +0 -38
  1095. data/lib/mongoid/persistence/modification.rb +0 -35
  1096. data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
  1097. data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
  1098. data/lib/mongoid/persistence/operations/insert.rb +0 -34
  1099. data/lib/mongoid/persistence/operations/remove.rb +0 -33
  1100. data/lib/mongoid/persistence/operations/update.rb +0 -59
  1101. data/lib/mongoid/persistence/operations/upsert.rb +0 -28
  1102. data/lib/mongoid/persistence/operations.rb +0 -214
  1103. data/lib/mongoid/persistence/upsertion.rb +0 -31
  1104. data/lib/mongoid/persistence.rb +0 -352
  1105. data/lib/mongoid/railties/document.rb +0 -12
  1106. data/lib/mongoid/relations/accessors.rb +0 -299
  1107. data/lib/mongoid/relations/auto_save.rb +0 -107
  1108. data/lib/mongoid/relations/binding.rb +0 -241
  1109. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -63
  1110. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -52
  1111. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -55
  1112. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -70
  1113. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -42
  1114. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -67
  1115. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1116. data/lib/mongoid/relations/bindings.rb +0 -9
  1117. data/lib/mongoid/relations/builder.rb +0 -57
  1118. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1119. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1120. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1121. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -177
  1122. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -127
  1123. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1124. data/lib/mongoid/relations/builders/referenced/many.rb +0 -27
  1125. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -40
  1126. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1127. data/lib/mongoid/relations/builders.rb +0 -104
  1128. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1129. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1130. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1131. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1132. data/lib/mongoid/relations/cascading.rb +0 -58
  1133. data/lib/mongoid/relations/constraint.rb +0 -49
  1134. data/lib/mongoid/relations/conversions.rb +0 -34
  1135. data/lib/mongoid/relations/counter_cache.rb +0 -107
  1136. data/lib/mongoid/relations/cyclic.rb +0 -107
  1137. data/lib/mongoid/relations/embedded/batchable.rb +0 -356
  1138. data/lib/mongoid/relations/embedded/in.rb +0 -231
  1139. data/lib/mongoid/relations/embedded/many.rb +0 -659
  1140. data/lib/mongoid/relations/embedded/one.rb +0 -223
  1141. data/lib/mongoid/relations/macros.rb +0 -359
  1142. data/lib/mongoid/relations/many.rb +0 -217
  1143. data/lib/mongoid/relations/marshalable.rb +0 -32
  1144. data/lib/mongoid/relations/metadata.rb +0 -1227
  1145. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1146. data/lib/mongoid/relations/one.rb +0 -60
  1147. data/lib/mongoid/relations/options.rb +0 -48
  1148. data/lib/mongoid/relations/polymorphic.rb +0 -40
  1149. data/lib/mongoid/relations/proxy.rb +0 -264
  1150. data/lib/mongoid/relations/referenced/in.rb +0 -314
  1151. data/lib/mongoid/relations/referenced/many.rb +0 -789
  1152. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -495
  1153. data/lib/mongoid/relations/referenced/one.rb +0 -297
  1154. data/lib/mongoid/relations/reflections.rb +0 -62
  1155. data/lib/mongoid/relations/synchronization.rb +0 -169
  1156. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1157. data/lib/mongoid/relations/targets.rb +0 -2
  1158. data/lib/mongoid/relations/touchable.rb +0 -61
  1159. data/lib/mongoid/relations.rb +0 -162
  1160. data/lib/mongoid/reloading.rb +0 -92
  1161. data/lib/mongoid/scoping.rb +0 -356
  1162. data/lib/mongoid/serialization.rb +0 -161
  1163. data/lib/mongoid/sessions/factory.rb +0 -129
  1164. data/lib/mongoid/sessions/mongo_uri.rb +0 -93
  1165. data/lib/mongoid/sessions/validators/storage.rb +0 -49
  1166. data/lib/mongoid/sessions/validators.rb +0 -2
  1167. data/lib/mongoid/sessions.rb +0 -433
  1168. data/lib/mongoid/sharding.rb +0 -61
  1169. data/lib/mongoid/state.rb +0 -97
  1170. data/lib/mongoid/unit_of_work.rb +0 -61
  1171. data/lib/mongoid/validations/associated.rb +0 -46
  1172. data/lib/mongoid/validations/format.rb +0 -20
  1173. data/lib/mongoid/validations/length.rb +0 -20
  1174. data/lib/mongoid/validations/localizable.rb +0 -30
  1175. data/lib/mongoid/validations/macros.rb +0 -93
  1176. data/lib/mongoid/validations/presence.rb +0 -86
  1177. data/lib/mongoid/validations/queryable.rb +0 -31
  1178. data/lib/mongoid/validations/uniqueness.rb +0 -330
  1179. data/lib/mongoid/validations.rb +0 -166
  1180. data/lib/mongoid/versioning.rb +0 -217
  1181. data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
  1182. data/lib/rack/mongoid.rb +0 -2
  1183. data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
  1184. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
  1185. data/lib/support/ruby_version.rb +0 -26
  1186. data/spec/app/models/account.rb +0 -32
  1187. data/spec/app/models/acolyte.rb +0 -16
  1188. data/spec/app/models/actor.rb +0 -19
  1189. data/spec/app/models/actor_observer.rb +0 -15
  1190. data/spec/app/models/actress.rb +0 -2
  1191. data/spec/app/models/address.rb +0 -72
  1192. data/spec/app/models/address_component.rb +0 -5
  1193. data/spec/app/models/address_number.rb +0 -6
  1194. data/spec/app/models/agency.rb +0 -5
  1195. data/spec/app/models/agent.rb +0 -12
  1196. data/spec/app/models/album.rb +0 -14
  1197. data/spec/app/models/alert.rb +0 -5
  1198. data/spec/app/models/animal.rb +0 -25
  1199. data/spec/app/models/answer.rb +0 -4
  1200. data/spec/app/models/appointment.rb +0 -7
  1201. data/spec/app/models/article.rb +0 -13
  1202. data/spec/app/models/artist.rb +0 -66
  1203. data/spec/app/models/artwork.rb +0 -4
  1204. data/spec/app/models/augmentation.rb +0 -11
  1205. data/spec/app/models/author.rb +0 -6
  1206. data/spec/app/models/band.rb +0 -25
  1207. data/spec/app/models/bar.rb +0 -9
  1208. data/spec/app/models/basic.rb +0 -6
  1209. data/spec/app/models/bed.rb +0 -1
  1210. data/spec/app/models/big_palette.rb +0 -2
  1211. data/spec/app/models/birthday.rb +0 -13
  1212. data/spec/app/models/book.rb +0 -12
  1213. data/spec/app/models/breed.rb +0 -4
  1214. data/spec/app/models/browser.rb +0 -6
  1215. data/spec/app/models/building.rb +0 -7
  1216. data/spec/app/models/building_address.rb +0 -7
  1217. data/spec/app/models/bus.rb +0 -7
  1218. data/spec/app/models/business.rb +0 -5
  1219. data/spec/app/models/callback_recorder.rb +0 -25
  1220. data/spec/app/models/callback_test.rb +0 -9
  1221. data/spec/app/models/canvas.rb +0 -25
  1222. data/spec/app/models/car.rb +0 -1
  1223. data/spec/app/models/cat.rb +0 -8
  1224. data/spec/app/models/category.rb +0 -8
  1225. data/spec/app/models/child.rb +0 -4
  1226. data/spec/app/models/child_doc.rb +0 -22
  1227. data/spec/app/models/church.rb +0 -4
  1228. data/spec/app/models/circle.rb +0 -3
  1229. data/spec/app/models/circuit.rb +0 -4
  1230. data/spec/app/models/circus.rb +0 -7
  1231. data/spec/app/models/code.rb +0 -5
  1232. data/spec/app/models/comment.rb +0 -16
  1233. data/spec/app/models/contractor.rb +0 -7
  1234. data/spec/app/models/cookie.rb +0 -6
  1235. data/spec/app/models/country_code.rb +0 -8
  1236. data/spec/app/models/definition.rb +0 -8
  1237. data/spec/app/models/description.rb +0 -11
  1238. data/spec/app/models/dictionary.rb +0 -10
  1239. data/spec/app/models/division.rb +0 -10
  1240. data/spec/app/models/doctor.rb +0 -12
  1241. data/spec/app/models/dog.rb +0 -7
  1242. data/spec/app/models/dokument.rb +0 -5
  1243. data/spec/app/models/driver.rb +0 -7
  1244. data/spec/app/models/drug.rb +0 -8
  1245. data/spec/app/models/email.rb +0 -6
  1246. data/spec/app/models/employer.rb +0 -5
  1247. data/spec/app/models/entry.rb +0 -6
  1248. data/spec/app/models/eraser.rb +0 -1
  1249. data/spec/app/models/event.rb +0 -22
  1250. data/spec/app/models/exhibition.rb +0 -4
  1251. data/spec/app/models/exhibitor.rb +0 -5
  1252. data/spec/app/models/eye.rb +0 -9
  1253. data/spec/app/models/eye_bowl.rb +0 -9
  1254. data/spec/app/models/face.rb +0 -8
  1255. data/spec/app/models/favorite.rb +0 -6
  1256. data/spec/app/models/filesystem.rb +0 -4
  1257. data/spec/app/models/fire_hydrant.rb +0 -6
  1258. data/spec/app/models/firefox.rb +0 -4
  1259. data/spec/app/models/fish.rb +0 -8
  1260. data/spec/app/models/folder.rb +0 -7
  1261. data/spec/app/models/folder_item.rb +0 -9
  1262. data/spec/app/models/fruits.rb +0 -28
  1263. data/spec/app/models/game.rb +0 -21
  1264. data/spec/app/models/ghost.rb +0 -7
  1265. data/spec/app/models/home.rb +0 -4
  1266. data/spec/app/models/house.rb +0 -8
  1267. data/spec/app/models/html_writer.rb +0 -3
  1268. data/spec/app/models/image.rb +0 -22
  1269. data/spec/app/models/implant.rb +0 -16
  1270. data/spec/app/models/item.rb +0 -12
  1271. data/spec/app/models/jar.rb +0 -7
  1272. data/spec/app/models/label.rb +0 -40
  1273. data/spec/app/models/language.rb +0 -5
  1274. data/spec/app/models/lat_lng.rb +0 -15
  1275. data/spec/app/models/league.rb +0 -11
  1276. data/spec/app/models/learner.rb +0 -2
  1277. data/spec/app/models/line_item.rb +0 -6
  1278. data/spec/app/models/location.rb +0 -8
  1279. data/spec/app/models/login.rb +0 -8
  1280. data/spec/app/models/manufacturer.rb +0 -7
  1281. data/spec/app/models/meat.rb +0 -4
  1282. data/spec/app/models/membership.rb +0 -4
  1283. data/spec/app/models/mixed_drink.rb +0 -4
  1284. data/spec/app/models/movie.rb +0 -12
  1285. data/spec/app/models/my_hash.rb +0 -2
  1286. data/spec/app/models/name.rb +0 -23
  1287. data/spec/app/models/node.rb +0 -5
  1288. data/spec/app/models/note.rb +0 -12
  1289. data/spec/app/models/ordered_post.rb +0 -6
  1290. data/spec/app/models/ordered_preference.rb +0 -6
  1291. data/spec/app/models/oscar.rb +0 -15
  1292. data/spec/app/models/override.rb +0 -16
  1293. data/spec/app/models/ownable.rb +0 -6
  1294. data/spec/app/models/owner.rb +0 -6
  1295. data/spec/app/models/pack.rb +0 -3
  1296. data/spec/app/models/page.rb +0 -5
  1297. data/spec/app/models/page_question.rb +0 -4
  1298. data/spec/app/models/palette.rb +0 -7
  1299. data/spec/app/models/paranoid_phone.rb +0 -25
  1300. data/spec/app/models/paranoid_post.rb +0 -36
  1301. data/spec/app/models/parent.rb +0 -5
  1302. data/spec/app/models/parent_doc.rb +0 -6
  1303. data/spec/app/models/passport.rb +0 -5
  1304. data/spec/app/models/patient.rb +0 -9
  1305. data/spec/app/models/pdf_writer.rb +0 -3
  1306. data/spec/app/models/pencil.rb +0 -1
  1307. data/spec/app/models/person.rb +0 -201
  1308. data/spec/app/models/pet.rb +0 -23
  1309. data/spec/app/models/pet_owner.rb +0 -6
  1310. data/spec/app/models/phone.rb +0 -11
  1311. data/spec/app/models/phone_observer.rb +0 -6
  1312. data/spec/app/models/pizza.rb +0 -7
  1313. data/spec/app/models/player.rb +0 -35
  1314. data/spec/app/models/post.rb +0 -43
  1315. data/spec/app/models/powerup.rb +0 -11
  1316. data/spec/app/models/preference.rb +0 -9
  1317. data/spec/app/models/princess.rb +0 -8
  1318. data/spec/app/models/product.rb +0 -17
  1319. data/spec/app/models/profile.rb +0 -5
  1320. data/spec/app/models/pronunciation.rb +0 -5
  1321. data/spec/app/models/purchase.rb +0 -4
  1322. data/spec/app/models/question.rb +0 -8
  1323. data/spec/app/models/quiz.rb +0 -10
  1324. data/spec/app/models/rating.rb +0 -8
  1325. data/spec/app/models/record.rb +0 -46
  1326. data/spec/app/models/registry.rb +0 -4
  1327. data/spec/app/models/role.rb +0 -7
  1328. data/spec/app/models/root_category.rb +0 -4
  1329. data/spec/app/models/sandwich.rb +0 -4
  1330. data/spec/app/models/scheduler.rb +0 -7
  1331. data/spec/app/models/seo.rb +0 -7
  1332. data/spec/app/models/series.rb +0 -4
  1333. data/spec/app/models/server.rb +0 -13
  1334. data/spec/app/models/service.rb +0 -22
  1335. data/spec/app/models/shape.rb +0 -12
  1336. data/spec/app/models/shelf.rb +0 -5
  1337. data/spec/app/models/shipping_container.rb +0 -5
  1338. data/spec/app/models/shipping_pack.rb +0 -3
  1339. data/spec/app/models/shop.rb +0 -6
  1340. data/spec/app/models/short_agent.rb +0 -4
  1341. data/spec/app/models/short_quiz.rb +0 -5
  1342. data/spec/app/models/slave.rb +0 -6
  1343. data/spec/app/models/song.rb +0 -8
  1344. data/spec/app/models/square.rb +0 -4
  1345. data/spec/app/models/strategy.rb +0 -3
  1346. data/spec/app/models/sub_item.rb +0 -3
  1347. data/spec/app/models/subscription.rb +0 -4
  1348. data/spec/app/models/survey.rb +0 -5
  1349. data/spec/app/models/symptom.rb +0 -6
  1350. data/spec/app/models/tag.rb +0 -8
  1351. data/spec/app/models/target.rb +0 -5
  1352. data/spec/app/models/template.rb +0 -5
  1353. data/spec/app/models/thing.rb +0 -9
  1354. data/spec/app/models/title.rb +0 -4
  1355. data/spec/app/models/tool.rb +0 -8
  1356. data/spec/app/models/topping.rb +0 -5
  1357. data/spec/app/models/track.rb +0 -38
  1358. data/spec/app/models/translation.rb +0 -5
  1359. data/spec/app/models/tree.rb +0 -9
  1360. data/spec/app/models/truck.rb +0 -3
  1361. data/spec/app/models/user.rb +0 -21
  1362. data/spec/app/models/user_account.rb +0 -10
  1363. data/spec/app/models/validation_callback.rb +0 -10
  1364. data/spec/app/models/vehicle.rb +0 -11
  1365. data/spec/app/models/version.rb +0 -5
  1366. data/spec/app/models/vet_visit.rb +0 -5
  1367. data/spec/app/models/video.rb +0 -17
  1368. data/spec/app/models/video_game.rb +0 -1
  1369. data/spec/app/models/weapon.rb +0 -11
  1370. data/spec/app/models/wiki_page.rb +0 -17
  1371. data/spec/app/models/word.rb +0 -12
  1372. data/spec/app/models/word_origin.rb +0 -11
  1373. data/spec/app/models/writer.rb +0 -11
  1374. data/spec/mongoid/atomic/positionable_spec.rb +0 -227
  1375. data/spec/mongoid/attributes/processing_spec.rb +0 -149
  1376. data/spec/mongoid/callbacks_spec.rb +0 -1564
  1377. data/spec/mongoid/components_spec.rb +0 -24
  1378. data/spec/mongoid/contextual/find_and_modify_spec.rb +0 -220
  1379. data/spec/mongoid/criterion/destructive_spec.rb +0 -101
  1380. data/spec/mongoid/criterion/inspection_spec.rb +0 -27
  1381. data/spec/mongoid/criterion/marshalable_spec.rb +0 -28
  1382. data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
  1383. data/spec/mongoid/criterion/modification_spec.rb +0 -402
  1384. data/spec/mongoid/criterion/scoping_spec.rb +0 -391
  1385. data/spec/mongoid/dirty_spec.rb +0 -1508
  1386. data/spec/mongoid/errors/eager_load_spec.rb +0 -29
  1387. data/spec/mongoid/errors/mixed_session_configuration_spec.rb +0 -29
  1388. data/spec/mongoid/errors/no_session_config_spec.rb +0 -29
  1389. data/spec/mongoid/errors/no_session_database_spec.rb +0 -29
  1390. data/spec/mongoid/errors/no_session_hosts_spec.rb +0 -29
  1391. data/spec/mongoid/errors/no_sessions_config_spec.rb +0 -29
  1392. data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
  1393. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1394. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1395. data/spec/mongoid/finders_spec.rb +0 -321
  1396. data/spec/mongoid/hierarchy_spec.rb +0 -244
  1397. data/spec/mongoid/identity_map_spec.rb +0 -564
  1398. data/spec/mongoid/indexes_spec.rb +0 -404
  1399. data/spec/mongoid/inspection_spec.rb +0 -57
  1400. data/spec/mongoid/json_spec.rb +0 -33
  1401. data/spec/mongoid/matchers/all_spec.rb +0 -31
  1402. data/spec/mongoid/matchers/and_spec.rb +0 -162
  1403. data/spec/mongoid/matchers/default_spec.rb +0 -130
  1404. data/spec/mongoid/matchers/exists_spec.rb +0 -57
  1405. data/spec/mongoid/matchers/gt_spec.rb +0 -74
  1406. data/spec/mongoid/matchers/gte_spec.rb +0 -74
  1407. data/spec/mongoid/matchers/in_spec.rb +0 -25
  1408. data/spec/mongoid/matchers/lt_spec.rb +0 -74
  1409. data/spec/mongoid/matchers/lte_spec.rb +0 -74
  1410. data/spec/mongoid/matchers/ne_spec.rb +0 -25
  1411. data/spec/mongoid/matchers/nin_spec.rb +0 -25
  1412. data/spec/mongoid/matchers/or_spec.rb +0 -106
  1413. data/spec/mongoid/matchers/size_spec.rb +0 -25
  1414. data/spec/mongoid/matchers_spec.rb +0 -532
  1415. data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
  1416. data/spec/mongoid/nested_attributes_spec.rb +0 -4945
  1417. data/spec/mongoid/observer_spec.rb +0 -290
  1418. data/spec/mongoid/paranoia_spec.rb +0 -759
  1419. data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
  1420. data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
  1421. data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
  1422. data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
  1423. data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
  1424. data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
  1425. data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
  1426. data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
  1427. data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
  1428. data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
  1429. data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
  1430. data/spec/mongoid/persistence/atomic_spec.rb +0 -216
  1431. data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
  1432. data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
  1433. data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
  1434. data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
  1435. data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
  1436. data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
  1437. data/spec/mongoid/persistence/operations_spec.rb +0 -313
  1438. data/spec/mongoid/persistence_spec.rb +0 -2279
  1439. data/spec/mongoid/railties/document_spec.rb +0 -24
  1440. data/spec/mongoid/relations/accessors_spec.rb +0 -844
  1441. data/spec/mongoid/relations/auto_save_spec.rb +0 -261
  1442. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1443. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1444. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1445. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1446. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1447. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1448. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1449. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1450. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1451. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1452. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -234
  1453. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1454. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -241
  1455. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1456. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1457. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -124
  1458. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1459. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1460. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1461. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1462. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1463. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1464. data/spec/mongoid/relations/constraint_spec.rb +0 -74
  1465. data/spec/mongoid/relations/conversions_spec.rb +0 -126
  1466. data/spec/mongoid/relations/counter_cache_spec.rb +0 -205
  1467. data/spec/mongoid/relations/cyclic_spec.rb +0 -156
  1468. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1469. data/spec/mongoid/relations/embedded/in_spec.rb +0 -580
  1470. data/spec/mongoid/relations/embedded/many_spec.rb +0 -3841
  1471. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1055
  1472. data/spec/mongoid/relations/macros_spec.rb +0 -625
  1473. data/spec/mongoid/relations/metadata_spec.rb +0 -2030
  1474. data/spec/mongoid/relations/options_spec.rb +0 -35
  1475. data/spec/mongoid/relations/polymorphic_spec.rb +0 -132
  1476. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1501
  1477. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3632
  1478. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3561
  1479. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1331
  1480. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1481. data/spec/mongoid/relations/synchronization_spec.rb +0 -453
  1482. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1710
  1483. data/spec/mongoid/relations_spec.rb +0 -188
  1484. data/spec/mongoid/reloading_spec.rb +0 -305
  1485. data/spec/mongoid/scoping_spec.rb +0 -978
  1486. data/spec/mongoid/serialization_spec.rb +0 -833
  1487. data/spec/mongoid/sessions/factory_spec.rb +0 -312
  1488. data/spec/mongoid/sessions/mongo_uri_spec.rb +0 -103
  1489. data/spec/mongoid/sessions_spec.rb +0 -1111
  1490. data/spec/mongoid/sharding_spec.rb +0 -61
  1491. data/spec/mongoid/state_spec.rb +0 -102
  1492. data/spec/mongoid/unit_of_work_spec.rb +0 -196
  1493. data/spec/mongoid/validations/associated_spec.rb +0 -183
  1494. data/spec/mongoid/validations/format_spec.rb +0 -83
  1495. data/spec/mongoid/validations/length_spec.rb +0 -223
  1496. data/spec/mongoid/validations/numericality_spec.rb +0 -30
  1497. data/spec/mongoid/validations/presence_spec.rb +0 -592
  1498. data/spec/mongoid/validations/uniqueness_spec.rb +0 -2399
  1499. data/spec/mongoid/validations_spec.rb +0 -309
  1500. data/spec/mongoid/versioning_spec.rb +0 -540
  1501. data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -0,0 +1,3836 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative "../has_and_belongs_to_many_models"
5
+
6
+ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
7
+
8
+ around(:each) do |example|
9
+ original_raise_not_found_error = Mongoid.raise_not_found_error
10
+ original_preferences_association = Person.relations["preferences"]
11
+ Mongoid.raise_not_found_error = true
12
+ Person.has_and_belongs_to_many :preferences, autosave: true
13
+ example.run
14
+ Mongoid.raise_not_found_error = original_raise_not_found_error
15
+ Person.relations["preferences"] = original_preferences_association
16
+ end
17
+
18
+ after(:all) do
19
+ Person.reset_callbacks(:save)
20
+ Person.reset_callbacks(:destroy)
21
+ end
22
+
23
+ [ :<<, :push ].each do |method|
24
+
25
+ describe "##{method}" do
26
+
27
+ context "when the inverse_of is nil" do
28
+
29
+ let!(:article) do
30
+ Article.create!
31
+ end
32
+
33
+ context "when the child document is new" do
34
+
35
+ let(:preference) do
36
+ Preference.new
37
+ end
38
+
39
+ before do
40
+ article.preferences.send(method, preference)
41
+ end
42
+
43
+ it "persists the child document" do
44
+ expect(preference).to be_persisted
45
+ end
46
+ end
47
+
48
+ context "when the child document is not new" do
49
+
50
+ let(:preference) do
51
+ Preference.create!
52
+ end
53
+
54
+ it "does not persist the child document" do
55
+ expect(preference).to receive(:save).never
56
+ article.preferences.send(method, preference)
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when the parent is a new record" do
62
+
63
+ let(:person) do
64
+ Person.new
65
+ end
66
+
67
+ let!(:preference) do
68
+ Preference.new
69
+ end
70
+
71
+ let(:result) do
72
+ person.preferences.send(method, preference)
73
+ end
74
+
75
+ it "returns an array of loaded documents" do
76
+ expect(result).to eq([ preference ])
77
+ end
78
+ end
79
+
80
+ context "when the parent is not a new record" do
81
+
82
+ let(:person) do
83
+ Person.create!
84
+ end
85
+
86
+ let!(:preference) do
87
+ Preference.new
88
+ end
89
+
90
+ let(:result) do
91
+ person.preferences.send(method, preference)
92
+ end
93
+
94
+ it "returns an array of loaded documents" do
95
+ expect(result).to eq([ preference ])
96
+ end
97
+ end
98
+
99
+ context "when the relations are not polymorphic" do
100
+
101
+ context "when the inverse relation is not defined" do
102
+
103
+ let(:person) do
104
+ Person.new
105
+ end
106
+
107
+ let(:house) do
108
+ House.new
109
+ end
110
+
111
+ before do
112
+ person.houses << house
113
+ end
114
+
115
+ it "appends the document to the relation" do
116
+ expect(person.houses).to eq([ house ])
117
+ end
118
+
119
+ it "sets the foreign key on the relation" do
120
+ expect(person.house_ids).to eq([ house.id ])
121
+ end
122
+ end
123
+
124
+ context "when appending in a parent create block" do
125
+
126
+ let!(:preference) do
127
+ Preference.create!(name: "testing")
128
+ end
129
+
130
+ let!(:person) do
131
+ Person.create! do |doc|
132
+ doc.preferences << preference
133
+ end
134
+ end
135
+
136
+ it "adds the documents to the relation" do
137
+ expect(person.preferences).to eq([ preference ])
138
+ end
139
+
140
+ it "sets the foreign key on the relation" do
141
+ expect(person.preference_ids).to eq([ preference.id ])
142
+ end
143
+
144
+ it "sets the foreign key on the inverse relation" do
145
+ expect(preference.person_ids).to eq([ person.id ])
146
+ end
147
+
148
+ it "saves the target" do
149
+ expect(preference).to be_persisted
150
+ end
151
+
152
+ it "adds the correct number of documents" do
153
+ expect(person.preferences.size).to eq(1)
154
+ end
155
+
156
+ it "persists the link" do
157
+ expect(person.reload.preferences).to eq([ preference ])
158
+ end
159
+ end
160
+
161
+ context "when the parent is a new record" do
162
+
163
+ let(:person) do
164
+ Person.new
165
+ end
166
+
167
+ context "when the child is new" do
168
+
169
+ let(:preference) do
170
+ Preference.new
171
+ end
172
+
173
+ before do
174
+ person.preferences.send(method, preference)
175
+ end
176
+
177
+ it "adds the documents to the relation" do
178
+ expect(person.preferences).to eq([ preference ])
179
+ end
180
+
181
+ it "sets the foreign key on the relation" do
182
+ expect(person.preference_ids).to eq([ preference.id ])
183
+ end
184
+
185
+ it "sets the foreign key on the inverse relation" do
186
+ expect(preference.person_ids).to eq([ person.id ])
187
+ end
188
+
189
+ it "does not save the target" do
190
+ expect(preference).to be_new_record
191
+ end
192
+
193
+ it "adds the correct number of documents" do
194
+ expect(person.preferences.size).to eq(1)
195
+ end
196
+
197
+ context "when appending a second time" do
198
+
199
+ before do
200
+ person.preferences.send(method, preference)
201
+ end
202
+
203
+ it "does not allow the document to be added again" do
204
+ expect(person.preferences).to eq([ preference ])
205
+ end
206
+
207
+ it "does not allow duplicate ids" do
208
+ expect(person.preference_ids).to eq([ preference.id ])
209
+ end
210
+ end
211
+ end
212
+
213
+ context "when the child is already persisted" do
214
+
215
+ let!(:persisted) do
216
+ Preference.create!(name: "testy")
217
+ end
218
+
219
+ let(:preference) do
220
+ Preference.first
221
+ end
222
+
223
+ before do
224
+ person.preferences.send(method, preference)
225
+ person.save!
226
+ end
227
+
228
+ it "adds the documents to the relation" do
229
+ expect(person.preferences).to eq([ preference ])
230
+ end
231
+
232
+ it "sets the foreign key on the relation" do
233
+ expect(person.preference_ids).to eq([ preference.id ])
234
+ end
235
+
236
+ it "sets the foreign key on the inverse relation" do
237
+ expect(preference.person_ids).to eq([ person.id ])
238
+ end
239
+
240
+ it "saves the target" do
241
+ expect(preference).to be_persisted
242
+ end
243
+
244
+ it "adds the correct number of documents" do
245
+ expect(person.preferences.size).to eq(1)
246
+ end
247
+
248
+ it "persists the link" do
249
+ expect(person.reload.preferences).to eq([ preference ])
250
+ end
251
+ end
252
+
253
+ context "when setting via the associated ids" do
254
+
255
+ let!(:persisted) do
256
+ Preference.create!(name: "testy")
257
+ end
258
+
259
+ let(:preference) do
260
+ Preference.first
261
+ end
262
+
263
+ let(:person) do
264
+ Person.new(preference_ids: [ preference.id ])
265
+ end
266
+
267
+ before do
268
+ person.save!
269
+ end
270
+
271
+ it "adds the documents to the relation" do
272
+ expect(person.preferences).to eq([ preference ])
273
+ end
274
+
275
+ it "sets the foreign key on the relation" do
276
+ expect(person.preference_ids).to eq([ preference.id ])
277
+ end
278
+
279
+ it "sets the foreign key on the inverse relation" do
280
+ expect(preference.reload.person_ids).to eq([ person.id ])
281
+ end
282
+
283
+ it "adds the correct number of documents" do
284
+ expect(person.preferences.size).to eq(1)
285
+ end
286
+
287
+ it "persists the link" do
288
+ expect(person.reload.preferences).to eq([ preference ])
289
+ end
290
+ end
291
+ end
292
+
293
+ context "when the parent is not a new record" do
294
+
295
+ let(:person) do
296
+ Person.create!
297
+ end
298
+
299
+ let(:preference) do
300
+ Preference.new
301
+ end
302
+
303
+ before do
304
+ person.preferences.send(method, preference)
305
+ end
306
+
307
+ it "adds the documents to the relation" do
308
+ expect(person.preferences).to eq([ preference ])
309
+ end
310
+
311
+ it "sets the foreign key on the relation" do
312
+ expect(person.preference_ids).to eq([ preference.id ])
313
+ end
314
+
315
+ it "sets the foreign key on the inverse relation" do
316
+ expect(preference.person_ids).to eq([ person.id ])
317
+ end
318
+
319
+ it "sets the base on the inverse relation" do
320
+ expect(preference.people).to eq([ person ])
321
+ end
322
+
323
+ it "sets the same instance on the inverse relation" do
324
+ expect(preference.people.first).to eql(person)
325
+ end
326
+
327
+ it "saves the target" do
328
+ expect(preference).to_not be_new_record
329
+ end
330
+
331
+ it "adds the document to the target" do
332
+ expect(person.preferences.count).to eq(1)
333
+ end
334
+
335
+ context "when documents already exist on the relation" do
336
+
337
+ let(:preference_two) do
338
+ Preference.new
339
+ end
340
+
341
+ before do
342
+ person.preferences.send(method, preference_two)
343
+ end
344
+
345
+ it "adds the documents to the relation" do
346
+ expect(person.preferences).to eq([ preference, preference_two ])
347
+ end
348
+
349
+ it "sets the foreign key on the relation" do
350
+ expect(person.preference_ids).to eq([ preference.id, preference_two.id ])
351
+ end
352
+
353
+ it "sets the foreign key on the inverse relation" do
354
+ expect(preference_two.person_ids).to eq([ person.id ])
355
+ end
356
+
357
+ it "sets the base on the inverse relation" do
358
+ expect(preference_two.people).to eq([ person ])
359
+ end
360
+
361
+ it "sets the same instance on the inverse relation" do
362
+ expect(preference_two.people.first).to eql(person)
363
+ end
364
+
365
+ it "saves the target" do
366
+ expect(preference).to_not be_new_record
367
+ end
368
+
369
+ it "adds the document to the target" do
370
+ expect(person.preferences.count).to eq(2)
371
+ end
372
+ end
373
+ end
374
+
375
+ context "when both sides have been persisted" do
376
+
377
+ let(:person) do
378
+ Person.create!
379
+ end
380
+
381
+ let(:event) do
382
+ Event.create!
383
+ end
384
+
385
+ before do
386
+ person.administrated_events << event
387
+ end
388
+
389
+ it "sets the front side of the relation" do
390
+ expect(person.administrated_events).to eq([ event ])
391
+ end
392
+
393
+ it "sets the inverse side of the relation" do
394
+ expect(event.administrators(true)).to eq([ person ])
395
+ end
396
+
397
+ context "when reloading" do
398
+
399
+ it "sets the front side of the relation" do
400
+ expect(person.reload.administrated_events).to eq([ event ])
401
+ end
402
+
403
+ it "sets the inverse side of the relation" do
404
+ expect(event.reload.administrators).to eq([ person ])
405
+ end
406
+ end
407
+
408
+ context "when performing a new database query" do
409
+
410
+ let(:loaded_person) do
411
+ Person.find(person.id)
412
+ end
413
+
414
+ let(:loaded_event) do
415
+ Event.find(event.id)
416
+ end
417
+
418
+ it "sets the front side of the relation" do
419
+ expect(loaded_person.administrated_events).to eq([ event ])
420
+ end
421
+
422
+ it "sets the inverse side of the relation" do
423
+ expect(loaded_event.administrators).to eq([ person ])
424
+ end
425
+ end
426
+ end
427
+
428
+ context "when the relation also includes a has_many relation" do
429
+
430
+ let(:artwork) do
431
+ Artwork.create!
432
+ end
433
+
434
+ let(:exhibition) do
435
+ Exhibition.create!
436
+ end
437
+
438
+ let(:exhibitor) do
439
+ Exhibitor.create!(exhibition: exhibition)
440
+ end
441
+
442
+ before do
443
+ artwork.exhibitors << exhibitor
444
+ end
445
+
446
+ it "creates a single artwork object" do
447
+ expect(Artwork.count).to eq(1)
448
+ end
449
+ end
450
+
451
+ context "when the relation is self referencing" do
452
+
453
+ let(:tag_one) do
454
+ Tag.create!(text: "one")
455
+ end
456
+
457
+ let(:tag_two) do
458
+ Tag.create!(text: "two")
459
+ end
460
+
461
+ before do
462
+ tag_one.related << tag_two
463
+ end
464
+
465
+ it "sets the front side of the relation" do
466
+ expect(tag_one.related).to eq([ tag_two ])
467
+ end
468
+
469
+ it "sets the inverse side of the relation" do
470
+ expect(tag_two.related(true)).to eq([ tag_one ])
471
+ end
472
+
473
+ context "when reloading" do
474
+
475
+ it "sets the front side of the relation" do
476
+ expect(tag_one.reload.related).to eq([ tag_two ])
477
+ end
478
+
479
+ it "sets the inverse side of the relation" do
480
+ expect(tag_two.reload.related).to eq([ tag_one ])
481
+ end
482
+ end
483
+
484
+ context "when performing a new database query" do
485
+
486
+ let(:loaded_tag_one) do
487
+ Tag.find(tag_one.id)
488
+ end
489
+
490
+ let(:loaded_tag_two) do
491
+ Tag.find(tag_two.id)
492
+ end
493
+
494
+ it "sets the front side of the relation" do
495
+ expect(loaded_tag_one.related).to eq([ tag_two ])
496
+ end
497
+
498
+ it "sets the inverse side of the relation" do
499
+ expect(loaded_tag_two.related).to eq([ tag_one ])
500
+ end
501
+ end
502
+ end
503
+ end
504
+
505
+ context "when association has callbacks" do
506
+
507
+ let(:post) do
508
+ Post.new
509
+ end
510
+
511
+ let(:tag) do
512
+ Tag.new
513
+ end
514
+
515
+ context "when the callback is a before_add" do
516
+
517
+ it "executes the callback" do
518
+ post.tags.send(method, tag)
519
+ expect(post.before_add_called).to be true
520
+ end
521
+
522
+ context "when errors are raised" do
523
+
524
+ before do
525
+ expect(post).to receive(:before_add_tag).and_raise
526
+ begin; post.tags.send(method, tag); rescue; end;
527
+ end
528
+
529
+ it "does not add the document to the relation" do
530
+ expect(post.tags).to be_empty
531
+ end
532
+ end
533
+ end
534
+
535
+ context "when the callback is an after_add" do
536
+
537
+ it "executes the callback" do
538
+ post.tags.send(method, tag)
539
+ expect(post.after_add_called).to be true
540
+ end
541
+
542
+ context "when errors are raised" do
543
+
544
+ before do
545
+ expect(post).to receive(:after_add_tag).and_raise
546
+ begin; post.tags.send(method, tag); rescue; end
547
+ end
548
+
549
+ it "adds the document to the relation" do
550
+ expect(post.tags).to eq([ tag ])
551
+ end
552
+ end
553
+ end
554
+ end
555
+ end
556
+ end
557
+
558
+ describe "#=" do
559
+
560
+ context "when trying to add duplicate entries" do
561
+
562
+ let(:person) do
563
+ Person.new
564
+ end
565
+
566
+ let(:preference) do
567
+ Preference.create!(name: "one")
568
+ end
569
+
570
+ before do
571
+ person.preferences = [ preference, preference ]
572
+ end
573
+
574
+ context "when the document is new" do
575
+
576
+ it "does not add the duplicates" do
577
+ expect(person.preferences).to eq([ preference ])
578
+ end
579
+
580
+ it "does not create duplicate keys" do
581
+ expect(person.preference_ids).to eq([ preference.id ])
582
+ end
583
+ end
584
+
585
+ context "when the document is persisted" do
586
+
587
+ before do
588
+ person.save!
589
+ end
590
+
591
+ it "does not add the duplicates" do
592
+ expect(person.preferences).to eq([ preference ])
593
+ end
594
+
595
+ it "does not create duplicate keys" do
596
+ expect(person.preference_ids).to eq([ preference.id ])
597
+ end
598
+
599
+ it "does not add duplicates on the inverse" do
600
+ expect(preference.people).to eq([ person ])
601
+ end
602
+
603
+ it "does not add duplicate inverse keys" do
604
+ expect(preference.person_ids).to eq([ person.id ])
605
+ end
606
+
607
+ context "when reloading document from db" do
608
+
609
+ let(:from_db) { Preference.last }
610
+
611
+ it "does not create duplicate keys" do
612
+ person.preferences = [ from_db ]
613
+ expect(from_db.person_ids).to eq([ person.id ])
614
+ end
615
+ end
616
+ end
617
+ end
618
+
619
+ context "when the relation is not polymorphic" do
620
+
621
+ context "when the parent and relation are new records" do
622
+
623
+ let(:person) do
624
+ Person.new
625
+ end
626
+
627
+ let(:preference) do
628
+ Preference.new
629
+ end
630
+
631
+ before do
632
+ person.preferences = [ preference ]
633
+ end
634
+
635
+ it "sets the relation" do
636
+ expect(person.preferences).to eq([ preference ])
637
+ end
638
+
639
+ it "sets the foreign key on the relation" do
640
+ expect(person.preference_ids).to eq([ preference.id ])
641
+ end
642
+
643
+ it "sets the foreign key on the inverse relation" do
644
+ expect(preference.person_ids).to eq([ person.id ])
645
+ end
646
+
647
+ it "does not save the target" do
648
+ expect(preference).to be_new_record
649
+ end
650
+ end
651
+
652
+ context "when the parent is new but the relation exists" do
653
+
654
+ let(:person) do
655
+ Person.new
656
+ end
657
+
658
+ let!(:preference) do
659
+ Preference.create!
660
+ end
661
+
662
+ before do
663
+ person.preferences = [ preference ]
664
+ end
665
+
666
+ it "sets the relation" do
667
+ expect(person.preferences).to eq([ preference ])
668
+ end
669
+
670
+ it "sets the foreign key on the relation" do
671
+ expect(person.preference_ids).to eq([ preference.id ])
672
+ end
673
+
674
+ it "sets the foreign key on the inverse relation" do
675
+ expect(preference.person_ids).to eq([ person.id ])
676
+ end
677
+
678
+ context "and the parent is persisted" do
679
+
680
+ before do
681
+ person.save!
682
+ preference.reload
683
+ end
684
+
685
+ it "maintains the relation" do
686
+ expect(person.preferences).to eq([ preference ])
687
+ end
688
+
689
+ it "maintains the foreign key on the relation" do
690
+ expect(person.preference_ids).to eq([ preference.id ])
691
+ end
692
+
693
+ it "maintains the foreign key on the inverse relation" do
694
+ expect(preference.person_ids).to eq([ person.id ])
695
+ end
696
+
697
+ it "maintains the base on the inverse relation" do
698
+ expect(preference.people.first).to eq(person)
699
+ end
700
+ end
701
+ end
702
+
703
+ context "when the parent is not a new record" do
704
+
705
+ let(:person) do
706
+ Person.create!
707
+ end
708
+
709
+ let(:preference) do
710
+ Preference.new
711
+ end
712
+
713
+ before do
714
+ person.preferences = [ preference ]
715
+ end
716
+
717
+ it "sets the relation" do
718
+ expect(person.preferences).to eq([ preference ])
719
+ end
720
+
721
+ it "sets the foreign key on the relation" do
722
+ expect(person.preference_ids).to eq([ preference.id ])
723
+ end
724
+
725
+ it "sets the foreign key on the inverse relation" do
726
+ expect(preference.person_ids).to eq([ person.id ])
727
+ end
728
+
729
+ it "sets the base on the inverse relation" do
730
+ expect(preference.people.first).to eq(person)
731
+ end
732
+
733
+ it "saves the target" do
734
+ expect(preference).to be_persisted
735
+ end
736
+
737
+ it "persists the relation" do
738
+ person.reload.preferences == [ preference ]
739
+ end
740
+
741
+ context "when overwriting an existing relation" do
742
+
743
+ let(:another_preference) do
744
+ Preference.new
745
+ end
746
+
747
+ before do
748
+ person.preferences = [ another_preference ]
749
+ end
750
+
751
+ it "sets the relation" do
752
+ expect(person.preferences).to eq([ another_preference ])
753
+ end
754
+
755
+ it "saves the target" do
756
+ expect(another_preference).to be_persisted
757
+ end
758
+
759
+ it "does not leave foreign keys of the previous relation" do
760
+ expect(person.preference_ids).to eq([ another_preference.id ])
761
+ end
762
+
763
+ it "clears its own key on the foreign relation" do
764
+ expect(preference.person_ids).to be_empty
765
+ end
766
+
767
+ context "and then overwriting it again with the same value" do
768
+
769
+ before do
770
+ person.preferences = [ another_preference ]
771
+ end
772
+
773
+ it "persists the relation between another_preference and person" do
774
+ expect(another_preference.reload.people).to eq([ person ])
775
+ end
776
+
777
+ end
778
+
779
+ context "and person reloaded instead of saved" do
780
+
781
+ before do
782
+ person.reload
783
+ another_preference.reload
784
+ end
785
+
786
+ it "persists the relation between person and another_preference" do
787
+ expect(person.preferences).to eq([ another_preference ])
788
+ end
789
+
790
+ it "persists the relation between another_preference and person" do
791
+ expect(another_preference.people).to eq([ person ])
792
+ end
793
+
794
+ it "no longer has any relation between preference and person" do
795
+ expect(preference.people).to be_empty
796
+ end
797
+ end
798
+
799
+ context "and person is saved" do
800
+
801
+ before do
802
+ person.save!
803
+ person.reload
804
+ another_preference.reload
805
+ end
806
+
807
+ it "persists the relation between person and another_preference" do
808
+ expect(person.preferences).to eq([ another_preference ])
809
+ end
810
+
811
+ it "persists the relation between another_preference and person" do
812
+ expect(another_preference.people).to eq([ person ])
813
+ end
814
+
815
+ it "no longer has any relation between preference and person" do
816
+ expect(preference.people).to be_empty
817
+ end
818
+ end
819
+ end
820
+ end
821
+ end
822
+ end
823
+
824
+ describe "when self-referencing" do
825
+ let!(:parent) do
826
+ Vertex.create!
827
+ end
828
+
829
+ let!(:child) do
830
+ Vertex.create!(parents: [parent])
831
+ end
832
+
833
+ before do
834
+ parent.reload
835
+ child.reload
836
+ end
837
+
838
+ it "sets the parent" do
839
+ expect(child.parents).to include(parent)
840
+ end
841
+
842
+ it "sets the parent id" do
843
+ expect(child.parent_ids).to include(parent.id)
844
+ end
845
+
846
+ it "sets the child" do
847
+ expect(parent.children).to include(child)
848
+ end
849
+
850
+ it "sets the child id" do
851
+ expect(parent.child_ids).to include(child.id)
852
+ end
853
+
854
+ describe "#update" do
855
+ before do
856
+ child.update(parents: [parent])
857
+ end
858
+
859
+ it "sets the parent" do
860
+ expect(child.parents).to include(parent)
861
+ end
862
+
863
+ it "sets the parent id" do
864
+ expect(child.parent_ids).to include(parent.id)
865
+ end
866
+
867
+ it "sets the child" do
868
+ expect(parent.children).to include(child)
869
+ end
870
+
871
+ it "sets the child id" do
872
+ expect(parent.child_ids).to include(child.id)
873
+ end
874
+
875
+ describe "when reloading" do
876
+ before do
877
+ parent.reload
878
+ child.reload
879
+ end
880
+
881
+ it "sets the parent" do
882
+ expect(child.parents).to include(parent)
883
+ end
884
+
885
+ it "sets the parent id" do
886
+ expect(child.parent_ids).to include(parent.id)
887
+ end
888
+
889
+ it "sets the child" do
890
+ expect(parent.children).to include(child)
891
+ end
892
+
893
+ it "sets the child id" do
894
+ expect(parent.child_ids).to include(child.id)
895
+ end
896
+ end
897
+ end
898
+ end
899
+
900
+ [ nil, [] ].each do |value|
901
+
902
+ describe "#= #{value}" do
903
+
904
+ context "when the relation is not polymorphic" do
905
+
906
+ context "when the inverse relation is not defined" do
907
+
908
+ let(:person) do
909
+ Person.new
910
+ end
911
+
912
+ let(:house) do
913
+ House.new
914
+ end
915
+
916
+ before do
917
+ person.houses << house
918
+ person.houses = value
919
+ end
920
+
921
+ it "clears the relation" do
922
+ expect(person.houses).to be_empty
923
+ end
924
+
925
+ it "clears the foreign keys" do
926
+ expect(person.house_ids).to be_empty
927
+ end
928
+ end
929
+
930
+ context "when the parent is a new record" do
931
+
932
+ let(:person) do
933
+ Person.new
934
+ end
935
+
936
+ let(:preference) do
937
+ Preference.new
938
+ end
939
+
940
+ before do
941
+ person.preferences = [ preference ]
942
+ person.preferences = value
943
+ end
944
+
945
+ it "sets the relation to an empty array" do
946
+ expect(person.preferences).to be_empty
947
+ end
948
+
949
+ it "removed the inverse relation" do
950
+ expect(preference.people).to be_empty
951
+ end
952
+
953
+ it "removes the foreign key values" do
954
+ expect(person.preference_ids).to be_empty
955
+ end
956
+
957
+ it "removes the inverse foreign key values" do
958
+ expect(preference.person_ids).to be_empty
959
+ end
960
+ end
961
+
962
+ context "when the parent is not a new record" do
963
+
964
+ context "when the relation has been loaded" do
965
+
966
+ let(:person) do
967
+ Person.create!
968
+ end
969
+
970
+ let(:preference) do
971
+ Preference.new
972
+ end
973
+
974
+ before do
975
+ person.preferences = [ preference ]
976
+ person.preferences = value
977
+ end
978
+
979
+ it "sets the relation to an empty array" do
980
+ expect(person.preferences).to be_empty
981
+ end
982
+
983
+ it "removed the inverse relation" do
984
+ expect(preference.people).to be_empty
985
+ end
986
+
987
+ it "removes the foreign key values" do
988
+ expect(person.preference_ids).to be_empty
989
+ end
990
+
991
+ it "removes the inverse foreign key values" do
992
+ expect(preference.person_ids).to be_empty
993
+ end
994
+
995
+ it "does not delete the target from the database" do
996
+ expect(preference).to_not be_destroyed
997
+ end
998
+ end
999
+
1000
+ context "when the relation has not been loaded" do
1001
+
1002
+ let(:preference) do
1003
+ Preference.new
1004
+ end
1005
+
1006
+ let(:person) do
1007
+ Person.create!.tap do |p|
1008
+ p.preferences = [ preference ]
1009
+ end
1010
+ end
1011
+
1012
+ let!(:from_db) do
1013
+ Person.find(person.id)
1014
+ end
1015
+
1016
+ before do
1017
+ from_db.preferences = value
1018
+ end
1019
+
1020
+ it "sets the relation to an empty array" do
1021
+ expect(from_db.preferences).to be_empty
1022
+ end
1023
+
1024
+ it "removes the foreign key values" do
1025
+ expect(from_db.preference_ids).to be_empty
1026
+ end
1027
+ end
1028
+ end
1029
+ end
1030
+ end
1031
+ end
1032
+
1033
+ [ :build, :new ].each do |method|
1034
+
1035
+ describe "##{method}" do
1036
+
1037
+ context "when the relation is not polymorphic" do
1038
+
1039
+ context "when the parent is a new record" do
1040
+
1041
+ let(:person) do
1042
+ Person.new
1043
+ end
1044
+
1045
+ let!(:preference) do
1046
+ person.preferences.send(method, name: "settings")
1047
+ end
1048
+
1049
+ it "adds the document to the relation" do
1050
+ expect(person.preferences).to eq([ preference ])
1051
+ end
1052
+
1053
+ it "sets the foreign key on the relation" do
1054
+ expect(person.preference_ids).to eq([ preference.id ])
1055
+ end
1056
+
1057
+ it "sets the inverse foreign key on the relation" do
1058
+ expect(preference.person_ids).to eq([ person.id ])
1059
+ end
1060
+
1061
+ it "sets the attributes" do
1062
+ expect(preference.name).to eq("settings")
1063
+ end
1064
+
1065
+ it "does not save the target" do
1066
+ expect(preference).to be_new_record
1067
+ end
1068
+
1069
+ it "adds the correct number of documents" do
1070
+ expect(person.preferences.size).to eq(1)
1071
+ end
1072
+ end
1073
+
1074
+ context "when the parent is not a new record" do
1075
+
1076
+ let(:person) do
1077
+ Person.create!
1078
+ end
1079
+
1080
+ let!(:preference) do
1081
+ person.preferences.send(method, name: "settings")
1082
+ end
1083
+
1084
+ it "adds the document to the relation" do
1085
+ expect(person.preferences).to eq([ preference ])
1086
+ end
1087
+
1088
+ it "sets the foreign key on the relation" do
1089
+ expect(person.preference_ids).to eq([ preference.id ])
1090
+ end
1091
+
1092
+ it "sets the inverse foreign key on the relation" do
1093
+ expect(preference.person_ids).to eq([ person.id ])
1094
+ end
1095
+
1096
+ it "sets the base on the inverse relation" do
1097
+ expect(preference.people).to eq([ person ])
1098
+ end
1099
+
1100
+ it "sets the attributes" do
1101
+ expect(preference.name).to eq("settings")
1102
+ end
1103
+
1104
+ it "does not save the target" do
1105
+ expect(preference).to be_new_record
1106
+ end
1107
+
1108
+ it "adds the correct number of documents" do
1109
+ expect(person.preferences.size).to eq(1)
1110
+ end
1111
+
1112
+ context "when saving the target" do
1113
+
1114
+ before do
1115
+ preference.save!
1116
+ end
1117
+
1118
+ it "persists the parent keys" do
1119
+ expect(person.reload.preference_ids).to eq([ preference.id ])
1120
+ end
1121
+ end
1122
+ end
1123
+ end
1124
+ end
1125
+ end
1126
+
1127
+ describe "#clear" do
1128
+
1129
+ context "when the relation is not polymorphic" do
1130
+
1131
+ context "when the parent has been persisted" do
1132
+
1133
+ let!(:person) do
1134
+ Person.create!
1135
+ end
1136
+
1137
+ context "when the children are persisted" do
1138
+
1139
+ let!(:preference) do
1140
+ person.preferences.create!(name: "settings")
1141
+ end
1142
+
1143
+ let!(:relation) do
1144
+ person.preferences.clear
1145
+ end
1146
+
1147
+ it "clears out the relation" do
1148
+ expect(person.preferences).to be_empty
1149
+ end
1150
+
1151
+ it "removes the parent from the inverse relation" do
1152
+ expect(preference.people).to_not include(person)
1153
+ end
1154
+
1155
+ it "removes the foreign keys" do
1156
+ expect(person.preference_ids).to be_empty
1157
+ end
1158
+
1159
+ it "removes the parent key from the inverse" do
1160
+ expect(preference.person_ids).to_not include(person.id)
1161
+ end
1162
+
1163
+ it "does not delete the documents" do
1164
+ expect(preference).to_not be_destroyed
1165
+ end
1166
+
1167
+ it "persists the nullification" do
1168
+ expect(person.reload.preferences).to be_empty
1169
+ end
1170
+
1171
+ it "returns the relation" do
1172
+ expect(relation).to be_empty
1173
+ end
1174
+ end
1175
+
1176
+ context "when the children are not persisted" do
1177
+
1178
+ let!(:preference) do
1179
+ person.preferences.build(name: "setting")
1180
+ end
1181
+
1182
+ let!(:relation) do
1183
+ person.preferences.clear
1184
+ end
1185
+
1186
+ it "clears out the relation" do
1187
+ expect(person.preferences).to be_empty
1188
+ end
1189
+ end
1190
+ end
1191
+
1192
+ context "when the parent is not persisted" do
1193
+
1194
+ let(:person) do
1195
+ Person.new
1196
+ end
1197
+
1198
+ let!(:preference) do
1199
+ person.preferences.build(name: "setting")
1200
+ end
1201
+
1202
+ let!(:relation) do
1203
+ person.preferences.clear
1204
+ end
1205
+
1206
+ it "clears out the relation" do
1207
+ expect(person.preferences).to be_empty
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ context "when the association has callbacks" do
1213
+
1214
+ let(:post) do
1215
+ Post.new
1216
+ end
1217
+
1218
+ let(:tag) do
1219
+ Tag.new
1220
+ end
1221
+
1222
+ before do
1223
+ post.tags << tag
1224
+ end
1225
+
1226
+ context "when the callback is a before_remove" do
1227
+
1228
+ context "when no errors are raised" do
1229
+
1230
+ before do
1231
+ post.tags.clear
1232
+ end
1233
+
1234
+ it "executes the callback" do
1235
+ expect(post.before_remove_called).to be true
1236
+ end
1237
+
1238
+ it "removes the document from the relation" do
1239
+ expect(post.tags).to be_empty
1240
+ end
1241
+ end
1242
+
1243
+ context "when errors are raised" do
1244
+
1245
+ before do
1246
+ expect(post).to receive(:before_remove_tag).and_raise
1247
+ begin; post.tags.clear; rescue; end
1248
+ end
1249
+
1250
+ it "does not remove the document from the relation" do
1251
+ expect(post.tags).to eq([ tag ])
1252
+ end
1253
+ end
1254
+ end
1255
+
1256
+ context "when the callback is an after_remove" do
1257
+
1258
+ context "when no errors are raised" do
1259
+
1260
+ before do
1261
+ post.tags.clear
1262
+ end
1263
+
1264
+ it "executes the callback" do
1265
+ expect(post.after_remove_called).to be true
1266
+ end
1267
+
1268
+ it "removes the document from the relation" do
1269
+ expect(post.tags).to be_empty
1270
+ end
1271
+ end
1272
+
1273
+ context "when errors are raised" do
1274
+
1275
+ before do
1276
+ expect(post).to receive(:after_remove_tag).and_raise
1277
+ begin; post.tags.clear; rescue; end
1278
+ end
1279
+
1280
+ it "removes the document from the relation" do
1281
+ expect(post.tags).to be_empty
1282
+ end
1283
+ end
1284
+ end
1285
+ end
1286
+ end
1287
+
1288
+ describe "#concat" do
1289
+
1290
+ context "when the parent is a new record" do
1291
+
1292
+ let(:person) do
1293
+ Person.new
1294
+ end
1295
+
1296
+ let!(:preference) do
1297
+ Preference.new
1298
+ end
1299
+
1300
+ let(:result) do
1301
+ person.preferences.concat([ preference ])
1302
+ end
1303
+
1304
+ it "returns an array of loaded documents" do
1305
+ expect(result).to eq([ preference ])
1306
+ end
1307
+ end
1308
+
1309
+ context "when the parent is not a new record" do
1310
+
1311
+ let(:person) do
1312
+ Person.create!
1313
+ end
1314
+
1315
+ let!(:preference) do
1316
+ Preference.new
1317
+ end
1318
+
1319
+ let(:result) do
1320
+ person.preferences.concat([ preference ])
1321
+ end
1322
+
1323
+ it "returns an array of loaded documents" do
1324
+ expect(result).to eq([ preference ])
1325
+ end
1326
+ end
1327
+
1328
+ context "when the relations are not polymorphic" do
1329
+
1330
+ context "when the inverse relation is not defined" do
1331
+
1332
+ let(:person) do
1333
+ Person.new
1334
+ end
1335
+
1336
+ let(:house) do
1337
+ House.new
1338
+ end
1339
+
1340
+ before do
1341
+ person.houses.concat([ house ])
1342
+ end
1343
+
1344
+ it "appends the document to the relation" do
1345
+ expect(person.houses).to eq([ house ])
1346
+ end
1347
+
1348
+ it "sets the foreign key on the relation" do
1349
+ expect(person.house_ids).to eq([ house.id ])
1350
+ end
1351
+ end
1352
+
1353
+ context "when appending in a parent create block" do
1354
+
1355
+ let!(:preference) do
1356
+ Preference.create!(name: "testing")
1357
+ end
1358
+
1359
+ let!(:person) do
1360
+ Person.create! do |doc|
1361
+ doc.preferences.concat([ preference ])
1362
+ end
1363
+ end
1364
+
1365
+ it "adds the documents to the relation" do
1366
+ expect(person.preferences).to eq([ preference ])
1367
+ end
1368
+
1369
+ it "sets the foreign key on the relation" do
1370
+ expect(person.preference_ids).to eq([ preference.id ])
1371
+ end
1372
+
1373
+ it "sets the foreign key on the inverse relation" do
1374
+ expect(preference.person_ids).to eq([ person.id ])
1375
+ end
1376
+
1377
+ it "saves the target" do
1378
+ expect(preference).to be_persisted
1379
+ end
1380
+
1381
+ it "adds the correct number of documents" do
1382
+ expect(person.preferences.size).to eq(1)
1383
+ end
1384
+
1385
+ it "persists the link" do
1386
+ expect(person.reload.preferences).to eq([ preference ])
1387
+ end
1388
+ end
1389
+
1390
+ context "when the parent is a new record" do
1391
+
1392
+ let(:person) do
1393
+ Person.new
1394
+ end
1395
+
1396
+ context "when the child is new" do
1397
+
1398
+ let(:preference) do
1399
+ Preference.new
1400
+ end
1401
+
1402
+ before do
1403
+ person.preferences.concat([ preference ])
1404
+ end
1405
+
1406
+ it "adds the documents to the relation" do
1407
+ expect(person.preferences).to eq([ preference ])
1408
+ end
1409
+
1410
+ it "sets the foreign key on the relation" do
1411
+ expect(person.preference_ids).to eq([ preference.id ])
1412
+ end
1413
+
1414
+ it "sets the foreign key on the inverse relation" do
1415
+ expect(preference.person_ids).to eq([ person.id ])
1416
+ end
1417
+
1418
+ it "does not save the target" do
1419
+ expect(preference).to be_new_record
1420
+ end
1421
+
1422
+ it "adds the correct number of documents" do
1423
+ expect(person.preferences.size).to eq(1)
1424
+ end
1425
+
1426
+ context "when appending a second time" do
1427
+
1428
+ before do
1429
+ person.preferences.concat([ preference ])
1430
+ end
1431
+
1432
+ it "does not allow the document to be added again" do
1433
+ expect(person.preferences).to eq([ preference ])
1434
+ end
1435
+
1436
+ it "does not allow duplicate ids" do
1437
+ expect(person.preference_ids).to eq([ preference.id ])
1438
+ end
1439
+ end
1440
+ end
1441
+
1442
+ context "when the child is already persisted" do
1443
+
1444
+ let!(:persisted) do
1445
+ Preference.create!(name: "testy")
1446
+ end
1447
+
1448
+ let(:preference) do
1449
+ Preference.first
1450
+ end
1451
+
1452
+ before do
1453
+ person.preferences.concat([ preference ])
1454
+ person.save!
1455
+ end
1456
+
1457
+ it "adds the documents to the relation" do
1458
+ expect(person.preferences).to eq([ preference ])
1459
+ end
1460
+
1461
+ it "sets the foreign key on the relation" do
1462
+ expect(person.preference_ids).to eq([ preference.id ])
1463
+ end
1464
+
1465
+ it "sets the foreign key on the inverse relation" do
1466
+ expect(preference.person_ids).to eq([ person.id ])
1467
+ end
1468
+
1469
+ it "saves the target" do
1470
+ expect(preference).to be_persisted
1471
+ end
1472
+
1473
+ it "adds the correct number of documents" do
1474
+ expect(person.preferences.size).to eq(1)
1475
+ end
1476
+
1477
+ it "persists the link" do
1478
+ expect(person.reload.preferences).to eq([ preference ])
1479
+ end
1480
+ end
1481
+
1482
+ context "when setting via the associated ids" do
1483
+
1484
+ let!(:persisted) do
1485
+ Preference.create!(name: "testy")
1486
+ end
1487
+
1488
+ let(:preference) do
1489
+ Preference.first
1490
+ end
1491
+
1492
+ let(:person) do
1493
+ Person.new(preference_ids: [ preference.id ])
1494
+ end
1495
+
1496
+ before do
1497
+ person.save!
1498
+ end
1499
+
1500
+ it "adds the documents to the relation" do
1501
+ expect(person.preferences).to eq([ preference ])
1502
+ end
1503
+
1504
+ it "sets the foreign key on the relation" do
1505
+ expect(person.preference_ids).to eq([ preference.id ])
1506
+ end
1507
+
1508
+ it "sets the foreign key on the inverse relation" do
1509
+ expect(preference.reload.person_ids).to eq([ person.id ])
1510
+ end
1511
+
1512
+ it "adds the correct number of documents" do
1513
+ expect(person.preferences.size).to eq(1)
1514
+ end
1515
+
1516
+ it "persists the link" do
1517
+ expect(person.reload.preferences).to eq([ preference ])
1518
+ end
1519
+ end
1520
+ end
1521
+
1522
+ context "when the parent is not a new record" do
1523
+
1524
+ let(:person) do
1525
+ Person.create!
1526
+ end
1527
+
1528
+ let(:preference) do
1529
+ Preference.new
1530
+ end
1531
+
1532
+ before do
1533
+ person.preferences.concat([ preference ])
1534
+ end
1535
+
1536
+ it "adds the documents to the relation" do
1537
+ expect(person.preferences).to eq([ preference ])
1538
+ end
1539
+
1540
+ it "sets the foreign key on the relation" do
1541
+ expect(person.preference_ids).to eq([ preference.id ])
1542
+ end
1543
+
1544
+ it "sets the foreign key on the inverse relation" do
1545
+ expect(preference.person_ids).to eq([ person.id ])
1546
+ end
1547
+
1548
+ it "sets the base on the inverse relation" do
1549
+ expect(preference.people).to eq([ person ])
1550
+ end
1551
+
1552
+ it "sets the same instance on the inverse relation" do
1553
+ expect(preference.people.first).to eql(person)
1554
+ end
1555
+
1556
+ it "saves the target" do
1557
+ expect(preference).to_not be_new_record
1558
+ end
1559
+
1560
+ it "adds the document to the target" do
1561
+ expect(person.preferences.count).to eq(1)
1562
+ end
1563
+
1564
+ context "when documents already exist on the relation" do
1565
+
1566
+ let(:preference_two) do
1567
+ Preference.new
1568
+ end
1569
+
1570
+ before do
1571
+ person.preferences.concat([ preference_two ])
1572
+ end
1573
+
1574
+ it "adds the documents to the relation" do
1575
+ expect(person.preferences).to eq([ preference, preference_two ])
1576
+ end
1577
+
1578
+ it "sets the foreign key on the relation" do
1579
+ expect(person.preference_ids).to eq([ preference.id, preference_two.id ])
1580
+ end
1581
+
1582
+ it "sets the foreign key on the inverse relation" do
1583
+ expect(preference_two.person_ids).to eq([ person.id ])
1584
+ end
1585
+
1586
+ it "sets the base on the inverse relation" do
1587
+ expect(preference_two.people).to eq([ person ])
1588
+ end
1589
+
1590
+ it "sets the same instance on the inverse relation" do
1591
+ expect(preference_two.people.first).to eql(person)
1592
+ end
1593
+
1594
+ it "saves the target" do
1595
+ expect(preference).to_not be_new_record
1596
+ end
1597
+
1598
+ it "adds the document to the target" do
1599
+ expect(person.preferences.count).to eq(2)
1600
+ end
1601
+ end
1602
+ end
1603
+
1604
+ context "when both sides have been persisted" do
1605
+
1606
+ let(:person) do
1607
+ Person.create!
1608
+ end
1609
+
1610
+ let(:event) do
1611
+ Event.create!
1612
+ end
1613
+
1614
+ before do
1615
+ person.administrated_events.concat([ event ])
1616
+ end
1617
+
1618
+ it "sets the front side of the relation" do
1619
+ expect(person.administrated_events).to eq([ event ])
1620
+ end
1621
+
1622
+ it "sets the inverse side of the relation" do
1623
+ expect(event.administrators(true)).to eq([ person ])
1624
+ end
1625
+
1626
+ context "when reloading" do
1627
+
1628
+ it "sets the front side of the relation" do
1629
+ expect(person.reload.administrated_events).to eq([ event ])
1630
+ end
1631
+
1632
+ it "sets the inverse side of the relation" do
1633
+ expect(event.reload.administrators).to eq([ person ])
1634
+ end
1635
+ end
1636
+
1637
+ context "when performing a new database query" do
1638
+
1639
+ let(:loaded_person) do
1640
+ Person.find(person.id)
1641
+ end
1642
+
1643
+ let(:loaded_event) do
1644
+ Event.find(event.id)
1645
+ end
1646
+
1647
+ it "sets the front side of the relation" do
1648
+ expect(loaded_person.administrated_events).to eq([ event ])
1649
+ end
1650
+
1651
+ it "sets the inverse side of the relation" do
1652
+ expect(loaded_event.administrators).to eq([ person ])
1653
+ end
1654
+ end
1655
+ end
1656
+
1657
+ context "when the relation also includes a has_many relation" do
1658
+
1659
+ let(:artwork) do
1660
+ Artwork.create!
1661
+ end
1662
+
1663
+ let(:exhibition) do
1664
+ Exhibition.create!
1665
+ end
1666
+
1667
+ let(:exhibitor) do
1668
+ Exhibitor.create!(exhibition: exhibition)
1669
+ end
1670
+
1671
+ before do
1672
+ artwork.exhibitors.concat([ exhibitor ])
1673
+ end
1674
+
1675
+ it "creates a single artwork object" do
1676
+ expect(Artwork.count).to eq(1)
1677
+ end
1678
+ end
1679
+
1680
+ context "when the relation is self referencing" do
1681
+
1682
+ let(:tag_one) do
1683
+ Tag.create!(text: "one")
1684
+ end
1685
+
1686
+ let(:tag_two) do
1687
+ Tag.create!(text: "two")
1688
+ end
1689
+
1690
+ before do
1691
+ tag_one.related.concat([ tag_two ])
1692
+ end
1693
+
1694
+ it "sets the front side of the relation" do
1695
+ expect(tag_one.related).to eq([ tag_two ])
1696
+ end
1697
+
1698
+ it "sets the inverse side of the relation" do
1699
+ expect(tag_two.related(true)).to eq([ tag_one ])
1700
+ end
1701
+
1702
+ context "when reloading" do
1703
+
1704
+ it "sets the front side of the relation" do
1705
+ expect(tag_one.reload.related).to eq([ tag_two ])
1706
+ end
1707
+
1708
+ it "sets the inverse side of the relation" do
1709
+ expect(tag_two.reload.related).to eq([ tag_one ])
1710
+ end
1711
+ end
1712
+
1713
+ context "when performing a new database query" do
1714
+
1715
+ let(:loaded_tag_one) do
1716
+ Tag.find(tag_one.id)
1717
+ end
1718
+
1719
+ let(:loaded_tag_two) do
1720
+ Tag.find(tag_two.id)
1721
+ end
1722
+
1723
+ it "sets the front side of the relation" do
1724
+ expect(loaded_tag_one.related).to eq([ tag_two ])
1725
+ end
1726
+
1727
+ it "sets the inverse side of the relation" do
1728
+ expect(loaded_tag_two.related).to eq([ tag_one ])
1729
+ end
1730
+ end
1731
+ end
1732
+ end
1733
+ end
1734
+
1735
+ describe "#count" do
1736
+
1737
+ let(:person) do
1738
+ Person.create!
1739
+ end
1740
+
1741
+ context "when nothing exists on the relation" do
1742
+
1743
+ context "when the document is destroyed" do
1744
+
1745
+ before do
1746
+ Meat.create!
1747
+ end
1748
+
1749
+ let!(:sandwich) do
1750
+ Sandwich.create!
1751
+ end
1752
+
1753
+ it "returns zero" do
1754
+ sandwich.destroy
1755
+ expect(sandwich.meats.count).to eq(0)
1756
+ end
1757
+ end
1758
+ end
1759
+
1760
+ describe "#any?" do
1761
+
1762
+ let(:person) do
1763
+ Person.create!
1764
+ end
1765
+
1766
+ context "when nothing exists on the relation" do
1767
+
1768
+ context "when no document is added" do
1769
+
1770
+ let!(:sandwich) do
1771
+ Sandwich.create!
1772
+ end
1773
+
1774
+ it "returns false" do
1775
+ expect(sandwich.meats.any?).to be false
1776
+ end
1777
+ end
1778
+
1779
+ context "when the document is destroyed" do
1780
+
1781
+ before do
1782
+ Meat.create!
1783
+ end
1784
+
1785
+ let!(:sandwich) do
1786
+ Sandwich.create!
1787
+ end
1788
+
1789
+ it "returns false" do
1790
+ sandwich.destroy
1791
+ expect(sandwich.meats.any?).to be false
1792
+ end
1793
+ end
1794
+ end
1795
+ end
1796
+
1797
+ context "when documents have been persisted" do
1798
+
1799
+ let!(:preference) do
1800
+ person.preferences.create!(name: "setting")
1801
+ end
1802
+
1803
+ it "returns the number of persisted documents" do
1804
+ expect(person.preferences.count).to eq(1)
1805
+ end
1806
+ end
1807
+
1808
+ context "when appending to a loaded relation" do
1809
+
1810
+ let!(:preference) do
1811
+ person.preferences.create!(name: "setting")
1812
+ end
1813
+
1814
+ before do
1815
+ person.preferences.count
1816
+ person.preferences << Preference.create!(name: "two")
1817
+ end
1818
+
1819
+ it "returns the number of persisted documents" do
1820
+ expect(person.preferences.count).to eq(2)
1821
+ end
1822
+ end
1823
+
1824
+ context "when documents have not been persisted" do
1825
+
1826
+ let!(:preference) do
1827
+ person.preferences.build(name: "settings")
1828
+ end
1829
+
1830
+ it "returns 0" do
1831
+ expect(person.preferences.count).to eq(0)
1832
+ end
1833
+ end
1834
+
1835
+ context "when new documents exist in the database" do
1836
+
1837
+ context "when the documents are part of the relation" do
1838
+
1839
+ before do
1840
+ Preference.create!(person_ids: [ person.id ])
1841
+ end
1842
+
1843
+ it "returns the count from the db" do
1844
+ expect(person.reload.preferences.count).to eq(1)
1845
+ end
1846
+ end
1847
+
1848
+ context "when the documents are not part of the relation" do
1849
+
1850
+ before do
1851
+ Preference.create!
1852
+ end
1853
+
1854
+ it "returns the count from the db" do
1855
+ expect(person.preferences.count).to eq(0)
1856
+ end
1857
+ end
1858
+ end
1859
+
1860
+ context "when the inverse relation is not defined" do
1861
+
1862
+ context "when documents have been persisted" do
1863
+
1864
+ let!(:house) do
1865
+ person.houses.create!(name: "Wayne Manor")
1866
+ end
1867
+
1868
+ it "returns the number of persisted documents" do
1869
+ expect(person.houses.count).to eq(1)
1870
+ end
1871
+ end
1872
+
1873
+ context "when documents have not been persisted" do
1874
+
1875
+ let!(:house) do
1876
+ person.houses.build(name: "Ryugyong Hotel")
1877
+ end
1878
+
1879
+ it "returns 0" do
1880
+ expect(person.preferences.count).to eq(0)
1881
+ end
1882
+ end
1883
+ end
1884
+ end
1885
+
1886
+ describe "#any?" do
1887
+
1888
+ let(:sandwich) do
1889
+ Sandwich.create!
1890
+ end
1891
+
1892
+ context "when nothing exists on the relation" do
1893
+
1894
+ context "when no document is added" do
1895
+
1896
+ let!(:sandwich) do
1897
+ Sandwich.create!
1898
+ end
1899
+
1900
+ it "returns false" do
1901
+ expect(sandwich.meats.any?).to be false
1902
+ end
1903
+ end
1904
+
1905
+ context "when the document is destroyed" do
1906
+
1907
+ before do
1908
+ Meat.create!
1909
+ end
1910
+
1911
+ let!(:sandwich) do
1912
+ Sandwich.create!
1913
+ end
1914
+
1915
+ it "returns false" do
1916
+ sandwich.destroy
1917
+ expect(sandwich.meats.any?).to be false
1918
+ end
1919
+ end
1920
+ end
1921
+
1922
+ context "when appending to a relation and _loaded/_unloaded are empty" do
1923
+
1924
+ let!(:sandwich) do
1925
+ Sandwich.create!
1926
+ end
1927
+
1928
+ before do
1929
+ sandwich.meats << Meat.new
1930
+ end
1931
+
1932
+ it "returns true" do
1933
+ expect(sandwich.meats.any?).to be true
1934
+ end
1935
+ end
1936
+
1937
+ context "when appending to a relation in a transaction" do
1938
+ require_transaction_support
1939
+
1940
+ let!(:sandwich) do
1941
+ Sandwich.create!
1942
+ end
1943
+
1944
+ it "returns true" do
1945
+ sandwich.with_session do |session|
1946
+ session.with_transaction do
1947
+ expect{ sandwich.meats << Meat.new }.to_not raise_error
1948
+ expect(sandwich.meats.any?).to be true
1949
+ end
1950
+ end
1951
+ end
1952
+ end
1953
+
1954
+ context "when documents have been persisted" do
1955
+
1956
+ let!(:meat) do
1957
+ sandwich.meats.create!
1958
+ end
1959
+
1960
+ it "returns true" do
1961
+ expect(sandwich.meats.any?).to be true
1962
+ end
1963
+ end
1964
+
1965
+ context "when documents have not been persisted" do
1966
+
1967
+ let!(:meat) do
1968
+ sandwich.meats.build
1969
+ end
1970
+
1971
+ it "returns false" do
1972
+ expect(sandwich.meats.any?).to be true
1973
+ end
1974
+ end
1975
+
1976
+ context "when new documents exist in the database" do
1977
+ before do
1978
+ Meat.create!(sandwiches: [sandwich])
1979
+ end
1980
+
1981
+ it "returns true" do
1982
+ expect(sandwich.meats.any?).to be true
1983
+ end
1984
+ end
1985
+ end
1986
+
1987
+ [ :create, :create! ].each do |method|
1988
+
1989
+ describe "##{method}" do
1990
+
1991
+ context "when the relation is not polymorphic" do
1992
+
1993
+ context "when using string keys" do
1994
+
1995
+ let(:agent) do
1996
+ Agent.create!(number: "007")
1997
+ end
1998
+
1999
+ before do
2000
+ agent.accounts.send(method, name: "test again")
2001
+ end
2002
+
2003
+ it "does not convert the string key to an object id" do
2004
+ expect(agent.account_ids).to eq([ "test-again" ])
2005
+ end
2006
+ end
2007
+
2008
+ context "when the parent is a new record" do
2009
+
2010
+ let(:person) do
2011
+ Person.new
2012
+ end
2013
+
2014
+ it "raises an unsaved document error" do
2015
+ expect {
2016
+ person.preferences.send(method, name: "Testing")
2017
+ }.to raise_error(Mongoid::Errors::UnsavedDocument)
2018
+ end
2019
+ end
2020
+
2021
+ context "when the parent is not a new record" do
2022
+
2023
+ let(:person) do
2024
+ Person.send(method)
2025
+ end
2026
+
2027
+ let!(:preference) do
2028
+ person.preferences.send(method, name: "Testing")
2029
+ end
2030
+
2031
+ it "sets the foreign key on the relation" do
2032
+ expect(person.preference_ids).to eq([ preference.id ])
2033
+ end
2034
+
2035
+ it "sets the foreign key on the inverse relation" do
2036
+ expect(preference.person_ids).to eq([ person.id ])
2037
+ end
2038
+
2039
+ it "adds the document" do
2040
+ expect(person.preferences).to eq([ preference ])
2041
+ end
2042
+
2043
+ it "sets the base on the inverse relation" do
2044
+ expect(preference.people).to eq([ person ])
2045
+ end
2046
+
2047
+ it "sets the attributes" do
2048
+ expect(preference.name).to eq("Testing")
2049
+ end
2050
+
2051
+ it "saves the target" do
2052
+ expect(preference).to be_persisted
2053
+ end
2054
+
2055
+ it "adds the document to the target" do
2056
+ expect(person.preferences.count).to eq(1)
2057
+ end
2058
+
2059
+ it "does not duplicate documents" do
2060
+ expect(person.reload.preferences.count).to eq(1)
2061
+ end
2062
+
2063
+ it "does not duplicate ids" do
2064
+ expect(person.reload.preference_ids.count).to eq(1)
2065
+ end
2066
+ end
2067
+ end
2068
+ end
2069
+ end
2070
+
2071
+ describe "#create!" do
2072
+
2073
+ context "when validation fails" do
2074
+
2075
+ let(:person) do
2076
+ Person.create!
2077
+ end
2078
+
2079
+ context "when the relation is not polymorphic" do
2080
+
2081
+ it "raises an error" do
2082
+ expect {
2083
+ person.preferences.create!(name: "a")
2084
+ }.to raise_error(Mongoid::Errors::Validations)
2085
+ end
2086
+ end
2087
+ end
2088
+ end
2089
+
2090
+ describe "#delete" do
2091
+
2092
+ let(:person) do
2093
+ Person.create!
2094
+ end
2095
+
2096
+ let(:preference_one) do
2097
+ Preference.create!(name: "Testing")
2098
+ end
2099
+
2100
+ let(:preference_two) do
2101
+ Preference.create!(name: "Test")
2102
+ end
2103
+
2104
+ before do
2105
+ person.preferences << [ preference_one, preference_two ]
2106
+ end
2107
+
2108
+ context "when the document exists" do
2109
+
2110
+ let!(:deleted) do
2111
+ person.preferences.delete(preference_one)
2112
+ end
2113
+
2114
+ it "removes the document from the relation" do
2115
+ expect(person.preferences).to eq([ preference_two ])
2116
+ end
2117
+
2118
+ it "returns the document" do
2119
+ expect(deleted).to eq(preference_one)
2120
+ end
2121
+
2122
+ it "removes the document key from the foreign key" do
2123
+ expect(person.preference_ids).to eq([ preference_two.id ])
2124
+ end
2125
+
2126
+ it "removes the inverse reference" do
2127
+ expect(deleted.reload.people).to be_empty
2128
+ end
2129
+
2130
+ it "removes the base id from the inverse keys" do
2131
+ expect(deleted.reload.person_ids).to be_empty
2132
+ end
2133
+
2134
+ context "and person and preferences are reloaded" do
2135
+
2136
+ before do
2137
+ person.reload
2138
+ preference_one.reload
2139
+ preference_two.reload
2140
+ end
2141
+
2142
+ it "nullifies the deleted preference" do
2143
+ expect(person.preferences).to eq([ preference_two ])
2144
+ end
2145
+
2146
+ it "retains the ids for one preference" do
2147
+ expect(person.preference_ids).to eq([ preference_two.id ])
2148
+ end
2149
+ end
2150
+ end
2151
+
2152
+ context "when the document does not exist" do
2153
+
2154
+ let!(:deleted) do
2155
+ person.preferences.delete(Preference.new)
2156
+ end
2157
+
2158
+ it "returns nil" do
2159
+ expect(deleted).to be_nil
2160
+ end
2161
+
2162
+ it "does not modify the relation" do
2163
+ expect(person.preferences).to eq([ preference_one, preference_two ])
2164
+ end
2165
+
2166
+ it "does not modify the keys" do
2167
+ expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2168
+ end
2169
+ end
2170
+
2171
+ context "when :dependent => :nullify is set" do
2172
+
2173
+ context "when :inverse_of is set" do
2174
+
2175
+ let(:event) do
2176
+ Event.create!
2177
+ end
2178
+
2179
+ before do
2180
+ person.administrated_events << [ event ]
2181
+ end
2182
+
2183
+ it "deletes the document" do
2184
+ expect(event.delete).to be true
2185
+ end
2186
+ end
2187
+ end
2188
+
2189
+ context "when the relationships are self referencing" do
2190
+
2191
+ let(:tag_one) do
2192
+ Tag.create!(text: "one")
2193
+ end
2194
+
2195
+ let(:tag_two) do
2196
+ Tag.create!(text: "two")
2197
+ end
2198
+
2199
+ before do
2200
+ tag_one.related << tag_two
2201
+ end
2202
+
2203
+ context "when deleting without reloading" do
2204
+
2205
+ let!(:deleted) do
2206
+ tag_one.related.delete(tag_two)
2207
+ end
2208
+
2209
+ it "deletes the document from the relation" do
2210
+ expect(tag_one.related).to be_empty
2211
+ end
2212
+
2213
+ it "deletes the foreign key from the relation" do
2214
+ expect(tag_one.related_ids).to be_empty
2215
+ end
2216
+
2217
+ it "removes the reference from the inverse" do
2218
+ expect(deleted.related).to be_empty
2219
+ end
2220
+
2221
+ it "removes the foreign keys from the inverse" do
2222
+ expect(deleted.related_ids).to be_empty
2223
+ end
2224
+ end
2225
+
2226
+ context "when deleting with reloading" do
2227
+
2228
+ context "when deleting from the front side" do
2229
+
2230
+ let(:reloaded) do
2231
+ tag_one.reload
2232
+ end
2233
+
2234
+ let!(:deleted) do
2235
+ reloaded.related.delete(tag_two)
2236
+ end
2237
+
2238
+ it "deletes the document from the relation" do
2239
+ expect(reloaded.related).to be_empty
2240
+ end
2241
+
2242
+ it "deletes the foreign key from the relation" do
2243
+ expect(reloaded.related_ids).to be_empty
2244
+ end
2245
+
2246
+ it "removes the reference from the inverse" do
2247
+ expect(deleted.related).to be_empty
2248
+ end
2249
+
2250
+ it "removes the foreign keys from the inverse" do
2251
+ expect(deleted.related_ids).to be_empty
2252
+ end
2253
+ end
2254
+
2255
+ context "when deleting from the inverse side" do
2256
+
2257
+ let(:reloaded) do
2258
+ tag_two.reload
2259
+ end
2260
+
2261
+ let!(:deleted) do
2262
+ reloaded.related.delete(tag_one)
2263
+ end
2264
+
2265
+ it "deletes the document from the relation" do
2266
+ expect(reloaded.related).to be_empty
2267
+ end
2268
+
2269
+ it "deletes the foreign key from the relation" do
2270
+ expect(reloaded.related_ids).to be_empty
2271
+ end
2272
+
2273
+ it "removes the foreign keys from the inverse" do
2274
+ expect(deleted.related_ids).to be_empty
2275
+ end
2276
+ end
2277
+ end
2278
+ end
2279
+
2280
+ context "when the association has callbacks" do
2281
+
2282
+ let(:post) do
2283
+ Post.new
2284
+ end
2285
+
2286
+ let(:tag) do
2287
+ Tag.new
2288
+ end
2289
+
2290
+ before do
2291
+ post.tags << tag
2292
+ end
2293
+
2294
+ context "when the callback is a before_remove" do
2295
+
2296
+ context "when there are no errors" do
2297
+
2298
+ before do
2299
+ post.tags.delete tag
2300
+ end
2301
+
2302
+ it "executes the callback" do
2303
+ expect(post.before_remove_called).to be true
2304
+ end
2305
+
2306
+ it "removes the document from the relation" do
2307
+ expect(post.tags).to be_empty
2308
+ end
2309
+ end
2310
+
2311
+ context "when errors are raised" do
2312
+
2313
+ before do
2314
+ expect(post).to receive(:before_remove_tag).and_raise
2315
+ begin; post.tags.delete(tag); rescue; end
2316
+ end
2317
+
2318
+ it "does not remove the document from the relation" do
2319
+ expect(post.tags).to eq([ tag ])
2320
+ end
2321
+ end
2322
+ end
2323
+
2324
+ context "when the callback is an after_remove" do
2325
+
2326
+ context "when no errors are raised" do
2327
+
2328
+ before do
2329
+ post.tags.delete(tag)
2330
+ end
2331
+
2332
+ it "executes the callback" do
2333
+ expect(post.after_remove_called).to be true
2334
+ end
2335
+
2336
+ it "removes the document from the relation" do
2337
+ expect(post.tags).to be_empty
2338
+ end
2339
+ end
2340
+
2341
+ context "when errors are raised" do
2342
+
2343
+ before do
2344
+ expect(post).to receive(:after_remove_tag).and_raise
2345
+ begin; post.tags.delete(tag); rescue; end
2346
+ end
2347
+
2348
+ it "removes the document from the relation" do
2349
+ expect(post.tags).to be_empty
2350
+ end
2351
+ end
2352
+ end
2353
+ end
2354
+ end
2355
+
2356
+ [ :delete_all, :destroy_all ].each do |method|
2357
+
2358
+ describe "##{method}" do
2359
+
2360
+ context "when the relation is not polymorphic" do
2361
+
2362
+ context "when conditions are provided" do
2363
+
2364
+ let(:person) do
2365
+ Person.create!
2366
+ end
2367
+
2368
+ let!(:preference_one) do
2369
+ person.preferences.create!(name: "Testing")
2370
+ end
2371
+
2372
+ let!(:preference_two) do
2373
+ person.preferences.create!(name: "Test")
2374
+ end
2375
+
2376
+ let!(:deleted) do
2377
+ person.preferences.send(
2378
+ method,
2379
+ { name: "Testing" }
2380
+ )
2381
+ end
2382
+
2383
+ it "removes the correct preferences" do
2384
+ expect(person.preferences.count).to eq(1)
2385
+ end
2386
+
2387
+ it "deletes the documents from the database" do
2388
+ expect(Preference.where(name: "Testing").count).to eq(0)
2389
+ end
2390
+
2391
+ it "returns the number of documents deleted" do
2392
+ expect(deleted).to eq(1)
2393
+ end
2394
+
2395
+ it "removes the ids from the foreign key" do
2396
+ expect(person.preference_ids).to eq([ preference_two.id ])
2397
+ end
2398
+
2399
+ it "sets the association locally" do
2400
+ expect(person.preferences).to eq([preference_two])
2401
+ end
2402
+ end
2403
+
2404
+ context "when conditions are not provided" do
2405
+
2406
+ let(:person) do
2407
+ Person.create!.tap do |person|
2408
+ person.preferences.create!(name: "Testing")
2409
+ person.preferences.create!(name: "Test")
2410
+ end
2411
+ end
2412
+
2413
+ let!(:deleted) do
2414
+ person.preferences.send(method)
2415
+ end
2416
+
2417
+ it "removes the correct preferences" do
2418
+ expect(person.preferences.count).to eq(0)
2419
+ end
2420
+
2421
+ it "deletes the documents from the database" do
2422
+ expect(Preference.count).to eq(0)
2423
+ end
2424
+
2425
+ it "returns the number of documents deleted" do
2426
+ expect(deleted).to eq(2)
2427
+ end
2428
+
2429
+ it "sets the association locally" do
2430
+ expect(person.preferences).to eq([])
2431
+ end
2432
+ end
2433
+ end
2434
+ end
2435
+ end
2436
+
2437
+ describe ".embedded?" do
2438
+
2439
+ it "returns false" do
2440
+ expect(described_class).to_not be_embedded
2441
+ end
2442
+ end
2443
+
2444
+ describe "#exists?" do
2445
+
2446
+ let!(:person) do
2447
+ Person.create!
2448
+ end
2449
+
2450
+ context "when documents exist in the database" do
2451
+
2452
+ before do
2453
+ person.preferences.create!
2454
+ end
2455
+
2456
+ it "returns true" do
2457
+ expect(person.preferences.exists?).to be true
2458
+ end
2459
+ end
2460
+
2461
+ context "when no documents exist in the database" do
2462
+
2463
+ before do
2464
+ person.preferences.build
2465
+ end
2466
+
2467
+ it "returns false" do
2468
+ expect(person.preferences.exists?).to be false
2469
+ end
2470
+ end
2471
+ end
2472
+
2473
+ describe "#find" do
2474
+
2475
+ context "when the relation is not polymorphic" do
2476
+
2477
+ let(:person) do
2478
+ Person.create!
2479
+ end
2480
+
2481
+ let!(:preference_one) do
2482
+ person.preferences.create!(name: "Test")
2483
+ end
2484
+
2485
+ let!(:preference_two) do
2486
+ person.preferences.create!(name: "OMG I has relations")
2487
+ end
2488
+
2489
+ let!(:unrelated_pref) do
2490
+ Preference.create!(name: "orphan annie")
2491
+ end
2492
+
2493
+ let!(:unrelated_pref_two) do
2494
+ Preference.create!(name: "orphan two")
2495
+ end
2496
+
2497
+ context "when providing an id" do
2498
+
2499
+ context "when the id matches" do
2500
+
2501
+ let(:preference) do
2502
+ person.preferences.find(preference_one.id)
2503
+ end
2504
+
2505
+ it "returns the matching document" do
2506
+ expect(preference).to eq(preference_one)
2507
+ end
2508
+ end
2509
+
2510
+ context "when the id matches an unreferenced document" do
2511
+
2512
+ let(:preference) do
2513
+ person.preferences.find(unrelated_pref.id)
2514
+ end
2515
+
2516
+ it "raises an error" do
2517
+ expect {
2518
+ preference
2519
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2520
+ end
2521
+ end
2522
+
2523
+ context "when the id does not match" do
2524
+
2525
+ context "when config set to raise error" do
2526
+
2527
+ before do
2528
+ Mongoid.raise_not_found_error = true
2529
+ end
2530
+
2531
+ it "raises an error" do
2532
+ expect {
2533
+ person.preferences.find(BSON::ObjectId.new)
2534
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2535
+ end
2536
+ end
2537
+
2538
+ context "when config set not to raise error" do
2539
+
2540
+ let(:preference) do
2541
+ person.preferences.find(BSON::ObjectId.new)
2542
+ end
2543
+
2544
+ before do
2545
+ Mongoid.raise_not_found_error = false
2546
+ end
2547
+
2548
+ after do
2549
+ Mongoid.raise_not_found_error = true
2550
+ end
2551
+
2552
+ it "returns nil" do
2553
+ expect(preference).to be_nil
2554
+ end
2555
+ end
2556
+ end
2557
+ end
2558
+
2559
+ context "when providing an array of ids" do
2560
+
2561
+ context "when the ids match" do
2562
+
2563
+ let(:preferences) do
2564
+ person.preferences.find([ preference_one.id, preference_two.id ])
2565
+ end
2566
+
2567
+ it "returns the matching documents" do
2568
+ expect(preferences).to eq([ preference_one, preference_two ])
2569
+ end
2570
+ end
2571
+
2572
+ context "when the ids match unreferenced documents" do
2573
+
2574
+ let(:preferences) do
2575
+ person.preferences.find(
2576
+ [ unrelated_pref.id, unrelated_pref_two.id ]
2577
+ )
2578
+ end
2579
+
2580
+ it "raises an error" do
2581
+ expect {
2582
+ preferences
2583
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2584
+ end
2585
+ end
2586
+
2587
+ context "when the ids do not match" do
2588
+
2589
+ context "when config set to raise error" do
2590
+
2591
+ before do
2592
+ Mongoid.raise_not_found_error = true
2593
+ end
2594
+
2595
+ it "raises an error" do
2596
+ expect {
2597
+ person.preferences.find([ BSON::ObjectId.new ])
2598
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2599
+ end
2600
+ end
2601
+
2602
+ context "when config set not to raise error" do
2603
+
2604
+ let(:preferences) do
2605
+ person.preferences.find([ BSON::ObjectId.new ])
2606
+ end
2607
+
2608
+ before do
2609
+ Mongoid.raise_not_found_error = false
2610
+ end
2611
+
2612
+ after do
2613
+ Mongoid.raise_not_found_error = true
2614
+ end
2615
+
2616
+ it "returns an empty array" do
2617
+ expect(preferences).to be_empty
2618
+ end
2619
+ end
2620
+ end
2621
+ end
2622
+ end
2623
+ end
2624
+
2625
+ describe "#find_or_create_by" do
2626
+
2627
+ context "when the relation is not polymorphic" do
2628
+
2629
+ let(:person) do
2630
+ Person.create!
2631
+ end
2632
+
2633
+ let!(:preference) do
2634
+ person.preferences.create!(name: "Testing")
2635
+ end
2636
+
2637
+ context "when the document exists" do
2638
+
2639
+ let(:found) do
2640
+ person.preferences.find_or_create_by(name: "Testing")
2641
+ end
2642
+
2643
+ it "returns the document" do
2644
+ expect(found).to eq(preference)
2645
+ end
2646
+ end
2647
+
2648
+ context "when the document does not exist" do
2649
+
2650
+ let(:found) do
2651
+ person.preferences.find_or_create_by(name: "Test")
2652
+ end
2653
+
2654
+ it "sets the new document attributes" do
2655
+ expect(found.name).to eq("Test")
2656
+ end
2657
+
2658
+ it "returns a newly persisted document" do
2659
+ expect(found).to be_persisted
2660
+ end
2661
+ end
2662
+ end
2663
+ end
2664
+
2665
+ describe "#find_or_create_by!" do
2666
+
2667
+ context "when the relation is not polymorphic" do
2668
+
2669
+ let(:person) do
2670
+ Person.create!
2671
+ end
2672
+
2673
+ let!(:preference) do
2674
+ person.preferences.create!(name: "Testing")
2675
+ end
2676
+
2677
+ context "when the document exists" do
2678
+
2679
+ let(:found) do
2680
+ person.preferences.find_or_create_by!(name: "Testing")
2681
+ end
2682
+
2683
+ it "returns the document" do
2684
+ expect(found).to eq(preference)
2685
+ end
2686
+ end
2687
+
2688
+ context "when the document does not exist" do
2689
+
2690
+ let(:found) do
2691
+ person.preferences.find_or_create_by!(name: "Test")
2692
+ end
2693
+
2694
+ it "sets the new document attributes" do
2695
+ expect(found.name).to eq("Test")
2696
+ end
2697
+
2698
+ it "returns a newly persisted document" do
2699
+ expect(found).to be_persisted
2700
+ end
2701
+
2702
+ context "when validation fails" do
2703
+
2704
+ it "raises an error" do
2705
+ expect {
2706
+ person.preferences.find_or_create_by!(name: "A")
2707
+ }.to raise_error(Mongoid::Errors::Validations)
2708
+ end
2709
+ end
2710
+ end
2711
+ end
2712
+ end
2713
+
2714
+ describe "#find_or_initialize_by" do
2715
+
2716
+ context "when the relation is not polymorphic" do
2717
+
2718
+ let(:person) do
2719
+ Person.create!
2720
+ end
2721
+
2722
+ let!(:preference) do
2723
+ person.preferences.create!(name: "Testing")
2724
+ end
2725
+
2726
+ context "when the document exists" do
2727
+
2728
+ let(:found) do
2729
+ person.preferences.find_or_initialize_by(name: "Testing")
2730
+ end
2731
+
2732
+ it "returns the document" do
2733
+ expect(found).to eq(preference)
2734
+ end
2735
+ end
2736
+
2737
+ context "when the document does not exist" do
2738
+
2739
+ let(:found) do
2740
+ person.preferences.find_or_initialize_by(name: "Test")
2741
+ end
2742
+
2743
+ it "sets the new document attributes" do
2744
+ expect(found.name).to eq("Test")
2745
+ end
2746
+
2747
+ it "returns a non persisted document" do
2748
+ expect(found).to_not be_persisted
2749
+ end
2750
+ end
2751
+ end
2752
+ end
2753
+
2754
+ describe "#max" do
2755
+
2756
+ let(:person) do
2757
+ Person.create!
2758
+ end
2759
+
2760
+ let(:preference_one) do
2761
+ Preference.create!(ranking: 5)
2762
+ end
2763
+
2764
+ let(:preference_two) do
2765
+ Preference.create!(ranking: 10)
2766
+ end
2767
+
2768
+ before do
2769
+ person.preferences.push(preference_one, preference_two)
2770
+ end
2771
+
2772
+ let(:max) do
2773
+ person.preferences.max do |a,b|
2774
+ a.ranking <=> b.ranking
2775
+ end
2776
+ end
2777
+
2778
+ it "returns the document with the max value of the supplied field" do
2779
+ expect(max).to eq(preference_two)
2780
+ end
2781
+ end
2782
+
2783
+ describe "#max_by" do
2784
+
2785
+ let(:person) do
2786
+ Person.create!
2787
+ end
2788
+
2789
+ let(:preference_one) do
2790
+ Preference.create!(ranking: 5)
2791
+ end
2792
+
2793
+ let(:preference_two) do
2794
+ Preference.create!(ranking: 10)
2795
+ end
2796
+
2797
+ before do
2798
+ person.preferences.push(preference_one, preference_two)
2799
+ end
2800
+
2801
+ let(:max) do
2802
+ person.preferences.max_by(&:ranking)
2803
+ end
2804
+
2805
+ it "returns the document with the max value of the supplied field" do
2806
+ expect(max).to eq(preference_two)
2807
+ end
2808
+ end
2809
+
2810
+ describe "#method_missing" do
2811
+
2812
+ let!(:person) do
2813
+ Person.create!
2814
+ end
2815
+
2816
+ let!(:preference_one) do
2817
+ person.preferences.create!(name: "First", value: "Posting")
2818
+ end
2819
+
2820
+ let!(:preference_two) do
2821
+ person.preferences.create!(name: "Second", value: "Testing")
2822
+ end
2823
+
2824
+ let!(:unrelated) do
2825
+ Preference.create!(name: "Third")
2826
+ end
2827
+
2828
+ context "when providing a single criteria" do
2829
+
2830
+ let(:preferences) do
2831
+ person.preferences.where(name: "First")
2832
+ end
2833
+
2834
+ it "applies the criteria to the documents" do
2835
+ expect(preferences).to eq([ preference_one ])
2836
+ end
2837
+
2838
+ context 'when providing a collation' do
2839
+ min_server_version '3.4'
2840
+
2841
+ let(:preferences) do
2842
+ person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
2843
+ end
2844
+
2845
+ it "applies the collation option to the query" do
2846
+ expect(preferences).to eq([ preference_one ])
2847
+ end
2848
+ end
2849
+ end
2850
+
2851
+ context "when providing a criteria on id" do
2852
+
2853
+ let(:preferences) do
2854
+ person.preferences.where(_id: unrelated.id)
2855
+ end
2856
+
2857
+ it "does not return unrelated documents" do
2858
+ expect(preferences).to be_empty
2859
+ end
2860
+ end
2861
+
2862
+ context "when providing a criteria class method" do
2863
+
2864
+ let(:preferences) do
2865
+ person.preferences.posting
2866
+ end
2867
+
2868
+ it "applies the criteria to the documents" do
2869
+ expect(preferences).to eq([ preference_one ])
2870
+ end
2871
+ end
2872
+
2873
+ context "when chaining criteria" do
2874
+
2875
+ let(:preferences) do
2876
+ person.preferences.posting.where(:name.in => [ "First" ])
2877
+ end
2878
+
2879
+ it "applies the criteria to the documents" do
2880
+ expect(preferences).to eq([ preference_one ])
2881
+ end
2882
+ end
2883
+
2884
+ context "when delegating methods" do
2885
+
2886
+ describe "#distinct" do
2887
+
2888
+ let(:values) do
2889
+ person.preferences.distinct(:name)
2890
+ end
2891
+
2892
+ it "returns the distinct values for the fields" do
2893
+ expect(values).to include("First")
2894
+ expect(values).to include("Second")
2895
+ end
2896
+
2897
+ context "when the inverse relation is not defined" do
2898
+
2899
+ let!(:house) do
2900
+ person.houses.create!(name: "Wayne Manor")
2901
+ end
2902
+
2903
+ it "returns the distinct values for the fields" do
2904
+ expect(person.houses.distinct(:name)).to eq([ house.name ])
2905
+ end
2906
+ end
2907
+ end
2908
+ end
2909
+ end
2910
+
2911
+ describe "#min" do
2912
+
2913
+ let(:person) do
2914
+ Person.create!
2915
+ end
2916
+
2917
+ let(:preference_one) do
2918
+ Preference.create!(ranking: 5)
2919
+ end
2920
+
2921
+ let(:preference_two) do
2922
+ Preference.create!(ranking: 10)
2923
+ end
2924
+
2925
+ before do
2926
+ person.preferences.push(preference_one, preference_two)
2927
+ end
2928
+
2929
+ let(:min) do
2930
+ person.preferences.min do |a, b|
2931
+ a.ranking <=> b.ranking
2932
+ end
2933
+ end
2934
+
2935
+ it "returns the min value of the supplied field" do
2936
+ expect(min).to eq(preference_one)
2937
+ end
2938
+ end
2939
+
2940
+ describe "#min_by" do
2941
+
2942
+ let(:person) do
2943
+ Person.create!
2944
+ end
2945
+
2946
+ let(:preference_one) do
2947
+ Preference.create!(ranking: 5)
2948
+ end
2949
+
2950
+ let(:preference_two) do
2951
+ Preference.create!(ranking: 10)
2952
+ end
2953
+
2954
+ before do
2955
+ person.preferences.push(preference_one, preference_two)
2956
+ end
2957
+
2958
+ let(:min) do
2959
+ person.preferences.min_by(&:ranking)
2960
+ end
2961
+
2962
+ it "returns the min value of the supplied field" do
2963
+ expect(min).to eq(preference_one)
2964
+ end
2965
+ end
2966
+
2967
+ describe "#nil?" do
2968
+
2969
+ it "returns false" do
2970
+ expect(Person.new.preferences).to_not be_nil
2971
+ end
2972
+ end
2973
+
2974
+ describe "#nullify_all" do
2975
+
2976
+ let(:person) do
2977
+ Person.create!
2978
+ end
2979
+
2980
+ let!(:preference_one) do
2981
+ person.preferences.create!(name: "One")
2982
+ end
2983
+
2984
+ let!(:preference_two) do
2985
+ person.preferences.create!(name: "Two")
2986
+ end
2987
+
2988
+ before do
2989
+ person.preferences.nullify_all
2990
+ end
2991
+
2992
+ it "removes the foreign key from the base document" do
2993
+ [ preference_one, preference_two ].each do |preference|
2994
+ expect(person.preference_ids).to_not include(preference.id)
2995
+ end
2996
+ end
2997
+
2998
+ it "removes the foreign key from the target documents" do
2999
+ [ preference_one, preference_two ].each do |preference|
3000
+ expect(preference.person_ids).to_not include(person.id)
3001
+ end
3002
+ end
3003
+
3004
+ it "removes the reference from the base document" do
3005
+ [ preference_one, preference_two ].each do |preference|
3006
+ expect(person.preferences).to_not include(preference)
3007
+ end
3008
+ end
3009
+
3010
+ it "removes the reference from the target documents" do
3011
+ [ preference_one, preference_two ].each do |preference|
3012
+ expect(preference.people).to_not include(person)
3013
+ end
3014
+ end
3015
+
3016
+ it "saves the documents" do
3017
+ expect(preference_one.reload.people).to_not include(person)
3018
+ end
3019
+ end
3020
+
3021
+ describe "#respond_to?" do
3022
+
3023
+ let(:person) do
3024
+ Person.new
3025
+ end
3026
+
3027
+ let(:preferences) do
3028
+ person.preferences
3029
+ end
3030
+
3031
+ Array.public_instance_methods.sort.each do |method|
3032
+
3033
+ context "when checking Array##{method}" do
3034
+
3035
+ before do
3036
+ expect([].respond_to?(method)).to be true
3037
+ end
3038
+
3039
+ it "returns true" do
3040
+ expect(preferences.respond_to?(method)).to be true
3041
+ end
3042
+ end
3043
+ end
3044
+
3045
+ Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy.public_instance_methods.sort.each do |method|
3046
+
3047
+ context "when checking Proxy##{method}" do
3048
+
3049
+ it "returns true" do
3050
+ expect(preferences.respond_to?(method)).to be true
3051
+ end
3052
+ end
3053
+ end
3054
+
3055
+ Preference.scopes.keys.sort.each do |method|
3056
+
3057
+ context "when checking scope #{method}" do
3058
+
3059
+ it "returns true" do
3060
+ expect(preferences.respond_to?(method)).to be true
3061
+ end
3062
+ end
3063
+ end
3064
+ end
3065
+
3066
+ describe "#scoped" do
3067
+
3068
+ let(:scoped) do
3069
+ person.preferences.scoped
3070
+ end
3071
+
3072
+ context 'when association is empty' do
3073
+
3074
+ let(:person) do
3075
+ Person.new
3076
+ end
3077
+
3078
+ it "returns the relation criteria" do
3079
+ expect(scoped).to be_a(Mongoid::Criteria)
3080
+ end
3081
+
3082
+ it "returns with an empty selector" do
3083
+ expect(scoped.selector).to eq("_id" => { "$in" => [] })
3084
+ end
3085
+ end
3086
+
3087
+ context 'when association is not empty' do
3088
+
3089
+ let(:person) do
3090
+ Person.create!(preferences: [
3091
+ Preference.new(id: 123),
3092
+ ])
3093
+ end
3094
+
3095
+ it "returns with a selector including association element ids" do
3096
+ expect(scoped.selector).to eq("_id" => { "$in" => [123] })
3097
+ end
3098
+ end
3099
+ end
3100
+
3101
+ [ :size, :length ].each do |method|
3102
+
3103
+ describe "##{method}" do
3104
+
3105
+ let(:person) do
3106
+ Person.create!
3107
+ end
3108
+
3109
+ context "when documents have been persisted" do
3110
+
3111
+ let!(:preference) do
3112
+ person.preferences.create!(name: "Testing")
3113
+ end
3114
+
3115
+ it "returns the number of documents" do
3116
+ expect(person.preferences.send(method)).to eq(1)
3117
+ end
3118
+ end
3119
+
3120
+ context "when documents have not been persisted" do
3121
+
3122
+ before do
3123
+ person.preferences.build(name: "Test")
3124
+ person.preferences.create!(name: "Test 2")
3125
+ end
3126
+
3127
+ it "returns the total number of documents" do
3128
+ expect(person.preferences.send(method)).to eq(2)
3129
+ end
3130
+ end
3131
+ end
3132
+ end
3133
+
3134
+ describe "#unscoped" do
3135
+
3136
+ context "when the relation has no default scope" do
3137
+
3138
+ let!(:person) do
3139
+ Person.create!
3140
+ end
3141
+
3142
+ let!(:preference_one) do
3143
+ person.preferences.create!(name: "first")
3144
+ end
3145
+
3146
+ let!(:preference_two) do
3147
+ Preference.create!(name: "second")
3148
+ end
3149
+
3150
+ let(:unscoped) do
3151
+ person.preferences.unscoped
3152
+ end
3153
+
3154
+ it "returns only the associated documents" do
3155
+ expect(unscoped).to eq([ preference_one ])
3156
+ end
3157
+ end
3158
+
3159
+ context "when the relation has a default scope" do
3160
+
3161
+ let!(:person) do
3162
+ Person.create!
3163
+ end
3164
+
3165
+ let!(:house_one) do
3166
+ person.houses.create!(name: "first")
3167
+ end
3168
+
3169
+ let!(:house_two) do
3170
+ House.create!(name: "second")
3171
+ end
3172
+
3173
+ let(:unscoped) do
3174
+ person.houses.unscoped
3175
+ end
3176
+
3177
+ it "only returns associated documents" do
3178
+ expect(unscoped).to eq([ house_one ])
3179
+ end
3180
+
3181
+ it "removes the default scoping options" do
3182
+ expect(unscoped.options).to eq({})
3183
+ end
3184
+ end
3185
+ end
3186
+
3187
+ context "when setting the ids directly after the documents" do
3188
+
3189
+ let!(:person) do
3190
+ Person.create!(title: "The Boss")
3191
+ end
3192
+
3193
+ let!(:girlfriend_house) do
3194
+ House.create!(name: "Girlfriend")
3195
+ end
3196
+
3197
+ let!(:wife_house) do
3198
+ House.create!(name: "Wife")
3199
+ end
3200
+
3201
+ let!(:exwife_house) do
3202
+ House.create!(name: "Ex-Wife")
3203
+ end
3204
+
3205
+ before do
3206
+ person.update_attributes!(
3207
+ houses: [ wife_house, exwife_house, girlfriend_house ]
3208
+ )
3209
+ person.update_attributes!(house_ids: [ girlfriend_house.id ])
3210
+ end
3211
+
3212
+ context "when reloading" do
3213
+
3214
+ it "properly sets the references" do
3215
+ expect(person.houses(true)).to eq([ girlfriend_house ])
3216
+ end
3217
+ end
3218
+ end
3219
+
3220
+ context "when setting both sides in a single call" do
3221
+
3222
+ context "when the documents are new" do
3223
+
3224
+ let(:user) do
3225
+ User.new(name: "testing")
3226
+ end
3227
+
3228
+ let(:business) do
3229
+ Business.new(name: "serious", owners: [ user ])
3230
+ end
3231
+
3232
+ before do
3233
+ user.businesses = [ business ]
3234
+ end
3235
+
3236
+ it "sets the businesses" do
3237
+ expect(user.businesses).to eq([ business ])
3238
+ end
3239
+
3240
+ it "sets the inverse users" do
3241
+ expect(user.businesses.first.owners.first).to eq(user)
3242
+ end
3243
+
3244
+ it "sets the inverse businesses" do
3245
+ expect(business.owners).to eq([ user ])
3246
+ end
3247
+ end
3248
+
3249
+ context "when one side is persisted" do
3250
+
3251
+ let!(:user) do
3252
+ User.new(name: "testing")
3253
+ end
3254
+
3255
+ let!(:business) do
3256
+ Business.create!(name: "serious", owners: [ user ])
3257
+ end
3258
+
3259
+ before do
3260
+ user.businesses = [ business ]
3261
+ end
3262
+
3263
+ it "sets the businesses" do
3264
+ expect(user.businesses).to eq([ business ])
3265
+ end
3266
+
3267
+ it "sets the inverse users" do
3268
+ expect(user.businesses.first.owners.first).to eq(user)
3269
+ end
3270
+
3271
+ it "sets the inverse businesses" do
3272
+ expect(business.owners).to eq([ user ])
3273
+ end
3274
+
3275
+ context "when reloading" do
3276
+
3277
+ before do
3278
+ user.reload
3279
+ business.reload
3280
+ end
3281
+
3282
+ it "persists the businesses" do
3283
+ expect(user.businesses).to eq([ business ])
3284
+ end
3285
+
3286
+ it "persists the inverse users" do
3287
+ expect(user.businesses.first.owners.first).to eq(user)
3288
+ end
3289
+
3290
+ it "persists the inverse businesses" do
3291
+ expect(business.owners).to eq([ user ])
3292
+ end
3293
+ end
3294
+ end
3295
+
3296
+ context "when the documents are persisted" do
3297
+
3298
+ let(:user) do
3299
+ User.create!(name: "tst")
3300
+ end
3301
+
3302
+ let(:business) do
3303
+ Business.create!(name: "srs", owners: [ user ])
3304
+ end
3305
+
3306
+ before do
3307
+ user.businesses = [ business ]
3308
+ end
3309
+
3310
+ it "sets the businesses" do
3311
+ expect(user.businesses).to eq([ business ])
3312
+ end
3313
+
3314
+ it "sets the inverse users" do
3315
+ expect(user.businesses.first.owners.first).to eq(user)
3316
+ end
3317
+
3318
+ it "sets the inverse businesses" do
3319
+ expect(business.owners).to eq([ user ])
3320
+ end
3321
+
3322
+ context "when reloading" do
3323
+
3324
+ before do
3325
+ user.reload
3326
+ business.reload
3327
+ end
3328
+
3329
+ it "persists the businesses" do
3330
+ expect(user.businesses).to eq([ business ])
3331
+ end
3332
+
3333
+ it "persists the inverse users" do
3334
+ expect(user.businesses.first.owners.first).to eq(user)
3335
+ end
3336
+
3337
+ it "persists the inverse businesses" do
3338
+ expect(business.owners).to eq([ user ])
3339
+ end
3340
+ end
3341
+ end
3342
+ end
3343
+
3344
+ context "when binding the relation multiple times" do
3345
+
3346
+ let(:person) do
3347
+ Person.create!
3348
+ end
3349
+
3350
+ let(:preference) do
3351
+ person.preferences.create!(name: "testing")
3352
+ end
3353
+
3354
+ before do
3355
+ 2.times do
3356
+ person.preferences.each do |preference|
3357
+ expect(preference.person_ids).to eq([ person.id ])
3358
+ end
3359
+ end
3360
+ end
3361
+
3362
+ it "does not duplicate foreign keys" do
3363
+ expect(person.preference_ids).to eq([ preference.id ])
3364
+ end
3365
+ end
3366
+
3367
+ context "when the association has order criteria" do
3368
+
3369
+ let(:person) do
3370
+ Person.create!
3371
+ end
3372
+
3373
+ let(:preference_one) do
3374
+ OrderedPreference.create!(name: 'preference-1', value: 10)
3375
+ end
3376
+
3377
+ let(:preference_two) do
3378
+ OrderedPreference.create!(name: 'preference-2', value: 20)
3379
+ end
3380
+
3381
+ let(:preference_three) do
3382
+ OrderedPreference.create!(name: 'preference-3', value: 20)
3383
+ end
3384
+
3385
+ before do
3386
+ person.ordered_preferences.nullify_all
3387
+ person.ordered_preferences.push(preference_one, preference_two, preference_three)
3388
+ end
3389
+
3390
+ it "orders the documents" do
3391
+ expect(person.ordered_preferences(true)).to eq(
3392
+ [preference_two, preference_three, preference_one]
3393
+ )
3394
+ end
3395
+
3396
+ it "chains default criteria with additional" do
3397
+ expect(person.ordered_preferences.order_by(:name.desc).to_a).to eq(
3398
+ [preference_three, preference_two, preference_one]
3399
+ )
3400
+ end
3401
+ end
3402
+
3403
+ context "when the parent is not a new record and freshly loaded" do
3404
+
3405
+ let(:person) do
3406
+ Person.create!
3407
+ end
3408
+
3409
+ let(:preference) do
3410
+ Preference.new
3411
+ end
3412
+
3413
+ before do
3414
+ person.preferences = [ preference ]
3415
+ person.save!
3416
+ person.reload
3417
+ person.preferences = nil
3418
+ end
3419
+
3420
+ it "sets the relation to an empty array" do
3421
+ expect(person.preferences).to be_empty
3422
+ end
3423
+
3424
+ it "removes the foreign key values" do
3425
+ expect(person.preference_ids).to be_empty
3426
+ end
3427
+
3428
+ it "does not delete the target from the database" do
3429
+ expect {
3430
+ preference.reload
3431
+ }.not_to raise_error
3432
+ end
3433
+ end
3434
+
3435
+ context "when reloading the relation" do
3436
+
3437
+ let!(:person) do
3438
+ Person.create!
3439
+ end
3440
+
3441
+ let!(:preference_one) do
3442
+ Preference.create!(name: "one")
3443
+ end
3444
+
3445
+ let!(:preference_two) do
3446
+ Preference.create!(name: "two")
3447
+ end
3448
+
3449
+ before do
3450
+ person.preferences << preference_one
3451
+ end
3452
+
3453
+ context "when the relation references the same documents" do
3454
+
3455
+ before do
3456
+ Preference.collection.find({ _id: preference_one.id }).
3457
+ update_one({ "$set" => { name: "reloaded" }})
3458
+ end
3459
+
3460
+ let(:reloaded) do
3461
+ person.preferences(true)
3462
+ end
3463
+
3464
+ it "reloads the document from the database" do
3465
+ expect(reloaded.first.name).to eq("reloaded")
3466
+ end
3467
+ end
3468
+
3469
+ context "when the relation references different documents" do
3470
+
3471
+ before do
3472
+ person.preferences << preference_two
3473
+ end
3474
+
3475
+ let(:reloaded) do
3476
+ person.preferences(true)
3477
+ end
3478
+
3479
+ it "reloads the new document from the database" do
3480
+ expect(reloaded).to eq([ preference_one, preference_two ])
3481
+ end
3482
+ end
3483
+ end
3484
+
3485
+ context "when adding to a relation via a field setter" do
3486
+
3487
+ context "when the document is new" do
3488
+
3489
+ let!(:person) do
3490
+ Person.create!(preference_names: "one, two")
3491
+ end
3492
+
3493
+ let(:preference_one) do
3494
+ person.reload.preferences.first
3495
+ end
3496
+
3497
+ let(:preference_two) do
3498
+ person.reload.preferences.last
3499
+ end
3500
+
3501
+ it "persists the first preference" do
3502
+ expect(preference_one).to_not be_nil
3503
+ end
3504
+
3505
+ it "sets the first inverse" do
3506
+ expect(preference_one.people).to eq([ person ])
3507
+ end
3508
+
3509
+ it "persists the second preference" do
3510
+ expect(preference_two).to_not be_nil
3511
+ end
3512
+
3513
+ it "sets the second inverse keys" do
3514
+ expect(preference_two.people).to eq([ person ])
3515
+ end
3516
+ end
3517
+ end
3518
+
3519
+ context "when changing the order of existing ids" do
3520
+
3521
+ let(:person) do
3522
+ Person.new
3523
+ end
3524
+
3525
+ let(:preference_one) do
3526
+ Preference.create!(name: "one")
3527
+ end
3528
+
3529
+ let(:preference_two) do
3530
+ Preference.create!(name: "two")
3531
+ end
3532
+
3533
+ before do
3534
+ person.preference_ids = [ preference_one.id, preference_two.id ]
3535
+ person.save!
3536
+ end
3537
+
3538
+ context "and the order is changed" do
3539
+
3540
+ before do
3541
+ person.preference_ids = [ preference_two.id, preference_one.id ]
3542
+ person.save!
3543
+ end
3544
+
3545
+ let(:reloaded) do
3546
+ Person.find(person.id)
3547
+ end
3548
+
3549
+ it "persists the change in id order" do
3550
+ expect(reloaded.preference_ids).to eq(
3551
+ [ preference_two.id, preference_one.id ]
3552
+ )
3553
+ end
3554
+ end
3555
+
3556
+ context "and the order is changed and an element is added" do
3557
+
3558
+ let(:preference_three) do
3559
+ Preference.create!(name: "three")
3560
+ end
3561
+
3562
+ before do
3563
+ person.preference_ids =
3564
+ [ preference_two.id, preference_one.id, preference_three.id ]
3565
+ person.save!
3566
+ end
3567
+
3568
+ let(:reloaded) do
3569
+ Person.find(person.id)
3570
+ end
3571
+
3572
+ it "also persists the change in id order" do
3573
+ expect(reloaded.preference_ids).to eq(
3574
+ [ preference_two.id, preference_one.id, preference_three.id ]
3575
+ )
3576
+ end
3577
+ end
3578
+
3579
+ context "and the order is changed and an element is removed" do
3580
+
3581
+ let(:preference_three) do
3582
+ Preference.create!(name: "three")
3583
+ end
3584
+
3585
+ before do
3586
+ person.preference_ids =
3587
+ [ preference_one.id, preference_two.id, preference_three.id ]
3588
+ person.save!
3589
+ person.preference_ids =
3590
+ [ preference_three.id, preference_two.id ]
3591
+ person.save!
3592
+ end
3593
+
3594
+ let(:reloaded) do
3595
+ Person.find(person.id)
3596
+ end
3597
+
3598
+ it "also persists the change in id order" do
3599
+ expect(reloaded.preference_ids).to eq(
3600
+ [ preference_three.id, preference_two.id ]
3601
+ )
3602
+ end
3603
+ end
3604
+ end
3605
+
3606
+ context "when adding a document" do
3607
+
3608
+ let(:person) do
3609
+ Person.new
3610
+ end
3611
+
3612
+ let(:preference_one) do
3613
+ Preference.new
3614
+ end
3615
+
3616
+ let(:first_add) do
3617
+ person.preferences.push(preference_one)
3618
+ end
3619
+
3620
+ context "when chaining a second add" do
3621
+
3622
+ let(:preference_two) do
3623
+ Preference.new
3624
+ end
3625
+
3626
+ let(:result) do
3627
+ first_add.push(preference_two)
3628
+ end
3629
+
3630
+ it "adds both documents" do
3631
+ expect(result).to eq([ preference_one, preference_two ])
3632
+ end
3633
+ end
3634
+ end
3635
+
3636
+ context "when setting the relation via the foreign key" do
3637
+
3638
+ context "when the relation exists" do
3639
+
3640
+ let!(:person) do
3641
+ Person.create!
3642
+ end
3643
+
3644
+ let!(:pref_one) do
3645
+ person.preferences.create!
3646
+ end
3647
+
3648
+ let!(:pref_two) do
3649
+ Preference.create!
3650
+ end
3651
+
3652
+ before do
3653
+ person.preference_ids = [ pref_two.id ]
3654
+ end
3655
+
3656
+ it "sets the new documents on the relation" do
3657
+ expect(person.preferences).to eq([ pref_two ])
3658
+ end
3659
+ end
3660
+ end
3661
+
3662
+ context "when using a different primary key" do
3663
+
3664
+ let(:dog) do
3665
+ Dog.create!(name: 'Doggie')
3666
+ end
3667
+
3668
+ let(:cat) do
3669
+ Cat.create!(name: 'Kitty')
3670
+ end
3671
+
3672
+ let(:another_cat) do
3673
+ Cat.create!(name: 'Kitten')
3674
+ end
3675
+
3676
+ let(:fire_hydrant) do
3677
+ FireHydrant.create!(location: '221B Baker Street')
3678
+ end
3679
+
3680
+ context "when adding to a one-way many to many" do
3681
+
3682
+ before do
3683
+ fire_hydrant.cats.push(cat)
3684
+ end
3685
+
3686
+ it "adds the pk value to the fk set" do
3687
+ expect(fire_hydrant.cat_ids).to eq([cat.name])
3688
+ end
3689
+ end
3690
+
3691
+ context "when adding multiple documents to a one-way many to many" do
3692
+
3693
+ before do
3694
+ fire_hydrant.cats.push([cat, another_cat])
3695
+ end
3696
+
3697
+ it "adds the pk values to the fk set" do
3698
+ expect(fire_hydrant.cat_ids).to eq([cat.name, another_cat.name])
3699
+ end
3700
+ end
3701
+
3702
+ context "when adding a new document to a one-way many to many" do
3703
+
3704
+ before do
3705
+ fire_hydrant.cats.build name: 'Kitten'
3706
+ end
3707
+
3708
+ it "adds the pk values to the fk set" do
3709
+ expect(fire_hydrant.cat_ids).to eq(['Kitten'])
3710
+ end
3711
+ end
3712
+
3713
+ context "when adding to a two-way many to many" do
3714
+
3715
+ before do
3716
+ fire_hydrant.dogs.push(dog)
3717
+ end
3718
+
3719
+ it "adds the pk value to the fk set" do
3720
+ expect(fire_hydrant.dog_ids).to eq([dog.name])
3721
+ end
3722
+
3723
+ it "adds the base pk value to the inverse fk set" do
3724
+ expect(dog.fire_hydrant_ids).to eq([fire_hydrant.location])
3725
+ end
3726
+ end
3727
+
3728
+ context "when deleting from a two-way many to many" do
3729
+
3730
+ before do
3731
+ dog.fire_hydrants.push(fire_hydrant)
3732
+ fire_hydrant.dogs.delete(dog)
3733
+ end
3734
+
3735
+ it "removes the pk value from the fk set" do
3736
+ expect(fire_hydrant.dog_ids).to eq([])
3737
+ end
3738
+
3739
+ it "removes the base pk value from the inverse fk set" do
3740
+ expect(dog.fire_hydrant_ids).to eq([])
3741
+ end
3742
+ end
3743
+ end
3744
+
3745
+ context "HABTM" do
3746
+ before do
3747
+ class Project
3748
+ include Mongoid::Document
3749
+
3750
+ field :n, type: String, as: :name
3751
+
3752
+ has_and_belongs_to_many :distributors,
3753
+ foreign_key: :d_ids,
3754
+ inverse_of: 'p'
3755
+ end
3756
+
3757
+ class Distributor
3758
+ include Mongoid::Document
3759
+
3760
+ field :n, type: String, as: :name
3761
+
3762
+ has_and_belongs_to_many :projects,
3763
+ foreign_key: :p_ids,
3764
+ inverse_of: 'd'
3765
+ end
3766
+ end
3767
+
3768
+ it "should assign relation from both sides" do
3769
+ p1 = Project.create! name: 'Foo'
3770
+ p2 = Project.create! name: 'Bar'
3771
+ d1 = Distributor.create! name: 'Rock'
3772
+ d2 = Distributor.create! name: 'Soul'
3773
+
3774
+ p1.distributors << d1
3775
+ expect(p1.d_ids).to match_array([d1.id])
3776
+ expect(d1.p_ids).to match_array([p1.id])
3777
+ d2.projects << p2
3778
+ expect(d2.p_ids).to match_array([p2.id])
3779
+ expect(p2.d_ids).to match_array([d2.id])
3780
+ end
3781
+ end
3782
+
3783
+ context "when accesing own _id from parent's foreign key in default" do
3784
+ let!(:contract) { HabtmmContract.create! }
3785
+ let!(:signature) { contract.signatures.create! }
3786
+
3787
+ it "is nil" do
3788
+ expect(signature.favorite_signature).to be nil
3789
+ end
3790
+ end
3791
+
3792
+ context "when setting an association on a model that uses the class_name option" do
3793
+ let!(:contract) { HabtmmContract.create! }
3794
+ let!(:signature) { HabtmmSignature.create!(contracts: [contract]) }
3795
+
3796
+ it "populates the inverse foreign key" do
3797
+ expect(signature.contracts.first.signature_ids).to eq([signature.id])
3798
+ end
3799
+ end
3800
+
3801
+ context "when there is a foreign key in the aliased associations" do
3802
+ it "has the correct aliases" do
3803
+ expect(Dog.aliased_associations["breed_ids"]).to eq("breeds")
3804
+ expect(Breed.aliased_associations["dog_ids"]).to eq("dogs")
3805
+ end
3806
+ end
3807
+
3808
+ # This test is for MONGOID-5344 which tests that the initial call to
3809
+ # signature_ids refers to the same array as subsequent calls to signature_ids.
3810
+ # Prior to the change in that ticket, this test broke because the array
3811
+ # returned from write_attribute (which is triggered the first time the
3812
+ # foreign key array is referenced, to set the default), refers to a different
3813
+ # array to the one stored in the attributes hash. This happened because,
3814
+ # when retrieving a document from the database, the attributes hash is actually
3815
+ # a BSON::Document, which applies a transformation to the array before
3816
+ # storing it.
3817
+ context "when executing concat on foreign key array from the db" do
3818
+ config_override :legacy_attributes, false
3819
+
3820
+ before do
3821
+ HabtmmContract.create!
3822
+ HabtmmSignature.create!
3823
+ end
3824
+
3825
+ let!(:contract) { HabtmmContract.first }
3826
+ let!(:signature) { HabtmmSignature.first }
3827
+
3828
+ before do
3829
+ contract.signature_ids.concat([signature.id])
3830
+ end
3831
+
3832
+ it "works on the first attempt" do
3833
+ expect(contract.signature_ids).to eq([signature.id])
3834
+ end
3835
+ end
3836
+ end