mongoid 7.0.2 → 8.1.1

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 (1104) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +33 -33
  4. data/LICENSE +1 -0
  5. data/README.md +34 -20
  6. data/Rakefile +100 -5
  7. data/lib/config/locales/en.yml +220 -105
  8. data/lib/mongoid/association/accessors.rb +176 -84
  9. data/lib/mongoid/association/bindable.rb +57 -28
  10. data/lib/mongoid/association/builders.rb +9 -15
  11. data/lib/mongoid/association/constrainable.rb +5 -7
  12. data/lib/mongoid/association/depending.rb +9 -18
  13. data/lib/mongoid/association/eager_loadable.rb +31 -10
  14. data/lib/mongoid/association/embedded/batchable.rb +68 -54
  15. data/lib/mongoid/association/embedded/cyclic.rb +10 -17
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +27 -9
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +9 -6
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +16 -25
  19. data/lib/mongoid/association/embedded/embedded_in.rb +9 -28
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -8
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +10 -6
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +156 -135
  23. data/lib/mongoid/association/embedded/embeds_many.rb +10 -37
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +4 -8
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +27 -10
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +64 -30
  27. data/lib/mongoid/association/embedded/embeds_one.rb +11 -34
  28. data/lib/mongoid/association/embedded.rb +2 -0
  29. data/lib/mongoid/association/macros.rb +65 -41
  30. data/lib/mongoid/association/many.rb +25 -35
  31. data/lib/mongoid/association/marshalable.rb +3 -6
  32. data/lib/mongoid/association/nested/many.rb +22 -30
  33. data/lib/mongoid/association/nested/nested_buildable.rb +9 -15
  34. data/lib/mongoid/association/nested/one.rb +57 -30
  35. data/lib/mongoid/association/nested.rb +3 -3
  36. data/lib/mongoid/association/one.rb +5 -12
  37. data/lib/mongoid/association/options.rb +16 -46
  38. data/lib/mongoid/association/proxy.rb +52 -40
  39. data/lib/mongoid/association/referenced/auto_save.rb +9 -14
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +5 -9
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +11 -9
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +40 -3
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +19 -31
  44. data/lib/mongoid/association/referenced/belongs_to.rb +16 -38
  45. data/lib/mongoid/association/referenced/counter_cache.rb +14 -25
  46. data/lib/mongoid/association/referenced/eager.rb +42 -38
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -11
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -5
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -1
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +106 -67
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +29 -46
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -6
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -5
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -1
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +440 -456
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +104 -127
  57. data/lib/mongoid/association/referenced/has_many.rb +21 -45
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -9
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +20 -6
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -1
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +16 -29
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +25 -30
  63. data/lib/mongoid/association/referenced/has_one.rb +16 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -26
  65. data/lib/mongoid/association/referenced.rb +2 -0
  66. data/lib/mongoid/association/reflections.rb +7 -6
  67. data/lib/mongoid/association/relatable.rb +149 -89
  68. data/lib/mongoid/association.rb +13 -27
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +23 -7
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -7
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +49 -47
  76. data/lib/mongoid/attributes/dynamic.rb +22 -36
  77. data/lib/mongoid/attributes/nested.rb +12 -15
  78. data/lib/mongoid/attributes/processing.rb +19 -27
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +6 -9
  81. data/lib/mongoid/attributes.rb +103 -100
  82. data/lib/mongoid/cacheable.rb +7 -10
  83. data/lib/mongoid/changeable.rb +152 -73
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +21 -18
  86. data/lib/mongoid/clients/sessions.rb +10 -10
  87. data/lib/mongoid/clients/storage_options.rb +9 -17
  88. data/lib/mongoid/clients/validators/storage.rb +5 -24
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +3 -10
  91. data/lib/mongoid/collection_configurable.rb +58 -0
  92. data/lib/mongoid/composable.rb +7 -9
  93. data/lib/mongoid/config/defaults.rb +60 -0
  94. data/lib/mongoid/config/environment.rb +51 -13
  95. data/lib/mongoid/config/options.rb +20 -23
  96. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  97. data/lib/mongoid/config/validators/client.rb +8 -23
  98. data/lib/mongoid/config/validators/option.rb +2 -3
  99. data/lib/mongoid/config/validators.rb +3 -1
  100. data/lib/mongoid/config.rb +235 -48
  101. data/lib/mongoid/contextual/aggregable/memory.rb +40 -27
  102. data/lib/mongoid/contextual/aggregable/mongo.rb +32 -33
  103. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  104. data/lib/mongoid/contextual/aggregable.rb +17 -0
  105. data/lib/mongoid/contextual/atomic.rb +29 -31
  106. data/lib/mongoid/contextual/command.rb +2 -5
  107. data/lib/mongoid/contextual/geo_near.rb +13 -44
  108. data/lib/mongoid/contextual/map_reduce.rb +7 -35
  109. data/lib/mongoid/contextual/memory.rb +387 -81
  110. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  111. data/lib/mongoid/contextual/mongo.rb +641 -283
  112. data/lib/mongoid/contextual/none.rb +264 -31
  113. data/lib/mongoid/contextual/queryable.rb +3 -4
  114. data/lib/mongoid/contextual.rb +21 -11
  115. data/lib/mongoid/copyable.rb +46 -17
  116. data/lib/mongoid/criteria/findable.rb +20 -20
  117. data/lib/mongoid/criteria/includable.rb +32 -34
  118. data/lib/mongoid/criteria/inspectable.rb +2 -3
  119. data/lib/mongoid/criteria/marshalable.rb +12 -7
  120. data/lib/mongoid/criteria/modifiable.rb +15 -21
  121. data/lib/mongoid/criteria/options.rb +4 -5
  122. data/lib/mongoid/criteria/permission.rb +3 -2
  123. data/lib/mongoid/criteria/queryable/aggregable.rb +4 -15
  124. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  125. data/lib/mongoid/criteria/queryable/extensions/array.rb +7 -41
  126. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +28 -8
  127. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -6
  128. data/lib/mongoid/criteria/queryable/extensions/date.rb +9 -9
  129. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +11 -12
  130. data/lib/mongoid/criteria/queryable/extensions/hash.rb +4 -41
  131. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -14
  132. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -21
  133. data/lib/mongoid/criteria/queryable/extensions/object.rb +6 -30
  134. data/lib/mongoid/criteria/queryable/extensions/range.rb +49 -17
  135. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +12 -19
  136. data/lib/mongoid/criteria/queryable/extensions/set.rb +4 -5
  137. data/lib/mongoid/criteria/queryable/extensions/string.rb +7 -32
  138. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +7 -22
  139. data/lib/mongoid/criteria/queryable/extensions/time.rb +10 -10
  140. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +19 -7
  141. data/lib/mongoid/criteria/queryable/extensions.rb +1 -4
  142. data/lib/mongoid/criteria/queryable/key.rb +105 -31
  143. data/lib/mongoid/criteria/queryable/macroable.rb +3 -4
  144. data/lib/mongoid/criteria/queryable/mergeable.rb +205 -44
  145. data/lib/mongoid/criteria/queryable/optional.rb +16 -65
  146. data/lib/mongoid/criteria/queryable/options.rb +4 -21
  147. data/lib/mongoid/criteria/queryable/pipeline.rb +5 -15
  148. data/lib/mongoid/criteria/queryable/selectable.rb +471 -168
  149. data/lib/mongoid/criteria/queryable/selector.rb +133 -58
  150. data/lib/mongoid/criteria/queryable/smash.rb +42 -18
  151. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  152. data/lib/mongoid/criteria/queryable.rb +18 -15
  153. data/lib/mongoid/criteria/scopable.rb +29 -21
  154. data/lib/mongoid/criteria/translator.rb +45 -0
  155. data/lib/mongoid/criteria.rb +106 -111
  156. data/lib/mongoid/deprecable.rb +36 -0
  157. data/lib/mongoid/deprecation.rb +25 -0
  158. data/lib/mongoid/document.rb +162 -103
  159. data/lib/mongoid/equality.rb +35 -18
  160. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -5
  161. data/lib/mongoid/errors/callback.rb +2 -3
  162. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  163. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  164. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  165. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  166. data/lib/mongoid/errors/document_not_found.rb +35 -21
  167. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  168. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  169. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  170. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  171. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  172. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  173. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  174. data/lib/mongoid/errors/invalid_config_option.rb +3 -4
  175. data/lib/mongoid/errors/invalid_dependent_strategy.rb +3 -4
  176. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  177. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  178. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  179. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  180. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  181. data/lib/mongoid/errors/invalid_field.rb +8 -7
  182. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  183. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  184. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  185. data/lib/mongoid/errors/invalid_find.rb +2 -3
  186. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  187. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  188. data/lib/mongoid/errors/invalid_index.rb +2 -3
  189. data/lib/mongoid/errors/invalid_options.rb +4 -5
  190. data/lib/mongoid/errors/invalid_path.rb +2 -3
  191. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -5
  192. data/lib/mongoid/errors/invalid_query.rb +40 -0
  193. data/lib/mongoid/errors/invalid_relation.rb +5 -10
  194. data/lib/mongoid/errors/invalid_relation_option.rb +4 -5
  195. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  196. data/lib/mongoid/errors/invalid_session_use.rb +3 -6
  197. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  198. data/lib/mongoid/errors/invalid_storage_options.rb +3 -4
  199. data/lib/mongoid/errors/invalid_storage_parent.rb +4 -3
  200. data/lib/mongoid/errors/invalid_time.rb +2 -3
  201. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  202. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  203. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  204. data/lib/mongoid/errors/mongoid_error.rb +6 -13
  205. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  206. data/lib/mongoid/errors/no_client_config.rb +4 -5
  207. data/lib/mongoid/errors/no_client_database.rb +3 -4
  208. data/lib/mongoid/errors/no_client_hosts.rb +3 -4
  209. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  210. data/lib/mongoid/errors/no_default_client.rb +3 -4
  211. data/lib/mongoid/errors/no_environment.rb +2 -3
  212. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  213. data/lib/mongoid/errors/no_metadata.rb +2 -3
  214. data/lib/mongoid/errors/no_parent.rb +2 -3
  215. data/lib/mongoid/errors/readonly_attribute.rb +3 -4
  216. data/lib/mongoid/errors/readonly_document.rb +3 -6
  217. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  218. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -1
  219. data/lib/mongoid/errors/unknown_attribute.rb +3 -4
  220. data/lib/mongoid/errors/unknown_model.rb +2 -3
  221. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  222. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  223. data/lib/mongoid/errors/validations.rb +2 -1
  224. data/lib/mongoid/errors.rb +18 -4
  225. data/lib/mongoid/evolvable.rb +4 -5
  226. data/lib/mongoid/extensions/array.rb +37 -44
  227. data/lib/mongoid/extensions/big_decimal.rb +35 -21
  228. data/lib/mongoid/extensions/binary.rb +42 -0
  229. data/lib/mongoid/extensions/boolean.rb +10 -6
  230. data/lib/mongoid/extensions/date.rb +32 -25
  231. data/lib/mongoid/extensions/date_time.rb +5 -13
  232. data/lib/mongoid/extensions/decimal128.rb +2 -5
  233. data/lib/mongoid/extensions/false_class.rb +5 -8
  234. data/lib/mongoid/extensions/float.rb +12 -14
  235. data/lib/mongoid/extensions/hash.rb +64 -42
  236. data/lib/mongoid/extensions/integer.rb +12 -16
  237. data/lib/mongoid/extensions/module.rb +3 -4
  238. data/lib/mongoid/extensions/nil_class.rb +2 -5
  239. data/lib/mongoid/extensions/object.rb +27 -52
  240. data/lib/mongoid/extensions/object_id.rb +2 -7
  241. data/lib/mongoid/extensions/range.rb +42 -20
  242. data/lib/mongoid/extensions/regexp.rb +14 -7
  243. data/lib/mongoid/extensions/set.rb +13 -11
  244. data/lib/mongoid/extensions/string.rb +35 -64
  245. data/lib/mongoid/extensions/symbol.rb +6 -22
  246. data/lib/mongoid/extensions/time.rb +38 -22
  247. data/lib/mongoid/extensions/time_with_zone.rb +26 -9
  248. data/lib/mongoid/extensions/true_class.rb +5 -8
  249. data/lib/mongoid/extensions.rb +19 -3
  250. data/lib/mongoid/factory.rb +104 -17
  251. data/lib/mongoid/fields/foreign_key.rb +14 -26
  252. data/lib/mongoid/fields/localized.rb +21 -15
  253. data/lib/mongoid/fields/standard.rb +23 -43
  254. data/lib/mongoid/fields/validators/macro.rb +32 -20
  255. data/lib/mongoid/fields/validators.rb +2 -1
  256. data/lib/mongoid/fields.rb +349 -76
  257. data/lib/mongoid/findable.rb +115 -34
  258. data/lib/mongoid/indexable/specification.rb +5 -18
  259. data/lib/mongoid/indexable/validators/options.rb +8 -9
  260. data/lib/mongoid/indexable.rb +6 -21
  261. data/lib/mongoid/inspectable.rb +4 -11
  262. data/lib/mongoid/interceptable.rb +85 -41
  263. data/lib/mongoid/loggable.rb +13 -16
  264. data/lib/mongoid/matchable.rb +4 -154
  265. data/lib/mongoid/matcher/all.rb +22 -0
  266. data/lib/mongoid/matcher/and.rb +21 -0
  267. data/lib/mongoid/matcher/bits.rb +41 -0
  268. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  269. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  271. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  272. data/lib/mongoid/matcher/elem_match.rb +36 -0
  273. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  274. data/lib/mongoid/matcher/eq.rb +11 -0
  275. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  276. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  277. data/lib/mongoid/matcher/exists.rb +15 -0
  278. data/lib/mongoid/matcher/expression.rb +35 -0
  279. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  280. data/lib/mongoid/matcher/field_expression.rb +62 -0
  281. data/lib/mongoid/matcher/field_operator.rb +54 -0
  282. data/lib/mongoid/matcher/gt.rb +17 -0
  283. data/lib/mongoid/matcher/gte.rb +17 -0
  284. data/lib/mongoid/matcher/in.rb +25 -0
  285. data/lib/mongoid/matcher/lt.rb +17 -0
  286. data/lib/mongoid/matcher/lte.rb +17 -0
  287. data/lib/mongoid/matcher/mod.rb +17 -0
  288. data/lib/mongoid/matcher/ne.rb +16 -0
  289. data/lib/mongoid/matcher/nin.rb +11 -0
  290. data/lib/mongoid/matcher/nor.rb +25 -0
  291. data/lib/mongoid/matcher/not.rb +29 -0
  292. data/lib/mongoid/matcher/or.rb +21 -0
  293. data/lib/mongoid/matcher/regex.rb +41 -0
  294. data/lib/mongoid/matcher/size.rb +26 -0
  295. data/lib/mongoid/matcher/type.rb +99 -0
  296. data/lib/mongoid/matcher.rb +130 -0
  297. data/lib/mongoid/persistable/creatable.rb +23 -30
  298. data/lib/mongoid/persistable/deletable.rb +7 -23
  299. data/lib/mongoid/persistable/destroyable.rb +12 -11
  300. data/lib/mongoid/persistable/incrementable.rb +6 -7
  301. data/lib/mongoid/persistable/logical.rb +4 -6
  302. data/lib/mongoid/persistable/poppable.rb +3 -6
  303. data/lib/mongoid/persistable/pullable.rb +3 -8
  304. data/lib/mongoid/persistable/pushable.rb +14 -10
  305. data/lib/mongoid/persistable/renamable.rb +10 -8
  306. data/lib/mongoid/persistable/savable.rb +16 -9
  307. data/lib/mongoid/persistable/settable.rb +3 -6
  308. data/lib/mongoid/persistable/unsettable.rb +10 -10
  309. data/lib/mongoid/persistable/updatable.rb +99 -30
  310. data/lib/mongoid/persistable/upsertable.rb +23 -9
  311. data/lib/mongoid/persistable.rb +138 -40
  312. data/lib/mongoid/persistence_context.rb +107 -52
  313. data/lib/mongoid/positional.rb +3 -6
  314. data/lib/mongoid/query_cache.rb +18 -234
  315. data/lib/mongoid/railtie.rb +20 -16
  316. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  317. data/lib/mongoid/railties/database.rake +16 -2
  318. data/lib/mongoid/reloadable.rb +19 -22
  319. data/lib/mongoid/scopable.rb +37 -60
  320. data/lib/mongoid/selectable.rb +8 -18
  321. data/lib/mongoid/serializable.rb +33 -34
  322. data/lib/mongoid/shardable.rb +108 -21
  323. data/lib/mongoid/stateful.rb +60 -20
  324. data/lib/mongoid/stringified_symbol.rb +52 -0
  325. data/lib/mongoid/tasks/database.rake +24 -5
  326. data/lib/mongoid/tasks/database.rb +105 -7
  327. data/lib/mongoid/threaded/lifecycle.rb +7 -26
  328. data/lib/mongoid/threaded.rb +80 -67
  329. data/lib/mongoid/timestamps/created/short.rb +2 -1
  330. data/lib/mongoid/timestamps/created.rb +4 -3
  331. data/lib/mongoid/timestamps/short.rb +2 -1
  332. data/lib/mongoid/timestamps/timeless.rb +6 -9
  333. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  334. data/lib/mongoid/timestamps/updated.rb +5 -6
  335. data/lib/mongoid/timestamps.rb +3 -2
  336. data/lib/mongoid/touchable.rb +54 -25
  337. data/lib/mongoid/traversable.rb +185 -61
  338. data/lib/mongoid/utils.rb +22 -0
  339. data/lib/mongoid/validatable/associated.rb +5 -6
  340. data/lib/mongoid/validatable/format.rb +2 -1
  341. data/lib/mongoid/validatable/length.rb +2 -1
  342. data/lib/mongoid/validatable/localizable.rb +3 -4
  343. data/lib/mongoid/validatable/macros.rb +8 -15
  344. data/lib/mongoid/validatable/presence.rb +10 -15
  345. data/lib/mongoid/validatable/queryable.rb +2 -3
  346. data/lib/mongoid/validatable/uniqueness.rb +30 -42
  347. data/lib/mongoid/validatable.rb +16 -32
  348. data/lib/mongoid/version.rb +3 -2
  349. data/lib/mongoid/warnings.rb +44 -0
  350. data/lib/mongoid.rb +50 -17
  351. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  352. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +53 -32
  353. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  354. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  355. data/lib/rails/generators/mongoid_generator.rb +2 -1
  356. data/lib/rails/mongoid.rb +4 -5
  357. data/spec/README.md +33 -0
  358. data/spec/config/mongoid.yml +29 -3
  359. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  360. data/spec/integration/app_spec.rb +345 -0
  361. data/spec/integration/associations/belongs_to_spec.rb +33 -0
  362. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  363. data/spec/integration/associations/embedded_spec.rb +283 -0
  364. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  365. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  366. data/spec/integration/associations/foreign_key_spec.rb +107 -0
  367. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  368. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  369. data/spec/integration/associations/has_many_spec.rb +128 -0
  370. data/spec/integration/associations/has_one_spec.rb +272 -0
  371. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  372. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  373. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  374. data/spec/integration/associations/scope_option_spec.rb +101 -0
  375. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  376. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  377. data/spec/integration/callbacks_models.rb +192 -0
  378. data/spec/integration/callbacks_spec.rb +584 -0
  379. data/spec/integration/contextual/empty_spec.rb +141 -0
  380. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  381. data/spec/integration/criteria/date_field_spec.rb +40 -0
  382. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  383. data/spec/integration/criteria/logical_spec.rb +124 -0
  384. data/spec/integration/criteria/range_spec.rb +359 -0
  385. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  386. data/spec/integration/discriminator_key_spec.rb +391 -0
  387. data/spec/integration/discriminator_value_spec.rb +206 -0
  388. data/spec/integration/document_spec.rb +51 -0
  389. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  390. data/spec/integration/i18n_fallbacks_spec.rb +74 -0
  391. data/spec/integration/matcher_examples_spec.rb +765 -0
  392. data/spec/integration/matcher_operator_data/all.yml +140 -0
  393. data/spec/integration/matcher_operator_data/and.yml +93 -0
  394. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  397. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  398. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  399. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  400. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  401. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  402. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  403. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  404. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  405. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  406. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  407. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  408. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  409. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  410. data/spec/integration/matcher_operator_data/in.yml +210 -0
  411. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  412. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  413. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  414. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  415. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  416. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  417. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  418. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  419. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  420. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  421. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  422. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  423. data/spec/integration/matcher_operator_data/not.yml +196 -0
  424. data/spec/integration/matcher_operator_data/or.yml +137 -0
  425. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  426. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  427. data/spec/integration/matcher_operator_data/size.yml +174 -0
  428. data/spec/integration/matcher_operator_data/type.yml +70 -0
  429. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  430. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  431. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  434. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  435. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  436. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  437. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  438. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  440. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  442. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  444. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  445. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  446. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  447. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  448. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  449. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  450. data/spec/integration/matcher_operator_spec.rb +122 -0
  451. data/spec/integration/matcher_spec.rb +283 -0
  452. data/spec/integration/persistence/range_field_spec.rb +350 -0
  453. data/spec/integration/server_query_spec.rb +141 -0
  454. data/spec/integration/shardable_spec.rb +148 -0
  455. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  456. data/spec/lite_spec_helper.rb +83 -0
  457. data/spec/mongoid/association/accessors_spec.rb +284 -77
  458. data/spec/mongoid/association/auto_save_spec.rb +74 -33
  459. data/spec/mongoid/association/builders_spec.rb +3 -1
  460. data/spec/mongoid/association/constrainable_spec.rb +2 -0
  461. data/spec/mongoid/association/counter_cache_spec.rb +35 -33
  462. data/spec/mongoid/association/depending_spec.rb +431 -338
  463. data/spec/mongoid/association/eager_spec.rb +8 -5
  464. data/spec/mongoid/association/embedded/cyclic_spec.rb +4 -2
  465. data/spec/mongoid/association/embedded/dirty_spec.rb +4 -2
  466. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +4 -1
  467. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +56 -0
  468. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +152 -13
  469. data/spec/mongoid/association/embedded/embedded_in_spec.rb +61 -1
  470. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +2 -0
  471. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +114 -0
  472. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +706 -197
  473. data/spec/mongoid/association/embedded/embeds_many_models.rb +227 -0
  474. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +63 -0
  475. data/spec/mongoid/association/embedded/embeds_many_spec.rb +81 -1
  476. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +2 -0
  477. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +27 -0
  478. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +38 -23
  479. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  480. data/spec/mongoid/association/embedded/embeds_one_models.rb +73 -0
  481. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  482. data/spec/mongoid/association/embedded/embeds_one_spec.rb +77 -1
  483. data/spec/mongoid/association/macros_spec.rb +11 -9
  484. data/spec/mongoid/association/nested/many_spec.rb +2 -0
  485. data/spec/mongoid/association/nested/one_spec.rb +18 -12
  486. data/spec/mongoid/association/options_spec.rb +2 -0
  487. data/spec/mongoid/association/polymorphic_spec.rb +2 -0
  488. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +4 -1
  489. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +111 -16
  490. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +266 -17
  491. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +114 -58
  492. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  493. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  494. data/spec/mongoid/association/referenced/belongs_to_spec.rb +96 -29
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -1
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +67 -4
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +559 -385
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +92 -0
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  502. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +84 -7
  503. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -1
  504. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +132 -0
  505. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +40 -9
  506. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +415 -129
  507. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  508. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +859 -502
  509. data/spec/mongoid/association/referenced/has_many_models.rb +97 -0
  510. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  511. data/spec/mongoid/association/referenced/has_many_spec.rb +51 -3
  512. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +2 -0
  513. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +55 -9
  514. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +34 -4
  515. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +135 -27
  516. data/spec/mongoid/association/referenced/has_one_models.rb +113 -0
  517. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  518. data/spec/mongoid/association/referenced/has_one_spec.rb +87 -7
  519. data/spec/mongoid/association/reflections_spec.rb +2 -0
  520. data/spec/mongoid/association/syncable_spec.rb +48 -32
  521. data/spec/mongoid/association_spec.rb +2 -0
  522. data/spec/mongoid/atomic/modifiers_spec.rb +49 -0
  523. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  524. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  525. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  526. data/spec/mongoid/atomic/paths_spec.rb +93 -12
  527. data/spec/mongoid/atomic_spec.rb +53 -6
  528. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  529. data/spec/mongoid/attributes/nested_spec.rb +149 -78
  530. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  531. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  532. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  533. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  534. data/spec/mongoid/attributes/readonly_spec.rb +24 -22
  535. data/spec/mongoid/attributes_spec.rb +895 -54
  536. data/spec/mongoid/cacheable_spec.rb +6 -4
  537. data/spec/mongoid/changeable_spec.rb +484 -67
  538. data/spec/mongoid/clients/factory_spec.rb +139 -33
  539. data/spec/mongoid/clients/options_spec.rb +76 -54
  540. data/spec/mongoid/clients/sessions_spec.rb +35 -63
  541. data/spec/mongoid/clients/transactions_spec.rb +87 -41
  542. data/spec/mongoid/clients_spec.rb +257 -31
  543. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  544. data/spec/mongoid/composable_spec.rb +2 -0
  545. data/spec/mongoid/config/defaults_spec.rb +160 -0
  546. data/spec/mongoid/config/environment_spec.rb +126 -8
  547. data/spec/mongoid/config/options_spec.rb +22 -3
  548. data/spec/mongoid/config_spec.rb +507 -2
  549. data/spec/mongoid/contextual/aggregable/memory_spec.rb +433 -153
  550. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  551. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  552. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  553. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  554. data/spec/mongoid/contextual/atomic_spec.rb +242 -81
  555. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  556. data/spec/mongoid/contextual/map_reduce_spec.rb +22 -19
  557. data/spec/mongoid/contextual/memory_spec.rb +1828 -303
  558. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  559. data/spec/mongoid/contextual/mongo_spec.rb +3505 -1268
  560. data/spec/mongoid/contextual/none_spec.rb +80 -67
  561. data/spec/mongoid/copyable_spec.rb +697 -40
  562. data/spec/mongoid/copyable_spec_models.rb +47 -0
  563. data/spec/mongoid/criteria/findable_spec.rb +161 -228
  564. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  565. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  566. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  567. data/spec/mongoid/criteria/marshalable_spec.rb +20 -1
  568. data/spec/mongoid/criteria/modifiable_spec.rb +100 -48
  569. data/spec/mongoid/criteria/options_spec.rb +2 -0
  570. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -1
  571. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  572. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +9 -19
  573. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +136 -26
  574. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +13 -0
  576. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +46 -17
  577. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +2 -0
  578. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +2 -15
  579. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +2 -0
  580. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +2 -0
  581. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +119 -0
  582. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +2 -0
  583. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +239 -178
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -1
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +9 -7
  586. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +2 -0
  587. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +7 -70
  588. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +2 -59
  589. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +53 -23
  590. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +41 -1
  591. data/spec/mongoid/criteria/queryable/key_spec.rb +50 -6
  592. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +145 -12
  593. data/spec/mongoid/criteria/queryable/optional_spec.rb +18 -485
  594. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -1
  595. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +2 -0
  596. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -1
  597. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2538 -0
  598. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  599. data/spec/mongoid/criteria/queryable/selectable_spec.rb +1193 -2934
  600. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  601. data/spec/mongoid/criteria/queryable/selector_spec.rb +56 -5
  602. data/spec/mongoid/criteria/queryable/smash_spec.rb +2 -0
  603. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  604. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  605. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  606. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  607. data/spec/mongoid/criteria_spec.rb +1334 -1719
  608. data/spec/mongoid/document_fields_spec.rb +262 -0
  609. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  610. data/spec/mongoid/document_query_spec.rb +89 -0
  611. data/spec/mongoid/document_spec.rb +212 -67
  612. data/spec/mongoid/equality_spec.rb +144 -41
  613. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  614. data/spec/mongoid/errors/callback_spec.rb +2 -0
  615. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  616. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  617. data/spec/mongoid/errors/document_not_found_spec.rb +78 -0
  618. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  619. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +7 -5
  620. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  621. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  622. data/spec/mongoid/errors/invalid_field_spec.rb +3 -1
  623. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  624. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  625. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  626. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  627. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  628. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  629. data/spec/mongoid/errors/invalid_relation_spec.rb +4 -2
  630. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  631. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  632. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  633. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  634. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  635. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  636. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  637. data/spec/mongoid/errors/mongoid_error_spec.rb +24 -8
  638. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  639. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  640. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  641. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  642. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  643. data/spec/mongoid/errors/no_environment_spec.rb +5 -3
  644. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  645. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  646. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  647. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  648. data/spec/mongoid/errors/readonly_document_spec.rb +4 -2
  649. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  650. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -1
  651. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  652. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  653. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  654. data/spec/mongoid/errors/validations_spec.rb +2 -0
  655. data/spec/mongoid/extensions/array_spec.rb +41 -45
  656. data/spec/mongoid/extensions/big_decimal_spec.rb +715 -213
  657. data/spec/mongoid/extensions/binary_spec.rb +46 -9
  658. data/spec/mongoid/extensions/boolean_spec.rb +70 -82
  659. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +339 -0
  660. data/spec/mongoid/extensions/date_spec.rb +58 -140
  661. data/spec/mongoid/extensions/date_time_spec.rb +32 -69
  662. data/spec/mongoid/extensions/decimal128_spec.rb +2 -0
  663. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  664. data/spec/mongoid/extensions/float_spec.rb +66 -73
  665. data/spec/mongoid/extensions/hash_spec.rb +135 -0
  666. data/spec/mongoid/extensions/integer_spec.rb +61 -63
  667. data/spec/mongoid/extensions/module_spec.rb +2 -0
  668. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  669. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  670. data/spec/mongoid/extensions/object_spec.rb +13 -24
  671. data/spec/mongoid/extensions/range_spec.rb +257 -54
  672. data/spec/mongoid/extensions/regexp_spec.rb +70 -20
  673. data/spec/mongoid/extensions/set_spec.rb +108 -0
  674. data/spec/mongoid/extensions/string_spec.rb +146 -57
  675. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  676. data/spec/mongoid/extensions/symbol_spec.rb +20 -25
  677. data/spec/mongoid/extensions/time_spec.rb +668 -106
  678. data/spec/mongoid/extensions/time_with_zone_spec.rb +57 -83
  679. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  680. data/spec/mongoid/extensions_spec.rb +16 -2
  681. data/spec/mongoid/factory_spec.rb +347 -27
  682. data/spec/mongoid/fields/foreign_key_spec.rb +2 -0
  683. data/spec/mongoid/fields/localized_spec.rb +86 -41
  684. data/spec/mongoid/fields/standard_spec.rb +2 -0
  685. data/spec/mongoid/fields_spec.rb +869 -114
  686. data/spec/mongoid/findable_spec.rb +521 -65
  687. data/spec/mongoid/indexable/specification_spec.rb +4 -2
  688. data/spec/mongoid/indexable_spec.rb +87 -32
  689. data/spec/mongoid/inspectable_spec.rb +39 -2
  690. data/spec/mongoid/interceptable_spec.rb +761 -98
  691. data/spec/mongoid/interceptable_spec_models.rb +307 -0
  692. data/spec/mongoid/loggable_spec.rb +2 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  694. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  695. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  696. data/spec/mongoid/mongoizable_spec.rb +285 -0
  697. data/spec/mongoid/persistable/creatable_spec.rb +114 -29
  698. data/spec/mongoid/persistable/deletable_spec.rb +300 -18
  699. data/spec/mongoid/persistable/destroyable_spec.rb +228 -18
  700. data/spec/mongoid/persistable/incrementable_spec.rb +66 -13
  701. data/spec/mongoid/persistable/logical_spec.rb +56 -3
  702. data/spec/mongoid/persistable/poppable_spec.rb +55 -3
  703. data/spec/mongoid/persistable/pullable_spec.rb +108 -6
  704. data/spec/mongoid/persistable/pushable_spec.rb +163 -7
  705. data/spec/mongoid/persistable/renamable_spec.rb +54 -2
  706. data/spec/mongoid/persistable/savable_spec.rb +284 -25
  707. data/spec/mongoid/persistable/settable_spec.rb +91 -8
  708. data/spec/mongoid/persistable/unsettable_spec.rb +55 -3
  709. data/spec/mongoid/persistable/updatable_spec.rb +63 -49
  710. data/spec/mongoid/persistable/upsertable_spec.rb +93 -3
  711. data/spec/mongoid/persistable_spec.rb +85 -9
  712. data/spec/mongoid/persistence_context_spec.rb +60 -59
  713. data/spec/mongoid/positional_spec.rb +2 -0
  714. data/spec/mongoid/query_cache_middleware_spec.rb +50 -0
  715. data/spec/mongoid/query_cache_spec.rb +446 -78
  716. data/spec/mongoid/relations/proxy_spec.rb +9 -7
  717. data/spec/mongoid/reloadable_spec.rb +381 -26
  718. data/spec/mongoid/scopable_spec.rb +206 -38
  719. data/spec/mongoid/selectable_spec.rb +8 -6
  720. data/spec/mongoid/serializable_spec.rb +148 -38
  721. data/spec/mongoid/shardable_models.rb +75 -0
  722. data/spec/mongoid/shardable_spec.rb +239 -34
  723. data/spec/mongoid/stateful_spec.rb +153 -9
  724. data/spec/mongoid/tasks/database_rake_spec.rb +89 -13
  725. data/spec/mongoid/tasks/database_spec.rb +130 -1
  726. data/spec/mongoid/threaded_spec.rb +72 -2
  727. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  728. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  729. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  730. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  731. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  732. data/spec/mongoid/timestamps_spec.rb +400 -10
  733. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  734. data/spec/mongoid/touchable_spec.rb +568 -33
  735. data/spec/mongoid/touchable_spec_models.rb +59 -0
  736. data/spec/mongoid/traversable_spec.rb +1145 -1
  737. data/spec/mongoid/validatable/associated_spec.rb +2 -0
  738. data/spec/mongoid/validatable/format_spec.rb +2 -0
  739. data/spec/mongoid/validatable/length_spec.rb +2 -0
  740. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  741. data/spec/mongoid/validatable/presence_spec.rb +28 -22
  742. data/spec/mongoid/validatable/uniqueness_spec.rb +159 -103
  743. data/spec/mongoid/validatable_spec.rb +5 -3
  744. data/spec/mongoid/warnings_spec.rb +35 -0
  745. data/spec/mongoid_spec.rb +36 -10
  746. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  747. data/spec/rails/mongoid_spec.rb +8 -18
  748. data/spec/shared/LICENSE +20 -0
  749. data/spec/shared/bin/get-mongodb-download-url +17 -0
  750. data/spec/shared/bin/s3-copy +45 -0
  751. data/spec/shared/bin/s3-upload +69 -0
  752. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  753. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  754. data/spec/shared/lib/mrss/constraints.rb +378 -0
  755. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  756. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  757. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  758. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  759. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  760. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  761. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  762. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  763. data/spec/shared/lib/mrss/utils.rb +37 -0
  764. data/spec/shared/share/Dockerfile.erb +321 -0
  765. data/spec/shared/share/haproxy-1.conf +16 -0
  766. data/spec/shared/share/haproxy-2.conf +17 -0
  767. data/spec/shared/shlib/config.sh +27 -0
  768. data/spec/shared/shlib/distro.sh +74 -0
  769. data/spec/shared/shlib/server.sh +416 -0
  770. data/spec/shared/shlib/set_env.sh +169 -0
  771. data/spec/spec_helper.rb +74 -88
  772. data/spec/support/authorization.rb +2 -0
  773. data/spec/support/client_registry.rb +9 -0
  774. data/spec/support/constraints.rb +77 -0
  775. data/spec/support/expectations.rb +21 -3
  776. data/spec/support/helpers.rb +11 -0
  777. data/spec/support/immutable_ids.rb +118 -0
  778. data/spec/support/macros.rb +129 -0
  779. data/spec/{app → support}/models/account.rb +3 -1
  780. data/spec/{app → support}/models/acolyte.rb +2 -0
  781. data/spec/{app → support}/models/actor.rb +3 -1
  782. data/spec/support/models/actress.rb +4 -0
  783. data/spec/{app → support}/models/address.rb +6 -0
  784. data/spec/{app → support}/models/address_component.rb +2 -0
  785. data/spec/{app → support}/models/address_number.rb +2 -0
  786. data/spec/{app → support}/models/agency.rb +2 -0
  787. data/spec/{app → support}/models/agent.rb +2 -0
  788. data/spec/{app → support}/models/album.rb +2 -0
  789. data/spec/{app → support}/models/alert.rb +2 -0
  790. data/spec/{app → support}/models/animal.rb +2 -0
  791. data/spec/{app → support}/models/answer.rb +2 -0
  792. data/spec/{app → support}/models/appointment.rb +2 -0
  793. data/spec/support/models/armrest.rb +9 -0
  794. data/spec/{app → support}/models/article.rb +2 -0
  795. data/spec/{app → support}/models/artist.rb +4 -1
  796. data/spec/{app → support}/models/artwork.rb +2 -0
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +2 -0
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +2 -0
  801. data/spec/{app → support}/models/baby.rb +2 -0
  802. data/spec/{app → support}/models/band.rb +10 -0
  803. data/spec/{app → support}/models/bar.rb +2 -0
  804. data/spec/{app → support}/models/basic.rb +2 -0
  805. data/spec/support/models/bed.rb +3 -0
  806. data/spec/{app → support}/models/big_palette.rb +2 -0
  807. data/spec/{app → support}/models/birthday.rb +2 -0
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +2 -0
  810. data/spec/{app → support}/models/book.rb +3 -0
  811. data/spec/{app → support}/models/breed.rb +2 -0
  812. data/spec/{app → support}/models/browser.rb +3 -1
  813. data/spec/{app → support}/models/building.rb +4 -0
  814. data/spec/{app → support}/models/building_address.rb +2 -0
  815. data/spec/{app → support}/models/bus.rb +2 -0
  816. data/spec/{app → support}/models/business.rb +2 -0
  817. data/spec/{app → support}/models/callback_test.rb +2 -0
  818. data/spec/{app → support}/models/canvas.rb +3 -1
  819. data/spec/support/models/car.rb +3 -0
  820. data/spec/{app → support}/models/cat.rb +2 -0
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +2 -0
  823. data/spec/{app → support}/models/child.rb +2 -0
  824. data/spec/{app → support}/models/child_doc.rb +5 -3
  825. data/spec/{app → support}/models/church.rb +2 -0
  826. data/spec/{app → support}/models/circle.rb +2 -0
  827. data/spec/{app → support}/models/circuit.rb +2 -0
  828. data/spec/support/models/circus.rb +12 -0
  829. data/spec/{app → support}/models/code.rb +4 -0
  830. data/spec/support/models/coding/pull_request.rb +11 -0
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +2 -0
  833. data/spec/{app → support}/models/company.rb +2 -0
  834. data/spec/{app → support}/models/consumption_period.rb +2 -0
  835. data/spec/{app → support}/models/contextable_item.rb +2 -0
  836. data/spec/{app → support}/models/contractor.rb +2 -0
  837. data/spec/{app → support}/models/cookie.rb +2 -0
  838. data/spec/{app → support}/models/country_code.rb +4 -0
  839. data/spec/{app → support}/models/courier_job.rb +2 -0
  840. data/spec/support/models/cover.rb +10 -0
  841. data/spec/support/models/crate.rb +12 -0
  842. data/spec/support/models/customer.rb +10 -0
  843. data/spec/support/models/customer_address.rb +11 -0
  844. data/spec/support/models/deed.rb +7 -0
  845. data/spec/{app → support}/models/definition.rb +2 -0
  846. data/spec/support/models/delegating_patient.rb +15 -0
  847. data/spec/{app → support}/models/description.rb +2 -0
  848. data/spec/{app → support}/models/dictionary.rb +8 -0
  849. data/spec/{app → support}/models/division.rb +2 -0
  850. data/spec/{app → support}/models/doctor.rb +2 -0
  851. data/spec/{app → support}/models/dog.rb +2 -0
  852. data/spec/{app → support}/models/dokument.rb +2 -0
  853. data/spec/{app → support}/models/draft.rb +2 -0
  854. data/spec/{app → support}/models/dragon.rb +2 -0
  855. data/spec/{app → support}/models/driver.rb +3 -1
  856. data/spec/{app → support}/models/drug.rb +2 -0
  857. data/spec/{app → support}/models/dungeon.rb +2 -0
  858. data/spec/{app → support}/models/edit.rb +2 -0
  859. data/spec/{app → support}/models/email.rb +2 -0
  860. data/spec/{app → support}/models/employer.rb +2 -0
  861. data/spec/{app → support}/models/entry.rb +2 -0
  862. data/spec/support/models/eraser.rb +3 -0
  863. data/spec/{app → support}/models/even.rb +2 -0
  864. data/spec/{app → support}/models/event.rb +2 -0
  865. data/spec/{app → support}/models/exhibition.rb +2 -0
  866. data/spec/{app → support}/models/exhibitor.rb +2 -0
  867. data/spec/{app → support}/models/explosion.rb +2 -0
  868. data/spec/{app → support}/models/eye.rb +2 -0
  869. data/spec/{app → support}/models/eye_bowl.rb +2 -0
  870. data/spec/{app → support}/models/face.rb +2 -0
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +2 -0
  873. data/spec/{app → support}/models/filesystem.rb +2 -0
  874. data/spec/{app → support}/models/fire_hydrant.rb +2 -0
  875. data/spec/{app → support}/models/firefox.rb +2 -0
  876. data/spec/{app → support}/models/fish.rb +2 -0
  877. data/spec/{app → support}/models/folder.rb +2 -0
  878. data/spec/{app → support}/models/folder_item.rb +2 -0
  879. data/spec/{app → support}/models/fruits.rb +2 -0
  880. data/spec/{app → support}/models/game.rb +2 -0
  881. data/spec/{app → support}/models/ghost.rb +2 -0
  882. data/spec/support/models/guitar.rb +4 -0
  883. data/spec/support/models/hole.rb +12 -0
  884. data/spec/{app → support}/models/home.rb +2 -0
  885. data/spec/{app → support}/models/house.rb +2 -0
  886. data/spec/{app → support}/models/html_writer.rb +2 -0
  887. data/spec/{app → support}/models/id_key.rb +2 -0
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +2 -0
  890. data/spec/{app → support}/models/implant.rb +11 -0
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +3 -1
  893. data/spec/{app → support}/models/jar.rb +2 -0
  894. data/spec/{app → support}/models/kaleidoscope.rb +2 -0
  895. data/spec/{app → support}/models/kangaroo.rb +3 -1
  896. data/spec/{app → support}/models/label.rb +6 -1
  897. data/spec/{app → support}/models/language.rb +2 -0
  898. data/spec/{app → support}/models/lat_lng.rb +2 -0
  899. data/spec/{app → support}/models/league.rb +2 -0
  900. data/spec/support/models/learner.rb +4 -0
  901. data/spec/{app → support}/models/line_item.rb +2 -0
  902. data/spec/{app → support}/models/location.rb +2 -0
  903. data/spec/{app → support}/models/login.rb +2 -0
  904. data/spec/{app → support}/models/manufacturer.rb +2 -0
  905. data/spec/{app → support}/models/meat.rb +2 -0
  906. data/spec/{app → support}/models/membership.rb +3 -0
  907. data/spec/{app → support}/models/message.rb +2 -0
  908. data/spec/support/models/minim.rb +6 -0
  909. data/spec/{app → support}/models/mixed_drink.rb +2 -0
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +2 -0
  912. data/spec/support/models/my_hash.rb +4 -0
  913. data/spec/{app → support}/models/name.rb +2 -0
  914. data/spec/support/models/name_only.rb +8 -0
  915. data/spec/{app → support}/models/node.rb +2 -0
  916. data/spec/{app → support}/models/note.rb +2 -0
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +2 -0
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +3 -1
  921. data/spec/{app → support}/models/ordered_preference.rb +2 -0
  922. data/spec/{app → support}/models/oscar.rb +2 -0
  923. data/spec/support/models/other_owner_object.rb +4 -0
  924. data/spec/{app → support}/models/override.rb +2 -0
  925. data/spec/{app → support}/models/ownable.rb +2 -0
  926. data/spec/{app → support}/models/owner.rb +4 -0
  927. data/spec/{app → support}/models/pack.rb +2 -0
  928. data/spec/{app → support}/models/page.rb +2 -0
  929. data/spec/{app → support}/models/page_question.rb +2 -0
  930. data/spec/{app → support}/models/palette.rb +3 -1
  931. data/spec/{app → support}/models/parent.rb +2 -0
  932. data/spec/{app → support}/models/parent_doc.rb +2 -0
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +2 -0
  935. data/spec/{app → support}/models/pdf_writer.rb +2 -0
  936. data/spec/support/models/pencil.rb +3 -0
  937. data/spec/{app → support}/models/person.rb +22 -1
  938. data/spec/{app → support}/models/pet.rb +2 -0
  939. data/spec/{app → support}/models/pet_owner.rb +2 -0
  940. data/spec/{app → support}/models/phone.rb +5 -1
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +2 -0
  943. data/spec/{app → support}/models/player.rb +4 -0
  944. data/spec/{app → support}/models/post.rb +2 -0
  945. data/spec/{app → support}/models/post_genre.rb +2 -0
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +2 -0
  948. data/spec/{app → support}/models/princess.rb +2 -0
  949. data/spec/{app → support}/models/product.rb +3 -0
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +2 -0
  952. data/spec/{app → support}/models/pub.rb +2 -0
  953. data/spec/support/models/publication/encyclopedia.rb +11 -0
  954. data/spec/support/models/publication/review.rb +13 -0
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +2 -0
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +2 -0
  959. data/spec/{app → support}/models/quiz.rb +2 -0
  960. data/spec/{app → support}/models/rating.rb +2 -0
  961. data/spec/{app → support}/models/record.rb +2 -0
  962. data/spec/{app → support}/models/registry.rb +3 -0
  963. data/spec/{app → support}/models/role.rb +2 -0
  964. data/spec/{app → support}/models/root_category.rb +2 -0
  965. data/spec/{app → support}/models/sandwich.rb +2 -0
  966. data/spec/{app → support}/models/scheduler.rb +2 -0
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/support/models/scribe.rb +7 -0
  969. data/spec/support/models/sealer.rb +7 -0
  970. data/spec/support/models/seat.rb +24 -0
  971. data/spec/{app → support}/models/seo.rb +2 -0
  972. data/spec/support/models/series.rb +7 -0
  973. data/spec/{app → support}/models/server.rb +2 -0
  974. data/spec/{app → support}/models/service.rb +2 -0
  975. data/spec/{app → support}/models/shape.rb +4 -2
  976. data/spec/{app → support}/models/shelf.rb +2 -0
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +2 -0
  979. data/spec/{app → support}/models/shipping_container.rb +2 -0
  980. data/spec/{app → support}/models/shipping_pack.rb +2 -0
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +2 -0
  983. data/spec/{app → support}/models/short_agent.rb +2 -0
  984. data/spec/{app → support}/models/short_quiz.rb +2 -0
  985. data/spec/{app → support}/models/simple.rb +2 -0
  986. data/spec/{app → support}/models/slave.rb +2 -0
  987. data/spec/{app → support}/models/song.rb +2 -0
  988. data/spec/{app → support}/models/sound.rb +2 -0
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +2 -0
  991. data/spec/{app → support}/models/staff.rb +2 -0
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +2 -0
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +2 -0
  994. data/spec/support/models/store_as_dup_test3.rb +7 -0
  995. data/spec/support/models/store_as_dup_test4.rb +7 -0
  996. data/spec/{app → support}/models/strategy.rb +2 -0
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +2 -0
  999. data/spec/{app → support}/models/subscription.rb +2 -0
  1000. data/spec/{app → support}/models/survey.rb +2 -0
  1001. data/spec/{app → support}/models/symptom.rb +2 -0
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +2 -0
  1004. data/spec/{app → support}/models/target.rb +2 -0
  1005. data/spec/{app → support}/models/template.rb +2 -0
  1006. data/spec/{app → support}/models/thing.rb +2 -0
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +2 -0
  1009. data/spec/{app → support}/models/tool.rb +4 -2
  1010. data/spec/{app → support}/models/topping.rb +2 -0
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +2 -0
  1013. data/spec/{app → support}/models/translation.rb +2 -0
  1014. data/spec/{app → support}/models/tree.rb +2 -0
  1015. data/spec/support/models/truck.rb +7 -0
  1016. data/spec/{app → support}/models/user.rb +2 -0
  1017. data/spec/{app → support}/models/user_account.rb +2 -0
  1018. data/spec/{app → support}/models/validation_callback.rb +2 -0
  1019. data/spec/support/models/vehicle.rb +18 -0
  1020. data/spec/{app → support}/models/version.rb +2 -0
  1021. data/spec/{app → support}/models/vertex.rb +3 -1
  1022. data/spec/{app → support}/models/vet_visit.rb +2 -0
  1023. data/spec/{app → support}/models/video.rb +2 -0
  1024. data/spec/support/models/video_game.rb +3 -0
  1025. data/spec/support/models/washer.rb +7 -0
  1026. data/spec/support/models/weapon.rb +25 -0
  1027. data/spec/{app → support}/models/wiki_page.rb +3 -0
  1028. data/spec/{app → support}/models/word.rb +2 -0
  1029. data/spec/{app → support}/models/word_origin.rb +2 -0
  1030. data/spec/{app → support}/models/writer.rb +4 -2
  1031. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1032. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1033. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1034. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1035. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1036. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1037. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1038. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1039. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1040. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1041. data/spec/support/shared/time.rb +53 -0
  1042. data/spec/support/spec_config.rb +64 -0
  1043. data.tar.gz.sig +1 -2
  1044. metadata +1158 -615
  1045. metadata.gz.sig +0 -0
  1046. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  1047. data/lib/mongoid/errors/eager_load.rb +0 -22
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -16
  1049. data/lib/mongoid/matchable/all.rb +0 -27
  1050. data/lib/mongoid/matchable/and.rb +0 -30
  1051. data/lib/mongoid/matchable/default.rb +0 -72
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -34
  1053. data/lib/mongoid/matchable/exists.rb +0 -23
  1054. data/lib/mongoid/matchable/gt.rb +0 -23
  1055. data/lib/mongoid/matchable/gte.rb +0 -23
  1056. data/lib/mongoid/matchable/in.rb +0 -24
  1057. data/lib/mongoid/matchable/lt.rb +0 -23
  1058. data/lib/mongoid/matchable/lte.rb +0 -23
  1059. data/lib/mongoid/matchable/ne.rb +0 -21
  1060. data/lib/mongoid/matchable/nin.rb +0 -22
  1061. data/lib/mongoid/matchable/nor.rb +0 -37
  1062. data/lib/mongoid/matchable/or.rb +0 -33
  1063. data/lib/mongoid/matchable/regexp.rb +0 -27
  1064. data/lib/mongoid/matchable/size.rb +0 -21
  1065. data/lib/support/ruby_version.rb +0 -26
  1066. data/spec/app/models/actress.rb +0 -2
  1067. data/spec/app/models/augmentation.rb +0 -11
  1068. data/spec/app/models/bed.rb +0 -1
  1069. data/spec/app/models/car.rb +0 -1
  1070. data/spec/app/models/circus.rb +0 -7
  1071. data/spec/app/models/eraser.rb +0 -1
  1072. data/spec/app/models/learner.rb +0 -2
  1073. data/spec/app/models/my_hash.rb +0 -2
  1074. data/spec/app/models/passport.rb +0 -5
  1075. data/spec/app/models/pencil.rb +0 -1
  1076. data/spec/app/models/powerup.rb +0 -11
  1077. data/spec/app/models/profile.rb +0 -5
  1078. data/spec/app/models/series.rb +0 -4
  1079. data/spec/app/models/truck.rb +0 -3
  1080. data/spec/app/models/vehicle.rb +0 -11
  1081. data/spec/app/models/video_game.rb +0 -1
  1082. data/spec/app/models/weapon.rb +0 -11
  1083. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -58
  1084. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -58
  1085. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  1086. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1087. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1088. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1089. data/spec/mongoid/matchable/elem_match_spec.rb +0 -106
  1090. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1091. data/spec/mongoid/matchable/gt_spec.rb +0 -86
  1092. data/spec/mongoid/matchable/gte_spec.rb +0 -84
  1093. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1094. data/spec/mongoid/matchable/lt_spec.rb +0 -85
  1095. data/spec/mongoid/matchable/lte_spec.rb +0 -85
  1096. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1097. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1098. data/spec/mongoid/matchable/nor_spec.rb +0 -209
  1099. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1100. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1101. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1102. data/spec/mongoid/matchable_spec.rb +0 -853
  1103. /data/spec/{app → support}/models/array_field.rb +0 -0
  1104. /data/spec/{app → support}/models/updatable.rb +0 -0
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
4
+ require_relative '../embeds_many_models.rb'
2
5
 
3
6
  describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4
7
 
@@ -112,7 +115,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
112
115
  context "when the parent is not a new record" do
113
116
 
114
117
  let(:person) do
115
- Person.create
118
+ Person.create!
116
119
  end
117
120
 
118
121
  let(:address) do
@@ -131,7 +134,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
131
134
  context "when appending more than one document at once" do
132
135
 
133
136
  let(:person) do
134
- Person.create
137
+ Person.create!
135
138
  end
136
139
 
137
140
  let(:address_one) do
@@ -207,7 +210,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
207
210
  context "when the parent is not a new record" do
208
211
 
209
212
  let(:parent_role) do
210
- Role.create(name: "CEO")
213
+ Role.create!(name: "CEO")
211
214
  end
212
215
 
213
216
  let(:child_role) do
@@ -226,7 +229,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
226
229
 
227
230
  context "when the child has one sided many to many relation" do
228
231
  let(:person) do
229
- Person.create
232
+ Person.create!
230
233
  end
231
234
 
232
235
  let(:message) do
@@ -309,7 +312,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
309
312
  context "when the parent is not a new record" do
310
313
 
311
314
  let(:person) do
312
- Person.create
315
+ Person.create!
313
316
  end
314
317
 
315
318
  let(:address) do
@@ -330,11 +333,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
330
333
  context "when setting via an overridden method from the parent" do
331
334
 
332
335
  let!(:person) do
333
- Person.create
336
+ Person.create!
334
337
  end
335
338
 
336
339
  let!(:address) do
337
- person.addresses.create(street: "Alt Treptow")
340
+ person.addresses.create!(street: "Alt Treptow")
338
341
  end
339
342
 
340
343
  let!(:new_address) do
@@ -342,7 +345,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
342
345
  end
343
346
 
344
347
  before do
345
- person.update_attributes(set_addresses: [ new_address ])
348
+ person.update_attributes!(set_addresses: [ new_address ])
346
349
  end
347
350
 
348
351
  it "overwrites the existing addresses" do
@@ -372,7 +375,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
372
375
 
373
376
  before do
374
377
  person.addresses = [ address_two ]
375
- person.save
378
+ person.save!
376
379
  end
377
380
 
378
381
  it "sets the new documents" do
@@ -406,7 +409,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
406
409
 
407
410
  before do
408
411
  doctor.addresses = [ address_one ]
409
- doctor.save
412
+ doctor.save!
410
413
  end
411
414
 
412
415
  it "sets the documents" do
@@ -425,7 +428,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
425
428
 
426
429
  before do
427
430
  doctor.addresses = [ address_two ]
428
- doctor.save
431
+ doctor.save!
429
432
  end
430
433
 
431
434
  it "sets the new documents" do
@@ -443,7 +446,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
443
446
  context "when replacing an existing relation" do
444
447
 
445
448
  let(:person) do
446
- Person.create(addresses: addresses)
449
+ Person.create!(addresses: addresses)
447
450
  end
448
451
 
449
452
  let(:addresses) do
@@ -504,7 +507,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
504
507
  end
505
508
 
506
509
  let(:tracking_id) do
507
- MyCompany::Model::TrackingId.create
510
+ MyCompany::Model::TrackingId.create!
508
511
  end
509
512
 
510
513
  let(:history) do
@@ -539,7 +542,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
539
542
  inflect.singular("address_numbers", "address_number")
540
543
  end
541
544
  slave.address_numbers << AddressNumber.new(country_code: 1)
542
- slave.save
545
+ slave.save!
543
546
  end
544
547
 
545
548
  it "requires an inflection to determine the class" do
@@ -550,15 +553,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
550
553
  context "when setting the entire tree via a hash" do
551
554
 
552
555
  let(:person) do
553
- Person.create
556
+ Person.create!
554
557
  end
555
558
 
556
559
  let!(:address_one) do
557
- person.addresses.create(street: "Tauentzienstr")
560
+ person.addresses.create!(street: "Tauentzienstr")
558
561
  end
559
562
 
560
563
  let!(:address_two) do
561
- person.addresses.create(street: "Kudamm")
564
+ person.addresses.create!(street: "Kudamm")
562
565
  end
563
566
 
564
567
  let(:attributes) do
@@ -569,7 +572,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
569
572
 
570
573
  before do
571
574
  attributes["addresses"][0]["city"] = "Berlin"
572
- person.update_attributes(attributes)
575
+ person.update_attributes!(attributes)
573
576
  end
574
577
 
575
578
  it "sets the new attributes" do
@@ -585,15 +588,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
585
588
  context "when setting an embedded sub-document tree via a hash" do
586
589
 
587
590
  let(:person) do
588
- Person.create
591
+ Person.create!
589
592
  end
590
593
 
591
594
  let!(:address_one) do
592
- person.addresses.create(street: "Tauentzienstr")
595
+ person.addresses.create!(street: "Tauentzienstr")
593
596
  end
594
597
 
595
598
  let!(:location_one) do
596
- person.addresses.first.locations.create(name: "Work")
599
+ person.addresses.first.locations.create!(name: "Work")
597
600
  end
598
601
 
599
602
  let(:attributes) do
@@ -605,7 +608,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
605
608
  before do
606
609
  attributes["city"] = "Berlin"
607
610
  attributes["locations"][0]["name"] = "Home"
608
- person.addresses.first.update_attributes(attributes)
611
+ person.addresses.first.update_attributes!(attributes)
609
612
  end
610
613
 
611
614
  it "sets the new attributes on the address" do
@@ -678,7 +681,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
678
681
  context "when the parent is not a new record" do
679
682
 
680
683
  let(:parent_role) do
681
- Role.create(name: "CTO")
684
+ Role.create!(name: "CTO")
682
685
  end
683
686
 
684
687
  let(:child_role) do
@@ -746,7 +749,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
746
749
  context "when the parent is persisted" do
747
750
 
748
751
  let(:person) do
749
- Person.create
752
+ Person.create!
750
753
  end
751
754
 
752
755
  let(:address) do
@@ -795,7 +798,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
795
798
  context "when saving the parent" do
796
799
 
797
800
  before do
798
- person.save
801
+ person.save!
799
802
  person.reload
800
803
  end
801
804
 
@@ -809,7 +812,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
809
812
  context "when setting on a reload" do
810
813
 
811
814
  let(:person) do
812
- Person.create
815
+ Person.create!
813
816
  end
814
817
 
815
818
  let(:address) do
@@ -879,7 +882,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
879
882
  context "when the documents are not new records" do
880
883
 
881
884
  let(:parent_role) do
882
- Role.create
885
+ Role.create!
883
886
  end
884
887
 
885
888
  let(:child_role) do
@@ -909,13 +912,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
909
912
  describe "#as_document" do
910
913
 
911
914
  let!(:person) do
912
- Person.create
915
+ Person.create!
913
916
  end
914
917
 
915
918
  context 'when a string is used to access an attribute' do
916
919
 
917
920
  let!(:address) do
918
- person.addresses.create(street: "one")
921
+ person.addresses.create!(street: "one")
919
922
  end
920
923
 
921
924
  let(:document) do
@@ -930,7 +933,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
930
933
  context 'when a symbol is used to access an attribute' do
931
934
 
932
935
  let!(:address) do
933
- person.addresses.create(street: "one")
936
+ person.addresses.create!(street: "one")
934
937
  end
935
938
 
936
939
  let(:document) do
@@ -945,7 +948,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
945
948
  context "when the relation has no default scope" do
946
949
 
947
950
  let!(:address) do
948
- person.addresses.create(street: "one")
951
+ person.addresses.create!(street: "one")
949
952
  end
950
953
 
951
954
  let(:document) do
@@ -1102,7 +1105,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1102
1105
  context "when providing nested attributes" do
1103
1106
 
1104
1107
  let(:person) do
1105
- Person.create
1108
+ Person.create!
1106
1109
  end
1107
1110
 
1108
1111
  let(:address) do
@@ -1116,7 +1119,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1116
1119
  context "when followed by a save" do
1117
1120
 
1118
1121
  before do
1119
- address.save
1122
+ address.save!
1120
1123
  end
1121
1124
 
1122
1125
  let(:location) do
@@ -1136,13 +1139,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1136
1139
  context "when the parent has been persisted" do
1137
1140
 
1138
1141
  let(:person) do
1139
- Person.create
1142
+ Person.create!
1140
1143
  end
1141
1144
 
1142
1145
  context "when the children are persisted" do
1143
1146
 
1144
1147
  let!(:address) do
1145
- person.addresses.create(street: "High St")
1148
+ person.addresses.create!(street: "High St")
1146
1149
  end
1147
1150
 
1148
1151
  let!(:relation) do
@@ -1258,7 +1261,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1258
1261
  context "when the parent is not a new record" do
1259
1262
 
1260
1263
  let(:person) do
1261
- Person.create
1264
+ Person.create!
1262
1265
  end
1263
1266
 
1264
1267
  let(:address) do
@@ -1277,7 +1280,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1277
1280
  context "when concatenating an empty array" do
1278
1281
 
1279
1282
  let(:person) do
1280
- Person.create
1283
+ Person.create!
1281
1284
  end
1282
1285
 
1283
1286
  before do
@@ -1293,7 +1296,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1293
1296
  context "when appending more than one document at once" do
1294
1297
 
1295
1298
  let(:person) do
1296
- Person.create
1299
+ Person.create!
1297
1300
  end
1298
1301
 
1299
1302
  let(:address_one) do
@@ -1365,7 +1368,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1365
1368
  context "when the parent is not a new record" do
1366
1369
 
1367
1370
  let(:parent_role) do
1368
- Role.create(name: "CEO")
1371
+ Role.create!(name: "CEO")
1369
1372
  end
1370
1373
 
1371
1374
  let(:child_role) do
@@ -1386,17 +1389,262 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1386
1389
  describe "#count" do
1387
1390
 
1388
1391
  let(:person) do
1389
- Person.create
1392
+ Person.create!
1390
1393
  end
1391
1394
 
1392
1395
  before do
1393
- person.addresses.create(street: "Upper")
1396
+ person.addresses.create!(street: "Upper")
1394
1397
  person.addresses.build(street: "Bond")
1398
+ person.addresses.build(street: "Lower")
1395
1399
  end
1396
1400
 
1397
1401
  it "returns the number of persisted documents" do
1398
1402
  expect(person.addresses.count).to eq(1)
1399
1403
  end
1404
+
1405
+ context 'block form' do
1406
+ it "iterates across all documents" do
1407
+ expect(person.addresses.count {|a| a.persisted? }).to eq(1)
1408
+ expect(person.addresses.count {|a| !a.persisted? }).to eq(2)
1409
+ expect(person.addresses.count {|a| a.street.include?('on') }).to eq(1)
1410
+ expect(person.addresses.count {|a| a.street.ends_with?('er') }).to eq(2)
1411
+ end
1412
+ end
1413
+
1414
+ context 'argument form' do
1415
+ it "behaves correctly when given a model instance" do
1416
+ expect(person.addresses.count(person.addresses.first)).to eq(1)
1417
+ end
1418
+
1419
+ it "behaves correctly when given a non-model instance" do
1420
+ expect(person.addresses.count(1)).to eq(0)
1421
+ end
1422
+ end
1423
+ end
1424
+
1425
+ describe "#any?" do
1426
+
1427
+ let(:person) do
1428
+ Person.create!
1429
+ end
1430
+
1431
+ context "when documents are persisted" do
1432
+ before do
1433
+ person.addresses.create!(street: "Upper")
1434
+ end
1435
+
1436
+ it "returns true" do
1437
+ expect(person.addresses.any?).to be true
1438
+ end
1439
+
1440
+ it "block form iterates across all documents" do
1441
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be true
1442
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be false
1443
+ end
1444
+
1445
+ context 'argument form' do
1446
+ it "behaves correctly when given a model instance" do
1447
+ expect(person.addresses.any?(person.addresses.first)).to be true
1448
+ end
1449
+
1450
+ it "behaves correctly when given a non-model instance" do
1451
+ expect(person.addresses.any?(1)).to be false
1452
+ end
1453
+ end
1454
+ end
1455
+
1456
+ context "when documents are not persisted" do
1457
+ before do
1458
+ person.addresses.build(street: "Bond")
1459
+ end
1460
+
1461
+ it "returns true" do
1462
+ expect(person.addresses.any?).to be true
1463
+ end
1464
+
1465
+ it "block form iterates across all documents" do
1466
+ expect(person.addresses.any? {|a| a.street == "Upper" }).to be false
1467
+ expect(person.addresses.any? {|a| a.street == "Bond" }).to be true
1468
+ end
1469
+
1470
+ context 'argument form' do
1471
+ it "behaves correctly when given a model instance" do
1472
+ expect(person.addresses.any?(person.addresses.first)).to be true
1473
+ end
1474
+
1475
+ it "behaves correctly when given a non-model instance" do
1476
+ expect(person.addresses.any?(1)).to be false
1477
+ end
1478
+ end
1479
+ end
1480
+
1481
+ context "when documents are not present" do
1482
+ it "returns false" do
1483
+ expect(person.addresses.any?).to be false
1484
+ end
1485
+
1486
+ it "block form iterates across all documents" do
1487
+ expect(person.addresses.any?(&:a)).to be false
1488
+ end
1489
+
1490
+ it "argument form is supported" do
1491
+ expect(person.addresses.any?(1)).to be false
1492
+ end
1493
+ end
1494
+ end
1495
+
1496
+ describe "#all?" do
1497
+
1498
+ let(:person) do
1499
+ Person.create!
1500
+ end
1501
+
1502
+ context "when documents are persisted" do
1503
+ before do
1504
+ person.addresses.create!(street: "Upper")
1505
+ end
1506
+
1507
+ it "returns true" do
1508
+ expect(person.addresses.all?).to be true
1509
+ end
1510
+
1511
+ it "block form iterates across all documents" do
1512
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be true
1513
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be false
1514
+ end
1515
+
1516
+ context 'argument form' do
1517
+ it "behaves correctly when given a model instance" do
1518
+ expect(person.addresses.all?(person.addresses.first)).to be true
1519
+ end
1520
+
1521
+ it "behaves correctly when given a non-model instance" do
1522
+ expect(person.addresses.all?(1)).to be false
1523
+ end
1524
+ end
1525
+ end
1526
+
1527
+ context "when documents are not persisted" do
1528
+ before do
1529
+ person.addresses.build(street: "Bond")
1530
+ end
1531
+
1532
+ it "returns true" do
1533
+ expect(person.addresses.all?).to be true
1534
+ end
1535
+
1536
+ it "block form iterates across all documents" do
1537
+ expect(person.addresses.all? {|a| a.street == "Upper" }).to be false
1538
+ expect(person.addresses.all? {|a| a.street == "Bond" }).to be true
1539
+ end
1540
+
1541
+ context 'argument form' do
1542
+ it "behaves correctly when given a model instance" do
1543
+ expect(person.addresses.all?(person.addresses.first)).to be true
1544
+ end
1545
+
1546
+ it "behaves correctly when given a non-model instance" do
1547
+ expect(person.addresses.all?(1)).to be false
1548
+ end
1549
+ end
1550
+ end
1551
+
1552
+ context "when documents are not present" do
1553
+ it "returns false" do
1554
+ expect(person.addresses.all?).to be true
1555
+ end
1556
+
1557
+ it "block form iterates across all documents" do
1558
+ expect(person.addresses.all?(&:foo)).to be true
1559
+ end
1560
+
1561
+ context 'argument form' do
1562
+ it "behaves correctly when given nil" do
1563
+ expect(person.addresses.all?(nil)).to be true
1564
+ end
1565
+
1566
+ it "behaves correctly when given a non-model instance" do
1567
+ expect(person.addresses.all?(1)).to be true
1568
+ end
1569
+ end
1570
+ end
1571
+ end
1572
+
1573
+ describe "#none?" do
1574
+
1575
+ let(:person) do
1576
+ Person.create!
1577
+ end
1578
+
1579
+ context "when documents are persisted" do
1580
+ before do
1581
+ person.addresses.create!(street: "Upper")
1582
+ end
1583
+
1584
+ it "returns true" do
1585
+ expect(person.addresses.none?).to be false
1586
+ end
1587
+
1588
+ it "block form iterates across all documents" do
1589
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be false
1590
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be true
1591
+ end
1592
+
1593
+ context 'argument form' do
1594
+ it "behaves correctly when given a model instance" do
1595
+ expect(person.addresses.none?(person.addresses.first)).to be false
1596
+ end
1597
+
1598
+ it "behaves correctly when given a non-model instance" do
1599
+ expect(person.addresses.none?(1)).to be true
1600
+ end
1601
+ end
1602
+ end
1603
+
1604
+ context "when documents are not persisted" do
1605
+ before do
1606
+ person.addresses.build(street: "Bond")
1607
+ end
1608
+
1609
+ it "returns true" do
1610
+ expect(person.addresses.none?).to be false
1611
+ end
1612
+
1613
+ it "block form iterates across all documents" do
1614
+ expect(person.addresses.none? {|a| a.street == "Upper" }).to be true
1615
+ expect(person.addresses.none? {|a| a.street == "Bond" }).to be false
1616
+ end
1617
+
1618
+ context 'argument form' do
1619
+ it "behaves correctly when given a model instance" do
1620
+ expect(person.addresses.none?(person.addresses.first)).to be false
1621
+ end
1622
+
1623
+ it "behaves correctly when given a non-model instance" do
1624
+ expect(person.addresses.none?(1)).to be true
1625
+ end
1626
+ end
1627
+ end
1628
+
1629
+ context "when documents are not present" do
1630
+ it "returns false" do
1631
+ expect(person.addresses.none?).to be true
1632
+ end
1633
+
1634
+ it "block form iterates across all documents" do
1635
+ expect(person.addresses.none?(&:a)).to be true
1636
+ end
1637
+
1638
+ context 'argument form' do
1639
+ it "behaves correctly when given nil" do
1640
+ expect(person.addresses.none?(nil)).to be true
1641
+ end
1642
+
1643
+ it "behaves correctly when given a non-model instance" do
1644
+ expect(person.addresses.none?(1)).to be true
1645
+ end
1646
+ end
1647
+ end
1400
1648
  end
1401
1649
 
1402
1650
  describe "#create" do
@@ -1404,11 +1652,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1404
1652
  context "when providing multiple attributes" do
1405
1653
 
1406
1654
  let(:person) do
1407
- Person.create
1655
+ Person.create!
1408
1656
  end
1409
1657
 
1410
1658
  let!(:addresses) do
1411
- person.addresses.create([{ street: "Bond" }, { street: "Upper" }])
1659
+ person.addresses.create!([{ street: "Bond" }, { street: "Upper" }])
1412
1660
  end
1413
1661
 
1414
1662
  it "creates multiple documents" do
@@ -1431,11 +1679,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1431
1679
  context "when the relation is not cyclic" do
1432
1680
 
1433
1681
  let(:person) do
1434
- Person.create
1682
+ Person.create!
1435
1683
  end
1436
1684
 
1437
1685
  let!(:address) do
1438
- person.addresses.create(street: "Bond") do |address|
1686
+ person.addresses.create!(street: "Bond") do |address|
1439
1687
  address.state = "CA"
1440
1688
  end
1441
1689
  end
@@ -1479,7 +1727,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1479
1727
  context "when embedding a multi word named document" do
1480
1728
 
1481
1729
  let!(:component) do
1482
- person.address_components.create(street: "Test")
1730
+ person.address_components.create!(street: "Test")
1483
1731
  end
1484
1732
 
1485
1733
  it "saves the embedded document" do
@@ -1491,11 +1739,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1491
1739
  context "when the relation is cyclic" do
1492
1740
 
1493
1741
  let!(:entry) do
1494
- Entry.create(title: "hi")
1742
+ Entry.create!(title: "hi")
1495
1743
  end
1496
1744
 
1497
1745
  let!(:child_entry) do
1498
- entry.child_entries.create(title: "hello")
1746
+ entry.child_entries.create!(title: "hello")
1499
1747
  end
1500
1748
 
1501
1749
  it "creates a new child" do
@@ -1507,7 +1755,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1507
1755
  describe "#create!" do
1508
1756
 
1509
1757
  let(:person) do
1510
- Person.create
1758
+ Person.create!
1511
1759
  end
1512
1760
 
1513
1761
  context "when providing multiple attributes" do
@@ -1614,51 +1862,56 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1614
1862
  end
1615
1863
  end
1616
1864
 
1617
- describe "#delete" do
1618
-
1619
- let(:person) do
1620
- Person.new
1621
- end
1865
+ %i[ delete delete_one ].each do |method|
1866
+ describe "\##{method}" do
1867
+ let(:address_one) { Address.new(street: "first") }
1868
+ let(:address_two) { Address.new(street: "second") }
1622
1869
 
1623
- let(:address_one) do
1624
- Address.new(street: "first")
1625
- end
1870
+ before do
1871
+ person.addresses << [ address_one, address_two ]
1872
+ end
1626
1873
 
1627
- let(:address_two) do
1628
- Address.new(street: "second")
1629
- end
1874
+ shared_examples_for 'deleting from the collection' do
1875
+ context 'when the document exists in the relation' do
1876
+ let!(:deleted) do
1877
+ person.addresses.send(method, address_one)
1878
+ end
1630
1879
 
1631
- before do
1632
- person.addresses << [ address_one, address_two ]
1633
- end
1880
+ it 'deletes the document' do
1881
+ expect(person.addresses).to eq([ address_two ])
1882
+ expect(person.reload.addresses).to eq([ address_two ]) if person.persisted?
1883
+ end
1634
1884
 
1635
- context "when the document exists in the relation" do
1885
+ it 'deletes the document from the unscoped' do
1886
+ expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
1887
+ end
1636
1888
 
1637
- let!(:deleted) do
1638
- person.addresses.delete(address_one)
1639
- end
1889
+ it 'reindexes the relation' do
1890
+ expect(address_two._index).to eq(0)
1891
+ end
1640
1892
 
1641
- it "deletes the document" do
1642
- expect(person.addresses).to eq([ address_two ])
1643
- end
1893
+ it 'returns the document' do
1894
+ expect(deleted).to eq(address_one)
1895
+ end
1896
+ end
1644
1897
 
1645
- it "deletes the document from the unscoped" do
1646
- expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
1898
+ context 'when the document does not exist' do
1899
+ it 'returns nil' do
1900
+ expect(person.addresses.send(method, Address.new)).to be_nil
1901
+ end
1902
+ end
1647
1903
  end
1648
1904
 
1649
- it "reindexes the relation" do
1650
- expect(address_two._index).to eq(0)
1651
- end
1905
+ context 'when the root document is unpersisted' do
1906
+ let(:person) { Person.new }
1652
1907
 
1653
- it "returns the document" do
1654
- expect(deleted).to eq(address_one)
1908
+ it_behaves_like 'deleting from the collection'
1655
1909
  end
1656
- end
1657
1910
 
1658
- context "when the document does not exist" do
1911
+ context 'when the root document is persisted' do
1912
+ let(:person) { Person.create }
1659
1913
 
1660
- it "returns nil" do
1661
- expect(person.addresses.delete(Address.new)).to be_nil
1914
+ it_behaves_like 'deleting from the collection'
1662
1915
  end
1663
1916
  end
1664
1917
  end
@@ -1666,7 +1919,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1666
1919
  describe "#delete_if" do
1667
1920
 
1668
1921
  let(:person) do
1669
- Person.create
1922
+ Person.create!
1670
1923
  end
1671
1924
 
1672
1925
  context "when the documents are new" do
@@ -1715,11 +1968,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1715
1968
  context "when the documents persisted" do
1716
1969
 
1717
1970
  let!(:address_one) do
1718
- person.addresses.create(street: "Bond")
1971
+ person.addresses.create!(street: "Bond")
1719
1972
  end
1720
1973
 
1721
1974
  let!(:address_two) do
1722
- person.addresses.create(street: "Upper")
1975
+ person.addresses.create!(street: "Upper")
1723
1976
  end
1724
1977
 
1725
1978
  context "when a block is provided" do
@@ -1774,7 +2027,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1774
2027
  describe "##{method}" do
1775
2028
 
1776
2029
  let(:person) do
1777
- Person.create
2030
+ Person.create!
1778
2031
  end
1779
2032
 
1780
2033
  context "when the documents are new" do
@@ -1828,11 +2081,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1828
2081
  context "when the documents persisted" do
1829
2082
 
1830
2083
  let!(:address_one) do
1831
- person.addresses.create(street: "Bond")
2084
+ person.addresses.create!(street: "Bond")
1832
2085
  end
1833
2086
 
1834
2087
  let!(:address_two) do
1835
- person.addresses.create(street: "Upper")
2088
+ person.addresses.create!(street: "Upper")
1836
2089
  end
1837
2090
 
1838
2091
  context "when conditions are provided" do
@@ -1879,7 +2132,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1879
2132
  context "when removing and resaving" do
1880
2133
 
1881
2134
  let(:owner) do
1882
- PetOwner.create(title: "AKC")
2135
+ PetOwner.create!(title: "AKC")
1883
2136
  end
1884
2137
 
1885
2138
  before do
@@ -1962,6 +2215,79 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1962
2215
  end
1963
2216
  end
1964
2217
  end
2218
+
2219
+ context "when modifying the document beforehand" do
2220
+ let(:parent) { EmmParent.new }
2221
+
2222
+ before do
2223
+
2224
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2225
+ parent.save!
2226
+
2227
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2228
+
2229
+ parent.blocks.destroy_all(:name => 'test')
2230
+ end
2231
+
2232
+ it "deletes the correct document in the database" do
2233
+ expect(parent.reload.blocks.length).to eq(0)
2234
+ end
2235
+ end
2236
+
2237
+ context "when nil _id" do
2238
+ let(:parent) { EmmParent.new }
2239
+
2240
+ before do
2241
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2242
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2243
+ parent.save!
2244
+
2245
+ parent.blocks.destroy_all(:name => 'test')
2246
+ end
2247
+
2248
+ it "deletes only the matching documents in the database" do
2249
+ expect(parent.reload.blocks.length).to eq(1)
2250
+ end
2251
+ end
2252
+
2253
+ # Since without an _id field we must us a $pullAll with the attributes of
2254
+ # the embedded document, if you modify it beforehand, the query will not
2255
+ # be able to find the correct document to pull.
2256
+ context "when modifying the document with nil _id" do
2257
+ let(:parent) { EmmParent.new }
2258
+
2259
+ before do
2260
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2261
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test2', children: [size: 1, order: 1])
2262
+ parent.save!
2263
+
2264
+ parent.blocks[0].children[0].assign_attributes(size: 2)
2265
+
2266
+ parent.blocks.destroy_all(:name => 'test')
2267
+ end
2268
+
2269
+ it "does not delete the correct documents" do
2270
+ expect(parent.reload.blocks.length).to eq(2)
2271
+ end
2272
+ end
2273
+
2274
+ context "when documents with and without _id" do
2275
+ let(:parent) { EmmParent.new }
2276
+
2277
+ before do
2278
+ parent.blocks << EmmBlock.new(_id: nil, name: 'test', children: [size: 1, order: 1])
2279
+ parent.blocks << EmmBlock.new(name: 'test', children: [size: 1, order: 1])
2280
+ parent.save!
2281
+
2282
+ parent.blocks[1].children[0].assign_attributes(size: 2)
2283
+
2284
+ parent.blocks.destroy_all(:name => 'test')
2285
+ end
2286
+
2287
+ it "does not delete the correct documents" do
2288
+ expect(parent.reload.blocks.length).to eq(0)
2289
+ end
2290
+ end
1965
2291
  end
1966
2292
  end
1967
2293
 
@@ -1975,13 +2301,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
1975
2301
  describe "#exists?" do
1976
2302
 
1977
2303
  let!(:person) do
1978
- Person.create
2304
+ Person.create!
1979
2305
  end
1980
2306
 
1981
2307
  context "when documents exist in the database" do
1982
2308
 
1983
2309
  before do
1984
- person.addresses.create(street: "Bond St")
2310
+ person.addresses.create!(street: "Bond St")
1985
2311
  end
1986
2312
 
1987
2313
  it "returns true" do
@@ -2031,32 +2357,22 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2031
2357
  context "when the id does not match" do
2032
2358
 
2033
2359
  context "when config set to raise error" do
2034
-
2035
- before do
2036
- Mongoid.raise_not_found_error = true
2037
- end
2360
+ config_override :raise_not_found_error, true
2038
2361
 
2039
2362
  it "raises an error" do
2040
2363
  expect {
2041
2364
  person.addresses.find(BSON::ObjectId.new)
2042
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2365
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2043
2366
  end
2044
2367
  end
2045
2368
 
2046
2369
  context "when config set not to raise error" do
2370
+ config_override :raise_not_found_error, false
2047
2371
 
2048
2372
  let(:address) do
2049
2373
  person.addresses.find(BSON::ObjectId.new)
2050
2374
  end
2051
2375
 
2052
- before do
2053
- Mongoid.raise_not_found_error = false
2054
- end
2055
-
2056
- after do
2057
- Mongoid.raise_not_found_error = true
2058
- end
2059
-
2060
2376
  it "returns nil" do
2061
2377
  expect(address).to be_nil
2062
2378
  end
@@ -2080,36 +2396,64 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2080
2396
  context "when the ids do not match" do
2081
2397
 
2082
2398
  context "when config set to raise error" do
2083
-
2084
- before do
2085
- Mongoid.raise_not_found_error = true
2086
- end
2399
+ config_override :raise_not_found_error, true
2087
2400
 
2088
2401
  it "raises an error" do
2089
2402
  expect {
2090
2403
  person.addresses.find([ BSON::ObjectId.new ])
2091
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2404
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Address with id\(s\)/)
2092
2405
  end
2093
2406
  end
2094
2407
 
2095
2408
  context "when config set not to raise error" do
2409
+ config_override :raise_not_found_error, false
2096
2410
 
2097
2411
  let(:addresses) do
2098
2412
  person.addresses.find([ BSON::ObjectId.new ])
2099
2413
  end
2100
2414
 
2101
- before do
2102
- Mongoid.raise_not_found_error = false
2415
+ it "returns an empty array" do
2416
+ expect(addresses).to be_empty
2417
+ end
2418
+ end
2419
+ end
2420
+ end
2421
+
2422
+ context "with block" do
2423
+ let!(:author) do
2424
+ Person.create!(title: 'Person')
2425
+ end
2426
+
2427
+ let!(:video_one) do
2428
+ author.videos.create!(title: 'video one')
2429
+ end
2430
+
2431
+ let!(:video_two) do
2432
+ author.videos.create!(title: 'video two')
2433
+ end
2434
+
2435
+ it "finds one" do
2436
+ expect(
2437
+ author.videos.find do |video|
2438
+ video.title == 'video one'
2103
2439
  end
2440
+ ).to eq(video_one)
2441
+ end
2104
2442
 
2105
- after do
2106
- Mongoid.raise_not_found_error = true
2443
+ it "returns first match of multiple" do
2444
+ expect(
2445
+ author.videos.find do |video|
2446
+ ['video one', 'video two'].include?(video.title)
2107
2447
  end
2448
+ ).to be_a(Video)
2449
+ end
2108
2450
 
2109
- it "returns an empty array" do
2110
- expect(addresses).to be_empty
2451
+ it "returns nil when not found" do
2452
+ expect(
2453
+ author.videos.find do |video|
2454
+ video.title == 'non exiting one'
2111
2455
  end
2112
- end
2456
+ ).to be_nil
2113
2457
  end
2114
2458
  end
2115
2459
  end
@@ -2117,7 +2461,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2117
2461
  describe "#find_or_create_by" do
2118
2462
 
2119
2463
  let(:person) do
2120
- Person.create
2464
+ Person.create!
2121
2465
  end
2122
2466
 
2123
2467
  let!(:address) do
@@ -2160,11 +2504,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2160
2504
  # context "when the child belongs to another document" do
2161
2505
  #
2162
2506
  # let(:product) do
2163
- # Product.create
2507
+ # Product.create!
2164
2508
  # end
2165
2509
  #
2166
2510
  # let(:purchase) do
2167
- # Purchase.create
2511
+ # Purchase.create!
2168
2512
  # end
2169
2513
  #
2170
2514
  # let(:line_item) do
@@ -2183,7 +2527,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2183
2527
  describe "#find_or_create_by!" do
2184
2528
 
2185
2529
  let(:person) do
2186
- Person.create
2530
+ Person.create!
2187
2531
  end
2188
2532
 
2189
2533
  let!(:address) do
@@ -2235,11 +2579,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2235
2579
  # context "when the child belongs to another document" do
2236
2580
  #
2237
2581
  # let(:product) do
2238
- # Product.create
2582
+ # Product.create!
2239
2583
  # end
2240
2584
  #
2241
2585
  # let(:purchase) do
2242
- # Purchase.create
2586
+ # Purchase.create!
2243
2587
  # end
2244
2588
  #
2245
2589
  # let(:line_item) do
@@ -2357,11 +2701,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2357
2701
  describe "#method_missing" do
2358
2702
 
2359
2703
  let!(:person) do
2360
- Person.create
2704
+ Person.create!
2361
2705
  end
2362
2706
 
2363
2707
  let!(:address_one) do
2364
- person.addresses.create(
2708
+ person.addresses.create!(
2365
2709
  street: "Market",
2366
2710
  state: "CA",
2367
2711
  services: [ "1", "2" ]
@@ -2369,7 +2713,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2369
2713
  end
2370
2714
 
2371
2715
  let!(:address_two) do
2372
- person.addresses.create(
2716
+ person.addresses.create!(
2373
2717
  street: "Madison",
2374
2718
  state: "NY",
2375
2719
  services: [ "1", "2" ]
@@ -2413,13 +2757,26 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2413
2757
  end
2414
2758
 
2415
2759
  context "when providing a criteria class method" do
2760
+ context "without keyword arguments" do
2416
2761
 
2417
- let(:addresses) do
2418
- person.addresses.california
2762
+ let(:addresses) do
2763
+ person.addresses.california
2764
+ end
2765
+
2766
+ it "applies the criteria to the documents" do
2767
+ expect(addresses).to eq([ address_one ])
2768
+ end
2419
2769
  end
2420
2770
 
2421
- it "applies the criteria to the documents" do
2422
- expect(addresses).to eq([ address_one ])
2771
+ context "with keyword arguments" do
2772
+
2773
+ let(:addresses) do
2774
+ person.addresses.city_and_state(city: "Sacramento", state: "CA")
2775
+ end
2776
+
2777
+ it "applies the criteria to the documents" do
2778
+ expect(addresses).to eq([])
2779
+ end
2423
2780
  end
2424
2781
  end
2425
2782
 
@@ -2504,17 +2861,17 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2504
2861
  describe "#pop" do
2505
2862
 
2506
2863
  let(:person) do
2507
- Person.create
2864
+ Person.create!
2508
2865
  end
2509
2866
 
2510
2867
  context "when no argument is provided" do
2511
2868
 
2512
2869
  let!(:address_one) do
2513
- person.addresses.create(street: "sonnenallee")
2870
+ person.addresses.create!(street: "sonnenallee")
2514
2871
  end
2515
2872
 
2516
2873
  let!(:address_two) do
2517
- person.addresses.create(street: "hermannstr")
2874
+ person.addresses.create!(street: "hermannstr")
2518
2875
  end
2519
2876
 
2520
2877
  let!(:popped) do
@@ -2537,11 +2894,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2537
2894
  context "when an integer is provided" do
2538
2895
 
2539
2896
  let!(:address_one) do
2540
- person.addresses.create(street: "sonnenallee")
2897
+ person.addresses.create!(street: "sonnenallee")
2541
2898
  end
2542
2899
 
2543
2900
  let!(:address_two) do
2544
- person.addresses.create(street: "hermannstr")
2901
+ person.addresses.create!(street: "hermannstr")
2545
2902
  end
2546
2903
 
2547
2904
  context "when the number is zero" do
@@ -2623,17 +2980,17 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2623
2980
  describe "#shift" do
2624
2981
 
2625
2982
  let(:person) do
2626
- Person.create
2983
+ Person.create!
2627
2984
  end
2628
2985
 
2629
2986
  context "when no argument is provided" do
2630
2987
 
2631
2988
  let!(:address_one) do
2632
- person.addresses.create(street: "sonnenallee")
2989
+ person.addresses.create!(street: "sonnenallee")
2633
2990
  end
2634
2991
 
2635
2992
  let!(:address_two) do
2636
- person.addresses.create(street: "hermannstr")
2993
+ person.addresses.create!(street: "hermannstr")
2637
2994
  end
2638
2995
 
2639
2996
  let!(:shifted) do
@@ -2656,11 +3013,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2656
3013
  context "when an integer is provided" do
2657
3014
 
2658
3015
  let!(:address_one) do
2659
- person.addresses.create(street: "sonnenallee")
3016
+ person.addresses.create!(street: "sonnenallee")
2660
3017
  end
2661
3018
 
2662
3019
  let!(:address_two) do
2663
- person.addresses.create(street: "hermannstr")
3020
+ person.addresses.create!(street: "hermannstr")
2664
3021
  end
2665
3022
 
2666
3023
  context "when the number is zero" do
@@ -2808,11 +3165,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2808
3165
  describe "##{method}" do
2809
3166
 
2810
3167
  let(:person) do
2811
- Person.create
3168
+ Person.create!
2812
3169
  end
2813
3170
 
2814
3171
  before do
2815
- person.addresses.create(street: "Upper")
3172
+ person.addresses.create!(street: "Upper")
2816
3173
  person.addresses.build(street: "Bond")
2817
3174
  end
2818
3175
 
@@ -2850,7 +3207,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2850
3207
  context "when there are no documents present" do
2851
3208
 
2852
3209
  let(:person) do
2853
- Person.create
3210
+ Person.create!
2854
3211
  end
2855
3212
 
2856
3213
  it "updates nothing" do
@@ -2861,11 +3218,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2861
3218
  context "when documents are present" do
2862
3219
 
2863
3220
  let(:person) do
2864
- Person.create
3221
+ Person.create!
2865
3222
  end
2866
3223
 
2867
3224
  let!(:address) do
2868
- person.addresses.create(street: "Hobrecht", number: 27)
3225
+ person.addresses.create!(street: "Hobrecht", number: 27)
2869
3226
  end
2870
3227
 
2871
3228
  context "when updating with a where clause" do
@@ -2900,16 +3257,16 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2900
3257
  context "when updating the bottom level" do
2901
3258
 
2902
3259
  let!(:person) do
2903
- Person.create
3260
+ Person.create!
2904
3261
  end
2905
3262
 
2906
3263
  let!(:address) do
2907
- person.addresses.create(street: "Joachimstr")
3264
+ person.addresses.create!(street: "Joachimstr")
2908
3265
  end
2909
3266
 
2910
3267
  let!(:location) do
2911
- address.locations.create(name: "vacation", number: 0)
2912
- address.locations.create(name: "work", number: 3)
3268
+ address.locations.create!(name: "vacation", number: 0)
3269
+ address.locations.create!(name: "work", number: 3)
2913
3270
  end
2914
3271
 
2915
3272
  context "when updating with replacement of embedded array" do
@@ -2917,7 +3274,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2917
3274
  context "when updating with a hash" do
2918
3275
 
2919
3276
  before do
2920
- address.update_attributes(locations: [{ name: "home" }])
3277
+ address.update_attributes!(locations: [{ name: "home" }])
2921
3278
  end
2922
3279
 
2923
3280
  it "updates the attributes" do
@@ -2938,7 +3295,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
2938
3295
 
2939
3296
  before do
2940
3297
  location.number = 7
2941
- location.save
3298
+ location.save!
2942
3299
  end
2943
3300
 
2944
3301
  let(:updated_location_number) do
@@ -3071,7 +3428,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3071
3428
  context "when creating a persisted tree" do
3072
3429
 
3073
3430
  let(:quiz) do
3074
- Quiz.create
3431
+ Quiz.create!
3075
3432
  end
3076
3433
 
3077
3434
  let(:page) do
@@ -3136,7 +3493,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3136
3493
  context "when saving the root" do
3137
3494
 
3138
3495
  before do
3139
- person.save
3496
+ person.save!
3140
3497
  end
3141
3498
 
3142
3499
  it "persists the first level document" do
@@ -3162,7 +3519,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3162
3519
 
3163
3520
  describe "replacing the entire embedded list" do
3164
3521
 
3165
- context "when an embeds many relationship contains a nil as the first item" do
3522
+ context "when an embeds many relationship contains nil as the first item" do
3166
3523
 
3167
3524
  let(:person) do
3168
3525
  Person.create!
@@ -3183,7 +3540,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3183
3540
  end
3184
3541
  end
3185
3542
 
3186
- context "when an embeds many relationship contains a nil in the middle of the list" do
3543
+ context "when an embeds many relationship contains nil in the middle of the list" do
3187
3544
 
3188
3545
  let(:person) do
3189
3546
  Person.create!
@@ -3204,7 +3561,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3204
3561
  end
3205
3562
  end
3206
3563
 
3207
- context "when an embeds many relationship contains a nil at the end of the list" do
3564
+ context "when an embeds many relationship contains nil at the end of the list" do
3208
3565
 
3209
3566
  let(:person) do
3210
3567
  Person.create!
@@ -3228,7 +3585,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3228
3585
 
3229
3586
  describe "appending to the embedded list" do
3230
3587
 
3231
- context "when appending a nil to the first position in an embedded list" do
3588
+ context "when appending nil to the first position in an embedded list" do
3232
3589
 
3233
3590
  let(:person) do
3234
3591
  Person.create! phone_numbers: []
@@ -3247,7 +3604,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3247
3604
  end
3248
3605
  end
3249
3606
 
3250
- context "when appending a nil into the middle of an embedded list" do
3607
+ context "when appending nil into the middle of an embedded list" do
3251
3608
 
3252
3609
  let(:person) do
3253
3610
  Person.create! phone_numbers: []
@@ -3266,7 +3623,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3266
3623
  end
3267
3624
  end
3268
3625
 
3269
- context "when appending a nil to the end of an embedded list" do
3626
+ context "when appending nil to the end of an embedded list" do
3270
3627
 
3271
3628
  let(:person) do
3272
3629
  Person.create! phone_numbers: []
@@ -3290,11 +3647,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3290
3647
  context "when accessing the parent in a destroy callback" do
3291
3648
 
3292
3649
  let!(:league) do
3293
- League.create
3650
+ League.create!
3294
3651
  end
3295
3652
 
3296
3653
  let!(:division) do
3297
- league.divisions.create
3654
+ league.divisions.create!
3298
3655
  end
3299
3656
 
3300
3657
  before do
@@ -3309,15 +3666,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3309
3666
  context "when updating the parent with all attributes" do
3310
3667
 
3311
3668
  let!(:person) do
3312
- Person.create
3669
+ Person.create!
3313
3670
  end
3314
3671
 
3315
3672
  let!(:address) do
3316
- person.addresses.create
3673
+ person.addresses.create!
3317
3674
  end
3318
3675
 
3319
3676
  before do
3320
- person.update_attributes(person.attributes)
3677
+ person.update_attributes!(person.attributes)
3321
3678
  end
3322
3679
 
3323
3680
  it "does not duplicate the embedded documents" do
@@ -3332,13 +3689,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3332
3689
  context "when embedding children named versions" do
3333
3690
 
3334
3691
  let(:acolyte) do
3335
- Acolyte.create(name: "test")
3692
+ Acolyte.create!(name: "test")
3336
3693
  end
3337
3694
 
3338
3695
  context "when creating a child" do
3339
3696
 
3340
3697
  let(:version) do
3341
- acolyte.versions.create(number: 1)
3698
+ acolyte.versions.create!(number: 1)
3342
3699
  end
3343
3700
 
3344
3701
  it "allows the operation" do
@@ -3363,7 +3720,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3363
3720
  let!(:account) do
3364
3721
  Account.new(name: "Testing").tap do |acct|
3365
3722
  acct.memberships.build
3366
- acct.save
3723
+ acct.save!
3367
3724
  end
3368
3725
  end
3369
3726
 
@@ -3375,10 +3732,10 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3375
3732
 
3376
3733
  before do
3377
3734
  account.name = ""
3378
- account.save
3379
3735
  end
3380
3736
 
3381
3737
  it "does not lose the parent reference" do
3738
+ expect(account.save).to eq false
3382
3739
  expect(from_db.memberships.first.account).to eq(account)
3383
3740
  end
3384
3741
  end
@@ -3398,15 +3755,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3398
3755
  context "when moving an embedded document from one parent to another" do
3399
3756
 
3400
3757
  let!(:person_one) do
3401
- Person.create
3758
+ Person.create!
3402
3759
  end
3403
3760
 
3404
3761
  let!(:person_two) do
3405
- Person.create
3762
+ Person.create!
3406
3763
  end
3407
3764
 
3408
3765
  let!(:address) do
3409
- person_one.addresses.create(street: "Kudamm")
3766
+ person_one.addresses.create!(street: "Kudamm")
3410
3767
  end
3411
3768
 
3412
3769
  before do
@@ -3441,7 +3798,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3441
3798
  context "when the relation has a default scope" do
3442
3799
 
3443
3800
  let!(:person) do
3444
- Person.create
3801
+ Person.create!
3445
3802
  end
3446
3803
 
3447
3804
  context "when the default scope is a sort" do
@@ -3511,7 +3868,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3511
3868
  context "when indexing the documents" do
3512
3869
 
3513
3870
  let!(:person) do
3514
- Person.create
3871
+ Person.create!
3515
3872
  end
3516
3873
 
3517
3874
  context "when the documents have a limiting default scope" do
@@ -3560,18 +3917,18 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3560
3917
  context "when the embedded document has an array field" do
3561
3918
 
3562
3919
  let!(:person) do
3563
- Person.create
3920
+ Person.create!
3564
3921
  end
3565
3922
 
3566
3923
  let!(:video) do
3567
- person.videos.create
3924
+ person.videos.create!
3568
3925
  end
3569
3926
 
3570
3927
  context "when saving the array on a persisted document" do
3571
3928
 
3572
3929
  before do
3573
3930
  video.genres = [ "horror", "scifi" ]
3574
- video.save
3931
+ video.save!
3575
3932
  end
3576
3933
 
3577
3934
  it "sets the value" do
@@ -3596,7 +3953,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3596
3953
 
3597
3954
  before do
3598
3955
  loaded_video.genres = [ "comedy" ]
3599
- loaded_video.save
3956
+ loaded_video.save!
3600
3957
  end
3601
3958
 
3602
3959
  it "sets the new value" do
@@ -3614,15 +3971,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3614
3971
  context "when destroying an embedded document" do
3615
3972
 
3616
3973
  let(:person) do
3617
- Person.create
3974
+ Person.create!
3618
3975
  end
3619
3976
 
3620
3977
  let!(:address_one) do
3621
- person.addresses.create(street: "hobrecht")
3978
+ person.addresses.create!(street: "hobrecht")
3622
3979
  end
3623
3980
 
3624
3981
  let!(:address_two) do
3625
- person.addresses.create(street: "maybachufer")
3982
+ person.addresses.create!(street: "maybachufer")
3626
3983
  end
3627
3984
 
3628
3985
  before do
@@ -3661,6 +4018,28 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3661
4018
  end
3662
4019
  end
3663
4020
 
4021
+ context "when destroying a document with multiple nil _ids" do
4022
+ let(:congress) { EmmCongress.create! }
4023
+
4024
+ before do
4025
+ congress.legislators << EmmLegislator.new(_id: nil, a: 1)
4026
+ congress.legislators << EmmLegislator.new(_id: nil, a: 2)
4027
+
4028
+ congress.legislators[0].destroy
4029
+ end
4030
+
4031
+ it "deletes the correct document locally" do
4032
+ pending "MONGOID-5394"
4033
+ expect(congress.legislators.length).to eq(1)
4034
+ expect(congress.legislators.first.a).to eq(1)
4035
+ end
4036
+
4037
+ it "only deletes the one document" do
4038
+ pending "MONGOID-5394"
4039
+ expect(congress.reload.legislators.length).to eq(1)
4040
+ end
4041
+ end
4042
+
3664
4043
  context "when adding a document" do
3665
4044
 
3666
4045
  let(:person) do
@@ -3694,7 +4073,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3694
4073
  context "when the association has an order defined" do
3695
4074
 
3696
4075
  let(:person) do
3697
- Person.create
4076
+ Person.create!
3698
4077
  end
3699
4078
 
3700
4079
  let(:message_one) do
@@ -3725,11 +4104,11 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3725
4104
 
3726
4105
  before do
3727
4106
  person.aliases = [ { name: "A", priority: 3 }, { name: "B", priority: 4 }]
3728
- person.save
4107
+ person.save!
3729
4108
  end
3730
4109
 
3731
4110
  let!(:person2) do
3732
- Person.create( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
4111
+ Person.create!( aliases: [ { name: "C", priority: 1 }, { name: "D", priority: 2 }])
3733
4112
  end
3734
4113
 
3735
4114
  it "allows ordering on a key of an embedded document" do
@@ -3764,7 +4143,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3764
4143
  context "when updating multiple levels in one update" do
3765
4144
 
3766
4145
  let!(:person) do
3767
- Person.create(
4146
+ Person.create!(
3768
4147
  addresses: [
3769
4148
  { locations: [{ name: "home" }]}
3770
4149
  ]
@@ -3778,7 +4157,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3778
4157
  end
3779
4158
 
3780
4159
  before do
3781
- from_db.update_attributes(
4160
+ from_db.update_attributes!(
3782
4161
  addresses: [
3783
4162
  { locations: [{ name: "work" }]}
3784
4163
  ]
@@ -3798,15 +4177,15 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3798
4177
  context "when the embedded relation sorts on a boolean" do
3799
4178
 
3800
4179
  let(:circuit) do
3801
- Circuit.create
4180
+ Circuit.create!
3802
4181
  end
3803
4182
 
3804
4183
  let!(:bus_one) do
3805
- circuit.buses.create(saturday: true)
4184
+ circuit.buses.create!(saturday: true)
3806
4185
  end
3807
4186
 
3808
4187
  let!(:bus_two) do
3809
- circuit.buses.create(saturday: false)
4188
+ circuit.buses.create!(saturday: false)
3810
4189
  end
3811
4190
 
3812
4191
  it "orders properly with the boolean" do
@@ -3817,7 +4196,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3817
4196
  context "when batch replacing multiple relations in a single update" do
3818
4197
 
3819
4198
  let(:document) do
3820
- Person.create
4199
+ Person.create!
3821
4200
  end
3822
4201
 
3823
4202
  let(:person) do
@@ -3825,23 +4204,23 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
3825
4204
  end
3826
4205
 
3827
4206
  let!(:symptom_one) do
3828
- person.symptoms.create
4207
+ person.symptoms.create!
3829
4208
  end
3830
4209
 
3831
4210
  let!(:symptom_two) do
3832
- person.symptoms.create
4211
+ person.symptoms.create!
3833
4212
  end
3834
4213
 
3835
4214
  let!(:appointment_one) do
3836
- person.appointments.create
4215
+ person.appointments.create!
3837
4216
  end
3838
4217
 
3839
4218
  let!(:appointment_two) do
3840
- person.appointments.create
4219
+ person.appointments.create!
3841
4220
  end
3842
4221
 
3843
4222
  before do
3844
- person.update_attributes(
4223
+ person.update_attributes!(
3845
4224
  appointments: [ appointment_one.as_document, appointment_two.as_document ],
3846
4225
  symptoms: [ symptom_one.as_document, symptom_two.as_document ]
3847
4226
  )
@@ -4174,7 +4553,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4174
4553
  context "when the parent has an after create callback" do
4175
4554
 
4176
4555
  before do
4177
- server.save
4556
+ server.save!
4178
4557
  end
4179
4558
 
4180
4559
  it "does not push the embedded documents twice" do
@@ -4186,13 +4565,13 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4186
4565
  context "when embedded documents are stored without ids" do
4187
4566
 
4188
4567
  let!(:band) do
4189
- Band.create(name: "Moderat")
4568
+ Band.create!(name: "Moderat")
4190
4569
  end
4191
4570
 
4192
4571
  before do
4193
4572
  band.collection.
4194
4573
  find(_id: band.id).
4195
- update_one("$set" => { records: [{ name: "Moderat" }]})
4574
+ update_one("$set" => { records: [{ _id: BSON::ObjectId.new, name: "Moderat" }]})
4196
4575
  end
4197
4576
 
4198
4577
  context "when loading the documents" do
@@ -4236,7 +4615,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4236
4615
  company = Company.new
4237
4616
  4.times { |i| company.staffs << Staff.new(age: 50 + i)}
4238
4617
  2.times { |i| company.staffs << Staff.new(age: 40)}
4239
- company.save
4618
+ company.save!
4240
4619
  company.staffs.delete_if {|x| x.age >= 50}
4241
4620
  expect(company.staffs.count).to eq(2)
4242
4621
  end
@@ -4313,7 +4692,7 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4313
4692
  context "when the parent is persisted" do
4314
4693
 
4315
4694
  let(:zone) do
4316
- DNS::Zone.create
4695
+ DNS::Zone.create!
4317
4696
  end
4318
4697
 
4319
4698
  let(:soa_1) do
@@ -4351,4 +4730,134 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
4351
4730
  end
4352
4731
  end
4353
4732
  end
4733
+
4734
+ context "when trying to persist the empty list" do
4735
+
4736
+ context "in an embeds_many relation" do
4737
+
4738
+ let(:band) { Band.create! }
4739
+
4740
+ before do
4741
+ band.labels = []
4742
+ band.save!
4743
+ end
4744
+
4745
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4746
+
4747
+ it "persists the empty list" do
4748
+ expect(reloaded_band).to have_key(:labels)
4749
+ expect(reloaded_band[:labels]).to eq []
4750
+ end
4751
+ end
4752
+
4753
+ context "in a nested embeds_many relation" do
4754
+
4755
+ let(:survey) { Survey.create!(questions: [Question.new]) }
4756
+
4757
+ before do
4758
+ survey.questions.first.answers = []
4759
+ survey.save!
4760
+ end
4761
+
4762
+ let(:reloaded_survey) { Survey.collection.find(_id: survey._id).first }
4763
+
4764
+ it "persists the empty list" do
4765
+ expect(reloaded_survey).to have_key(:questions)
4766
+ expect(reloaded_survey[:questions][0]).to have_key(:answers)
4767
+ expect(reloaded_survey[:questions][0][:answers]).to eq []
4768
+ end
4769
+ end
4770
+
4771
+ context "when not setting the embeds_many field" do
4772
+
4773
+ let(:band) { Band.create! }
4774
+
4775
+ let(:reloaded_band) { Band.collection.find(_id: band._id).first }
4776
+
4777
+ it "does not persist the empty list" do
4778
+ expect(reloaded_band).to_not have_key(:labels)
4779
+ end
4780
+ end
4781
+ end
4782
+
4783
+ context "when using assign_attributes with an already populated array" do
4784
+ let(:post) { EmmPost.create! }
4785
+
4786
+ before do
4787
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'a'}],
4788
+ user_tags: [{id: BSON::ObjectId.new, title: 'b'}])
4789
+ post.save!
4790
+ post.reload
4791
+ post.assign_attributes(company_tags: [{id: BSON::ObjectId.new, title: 'c'}],
4792
+ user_tags: [])
4793
+ post.save!
4794
+ post.reload
4795
+ end
4796
+
4797
+ it "has the correct embedded documents" do
4798
+ expect(post.company_tags.length).to eq(1)
4799
+ expect(post.company_tags.first.title).to eq("c")
4800
+ end
4801
+ end
4802
+
4803
+ context "when the parent fails validation" do
4804
+ let(:school) { EmmSchool.new }
4805
+ let(:student) { school.students.new }
4806
+
4807
+ before do
4808
+ student.save
4809
+ end
4810
+
4811
+ it "does not mark the parent as persisted" do
4812
+ expect(school.persisted?).to be false
4813
+ end
4814
+
4815
+ it "does not mark the child as persisted" do
4816
+ expect(student.persisted?).to be false
4817
+ end
4818
+
4819
+ it "does not persist the parent" do
4820
+ expect(School.count).to eq(0)
4821
+ end
4822
+ end
4823
+
4824
+ context "when doing assign_attributes then assignment" do
4825
+
4826
+ let(:post) do
4827
+ EmmPost.create!(
4828
+ company_tags: [ EmmCompanyTag.new(title: "1"), EmmCompanyTag.new(title: "1") ],
4829
+ user_tags: [ EmmUserTag.new(title: "1"), EmmUserTag.new(title: "1") ]
4830
+ )
4831
+ end
4832
+
4833
+ let(:from_db) { EmmPost.find(post.id) }
4834
+
4835
+ before do
4836
+ post.assign_attributes(
4837
+ company_tags: [ EmmCompanyTag.new(title: '3'), EmmCompanyTag.new(title: '4') ]
4838
+ )
4839
+ post.user_tags = [ EmmUserTag.new(title: '3'), EmmUserTag.new(title: '4') ]
4840
+ post.save!
4841
+ end
4842
+
4843
+ it "persists the associations correctly" do
4844
+ expect(from_db.user_tags.size).to eq(2)
4845
+ expect(from_db.company_tags.size).to eq(2)
4846
+ end
4847
+ end
4848
+
4849
+ context "when assigning hashes" do
4850
+ let(:user) { EmmUser.create! }
4851
+
4852
+ before do
4853
+ user.orders = [ { sku: 1 }, { sku: 2 } ]
4854
+ end
4855
+
4856
+ it "creates the objects correctly" do
4857
+ expect(user.orders.first).to be_a(EmmOrder)
4858
+ expect(user.orders.last).to be_a(EmmOrder)
4859
+
4860
+ expect(user.orders.map(&:sku).sort).to eq([ 1, 2 ])
4861
+ end
4862
+ end
4354
4863
  end