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,4863 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative '../embeds_many_models.rb'
5
+
6
+ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
7
+
8
+ [ :<<, :push ].each do |method|
9
+
10
+ describe "##{method}" do
11
+
12
+ context "when the parent is a new record" do
13
+
14
+ let(:person) do
15
+ Person.new
16
+ end
17
+
18
+ let(:address) do
19
+ Address.new
20
+ end
21
+
22
+ let!(:added) do
23
+ person.addresses.send(method, address)
24
+ end
25
+
26
+ it "appends to the target" do
27
+ expect(person.addresses).to eq([ address ])
28
+ end
29
+
30
+ it "sets the base on the inverse relation" do
31
+ expect(address.addressable).to eq(person)
32
+ end
33
+
34
+ it "sets the same instance on the inverse relation" do
35
+ expect(address.addressable).to eql(person)
36
+ end
37
+
38
+ it "does not save the new document" do
39
+ expect(address).to_not be_persisted
40
+ end
41
+
42
+ it "sets the parent on the child" do
43
+ expect(address._parent).to eq(person)
44
+ end
45
+
46
+ it "sets the association metadata on the child" do
47
+ expect(address._association).to_not be_nil
48
+ end
49
+
50
+ it "sets the index on the child" do
51
+ expect(address._index).to eq(0)
52
+ end
53
+
54
+ it "returns the relation" do
55
+ expect(added).to eq(person.addresses)
56
+ end
57
+
58
+ context 'when the child is already related to the parent' do
59
+
60
+ let(:message) do
61
+ Message.new(person: person)
62
+ end
63
+
64
+ before do
65
+ person.messages << message
66
+ end
67
+
68
+ it "appends only once to the target" do
69
+ expect(person.messages).to eq([ message ])
70
+ end
71
+ end
72
+
73
+ context "with a limiting default scope" do
74
+
75
+ context "when the document matches the scope" do
76
+
77
+ let(:active) do
78
+ Appointment.new
79
+ end
80
+
81
+ before do
82
+ person.appointments.send(method, active)
83
+ end
84
+
85
+ it "appends to the target" do
86
+ expect(person.appointments._target).to eq([ active ])
87
+ end
88
+
89
+ it "appends to the _unscoped" do
90
+ expect(person.appointments.send(:_unscoped)).to eq([ active ])
91
+ end
92
+ end
93
+
94
+ context "when the document does not match the scope" do
95
+
96
+ let(:inactive) do
97
+ Appointment.new(active: false)
98
+ end
99
+
100
+ before do
101
+ person.appointments.send(method, inactive)
102
+ end
103
+
104
+ it "doesn't append to the target" do
105
+ expect(person.appointments._target).to_not eq([ inactive ])
106
+ end
107
+
108
+ it "appends to the _unscoped" do
109
+ expect(person.appointments.send(:_unscoped)).to eq([ inactive ])
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ context "when the parent is not a new record" do
116
+
117
+ let(:person) do
118
+ Person.create!
119
+ end
120
+
121
+ let(:address) do
122
+ Address.new
123
+ end
124
+
125
+ before do
126
+ person.addresses.send(method, address)
127
+ end
128
+
129
+ it "saves the new document" do
130
+ expect(address).to be_persisted
131
+ end
132
+ end
133
+
134
+ context "when appending more than one document at once" do
135
+
136
+ let(:person) do
137
+ Person.create!
138
+ end
139
+
140
+ let(:address_one) do
141
+ Address.new
142
+ end
143
+
144
+ let(:address_two) do
145
+ Address.new
146
+ end
147
+
148
+ let!(:added) do
149
+ person.addresses.send(method, [ address_one, address_two ])
150
+ end
151
+
152
+ it "saves the first document" do
153
+ expect(address_one).to be_persisted
154
+ end
155
+
156
+ it "saves the second document" do
157
+ expect(address_two).to be_persisted
158
+ end
159
+
160
+ it "returns the relation" do
161
+ expect(added).to eq(person.addresses)
162
+ end
163
+ end
164
+
165
+ context "when the parent and child have a cyclic relation" do
166
+
167
+ context "when the parent is a new record" do
168
+
169
+ let(:parent_role) do
170
+ Role.new
171
+ end
172
+
173
+ let(:child_role) do
174
+ Role.new
175
+ end
176
+
177
+ before do
178
+ parent_role.child_roles.send(method, child_role)
179
+ end
180
+
181
+ it "appends to the target" do
182
+ expect(parent_role.child_roles).to eq([ child_role ])
183
+ end
184
+
185
+ it "sets the base on the inverse relation" do
186
+ expect(child_role.parent_role).to eq(parent_role)
187
+ end
188
+
189
+ it "sets the same instance on the inverse relation" do
190
+ expect(child_role.parent_role).to eql(parent_role)
191
+ end
192
+
193
+ it "does not save the new document" do
194
+ expect(child_role).to_not be_persisted
195
+ end
196
+
197
+ it "sets the parent on the child" do
198
+ expect(child_role._parent).to eq(parent_role)
199
+ end
200
+
201
+ it "sets the association metadata on the child" do
202
+ expect(child_role._association).to_not be_nil
203
+ end
204
+
205
+ it "sets the index on the child" do
206
+ expect(child_role._index).to eq(0)
207
+ end
208
+ end
209
+
210
+ context "when the parent is not a new record" do
211
+
212
+ let(:parent_role) do
213
+ Role.create!(name: "CEO")
214
+ end
215
+
216
+ let(:child_role) do
217
+ Role.new(name: "COO")
218
+ end
219
+
220
+ before do
221
+ parent_role.child_roles.send(method, child_role)
222
+ end
223
+
224
+ it "saves the new document" do
225
+ expect(child_role).to be_persisted
226
+ end
227
+ end
228
+ end
229
+
230
+ context "when the child has one sided many to many relation" do
231
+ let(:person) do
232
+ Person.create!
233
+ end
234
+
235
+ let(:message) do
236
+ Message.new
237
+ end
238
+
239
+ context "assign parent first" do
240
+ before do
241
+ message.person = person
242
+ message.receivers.send(method, person)
243
+ end
244
+
245
+ it "appends to the relation array" do
246
+ expect(message.receivers).to include(person)
247
+ end
248
+ end
249
+
250
+ context "not assign parent" do
251
+ before do
252
+ message.receivers.send(method, person)
253
+ end
254
+
255
+ it "appends to the relation array" do
256
+ expect(message.receivers).to include(person)
257
+ end
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ describe "#=" do
264
+
265
+ context "when the parent is a new record" do
266
+
267
+ let(:person) do
268
+ Person.new
269
+ end
270
+
271
+ let(:address) do
272
+ Address.new
273
+ end
274
+
275
+ before do
276
+ person.addresses = [ address ]
277
+ end
278
+
279
+ it "sets the target of the relation" do
280
+ expect(person.addresses).to eq([ address ])
281
+ end
282
+
283
+ it "sets the _unscoped of the relation" do
284
+ expect(person.addresses.send(:_unscoped)).to eq([ address ])
285
+ end
286
+
287
+ it "sets the base on the inverse relation" do
288
+ expect(address.addressable).to eq(person)
289
+ end
290
+
291
+ it "sets the same instance on the inverse relation" do
292
+ expect(address.addressable).to eql(person)
293
+ end
294
+
295
+ it "does not save the target" do
296
+ expect(address).to_not be_persisted
297
+ end
298
+
299
+ it "sets the parent on the child" do
300
+ expect(address._parent).to eq(person)
301
+ end
302
+
303
+ it "sets the association metadata on the child" do
304
+ expect(address._association).to_not be_nil
305
+ end
306
+
307
+ it "sets the index on the child" do
308
+ expect(address._index).to eq(0)
309
+ end
310
+ end
311
+
312
+ context "when the parent is not a new record" do
313
+
314
+ let(:person) do
315
+ Person.create!
316
+ end
317
+
318
+ let(:address) do
319
+ Address.new
320
+ end
321
+
322
+ context "when setting directly" do
323
+
324
+ before do
325
+ person.addresses = [ address ]
326
+ end
327
+
328
+ it "saves the target" do
329
+ expect(address).to be_persisted
330
+ end
331
+ end
332
+
333
+ context "when setting via an overridden method from the parent" do
334
+
335
+ let!(:person) do
336
+ Person.create!
337
+ end
338
+
339
+ let!(:address) do
340
+ person.addresses.create!(street: "Alt Treptow")
341
+ end
342
+
343
+ let!(:new_address) do
344
+ Address.new(street: "Tempelhofer Damm")
345
+ end
346
+
347
+ before do
348
+ person.update_attributes!(set_addresses: [ new_address ])
349
+ end
350
+
351
+ it "overwrites the existing addresses" do
352
+ expect(person.reload.addresses).to eq([ new_address ])
353
+ end
354
+ end
355
+
356
+ context "when setting via the parent attributes" do
357
+
358
+ before do
359
+ person.attributes = { addresses: [ address ] }
360
+ end
361
+
362
+ it "sets the relation" do
363
+ expect(person.addresses).to eq([ address ])
364
+ end
365
+
366
+ it "does not save the target" do
367
+ expect(address).to_not be_persisted
368
+ end
369
+
370
+ context "when setting the relation multiple times" do
371
+
372
+ let(:address_two) do
373
+ Address.new(street: "kudamm")
374
+ end
375
+
376
+ before do
377
+ person.addresses = [ address_two ]
378
+ person.save!
379
+ end
380
+
381
+ it "sets the new documents" do
382
+ expect(person.addresses).to eq([ address_two ])
383
+ end
384
+
385
+ it "persits only the new documents" do
386
+ expect(person.reload.addresses).to eq([ address_two ])
387
+ end
388
+ end
389
+ end
390
+ end
391
+
392
+ context "when setting for inherited docs" do
393
+
394
+ context "when the parent collection is already accessed" do
395
+
396
+ before do
397
+ Person.collection
398
+ end
399
+
400
+ context "when setting via the subclass" do
401
+
402
+ let(:doctor) do
403
+ Doctor.new
404
+ end
405
+
406
+ let(:address_one) do
407
+ Address.new(street: "tauentzien")
408
+ end
409
+
410
+ before do
411
+ doctor.addresses = [ address_one ]
412
+ doctor.save!
413
+ end
414
+
415
+ it "sets the documents" do
416
+ expect(doctor.addresses).to eq([ address_one ])
417
+ end
418
+
419
+ it "persists the document" do
420
+ expect(doctor.reload.addresses).to eq([ address_one ])
421
+ end
422
+
423
+ context "when setting the relation multiple times" do
424
+
425
+ let(:address_two) do
426
+ Address.new(street: "kudamm")
427
+ end
428
+
429
+ before do
430
+ doctor.addresses = [ address_two ]
431
+ doctor.save!
432
+ end
433
+
434
+ it "sets the new documents" do
435
+ expect(doctor.addresses).to eq([ address_two ])
436
+ end
437
+
438
+ it "persits only the new documents" do
439
+ expect(doctor.reload.addresses).to eq([ address_two ])
440
+ end
441
+ end
442
+ end
443
+ end
444
+ end
445
+
446
+ context "when replacing an existing relation" do
447
+
448
+ let(:person) do
449
+ Person.create!(addresses: addresses)
450
+ end
451
+
452
+ let(:addresses) do
453
+ [
454
+ Address.new(street: "1st St"),
455
+ Address.new(street: "2nd St")
456
+ ]
457
+ end
458
+
459
+ let(:address) do
460
+ Address.new(street: "3rd St")
461
+ end
462
+
463
+ context "when the replaced relation is different from the existing relation" do
464
+
465
+ before do
466
+ person.addresses = [ address ]
467
+ end
468
+
469
+ it "deletes the old documents" do
470
+ expect(person.reload.addresses).to eq([ address ])
471
+ end
472
+ end
473
+
474
+ context "when the replaced relation is identical to the existing relation" do
475
+
476
+ before do
477
+ person.addresses = addresses
478
+ end
479
+
480
+ it "does nothing" do
481
+ expect(person.reload.addresses).to eq(addresses)
482
+ end
483
+ end
484
+ end
485
+
486
+ context "when the relation has an unusual name" do
487
+
488
+ module MyCompany
489
+ module Model
490
+ class TrackingId
491
+ include Mongoid::Document
492
+ include Mongoid::Timestamps
493
+ store_in collection: "tracking_ids"
494
+ embeds_many \
495
+ :validation_history,
496
+ class_name: "MyCompany::Model::TrackingIdValidationHistory"
497
+ end
498
+
499
+ class TrackingIdValidationHistory
500
+ include Mongoid::Document
501
+ field :old_state, type: String
502
+ field :new_state, type: String
503
+ field :when_changed, type: DateTime
504
+ embedded_in :tracking_id, class_name: "MyCompany::Model::TrackingId"
505
+ end
506
+ end
507
+ end
508
+
509
+ let(:tracking_id) do
510
+ MyCompany::Model::TrackingId.create!
511
+ end
512
+
513
+ let(:history) do
514
+ MyCompany::Model::TrackingIdValidationHistory.new(old_state: "Test")
515
+ end
516
+
517
+ before do
518
+ tracking_id.validation_history << history
519
+ end
520
+
521
+ it "allows creation of the embedded document" do
522
+ expect(tracking_id.validation_history.size).to eq(1)
523
+ end
524
+
525
+ it "saves the relation" do
526
+ expect(history).to be_persisted
527
+ end
528
+
529
+ it "remains on reload" do
530
+ expect(tracking_id.reload.validation_history.size).to eq(1)
531
+ end
532
+ end
533
+
534
+ context "when the relation has address in the name" do
535
+
536
+ let(:slave) do
537
+ Slave.new(first_name: "Test")
538
+ end
539
+
540
+ before do
541
+ ActiveSupport::Inflector.inflections do |inflect|
542
+ inflect.singular("address_numbers", "address_number")
543
+ end
544
+ slave.address_numbers << AddressNumber.new(country_code: 1)
545
+ slave.save!
546
+ end
547
+
548
+ it "requires an inflection to determine the class" do
549
+ expect(slave.reload.address_numbers.size).to eq(1)
550
+ end
551
+ end
552
+
553
+ context "when setting the entire tree via a hash" do
554
+
555
+ let(:person) do
556
+ Person.create!
557
+ end
558
+
559
+ let!(:address_one) do
560
+ person.addresses.create!(street: "Tauentzienstr")
561
+ end
562
+
563
+ let!(:address_two) do
564
+ person.addresses.create!(street: "Kudamm")
565
+ end
566
+
567
+ let(:attributes) do
568
+ person.as_document.dup
569
+ end
570
+
571
+ context "when the attributes have changed" do
572
+
573
+ before do
574
+ attributes["addresses"][0]["city"] = "Berlin"
575
+ person.update_attributes!(attributes)
576
+ end
577
+
578
+ it "sets the new attributes" do
579
+ expect(person.addresses.first.city).to eq("Berlin")
580
+ end
581
+
582
+ it "persists the changes" do
583
+ expect(person.reload.addresses.first.city).to eq("Berlin")
584
+ end
585
+ end
586
+ end
587
+
588
+ context "when setting an embedded sub-document tree via a hash" do
589
+
590
+ let(:person) do
591
+ Person.create!
592
+ end
593
+
594
+ let!(:address_one) do
595
+ person.addresses.create!(street: "Tauentzienstr")
596
+ end
597
+
598
+ let!(:location_one) do
599
+ person.addresses.first.locations.create!(name: "Work")
600
+ end
601
+
602
+ let(:attributes) do
603
+ person.addresses.first.as_document.dup
604
+ end
605
+
606
+ context "when the attributes have changed" do
607
+
608
+ before do
609
+ attributes["city"] = "Berlin"
610
+ attributes["locations"][0]["name"] = "Home"
611
+ person.addresses.first.update_attributes!(attributes)
612
+ end
613
+
614
+ it "sets the new attributes on the address" do
615
+ expect(person.addresses.first.city).to eq("Berlin")
616
+ end
617
+
618
+ it "sets the new attributes on the location" do
619
+ expect(person.addresses.first.locations.first.name).to eq("Home")
620
+ end
621
+
622
+ it "persists the changes to the address" do
623
+ expect(person.reload.addresses.first.city).to eq("Berlin")
624
+ end
625
+
626
+ it "persists the changes to the location" do
627
+ expect(person.reload.addresses.first.locations.first.name).to eq("Home")
628
+ end
629
+
630
+ it "does not persist the locations collection to the person document" do
631
+ expect(person.reload[:locations]).to be_nil
632
+ end
633
+ end
634
+ end
635
+
636
+ context "when the parent and child have a cyclic relation" do
637
+
638
+ context "when the parent is a new record" do
639
+
640
+ let(:parent_role) do
641
+ Role.new
642
+ end
643
+
644
+ let(:child_role) do
645
+ Role.new
646
+ end
647
+
648
+ before do
649
+ parent_role.child_roles = [ child_role ]
650
+ end
651
+
652
+ it "sets the target of the relation" do
653
+ expect(parent_role.child_roles).to eq([ child_role ])
654
+ end
655
+
656
+ it "sets the base on the inverse relation" do
657
+ expect(child_role.parent_role).to eq(parent_role)
658
+ end
659
+
660
+ it "sets the same instance on the inverse relation" do
661
+ expect(child_role.parent_role).to eql(parent_role)
662
+ end
663
+
664
+ it "does not save the target" do
665
+ expect(child_role).to_not be_persisted
666
+ end
667
+
668
+ it "sets the parent on the child" do
669
+ expect(child_role._parent).to eq(parent_role)
670
+ end
671
+
672
+ it "sets the association metadata on the child" do
673
+ expect(child_role._association).to_not be_nil
674
+ end
675
+
676
+ it "sets the index on the child" do
677
+ expect(child_role._index).to eq(0)
678
+ end
679
+ end
680
+
681
+ context "when the parent is not a new record" do
682
+
683
+ let(:parent_role) do
684
+ Role.create!(name: "CTO")
685
+ end
686
+
687
+ let(:child_role) do
688
+ Role.new
689
+ end
690
+
691
+ before do
692
+ parent_role.child_roles = [ child_role ]
693
+ end
694
+
695
+ it "saves the target" do
696
+ expect(child_role).to be_persisted
697
+ end
698
+ end
699
+ end
700
+ end
701
+
702
+ describe "#= nil" do
703
+
704
+ context "when the relationship is polymorphic" do
705
+
706
+ context "when the parent is a new record" do
707
+
708
+ let(:person) do
709
+ Person.new
710
+ end
711
+
712
+ let(:address) do
713
+ Address.new
714
+ end
715
+
716
+ before do
717
+ person.addresses = [ address ]
718
+ person.addresses = nil
719
+ end
720
+
721
+ it "sets the relation to empty" do
722
+ expect(person.addresses).to be_empty
723
+ end
724
+
725
+ it "sets the unscoped to empty" do
726
+ expect(person.addresses.send(:_unscoped)).to be_empty
727
+ end
728
+
729
+ it "removes the inverse relation" do
730
+ expect(address.addressable).to be_nil
731
+ end
732
+ end
733
+
734
+ context "when the inverse is already nil" do
735
+
736
+ let(:person) do
737
+ Person.new
738
+ end
739
+
740
+ before do
741
+ person.addresses = nil
742
+ end
743
+
744
+ it "sets the relation to empty" do
745
+ expect(person.addresses).to be_empty
746
+ end
747
+ end
748
+
749
+ context "when the parent is persisted" do
750
+
751
+ let(:person) do
752
+ Person.create!
753
+ end
754
+
755
+ let(:address) do
756
+ Address.new
757
+ end
758
+
759
+ context "when setting directly" do
760
+
761
+ before do
762
+ person.addresses = [ address ]
763
+ person.addresses = nil
764
+ end
765
+
766
+ it "sets the relation to empty" do
767
+ expect(person.addresses).to be_empty
768
+ end
769
+
770
+ it "sets the relation to empty in the database" do
771
+ expect(person.reload.addresses).to be_empty
772
+ end
773
+
774
+ it "removed the inverse relation" do
775
+ expect(address.addressable).to be_nil
776
+ end
777
+
778
+ it "deletes the child document" do
779
+ expect(address).to be_destroyed
780
+ end
781
+ end
782
+
783
+ context "when setting via attributes" do
784
+
785
+ before do
786
+ person.addresses = [ address ]
787
+ person.attributes = { addresses: nil }
788
+ end
789
+
790
+ it "sets the relation to empty" do
791
+ expect(person.addresses).to be_empty
792
+ end
793
+
794
+ it "deletes the child document" do
795
+ expect(address).to be_destroyed
796
+ end
797
+
798
+ context "when saving the parent" do
799
+
800
+ before do
801
+ person.save!
802
+ person.reload
803
+ end
804
+
805
+ it "persists the deletion" do
806
+ expect(person.addresses).to be_empty
807
+ end
808
+ end
809
+ end
810
+ end
811
+
812
+ context "when setting on a reload" do
813
+
814
+ let(:person) do
815
+ Person.create!
816
+ end
817
+
818
+ let(:address) do
819
+ Address.new
820
+ end
821
+
822
+ let(:reloaded) do
823
+ person.reload
824
+ end
825
+
826
+ before do
827
+ person.reload.addresses = [ address ]
828
+ person.reload.addresses = nil
829
+ end
830
+
831
+ it "sets the relation to empty" do
832
+ expect(person.addresses).to be_empty
833
+ end
834
+
835
+ it "sets the relation to empty in the database" do
836
+ expect(reloaded.addresses).to be_empty
837
+ end
838
+ end
839
+ end
840
+
841
+ context "when the relationship is cyclic" do
842
+
843
+ context "when the parent is a new record" do
844
+
845
+ let(:parent_role) do
846
+ Role.new
847
+ end
848
+
849
+ let(:child_role) do
850
+ Role.new
851
+ end
852
+
853
+ before do
854
+ parent_role.child_roles = [ child_role ]
855
+ parent_role.child_roles = nil
856
+ end
857
+
858
+ it "sets the relation to empty" do
859
+ expect(parent_role.child_roles).to be_empty
860
+ end
861
+
862
+ it "removes the inverse relation" do
863
+ expect(child_role.parent_role).to be_nil
864
+ end
865
+ end
866
+
867
+ context "when the inverse is already nil" do
868
+
869
+ let(:parent_role) do
870
+ Role.new
871
+ end
872
+
873
+ before do
874
+ parent_role.child_roles = nil
875
+ end
876
+
877
+ it "sets the relation to empty" do
878
+ expect(parent_role.child_roles).to be_empty
879
+ end
880
+ end
881
+
882
+ context "when the documents are not new records" do
883
+
884
+ let(:parent_role) do
885
+ Role.create!
886
+ end
887
+
888
+ let(:child_role) do
889
+ Role.new
890
+ end
891
+
892
+ before do
893
+ parent_role.child_roles = [ child_role ]
894
+ parent_role.child_roles = nil
895
+ end
896
+
897
+ it "sets the relation to empty" do
898
+ expect(parent_role.child_roles).to be_empty
899
+ end
900
+
901
+ it "removed the inverse relation" do
902
+ expect(child_role.parent_role).to be_nil
903
+ end
904
+
905
+ it "deletes the child document" do
906
+ expect(child_role).to be_destroyed
907
+ end
908
+ end
909
+ end
910
+ end
911
+
912
+ describe "#as_document" do
913
+
914
+ let!(:person) do
915
+ Person.create!
916
+ end
917
+
918
+ context 'when a string is used to access an attribute' do
919
+
920
+ let!(:address) do
921
+ person.addresses.create!(street: "one")
922
+ end
923
+
924
+ let(:document) do
925
+ person.reload.addresses.as_document.first
926
+ end
927
+
928
+ it "returns the attribute value" do
929
+ expect(document['street']).to eq('one')
930
+ end
931
+ end
932
+
933
+ context 'when a symbol is used to access an attribute' do
934
+
935
+ let!(:address) do
936
+ person.addresses.create!(street: "one")
937
+ end
938
+
939
+ let(:document) do
940
+ person.reload.addresses.as_document.first
941
+ end
942
+
943
+ it "returns the attribute value" do
944
+ expect(document[:street]).to eq('one')
945
+ end
946
+ end
947
+
948
+ context "when the relation has no default scope" do
949
+
950
+ let!(:address) do
951
+ person.addresses.create!(street: "one")
952
+ end
953
+
954
+ let(:document) do
955
+ person.reload.addresses.as_document
956
+ end
957
+
958
+ it "returns the documents as an array of hashes" do
959
+ expect(document).to eq([ address.as_document ])
960
+ end
961
+ end
962
+
963
+ context "when the relation has a default scope" do
964
+
965
+ context "when the default scope sorts" do
966
+
967
+ let(:cough) do
968
+ Symptom.new(name: "cough")
969
+ end
970
+
971
+ let(:headache) do
972
+ Symptom.new(name: "headache")
973
+ end
974
+
975
+ before do
976
+ person.symptoms.concat([ headache, cough ])
977
+ end
978
+
979
+ let(:document) do
980
+ person.reload.symptoms.as_document
981
+ end
982
+
983
+ it "returns the unscoped documents as an array of hashes" do
984
+ expect(document).to eq([ headache.as_document, cough.as_document ])
985
+ end
986
+ end
987
+
988
+ context "when the default scope limits" do
989
+
990
+ let(:active) do
991
+ Appointment.new
992
+ end
993
+
994
+ let(:inactive) do
995
+ Appointment.new(active: false)
996
+ end
997
+
998
+ before do
999
+ person.appointments.concat([ active, inactive ])
1000
+ end
1001
+
1002
+ let(:document) do
1003
+ person.reload.appointments.as_document
1004
+ end
1005
+
1006
+ it "returns the unscoped documents as an array of hashes" do
1007
+ expect(document).to eq([ active.as_document, inactive.as_document ])
1008
+ end
1009
+ end
1010
+ end
1011
+ end
1012
+
1013
+ [ :build, :new ].each do |method|
1014
+
1015
+ describe "#build" do
1016
+
1017
+ context "when the relation is not cyclic" do
1018
+
1019
+ let(:person) do
1020
+ Person.new
1021
+ end
1022
+
1023
+ let(:address) do
1024
+ person.addresses.send(method, street: "Bond") do |address|
1025
+ address.state = "CA"
1026
+ end
1027
+ end
1028
+
1029
+ it "appends to the target" do
1030
+ expect(person.addresses).to eq([ address ])
1031
+ end
1032
+
1033
+ it "appends to the unscoped" do
1034
+ expect(person.addresses.send(:_unscoped)).to eq([ address ])
1035
+ end
1036
+
1037
+ it "sets the base on the inverse relation" do
1038
+ expect(address.addressable).to eq(person)
1039
+ end
1040
+
1041
+ it "does not save the new document" do
1042
+ expect(address).to_not be_persisted
1043
+ end
1044
+
1045
+ it "sets the parent on the child" do
1046
+ expect(address._parent).to eq(person)
1047
+ end
1048
+
1049
+ it "sets the association metadata on the child" do
1050
+ expect(address._association).to_not be_nil
1051
+ end
1052
+
1053
+ it "sets the index on the child" do
1054
+ expect(address._index).to eq(0)
1055
+ end
1056
+
1057
+ it "writes to the attributes" do
1058
+ expect(address.street).to eq("Bond")
1059
+ end
1060
+
1061
+ it "calls the passed block" do
1062
+ expect(address.state).to eq("CA")
1063
+ end
1064
+ end
1065
+
1066
+ context "when the relation is cyclic" do
1067
+
1068
+ let(:parent_role) do
1069
+ Role.new
1070
+ end
1071
+
1072
+ let(:child_role) do
1073
+ parent_role.child_roles.send(method, name: "CTO")
1074
+ end
1075
+
1076
+ it "appends to the target" do
1077
+ expect(parent_role.child_roles).to eq([ child_role ])
1078
+ end
1079
+
1080
+ it "sets the base on the inverse relation" do
1081
+ expect(child_role.parent_role).to eq(parent_role)
1082
+ end
1083
+
1084
+ it "does not save the new document" do
1085
+ expect(child_role).to_not be_persisted
1086
+ end
1087
+
1088
+ it "sets the parent on the child" do
1089
+ expect(child_role._parent).to eq(parent_role)
1090
+ end
1091
+
1092
+ it "sets the association metadata on the child" do
1093
+ expect(child_role._association).to_not be_nil
1094
+ end
1095
+
1096
+ it "sets the index on the child" do
1097
+ expect(child_role._index).to eq(0)
1098
+ end
1099
+
1100
+ it "writes to the attributes" do
1101
+ expect(child_role.name).to eq("CTO")
1102
+ end
1103
+ end
1104
+
1105
+ context "when providing nested attributes" do
1106
+
1107
+ let(:person) do
1108
+ Person.create!
1109
+ end
1110
+
1111
+ let(:address) do
1112
+ person.addresses.send(
1113
+ method,
1114
+ street: "Bond",
1115
+ locations_attributes: { "1" => { "name" => "Home" } }
1116
+ )
1117
+ end
1118
+
1119
+ context "when followed by a save" do
1120
+
1121
+ before do
1122
+ address.save!
1123
+ end
1124
+
1125
+ let(:location) do
1126
+ person.reload.addresses.first.locations.first
1127
+ end
1128
+
1129
+ it "persists the deeply embedded document" do
1130
+ expect(location.name).to eq("Home")
1131
+ end
1132
+ end
1133
+ end
1134
+ end
1135
+ end
1136
+
1137
+ describe "#clear" do
1138
+
1139
+ context "when the parent has been persisted" do
1140
+
1141
+ let(:person) do
1142
+ Person.create!
1143
+ end
1144
+
1145
+ context "when the children are persisted" do
1146
+
1147
+ let!(:address) do
1148
+ person.addresses.create!(street: "High St")
1149
+ end
1150
+
1151
+ let!(:relation) do
1152
+ person.addresses.clear
1153
+ end
1154
+
1155
+ it "clears out the relation" do
1156
+ expect(person.addresses).to be_empty
1157
+ end
1158
+
1159
+ it "clears the unscoped" do
1160
+ expect(person.addresses.send(:_unscoped)).to be_empty
1161
+ end
1162
+
1163
+ it "marks the documents as deleted" do
1164
+ expect(address).to be_destroyed
1165
+ end
1166
+
1167
+ it "deletes the documents from the db" do
1168
+ expect(person.reload.addresses).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!(:address) do
1179
+ person.addresses.build(street: "High St")
1180
+ end
1181
+
1182
+ let!(:relation) do
1183
+ person.addresses.clear
1184
+ end
1185
+
1186
+ it "clears out the relation" do
1187
+ expect(person.addresses).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!(:address) do
1199
+ person.addresses.build(street: "High St")
1200
+ end
1201
+
1202
+ let!(:relation) do
1203
+ person.addresses.clear
1204
+ end
1205
+
1206
+ it "clears out the relation" do
1207
+ expect(person.addresses).to be_empty
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ describe "#concat" do
1213
+
1214
+ context "when the parent is a new record" do
1215
+
1216
+ let(:person) do
1217
+ Person.new
1218
+ end
1219
+
1220
+ let(:address) do
1221
+ Address.new
1222
+ end
1223
+
1224
+ before do
1225
+ person.addresses.concat([ address ])
1226
+ end
1227
+
1228
+ it "appends to the target" do
1229
+ expect(person.addresses).to eq([ address ])
1230
+ end
1231
+
1232
+ it "appends to the unscoped" do
1233
+ expect(person.addresses.send(:_unscoped)).to eq([ address ])
1234
+ end
1235
+
1236
+ it "sets the base on the inverse relation" do
1237
+ expect(address.addressable).to eq(person)
1238
+ end
1239
+
1240
+ it "sets the same instance on the inverse relation" do
1241
+ expect(address.addressable).to eql(person)
1242
+ end
1243
+
1244
+ it "does not save the new document" do
1245
+ expect(address).to_not be_persisted
1246
+ end
1247
+
1248
+ it "sets the parent on the child" do
1249
+ expect(address._parent).to eq(person)
1250
+ end
1251
+
1252
+ it "sets the association metadata on the child" do
1253
+ expect(address._association).to_not be_nil
1254
+ end
1255
+
1256
+ it "sets the index on the child" do
1257
+ expect(address._index).to eq(0)
1258
+ end
1259
+ end
1260
+
1261
+ context "when the parent is not a new record" do
1262
+
1263
+ let(:person) do
1264
+ Person.create!
1265
+ end
1266
+
1267
+ let(:address) do
1268
+ Address.new
1269
+ end
1270
+
1271
+ before do
1272
+ person.addresses.concat([ address ])
1273
+ end
1274
+
1275
+ it "saves the new document" do
1276
+ expect(address).to be_persisted
1277
+ end
1278
+ end
1279
+
1280
+ context "when concatenating an empty array" do
1281
+
1282
+ let(:person) do
1283
+ Person.create!
1284
+ end
1285
+
1286
+ before do
1287
+ expect(person.addresses).to_not receive(:batch_insert)
1288
+ person.addresses.concat([])
1289
+ end
1290
+
1291
+ it "doesn't update the target" do
1292
+ expect(person.addresses).to be_empty
1293
+ end
1294
+ end
1295
+
1296
+ context "when appending more than one document at once" do
1297
+
1298
+ let(:person) do
1299
+ Person.create!
1300
+ end
1301
+
1302
+ let(:address_one) do
1303
+ Address.new
1304
+ end
1305
+
1306
+ let(:address_two) do
1307
+ Address.new
1308
+ end
1309
+
1310
+ before do
1311
+ person.addresses.concat([ address_one, address_two ])
1312
+ end
1313
+
1314
+ it "saves the first document" do
1315
+ expect(address_one).to be_persisted
1316
+ end
1317
+
1318
+ it "saves the second document" do
1319
+ expect(address_two).to be_persisted
1320
+ end
1321
+ end
1322
+
1323
+ context "when the parent and child have a cyclic relation" do
1324
+
1325
+ context "when the parent is a new record" do
1326
+
1327
+ let(:parent_role) do
1328
+ Role.new
1329
+ end
1330
+
1331
+ let(:child_role) do
1332
+ Role.new
1333
+ end
1334
+
1335
+ before do
1336
+ parent_role.child_roles.concat([ child_role ])
1337
+ end
1338
+
1339
+ it "appends to the target" do
1340
+ expect(parent_role.child_roles).to eq([ child_role ])
1341
+ end
1342
+
1343
+ it "sets the base on the inverse relation" do
1344
+ expect(child_role.parent_role).to eq(parent_role)
1345
+ end
1346
+
1347
+ it "sets the same instance on the inverse relation" do
1348
+ expect(child_role.parent_role).to eql(parent_role)
1349
+ end
1350
+
1351
+ it "does not save the new document" do
1352
+ expect(child_role).to_not be_persisted
1353
+ end
1354
+
1355
+ it "sets the parent on the child" do
1356
+ expect(child_role._parent).to eq(parent_role)
1357
+ end
1358
+
1359
+ it "sets the association metadata on the child" do
1360
+ expect(child_role._association).to_not be_nil
1361
+ end
1362
+
1363
+ it "sets the index on the child" do
1364
+ expect(child_role._index).to eq(0)
1365
+ end
1366
+ end
1367
+
1368
+ context "when the parent is not a new record" do
1369
+
1370
+ let(:parent_role) do
1371
+ Role.create!(name: "CEO")
1372
+ end
1373
+
1374
+ let(:child_role) do
1375
+ Role.new(name: "COO")
1376
+ end
1377
+
1378
+ before do
1379
+ parent_role.child_roles.concat([ child_role ])
1380
+ end
1381
+
1382
+ it "saves the new document" do
1383
+ expect(child_role).to be_persisted
1384
+ end
1385
+ end
1386
+ end
1387
+ end
1388
+
1389
+ describe "#count" do
1390
+
1391
+ let(:person) do
1392
+ Person.create!
1393
+ end
1394
+
1395
+ before do
1396
+ person.addresses.create!(street: "Upper")
1397
+ person.addresses.build(street: "Bond")
1398
+ person.addresses.build(street: "Lower")
1399
+ end
1400
+
1401
+ it "returns the number of persisted documents" do
1402
+ expect(person.addresses.count).to eq(1)
1403
+ end
1404
+
1405
+ context 'block form' do
1406
+ it "iterates across all documents" do
1407
+ expect(person.addresses.count {|a| a.persisted? }).to eq(1)
1408
+ expect(person.addresses.count {|a| !a.persisted? }).to eq(2)
1409
+ expect(person.addresses.count {|a| a.street.include?('on') }).to eq(1)
1410
+ expect(person.addresses.count {|a| a.street.ends_with?('er') }).to eq(2)
1411
+ end
1412
+ end
1413
+
1414
+ context 'argument form' do
1415
+ it "behaves correctly when given a model instance" do
1416
+ expect(person.addresses.count(person.addresses.first)).to eq(1)
1417
+ end
1418
+
1419
+ it "behaves correctly when given a non-model instance" do
1420
+ expect(person.addresses.count(1)).to eq(0)
1421
+ end
1422
+ end
1423
+ end
1424
+
1425
+ describe "#any?" do
1426
+
1427
+ let(:person) do
1428
+ Person.create!
1429
+ end
1430
+
1431
+ context "when documents are persisted" do
1432
+ before do
1433
+ person.addresses.create!(street: "Upper")
1434
+ end
1435
+
1436
+ it "returns true" do
1437
+ expect(person.addresses.any?).to be true
1438
+ end
1439
+
1440
+ it "block form iterates across all documents" do
1441
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be true
1442
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be false
1443
+ end
1444
+
1445
+ context 'argument form' do
1446
+ it "behaves correctly when given a model instance" do
1447
+ expect(person.addresses.any?(person.addresses.first)).to be true
1448
+ end
1449
+
1450
+ it "behaves correctly when given a non-model instance" do
1451
+ expect(person.addresses.any?(1)).to be false
1452
+ end
1453
+ end
1454
+ end
1455
+
1456
+ context "when documents are not persisted" do
1457
+ before do
1458
+ person.addresses.build(street: "Bond")
1459
+ end
1460
+
1461
+ it "returns true" do
1462
+ expect(person.addresses.any?).to be true
1463
+ end
1464
+
1465
+ it "block form iterates across all documents" do
1466
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be false
1467
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be true
1468
+ end
1469
+
1470
+ context 'argument form' do
1471
+ it "behaves correctly when given a model instance" do
1472
+ expect(person.addresses.any?(person.addresses.first)).to be true
1473
+ end
1474
+
1475
+ it "behaves correctly when given a non-model instance" do
1476
+ expect(person.addresses.any?(1)).to be false
1477
+ end
1478
+ end
1479
+ end
1480
+
1481
+ context "when documents are not present" do
1482
+ it "returns false" do
1483
+ expect(person.addresses.any?).to be false
1484
+ end
1485
+
1486
+ it "block form iterates across all documents" do
1487
+ expect(person.addresses.any?(&:a)).to be false
1488
+ end
1489
+
1490
+ it "argument form is supported" do
1491
+ expect(person.addresses.any?(1)).to be false
1492
+ end
1493
+ end
1494
+ end
1495
+
1496
+ describe "#all?" do
1497
+
1498
+ let(:person) do
1499
+ Person.create!
1500
+ end
1501
+
1502
+ context "when documents are persisted" do
1503
+ before do
1504
+ person.addresses.create!(street: "Upper")
1505
+ end
1506
+
1507
+ it "returns true" do
1508
+ expect(person.addresses.all?).to be true
1509
+ end
1510
+
1511
+ it "block form iterates across all documents" do
1512
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be true
1513
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be false
1514
+ end
1515
+
1516
+ context 'argument form' do
1517
+ it "behaves correctly when given a model instance" do
1518
+ expect(person.addresses.all?(person.addresses.first)).to be true
1519
+ end
1520
+
1521
+ it "behaves correctly when given a non-model instance" do
1522
+ expect(person.addresses.all?(1)).to be false
1523
+ end
1524
+ end
1525
+ end
1526
+
1527
+ context "when documents are not persisted" do
1528
+ before do
1529
+ person.addresses.build(street: "Bond")
1530
+ end
1531
+
1532
+ it "returns true" do
1533
+ expect(person.addresses.all?).to be true
1534
+ end
1535
+
1536
+ it "block form iterates across all documents" do
1537
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be false
1538
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be true
1539
+ end
1540
+
1541
+ context 'argument form' do
1542
+ it "behaves correctly when given a model instance" do
1543
+ expect(person.addresses.all?(person.addresses.first)).to be true
1544
+ end
1545
+
1546
+ it "behaves correctly when given a non-model instance" do
1547
+ expect(person.addresses.all?(1)).to be false
1548
+ end
1549
+ end
1550
+ end
1551
+
1552
+ context "when documents are not present" do
1553
+ it "returns false" do
1554
+ expect(person.addresses.all?).to be true
1555
+ end
1556
+
1557
+ it "block form iterates across all documents" do
1558
+ expect(person.addresses.all?(&:foo)).to be true
1559
+ end
1560
+
1561
+ context 'argument form' do
1562
+ it "behaves correctly when given nil" do
1563
+ expect(person.addresses.all?(nil)).to be true
1564
+ end
1565
+
1566
+ it "behaves correctly when given a non-model instance" do
1567
+ expect(person.addresses.all?(1)).to be true
1568
+ end
1569
+ end
1570
+ end
1571
+ end
1572
+
1573
+ describe "#none?" do
1574
+
1575
+ let(:person) do
1576
+ Person.create!
1577
+ end
1578
+
1579
+ context "when documents are persisted" do
1580
+ before do
1581
+ person.addresses.create!(street: "Upper")
1582
+ end
1583
+
1584
+ it "returns true" do
1585
+ expect(person.addresses.none?).to be false
1586
+ end
1587
+
1588
+ it "block form iterates across all documents" do
1589
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be false
1590
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be true
1591
+ end
1592
+
1593
+ context 'argument form' do
1594
+ it "behaves correctly when given a model instance" do
1595
+ expect(person.addresses.none?(person.addresses.first)).to be false
1596
+ end
1597
+
1598
+ it "behaves correctly when given a non-model instance" do
1599
+ expect(person.addresses.none?(1)).to be true
1600
+ end
1601
+ end
1602
+ end
1603
+
1604
+ context "when documents are not persisted" do
1605
+ before do
1606
+ person.addresses.build(street: "Bond")
1607
+ end
1608
+
1609
+ it "returns true" do
1610
+ expect(person.addresses.none?).to be false
1611
+ end
1612
+
1613
+ it "block form iterates across all documents" do
1614
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be true
1615
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be false
1616
+ end
1617
+
1618
+ context 'argument form' do
1619
+ it "behaves correctly when given a model instance" do
1620
+ expect(person.addresses.none?(person.addresses.first)).to be false
1621
+ end
1622
+
1623
+ it "behaves correctly when given a non-model instance" do
1624
+ expect(person.addresses.none?(1)).to be true
1625
+ end
1626
+ end
1627
+ end
1628
+
1629
+ context "when documents are not present" do
1630
+ it "returns false" do
1631
+ expect(person.addresses.none?).to be true
1632
+ end
1633
+
1634
+ it "block form iterates across all documents" do
1635
+ expect(person.addresses.none?(&:a)).to be true
1636
+ end
1637
+
1638
+ context 'argument form' do
1639
+ it "behaves correctly when given nil" do
1640
+ expect(person.addresses.none?(nil)).to be true
1641
+ end
1642
+
1643
+ it "behaves correctly when given a non-model instance" do
1644
+ expect(person.addresses.none?(1)).to be true
1645
+ end
1646
+ end
1647
+ end
1648
+ end
1649
+
1650
+ describe "#create" do
1651
+
1652
+ context "when providing multiple attributes" do
1653
+
1654
+ let(:person) do
1655
+ Person.create!
1656
+ end
1657
+
1658
+ let!(:addresses) do
1659
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
1660
+ end
1661
+
1662
+ it "creates multiple documents" do
1663
+ expect(addresses.size).to eq(2)
1664
+ end
1665
+
1666
+ it "sets the first attributes" do
1667
+ expect(addresses.first.street).to eq("Bond")
1668
+ end
1669
+
1670
+ it "sets the second attributes" do
1671
+ expect(addresses.last.street).to eq("Upper")
1672
+ end
1673
+
1674
+ it "persists the children" do
1675
+ expect(person.addresses.count).to eq(2)
1676
+ end
1677
+ end
1678
+
1679
+ context "when the relation is not cyclic" do
1680
+
1681
+ let(:person) do
1682
+ Person.create!
1683
+ end
1684
+
1685
+ let!(:address) do
1686
+ person.addresses.create!(street: "Bond") do |address|
1687
+ address.state = "CA"
1688
+ end
1689
+ end
1690
+
1691
+ it "appends to the target" do
1692
+ expect(person.reload.addresses).to eq([ address ])
1693
+ end
1694
+
1695
+ it "appends to the unscoped" do
1696
+ expect(person.reload.addresses.send(:_unscoped)).to eq([ address ])
1697
+ end
1698
+
1699
+ it "sets the base on the inverse relation" do
1700
+ expect(address.addressable).to eq(person)
1701
+ end
1702
+
1703
+ it "saves the document" do
1704
+ expect(address).to be_persisted
1705
+ end
1706
+
1707
+ it "sets the parent on the child" do
1708
+ expect(address._parent).to eq(person)
1709
+ end
1710
+
1711
+ it "sets the association metadata on the child" do
1712
+ expect(address._association).to_not be_nil
1713
+ end
1714
+
1715
+ it "sets the index on the child" do
1716
+ expect(address._index).to eq(0)
1717
+ end
1718
+
1719
+ it "writes to the attributes" do
1720
+ expect(address.street).to eq("Bond")
1721
+ end
1722
+
1723
+ it "calls the passed block" do
1724
+ expect(address.state).to eq("CA")
1725
+ end
1726
+
1727
+ context "when embedding a multi word named document" do
1728
+
1729
+ let!(:component) do
1730
+ person.address_components.create!(street: "Test")
1731
+ end
1732
+
1733
+ it "saves the embedded document" do
1734
+ expect(person.reload.address_components.first).to eq(component)
1735
+ end
1736
+ end
1737
+ end
1738
+
1739
+ context "when the relation is cyclic" do
1740
+
1741
+ let!(:entry) do
1742
+ Entry.create!(title: "hi")
1743
+ end
1744
+
1745
+ let!(:child_entry) do
1746
+ entry.child_entries.create!(title: "hello")
1747
+ end
1748
+
1749
+ it "creates a new child" do
1750
+ expect(child_entry).to be_persisted
1751
+ end
1752
+ end
1753
+ end
1754
+
1755
+ describe "#create!" do
1756
+
1757
+ let(:person) do
1758
+ Person.create!
1759
+ end
1760
+
1761
+ context "when providing multiple attributes" do
1762
+
1763
+ let!(:addresses) do
1764
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
1765
+ end
1766
+
1767
+ it "creates multiple documents" do
1768
+ expect(addresses.size).to eq(2)
1769
+ end
1770
+
1771
+ it "sets the first attributes" do
1772
+ expect(addresses.first.street).to eq("Bond")
1773
+ end
1774
+
1775
+ it "sets the second attributes" do
1776
+ expect(addresses.last.street).to eq("Upper")
1777
+ end
1778
+
1779
+ it "persists the children" do
1780
+ expect(person.addresses.count).to eq(2)
1781
+ end
1782
+ end
1783
+
1784
+ context "when validation passes" do
1785
+
1786
+ let(:address) do
1787
+ person.addresses.create!(street: "Bond")
1788
+ end
1789
+
1790
+ it "appends to the target" do
1791
+ expect(person.addresses).to eq([ address ])
1792
+ end
1793
+
1794
+ it "appends to the unscoped" do
1795
+ expect(person.addresses.send(:_unscoped)).to eq([ address ])
1796
+ end
1797
+
1798
+ it "sets the base on the inverse relation" do
1799
+ expect(address.addressable).to eq(person)
1800
+ end
1801
+
1802
+ it "saves the document" do
1803
+ expect(address).to be_persisted
1804
+ end
1805
+
1806
+ it "sets the parent on the child" do
1807
+ expect(address._parent).to eq(person)
1808
+ end
1809
+
1810
+ it "sets the association metadata on the child" do
1811
+ expect(address._association).to_not be_nil
1812
+ end
1813
+
1814
+ it "sets the index on the child" do
1815
+ expect(address._index).to eq(0)
1816
+ end
1817
+
1818
+ it "writes to the attributes" do
1819
+ expect(address.street).to eq("Bond")
1820
+ end
1821
+ end
1822
+
1823
+ context "when validation fails" do
1824
+
1825
+ it "raises an error" do
1826
+ expect {
1827
+ person.addresses.create!(street: "1")
1828
+ }.to raise_error(Mongoid::Errors::Validations)
1829
+ end
1830
+
1831
+ context 'when the presence of the embedded relation is validated' do
1832
+
1833
+ around do |example|
1834
+ Book.validates :pages, presence: true
1835
+ example.run
1836
+ Book.reset_callbacks(:validate)
1837
+ end
1838
+
1839
+ let(:book) do
1840
+ Book.new.tap do |b|
1841
+ b.pages = [Page.new]
1842
+ b.save!
1843
+ end
1844
+ end
1845
+
1846
+ let(:num_pages) do
1847
+ book.pages.size
1848
+ end
1849
+
1850
+ let(:reloaded) do
1851
+ book.reload
1852
+ end
1853
+
1854
+ before do
1855
+ begin; book.update_attributes!({"pages"=>nil}); rescue; end
1856
+ end
1857
+
1858
+ it 'does not delete the embedded relation' do
1859
+ expect(reloaded.pages.size).to eq(num_pages)
1860
+ end
1861
+ end
1862
+ end
1863
+ end
1864
+
1865
+ describe "#delete" do
1866
+
1867
+ let(:person) do
1868
+ Person.new
1869
+ end
1870
+
1871
+ let(:address_one) do
1872
+ Address.new(street: "first")
1873
+ end
1874
+
1875
+ let(:address_two) do
1876
+ Address.new(street: "second")
1877
+ end
1878
+
1879
+ before do
1880
+ person.addresses << [ address_one, address_two ]
1881
+ end
1882
+
1883
+ context "when the document exists in the relation" do
1884
+
1885
+ let!(:deleted) do
1886
+ person.addresses.delete(address_one)
1887
+ end
1888
+
1889
+ it "deletes the document" do
1890
+ expect(person.addresses).to eq([ address_two ])
1891
+ end
1892
+
1893
+ it "deletes the document from the unscoped" do
1894
+ expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
1895
+ end
1896
+
1897
+ it "reindexes the relation" do
1898
+ expect(address_two._index).to eq(0)
1899
+ end
1900
+
1901
+ it "returns the document" do
1902
+ expect(deleted).to eq(address_one)
1903
+ end
1904
+ end
1905
+
1906
+ context "when the document does not exist" do
1907
+
1908
+ it "returns nil" do
1909
+ expect(person.addresses.delete(Address.new)).to be_nil
1910
+ end
1911
+ end
1912
+ end
1913
+
1914
+ describe "#delete_if" do
1915
+
1916
+ let(:person) do
1917
+ Person.create!
1918
+ end
1919
+
1920
+ context "when the documents are new" do
1921
+
1922
+ let!(:address_one) do
1923
+ person.addresses.build(street: "Bond")
1924
+ end
1925
+
1926
+ let!(:address_two) do
1927
+ person.addresses.build(street: "Upper")
1928
+ end
1929
+
1930
+ context "when a block is provided" do
1931
+
1932
+ let!(:deleted) do
1933
+ person.addresses.delete_if do |doc|
1934
+ doc.street == "Bond"
1935
+ end
1936
+ end
1937
+
1938
+ it "removes the matching documents" do
1939
+ expect(person.addresses.size).to eq(1)
1940
+ end
1941
+
1942
+ it "removes from the unscoped" do
1943
+ expect(person.addresses.send(:_unscoped).size).to eq(1)
1944
+ end
1945
+
1946
+ it "returns the relation" do
1947
+ expect(deleted).to eq(person.addresses)
1948
+ end
1949
+ end
1950
+
1951
+ context "when no block is provided" do
1952
+
1953
+ let!(:deleted) do
1954
+ person.addresses.delete_if
1955
+ end
1956
+
1957
+ it "returns an enumerator" do
1958
+ expect(deleted).to be_a(Enumerator)
1959
+ end
1960
+ end
1961
+ end
1962
+
1963
+ context "when the documents persisted" do
1964
+
1965
+ let!(:address_one) do
1966
+ person.addresses.create!(street: "Bond")
1967
+ end
1968
+
1969
+ let!(:address_two) do
1970
+ person.addresses.create!(street: "Upper")
1971
+ end
1972
+
1973
+ context "when a block is provided" do
1974
+
1975
+ let!(:deleted) do
1976
+ person.addresses.delete_if do |doc|
1977
+ doc.street == "Bond"
1978
+ end
1979
+ end
1980
+
1981
+ it "deletes the matching documents" do
1982
+ expect(person.addresses.count).to eq(1)
1983
+ end
1984
+
1985
+ it "deletes the matching documents from the db" do
1986
+ expect(person.reload.addresses.count).to eq(1)
1987
+ end
1988
+
1989
+ it "returns the relation" do
1990
+ expect(deleted).to eq(person.addresses)
1991
+ end
1992
+ end
1993
+ end
1994
+
1995
+ context "when the documents are empty" do
1996
+
1997
+ context "when a block is provided" do
1998
+
1999
+ let!(:deleted) do
2000
+ person.addresses.delete_if do |doc|
2001
+ doc.street == "Bond"
2002
+ end
2003
+ end
2004
+
2005
+ it "deletes the matching documents" do
2006
+ expect(person.addresses.count).to eq(0)
2007
+ end
2008
+
2009
+ it "deletes all the documents from the db" do
2010
+ expect(person.reload.addresses.count).to eq(0)
2011
+ end
2012
+
2013
+ it "returns the relation" do
2014
+ expect(deleted).to eq(person.addresses)
2015
+ end
2016
+ end
2017
+ end
2018
+ end
2019
+
2020
+ [ :delete_all, :destroy_all ].each do |method|
2021
+
2022
+ describe "##{method}" do
2023
+
2024
+ let(:person) do
2025
+ Person.create!
2026
+ end
2027
+
2028
+ context "when the documents are new" do
2029
+
2030
+ let!(:address_one) do
2031
+ person.addresses.build(street: "Bond")
2032
+ end
2033
+
2034
+ let!(:address_two) do
2035
+ person.addresses.build(street: "Upper")
2036
+ end
2037
+
2038
+ context "when conditions are provided" do
2039
+
2040
+ let!(:deleted) do
2041
+ person.addresses.send(
2042
+ method,
2043
+ { street: "Bond" }
2044
+ )
2045
+ end
2046
+
2047
+ it "removes the matching documents" do
2048
+ expect(person.addresses.size).to eq(1)
2049
+ end
2050
+
2051
+ it "removes from the unscoped" do
2052
+ expect(person.addresses.send(:_unscoped).size).to eq(1)
2053
+ end
2054
+
2055
+ it "returns the number deleted" do
2056
+ expect(deleted).to eq(1)
2057
+ end
2058
+ end
2059
+
2060
+ context "when conditions are not provided" do
2061
+
2062
+ let!(:deleted) do
2063
+ person.addresses.send(method)
2064
+ end
2065
+
2066
+ it "removes all documents" do
2067
+ expect(person.addresses.size).to eq(0)
2068
+ end
2069
+
2070
+ it "returns the number deleted" do
2071
+ expect(deleted).to eq(2)
2072
+ end
2073
+ end
2074
+ end
2075
+
2076
+ context "when the documents persisted" do
2077
+
2078
+ let!(:address_one) do
2079
+ person.addresses.create!(street: "Bond")
2080
+ end
2081
+
2082
+ let!(:address_two) do
2083
+ person.addresses.create!(street: "Upper")
2084
+ end
2085
+
2086
+ context "when conditions are provided" do
2087
+
2088
+ let!(:deleted) do
2089
+ person.addresses.send(
2090
+ method,
2091
+ { street: "Bond" }
2092
+ )
2093
+ end
2094
+
2095
+ it "deletes the matching documents" do
2096
+ expect(person.addresses.count).to eq(1)
2097
+ end
2098
+
2099
+ it "deletes the matching documents from the db" do
2100
+ expect(person.reload.addresses.count).to eq(1)
2101
+ end
2102
+
2103
+ it "returns the number deleted" do
2104
+ expect(deleted).to eq(1)
2105
+ end
2106
+ end
2107
+
2108
+ context "when conditions are not provided" do
2109
+
2110
+ let!(:deleted) do
2111
+ person.addresses.send(method)
2112
+ end
2113
+
2114
+ it "deletes all the documents" do
2115
+ expect(person.addresses.count).to eq(0)
2116
+ end
2117
+
2118
+ it "deletes all the documents from the db" do
2119
+ expect(person.reload.addresses.count).to eq(0)
2120
+ end
2121
+
2122
+ it "returns the number deleted" do
2123
+ expect(deleted).to eq(2)
2124
+ end
2125
+ end
2126
+
2127
+ context "when removing and resaving" do
2128
+
2129
+ let(:owner) do
2130
+ PetOwner.create!(title: "AKC")
2131
+ end
2132
+
2133
+ before do
2134
+ owner.pet = Pet.new(name: "Fido")
2135
+ owner.pet.vet_visits << VetVisit.new(date: Date.today)
2136
+ owner.save!
2137
+ owner.pet.vet_visits.destroy_all
2138
+ end
2139
+
2140
+ it "removes the documents" do
2141
+ expect(owner.pet.vet_visits).to be_empty
2142
+ end
2143
+
2144
+ it "allows addition and a resave" do
2145
+ owner.pet.vet_visits << VetVisit.new(date: Date.today)
2146
+ owner.save!
2147
+ expect(owner.pet.vet_visits.first).to be_persisted
2148
+ end
2149
+ end
2150
+ end
2151
+
2152
+ context "when the documents empty" do
2153
+
2154
+ context "when scoped" do
2155
+ let!(:deleted) do
2156
+ person.addresses.without_postcode.send(method)
2157
+ end
2158
+
2159
+ it "deletes all the documents" do
2160
+ expect(person.addresses.count).to eq(0)
2161
+ end
2162
+
2163
+ it "deletes all the documents from the db" do
2164
+ expect(person.reload.addresses.count).to eq(0)
2165
+ end
2166
+
2167
+ it "returns the number deleted" do
2168
+ expect(deleted).to eq(0)
2169
+ end
2170
+ end
2171
+
2172
+ context "when conditions are provided" do
2173
+
2174
+ let!(:deleted) do
2175
+ person.addresses.send(
2176
+ method,
2177
+ conditions: { street: "Bond" }
2178
+ )
2179
+ end
2180
+
2181
+ it "deletes all the documents" do
2182
+ expect(person.addresses.count).to eq(0)
2183
+ end
2184
+
2185
+ it "deletes all the documents from the db" do
2186
+ expect(person.reload.addresses.count).to eq(0)
2187
+ end
2188
+
2189
+ it "returns the number deleted" do
2190
+ expect(deleted).to eq(0)
2191
+ end
2192
+ end
2193
+
2194
+ context "when conditions are not provided" do
2195
+
2196
+ let!(:deleted) do
2197
+ person.addresses.send(method)
2198
+ end
2199
+
2200
+ it "deletes all the documents" do
2201
+ expect(person.addresses.count).to eq(0)
2202
+ end
2203
+
2204
+ it "deletes all the documents from the db" do
2205
+ expect(person.reload.addresses.count).to eq(0)
2206
+ end
2207
+
2208
+ it "returns the number deleted" do
2209
+ expect(deleted).to eq(0)
2210
+ end
2211
+ end
2212
+ end
2213
+
2214
+ context "when modifying the document beforehand" do
2215
+ let(:parent) { EmmParent.new }
2216
+
2217
+ before do
2218
+
2219
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2220
+ parent.save!
2221
+
2222
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2223
+
2224
+ parent.blocks.destroy_all(:name => 'test')
2225
+ end
2226
+
2227
+ it "deletes the correct document in the database" do
2228
+ expect(parent.reload.blocks.length).to eq(0)
2229
+ end
2230
+ end
2231
+
2232
+ context "when nil _id" do
2233
+ let(:parent) { EmmParent.new }
2234
+
2235
+ before do
2236
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2237
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2238
+ parent.save!
2239
+
2240
+ parent.blocks.destroy_all(:name => 'test')
2241
+ end
2242
+
2243
+ it "deletes only the matching documents in the database" do
2244
+ expect(parent.reload.blocks.length).to eq(1)
2245
+ end
2246
+ end
2247
+
2248
+ # Since without an _id field we must us a $pullAll with the attributes of
2249
+ # the embedded document, if you modify it beforehand, the query will not
2250
+ # be able to find the correct document to pull.
2251
+ context "when modifying the document with nil _id" do
2252
+ let(:parent) { EmmParent.new }
2253
+
2254
+ before do
2255
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2256
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2257
+ parent.save!
2258
+
2259
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2260
+
2261
+ parent.blocks.destroy_all(:name => 'test')
2262
+ end
2263
+
2264
+ it "does not delete the correct documents" do
2265
+ expect(parent.reload.blocks.length).to eq(2)
2266
+ end
2267
+ end
2268
+
2269
+ context "when documents with and without _id" do
2270
+ let(:parent) { EmmParent.new }
2271
+
2272
+ before do
2273
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2274
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2275
+ parent.save!
2276
+
2277
+ parent.blocks[1].children[0].assign_attributes(size: 2)
2278
+
2279
+ parent.blocks.destroy_all(:name => 'test')
2280
+ end
2281
+
2282
+ it "does not delete the correct documents" do
2283
+ expect(parent.reload.blocks.length).to eq(0)
2284
+ end
2285
+ end
2286
+ end
2287
+ end
2288
+
2289
+ describe ".embedded?" do
2290
+
2291
+ it "returns true" do
2292
+ expect(described_class).to be_embedded
2293
+ end
2294
+ end
2295
+
2296
+ describe "#exists?" do
2297
+
2298
+ let!(:person) do
2299
+ Person.create!
2300
+ end
2301
+
2302
+ context "when documents exist in the database" do
2303
+
2304
+ before do
2305
+ person.addresses.create!(street: "Bond St")
2306
+ end
2307
+
2308
+ it "returns true" do
2309
+ expect(person.addresses.exists?).to be true
2310
+ end
2311
+ end
2312
+
2313
+ context "when no documents exist in the database" do
2314
+
2315
+ before do
2316
+ person.addresses.build(street: "Hyde Park Dr")
2317
+ end
2318
+
2319
+ it "returns false" do
2320
+ expect(person.addresses.exists?).to be false
2321
+ end
2322
+ end
2323
+ end
2324
+
2325
+ describe "#find" do
2326
+
2327
+ let(:person) do
2328
+ Person.new
2329
+ end
2330
+
2331
+ let!(:address_one) do
2332
+ person.addresses.build(street: "Bond", city: "London")
2333
+ end
2334
+
2335
+ let!(:address_two) do
2336
+ person.addresses.build(street: "Upper", city: "London")
2337
+ end
2338
+
2339
+ context "when providing an id" do
2340
+
2341
+ context "when the id matches" do
2342
+
2343
+ let(:address) do
2344
+ person.addresses.find(address_one.id)
2345
+ end
2346
+
2347
+ it "returns the matching document" do
2348
+ expect(address).to eq(address_one)
2349
+ end
2350
+ end
2351
+
2352
+ context "when the id does not match" do
2353
+
2354
+ context "when config set to raise error" do
2355
+
2356
+ before do
2357
+ Mongoid.raise_not_found_error = true
2358
+ end
2359
+
2360
+ it "raises an error" do
2361
+ expect {
2362
+ person.addresses.find(BSON::ObjectId.new)
2363
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2364
+ end
2365
+ end
2366
+
2367
+ context "when config set not to raise error" do
2368
+
2369
+ let(:address) do
2370
+ person.addresses.find(BSON::ObjectId.new)
2371
+ end
2372
+
2373
+ before do
2374
+ Mongoid.raise_not_found_error = false
2375
+ end
2376
+
2377
+ after do
2378
+ Mongoid.raise_not_found_error = true
2379
+ end
2380
+
2381
+ it "returns nil" do
2382
+ expect(address).to be_nil
2383
+ end
2384
+ end
2385
+ end
2386
+ end
2387
+
2388
+ context "when providing an array of ids" do
2389
+
2390
+ context "when the ids match" do
2391
+
2392
+ let(:addresses) do
2393
+ person.addresses.find([ address_one.id, address_two.id ])
2394
+ end
2395
+
2396
+ it "returns the matching documents" do
2397
+ expect(addresses).to eq([ address_one, address_two ])
2398
+ end
2399
+ end
2400
+
2401
+ context "when the ids do not match" do
2402
+
2403
+ context "when config set to raise error" do
2404
+
2405
+ before do
2406
+ Mongoid.raise_not_found_error = true
2407
+ end
2408
+
2409
+ it "raises an error" do
2410
+ expect {
2411
+ person.addresses.find([ BSON::ObjectId.new ])
2412
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2413
+ end
2414
+ end
2415
+
2416
+ context "when config set not to raise error" do
2417
+
2418
+ let(:addresses) do
2419
+ person.addresses.find([ BSON::ObjectId.new ])
2420
+ end
2421
+
2422
+ before do
2423
+ Mongoid.raise_not_found_error = false
2424
+ end
2425
+
2426
+ after do
2427
+ Mongoid.raise_not_found_error = true
2428
+ end
2429
+
2430
+ it "returns an empty array" do
2431
+ expect(addresses).to be_empty
2432
+ end
2433
+ end
2434
+ end
2435
+ end
2436
+
2437
+ context "with block" do
2438
+ let!(:author) do
2439
+ Person.create!(title: 'Person')
2440
+ end
2441
+
2442
+ let!(:video_one) do
2443
+ author.videos.create!(title: 'video one')
2444
+ end
2445
+
2446
+ let!(:video_two) do
2447
+ author.videos.create!(title: 'video two')
2448
+ end
2449
+
2450
+ it "finds one" do
2451
+ expect(
2452
+ author.videos.find do |video|
2453
+ video.title == 'video one'
2454
+ end
2455
+ ).to eq(video_one)
2456
+ end
2457
+
2458
+ it "returns first match of multiple" do
2459
+ expect(
2460
+ author.videos.find do |video|
2461
+ ['video one', 'video two'].include?(video.title)
2462
+ end
2463
+ ).to be_a(Video)
2464
+ end
2465
+
2466
+ it "returns nil when not found" do
2467
+ expect(
2468
+ author.videos.find do |video|
2469
+ video.title == 'non exiting one'
2470
+ end
2471
+ ).to be_nil
2472
+ end
2473
+ end
2474
+ end
2475
+
2476
+ describe "#find_or_create_by" do
2477
+
2478
+ let(:person) do
2479
+ Person.create!
2480
+ end
2481
+
2482
+ let!(:address) do
2483
+ person.addresses.build(street: "Bourke", city: "Melbourne")
2484
+ end
2485
+
2486
+ context "when the document exists" do
2487
+
2488
+ let(:found) do
2489
+ person.addresses.find_or_create_by(street: "Bourke")
2490
+ end
2491
+
2492
+ it "returns the document" do
2493
+ expect(found).to eq(address)
2494
+ end
2495
+ end
2496
+
2497
+ context "when the document does not exist" do
2498
+
2499
+ let(:found) do
2500
+ person.addresses.find_or_create_by(street: "King") do |address|
2501
+ address.state = "CA"
2502
+ end
2503
+ end
2504
+
2505
+ it "sets the new document attributes" do
2506
+ expect(found.street).to eq("King")
2507
+ end
2508
+
2509
+ it "returns a newly persisted document" do
2510
+ expect(found).to be_persisted
2511
+ end
2512
+
2513
+ it "calls the passed block" do
2514
+ expect(found.state).to eq("CA")
2515
+ end
2516
+ end
2517
+
2518
+ # todo: why should this pass?
2519
+ # context "when the child belongs to another document" do
2520
+ #
2521
+ # let(:product) do
2522
+ # Product.create!
2523
+ # end
2524
+ #
2525
+ # let(:purchase) do
2526
+ # Purchase.create!
2527
+ # end
2528
+ #
2529
+ # let(:line_item) do
2530
+ # purchase.line_items.find_or_create_by(
2531
+ # product_id: product.id,
2532
+ # product_type: product.class.name
2533
+ # )
2534
+ # end
2535
+ #
2536
+ # it "properly creates the document" do
2537
+ # expect(line_item.product).to eq(product)
2538
+ # end
2539
+ # end
2540
+ end
2541
+
2542
+ describe "#find_or_create_by!" do
2543
+
2544
+ let(:person) do
2545
+ Person.create!
2546
+ end
2547
+
2548
+ let!(:address) do
2549
+ person.addresses.build(street: "Bourke", city: "Melbourne")
2550
+ end
2551
+
2552
+ context "when the document exists" do
2553
+
2554
+ let(:found) do
2555
+ person.addresses.find_or_create_by!(street: "Bourke")
2556
+ end
2557
+
2558
+ it "returns the document" do
2559
+ expect(found).to eq(address)
2560
+ end
2561
+ end
2562
+
2563
+ context "when the document does not exist" do
2564
+
2565
+ let(:found) do
2566
+ person.addresses.find_or_create_by!(street: "King") do |address|
2567
+ address.state = "CA"
2568
+ end
2569
+ end
2570
+
2571
+ it "sets the new document attributes" do
2572
+ expect(found.street).to eq("King")
2573
+ end
2574
+
2575
+ it "returns a newly persisted document" do
2576
+ expect(found).to be_persisted
2577
+ end
2578
+
2579
+ it "calls the passed block" do
2580
+ expect(found.state).to eq("CA")
2581
+ end
2582
+
2583
+ context "when validation fails" do
2584
+
2585
+ it "raises an error" do
2586
+ expect {
2587
+ person.addresses.find_or_create_by!(street: "1")
2588
+ }.to raise_error(Mongoid::Errors::Validations)
2589
+ end
2590
+ end
2591
+ end
2592
+
2593
+ # todo: why should this pass?
2594
+ # context "when the child belongs to another document" do
2595
+ #
2596
+ # let(:product) do
2597
+ # Product.create!
2598
+ # end
2599
+ #
2600
+ # let(:purchase) do
2601
+ # Purchase.create!
2602
+ # end
2603
+ #
2604
+ # let(:line_item) do
2605
+ # purchase.line_items.find_or_create_by(
2606
+ # product_id: product.id,
2607
+ # product_type: product.class.name
2608
+ # )
2609
+ # end
2610
+ #
2611
+ # it "properly creates the document" do
2612
+ # expect(line_item.product).to eq(product)
2613
+ # end
2614
+ # end
2615
+ end
2616
+
2617
+ describe "#find_or_initialize_by" do
2618
+
2619
+ let(:person) do
2620
+ Person.new
2621
+ end
2622
+
2623
+ let!(:address) do
2624
+ person.addresses.build(street: "Bourke", city: "Melbourne")
2625
+ end
2626
+
2627
+ context "when the document exists" do
2628
+
2629
+ let(:found) do
2630
+ person.addresses.find_or_initialize_by(street: "Bourke")
2631
+ end
2632
+
2633
+ it "returns the document" do
2634
+ expect(found).to eq(address)
2635
+ end
2636
+ end
2637
+
2638
+ context "when the document does not exist" do
2639
+
2640
+ let(:found) do
2641
+ person.addresses.find_or_initialize_by(street: "King") do |address|
2642
+ address.state = "CA"
2643
+ end
2644
+ end
2645
+
2646
+ it "sets the new document attributes" do
2647
+ expect(found.street).to eq("King")
2648
+ end
2649
+
2650
+ it "returns a non persisted document" do
2651
+ expect(found).to_not be_persisted
2652
+ end
2653
+
2654
+ it "calls the passed block" do
2655
+ expect(found.state).to eq("CA")
2656
+ end
2657
+ end
2658
+ end
2659
+
2660
+ describe "#max" do
2661
+
2662
+ let(:person) do
2663
+ Person.new
2664
+ end
2665
+
2666
+ let(:address_one) do
2667
+ Address.new(number: 5)
2668
+ end
2669
+
2670
+ let(:address_two) do
2671
+ Address.new(number: 10)
2672
+ end
2673
+
2674
+ before do
2675
+ person.addresses.push(address_one, address_two)
2676
+ end
2677
+
2678
+ let(:max) do
2679
+ person.addresses.max do |a,b|
2680
+ a.number <=> b.number
2681
+ end
2682
+ end
2683
+
2684
+ it "returns the document with the max value of the supplied field" do
2685
+ expect(max).to eq(address_two)
2686
+ end
2687
+ end
2688
+
2689
+ describe "#max_by" do
2690
+
2691
+ let(:person) do
2692
+ Person.new
2693
+ end
2694
+
2695
+ let(:address_one) do
2696
+ Address.new(number: 5)
2697
+ end
2698
+
2699
+ let(:address_two) do
2700
+ Address.new(number: 10)
2701
+ end
2702
+
2703
+ before do
2704
+ person.addresses.push(address_one, address_two)
2705
+ end
2706
+
2707
+ let(:max) do
2708
+ person.addresses.max_by(&:number)
2709
+ end
2710
+
2711
+ it "returns the document with the max value of the supplied field" do
2712
+ expect(max).to eq(address_two)
2713
+ end
2714
+ end
2715
+
2716
+ describe "#method_missing" do
2717
+
2718
+ let!(:person) do
2719
+ Person.create!
2720
+ end
2721
+
2722
+ let!(:address_one) do
2723
+ person.addresses.create!(
2724
+ street: "Market",
2725
+ state: "CA",
2726
+ services: [ "1", "2" ]
2727
+ )
2728
+ end
2729
+
2730
+ let!(:address_two) do
2731
+ person.addresses.create!(
2732
+ street: "Madison",
2733
+ state: "NY",
2734
+ services: [ "1", "2" ]
2735
+ )
2736
+ end
2737
+
2738
+ context "when providing a single criteria" do
2739
+
2740
+ context "when using a simple criteria" do
2741
+
2742
+ let(:addresses) do
2743
+ person.addresses.where(state: "CA")
2744
+ end
2745
+
2746
+ it "applies the criteria to the documents" do
2747
+ expect(addresses).to eq([ address_one ])
2748
+ end
2749
+ end
2750
+
2751
+ context "when using an $or criteria" do
2752
+
2753
+ let(:addresses) do
2754
+ person.addresses.any_of({ state: "CA" }, { state: "NY" })
2755
+ end
2756
+
2757
+ it "applies the criteria to the documents" do
2758
+ expect(addresses).to eq([ address_one, address_two ])
2759
+ end
2760
+ end
2761
+
2762
+ context "when using array comparison" do
2763
+
2764
+ let(:addresses) do
2765
+ person.addresses.where(services: [ "1", "2" ])
2766
+ end
2767
+
2768
+ it "applies the criteria to the documents" do
2769
+ expect(addresses).to eq([ address_one, address_two ])
2770
+ end
2771
+ end
2772
+ end
2773
+
2774
+ context "when providing a criteria class method" do
2775
+ context "without keyword arguments" do
2776
+
2777
+ let(:addresses) do
2778
+ person.addresses.california
2779
+ end
2780
+
2781
+ it "applies the criteria to the documents" do
2782
+ expect(addresses).to eq([ address_one ])
2783
+ end
2784
+ end
2785
+
2786
+ context "with keyword arguments" do
2787
+
2788
+ let(:addresses) do
2789
+ person.addresses.city_and_state(city: "Sacramento", state: "CA")
2790
+ end
2791
+
2792
+ it "applies the criteria to the documents" do
2793
+ expect(addresses).to eq([])
2794
+ end
2795
+ end
2796
+ end
2797
+
2798
+ context "when chaining criteria" do
2799
+
2800
+ let(:addresses) do
2801
+ person.addresses.california.where(:street.in => [ "Market" ])
2802
+ end
2803
+
2804
+ it "applies the criteria to the documents" do
2805
+ expect(addresses).to eq([ address_one ])
2806
+ end
2807
+ end
2808
+
2809
+ context "when delegating methods" do
2810
+
2811
+ describe "#distinct" do
2812
+
2813
+ it "returns the distinct values for the fields" do
2814
+ expect(person.addresses.distinct(:street)).to eq([ "Market", "Madison"])
2815
+ end
2816
+ end
2817
+ end
2818
+ end
2819
+
2820
+ describe "#min" do
2821
+
2822
+ let(:person) do
2823
+ Person.new
2824
+ end
2825
+
2826
+ let(:address_one) do
2827
+ Address.new(number: 5)
2828
+ end
2829
+
2830
+ let(:address_two) do
2831
+ Address.new(number: 10)
2832
+ end
2833
+
2834
+ before do
2835
+ person.addresses.push(address_one, address_two)
2836
+ end
2837
+
2838
+ let(:min) do
2839
+ person.addresses.min do |a,b|
2840
+ a.number <=> b.number
2841
+ end
2842
+ end
2843
+
2844
+ it "returns the min value of the supplied field" do
2845
+ expect(min).to eq(address_one)
2846
+ end
2847
+ end
2848
+
2849
+ describe "#min_by" do
2850
+
2851
+ let(:person) do
2852
+ Person.new
2853
+ end
2854
+
2855
+ let(:address_one) do
2856
+ Address.new(number: 5)
2857
+ end
2858
+
2859
+ let(:address_two) do
2860
+ Address.new(number: 10)
2861
+ end
2862
+
2863
+ before do
2864
+ person.addresses.push(address_one, address_two)
2865
+ end
2866
+
2867
+ let(:min) do
2868
+ person.addresses.min_by(&:number)
2869
+ end
2870
+
2871
+ it "returns the min value of the supplied field" do
2872
+ expect(min).to eq(address_one)
2873
+ end
2874
+ end
2875
+
2876
+ describe "#pop" do
2877
+
2878
+ let(:person) do
2879
+ Person.create!
2880
+ end
2881
+
2882
+ context "when no argument is provided" do
2883
+
2884
+ let!(:address_one) do
2885
+ person.addresses.create!(street: "sonnenallee")
2886
+ end
2887
+
2888
+ let!(:address_two) do
2889
+ person.addresses.create!(street: "hermannstr")
2890
+ end
2891
+
2892
+ let!(:popped) do
2893
+ person.addresses.pop
2894
+ end
2895
+
2896
+ it "returns the popped document" do
2897
+ expect(popped).to eq(address_two)
2898
+ end
2899
+
2900
+ it "removes the document from the relation" do
2901
+ expect(person.addresses).to eq([ address_one ])
2902
+ end
2903
+
2904
+ it "persists the pop" do
2905
+ expect(person.reload.addresses).to eq([ address_one ])
2906
+ end
2907
+ end
2908
+
2909
+ context "when an integer is provided" do
2910
+
2911
+ let!(:address_one) do
2912
+ person.addresses.create!(street: "sonnenallee")
2913
+ end
2914
+
2915
+ let!(:address_two) do
2916
+ person.addresses.create!(street: "hermannstr")
2917
+ end
2918
+
2919
+ context "when the number is zero" do
2920
+
2921
+ let!(:popped) do
2922
+ person.addresses.pop(0)
2923
+ end
2924
+
2925
+ it "returns an empty array" do
2926
+ expect(popped).to eq([])
2927
+ end
2928
+
2929
+ it "does not remove the document from the relation" do
2930
+ expect(person.addresses).to eq([ address_one, address_two ])
2931
+ end
2932
+
2933
+ it "does not persist the pop" do
2934
+ expect(person.reload.addresses).to eq([ address_one, address_two ])
2935
+ end
2936
+ end
2937
+
2938
+ context "when the number is not larger than the relation" do
2939
+
2940
+ let!(:popped) do
2941
+ person.addresses.pop(2)
2942
+ end
2943
+
2944
+ it "returns the popped documents" do
2945
+ expect(popped).to eq([ address_one, address_two ])
2946
+ end
2947
+
2948
+ it "removes the document from the relation" do
2949
+ expect(person.addresses).to be_empty
2950
+ end
2951
+
2952
+ it "persists the pop" do
2953
+ expect(person.reload.addresses).to be_empty
2954
+ end
2955
+ end
2956
+
2957
+ context "when the number is larger than the relation" do
2958
+
2959
+ let!(:popped) do
2960
+ person.addresses.pop(4)
2961
+ end
2962
+
2963
+ it "returns the popped documents" do
2964
+ expect(popped).to eq([ address_one, address_two ])
2965
+ end
2966
+
2967
+ it "removes the document from the relation" do
2968
+ expect(person.addresses).to be_empty
2969
+ end
2970
+
2971
+ it "persists the pop" do
2972
+ expect(person.reload.addresses).to be_empty
2973
+ end
2974
+ end
2975
+ end
2976
+
2977
+ context "when the relation is empty" do
2978
+
2979
+ context "when providing no number" do
2980
+
2981
+ it "returns nil" do
2982
+ expect(person.addresses.pop).to be_nil
2983
+ end
2984
+ end
2985
+
2986
+ context "when providing a number" do
2987
+
2988
+ it "returns nil" do
2989
+ expect(person.addresses.pop(2)).to be_nil
2990
+ end
2991
+ end
2992
+ end
2993
+ end
2994
+
2995
+ describe "#shift" do
2996
+
2997
+ let(:person) do
2998
+ Person.create!
2999
+ end
3000
+
3001
+ context "when no argument is provided" do
3002
+
3003
+ let!(:address_one) do
3004
+ person.addresses.create!(street: "sonnenallee")
3005
+ end
3006
+
3007
+ let!(:address_two) do
3008
+ person.addresses.create!(street: "hermannstr")
3009
+ end
3010
+
3011
+ let!(:shifted) do
3012
+ person.addresses.shift
3013
+ end
3014
+
3015
+ it "returns the shifted document" do
3016
+ expect(shifted).to eq(address_one)
3017
+ end
3018
+
3019
+ it "removes the document from the relation" do
3020
+ expect(person.addresses).to eq([ address_two ])
3021
+ end
3022
+
3023
+ it "persists the shift" do
3024
+ expect(person.reload.addresses).to eq([ address_two ])
3025
+ end
3026
+ end
3027
+
3028
+ context "when an integer is provided" do
3029
+
3030
+ let!(:address_one) do
3031
+ person.addresses.create!(street: "sonnenallee")
3032
+ end
3033
+
3034
+ let!(:address_two) do
3035
+ person.addresses.create!(street: "hermannstr")
3036
+ end
3037
+
3038
+ context "when the number is zero" do
3039
+
3040
+ let!(:shifted) do
3041
+ person.addresses.shift(0)
3042
+ end
3043
+
3044
+ it "returns an empty array" do
3045
+ expect(shifted).to eq([])
3046
+ end
3047
+
3048
+ it "does not remove the document from the relation" do
3049
+ expect(person.addresses).to eq([ address_one, address_two ])
3050
+ end
3051
+
3052
+ it "does not persist the shift" do
3053
+ expect(person.reload.addresses).to eq([ address_one, address_two ])
3054
+ end
3055
+ end
3056
+
3057
+ context "when the number is not larger than the relation" do
3058
+
3059
+ let!(:shifted) do
3060
+ person.addresses.shift(2)
3061
+ end
3062
+
3063
+ it "returns the shifted documents" do
3064
+ expect(shifted).to eq([ address_one, address_two ])
3065
+ end
3066
+
3067
+ it "removes the document from the relation" do
3068
+ expect(person.addresses).to be_empty
3069
+ end
3070
+
3071
+ it "persists the shift" do
3072
+ expect(person.reload.addresses).to be_empty
3073
+ end
3074
+ end
3075
+
3076
+ context "when the number is larger than the relation" do
3077
+
3078
+ let!(:shifted) do
3079
+ person.addresses.shift(4)
3080
+ end
3081
+
3082
+ it "returns the shifted documents" do
3083
+ expect(shifted).to eq([ address_one, address_two ])
3084
+ end
3085
+
3086
+ it "removes the document from the relation" do
3087
+ expect(person.addresses).to be_empty
3088
+ end
3089
+
3090
+ it "persists the shift" do
3091
+ expect(person.reload.addresses).to be_empty
3092
+ end
3093
+ end
3094
+ end
3095
+
3096
+ context "when the relation is empty" do
3097
+
3098
+ context "when providing no number" do
3099
+
3100
+ it "returns nil" do
3101
+ expect(person.addresses.shift).to be_nil
3102
+ end
3103
+ end
3104
+
3105
+ context "when providing a number" do
3106
+
3107
+ it "returns nil" do
3108
+ expect(person.addresses.shift(2)).to be_nil
3109
+ end
3110
+ end
3111
+ end
3112
+ end
3113
+
3114
+ describe "#scoped" do
3115
+
3116
+ let(:person) do
3117
+ Person.new
3118
+ end
3119
+
3120
+ let(:scoped) do
3121
+ person.addresses.scoped
3122
+ end
3123
+
3124
+ it "returns the relation criteria" do
3125
+ expect(scoped).to be_a(Mongoid::Criteria)
3126
+ end
3127
+
3128
+ it "returns with an empty selector" do
3129
+ expect(scoped.selector).to be_empty
3130
+ end
3131
+ end
3132
+
3133
+ describe "#respond_to?" do
3134
+
3135
+ let(:person) do
3136
+ Person.new
3137
+ end
3138
+
3139
+ let(:addresses) do
3140
+ person.addresses
3141
+ end
3142
+
3143
+ Array.public_instance_methods.each do |method|
3144
+
3145
+ context "when checking #{method}" do
3146
+
3147
+ it "returns true" do
3148
+ expect(addresses.respond_to?(method)).to be true
3149
+ end
3150
+ end
3151
+ end
3152
+
3153
+ Mongoid::Association::Embedded::EmbedsMany::Proxy.public_instance_methods.each do |method|
3154
+
3155
+ context "when checking #{method}" do
3156
+
3157
+ it "returns true" do
3158
+ expect(addresses.respond_to?(method)).to be true
3159
+ end
3160
+ end
3161
+ end
3162
+
3163
+ Address.scopes.keys.each do |method|
3164
+
3165
+ context "when checking #{method}" do
3166
+
3167
+ it "returns true" do
3168
+ expect(addresses.respond_to?(method)).to be true
3169
+ end
3170
+ end
3171
+ end
3172
+
3173
+ it "supports 'include_private = boolean'" do
3174
+ expect { addresses.respond_to?(:Rational, true) }.not_to raise_error
3175
+ end
3176
+ end
3177
+
3178
+ [ :size, :length ].each do |method|
3179
+
3180
+ describe "##{method}" do
3181
+
3182
+ let(:person) do
3183
+ Person.create!
3184
+ end
3185
+
3186
+ before do
3187
+ person.addresses.create!(street: "Upper")
3188
+ person.addresses.build(street: "Bond")
3189
+ end
3190
+
3191
+ it "returns the number of persisted documents" do
3192
+ expect(person.addresses.send(method)).to eq(2)
3193
+ end
3194
+ end
3195
+ end
3196
+
3197
+ describe "#unscoped" do
3198
+
3199
+ let(:person) do
3200
+ Person.new
3201
+ end
3202
+
3203
+ let(:unscoped) do
3204
+ person.videos.unscoped
3205
+ end
3206
+
3207
+ it "returns the relation criteria" do
3208
+ expect(unscoped).to be_a(Mongoid::Criteria)
3209
+ end
3210
+
3211
+ it "returns with empty options" do
3212
+ expect(unscoped.options).to be_empty
3213
+ end
3214
+
3215
+ it "returns with an empty selector" do
3216
+ expect(unscoped.selector).to be_empty
3217
+ end
3218
+ end
3219
+
3220
+ describe "#update_all" do
3221
+
3222
+ context "when there are no documents present" do
3223
+
3224
+ let(:person) do
3225
+ Person.create!
3226
+ end
3227
+
3228
+ it "updates nothing" do
3229
+ expect(person.addresses.update_all(street: "test")).to be false
3230
+ end
3231
+ end
3232
+
3233
+ context "when documents are present" do
3234
+
3235
+ let(:person) do
3236
+ Person.create!
3237
+ end
3238
+
3239
+ let!(:address) do
3240
+ person.addresses.create!(street: "Hobrecht", number: 27)
3241
+ end
3242
+
3243
+ context "when updating with a where clause" do
3244
+
3245
+ before do
3246
+ person.addresses.
3247
+ where(street: "Hobrecht").
3248
+ update_all(number: 26, post_code: "12437")
3249
+ end
3250
+
3251
+ it "resets the matching dirty flags" do
3252
+ expect(address).to_not be_changed
3253
+ end
3254
+
3255
+ it "updates the first field" do
3256
+ expect(address.reload.number).to eq(26)
3257
+ end
3258
+
3259
+ it "updates the second field" do
3260
+ expect(address.reload.post_code).to eq("12437")
3261
+ end
3262
+
3263
+ it "does not wipe out other fields" do
3264
+ expect(address.reload.street).to eq("Hobrecht")
3265
+ end
3266
+ end
3267
+ end
3268
+ end
3269
+
3270
+ context "when deeply embedding documents" do
3271
+
3272
+ context "when updating the bottom level" do
3273
+
3274
+ let!(:person) do
3275
+ Person.create!
3276
+ end
3277
+
3278
+ let!(:address) do
3279
+ person.addresses.create!(street: "Joachimstr")
3280
+ end
3281
+
3282
+ let!(:location) do
3283
+ address.locations.create!(name: "vacation", number: 0)
3284
+ address.locations.create!(name: "work", number: 3)
3285
+ end
3286
+
3287
+ context "when updating with replacement of embedded array" do
3288
+
3289
+ context "when updating with a hash" do
3290
+
3291
+ before do
3292
+ address.update_attributes!(locations: [{ name: "home" }])
3293
+ end
3294
+
3295
+ it "updates the attributes" do
3296
+ expect(address.locations.first.name).to eq("home")
3297
+ end
3298
+
3299
+ it "overwrites the existing documents" do
3300
+ expect(address.locations.count).to eq(1)
3301
+ end
3302
+
3303
+ it "persists the changes" do
3304
+ expect(address.reload.locations.count).to eq(1)
3305
+ end
3306
+ end
3307
+ end
3308
+
3309
+ context "when updating a field in a document of the embedded array" do
3310
+
3311
+ before do
3312
+ location.number = 7
3313
+ location.save!
3314
+ end
3315
+
3316
+ let(:updated_location_number) do
3317
+ person.reload.addresses.first.locations.find(location.id).number
3318
+ end
3319
+
3320
+ let(:updated_location_name) do
3321
+ person.reload.addresses.first.locations.find(location.id).name
3322
+ end
3323
+
3324
+ it "the change is persisted" do
3325
+ expect(updated_location_number).to eq(7)
3326
+ end
3327
+
3328
+ it "the other field remains unaffected" do
3329
+ expect(updated_location_name).to eq("work")
3330
+ end
3331
+
3332
+ end
3333
+ end
3334
+
3335
+ context "when building the tree through hashes" do
3336
+
3337
+ let(:circus) do
3338
+ Circus.new(hash)
3339
+ end
3340
+
3341
+ let(:animal) do
3342
+ circus.animals.first
3343
+ end
3344
+
3345
+ let(:animal_name) do
3346
+ "Lion"
3347
+ end
3348
+
3349
+ let(:tag_list) do
3350
+ "tigers, bears, oh my"
3351
+ end
3352
+
3353
+ context "when the hash uses stringified keys" do
3354
+
3355
+ let(:hash) do
3356
+ { 'animals' => [{ 'name' => animal_name, 'tag_list' => tag_list }] }
3357
+ end
3358
+
3359
+ it "sets up the hierarchy" do
3360
+ expect(animal.circus).to eq(circus)
3361
+ end
3362
+
3363
+ it "assigns the attributes" do
3364
+ expect(animal.name).to eq(animal_name)
3365
+ end
3366
+
3367
+ it "uses custom writer methods" do
3368
+ expect(animal.tag_list).to eq(tag_list)
3369
+ end
3370
+ end
3371
+
3372
+ context "when the hash uses symbolized keys" do
3373
+
3374
+ let(:hash) do
3375
+ { animals: [{ name: animal_name, tag_list: tag_list }] }
3376
+ end
3377
+
3378
+ it "sets up the hierarchy" do
3379
+ expect(animal.circus).to eq(circus)
3380
+ end
3381
+
3382
+ it "assigns the attributes" do
3383
+ expect(animal.name).to eq(animal_name)
3384
+ end
3385
+
3386
+ it "uses custom writer methods" do
3387
+ expect(animal.tag_list).to eq(tag_list)
3388
+ end
3389
+ end
3390
+ end
3391
+
3392
+ context "when building the tree through pushes" do
3393
+
3394
+ let(:quiz) do
3395
+ Quiz.new
3396
+ end
3397
+
3398
+ let(:page) do
3399
+ Page.new
3400
+ end
3401
+
3402
+ let(:page_question) do
3403
+ PageQuestion.new
3404
+ end
3405
+
3406
+ before do
3407
+ quiz.pages << page
3408
+ page.page_questions << page_question
3409
+ end
3410
+
3411
+ let(:question) do
3412
+ quiz.pages.first.page_questions.first
3413
+ end
3414
+
3415
+ it "sets up the hierarchy" do
3416
+ expect(question).to eq(page_question)
3417
+ end
3418
+ end
3419
+
3420
+ context "when building the tree through builds" do
3421
+
3422
+ let!(:quiz) do
3423
+ Quiz.new
3424
+ end
3425
+
3426
+ let!(:page) do
3427
+ quiz.pages.build
3428
+ end
3429
+
3430
+ let!(:page_question) do
3431
+ page.page_questions.build
3432
+ end
3433
+
3434
+ let(:question) do
3435
+ quiz.pages.first.page_questions.first
3436
+ end
3437
+
3438
+ it "sets up the hierarchy" do
3439
+ expect(question).to eq(page_question)
3440
+ end
3441
+ end
3442
+
3443
+ context "when creating a persisted tree" do
3444
+
3445
+ let(:quiz) do
3446
+ Quiz.create!
3447
+ end
3448
+
3449
+ let(:page) do
3450
+ Page.new
3451
+ end
3452
+
3453
+ let(:page_question) do
3454
+ PageQuestion.new
3455
+ end
3456
+
3457
+ let(:question) do
3458
+ quiz.pages.first.page_questions.first
3459
+ end
3460
+
3461
+ before do
3462
+ quiz.pages << page
3463
+ page.page_questions << page_question
3464
+ end
3465
+
3466
+ it "sets up the hierarchy" do
3467
+ expect(question).to eq(page_question)
3468
+ end
3469
+
3470
+ context "when reloading" do
3471
+
3472
+ let(:from_db) do
3473
+ quiz.reload
3474
+ end
3475
+
3476
+ let(:reloaded_question) do
3477
+ from_db.pages.first.page_questions.first
3478
+ end
3479
+
3480
+ it "reloads the entire tree" do
3481
+ expect(reloaded_question).to eq(question)
3482
+ end
3483
+ end
3484
+ end
3485
+ end
3486
+
3487
+ context "when deeply nesting documents" do
3488
+
3489
+ context "when all documents are new" do
3490
+
3491
+ let(:person) do
3492
+ Person.new
3493
+ end
3494
+
3495
+ let(:address) do
3496
+ Address.new
3497
+ end
3498
+
3499
+ let(:location) do
3500
+ Location.new
3501
+ end
3502
+
3503
+ before do
3504
+ address.locations << location
3505
+ person.addresses << address
3506
+ end
3507
+
3508
+ context "when saving the root" do
3509
+
3510
+ before do
3511
+ person.save!
3512
+ end
3513
+
3514
+ it "persists the first level document" do
3515
+ expect(person.reload.addresses.first).to eq(address)
3516
+ end
3517
+
3518
+ it "persists the second level document" do
3519
+ expect(person.reload.addresses[0].locations).to eq([ location ])
3520
+ end
3521
+ end
3522
+ end
3523
+ end
3524
+
3525
+ context "when attempting nil pushes and substitutes" do
3526
+
3527
+ let(:home_phone) do
3528
+ Phone.new(number: "555-555-5555")
3529
+ end
3530
+
3531
+ let(:office_phone) do
3532
+ Phone.new(number: "666-666-6666")
3533
+ end
3534
+
3535
+ describe "replacing the entire embedded list" do
3536
+
3537
+ context "when an embeds many relationship contains nil as the first item" do
3538
+
3539
+ let(:person) do
3540
+ Person.create!
3541
+ end
3542
+
3543
+ let(:phone_list) do
3544
+ [nil, home_phone, office_phone]
3545
+ end
3546
+
3547
+ before do
3548
+ person.phone_numbers = phone_list
3549
+ person.save!
3550
+ end
3551
+
3552
+ it "ignores the nil and persist the remaining items" do
3553
+ reloaded = Person.find(person.id)
3554
+ expect(reloaded.phone_numbers).to eq([ home_phone, office_phone ])
3555
+ end
3556
+ end
3557
+
3558
+ context "when an embeds many relationship contains nil in the middle of the list" do
3559
+
3560
+ let(:person) do
3561
+ Person.create!
3562
+ end
3563
+
3564
+ let(:phone_list) do
3565
+ [home_phone, nil, office_phone]
3566
+ end
3567
+
3568
+ before do
3569
+ person.phone_numbers = phone_list
3570
+ person.save!
3571
+ end
3572
+
3573
+ it "ignores the nil and persist the remaining items" do
3574
+ reloaded = Person.find(person.id)
3575
+ expect(reloaded.phone_numbers).to eq([ home_phone, office_phone ])
3576
+ end
3577
+ end
3578
+
3579
+ context "when an embeds many relationship contains nil at the end of the list" do
3580
+
3581
+ let(:person) do
3582
+ Person.create!
3583
+ end
3584
+
3585
+ let(:phone_list) do
3586
+ [home_phone, office_phone, nil]
3587
+ end
3588
+
3589
+ before do
3590
+ person.phone_numbers = phone_list
3591
+ person.save!
3592
+ end
3593
+
3594
+ it "ignores the nil and persist the remaining items" do
3595
+ reloaded = Person.find(person.id)
3596
+ expect(reloaded.phone_numbers).to eq([ home_phone, office_phone ])
3597
+ end
3598
+ end
3599
+ end
3600
+
3601
+ describe "appending to the embedded list" do
3602
+
3603
+ context "when appending nil to the first position in an embedded list" do
3604
+
3605
+ let(:person) do
3606
+ Person.create! phone_numbers: []
3607
+ end
3608
+
3609
+ before do
3610
+ person.phone_numbers << nil
3611
+ person.phone_numbers << home_phone
3612
+ person.phone_numbers << office_phone
3613
+ person.save!
3614
+ end
3615
+
3616
+ it "ignores the nil and persist the remaining items" do
3617
+ reloaded = Person.find(person.id)
3618
+ expect(reloaded.phone_numbers).to eq(person.phone_numbers)
3619
+ end
3620
+ end
3621
+
3622
+ context "when appending nil into the middle of an embedded list" do
3623
+
3624
+ let(:person) do
3625
+ Person.create! phone_numbers: []
3626
+ end
3627
+
3628
+ before do
3629
+ person.phone_numbers << home_phone
3630
+ person.phone_numbers << nil
3631
+ person.phone_numbers << office_phone
3632
+ person.save!
3633
+ end
3634
+
3635
+ it "ignores the nil and persist the remaining items" do
3636
+ reloaded = Person.find(person.id)
3637
+ expect(reloaded.phone_numbers).to eq(person.phone_numbers)
3638
+ end
3639
+ end
3640
+
3641
+ context "when appending nil to the end of an embedded list" do
3642
+
3643
+ let(:person) do
3644
+ Person.create! phone_numbers: []
3645
+ end
3646
+
3647
+ before do
3648
+ person.phone_numbers << home_phone
3649
+ person.phone_numbers << office_phone
3650
+ person.phone_numbers << nil
3651
+ person.save!
3652
+ end
3653
+
3654
+ it "ignores the nil and persist the remaining items" do
3655
+ reloaded = Person.find(person.id)
3656
+ expect(reloaded.phone_numbers).to eq(person.phone_numbers)
3657
+ end
3658
+ end
3659
+ end
3660
+ end
3661
+
3662
+ context "when accessing the parent in a destroy callback" do
3663
+
3664
+ let!(:league) do
3665
+ League.create!
3666
+ end
3667
+
3668
+ let!(:division) do
3669
+ league.divisions.create!
3670
+ end
3671
+
3672
+ before do
3673
+ league.destroy
3674
+ end
3675
+
3676
+ it "retains the reference to the parent" do
3677
+ expect(league.name).to eq("Destroyed")
3678
+ end
3679
+ end
3680
+
3681
+ context "when updating the parent with all attributes" do
3682
+
3683
+ let!(:person) do
3684
+ Person.create!
3685
+ end
3686
+
3687
+ let!(:address) do
3688
+ person.addresses.create!
3689
+ end
3690
+
3691
+ before do
3692
+ person.update_attributes!(person.attributes)
3693
+ end
3694
+
3695
+ it "does not duplicate the embedded documents" do
3696
+ expect(person.addresses).to eq([ address ])
3697
+ end
3698
+
3699
+ it "does not persist duplicate embedded documents" do
3700
+ expect(person.reload.addresses).to eq([ address ])
3701
+ end
3702
+ end
3703
+
3704
+ context "when embedding children named versions" do
3705
+
3706
+ let(:acolyte) do
3707
+ Acolyte.create!(name: "test")
3708
+ end
3709
+
3710
+ context "when creating a child" do
3711
+
3712
+ let(:version) do
3713
+ acolyte.versions.create!(number: 1)
3714
+ end
3715
+
3716
+ it "allows the operation" do
3717
+ expect(version.number).to eq(1)
3718
+ end
3719
+
3720
+ context "when reloading the parent" do
3721
+
3722
+ let(:from_db) do
3723
+ acolyte.reload
3724
+ end
3725
+
3726
+ it "saves the child versions" do
3727
+ expect(from_db.versions).to eq([ version ])
3728
+ end
3729
+ end
3730
+ end
3731
+ end
3732
+
3733
+ context "when validating the parent before accessing the child" do
3734
+
3735
+ let!(:account) do
3736
+ Account.new(name: "Testing").tap do |acct|
3737
+ acct.memberships.build
3738
+ acct.save!
3739
+ end
3740
+ end
3741
+
3742
+ let(:from_db) do
3743
+ Account.first
3744
+ end
3745
+
3746
+ context "when saving" do
3747
+
3748
+ before do
3749
+ account.name = ""
3750
+ end
3751
+
3752
+ it "does not lose the parent reference" do
3753
+ expect(account.save).to eq false
3754
+ expect(from_db.memberships.first.account).to eq(account)
3755
+ end
3756
+ end
3757
+
3758
+ context "when updating attributes" do
3759
+
3760
+ before do
3761
+ from_db.update_attributes(name: "")
3762
+ end
3763
+
3764
+ it "does not lose the parent reference" do
3765
+ expect(from_db.memberships.first.account).to eq(account)
3766
+ end
3767
+ end
3768
+ end
3769
+
3770
+ context "when moving an embedded document from one parent to another" do
3771
+
3772
+ let!(:person_one) do
3773
+ Person.create!
3774
+ end
3775
+
3776
+ let!(:person_two) do
3777
+ Person.create!
3778
+ end
3779
+
3780
+ let!(:address) do
3781
+ person_one.addresses.create!(street: "Kudamm")
3782
+ end
3783
+
3784
+ before do
3785
+ person_two.addresses << address
3786
+ end
3787
+
3788
+ it "adds the document to the new paarent" do
3789
+ expect(person_two.addresses).to eq([ address ])
3790
+ end
3791
+
3792
+ it "sets the new parent on the document" do
3793
+ expect(address._parent).to eq(person_two)
3794
+ end
3795
+
3796
+ context "when reloading the documents" do
3797
+
3798
+ before do
3799
+ person_one.reload
3800
+ person_two.reload
3801
+ end
3802
+
3803
+ it "persists the change to the new parent" do
3804
+ expect(person_two.addresses).to eq([ address ])
3805
+ end
3806
+
3807
+ it "keeps the address on the previous document" do
3808
+ expect(person_one.addresses).to eq([ address ])
3809
+ end
3810
+ end
3811
+ end
3812
+
3813
+ context "when the relation has a default scope" do
3814
+
3815
+ let!(:person) do
3816
+ Person.create!
3817
+ end
3818
+
3819
+ context "when the default scope is a sort" do
3820
+
3821
+ let(:cough) do
3822
+ Symptom.new(name: "cough")
3823
+ end
3824
+
3825
+ let(:headache) do
3826
+ Symptom.new(name: "headache")
3827
+ end
3828
+
3829
+ let(:nausea) do
3830
+ Symptom.new(name: "nausea")
3831
+ end
3832
+
3833
+ before do
3834
+ person.symptoms.concat([ nausea, cough, headache ])
3835
+ end
3836
+
3837
+ context "when accessing the relation" do
3838
+
3839
+ let(:symptoms) do
3840
+ person.reload.symptoms
3841
+ end
3842
+
3843
+ it "applies the default scope" do
3844
+ expect(symptoms).to eq([ cough, headache, nausea ])
3845
+ end
3846
+ end
3847
+
3848
+ context "when modifying the relation" do
3849
+
3850
+ let(:constipation) do
3851
+ Symptom.new(name: "constipation")
3852
+ end
3853
+
3854
+ before do
3855
+ person.symptoms.push(constipation)
3856
+ end
3857
+
3858
+ context "when reloading" do
3859
+
3860
+ let(:symptoms) do
3861
+ person.reload.symptoms
3862
+ end
3863
+
3864
+ it "applies the default scope" do
3865
+ expect(symptoms).to eq([ constipation, cough, headache, nausea ])
3866
+ end
3867
+ end
3868
+ end
3869
+
3870
+ context "when unscoping the relation" do
3871
+
3872
+ let(:unscoped) do
3873
+ person.reload.symptoms.unscoped
3874
+ end
3875
+
3876
+ it "removes the default scope" do
3877
+ expect(unscoped).to eq([ nausea, cough, headache ])
3878
+ end
3879
+ end
3880
+ end
3881
+ end
3882
+
3883
+ context "when indexing the documents" do
3884
+
3885
+ let!(:person) do
3886
+ Person.create!
3887
+ end
3888
+
3889
+ context "when the documents have a limiting default scope" do
3890
+
3891
+ let(:active) do
3892
+ Appointment.new
3893
+ end
3894
+
3895
+ let(:inactive) do
3896
+ Appointment.new(active: false)
3897
+ end
3898
+
3899
+ before do
3900
+ person.appointments.concat([ inactive, active ])
3901
+ end
3902
+
3903
+ let(:relation) do
3904
+ person.reload.appointments
3905
+ end
3906
+
3907
+ it "retains the unscoped index for the excluded document" do
3908
+ expect(relation.send(:_unscoped).first._index).to eq(0)
3909
+ end
3910
+
3911
+ it "retains the unscoped index for the included document" do
3912
+ expect(relation.first._index).to eq(1)
3913
+ end
3914
+
3915
+ context "when a reindexing operation occurs" do
3916
+
3917
+ before do
3918
+ relation.send(:reindex)
3919
+ end
3920
+
3921
+ it "retains the unscoped index for the excluded document" do
3922
+ expect(relation.send(:_unscoped).first._index).to eq(0)
3923
+ end
3924
+
3925
+ it "retains the unscoped index for the included document" do
3926
+ expect(relation.first._index).to eq(1)
3927
+ end
3928
+ end
3929
+ end
3930
+ end
3931
+
3932
+ context "when the embedded document has an array field" do
3933
+
3934
+ let!(:person) do
3935
+ Person.create!
3936
+ end
3937
+
3938
+ let!(:video) do
3939
+ person.videos.create!
3940
+ end
3941
+
3942
+ context "when saving the array on a persisted document" do
3943
+
3944
+ before do
3945
+ video.genres = [ "horror", "scifi" ]
3946
+ video.save!
3947
+ end
3948
+
3949
+ it "sets the value" do
3950
+ expect(video.genres).to eq([ "horror", "scifi" ])
3951
+ end
3952
+
3953
+ it "persists the value" do
3954
+ expect(video.reload.genres).to eq([ "horror", "scifi" ])
3955
+ end
3956
+
3957
+ context "when reloading the parent" do
3958
+
3959
+ let!(:loaded_person) do
3960
+ Person.find(person.id)
3961
+ end
3962
+
3963
+ let!(:loaded_video) do
3964
+ loaded_person.videos.find(video.id)
3965
+ end
3966
+
3967
+ context "when writing a new array value" do
3968
+
3969
+ before do
3970
+ loaded_video.genres = [ "comedy" ]
3971
+ loaded_video.save!
3972
+ end
3973
+
3974
+ it "sets the new value" do
3975
+ expect(loaded_video.genres).to eq([ "comedy" ])
3976
+ end
3977
+
3978
+ it "persists the new value" do
3979
+ expect(loaded_video.reload.genres).to eq([ "comedy" ])
3980
+ end
3981
+ end
3982
+ end
3983
+ end
3984
+ end
3985
+
3986
+ context "when destroying an embedded document" do
3987
+
3988
+ let(:person) do
3989
+ Person.create!
3990
+ end
3991
+
3992
+ let!(:address_one) do
3993
+ person.addresses.create!(street: "hobrecht")
3994
+ end
3995
+
3996
+ let!(:address_two) do
3997
+ person.addresses.create!(street: "maybachufer")
3998
+ end
3999
+
4000
+ before do
4001
+ address_one.destroy
4002
+ end
4003
+
4004
+ it "destroys the document" do
4005
+ expect(address_one).to be_destroyed
4006
+ end
4007
+
4008
+ it "reindexes the relation" do
4009
+ expect(address_two._index).to eq(0)
4010
+ end
4011
+
4012
+ it "removes the document from the unscoped" do
4013
+ expect(person.addresses.send(:_unscoped)).to_not include(address_one)
4014
+ end
4015
+
4016
+ context "when subsequently updating the next document" do
4017
+
4018
+ before do
4019
+ address_two.update_attribute(:number, 10)
4020
+ end
4021
+
4022
+ let(:addresses) do
4023
+ person.reload.addresses
4024
+ end
4025
+
4026
+ it "updates the correct document" do
4027
+ expect(addresses.first.number).to eq(10)
4028
+ end
4029
+
4030
+ it "does not add additional documents" do
4031
+ expect(addresses.count).to eq(1)
4032
+ end
4033
+ end
4034
+ end
4035
+
4036
+ context "when destroying a document with multiple nil _ids" do
4037
+ let(:congress) { EmmCongress.create! }
4038
+
4039
+ before do
4040
+ congress.legislators << EmmLegislator.new(_id: nil, a: 1)
4041
+ congress.legislators << EmmLegislator.new(_id: nil, a: 2)
4042
+
4043
+ congress.legislators[0].destroy
4044
+ end
4045
+
4046
+ it "deletes the correct document locally" do
4047
+ pending "MONGOID-5394"
4048
+ expect(congress.legislators.length).to eq(1)
4049
+ expect(congress.legislators.first.a).to eq(1)
4050
+ end
4051
+
4052
+ it "only deletes the one document" do
4053
+ pending "MONGOID-5394"
4054
+ expect(congress.reload.legislators.length).to eq(1)
4055
+ end
4056
+ end
4057
+
4058
+ context "when adding a document" do
4059
+
4060
+ let(:person) do
4061
+ Person.new
4062
+ end
4063
+
4064
+ let(:address_one) do
4065
+ Address.new(street: "hobrecht")
4066
+ end
4067
+
4068
+ let(:first_add) do
4069
+ person.addresses.push(address_one)
4070
+ end
4071
+
4072
+ context "when chaining a second add" do
4073
+
4074
+ let(:address_two) do
4075
+ Address.new(street: "friedel")
4076
+ end
4077
+
4078
+ let(:result) do
4079
+ first_add.push(address_two)
4080
+ end
4081
+
4082
+ it "adds both documents" do
4083
+ expect(result).to eq([ address_one, address_two ])
4084
+ end
4085
+ end
4086
+ end
4087
+
4088
+ context "when the association has an order defined" do
4089
+
4090
+ let(:person) do
4091
+ Person.create!
4092
+ end
4093
+
4094
+ let(:message_one) do
4095
+ Message.new(priority: 5, body: 'This is a test')
4096
+ end
4097
+
4098
+ let(:message_two) do
4099
+ Message.new(priority: 10, body: 'This is a test')
4100
+ end
4101
+
4102
+ let(:message_three) do
4103
+ Message.new(priority: 20, body: 'Zee test')
4104
+ end
4105
+
4106
+ before do
4107
+ person.messages.push(message_one, message_two, message_three)
4108
+ end
4109
+
4110
+ let(:criteria) do
4111
+ person.messages.order_by(:body.asc, :priority.desc)
4112
+ end
4113
+
4114
+ it "properly orders the related objects" do
4115
+ expect(criteria.to_a).to eq([message_two, message_one, message_three])
4116
+ end
4117
+
4118
+ context "when the field to order on is an array of documents" do
4119
+
4120
+ before do
4121
+ person.aliases = [ { name: "A", priority: 3 }, { name: "B", priority: 4 }]
4122
+ person.save!
4123
+ end
4124
+
4125
+ let!(:person2) do
4126
+ Person.create!( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
4127
+ end
4128
+
4129
+ it "allows ordering on a key of an embedded document" do
4130
+ expect(Person.all.order_by("aliases.0.priority" => 1).first).to eq(person2)
4131
+ end
4132
+ end
4133
+ end
4134
+
4135
+ context "when using dot notation in a criteria" do
4136
+
4137
+ let(:person) do
4138
+ Person.new
4139
+ end
4140
+
4141
+ let!(:address) do
4142
+ person.addresses.build(street: "hobrecht")
4143
+ end
4144
+
4145
+ let!(:location) do
4146
+ address.locations.build(number: 5)
4147
+ end
4148
+
4149
+ let(:criteria) do
4150
+ person.addresses.where("locations.number" => { "$gt" => 3 })
4151
+ end
4152
+
4153
+ it "allows the dot notation criteria" do
4154
+ expect(criteria).to eq([ address ])
4155
+ end
4156
+ end
4157
+
4158
+ context "when updating multiple levels in one update" do
4159
+
4160
+ let!(:person) do
4161
+ Person.create!(
4162
+ addresses: [
4163
+ { locations: [{ name: "home" }]}
4164
+ ]
4165
+ )
4166
+ end
4167
+
4168
+ context "when updating with hashes" do
4169
+
4170
+ let(:from_db) do
4171
+ Person.find(person.id)
4172
+ end
4173
+
4174
+ before do
4175
+ from_db.update_attributes!(
4176
+ addresses: [
4177
+ { locations: [{ name: "work" }]}
4178
+ ]
4179
+ )
4180
+ end
4181
+
4182
+ let(:updated) do
4183
+ person.reload.addresses.first.locations.first
4184
+ end
4185
+
4186
+ it "updates the nested document" do
4187
+ expect(updated.name).to eq("work")
4188
+ end
4189
+ end
4190
+ end
4191
+
4192
+ context "when the embedded relation sorts on a boolean" do
4193
+
4194
+ let(:circuit) do
4195
+ Circuit.create!
4196
+ end
4197
+
4198
+ let!(:bus_one) do
4199
+ circuit.buses.create!(saturday: true)
4200
+ end
4201
+
4202
+ let!(:bus_two) do
4203
+ circuit.buses.create!(saturday: false)
4204
+ end
4205
+
4206
+ it "orders properly with the boolean" do
4207
+ expect(circuit.reload.buses).to eq([ bus_two, bus_one ])
4208
+ end
4209
+ end
4210
+
4211
+ context "when batch replacing multiple relations in a single update" do
4212
+
4213
+ let(:document) do
4214
+ Person.create!
4215
+ end
4216
+
4217
+ let(:person) do
4218
+ Person.find(document.id)
4219
+ end
4220
+
4221
+ let!(:symptom_one) do
4222
+ person.symptoms.create!
4223
+ end
4224
+
4225
+ let!(:symptom_two) do
4226
+ person.symptoms.create!
4227
+ end
4228
+
4229
+ let!(:appointment_one) do
4230
+ person.appointments.create!
4231
+ end
4232
+
4233
+ let!(:appointment_two) do
4234
+ person.appointments.create!
4235
+ end
4236
+
4237
+ before do
4238
+ person.update_attributes!(
4239
+ appointments: [ appointment_one.as_document, appointment_two.as_document ],
4240
+ symptoms: [ symptom_one.as_document, symptom_two.as_document ]
4241
+ )
4242
+ end
4243
+
4244
+ it "does not duplicate the first relation" do
4245
+ expect(person.reload.symptoms.count).to eq(2)
4246
+ end
4247
+
4248
+ it "does not duplicate the second relation" do
4249
+ expect(person.reload.appointments.count).to eq(2)
4250
+ end
4251
+ end
4252
+
4253
+ context "when pushing with a before_add callback" do
4254
+
4255
+ let(:artist) do
4256
+ Artist.new
4257
+ end
4258
+
4259
+ let(:song) do
4260
+ Song.new
4261
+ end
4262
+
4263
+ context "when no errors are raised" do
4264
+
4265
+ before do
4266
+ artist.songs << song
4267
+ end
4268
+
4269
+ it "executes the callback" do
4270
+ expect(artist.before_add_called).to be true
4271
+ end
4272
+
4273
+ it "executes the callback as proc" do
4274
+ expect(song.before_add_called).to be true
4275
+ end
4276
+
4277
+ it "adds the document to the relation" do
4278
+ expect(artist.songs).to eq([song])
4279
+ end
4280
+ end
4281
+
4282
+ context "with errors" do
4283
+
4284
+ before do
4285
+ expect(artist).to receive(:before_add_song).and_raise
4286
+ begin; artist.songs << song; rescue; end
4287
+ end
4288
+
4289
+ it "does not add the document to the relation" do
4290
+ expect(artist.songs).to be_empty
4291
+ end
4292
+ end
4293
+ end
4294
+
4295
+ context "when pushing with an after_add callback" do
4296
+
4297
+ let(:artist) do
4298
+ Artist.new
4299
+ end
4300
+
4301
+ let(:label) do
4302
+ Label.new
4303
+ end
4304
+
4305
+ it "executes the callback" do
4306
+ artist.labels << label
4307
+ expect(artist.after_add_called).to be true
4308
+ end
4309
+
4310
+ context "when errors are raised" do
4311
+
4312
+ before do
4313
+ expect(artist).to receive(:after_add_label).and_raise
4314
+ begin; artist.labels << label; rescue; end
4315
+ end
4316
+
4317
+ it "adds the document to the relation" do
4318
+ expect(artist.labels).to eq([ label ])
4319
+ end
4320
+ end
4321
+ end
4322
+
4323
+ context "#delete, or #clear, or #pop, or #shift with before_remove callback" do
4324
+
4325
+ let(:artist) do
4326
+ Artist.new
4327
+ end
4328
+
4329
+ let(:song) do
4330
+ Song.new
4331
+ end
4332
+
4333
+ before do
4334
+ artist.songs << song
4335
+ end
4336
+
4337
+ context "when no errors are raised" do
4338
+
4339
+ describe "#delete" do
4340
+
4341
+ before do
4342
+ artist.songs.delete(song)
4343
+ end
4344
+
4345
+ it "executes the callback" do
4346
+ expect(artist.before_remove_embedded_called).to be true
4347
+ end
4348
+
4349
+ it "removes the document from the relation" do
4350
+ expect(artist.songs).to be_empty
4351
+ end
4352
+ end
4353
+
4354
+ describe "#clear" do
4355
+
4356
+ before do
4357
+ artist.songs.clear
4358
+ end
4359
+
4360
+ it "executes the callback" do
4361
+ expect(artist.before_remove_embedded_called).to be true
4362
+ end
4363
+
4364
+ it "shoud clear the relation" do
4365
+ expect(artist.songs).to be_empty
4366
+ end
4367
+ end
4368
+
4369
+ describe "#pop" do
4370
+
4371
+ before do
4372
+ artist.songs.pop
4373
+ end
4374
+
4375
+ it "executes the callback" do
4376
+ artist.songs.pop
4377
+ expect(artist.before_remove_embedded_called).to be true
4378
+ end
4379
+ end
4380
+
4381
+ describe "#shift" do
4382
+
4383
+ before do
4384
+ artist.songs.shift
4385
+ end
4386
+
4387
+ it "executes the callback" do
4388
+ artist.songs.shift
4389
+ expect(artist.before_remove_embedded_called).to be true
4390
+ end
4391
+ end
4392
+ end
4393
+
4394
+ context "when errors are raised" do
4395
+
4396
+ before do
4397
+ expect(artist).to receive(:before_remove_song).and_raise
4398
+ end
4399
+
4400
+ describe "#delete" do
4401
+
4402
+ it "does not remove the document from the relation" do
4403
+ begin; artist.songs.delete(song); rescue; end
4404
+ expect(artist.songs).to eq([ song ])
4405
+ end
4406
+ end
4407
+
4408
+ describe "#clear" do
4409
+
4410
+ before do
4411
+ begin; artist.songs.clear; rescue; end
4412
+ end
4413
+
4414
+ it "removes the documents from the relation" do
4415
+ expect(artist.songs).to eq([ song ])
4416
+ end
4417
+ end
4418
+
4419
+ describe "#pop" do
4420
+
4421
+ before do
4422
+ begin; artist.songs.pop; rescue; end
4423
+ end
4424
+
4425
+ it "should remove from collection" do
4426
+ expect(artist.songs).to eq([ song ])
4427
+ end
4428
+ end
4429
+
4430
+ describe "#shift" do
4431
+
4432
+ before do
4433
+ begin; artist.songs.shift; rescue; end
4434
+ end
4435
+
4436
+ it "should remove from collection" do
4437
+ expect(artist.songs).to eq([ song ])
4438
+ end
4439
+ end
4440
+ end
4441
+ end
4442
+
4443
+ context "#delete, or #clear, or #pop, or #shift with after_remove callback" do
4444
+
4445
+ let(:artist) do
4446
+ Artist.new
4447
+ end
4448
+
4449
+ let(:label) do
4450
+ Label.new
4451
+ end
4452
+
4453
+ before do
4454
+ artist.labels << label
4455
+ end
4456
+
4457
+ context "when no errors are raised" do
4458
+
4459
+ describe "#delete" do
4460
+ before do
4461
+ artist.labels.delete(label)
4462
+ end
4463
+
4464
+ it "executes the callback" do
4465
+ expect(artist.after_remove_embedded_called).to be true
4466
+ end
4467
+ end
4468
+
4469
+ describe "#clear" do
4470
+
4471
+ before do
4472
+ artist.labels.clear
4473
+ end
4474
+
4475
+ it "executes the callback" do
4476
+ artist.labels.clear
4477
+ expect(artist.after_remove_embedded_called).to be true
4478
+ end
4479
+ end
4480
+
4481
+ describe "#pop" do
4482
+
4483
+ before do
4484
+ artist.labels.pop
4485
+ end
4486
+
4487
+ it "executes the callback" do
4488
+ artist.labels.pop
4489
+ expect(artist.after_remove_embedded_called).to be true
4490
+ end
4491
+ end
4492
+
4493
+ describe "#shift" do
4494
+
4495
+ before do
4496
+ artist.labels.shift
4497
+ end
4498
+
4499
+ it "executes the callback" do
4500
+ artist.labels.shift
4501
+ expect(artist.after_remove_embedded_called).to be true
4502
+ end
4503
+ end
4504
+ end
4505
+
4506
+ context "when errors are raised" do
4507
+
4508
+ before do
4509
+ expect(artist).to receive(:after_remove_label).and_raise
4510
+ end
4511
+
4512
+ describe "#delete" do
4513
+
4514
+ before do
4515
+ begin; artist.labels.delete(label); rescue; end
4516
+ end
4517
+
4518
+ it "removes the document from the relation" do
4519
+ expect(artist.labels).to be_empty
4520
+ end
4521
+ end
4522
+
4523
+ describe "#clear" do
4524
+
4525
+ before do
4526
+ begin; artist.labels.clear; rescue; end
4527
+ end
4528
+
4529
+ it "should remove from collection" do
4530
+ expect(artist.labels).to be_empty
4531
+ end
4532
+ end
4533
+
4534
+ describe "#pop" do
4535
+
4536
+ before do
4537
+ begin; artist.labels.pop; rescue; end
4538
+ end
4539
+
4540
+ it "should remove from collection" do
4541
+ expect(artist.labels).to be_empty
4542
+ end
4543
+ end
4544
+
4545
+ describe "#shift" do
4546
+
4547
+ before do
4548
+ begin; artist.labels.shift; rescue; end
4549
+ end
4550
+
4551
+ it "should remove from collection" do
4552
+ expect(artist.labels).to be_empty
4553
+ end
4554
+ end
4555
+ end
4556
+ end
4557
+
4558
+ context "when saving at the parent level" do
4559
+
4560
+ let!(:server) do
4561
+ Server.new(name: "staging")
4562
+ end
4563
+
4564
+ let!(:filesystem) do
4565
+ server.filesystems.build
4566
+ end
4567
+
4568
+ context "when the parent has an after create callback" do
4569
+
4570
+ before do
4571
+ server.save!
4572
+ end
4573
+
4574
+ it "does not push the embedded documents twice" do
4575
+ expect(server.reload.filesystems.count).to eq(1)
4576
+ end
4577
+ end
4578
+ end
4579
+
4580
+ context "when embedded documents are stored without ids" do
4581
+
4582
+ let!(:band) do
4583
+ Band.create!(name: "Moderat")
4584
+ end
4585
+
4586
+ before do
4587
+ band.collection.
4588
+ find(_id: band.id).
4589
+ update_one("$set" => { records: [{ name: "Moderat" }]})
4590
+ end
4591
+
4592
+ context "when loading the documents" do
4593
+
4594
+ before do
4595
+ band.reload
4596
+ end
4597
+
4598
+ let(:record) do
4599
+ band.records.first
4600
+ end
4601
+
4602
+ it "creates proper documents from the db" do
4603
+ expect(record.name).to eq("Moderat")
4604
+ end
4605
+
4606
+ it "assigns ids to the documents" do
4607
+ expect(record.id).to_not be_nil
4608
+ end
4609
+
4610
+ context "when subsequently updating the documents" do
4611
+
4612
+ before do
4613
+ record.update_attribute(:name, "Apparat")
4614
+ end
4615
+
4616
+ it "updates the document" do
4617
+ expect(record.name).to eq("Apparat")
4618
+ end
4619
+
4620
+ it "persists the change" do
4621
+ expect(record.reload.name).to eq("Apparat")
4622
+ end
4623
+ end
4624
+ end
4625
+ end
4626
+
4627
+ context "deleting embedded documents" do
4628
+
4629
+ it "able to delete embedded documents upon condition" do
4630
+ company = Company.new
4631
+ 4.times { |i| company.staffs << Staff.new(age: 50 + i)}
4632
+ 2.times { |i| company.staffs << Staff.new(age: 40)}
4633
+ company.save!
4634
+ company.staffs.delete_if {|x| x.age >= 50}
4635
+ expect(company.staffs.count).to eq(2)
4636
+ end
4637
+ end
4638
+
4639
+ context "when substituting polymorphic documents" do
4640
+
4641
+ before(:all) do
4642
+ class DNS; end
4643
+
4644
+ class DNS::Zone
4645
+ include Mongoid::Document
4646
+ embeds_many :rrsets, class_name: 'DNS::RRSet', inverse_of: :zone
4647
+ embeds_one :soa, class_name: 'DNS::Record', as: :container
4648
+ end
4649
+
4650
+ class DNS::RRSet
4651
+ include Mongoid::Document
4652
+ embedded_in :zone, class_name: 'DNS::Zone', inverse_of: :rrsets
4653
+ embeds_many :records, class_name: 'DNS::Record', as: :container
4654
+ end
4655
+
4656
+ class DNS::Record
4657
+ include Mongoid::Document
4658
+ embedded_in :container, polymorphic: true
4659
+ end
4660
+ end
4661
+
4662
+ after(:all) do
4663
+ Object.send(:remove_const, :DNS)
4664
+ end
4665
+
4666
+ context "when the parent is new" do
4667
+
4668
+ let(:zone) do
4669
+ DNS::Zone.new
4670
+ end
4671
+
4672
+ let(:soa_1) do
4673
+ DNS::Record.new
4674
+ end
4675
+
4676
+ context "when replacing the set document" do
4677
+
4678
+ let(:soa_2) do
4679
+ DNS::Record.new
4680
+ end
4681
+
4682
+ before do
4683
+ zone.soa = soa_1
4684
+ end
4685
+
4686
+ it "properly sets the association metadata" do
4687
+ expect(zone.soa = soa_2).to eq(soa_2)
4688
+ end
4689
+ end
4690
+
4691
+ context "when deleting the set document" do
4692
+
4693
+ let(:soa_2) do
4694
+ DNS::Record.new
4695
+ end
4696
+
4697
+ before do
4698
+ zone.soa = soa_1
4699
+ end
4700
+
4701
+ it "properly sets the association metadata" do
4702
+ expect(zone.soa.delete).to be true
4703
+ end
4704
+ end
4705
+ end
4706
+
4707
+ context "when the parent is persisted" do
4708
+
4709
+ let(:zone) do
4710
+ DNS::Zone.create!
4711
+ end
4712
+
4713
+ let(:soa_1) do
4714
+ DNS::Record.new
4715
+ end
4716
+
4717
+ context "when replacing the set document" do
4718
+
4719
+ let(:soa_2) do
4720
+ DNS::Record.new
4721
+ end
4722
+
4723
+ before do
4724
+ zone.soa = soa_1
4725
+ end
4726
+
4727
+ it "properly sets the association" do
4728
+ expect(zone.soa = soa_2).to eq(soa_2)
4729
+ end
4730
+ end
4731
+
4732
+ context "when deleting the set document" do
4733
+
4734
+ let(:soa_2) do
4735
+ DNS::Record.new
4736
+ end
4737
+
4738
+ before do
4739
+ zone.soa = soa_1
4740
+ end
4741
+
4742
+ it "properly sets the association" do
4743
+ expect(zone.soa.delete).to be true
4744
+ end
4745
+ end
4746
+ end
4747
+ end
4748
+
4749
+ context "when trying to persist the empty list" do
4750
+
4751
+ context "in an embeds_many relation" do
4752
+
4753
+ let(:band) { Band.create! }
4754
+
4755
+ before do
4756
+ band.labels = []
4757
+ band.save!
4758
+ end
4759
+
4760
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4761
+
4762
+ it "persists the empty list" do
4763
+ expect(reloaded_band).to have_key(:labels)
4764
+ expect(reloaded_band[:labels]).to eq []
4765
+ end
4766
+ end
4767
+
4768
+ context "in a nested embeds_many relation" do
4769
+
4770
+ let(:survey) { Survey.create!(questions: [Question.new]) }
4771
+
4772
+ before do
4773
+ survey.questions.first.answers = []
4774
+ survey.save!
4775
+ end
4776
+
4777
+ let(:reloaded_survey) { Survey.collection.find(_id: survey._id).first }
4778
+
4779
+ it "persists the empty list" do
4780
+ expect(reloaded_survey).to have_key(:questions)
4781
+ expect(reloaded_survey[:questions][0]).to have_key(:answers)
4782
+ expect(reloaded_survey[:questions][0][:answers]).to eq []
4783
+ end
4784
+ end
4785
+
4786
+ context "when not setting the embeds_many field" do
4787
+
4788
+ let(:band) { Band.create! }
4789
+
4790
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4791
+
4792
+ it "does not persist the empty list" do
4793
+ expect(reloaded_band).to_not have_key(:labels)
4794
+ end
4795
+ end
4796
+ end
4797
+
4798
+ context "when using assign_attributes with an already populated array" do
4799
+ let(:post) { EmmPost.create! }
4800
+
4801
+ before do
4802
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'a'}],
4803
+ user_tags: [{id: BSON::ObjectId.new, title: 'b'}])
4804
+ post.save!
4805
+ post.reload
4806
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'c'}],
4807
+ user_tags: [])
4808
+ post.save!
4809
+ post.reload
4810
+ end
4811
+
4812
+ it "has the correct embedded documents" do
4813
+ expect(post.company_tags.length).to eq(1)
4814
+ expect(post.company_tags.first.title).to eq("c")
4815
+ end
4816
+ end
4817
+
4818
+ context "when the parent fails validation" do
4819
+ let(:school) { EmmSchool.new }
4820
+ let(:student) { school.students.new }
4821
+
4822
+ before do
4823
+ student.save
4824
+ end
4825
+
4826
+ it "does not mark the parent as persisted" do
4827
+ expect(school.persisted?).to be false
4828
+ end
4829
+
4830
+ it "does not mark the child as persisted" do
4831
+ expect(student.persisted?).to be false
4832
+ end
4833
+
4834
+ it "does not persist the parent" do
4835
+ expect(School.count).to eq(0)
4836
+ end
4837
+ end
4838
+
4839
+ context "when doing assign_attributes then assignment" do
4840
+
4841
+ let(:post) do
4842
+ EmmPost.create!(
4843
+ company_tags: [ EmmCompanyTag.new(title: "1"), EmmCompanyTag.new(title: "1") ],
4844
+ user_tags: [ EmmUserTag.new(title: "1"), EmmUserTag.new(title: "1") ]
4845
+ )
4846
+ end
4847
+
4848
+ let(:from_db) { EmmPost.find(post.id) }
4849
+
4850
+ before do
4851
+ post.assign_attributes(
4852
+ company_tags: [ EmmCompanyTag.new(title: '3'), EmmCompanyTag.new(title: '4') ]
4853
+ )
4854
+ post.user_tags = [ EmmUserTag.new(title: '3'), EmmUserTag.new(title: '4') ]
4855
+ post.save!
4856
+ end
4857
+
4858
+ it "persists the associations correctly" do
4859
+ expect(from_db.user_tags.size).to eq(2)
4860
+ expect(from_db.company_tags.size).to eq(2)
4861
+ end
4862
+ end
4863
+ end