mongoid 7.2.1 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -1,17 +1,16 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  require "spec_helper"
5
+ require_relative "../has_and_belongs_to_many_models"
5
6
 
6
7
  describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
8
+ config_override :raise_not_found_error, true
7
9
 
8
10
  around(:each) do |example|
9
- original_raise_not_found_error = Mongoid.raise_not_found_error
10
11
  original_preferences_association = Person.relations["preferences"]
11
- Mongoid.raise_not_found_error = true
12
12
  Person.has_and_belongs_to_many :preferences, autosave: true
13
13
  example.run
14
- Mongoid.raise_not_found_error = original_raise_not_found_error
15
14
  Person.relations["preferences"] = original_preferences_association
16
15
  end
17
16
 
@@ -27,7 +26,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
27
26
  context "when the inverse_of is nil" do
28
27
 
29
28
  let!(:article) do
30
- Article.create
29
+ Article.create!
31
30
  end
32
31
 
33
32
  context "when the child document is new" do
@@ -48,7 +47,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
48
47
  context "when the child document is not new" do
49
48
 
50
49
  let(:preference) do
51
- Preference.create
50
+ Preference.create!
52
51
  end
53
52
 
54
53
  it "does not persist the child document" do
@@ -80,7 +79,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
80
79
  context "when the parent is not a new record" do
81
80
 
82
81
  let(:person) do
83
- Person.create
82
+ Person.create!
84
83
  end
85
84
 
86
85
  let!(:preference) do
@@ -124,11 +123,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
124
123
  context "when appending in a parent create block" do
125
124
 
126
125
  let!(:preference) do
127
- Preference.create(name: "testing")
126
+ Preference.create!(name: "testing")
128
127
  end
129
128
 
130
129
  let!(:person) do
131
- Person.create do |doc|
130
+ Person.create! do |doc|
132
131
  doc.preferences << preference
133
132
  end
134
133
  end
@@ -213,7 +212,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
213
212
  context "when the child is already persisted" do
214
213
 
215
214
  let!(:persisted) do
216
- Preference.create(name: "testy")
215
+ Preference.create!(name: "testy")
217
216
  end
218
217
 
219
218
  let(:preference) do
@@ -222,7 +221,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
222
221
 
223
222
  before do
224
223
  person.preferences.send(method, preference)
225
- person.save
224
+ person.save!
226
225
  end
227
226
 
228
227
  it "adds the documents to the relation" do
@@ -253,7 +252,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
253
252
  context "when setting via the associated ids" do
254
253
 
255
254
  let!(:persisted) do
256
- Preference.create(name: "testy")
255
+ Preference.create!(name: "testy")
257
256
  end
258
257
 
259
258
  let(:preference) do
@@ -265,7 +264,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
265
264
  end
266
265
 
267
266
  before do
268
- person.save
267
+ person.save!
269
268
  end
270
269
 
271
270
  it "adds the documents to the relation" do
@@ -293,7 +292,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
293
292
  context "when the parent is not a new record" do
294
293
 
295
294
  let(:person) do
296
- Person.create
295
+ Person.create!
297
296
  end
298
297
 
299
298
  let(:preference) do
@@ -375,11 +374,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
375
374
  context "when both sides have been persisted" do
376
375
 
377
376
  let(:person) do
378
- Person.create
377
+ Person.create!
379
378
  end
380
379
 
381
380
  let(:event) do
382
- Event.create
381
+ Event.create!
383
382
  end
384
383
 
385
384
  before do
@@ -428,15 +427,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
428
427
  context "when the relation also includes a has_many relation" do
429
428
 
430
429
  let(:artwork) do
431
- Artwork.create
430
+ Artwork.create!
432
431
  end
433
432
 
434
433
  let(:exhibition) do
435
- Exhibition.create
434
+ Exhibition.create!
436
435
  end
437
436
 
438
437
  let(:exhibitor) do
439
- Exhibitor.create(exhibition: exhibition)
438
+ Exhibitor.create!(exhibition: exhibition)
440
439
  end
441
440
 
442
441
  before do
@@ -451,11 +450,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
451
450
  context "when the relation is self referencing" do
452
451
 
453
452
  let(:tag_one) do
454
- Tag.create(text: "one")
453
+ Tag.create!(text: "one")
455
454
  end
456
455
 
457
456
  let(:tag_two) do
458
- Tag.create(text: "two")
457
+ Tag.create!(text: "two")
459
458
  end
460
459
 
461
460
  before do
@@ -564,7 +563,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
564
563
  end
565
564
 
566
565
  let(:preference) do
567
- Preference.create(name: "one")
566
+ Preference.create!(name: "one")
568
567
  end
569
568
 
570
569
  before do
@@ -585,7 +584,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
585
584
  context "when the document is persisted" do
586
585
 
587
586
  before do
588
- person.save
587
+ person.save!
589
588
  end
590
589
 
591
590
  it "does not add the duplicates" do
@@ -656,7 +655,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
656
655
  end
657
656
 
658
657
  let!(:preference) do
659
- Preference.create
658
+ Preference.create!
660
659
  end
661
660
 
662
661
  before do
@@ -703,7 +702,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
703
702
  context "when the parent is not a new record" do
704
703
 
705
704
  let(:person) do
706
- Person.create
705
+ Person.create!
707
706
  end
708
707
 
709
708
  let(:preference) do
@@ -787,7 +786,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
787
786
  expect(person.preferences).to eq([ another_preference ])
788
787
  end
789
788
 
790
- it "persists the relation between another_prefrence and person" do
789
+ it "persists the relation between another_preference and person" do
791
790
  expect(another_preference.people).to eq([ person ])
792
791
  end
793
792
 
@@ -799,7 +798,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
799
798
  context "and person is saved" do
800
799
 
801
800
  before do
802
- person.save
801
+ person.save!
803
802
  person.reload
804
803
  another_preference.reload
805
804
  end
@@ -808,7 +807,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
808
807
  expect(person.preferences).to eq([ another_preference ])
809
808
  end
810
809
 
811
- it "persists the relation between another_prefrence and person" do
810
+ it "persists the relation between another_preference and person" do
812
811
  expect(another_preference.people).to eq([ person ])
813
812
  end
814
813
 
@@ -823,11 +822,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
823
822
 
824
823
  describe "when self-referencing" do
825
824
  let!(:parent) do
826
- Vertex.create
825
+ Vertex.create!
827
826
  end
828
827
 
829
828
  let!(:child) do
830
- Vertex.create(parents: [parent])
829
+ Vertex.create!(parents: [parent])
831
830
  end
832
831
 
833
832
  before do
@@ -964,7 +963,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
964
963
  context "when the relation has been loaded" do
965
964
 
966
965
  let(:person) do
967
- Person.create
966
+ Person.create!
968
967
  end
969
968
 
970
969
  let(:preference) do
@@ -1004,7 +1003,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1004
1003
  end
1005
1004
 
1006
1005
  let(:person) do
1007
- Person.create.tap do |p|
1006
+ Person.create!.tap do |p|
1008
1007
  p.preferences = [ preference ]
1009
1008
  end
1010
1009
  end
@@ -1074,7 +1073,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1074
1073
  context "when the parent is not a new record" do
1075
1074
 
1076
1075
  let(:person) do
1077
- Person.create
1076
+ Person.create!
1078
1077
  end
1079
1078
 
1080
1079
  let!(:preference) do
@@ -1112,7 +1111,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1112
1111
  context "when saving the target" do
1113
1112
 
1114
1113
  before do
1115
- preference.save
1114
+ preference.save!
1116
1115
  end
1117
1116
 
1118
1117
  it "persists the parent keys" do
@@ -1131,13 +1130,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1131
1130
  context "when the parent has been persisted" do
1132
1131
 
1133
1132
  let!(:person) do
1134
- Person.create
1133
+ Person.create!
1135
1134
  end
1136
1135
 
1137
1136
  context "when the children are persisted" do
1138
1137
 
1139
1138
  let!(:preference) do
1140
- person.preferences.create(name: "settings")
1139
+ person.preferences.create!(name: "settings")
1141
1140
  end
1142
1141
 
1143
1142
  let!(:relation) do
@@ -1309,7 +1308,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1309
1308
  context "when the parent is not a new record" do
1310
1309
 
1311
1310
  let(:person) do
1312
- Person.create
1311
+ Person.create!
1313
1312
  end
1314
1313
 
1315
1314
  let!(:preference) do
@@ -1353,11 +1352,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1353
1352
  context "when appending in a parent create block" do
1354
1353
 
1355
1354
  let!(:preference) do
1356
- Preference.create(name: "testing")
1355
+ Preference.create!(name: "testing")
1357
1356
  end
1358
1357
 
1359
1358
  let!(:person) do
1360
- Person.create do |doc|
1359
+ Person.create! do |doc|
1361
1360
  doc.preferences.concat([ preference ])
1362
1361
  end
1363
1362
  end
@@ -1442,7 +1441,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1442
1441
  context "when the child is already persisted" do
1443
1442
 
1444
1443
  let!(:persisted) do
1445
- Preference.create(name: "testy")
1444
+ Preference.create!(name: "testy")
1446
1445
  end
1447
1446
 
1448
1447
  let(:preference) do
@@ -1451,7 +1450,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1451
1450
 
1452
1451
  before do
1453
1452
  person.preferences.concat([ preference ])
1454
- person.save
1453
+ person.save!
1455
1454
  end
1456
1455
 
1457
1456
  it "adds the documents to the relation" do
@@ -1482,7 +1481,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1482
1481
  context "when setting via the associated ids" do
1483
1482
 
1484
1483
  let!(:persisted) do
1485
- Preference.create(name: "testy")
1484
+ Preference.create!(name: "testy")
1486
1485
  end
1487
1486
 
1488
1487
  let(:preference) do
@@ -1494,7 +1493,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1494
1493
  end
1495
1494
 
1496
1495
  before do
1497
- person.save
1496
+ person.save!
1498
1497
  end
1499
1498
 
1500
1499
  it "adds the documents to the relation" do
@@ -1522,7 +1521,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1522
1521
  context "when the parent is not a new record" do
1523
1522
 
1524
1523
  let(:person) do
1525
- Person.create
1524
+ Person.create!
1526
1525
  end
1527
1526
 
1528
1527
  let(:preference) do
@@ -1604,11 +1603,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1604
1603
  context "when both sides have been persisted" do
1605
1604
 
1606
1605
  let(:person) do
1607
- Person.create
1606
+ Person.create!
1608
1607
  end
1609
1608
 
1610
1609
  let(:event) do
1611
- Event.create
1610
+ Event.create!
1612
1611
  end
1613
1612
 
1614
1613
  before do
@@ -1657,15 +1656,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1657
1656
  context "when the relation also includes a has_many relation" do
1658
1657
 
1659
1658
  let(:artwork) do
1660
- Artwork.create
1659
+ Artwork.create!
1661
1660
  end
1662
1661
 
1663
1662
  let(:exhibition) do
1664
- Exhibition.create
1663
+ Exhibition.create!
1665
1664
  end
1666
1665
 
1667
1666
  let(:exhibitor) do
1668
- Exhibitor.create(exhibition: exhibition)
1667
+ Exhibitor.create!(exhibition: exhibition)
1669
1668
  end
1670
1669
 
1671
1670
  before do
@@ -1680,11 +1679,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1680
1679
  context "when the relation is self referencing" do
1681
1680
 
1682
1681
  let(:tag_one) do
1683
- Tag.create(text: "one")
1682
+ Tag.create!(text: "one")
1684
1683
  end
1685
1684
 
1686
1685
  let(:tag_two) do
1687
- Tag.create(text: "two")
1686
+ Tag.create!(text: "two")
1688
1687
  end
1689
1688
 
1690
1689
  before do
@@ -1735,7 +1734,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1735
1734
  describe "#count" do
1736
1735
 
1737
1736
  let(:person) do
1738
- Person.create
1737
+ Person.create!
1739
1738
  end
1740
1739
 
1741
1740
  context "when nothing exists on the relation" do
@@ -1760,7 +1759,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1760
1759
  describe "#any?" do
1761
1760
 
1762
1761
  let(:person) do
1763
- Person.create
1762
+ Person.create!
1764
1763
  end
1765
1764
 
1766
1765
  context "when nothing exists on the relation" do
@@ -1797,7 +1796,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1797
1796
  context "when documents have been persisted" do
1798
1797
 
1799
1798
  let!(:preference) do
1800
- person.preferences.create(name: "setting")
1799
+ person.preferences.create!(name: "setting")
1801
1800
  end
1802
1801
 
1803
1802
  it "returns the number of persisted documents" do
@@ -1808,12 +1807,12 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1808
1807
  context "when appending to a loaded relation" do
1809
1808
 
1810
1809
  let!(:preference) do
1811
- person.preferences.create(name: "setting")
1810
+ person.preferences.create!(name: "setting")
1812
1811
  end
1813
1812
 
1814
1813
  before do
1815
1814
  person.preferences.count
1816
- person.preferences << Preference.create(name: "two")
1815
+ person.preferences << Preference.create!(name: "two")
1817
1816
  end
1818
1817
 
1819
1818
  it "returns the number of persisted documents" do
@@ -1837,7 +1836,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1837
1836
  context "when the documents are part of the relation" do
1838
1837
 
1839
1838
  before do
1840
- Preference.create(person_ids: [ person.id ])
1839
+ Preference.create!(person_ids: [ person.id ])
1841
1840
  end
1842
1841
 
1843
1842
  it "returns the count from the db" do
@@ -1848,7 +1847,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1848
1847
  context "when the documents are not part of the relation" do
1849
1848
 
1850
1849
  before do
1851
- Preference.create
1850
+ Preference.create!
1852
1851
  end
1853
1852
 
1854
1853
  it "returns the count from the db" do
@@ -1862,7 +1861,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1862
1861
  context "when documents have been persisted" do
1863
1862
 
1864
1863
  let!(:house) do
1865
- person.houses.create(name: "Wayne Manor")
1864
+ person.houses.create!(name: "Wayne Manor")
1866
1865
  end
1867
1866
 
1868
1867
  it "returns the number of persisted documents" do
@@ -1886,7 +1885,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1886
1885
  describe "#any?" do
1887
1886
 
1888
1887
  let(:sandwich) do
1889
- Sandwich.create
1888
+ Sandwich.create!
1890
1889
  end
1891
1890
 
1892
1891
  context "when nothing exists on the relation" do
@@ -1954,7 +1953,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1954
1953
  context "when documents have been persisted" do
1955
1954
 
1956
1955
  let!(:meat) do
1957
- sandwich.meats.create
1956
+ sandwich.meats.create!
1958
1957
  end
1959
1958
 
1960
1959
  it "returns true" do
@@ -1975,7 +1974,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1975
1974
 
1976
1975
  context "when new documents exist in the database" do
1977
1976
  before do
1978
- Meat.create(sandwiches: [sandwich])
1977
+ Meat.create!(sandwiches: [sandwich])
1979
1978
  end
1980
1979
 
1981
1980
  it "returns true" do
@@ -1993,15 +1992,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1993
1992
  context "when using string keys" do
1994
1993
 
1995
1994
  let(:agent) do
1996
- Agent.create(number: "007")
1995
+ Agent.create!(number: "007")
1997
1996
  end
1998
1997
 
1999
1998
  before do
2000
- agent.accounts.create(name: "testing again")
1999
+ agent.accounts.send(method, name: "test again")
2001
2000
  end
2002
2001
 
2003
2002
  it "does not convert the string key to an object id" do
2004
- expect(agent.account_ids).to eq([ "testing-again" ])
2003
+ expect(agent.account_ids).to eq([ "test-again" ])
2005
2004
  end
2006
2005
  end
2007
2006
 
@@ -2073,7 +2072,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2073
2072
  context "when validation fails" do
2074
2073
 
2075
2074
  let(:person) do
2076
- Person.create
2075
+ Person.create!
2077
2076
  end
2078
2077
 
2079
2078
  context "when the relation is not polymorphic" do
@@ -2087,290 +2086,236 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2087
2086
  end
2088
2087
  end
2089
2088
 
2090
- describe "#delete" do
2091
-
2092
- let(:person) do
2093
- Person.create
2094
- end
2095
-
2096
- let(:preference_one) do
2097
- Preference.create(name: "Testing")
2098
- end
2099
-
2100
- let(:preference_two) do
2101
- Preference.create(name: "Test")
2102
- end
2103
-
2104
- before do
2105
- person.preferences << [ preference_one, preference_two ]
2106
- end
2107
-
2108
- context "when the document exists" do
2109
-
2110
- let!(:deleted) do
2111
- person.preferences.delete(preference_one)
2112
- end
2113
-
2114
- it "removes the document from the relation" do
2115
- expect(person.preferences).to eq([ preference_two ])
2116
- end
2089
+ %i[ delete delete_one ].each do |method|
2090
+ describe "\##{method}" do
2091
+ let(:person) { Person.create! }
2092
+ let(:preference_one) { Preference.create!(name: "Testing") }
2093
+ let(:preference_two) { Preference.create!(name: "Test") }
2117
2094
 
2118
- it "returns the document" do
2119
- expect(deleted).to eq(preference_one)
2120
- end
2121
-
2122
- it "removes the document key from the foreign key" do
2123
- expect(person.preference_ids).to eq([ preference_two.id ])
2124
- end
2125
-
2126
- it "removes the inverse reference" do
2127
- expect(deleted.reload.people).to be_empty
2128
- end
2129
-
2130
- it "removes the base id from the inverse keys" do
2131
- expect(deleted.reload.person_ids).to be_empty
2095
+ before do
2096
+ person.preferences << [ preference_one, preference_two ]
2132
2097
  end
2133
2098
 
2134
- context "and person and preferences are reloaded" do
2135
-
2136
- before do
2137
- person.reload
2138
- preference_one.reload
2139
- preference_two.reload
2099
+ context 'when the document exists' do
2100
+ let!(:deleted) do
2101
+ person.preferences.send(method, preference_one)
2140
2102
  end
2141
2103
 
2142
- it "nullifies the deleted preference" do
2104
+ it 'removes the document from the relation' do
2143
2105
  expect(person.preferences).to eq([ preference_two ])
2144
2106
  end
2145
2107
 
2146
- it "retains the ids for one preference" do
2147
- expect(person.preference_ids).to eq([ preference_two.id ])
2108
+ it 'returns the document' do
2109
+ expect(deleted).to eq(preference_one)
2148
2110
  end
2149
- end
2150
- end
2151
-
2152
- context "when the document does not exist" do
2153
-
2154
- let!(:deleted) do
2155
- person.preferences.delete(Preference.new)
2156
- end
2157
-
2158
- it "returns nil" do
2159
- expect(deleted).to be_nil
2160
- end
2161
-
2162
- it "does not modify the relation" do
2163
- expect(person.preferences).to eq([ preference_one, preference_two ])
2164
- end
2165
-
2166
- it "does not modify the keys" do
2167
- expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2168
- end
2169
- end
2170
-
2171
- context "when :dependent => :nullify is set" do
2172
-
2173
- context "when :inverse_of is set" do
2174
2111
 
2175
- let(:event) do
2176
- Event.create
2112
+ it 'removes the document key from the foreign key' do
2113
+ expect(person.preference_ids).to eq([ preference_two.id ])
2177
2114
  end
2178
2115
 
2179
- before do
2180
- person.administrated_events << [ event ]
2116
+ it 'removes the inverse reference' do
2117
+ expect(deleted.reload.people).to be_empty
2181
2118
  end
2182
2119
 
2183
- it "deletes the document" do
2184
- expect(event.delete).to be true
2120
+ it 'removes the base id from the inverse keys' do
2121
+ expect(deleted.reload.person_ids).to be_empty
2185
2122
  end
2186
- end
2187
- end
2188
2123
 
2189
- context "when the relationships are self referencing" do
2190
-
2191
- let(:tag_one) do
2192
- Tag.create(text: "one")
2193
- end
2124
+ context 'and person and preferences are reloaded' do
2125
+ before do
2126
+ person.reload
2127
+ preference_one.reload
2128
+ preference_two.reload
2129
+ end
2194
2130
 
2195
- let(:tag_two) do
2196
- Tag.create(text: "two")
2197
- end
2131
+ it 'nullifies the deleted preference' do
2132
+ expect(person.preferences).to eq([ preference_two ])
2133
+ end
2198
2134
 
2199
- before do
2200
- tag_one.related << tag_two
2135
+ it 'retains the ids for one preference' do
2136
+ expect(person.preference_ids).to eq([ preference_two.id ])
2137
+ end
2138
+ end
2201
2139
  end
2202
2140
 
2203
- context "when deleting without reloading" do
2204
-
2141
+ context 'when the document does not exist' do
2205
2142
  let!(:deleted) do
2206
- tag_one.related.delete(tag_two)
2207
- end
2208
-
2209
- it "deletes the document from the relation" do
2210
- expect(tag_one.related).to be_empty
2143
+ person.preferences.send(method, Preference.new)
2211
2144
  end
2212
2145
 
2213
- it "deletes the foreign key from the relation" do
2214
- expect(tag_one.related_ids).to be_empty
2146
+ it 'returns nil' do
2147
+ expect(deleted).to be_nil
2215
2148
  end
2216
2149
 
2217
- it "removes the reference from the inverse" do
2218
- expect(deleted.related).to be_empty
2150
+ it 'does not modify the relation' do
2151
+ expect(person.preferences).to eq([ preference_one, preference_two ])
2219
2152
  end
2220
2153
 
2221
- it "removes the foreign keys from the inverse" do
2222
- expect(deleted.related_ids).to be_empty
2154
+ it 'does not modify the keys' do
2155
+ expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2223
2156
  end
2224
2157
  end
2225
2158
 
2226
- context "when deleting with reloading" do
2227
-
2228
- context "when deleting from the front side" do
2229
-
2230
- let(:reloaded) do
2231
- tag_one.reload
2232
- end
2233
-
2234
- let!(:deleted) do
2235
- reloaded.related.delete(tag_two)
2236
- end
2159
+ context 'when :dependent => :nullify is set' do
2160
+ context 'when :inverse_of is set' do
2161
+ let(:event) { Event.create! }
2237
2162
 
2238
- it "deletes the document from the relation" do
2239
- expect(reloaded.related).to be_empty
2163
+ before do
2164
+ person.administrated_events << [ event ]
2240
2165
  end
2241
2166
 
2242
- it "deletes the foreign key from the relation" do
2243
- expect(reloaded.related_ids).to be_empty
2167
+ it 'deletes the document' do
2168
+ expect(event.delete).to be true
2244
2169
  end
2170
+ end
2171
+ end
2245
2172
 
2246
- it "removes the reference from the inverse" do
2247
- expect(deleted.related).to be_empty
2248
- end
2173
+ context 'when the relationships are self referencing' do
2174
+ let(:tag_one) { Tag.create!(text: "one") }
2175
+ let(:tag_two) { Tag.create!(text: "two") }
2249
2176
 
2250
- it "removes the foreign keys from the inverse" do
2251
- expect(deleted.related_ids).to be_empty
2252
- end
2177
+ before do
2178
+ tag_one.related << tag_two
2253
2179
  end
2254
2180
 
2255
- context "when deleting from the inverse side" do
2256
-
2257
- let(:reloaded) do
2258
- tag_two.reload
2259
- end
2181
+ context 'when deleting without reloading' do
2182
+ let!(:deleted) { tag_one.related.send(method, tag_two) }
2260
2183
 
2261
- let!(:deleted) do
2262
- reloaded.related.delete(tag_one)
2184
+ it 'deletes the document from the relation' do
2185
+ expect(tag_one.related).to be_empty
2263
2186
  end
2264
2187
 
2265
- it "deletes the document from the relation" do
2266
- expect(reloaded.related).to be_empty
2188
+ it 'deletes the foreign key from the relation' do
2189
+ expect(tag_one.related_ids).to be_empty
2267
2190
  end
2268
2191
 
2269
- it "deletes the foreign key from the relation" do
2270
- expect(reloaded.related_ids).to be_empty
2192
+ it 'removes the reference from the inverse' do
2193
+ expect(deleted.related).to be_empty
2271
2194
  end
2272
2195
 
2273
- it "removes the foreign keys from the inverse" do
2196
+ it 'removes the foreign keys from the inverse' do
2274
2197
  expect(deleted.related_ids).to be_empty
2275
2198
  end
2276
2199
  end
2277
- end
2278
- end
2279
2200
 
2280
- context "when the association has callbacks" do
2201
+ context 'when deleting with reloading' do
2202
+ context "when deleting from the front side" do
2203
+ let(:reloaded) { tag_one.reload }
2204
+ let!(:deleted) { reloaded.related.send(method, tag_two) }
2281
2205
 
2282
- let(:post) do
2283
- Post.new
2284
- end
2206
+ it 'deletes the document from the relation' do
2207
+ expect(reloaded.related).to be_empty
2208
+ end
2285
2209
 
2286
- let(:tag) do
2287
- Tag.new
2288
- end
2210
+ it 'deletes the foreign key from the relation' do
2211
+ expect(reloaded.related_ids).to be_empty
2212
+ end
2289
2213
 
2290
- before do
2291
- post.tags << tag
2292
- end
2214
+ it 'removes the reference from the inverse' do
2215
+ expect(deleted.related).to be_empty
2216
+ end
2293
2217
 
2294
- context "when the callback is a before_remove" do
2218
+ it 'removes the foreign keys from the inverse' do
2219
+ expect(deleted.related_ids).to be_empty
2220
+ end
2221
+ end
2295
2222
 
2296
- context "when there are no errors" do
2223
+ context 'when deleting from the inverse side' do
2224
+ let(:reloaded) { tag_two.reload }
2225
+ let!(:deleted) { reloaded.related.send(method, tag_one) }
2297
2226
 
2298
- before do
2299
- post.tags.delete tag
2300
- end
2227
+ it 'deletes the document from the relation' do
2228
+ expect(reloaded.related).to be_empty
2229
+ end
2301
2230
 
2302
- it "executes the callback" do
2303
- expect(post.before_remove_called).to be true
2304
- end
2231
+ it 'deletes the foreign key from the relation' do
2232
+ expect(reloaded.related_ids).to be_empty
2233
+ end
2305
2234
 
2306
- it "removes the document from the relation" do
2307
- expect(post.tags).to be_empty
2235
+ it 'removes the foreign keys from the inverse' do
2236
+ expect(deleted.related_ids).to be_empty
2237
+ end
2308
2238
  end
2309
2239
  end
2240
+ end
2310
2241
 
2311
- context "when errors are raised" do
2312
-
2313
- before do
2314
- expect(post).to receive(:before_remove_tag).and_raise
2315
- begin; post.tags.delete(tag); rescue; end
2316
- end
2242
+ context 'when the association has callbacks' do
2243
+ let(:post) { Post.new }
2244
+ let(:tag) { Tag.new }
2317
2245
 
2318
- it "does not remove the document from the relation" do
2319
- expect(post.tags).to eq([ tag ])
2320
- end
2246
+ before do
2247
+ post.tags << tag
2321
2248
  end
2322
- end
2323
2249
 
2324
- context "when the callback is an after_remove" do
2250
+ context 'when the callback is a before_remove' do
2251
+ context 'when there are no errors' do
2252
+ before do
2253
+ post.tags.send(method, tag)
2254
+ end
2325
2255
 
2326
- context "when no errors are raised" do
2256
+ it 'executes the callback' do
2257
+ expect(post.before_remove_called).to be true
2258
+ end
2327
2259
 
2328
- before do
2329
- post.tags.delete(tag)
2260
+ it 'removes the document from the relation' do
2261
+ expect(post.tags).to be_empty
2262
+ end
2330
2263
  end
2331
2264
 
2332
- it "executes the callback" do
2333
- expect(post.after_remove_called).to be true
2334
- end
2265
+ context "when errors are raised" do
2266
+ before do
2267
+ expect(post).to receive(:before_remove_tag).and_raise
2268
+ begin; post.tags.send(method, tag); rescue; end
2269
+ end
2335
2270
 
2336
- it "removes the document from the relation" do
2337
- expect(post.tags).to be_empty
2271
+ it 'does not remove the document from the relation' do
2272
+ expect(post.tags).to eq([ tag ])
2273
+ end
2338
2274
  end
2339
2275
  end
2340
2276
 
2341
- context "when errors are raised" do
2277
+ context 'when the callback is an after_remove' do
2278
+ context 'when no errors are raised' do
2279
+ before do
2280
+ post.tags.send(method, tag)
2281
+ end
2342
2282
 
2343
- before do
2344
- expect(post).to receive(:after_remove_tag).and_raise
2345
- begin; post.tags.delete(tag); rescue; end
2283
+ it 'executes the callback' do
2284
+ expect(post.after_remove_called).to be true
2285
+ end
2286
+
2287
+ it 'removes the document from the relation' do
2288
+ expect(post.tags).to be_empty
2289
+ end
2346
2290
  end
2347
2291
 
2348
- it "removes the document from the relation" do
2349
- expect(post.tags).to be_empty
2292
+ context 'when errors are raised' do
2293
+ before do
2294
+ expect(post).to receive(:after_remove_tag).and_raise
2295
+ begin; post.tags.send(method, tag); rescue; end
2296
+ end
2297
+
2298
+ it 'removes the document from the relation' do
2299
+ expect(post.tags).to be_empty
2300
+ end
2350
2301
  end
2351
2302
  end
2352
2303
  end
2353
2304
  end
2354
2305
  end
2355
2306
 
2356
- [ :delete_all, :destroy_all ].each do |method|
2357
-
2358
- describe "##{method}" do
2359
-
2360
- context "when the relation is not polymorphic" do
2361
-
2362
- context "when conditions are provided" do
2363
-
2364
- let(:person) do
2365
- Person.create
2366
- end
2307
+ %i[ delete_all destroy_all ].each do |method|
2308
+ describe "\##{method}" do
2309
+ context 'when the relation is not polymorphic' do
2310
+ context 'when conditions are provided' do
2311
+ let(:person) { Person.create! }
2367
2312
 
2368
2313
  let!(:preference_one) do
2369
- person.preferences.create(name: "Testing")
2314
+ person.preferences.create!(name: "Testing")
2370
2315
  end
2371
2316
 
2372
2317
  let!(:preference_two) do
2373
- person.preferences.create(name: "Test")
2318
+ person.preferences.create!(name: "Test")
2374
2319
  end
2375
2320
 
2376
2321
  let!(:deleted) do
@@ -2395,14 +2340,18 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2395
2340
  it "removes the ids from the foreign key" do
2396
2341
  expect(person.preference_ids).to eq([ preference_two.id ])
2397
2342
  end
2343
+
2344
+ it "sets the association locally" do
2345
+ expect(person.preferences).to eq([preference_two])
2346
+ end
2398
2347
  end
2399
2348
 
2400
2349
  context "when conditions are not provided" do
2401
2350
 
2402
2351
  let(:person) do
2403
- Person.create.tap do |person|
2404
- person.preferences.create(name: "Testing")
2405
- person.preferences.create(name: "Test")
2352
+ Person.create!.tap do |person|
2353
+ person.preferences.create!(name: "Testing")
2354
+ person.preferences.create!(name: "Test")
2406
2355
  end
2407
2356
  end
2408
2357
 
@@ -2421,6 +2370,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2421
2370
  it "returns the number of documents deleted" do
2422
2371
  expect(deleted).to eq(2)
2423
2372
  end
2373
+
2374
+ it "sets the association locally" do
2375
+ expect(person.preferences).to eq([])
2376
+ end
2424
2377
  end
2425
2378
  end
2426
2379
  end
@@ -2436,13 +2389,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2436
2389
  describe "#exists?" do
2437
2390
 
2438
2391
  let!(:person) do
2439
- Person.create
2392
+ Person.create!
2440
2393
  end
2441
2394
 
2442
2395
  context "when documents exist in the database" do
2443
2396
 
2444
2397
  before do
2445
- person.preferences.create
2398
+ person.preferences.create!
2446
2399
  end
2447
2400
 
2448
2401
  it "returns true" do
@@ -2467,23 +2420,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2467
2420
  context "when the relation is not polymorphic" do
2468
2421
 
2469
2422
  let(:person) do
2470
- Person.create
2423
+ Person.create!
2471
2424
  end
2472
2425
 
2473
2426
  let!(:preference_one) do
2474
- person.preferences.create(name: "Test")
2427
+ person.preferences.create!(name: "Test")
2475
2428
  end
2476
2429
 
2477
2430
  let!(:preference_two) do
2478
- person.preferences.create(name: "OMG I has relations")
2431
+ person.preferences.create!(name: "OMG I has relations")
2479
2432
  end
2480
2433
 
2481
2434
  let!(:unrelated_pref) do
2482
- Preference.create(name: "orphan annie")
2435
+ Preference.create!(name: "orphan annie")
2483
2436
  end
2484
2437
 
2485
2438
  let!(:unrelated_pref_two) do
2486
- Preference.create(name: "orphan two")
2439
+ Preference.create!(name: "orphan two")
2487
2440
  end
2488
2441
 
2489
2442
  context "when providing an id" do
@@ -2508,39 +2461,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2508
2461
  it "raises an error" do
2509
2462
  expect {
2510
2463
  preference
2511
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2464
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2512
2465
  end
2513
2466
  end
2514
2467
 
2515
2468
  context "when the id does not match" do
2516
2469
 
2517
2470
  context "when config set to raise error" do
2518
-
2519
- before do
2520
- Mongoid.raise_not_found_error = true
2521
- end
2471
+ config_override :raise_not_found_error, true
2522
2472
 
2523
2473
  it "raises an error" do
2524
2474
  expect {
2525
2475
  person.preferences.find(BSON::ObjectId.new)
2526
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2476
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2527
2477
  end
2528
2478
  end
2529
2479
 
2530
2480
  context "when config set not to raise error" do
2481
+ config_override :raise_not_found_error, false
2531
2482
 
2532
2483
  let(:preference) do
2533
2484
  person.preferences.find(BSON::ObjectId.new)
2534
2485
  end
2535
2486
 
2536
- before do
2537
- Mongoid.raise_not_found_error = false
2538
- end
2539
-
2540
- after do
2541
- Mongoid.raise_not_found_error = true
2542
- end
2543
-
2544
2487
  it "returns nil" do
2545
2488
  expect(preference).to be_nil
2546
2489
  end
@@ -2561,7 +2504,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2561
2504
  end
2562
2505
  end
2563
2506
 
2564
- context "when the ids matche unreferenced documents" do
2507
+ context "when the ids match unreferenced documents" do
2565
2508
 
2566
2509
  let(:preferences) do
2567
2510
  person.preferences.find(
@@ -2572,39 +2515,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2572
2515
  it "raises an error" do
2573
2516
  expect {
2574
2517
  preferences
2575
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2518
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2576
2519
  end
2577
2520
  end
2578
2521
 
2579
2522
  context "when the ids do not match" do
2580
2523
 
2581
2524
  context "when config set to raise error" do
2582
-
2583
- before do
2584
- Mongoid.raise_not_found_error = true
2585
- end
2525
+ config_override :raise_not_found_error, true
2586
2526
 
2587
2527
  it "raises an error" do
2588
2528
  expect {
2589
2529
  person.preferences.find([ BSON::ObjectId.new ])
2590
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2530
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2591
2531
  end
2592
2532
  end
2593
2533
 
2594
2534
  context "when config set not to raise error" do
2535
+ config_override :raise_not_found_error, false
2595
2536
 
2596
2537
  let(:preferences) do
2597
2538
  person.preferences.find([ BSON::ObjectId.new ])
2598
2539
  end
2599
2540
 
2600
- before do
2601
- Mongoid.raise_not_found_error = false
2602
- end
2603
-
2604
- after do
2605
- Mongoid.raise_not_found_error = true
2606
- end
2607
-
2608
2541
  it "returns an empty array" do
2609
2542
  expect(preferences).to be_empty
2610
2543
  end
@@ -2619,11 +2552,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2619
2552
  context "when the relation is not polymorphic" do
2620
2553
 
2621
2554
  let(:person) do
2622
- Person.create
2555
+ Person.create!
2623
2556
  end
2624
2557
 
2625
2558
  let!(:preference) do
2626
- person.preferences.create(name: "Testing")
2559
+ person.preferences.create!(name: "Testing")
2627
2560
  end
2628
2561
 
2629
2562
  context "when the document exists" do
@@ -2659,11 +2592,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2659
2592
  context "when the relation is not polymorphic" do
2660
2593
 
2661
2594
  let(:person) do
2662
- Person.create
2595
+ Person.create!
2663
2596
  end
2664
2597
 
2665
2598
  let!(:preference) do
2666
- person.preferences.create(name: "Testing")
2599
+ person.preferences.create!(name: "Testing")
2667
2600
  end
2668
2601
 
2669
2602
  context "when the document exists" do
@@ -2708,11 +2641,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2708
2641
  context "when the relation is not polymorphic" do
2709
2642
 
2710
2643
  let(:person) do
2711
- Person.create
2644
+ Person.create!
2712
2645
  end
2713
2646
 
2714
2647
  let!(:preference) do
2715
- person.preferences.create(name: "Testing")
2648
+ person.preferences.create!(name: "Testing")
2716
2649
  end
2717
2650
 
2718
2651
  context "when the document exists" do
@@ -2746,15 +2679,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2746
2679
  describe "#max" do
2747
2680
 
2748
2681
  let(:person) do
2749
- Person.create
2682
+ Person.create!
2750
2683
  end
2751
2684
 
2752
2685
  let(:preference_one) do
2753
- Preference.create(ranking: 5)
2686
+ Preference.create!(ranking: 5)
2754
2687
  end
2755
2688
 
2756
2689
  let(:preference_two) do
2757
- Preference.create(ranking: 10)
2690
+ Preference.create!(ranking: 10)
2758
2691
  end
2759
2692
 
2760
2693
  before do
@@ -2775,15 +2708,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2775
2708
  describe "#max_by" do
2776
2709
 
2777
2710
  let(:person) do
2778
- Person.create
2711
+ Person.create!
2779
2712
  end
2780
2713
 
2781
2714
  let(:preference_one) do
2782
- Preference.create(ranking: 5)
2715
+ Preference.create!(ranking: 5)
2783
2716
  end
2784
2717
 
2785
2718
  let(:preference_two) do
2786
- Preference.create(ranking: 10)
2719
+ Preference.create!(ranking: 10)
2787
2720
  end
2788
2721
 
2789
2722
  before do
@@ -2802,19 +2735,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2802
2735
  describe "#method_missing" do
2803
2736
 
2804
2737
  let!(:person) do
2805
- Person.create
2738
+ Person.create!
2806
2739
  end
2807
2740
 
2808
2741
  let!(:preference_one) do
2809
- person.preferences.create(name: "First", value: "Posting")
2742
+ person.preferences.create!(name: "First", value: "Posting")
2810
2743
  end
2811
2744
 
2812
2745
  let!(:preference_two) do
2813
- person.preferences.create(name: "Second", value: "Testing")
2746
+ person.preferences.create!(name: "Second", value: "Testing")
2814
2747
  end
2815
2748
 
2816
2749
  let!(:unrelated) do
2817
- Preference.create(name: "Third")
2750
+ Preference.create!(name: "Third")
2818
2751
  end
2819
2752
 
2820
2753
  context "when providing a single criteria" do
@@ -2828,7 +2761,6 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2828
2761
  end
2829
2762
 
2830
2763
  context 'when providing a collation' do
2831
- min_server_version '3.4'
2832
2764
 
2833
2765
  let(:preferences) do
2834
2766
  person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
@@ -2889,7 +2821,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2889
2821
  context "when the inverse relation is not defined" do
2890
2822
 
2891
2823
  let!(:house) do
2892
- person.houses.create(name: "Wayne Manor")
2824
+ person.houses.create!(name: "Wayne Manor")
2893
2825
  end
2894
2826
 
2895
2827
  it "returns the distinct values for the fields" do
@@ -2903,15 +2835,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2903
2835
  describe "#min" do
2904
2836
 
2905
2837
  let(:person) do
2906
- Person.create
2838
+ Person.create!
2907
2839
  end
2908
2840
 
2909
2841
  let(:preference_one) do
2910
- Preference.create(ranking: 5)
2842
+ Preference.create!(ranking: 5)
2911
2843
  end
2912
2844
 
2913
2845
  let(:preference_two) do
2914
- Preference.create(ranking: 10)
2846
+ Preference.create!(ranking: 10)
2915
2847
  end
2916
2848
 
2917
2849
  before do
@@ -2932,15 +2864,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2932
2864
  describe "#min_by" do
2933
2865
 
2934
2866
  let(:person) do
2935
- Person.create
2867
+ Person.create!
2936
2868
  end
2937
2869
 
2938
2870
  let(:preference_one) do
2939
- Preference.create(ranking: 5)
2871
+ Preference.create!(ranking: 5)
2940
2872
  end
2941
2873
 
2942
2874
  let(:preference_two) do
2943
- Preference.create(ranking: 10)
2875
+ Preference.create!(ranking: 10)
2944
2876
  end
2945
2877
 
2946
2878
  before do
@@ -2966,15 +2898,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2966
2898
  describe "#nullify_all" do
2967
2899
 
2968
2900
  let(:person) do
2969
- Person.create
2901
+ Person.create!
2970
2902
  end
2971
2903
 
2972
2904
  let!(:preference_one) do
2973
- person.preferences.create(name: "One")
2905
+ person.preferences.create!(name: "One")
2974
2906
  end
2975
2907
 
2976
2908
  let!(:preference_two) do
2977
- person.preferences.create(name: "Two")
2909
+ person.preferences.create!(name: "Two")
2978
2910
  end
2979
2911
 
2980
2912
  before do
@@ -3095,13 +3027,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3095
3027
  describe "##{method}" do
3096
3028
 
3097
3029
  let(:person) do
3098
- Person.create
3030
+ Person.create!
3099
3031
  end
3100
3032
 
3101
3033
  context "when documents have been persisted" do
3102
3034
 
3103
3035
  let!(:preference) do
3104
- person.preferences.create(name: "Testing")
3036
+ person.preferences.create!(name: "Testing")
3105
3037
  end
3106
3038
 
3107
3039
  it "returns the number of documents" do
@@ -3113,7 +3045,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3113
3045
 
3114
3046
  before do
3115
3047
  person.preferences.build(name: "Test")
3116
- person.preferences.create(name: "Test 2")
3048
+ person.preferences.create!(name: "Test 2")
3117
3049
  end
3118
3050
 
3119
3051
  it "returns the total number of documents" do
@@ -3128,15 +3060,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3128
3060
  context "when the relation has no default scope" do
3129
3061
 
3130
3062
  let!(:person) do
3131
- Person.create
3063
+ Person.create!
3132
3064
  end
3133
3065
 
3134
3066
  let!(:preference_one) do
3135
- person.preferences.create(name: "first")
3067
+ person.preferences.create!(name: "first")
3136
3068
  end
3137
3069
 
3138
3070
  let!(:preference_two) do
3139
- Preference.create(name: "second")
3071
+ Preference.create!(name: "second")
3140
3072
  end
3141
3073
 
3142
3074
  let(:unscoped) do
@@ -3151,15 +3083,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3151
3083
  context "when the relation has a default scope" do
3152
3084
 
3153
3085
  let!(:person) do
3154
- Person.create
3086
+ Person.create!
3155
3087
  end
3156
3088
 
3157
3089
  let!(:house_one) do
3158
- person.houses.create(name: "first")
3090
+ person.houses.create!(name: "first")
3159
3091
  end
3160
3092
 
3161
3093
  let!(:house_two) do
3162
- House.create(name: "second")
3094
+ House.create!(name: "second")
3163
3095
  end
3164
3096
 
3165
3097
  let(:unscoped) do
@@ -3195,10 +3127,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3195
3127
  end
3196
3128
 
3197
3129
  before do
3198
- person.update_attributes(
3130
+ person.update_attributes!(
3199
3131
  houses: [ wife_house, exwife_house, girlfriend_house ]
3200
3132
  )
3201
- person.update_attributes(house_ids: [ girlfriend_house.id ])
3133
+ person.update_attributes!(house_ids: [ girlfriend_house.id ])
3202
3134
  end
3203
3135
 
3204
3136
  context "when reloading" do
@@ -3245,7 +3177,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3245
3177
  end
3246
3178
 
3247
3179
  let!(:business) do
3248
- Business.create(name: "serious", owners: [ user ])
3180
+ Business.create!(name: "serious", owners: [ user ])
3249
3181
  end
3250
3182
 
3251
3183
  before do
@@ -3288,11 +3220,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3288
3220
  context "when the documents are persisted" do
3289
3221
 
3290
3222
  let(:user) do
3291
- User.create(name: "tst")
3223
+ User.create!(name: "tst")
3292
3224
  end
3293
3225
 
3294
3226
  let(:business) do
3295
- Business.create(name: "srs", owners: [ user ])
3227
+ Business.create!(name: "srs", owners: [ user ])
3296
3228
  end
3297
3229
 
3298
3230
  before do
@@ -3336,11 +3268,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3336
3268
  context "when binding the relation multiple times" do
3337
3269
 
3338
3270
  let(:person) do
3339
- Person.create
3271
+ Person.create!
3340
3272
  end
3341
3273
 
3342
3274
  let(:preference) do
3343
- person.preferences.create(name: "testing")
3275
+ person.preferences.create!(name: "testing")
3344
3276
  end
3345
3277
 
3346
3278
  before do
@@ -3359,19 +3291,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3359
3291
  context "when the association has order criteria" do
3360
3292
 
3361
3293
  let(:person) do
3362
- Person.create
3294
+ Person.create!
3363
3295
  end
3364
3296
 
3365
3297
  let(:preference_one) do
3366
- OrderedPreference.create(name: 'preference-1', value: 10)
3298
+ OrderedPreference.create!(name: 'preference-1', value: 10)
3367
3299
  end
3368
3300
 
3369
3301
  let(:preference_two) do
3370
- OrderedPreference.create(name: 'preference-2', value: 20)
3302
+ OrderedPreference.create!(name: 'preference-2', value: 20)
3371
3303
  end
3372
3304
 
3373
3305
  let(:preference_three) do
3374
- OrderedPreference.create(name: 'preference-3', value: 20)
3306
+ OrderedPreference.create!(name: 'preference-3', value: 20)
3375
3307
  end
3376
3308
 
3377
3309
  before do
@@ -3395,7 +3327,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3395
3327
  context "when the parent is not a new record and freshly loaded" do
3396
3328
 
3397
3329
  let(:person) do
3398
- Person.create
3330
+ Person.create!
3399
3331
  end
3400
3332
 
3401
3333
  let(:preference) do
@@ -3404,7 +3336,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3404
3336
 
3405
3337
  before do
3406
3338
  person.preferences = [ preference ]
3407
- person.save
3339
+ person.save!
3408
3340
  person.reload
3409
3341
  person.preferences = nil
3410
3342
  end
@@ -3427,15 +3359,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3427
3359
  context "when reloading the relation" do
3428
3360
 
3429
3361
  let!(:person) do
3430
- Person.create
3362
+ Person.create!
3431
3363
  end
3432
3364
 
3433
3365
  let!(:preference_one) do
3434
- Preference.create(name: "one")
3366
+ Preference.create!(name: "one")
3435
3367
  end
3436
3368
 
3437
3369
  let!(:preference_two) do
3438
- Preference.create(name: "two")
3370
+ Preference.create!(name: "two")
3439
3371
  end
3440
3372
 
3441
3373
  before do
@@ -3479,7 +3411,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3479
3411
  context "when the document is new" do
3480
3412
 
3481
3413
  let!(:person) do
3482
- Person.create(preference_names: "one, two")
3414
+ Person.create!(preference_names: "one, two")
3483
3415
  end
3484
3416
 
3485
3417
  let(:preference_one) do
@@ -3515,23 +3447,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3515
3447
  end
3516
3448
 
3517
3449
  let(:preference_one) do
3518
- Preference.create(name: "one")
3450
+ Preference.create!(name: "one")
3519
3451
  end
3520
3452
 
3521
3453
  let(:preference_two) do
3522
- Preference.create(name: "two")
3454
+ Preference.create!(name: "two")
3523
3455
  end
3524
3456
 
3525
3457
  before do
3526
3458
  person.preference_ids = [ preference_one.id, preference_two.id ]
3527
- person.save
3459
+ person.save!
3528
3460
  end
3529
3461
 
3530
3462
  context "and the order is changed" do
3531
3463
 
3532
3464
  before do
3533
3465
  person.preference_ids = [ preference_two.id, preference_one.id ]
3534
- person.save
3466
+ person.save!
3535
3467
  end
3536
3468
 
3537
3469
  let(:reloaded) do
@@ -3548,13 +3480,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3548
3480
  context "and the order is changed and an element is added" do
3549
3481
 
3550
3482
  let(:preference_three) do
3551
- Preference.create(name: "three")
3483
+ Preference.create!(name: "three")
3552
3484
  end
3553
3485
 
3554
3486
  before do
3555
3487
  person.preference_ids =
3556
3488
  [ preference_two.id, preference_one.id, preference_three.id ]
3557
- person.save
3489
+ person.save!
3558
3490
  end
3559
3491
 
3560
3492
  let(:reloaded) do
@@ -3571,16 +3503,16 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3571
3503
  context "and the order is changed and an element is removed" do
3572
3504
 
3573
3505
  let(:preference_three) do
3574
- Preference.create(name: "three")
3506
+ Preference.create!(name: "three")
3575
3507
  end
3576
3508
 
3577
3509
  before do
3578
3510
  person.preference_ids =
3579
3511
  [ preference_one.id, preference_two.id, preference_three.id ]
3580
- person.save
3512
+ person.save!
3581
3513
  person.preference_ids =
3582
3514
  [ preference_three.id, preference_two.id ]
3583
- person.save
3515
+ person.save!
3584
3516
  end
3585
3517
 
3586
3518
  let(:reloaded) do
@@ -3630,15 +3562,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3630
3562
  context "when the relation exists" do
3631
3563
 
3632
3564
  let!(:person) do
3633
- Person.create
3565
+ Person.create!
3634
3566
  end
3635
3567
 
3636
3568
  let!(:pref_one) do
3637
- person.preferences.create
3569
+ person.preferences.create!
3638
3570
  end
3639
3571
 
3640
3572
  let!(:pref_two) do
3641
- Preference.create
3573
+ Preference.create!
3642
3574
  end
3643
3575
 
3644
3576
  before do
@@ -3654,15 +3586,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3654
3586
  context "when using a different primary key" do
3655
3587
 
3656
3588
  let(:dog) do
3657
- Dog.create(name: 'Doggie')
3589
+ Dog.create!(name: 'Doggie')
3658
3590
  end
3659
3591
 
3660
3592
  let(:cat) do
3661
- Cat.create(name: 'Kitty')
3593
+ Cat.create!(name: 'Kitty')
3594
+ end
3595
+
3596
+ let(:another_cat) do
3597
+ Cat.create!(name: 'Kitten')
3662
3598
  end
3663
3599
 
3664
3600
  let(:fire_hydrant) do
3665
- FireHydrant.create(location: '221B Baker Street')
3601
+ FireHydrant.create!(location: '221B Baker Street')
3666
3602
  end
3667
3603
 
3668
3604
  context "when adding to a one-way many to many" do
@@ -3676,6 +3612,28 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3676
3612
  end
3677
3613
  end
3678
3614
 
3615
+ context "when adding multiple documents to a one-way many to many" do
3616
+
3617
+ before do
3618
+ fire_hydrant.cats.push([cat, another_cat])
3619
+ end
3620
+
3621
+ it "adds the pk values to the fk set" do
3622
+ expect(fire_hydrant.cat_ids).to eq([cat.name, another_cat.name])
3623
+ end
3624
+ end
3625
+
3626
+ context "when adding a new document to a one-way many to many" do
3627
+
3628
+ before do
3629
+ fire_hydrant.cats.build name: 'Kitten'
3630
+ end
3631
+
3632
+ it "adds the pk values to the fk set" do
3633
+ expect(fire_hydrant.cat_ids).to eq(['Kitten'])
3634
+ end
3635
+ end
3636
+
3679
3637
  context "when adding to a two-way many to many" do
3680
3638
 
3681
3639
  before do
@@ -3732,10 +3690,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3732
3690
  end
3733
3691
 
3734
3692
  it "should assign relation from both sides" do
3735
- p1 = Project.create name: 'Foo'
3736
- p2 = Project.create name: 'Bar'
3737
- d1 = Distributor.create name: 'Rock'
3738
- d2 = Distributor.create name: 'Soul'
3693
+ p1 = Project.create! name: 'Foo'
3694
+ p2 = Project.create! name: 'Bar'
3695
+ d1 = Distributor.create! name: 'Rock'
3696
+ d2 = Distributor.create! name: 'Soul'
3739
3697
 
3740
3698
  p1.distributors << d1
3741
3699
  expect(p1.d_ids).to match_array([d1.id])
@@ -3745,4 +3703,56 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3745
3703
  expect(p2.d_ids).to match_array([d2.id])
3746
3704
  end
3747
3705
  end
3706
+
3707
+ context "when accesing own _id from parent's foreign key in default" do
3708
+ let!(:contract) { HabtmmContract.create! }
3709
+ let!(:signature) { contract.signatures.create! }
3710
+
3711
+ it "is nil" do
3712
+ expect(signature.favorite_signature).to be nil
3713
+ end
3714
+ end
3715
+
3716
+ context "when setting an association on a model that uses the class_name option" do
3717
+ let!(:contract) { HabtmmContract.create! }
3718
+ let!(:signature) { HabtmmSignature.create!(contracts: [contract]) }
3719
+
3720
+ it "populates the inverse foreign key" do
3721
+ expect(signature.contracts.first.signature_ids).to eq([signature.id])
3722
+ end
3723
+ end
3724
+
3725
+ context "when there is a foreign key in the aliased associations" do
3726
+ it "has the correct aliases" do
3727
+ expect(Dog.aliased_associations["breed_ids"]).to eq("breeds")
3728
+ expect(Breed.aliased_associations["dog_ids"]).to eq("dogs")
3729
+ end
3730
+ end
3731
+
3732
+ # This test is for MONGOID-5344 which tests that the initial call to
3733
+ # signature_ids refers to the same array as subsequent calls to signature_ids.
3734
+ # Prior to the change in that ticket, this test broke because the array
3735
+ # returned from write_attribute (which is triggered the first time the
3736
+ # foreign key array is referenced, to set the default), refers to a different
3737
+ # array to the one stored in the attributes hash. This happened because,
3738
+ # when retrieving a document from the database, the attributes hash is actually
3739
+ # a BSON::Document, which applies a transformation to the array before
3740
+ # storing it.
3741
+ context "when executing concat on foreign key array from the db" do
3742
+ before do
3743
+ HabtmmContract.create!
3744
+ HabtmmSignature.create!
3745
+ end
3746
+
3747
+ let!(:contract) { HabtmmContract.first }
3748
+ let!(:signature) { HabtmmSignature.first }
3749
+
3750
+ before do
3751
+ contract.signature_ids.concat([signature.id])
3752
+ end
3753
+
3754
+ it "works on the first attempt" do
3755
+ expect(contract.signature_ids).to eq([signature.id])
3756
+ end
3757
+ end
3748
3758
  end