mongoid 7.0.13 → 8.0.8

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