mongoid 7.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
+ require_relative '../embeds_many_models.rb'
5
6
 
6
7
  describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
7
8
 
@@ -115,7 +116,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
115
116
  context "when the parent is not a new record" do
116
117
 
117
118
  let(:person) do
118
- Person.create
119
+ Person.create!
119
120
  end
120
121
 
121
122
  let(:address) do
@@ -134,7 +135,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
134
135
  context "when appending more than one document at once" do
135
136
 
136
137
  let(:person) do
137
- Person.create
138
+ Person.create!
138
139
  end
139
140
 
140
141
  let(:address_one) do
@@ -210,7 +211,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
210
211
  context "when the parent is not a new record" do
211
212
 
212
213
  let(:parent_role) do
213
- Role.create(name: "CEO")
214
+ Role.create!(name: "CEO")
214
215
  end
215
216
 
216
217
  let(:child_role) do
@@ -229,7 +230,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
229
230
 
230
231
  context "when the child has one sided many to many relation" do
231
232
  let(:person) do
232
- Person.create
233
+ Person.create!
233
234
  end
234
235
 
235
236
  let(:message) do
@@ -312,7 +313,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
312
313
  context "when the parent is not a new record" do
313
314
 
314
315
  let(:person) do
315
- Person.create
316
+ Person.create!
316
317
  end
317
318
 
318
319
  let(:address) do
@@ -333,11 +334,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
333
334
  context "when setting via an overridden method from the parent" do
334
335
 
335
336
  let!(:person) do
336
- Person.create
337
+ Person.create!
337
338
  end
338
339
 
339
340
  let!(:address) do
340
- person.addresses.create(street: "Alt Treptow")
341
+ person.addresses.create!(street: "Alt Treptow")
341
342
  end
342
343
 
343
344
  let!(:new_address) do
@@ -345,7 +346,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
345
346
  end
346
347
 
347
348
  before do
348
- person.update_attributes(set_addresses: [ new_address ])
349
+ person.update_attributes!(set_addresses: [ new_address ])
349
350
  end
350
351
 
351
352
  it "overwrites the existing addresses" do
@@ -375,7 +376,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
375
376
 
376
377
  before do
377
378
  person.addresses = [ address_two ]
378
- person.save
379
+ person.save!
379
380
  end
380
381
 
381
382
  it "sets the new documents" do
@@ -409,7 +410,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
409
410
 
410
411
  before do
411
412
  doctor.addresses = [ address_one ]
412
- doctor.save
413
+ doctor.save!
413
414
  end
414
415
 
415
416
  it "sets the documents" do
@@ -428,7 +429,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
428
429
 
429
430
  before do
430
431
  doctor.addresses = [ address_two ]
431
- doctor.save
432
+ doctor.save!
432
433
  end
433
434
 
434
435
  it "sets the new documents" do
@@ -446,7 +447,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
446
447
  context "when replacing an existing relation" do
447
448
 
448
449
  let(:person) do
449
- Person.create(addresses: addresses)
450
+ Person.create!(addresses: addresses)
450
451
  end
451
452
 
452
453
  let(:addresses) do
@@ -507,7 +508,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
507
508
  end
508
509
 
509
510
  let(:tracking_id) do
510
- MyCompany::Model::TrackingId.create
511
+ MyCompany::Model::TrackingId.create!
511
512
  end
512
513
 
513
514
  let(:history) do
@@ -542,7 +543,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
542
543
  inflect.singular("address_numbers", "address_number")
543
544
  end
544
545
  slave.address_numbers << AddressNumber.new(country_code: 1)
545
- slave.save
546
+ slave.save!
546
547
  end
547
548
 
548
549
  it "requires an inflection to determine the class" do
@@ -553,15 +554,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
553
554
  context "when setting the entire tree via a hash" do
554
555
 
555
556
  let(:person) do
556
- Person.create
557
+ Person.create!
557
558
  end
558
559
 
559
560
  let!(:address_one) do
560
- person.addresses.create(street: "Tauentzienstr")
561
+ person.addresses.create!(street: "Tauentzienstr")
561
562
  end
562
563
 
563
564
  let!(:address_two) do
564
- person.addresses.create(street: "Kudamm")
565
+ person.addresses.create!(street: "Kudamm")
565
566
  end
566
567
 
567
568
  let(:attributes) do
@@ -572,7 +573,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
572
573
 
573
574
  before do
574
575
  attributes["addresses"][0]["city"] = "Berlin"
575
- person.update_attributes(attributes)
576
+ person.update_attributes!(attributes)
576
577
  end
577
578
 
578
579
  it "sets the new attributes" do
@@ -588,15 +589,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
588
589
  context "when setting an embedded sub-document tree via a hash" do
589
590
 
590
591
  let(:person) do
591
- Person.create
592
+ Person.create!
592
593
  end
593
594
 
594
595
  let!(:address_one) do
595
- person.addresses.create(street: "Tauentzienstr")
596
+ person.addresses.create!(street: "Tauentzienstr")
596
597
  end
597
598
 
598
599
  let!(:location_one) do
599
- person.addresses.first.locations.create(name: "Work")
600
+ person.addresses.first.locations.create!(name: "Work")
600
601
  end
601
602
 
602
603
  let(:attributes) do
@@ -608,7 +609,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
608
609
  before do
609
610
  attributes["city"] = "Berlin"
610
611
  attributes["locations"][0]["name"] = "Home"
611
- person.addresses.first.update_attributes(attributes)
612
+ person.addresses.first.update_attributes!(attributes)
612
613
  end
613
614
 
614
615
  it "sets the new attributes on the address" do
@@ -681,7 +682,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
681
682
  context "when the parent is not a new record" do
682
683
 
683
684
  let(:parent_role) do
684
- Role.create(name: "CTO")
685
+ Role.create!(name: "CTO")
685
686
  end
686
687
 
687
688
  let(:child_role) do
@@ -749,7 +750,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
749
750
  context "when the parent is persisted" do
750
751
 
751
752
  let(:person) do
752
- Person.create
753
+ Person.create!
753
754
  end
754
755
 
755
756
  let(:address) do
@@ -798,7 +799,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
798
799
  context "when saving the parent" do
799
800
 
800
801
  before do
801
- person.save
802
+ person.save!
802
803
  person.reload
803
804
  end
804
805
 
@@ -812,7 +813,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
812
813
  context "when setting on a reload" do
813
814
 
814
815
  let(:person) do
815
- Person.create
816
+ Person.create!
816
817
  end
817
818
 
818
819
  let(:address) do
@@ -882,7 +883,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
882
883
  context "when the documents are not new records" do
883
884
 
884
885
  let(:parent_role) do
885
- Role.create
886
+ Role.create!
886
887
  end
887
888
 
888
889
  let(:child_role) do
@@ -912,13 +913,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
912
913
  describe "#as_document" do
913
914
 
914
915
  let!(:person) do
915
- Person.create
916
+ Person.create!
916
917
  end
917
918
 
918
919
  context 'when a string is used to access an attribute' do
919
920
 
920
921
  let!(:address) do
921
- person.addresses.create(street: "one")
922
+ person.addresses.create!(street: "one")
922
923
  end
923
924
 
924
925
  let(:document) do
@@ -933,7 +934,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
933
934
  context 'when a symbol is used to access an attribute' do
934
935
 
935
936
  let!(:address) do
936
- person.addresses.create(street: "one")
937
+ person.addresses.create!(street: "one")
937
938
  end
938
939
 
939
940
  let(:document) do
@@ -948,7 +949,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
948
949
  context "when the relation has no default scope" do
949
950
 
950
951
  let!(:address) do
951
- person.addresses.create(street: "one")
952
+ person.addresses.create!(street: "one")
952
953
  end
953
954
 
954
955
  let(:document) do
@@ -1105,7 +1106,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1105
1106
  context "when providing nested attributes" do
1106
1107
 
1107
1108
  let(:person) do
1108
- Person.create
1109
+ Person.create!
1109
1110
  end
1110
1111
 
1111
1112
  let(:address) do
@@ -1119,7 +1120,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1119
1120
  context "when followed by a save" do
1120
1121
 
1121
1122
  before do
1122
- address.save
1123
+ address.save!
1123
1124
  end
1124
1125
 
1125
1126
  let(:location) do
@@ -1139,13 +1140,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1139
1140
  context "when the parent has been persisted" do
1140
1141
 
1141
1142
  let(:person) do
1142
- Person.create
1143
+ Person.create!
1143
1144
  end
1144
1145
 
1145
1146
  context "when the children are persisted" do
1146
1147
 
1147
1148
  let!(:address) do
1148
- person.addresses.create(street: "High St")
1149
+ person.addresses.create!(street: "High St")
1149
1150
  end
1150
1151
 
1151
1152
  let!(:relation) do
@@ -1261,7 +1262,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1261
1262
  context "when the parent is not a new record" do
1262
1263
 
1263
1264
  let(:person) do
1264
- Person.create
1265
+ Person.create!
1265
1266
  end
1266
1267
 
1267
1268
  let(:address) do
@@ -1280,7 +1281,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1280
1281
  context "when concatenating an empty array" do
1281
1282
 
1282
1283
  let(:person) do
1283
- Person.create
1284
+ Person.create!
1284
1285
  end
1285
1286
 
1286
1287
  before do
@@ -1296,7 +1297,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1296
1297
  context "when appending more than one document at once" do
1297
1298
 
1298
1299
  let(:person) do
1299
- Person.create
1300
+ Person.create!
1300
1301
  end
1301
1302
 
1302
1303
  let(:address_one) do
@@ -1368,7 +1369,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1368
1369
  context "when the parent is not a new record" do
1369
1370
 
1370
1371
  let(:parent_role) do
1371
- Role.create(name: "CEO")
1372
+ Role.create!(name: "CEO")
1372
1373
  end
1373
1374
 
1374
1375
  let(:child_role) do
@@ -1389,49 +1390,261 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1389
1390
  describe "#count" do
1390
1391
 
1391
1392
  let(:person) do
1392
- Person.create
1393
+ Person.create!
1393
1394
  end
1394
1395
 
1395
1396
  before do
1396
- person.addresses.create(street: "Upper")
1397
+ person.addresses.create!(street: "Upper")
1397
1398
  person.addresses.build(street: "Bond")
1399
+ person.addresses.build(street: "Lower")
1398
1400
  end
1399
1401
 
1400
1402
  it "returns the number of persisted documents" do
1401
1403
  expect(person.addresses.count).to eq(1)
1402
1404
  end
1405
+
1406
+ context 'block form' do
1407
+ it "iterates across all documents" do
1408
+ expect(person.addresses.count {|a| a.persisted? }).to eq(1)
1409
+ expect(person.addresses.count {|a| !a.persisted? }).to eq(2)
1410
+ expect(person.addresses.count {|a| a.street.include?('on') }).to eq(1)
1411
+ expect(person.addresses.count {|a| a.street.ends_with?('er') }).to eq(2)
1412
+ end
1413
+ end
1414
+
1415
+ context 'argument form' do
1416
+ it "behaves correctly when given a model instance" do
1417
+ expect(person.addresses.count(person.addresses.first)).to eq(1)
1418
+ end
1419
+
1420
+ it "behaves correctly when given a non-model instance" do
1421
+ expect(person.addresses.count(1)).to eq(0)
1422
+ end
1423
+ end
1403
1424
  end
1404
1425
 
1405
1426
  describe "#any?" do
1406
1427
 
1407
1428
  let(:person) do
1408
- Person.create
1429
+ Person.create!
1409
1430
  end
1410
1431
 
1411
1432
  context "when documents are persisted" do
1412
1433
  before do
1413
- person.addresses.create(street: "Upper")
1434
+ person.addresses.create!(street: "Upper")
1414
1435
  end
1415
1436
 
1416
1437
  it "returns true" do
1417
1438
  expect(person.addresses.any?).to be true
1418
1439
  end
1440
+
1441
+ it "block form iterates across all documents" do
1442
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be true
1443
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be false
1444
+ end
1445
+
1446
+ context 'argument form' do
1447
+ it "behaves correctly when given a model instance" do
1448
+ expect(person.addresses.any?(person.addresses.first)).to be true
1449
+ end
1450
+
1451
+ it "behaves correctly when given a non-model instance" do
1452
+ expect(person.addresses.any?(1)).to be false
1453
+ end
1454
+ end
1419
1455
  end
1420
-
1456
+
1421
1457
  context "when documents are not persisted" do
1422
1458
  before do
1423
1459
  person.addresses.build(street: "Bond")
1424
1460
  end
1425
-
1461
+
1426
1462
  it "returns true" do
1427
1463
  expect(person.addresses.any?).to be true
1428
1464
  end
1465
+
1466
+ it "block form iterates across all documents" do
1467
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be false
1468
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be true
1469
+ end
1470
+
1471
+ context 'argument form' do
1472
+ it "behaves correctly when given a model instance" do
1473
+ expect(person.addresses.any?(person.addresses.first)).to be true
1474
+ end
1475
+
1476
+ it "behaves correctly when given a non-model instance" do
1477
+ expect(person.addresses.any?(1)).to be false
1478
+ end
1479
+ end
1429
1480
  end
1430
1481
 
1431
- context "when documents are not created" do
1482
+ context "when documents are not present" do
1432
1483
  it "returns false" do
1433
1484
  expect(person.addresses.any?).to be false
1434
1485
  end
1486
+
1487
+ it "block form iterates across all documents" do
1488
+ expect(person.addresses.any?(&:a)).to be false
1489
+ end
1490
+
1491
+ it "argument form is supported" do
1492
+ expect(person.addresses.any?(1)).to be false
1493
+ end
1494
+ end
1495
+ end
1496
+
1497
+ describe "#all?" do
1498
+
1499
+ let(:person) do
1500
+ Person.create!
1501
+ end
1502
+
1503
+ context "when documents are persisted" do
1504
+ before do
1505
+ person.addresses.create!(street: "Upper")
1506
+ end
1507
+
1508
+ it "returns true" do
1509
+ expect(person.addresses.all?).to be true
1510
+ end
1511
+
1512
+ it "block form iterates across all documents" do
1513
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be true
1514
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be false
1515
+ end
1516
+
1517
+ context 'argument form' do
1518
+ it "behaves correctly when given a model instance" do
1519
+ expect(person.addresses.all?(person.addresses.first)).to be true
1520
+ end
1521
+
1522
+ it "behaves correctly when given a non-model instance" do
1523
+ expect(person.addresses.all?(1)).to be false
1524
+ end
1525
+ end
1526
+ end
1527
+
1528
+ context "when documents are not persisted" do
1529
+ before do
1530
+ person.addresses.build(street: "Bond")
1531
+ end
1532
+
1533
+ it "returns true" do
1534
+ expect(person.addresses.all?).to be true
1535
+ end
1536
+
1537
+ it "block form iterates across all documents" do
1538
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be false
1539
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be true
1540
+ end
1541
+
1542
+ context 'argument form' do
1543
+ it "behaves correctly when given a model instance" do
1544
+ expect(person.addresses.all?(person.addresses.first)).to be true
1545
+ end
1546
+
1547
+ it "behaves correctly when given a non-model instance" do
1548
+ expect(person.addresses.all?(1)).to be false
1549
+ end
1550
+ end
1551
+ end
1552
+
1553
+ context "when documents are not present" do
1554
+ it "returns false" do
1555
+ expect(person.addresses.all?).to be true
1556
+ end
1557
+
1558
+ it "block form iterates across all documents" do
1559
+ expect(person.addresses.all?(&:foo)).to be true
1560
+ end
1561
+
1562
+ context 'argument form' do
1563
+ it "behaves correctly when given nil" do
1564
+ expect(person.addresses.all?(nil)).to be true
1565
+ end
1566
+
1567
+ it "behaves correctly when given a non-model instance" do
1568
+ expect(person.addresses.all?(1)).to be true
1569
+ end
1570
+ end
1571
+ end
1572
+ end
1573
+
1574
+ describe "#none?" do
1575
+
1576
+ let(:person) do
1577
+ Person.create!
1578
+ end
1579
+
1580
+ context "when documents are persisted" do
1581
+ before do
1582
+ person.addresses.create!(street: "Upper")
1583
+ end
1584
+
1585
+ it "returns true" do
1586
+ expect(person.addresses.none?).to be false
1587
+ end
1588
+
1589
+ it "block form iterates across all documents" do
1590
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be false
1591
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be true
1592
+ end
1593
+
1594
+ context 'argument form' do
1595
+ it "behaves correctly when given a model instance" do
1596
+ expect(person.addresses.none?(person.addresses.first)).to be false
1597
+ end
1598
+
1599
+ it "behaves correctly when given a non-model instance" do
1600
+ expect(person.addresses.none?(1)).to be true
1601
+ end
1602
+ end
1603
+ end
1604
+
1605
+ context "when documents are not persisted" do
1606
+ before do
1607
+ person.addresses.build(street: "Bond")
1608
+ end
1609
+
1610
+ it "returns true" do
1611
+ expect(person.addresses.none?).to be false
1612
+ end
1613
+
1614
+ it "block form iterates across all documents" do
1615
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be true
1616
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be false
1617
+ end
1618
+
1619
+ context 'argument form' do
1620
+ it "behaves correctly when given a model instance" do
1621
+ expect(person.addresses.none?(person.addresses.first)).to be false
1622
+ end
1623
+
1624
+ it "behaves correctly when given a non-model instance" do
1625
+ expect(person.addresses.none?(1)).to be true
1626
+ end
1627
+ end
1628
+ end
1629
+
1630
+ context "when documents are not present" do
1631
+ it "returns false" do
1632
+ expect(person.addresses.none?).to be true
1633
+ end
1634
+
1635
+ it "block form iterates across all documents" do
1636
+ expect(person.addresses.none?(&:a)).to be true
1637
+ end
1638
+
1639
+ context 'argument form' do
1640
+ it "behaves correctly when given nil" do
1641
+ expect(person.addresses.none?(nil)).to be true
1642
+ end
1643
+
1644
+ it "behaves correctly when given a non-model instance" do
1645
+ expect(person.addresses.none?(1)).to be true
1646
+ end
1647
+ end
1435
1648
  end
1436
1649
  end
1437
1650
 
@@ -1440,11 +1653,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1440
1653
  context "when providing multiple attributes" do
1441
1654
 
1442
1655
  let(:person) do
1443
- Person.create
1656
+ Person.create!
1444
1657
  end
1445
1658
 
1446
1659
  let!(:addresses) do
1447
- person.addresses.create([{ street: "Bond" }, { street: "Upper" }])
1660
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
1448
1661
  end
1449
1662
 
1450
1663
  it "creates multiple documents" do
@@ -1467,11 +1680,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1467
1680
  context "when the relation is not cyclic" do
1468
1681
 
1469
1682
  let(:person) do
1470
- Person.create
1683
+ Person.create!
1471
1684
  end
1472
1685
 
1473
1686
  let!(:address) do
1474
- person.addresses.create(street: "Bond") do |address|
1687
+ person.addresses.create!(street: "Bond") do |address|
1475
1688
  address.state = "CA"
1476
1689
  end
1477
1690
  end
@@ -1515,7 +1728,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1515
1728
  context "when embedding a multi word named document" do
1516
1729
 
1517
1730
  let!(:component) do
1518
- person.address_components.create(street: "Test")
1731
+ person.address_components.create!(street: "Test")
1519
1732
  end
1520
1733
 
1521
1734
  it "saves the embedded document" do
@@ -1527,11 +1740,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1527
1740
  context "when the relation is cyclic" do
1528
1741
 
1529
1742
  let!(:entry) do
1530
- Entry.create(title: "hi")
1743
+ Entry.create!(title: "hi")
1531
1744
  end
1532
1745
 
1533
1746
  let!(:child_entry) do
1534
- entry.child_entries.create(title: "hello")
1747
+ entry.child_entries.create!(title: "hello")
1535
1748
  end
1536
1749
 
1537
1750
  it "creates a new child" do
@@ -1543,7 +1756,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1543
1756
  describe "#create!" do
1544
1757
 
1545
1758
  let(:person) do
1546
- Person.create
1759
+ Person.create!
1547
1760
  end
1548
1761
 
1549
1762
  context "when providing multiple attributes" do
@@ -1650,51 +1863,56 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1650
1863
  end
1651
1864
  end
1652
1865
 
1653
- describe "#delete" do
1866
+ %i[ delete delete_one ].each do |method|
1867
+ describe "\##{method}" do
1868
+ let(:address_one) { Address.new(street: "first") }
1869
+ let(:address_two) { Address.new(street: "second") }
1654
1870
 
1655
- let(:person) do
1656
- Person.new
1657
- end
1658
-
1659
- let(:address_one) do
1660
- Address.new(street: "first")
1661
- end
1871
+ before do
1872
+ person.addresses << [ address_one, address_two ]
1873
+ end
1662
1874
 
1663
- let(:address_two) do
1664
- Address.new(street: "second")
1665
- end
1875
+ shared_examples_for 'deleting from the collection' do
1876
+ context 'when the document exists in the relation' do
1877
+ let!(:deleted) do
1878
+ person.addresses.send(method, address_one)
1879
+ end
1666
1880
 
1667
- before do
1668
- person.addresses << [ address_one, address_two ]
1669
- end
1881
+ it 'deletes the document' do
1882
+ expect(person.addresses).to eq([ address_two ])
1883
+ expect(person.reload.addresses).to eq([ address_two ]) if person.persisted?
1884
+ end
1670
1885
 
1671
- context "when the document exists in the relation" do
1886
+ it 'deletes the document from the unscoped' do
1887
+ expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
1888
+ end
1672
1889
 
1673
- let!(:deleted) do
1674
- person.addresses.delete(address_one)
1675
- end
1890
+ it 'reindexes the relation' do
1891
+ expect(address_two._index).to eq(0)
1892
+ end
1676
1893
 
1677
- it "deletes the document" do
1678
- expect(person.addresses).to eq([ address_two ])
1679
- end
1894
+ it 'returns the document' do
1895
+ expect(deleted).to eq(address_one)
1896
+ end
1897
+ end
1680
1898
 
1681
- it "deletes the document from the unscoped" do
1682
- expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
1899
+ context 'when the document does not exist' do
1900
+ it 'returns nil' do
1901
+ expect(person.addresses.send(method, Address.new)).to be_nil
1902
+ end
1903
+ end
1683
1904
  end
1684
1905
 
1685
- it "reindexes the relation" do
1686
- expect(address_two._index).to eq(0)
1687
- end
1906
+ context 'when the root document is unpersisted' do
1907
+ let(:person) { Person.new }
1688
1908
 
1689
- it "returns the document" do
1690
- expect(deleted).to eq(address_one)
1909
+ it_behaves_like 'deleting from the collection'
1691
1910
  end
1692
- end
1693
1911
 
1694
- context "when the document does not exist" do
1912
+ context 'when the root document is persisted' do
1913
+ let(:person) { Person.create }
1695
1914
 
1696
- it "returns nil" do
1697
- expect(person.addresses.delete(Address.new)).to be_nil
1915
+ it_behaves_like 'deleting from the collection'
1698
1916
  end
1699
1917
  end
1700
1918
  end
@@ -1702,7 +1920,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1702
1920
  describe "#delete_if" do
1703
1921
 
1704
1922
  let(:person) do
1705
- Person.create
1923
+ Person.create!
1706
1924
  end
1707
1925
 
1708
1926
  context "when the documents are new" do
@@ -1751,11 +1969,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1751
1969
  context "when the documents persisted" do
1752
1970
 
1753
1971
  let!(:address_one) do
1754
- person.addresses.create(street: "Bond")
1972
+ person.addresses.create!(street: "Bond")
1755
1973
  end
1756
1974
 
1757
1975
  let!(:address_two) do
1758
- person.addresses.create(street: "Upper")
1976
+ person.addresses.create!(street: "Upper")
1759
1977
  end
1760
1978
 
1761
1979
  context "when a block is provided" do
@@ -1810,7 +2028,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1810
2028
  describe "##{method}" do
1811
2029
 
1812
2030
  let(:person) do
1813
- Person.create
2031
+ Person.create!
1814
2032
  end
1815
2033
 
1816
2034
  context "when the documents are new" do
@@ -1864,11 +2082,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1864
2082
  context "when the documents persisted" do
1865
2083
 
1866
2084
  let!(:address_one) do
1867
- person.addresses.create(street: "Bond")
2085
+ person.addresses.create!(street: "Bond")
1868
2086
  end
1869
2087
 
1870
2088
  let!(:address_two) do
1871
- person.addresses.create(street: "Upper")
2089
+ person.addresses.create!(street: "Upper")
1872
2090
  end
1873
2091
 
1874
2092
  context "when conditions are provided" do
@@ -1915,7 +2133,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1915
2133
  context "when removing and resaving" do
1916
2134
 
1917
2135
  let(:owner) do
1918
- PetOwner.create(title: "AKC")
2136
+ PetOwner.create!(title: "AKC")
1919
2137
  end
1920
2138
 
1921
2139
  before do
@@ -1998,6 +2216,79 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1998
2216
  end
1999
2217
  end
2000
2218
  end
2219
+
2220
+ context "when modifying the document beforehand" do
2221
+ let(:parent) { EmmParent.new }
2222
+
2223
+ before do
2224
+
2225
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2226
+ parent.save!
2227
+
2228
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2229
+
2230
+ parent.blocks.destroy_all(:name => 'test')
2231
+ end
2232
+
2233
+ it "deletes the correct document in the database" do
2234
+ expect(parent.reload.blocks.length).to eq(0)
2235
+ end
2236
+ end
2237
+
2238
+ context "when nil _id" do
2239
+ let(:parent) { EmmParent.new }
2240
+
2241
+ before do
2242
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2243
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2244
+ parent.save!
2245
+
2246
+ parent.blocks.destroy_all(:name => 'test')
2247
+ end
2248
+
2249
+ it "deletes only the matching documents in the database" do
2250
+ expect(parent.reload.blocks.length).to eq(1)
2251
+ end
2252
+ end
2253
+
2254
+ # Since without an _id field we must us a $pullAll with the attributes of
2255
+ # the embedded document, if you modify it beforehand, the query will not
2256
+ # be able to find the correct document to pull.
2257
+ context "when modifying the document with nil _id" do
2258
+ let(:parent) { EmmParent.new }
2259
+
2260
+ before do
2261
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2262
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2263
+ parent.save!
2264
+
2265
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2266
+
2267
+ parent.blocks.destroy_all(:name => 'test')
2268
+ end
2269
+
2270
+ it "does not delete the correct documents" do
2271
+ expect(parent.reload.blocks.length).to eq(2)
2272
+ end
2273
+ end
2274
+
2275
+ context "when documents with and without _id" do
2276
+ let(:parent) { EmmParent.new }
2277
+
2278
+ before do
2279
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2280
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2281
+ parent.save!
2282
+
2283
+ parent.blocks[1].children[0].assign_attributes(size: 2)
2284
+
2285
+ parent.blocks.destroy_all(:name => 'test')
2286
+ end
2287
+
2288
+ it "does not delete the correct documents" do
2289
+ expect(parent.reload.blocks.length).to eq(0)
2290
+ end
2291
+ end
2001
2292
  end
2002
2293
  end
2003
2294
 
@@ -2011,18 +2302,46 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2011
2302
  describe "#exists?" do
2012
2303
 
2013
2304
  let!(:person) do
2014
- Person.create
2305
+ Person.create!
2015
2306
  end
2016
2307
 
2017
2308
  context "when documents exist in the database" do
2018
2309
 
2019
2310
  before do
2020
- person.addresses.create(street: "Bond St")
2311
+ person.addresses.create!(street: "Bond St")
2021
2312
  end
2022
2313
 
2314
+ let(:address) { person.addresses.first }
2315
+
2023
2316
  it "returns true" do
2024
2317
  expect(person.addresses.exists?).to be true
2025
2318
  end
2319
+
2320
+ context 'when given specifying conditions' do
2321
+ context 'when the record exists in the association' do
2322
+ it 'returns true by condition' do
2323
+ expect(person.addresses.exists?(street: 'Bond St')).to be true
2324
+ end
2325
+
2326
+ it 'returns true by id' do
2327
+ expect(person.addresses.exists?(address._id)).to be true
2328
+ end
2329
+
2330
+ it 'returns false when given false' do
2331
+ expect(person.addresses.exists?(false)).to be false
2332
+ end
2333
+
2334
+ it 'returns false when given nil' do
2335
+ expect(person.addresses.exists?(nil)).to be false
2336
+ end
2337
+ end
2338
+
2339
+ context 'when the record does not exist in the association' do
2340
+ it 'returns false' do
2341
+ expect(person.addresses.exists?(street: 'Garfield Ave')).to be false
2342
+ end
2343
+ end
2344
+ end
2026
2345
  end
2027
2346
 
2028
2347
  context "when no documents exist in the database" do
@@ -2034,6 +2353,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2034
2353
  it "returns false" do
2035
2354
  expect(person.addresses.exists?).to be false
2036
2355
  end
2356
+
2357
+ context 'when given specifying conditions' do
2358
+ it 'returns false' do
2359
+ expect(person.addresses.exists?(street: 'Hyde Park Dr')).to be false
2360
+ expect(person.addresses.exists?(street: 'Garfield Ave')).to be false
2361
+ end
2362
+ end
2037
2363
  end
2038
2364
  end
2039
2365
 
@@ -2067,32 +2393,22 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2067
2393
  context "when the id does not match" do
2068
2394
 
2069
2395
  context "when config set to raise error" do
2070
-
2071
- before do
2072
- Mongoid.raise_not_found_error = true
2073
- end
2396
+ config_override :raise_not_found_error, true
2074
2397
 
2075
2398
  it "raises an error" do
2076
2399
  expect {
2077
2400
  person.addresses.find(BSON::ObjectId.new)
2078
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2401
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2079
2402
  end
2080
2403
  end
2081
2404
 
2082
2405
  context "when config set not to raise error" do
2406
+ config_override :raise_not_found_error, false
2083
2407
 
2084
2408
  let(:address) do
2085
2409
  person.addresses.find(BSON::ObjectId.new)
2086
2410
  end
2087
2411
 
2088
- before do
2089
- Mongoid.raise_not_found_error = false
2090
- end
2091
-
2092
- after do
2093
- Mongoid.raise_not_found_error = true
2094
- end
2095
-
2096
2412
  it "returns nil" do
2097
2413
  expect(address).to be_nil
2098
2414
  end
@@ -2116,36 +2432,64 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2116
2432
  context "when the ids do not match" do
2117
2433
 
2118
2434
  context "when config set to raise error" do
2119
-
2120
- before do
2121
- Mongoid.raise_not_found_error = true
2122
- end
2435
+ config_override :raise_not_found_error, true
2123
2436
 
2124
2437
  it "raises an error" do
2125
2438
  expect {
2126
2439
  person.addresses.find([ BSON::ObjectId.new ])
2127
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2440
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2128
2441
  end
2129
2442
  end
2130
2443
 
2131
2444
  context "when config set not to raise error" do
2445
+ config_override :raise_not_found_error, false
2132
2446
 
2133
2447
  let(:addresses) do
2134
2448
  person.addresses.find([ BSON::ObjectId.new ])
2135
2449
  end
2136
2450
 
2137
- before do
2138
- Mongoid.raise_not_found_error = false
2451
+ it "returns an empty array" do
2452
+ expect(addresses).to be_empty
2139
2453
  end
2454
+ end
2455
+ end
2456
+ end
2140
2457
 
2141
- after do
2142
- Mongoid.raise_not_found_error = true
2458
+ context "with block" do
2459
+ let!(:author) do
2460
+ Person.create!(title: 'Person')
2461
+ end
2462
+
2463
+ let!(:video_one) do
2464
+ author.videos.create!(title: 'video one')
2465
+ end
2466
+
2467
+ let!(:video_two) do
2468
+ author.videos.create!(title: 'video two')
2469
+ end
2470
+
2471
+ it "finds one" do
2472
+ expect(
2473
+ author.videos.find do |video|
2474
+ video.title == 'video one'
2143
2475
  end
2476
+ ).to eq(video_one)
2477
+ end
2144
2478
 
2145
- it "returns an empty array" do
2146
- expect(addresses).to be_empty
2479
+ it "returns first match of multiple" do
2480
+ expect(
2481
+ author.videos.find do |video|
2482
+ ['video one', 'video two'].include?(video.title)
2147
2483
  end
2148
- end
2484
+ ).to be_a(Video)
2485
+ end
2486
+
2487
+ it "returns nil when not found" do
2488
+ expect(
2489
+ author.videos.find do |video|
2490
+ video.title == 'non exiting one'
2491
+ end
2492
+ ).to be_nil
2149
2493
  end
2150
2494
  end
2151
2495
  end
@@ -2153,7 +2497,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2153
2497
  describe "#find_or_create_by" do
2154
2498
 
2155
2499
  let(:person) do
2156
- Person.create
2500
+ Person.create!
2157
2501
  end
2158
2502
 
2159
2503
  let!(:address) do
@@ -2196,11 +2540,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2196
2540
  # context "when the child belongs to another document" do
2197
2541
  #
2198
2542
  # let(:product) do
2199
- # Product.create
2543
+ # Product.create!
2200
2544
  # end
2201
2545
  #
2202
2546
  # let(:purchase) do
2203
- # Purchase.create
2547
+ # Purchase.create!
2204
2548
  # end
2205
2549
  #
2206
2550
  # let(:line_item) do
@@ -2219,7 +2563,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2219
2563
  describe "#find_or_create_by!" do
2220
2564
 
2221
2565
  let(:person) do
2222
- Person.create
2566
+ Person.create!
2223
2567
  end
2224
2568
 
2225
2569
  let!(:address) do
@@ -2271,11 +2615,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2271
2615
  # context "when the child belongs to another document" do
2272
2616
  #
2273
2617
  # let(:product) do
2274
- # Product.create
2618
+ # Product.create!
2275
2619
  # end
2276
2620
  #
2277
2621
  # let(:purchase) do
2278
- # Purchase.create
2622
+ # Purchase.create!
2279
2623
  # end
2280
2624
  #
2281
2625
  # let(:line_item) do
@@ -2393,11 +2737,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2393
2737
  describe "#method_missing" do
2394
2738
 
2395
2739
  let!(:person) do
2396
- Person.create
2740
+ Person.create!
2397
2741
  end
2398
2742
 
2399
2743
  let!(:address_one) do
2400
- person.addresses.create(
2744
+ person.addresses.create!(
2401
2745
  street: "Market",
2402
2746
  state: "CA",
2403
2747
  services: [ "1", "2" ]
@@ -2405,7 +2749,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2405
2749
  end
2406
2750
 
2407
2751
  let!(:address_two) do
2408
- person.addresses.create(
2752
+ person.addresses.create!(
2409
2753
  street: "Madison",
2410
2754
  state: "NY",
2411
2755
  services: [ "1", "2" ]
@@ -2449,13 +2793,26 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2449
2793
  end
2450
2794
 
2451
2795
  context "when providing a criteria class method" do
2796
+ context "without keyword arguments" do
2452
2797
 
2453
- let(:addresses) do
2454
- person.addresses.california
2798
+ let(:addresses) do
2799
+ person.addresses.california
2800
+ end
2801
+
2802
+ it "applies the criteria to the documents" do
2803
+ expect(addresses).to eq([ address_one ])
2804
+ end
2455
2805
  end
2456
2806
 
2457
- it "applies the criteria to the documents" do
2458
- expect(addresses).to eq([ address_one ])
2807
+ context "with keyword arguments" do
2808
+
2809
+ let(:addresses) do
2810
+ person.addresses.city_and_state(city: "Sacramento", state: "CA")
2811
+ end
2812
+
2813
+ it "applies the criteria to the documents" do
2814
+ expect(addresses).to eq([])
2815
+ end
2459
2816
  end
2460
2817
  end
2461
2818
 
@@ -2540,17 +2897,17 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2540
2897
  describe "#pop" do
2541
2898
 
2542
2899
  let(:person) do
2543
- Person.create
2900
+ Person.create!
2544
2901
  end
2545
2902
 
2546
2903
  context "when no argument is provided" do
2547
2904
 
2548
2905
  let!(:address_one) do
2549
- person.addresses.create(street: "sonnenallee")
2906
+ person.addresses.create!(street: "sonnenallee")
2550
2907
  end
2551
2908
 
2552
2909
  let!(:address_two) do
2553
- person.addresses.create(street: "hermannstr")
2910
+ person.addresses.create!(street: "hermannstr")
2554
2911
  end
2555
2912
 
2556
2913
  let!(:popped) do
@@ -2573,11 +2930,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2573
2930
  context "when an integer is provided" do
2574
2931
 
2575
2932
  let!(:address_one) do
2576
- person.addresses.create(street: "sonnenallee")
2933
+ person.addresses.create!(street: "sonnenallee")
2577
2934
  end
2578
2935
 
2579
2936
  let!(:address_two) do
2580
- person.addresses.create(street: "hermannstr")
2937
+ person.addresses.create!(street: "hermannstr")
2581
2938
  end
2582
2939
 
2583
2940
  context "when the number is zero" do
@@ -2659,17 +3016,17 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2659
3016
  describe "#shift" do
2660
3017
 
2661
3018
  let(:person) do
2662
- Person.create
3019
+ Person.create!
2663
3020
  end
2664
3021
 
2665
3022
  context "when no argument is provided" do
2666
3023
 
2667
3024
  let!(:address_one) do
2668
- person.addresses.create(street: "sonnenallee")
3025
+ person.addresses.create!(street: "sonnenallee")
2669
3026
  end
2670
3027
 
2671
3028
  let!(:address_two) do
2672
- person.addresses.create(street: "hermannstr")
3029
+ person.addresses.create!(street: "hermannstr")
2673
3030
  end
2674
3031
 
2675
3032
  let!(:shifted) do
@@ -2692,11 +3049,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2692
3049
  context "when an integer is provided" do
2693
3050
 
2694
3051
  let!(:address_one) do
2695
- person.addresses.create(street: "sonnenallee")
3052
+ person.addresses.create!(street: "sonnenallee")
2696
3053
  end
2697
3054
 
2698
3055
  let!(:address_two) do
2699
- person.addresses.create(street: "hermannstr")
3056
+ person.addresses.create!(street: "hermannstr")
2700
3057
  end
2701
3058
 
2702
3059
  context "when the number is zero" do
@@ -2844,11 +3201,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2844
3201
  describe "##{method}" do
2845
3202
 
2846
3203
  let(:person) do
2847
- Person.create
3204
+ Person.create!
2848
3205
  end
2849
3206
 
2850
3207
  before do
2851
- person.addresses.create(street: "Upper")
3208
+ person.addresses.create!(street: "Upper")
2852
3209
  person.addresses.build(street: "Bond")
2853
3210
  end
2854
3211
 
@@ -2886,7 +3243,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2886
3243
  context "when there are no documents present" do
2887
3244
 
2888
3245
  let(:person) do
2889
- Person.create
3246
+ Person.create!
2890
3247
  end
2891
3248
 
2892
3249
  it "updates nothing" do
@@ -2897,11 +3254,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2897
3254
  context "when documents are present" do
2898
3255
 
2899
3256
  let(:person) do
2900
- Person.create
3257
+ Person.create!
2901
3258
  end
2902
3259
 
2903
3260
  let!(:address) do
2904
- person.addresses.create(street: "Hobrecht", number: 27)
3261
+ person.addresses.create!(street: "Hobrecht", number: 27)
2905
3262
  end
2906
3263
 
2907
3264
  context "when updating with a where clause" do
@@ -2936,16 +3293,16 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2936
3293
  context "when updating the bottom level" do
2937
3294
 
2938
3295
  let!(:person) do
2939
- Person.create
3296
+ Person.create!
2940
3297
  end
2941
3298
 
2942
3299
  let!(:address) do
2943
- person.addresses.create(street: "Joachimstr")
3300
+ person.addresses.create!(street: "Joachimstr")
2944
3301
  end
2945
3302
 
2946
3303
  let!(:location) do
2947
- address.locations.create(name: "vacation", number: 0)
2948
- address.locations.create(name: "work", number: 3)
3304
+ address.locations.create!(name: "vacation", number: 0)
3305
+ address.locations.create!(name: "work", number: 3)
2949
3306
  end
2950
3307
 
2951
3308
  context "when updating with replacement of embedded array" do
@@ -2953,7 +3310,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2953
3310
  context "when updating with a hash" do
2954
3311
 
2955
3312
  before do
2956
- address.update_attributes(locations: [{ name: "home" }])
3313
+ address.update_attributes!(locations: [{ name: "home" }])
2957
3314
  end
2958
3315
 
2959
3316
  it "updates the attributes" do
@@ -2974,7 +3331,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2974
3331
 
2975
3332
  before do
2976
3333
  location.number = 7
2977
- location.save
3334
+ location.save!
2978
3335
  end
2979
3336
 
2980
3337
  let(:updated_location_number) do
@@ -3107,7 +3464,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3107
3464
  context "when creating a persisted tree" do
3108
3465
 
3109
3466
  let(:quiz) do
3110
- Quiz.create
3467
+ Quiz.create!
3111
3468
  end
3112
3469
 
3113
3470
  let(:page) do
@@ -3172,7 +3529,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3172
3529
  context "when saving the root" do
3173
3530
 
3174
3531
  before do
3175
- person.save
3532
+ person.save!
3176
3533
  end
3177
3534
 
3178
3535
  it "persists the first level document" do
@@ -3198,7 +3555,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3198
3555
 
3199
3556
  describe "replacing the entire embedded list" do
3200
3557
 
3201
- context "when an embeds many relationship contains a nil as the first item" do
3558
+ context "when an embeds many relationship contains nil as the first item" do
3202
3559
 
3203
3560
  let(:person) do
3204
3561
  Person.create!
@@ -3219,7 +3576,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3219
3576
  end
3220
3577
  end
3221
3578
 
3222
- context "when an embeds many relationship contains a nil in the middle of the list" do
3579
+ context "when an embeds many relationship contains nil in the middle of the list" do
3223
3580
 
3224
3581
  let(:person) do
3225
3582
  Person.create!
@@ -3240,7 +3597,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3240
3597
  end
3241
3598
  end
3242
3599
 
3243
- context "when an embeds many relationship contains a nil at the end of the list" do
3600
+ context "when an embeds many relationship contains nil at the end of the list" do
3244
3601
 
3245
3602
  let(:person) do
3246
3603
  Person.create!
@@ -3264,7 +3621,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3264
3621
 
3265
3622
  describe "appending to the embedded list" do
3266
3623
 
3267
- context "when appending a nil to the first position in an embedded list" do
3624
+ context "when appending nil to the first position in an embedded list" do
3268
3625
 
3269
3626
  let(:person) do
3270
3627
  Person.create! phone_numbers: []
@@ -3283,7 +3640,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3283
3640
  end
3284
3641
  end
3285
3642
 
3286
- context "when appending a nil into the middle of an embedded list" do
3643
+ context "when appending nil into the middle of an embedded list" do
3287
3644
 
3288
3645
  let(:person) do
3289
3646
  Person.create! phone_numbers: []
@@ -3302,7 +3659,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3302
3659
  end
3303
3660
  end
3304
3661
 
3305
- context "when appending a nil to the end of an embedded list" do
3662
+ context "when appending nil to the end of an embedded list" do
3306
3663
 
3307
3664
  let(:person) do
3308
3665
  Person.create! phone_numbers: []
@@ -3326,11 +3683,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3326
3683
  context "when accessing the parent in a destroy callback" do
3327
3684
 
3328
3685
  let!(:league) do
3329
- League.create
3686
+ League.create!
3330
3687
  end
3331
3688
 
3332
3689
  let!(:division) do
3333
- league.divisions.create
3690
+ league.divisions.create!
3334
3691
  end
3335
3692
 
3336
3693
  before do
@@ -3345,15 +3702,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3345
3702
  context "when updating the parent with all attributes" do
3346
3703
 
3347
3704
  let!(:person) do
3348
- Person.create
3705
+ Person.create!
3349
3706
  end
3350
3707
 
3351
3708
  let!(:address) do
3352
- person.addresses.create
3709
+ person.addresses.create!
3353
3710
  end
3354
3711
 
3355
3712
  before do
3356
- person.update_attributes(person.attributes)
3713
+ person.update_attributes!(person.attributes)
3357
3714
  end
3358
3715
 
3359
3716
  it "does not duplicate the embedded documents" do
@@ -3368,13 +3725,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3368
3725
  context "when embedding children named versions" do
3369
3726
 
3370
3727
  let(:acolyte) do
3371
- Acolyte.create(name: "test")
3728
+ Acolyte.create!(name: "test")
3372
3729
  end
3373
3730
 
3374
3731
  context "when creating a child" do
3375
3732
 
3376
3733
  let(:version) do
3377
- acolyte.versions.create(number: 1)
3734
+ acolyte.versions.create!(number: 1)
3378
3735
  end
3379
3736
 
3380
3737
  it "allows the operation" do
@@ -3399,7 +3756,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3399
3756
  let!(:account) do
3400
3757
  Account.new(name: "Testing").tap do |acct|
3401
3758
  acct.memberships.build
3402
- acct.save
3759
+ acct.save!
3403
3760
  end
3404
3761
  end
3405
3762
 
@@ -3411,10 +3768,10 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3411
3768
 
3412
3769
  before do
3413
3770
  account.name = ""
3414
- account.save
3415
3771
  end
3416
3772
 
3417
3773
  it "does not lose the parent reference" do
3774
+ expect(account.save).to eq false
3418
3775
  expect(from_db.memberships.first.account).to eq(account)
3419
3776
  end
3420
3777
  end
@@ -3434,15 +3791,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3434
3791
  context "when moving an embedded document from one parent to another" do
3435
3792
 
3436
3793
  let!(:person_one) do
3437
- Person.create
3794
+ Person.create!
3438
3795
  end
3439
3796
 
3440
3797
  let!(:person_two) do
3441
- Person.create
3798
+ Person.create!
3442
3799
  end
3443
3800
 
3444
3801
  let!(:address) do
3445
- person_one.addresses.create(street: "Kudamm")
3802
+ person_one.addresses.create!(street: "Kudamm")
3446
3803
  end
3447
3804
 
3448
3805
  before do
@@ -3477,7 +3834,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3477
3834
  context "when the relation has a default scope" do
3478
3835
 
3479
3836
  let!(:person) do
3480
- Person.create
3837
+ Person.create!
3481
3838
  end
3482
3839
 
3483
3840
  context "when the default scope is a sort" do
@@ -3547,7 +3904,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3547
3904
  context "when indexing the documents" do
3548
3905
 
3549
3906
  let!(:person) do
3550
- Person.create
3907
+ Person.create!
3551
3908
  end
3552
3909
 
3553
3910
  context "when the documents have a limiting default scope" do
@@ -3596,18 +3953,18 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3596
3953
  context "when the embedded document has an array field" do
3597
3954
 
3598
3955
  let!(:person) do
3599
- Person.create
3956
+ Person.create!
3600
3957
  end
3601
3958
 
3602
3959
  let!(:video) do
3603
- person.videos.create
3960
+ person.videos.create!
3604
3961
  end
3605
3962
 
3606
3963
  context "when saving the array on a persisted document" do
3607
3964
 
3608
3965
  before do
3609
3966
  video.genres = [ "horror", "scifi" ]
3610
- video.save
3967
+ video.save!
3611
3968
  end
3612
3969
 
3613
3970
  it "sets the value" do
@@ -3632,7 +3989,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3632
3989
 
3633
3990
  before do
3634
3991
  loaded_video.genres = [ "comedy" ]
3635
- loaded_video.save
3992
+ loaded_video.save!
3636
3993
  end
3637
3994
 
3638
3995
  it "sets the new value" do
@@ -3650,15 +4007,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3650
4007
  context "when destroying an embedded document" do
3651
4008
 
3652
4009
  let(:person) do
3653
- Person.create
4010
+ Person.create!
3654
4011
  end
3655
4012
 
3656
4013
  let!(:address_one) do
3657
- person.addresses.create(street: "hobrecht")
4014
+ person.addresses.create!(street: "hobrecht")
3658
4015
  end
3659
4016
 
3660
4017
  let!(:address_two) do
3661
- person.addresses.create(street: "maybachufer")
4018
+ person.addresses.create!(street: "maybachufer")
3662
4019
  end
3663
4020
 
3664
4021
  before do
@@ -3697,6 +4054,28 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3697
4054
  end
3698
4055
  end
3699
4056
 
4057
+ context "when destroying a document with multiple nil _ids" do
4058
+ let(:congress) { EmmCongress.create! }
4059
+
4060
+ before do
4061
+ congress.legislators << EmmLegislator.new(_id: nil, a: 1)
4062
+ congress.legislators << EmmLegislator.new(_id: nil, a: 2)
4063
+
4064
+ congress.legislators[0].destroy
4065
+ end
4066
+
4067
+ it "deletes the correct document locally" do
4068
+ pending "MONGOID-5394"
4069
+ expect(congress.legislators.length).to eq(1)
4070
+ expect(congress.legislators.first.a).to eq(1)
4071
+ end
4072
+
4073
+ it "only deletes the one document" do
4074
+ pending "MONGOID-5394"
4075
+ expect(congress.reload.legislators.length).to eq(1)
4076
+ end
4077
+ end
4078
+
3700
4079
  context "when adding a document" do
3701
4080
 
3702
4081
  let(:person) do
@@ -3730,7 +4109,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3730
4109
  context "when the association has an order defined" do
3731
4110
 
3732
4111
  let(:person) do
3733
- Person.create
4112
+ Person.create!
3734
4113
  end
3735
4114
 
3736
4115
  let(:message_one) do
@@ -3761,11 +4140,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3761
4140
 
3762
4141
  before do
3763
4142
  person.aliases = [ { name: "A", priority: 3 }, { name: "B", priority: 4 }]
3764
- person.save
4143
+ person.save!
3765
4144
  end
3766
4145
 
3767
4146
  let!(:person2) do
3768
- Person.create( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
4147
+ Person.create!( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
3769
4148
  end
3770
4149
 
3771
4150
  it "allows ordering on a key of an embedded document" do
@@ -3800,7 +4179,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3800
4179
  context "when updating multiple levels in one update" do
3801
4180
 
3802
4181
  let!(:person) do
3803
- Person.create(
4182
+ Person.create!(
3804
4183
  addresses: [
3805
4184
  { locations: [{ name: "home" }]}
3806
4185
  ]
@@ -3814,7 +4193,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3814
4193
  end
3815
4194
 
3816
4195
  before do
3817
- from_db.update_attributes(
4196
+ from_db.update_attributes!(
3818
4197
  addresses: [
3819
4198
  { locations: [{ name: "work" }]}
3820
4199
  ]
@@ -3834,15 +4213,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3834
4213
  context "when the embedded relation sorts on a boolean" do
3835
4214
 
3836
4215
  let(:circuit) do
3837
- Circuit.create
4216
+ Circuit.create!
3838
4217
  end
3839
4218
 
3840
4219
  let!(:bus_one) do
3841
- circuit.buses.create(saturday: true)
4220
+ circuit.buses.create!(saturday: true)
3842
4221
  end
3843
4222
 
3844
4223
  let!(:bus_two) do
3845
- circuit.buses.create(saturday: false)
4224
+ circuit.buses.create!(saturday: false)
3846
4225
  end
3847
4226
 
3848
4227
  it "orders properly with the boolean" do
@@ -3853,7 +4232,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3853
4232
  context "when batch replacing multiple relations in a single update" do
3854
4233
 
3855
4234
  let(:document) do
3856
- Person.create
4235
+ Person.create!
3857
4236
  end
3858
4237
 
3859
4238
  let(:person) do
@@ -3861,23 +4240,23 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3861
4240
  end
3862
4241
 
3863
4242
  let!(:symptom_one) do
3864
- person.symptoms.create
4243
+ person.symptoms.create!
3865
4244
  end
3866
4245
 
3867
4246
  let!(:symptom_two) do
3868
- person.symptoms.create
4247
+ person.symptoms.create!
3869
4248
  end
3870
4249
 
3871
4250
  let!(:appointment_one) do
3872
- person.appointments.create
4251
+ person.appointments.create!
3873
4252
  end
3874
4253
 
3875
4254
  let!(:appointment_two) do
3876
- person.appointments.create
4255
+ person.appointments.create!
3877
4256
  end
3878
4257
 
3879
4258
  before do
3880
- person.update_attributes(
4259
+ person.update_attributes!(
3881
4260
  appointments: [ appointment_one.as_document, appointment_two.as_document ],
3882
4261
  symptoms: [ symptom_one.as_document, symptom_two.as_document ]
3883
4262
  )
@@ -4210,7 +4589,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4210
4589
  context "when the parent has an after create callback" do
4211
4590
 
4212
4591
  before do
4213
- server.save
4592
+ server.save!
4214
4593
  end
4215
4594
 
4216
4595
  it "does not push the embedded documents twice" do
@@ -4222,13 +4601,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4222
4601
  context "when embedded documents are stored without ids" do
4223
4602
 
4224
4603
  let!(:band) do
4225
- Band.create(name: "Moderat")
4604
+ Band.create!(name: "Moderat")
4226
4605
  end
4227
4606
 
4228
4607
  before do
4229
4608
  band.collection.
4230
4609
  find(_id: band.id).
4231
- update_one("$set" => { records: [{ name: "Moderat" }]})
4610
+ update_one("$set" => { records: [{ _id: BSON::ObjectId.new, name: "Moderat" }]})
4232
4611
  end
4233
4612
 
4234
4613
  context "when loading the documents" do
@@ -4272,7 +4651,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4272
4651
  company = Company.new
4273
4652
  4.times { |i| company.staffs << Staff.new(age: 50 + i)}
4274
4653
  2.times { |i| company.staffs << Staff.new(age: 40)}
4275
- company.save
4654
+ company.save!
4276
4655
  company.staffs.delete_if {|x| x.age >= 50}
4277
4656
  expect(company.staffs.count).to eq(2)
4278
4657
  end
@@ -4349,7 +4728,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4349
4728
  context "when the parent is persisted" do
4350
4729
 
4351
4730
  let(:zone) do
4352
- DNS::Zone.create
4731
+ DNS::Zone.create!
4353
4732
  end
4354
4733
 
4355
4734
  let(:soa_1) do
@@ -4387,4 +4766,134 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4387
4766
  end
4388
4767
  end
4389
4768
  end
4769
+
4770
+ context "when trying to persist the empty list" do
4771
+
4772
+ context "in an embeds_many relation" do
4773
+
4774
+ let(:band) { Band.create! }
4775
+
4776
+ before do
4777
+ band.labels = []
4778
+ band.save!
4779
+ end
4780
+
4781
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4782
+
4783
+ it "persists the empty list" do
4784
+ expect(reloaded_band).to have_key(:labels)
4785
+ expect(reloaded_band[:labels]).to eq []
4786
+ end
4787
+ end
4788
+
4789
+ context "in a nested embeds_many relation" do
4790
+
4791
+ let(:survey) { Survey.create!(questions: [Question.new]) }
4792
+
4793
+ before do
4794
+ survey.questions.first.answers = []
4795
+ survey.save!
4796
+ end
4797
+
4798
+ let(:reloaded_survey) { Survey.collection.find(_id: survey._id).first }
4799
+
4800
+ it "persists the empty list" do
4801
+ expect(reloaded_survey).to have_key(:questions)
4802
+ expect(reloaded_survey[:questions][0]).to have_key(:answers)
4803
+ expect(reloaded_survey[:questions][0][:answers]).to eq []
4804
+ end
4805
+ end
4806
+
4807
+ context "when not setting the embeds_many field" do
4808
+
4809
+ let(:band) { Band.create! }
4810
+
4811
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4812
+
4813
+ it "does not persist the empty list" do
4814
+ expect(reloaded_band).to_not have_key(:labels)
4815
+ end
4816
+ end
4817
+ end
4818
+
4819
+ context "when using assign_attributes with an already populated array" do
4820
+ let(:post) { EmmPost.create! }
4821
+
4822
+ before do
4823
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'a'}],
4824
+ user_tags: [{id: BSON::ObjectId.new, title: 'b'}])
4825
+ post.save!
4826
+ post.reload
4827
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'c'}],
4828
+ user_tags: [])
4829
+ post.save!
4830
+ post.reload
4831
+ end
4832
+
4833
+ it "has the correct embedded documents" do
4834
+ expect(post.company_tags.length).to eq(1)
4835
+ expect(post.company_tags.first.title).to eq("c")
4836
+ end
4837
+ end
4838
+
4839
+ context "when the parent fails validation" do
4840
+ let(:school) { EmmSchool.new }
4841
+ let(:student) { school.students.new }
4842
+
4843
+ before do
4844
+ student.save
4845
+ end
4846
+
4847
+ it "does not mark the parent as persisted" do
4848
+ expect(school.persisted?).to be false
4849
+ end
4850
+
4851
+ it "does not mark the child as persisted" do
4852
+ expect(student.persisted?).to be false
4853
+ end
4854
+
4855
+ it "does not persist the parent" do
4856
+ expect(School.count).to eq(0)
4857
+ end
4858
+ end
4859
+
4860
+ context "when doing assign_attributes then assignment" do
4861
+
4862
+ let(:post) do
4863
+ EmmPost.create!(
4864
+ company_tags: [ EmmCompanyTag.new(title: "1"), EmmCompanyTag.new(title: "1") ],
4865
+ user_tags: [ EmmUserTag.new(title: "1"), EmmUserTag.new(title: "1") ]
4866
+ )
4867
+ end
4868
+
4869
+ let(:from_db) { EmmPost.find(post.id) }
4870
+
4871
+ before do
4872
+ post.assign_attributes(
4873
+ company_tags: [ EmmCompanyTag.new(title: '3'), EmmCompanyTag.new(title: '4') ]
4874
+ )
4875
+ post.user_tags = [ EmmUserTag.new(title: '3'), EmmUserTag.new(title: '4') ]
4876
+ post.save!
4877
+ end
4878
+
4879
+ it "persists the associations correctly" do
4880
+ expect(from_db.user_tags.size).to eq(2)
4881
+ expect(from_db.company_tags.size).to eq(2)
4882
+ end
4883
+ end
4884
+
4885
+ context "when assigning hashes" do
4886
+ let(:user) { EmmUser.create! }
4887
+
4888
+ before do
4889
+ user.orders = [ { sku: 1 }, { sku: 2 } ]
4890
+ end
4891
+
4892
+ it "creates the objects correctly" do
4893
+ expect(user.orders.first).to be_a(EmmOrder)
4894
+ expect(user.orders.last).to be_a(EmmOrder)
4895
+
4896
+ expect(user.orders.map(&:sku).sort).to eq([ 1, 2 ])
4897
+ end
4898
+ end
4390
4899
  end