mongoid 7.1.1 → 8.1.0

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