mongoid 7.1.1 → 8.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1094) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/README.md +15 -8
  5. data/Rakefile +61 -5
  6. data/lib/config/locales/en.yml +162 -56
  7. data/lib/mongoid/association/accessors.rb +89 -40
  8. data/lib/mongoid/association/bindable.rb +50 -23
  9. data/lib/mongoid/association/builders.rb +5 -12
  10. data/lib/mongoid/association/constrainable.rb +1 -5
  11. data/lib/mongoid/association/depending.rb +5 -17
  12. data/lib/mongoid/association/eager_loadable.rb +29 -10
  13. data/lib/mongoid/association/embedded/batchable.rb +64 -52
  14. data/lib/mongoid/association/embedded/cyclic.rb +3 -12
  15. data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -9
  16. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -5
  17. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +4 -16
  18. data/lib/mongoid/association/embedded/embedded_in.rb +4 -26
  19. data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -7
  20. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +4 -6
  21. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +110 -92
  22. data/lib/mongoid/association/embedded/embeds_many.rb +4 -34
  23. data/lib/mongoid/association/embedded/embeds_one/binding.rb +0 -7
  24. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +19 -8
  25. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +50 -19
  26. data/lib/mongoid/association/embedded/embeds_one.rb +5 -31
  27. data/lib/mongoid/association/embedded.rb +0 -1
  28. data/lib/mongoid/association/macros.rb +27 -5
  29. data/lib/mongoid/association/many.rb +14 -27
  30. data/lib/mongoid/association/marshalable.rb +0 -5
  31. data/lib/mongoid/association/nested/many.rb +6 -16
  32. data/lib/mongoid/association/nested/nested_buildable.rb +4 -13
  33. data/lib/mongoid/association/nested/one.rb +48 -23
  34. data/lib/mongoid/association/nested.rb +0 -3
  35. data/lib/mongoid/association/one.rb +2 -11
  36. data/lib/mongoid/association/options.rb +9 -42
  37. data/lib/mongoid/association/proxy.rb +22 -27
  38. data/lib/mongoid/association/referenced/auto_save.rb +6 -14
  39. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -8
  40. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +5 -6
  41. data/lib/mongoid/association/referenced/belongs_to/eager.rb +0 -1
  42. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +5 -19
  43. data/lib/mongoid/association/referenced/belongs_to.rb +11 -36
  44. data/lib/mongoid/association/referenced/counter_cache.rb +12 -25
  45. data/lib/mongoid/association/referenced/eager.rb +5 -26
  46. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +0 -5
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +0 -3
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +0 -1
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +81 -51
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +17 -41
  51. data/lib/mongoid/association/referenced/has_many/binding.rb +0 -5
  52. data/lib/mongoid/association/referenced/has_many/buildable.rb +0 -3
  53. data/lib/mongoid/association/referenced/has_many/eager.rb +0 -1
  54. data/lib/mongoid/association/referenced/has_many/enumerable.rb +438 -461
  55. data/lib/mongoid/association/referenced/has_many/proxy.rb +58 -84
  56. data/lib/mongoid/association/referenced/has_many.rb +15 -42
  57. data/lib/mongoid/association/referenced/has_one/binding.rb +0 -7
  58. data/lib/mongoid/association/referenced/has_one/buildable.rb +12 -5
  59. data/lib/mongoid/association/referenced/has_one/eager.rb +0 -1
  60. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +7 -22
  61. data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -16
  62. data/lib/mongoid/association/referenced/has_one.rb +12 -35
  63. data/lib/mongoid/association/referenced/syncable.rb +4 -21
  64. data/lib/mongoid/association/referenced.rb +0 -1
  65. data/lib/mongoid/association/reflections.rb +4 -5
  66. data/lib/mongoid/association/relatable.rb +46 -71
  67. data/lib/mongoid/association.rb +5 -22
  68. data/lib/mongoid/atomic/modifiers.rb +7 -54
  69. data/lib/mongoid/atomic/paths/embedded/many.rb +19 -5
  70. data/lib/mongoid/atomic/paths/embedded/one.rb +0 -5
  71. data/lib/mongoid/atomic/paths/embedded.rb +0 -3
  72. data/lib/mongoid/atomic/paths/root.rb +0 -5
  73. data/lib/mongoid/atomic/paths.rb +0 -1
  74. data/lib/mongoid/atomic.rb +40 -47
  75. data/lib/mongoid/attributes/dynamic.rb +5 -22
  76. data/lib/mongoid/attributes/nested.rb +6 -11
  77. data/lib/mongoid/attributes/processing.rb +11 -21
  78. data/lib/mongoid/attributes/projector.rb +119 -0
  79. data/lib/mongoid/attributes/readonly.rb +3 -8
  80. data/lib/mongoid/attributes.rb +82 -88
  81. data/lib/mongoid/cacheable.rb +4 -9
  82. data/lib/mongoid/changeable.rb +148 -69
  83. data/lib/mongoid/clients/factory.rb +41 -17
  84. data/lib/mongoid/clients/options.rb +13 -14
  85. data/lib/mongoid/clients/sessions.rb +8 -11
  86. data/lib/mongoid/clients/storage_options.rb +7 -17
  87. data/lib/mongoid/clients/validators/storage.rb +3 -24
  88. data/lib/mongoid/clients/validators.rb +0 -1
  89. data/lib/mongoid/clients.rb +1 -10
  90. data/lib/mongoid/collection_configurable.rb +58 -0
  91. data/lib/mongoid/composable.rb +3 -7
  92. data/lib/mongoid/config/defaults.rb +60 -0
  93. data/lib/mongoid/config/environment.rb +28 -5
  94. data/lib/mongoid/config/options.rb +0 -11
  95. data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
  96. data/lib/mongoid/config/validators/client.rb +6 -23
  97. data/lib/mongoid/config/validators/option.rb +0 -3
  98. data/lib/mongoid/config/validators.rb +1 -1
  99. data/lib/mongoid/config.rb +183 -39
  100. data/lib/mongoid/contextual/aggregable/memory.rb +37 -26
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +29 -32
  102. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  103. data/lib/mongoid/contextual/aggregable.rb +17 -0
  104. data/lib/mongoid/contextual/atomic.rb +7 -27
  105. data/lib/mongoid/contextual/command.rb +0 -5
  106. data/lib/mongoid/contextual/geo_near.rb +8 -41
  107. data/lib/mongoid/contextual/map_reduce.rb +2 -33
  108. data/lib/mongoid/contextual/memory.rb +383 -79
  109. data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
  110. data/lib/mongoid/contextual/mongo.rb +636 -283
  111. data/lib/mongoid/contextual/none.rb +262 -31
  112. data/lib/mongoid/contextual/queryable.rb +1 -4
  113. data/lib/mongoid/contextual.rb +14 -7
  114. data/lib/mongoid/copyable.rb +39 -16
  115. data/lib/mongoid/criteria/findable.rb +9 -19
  116. data/lib/mongoid/criteria/includable.rb +27 -31
  117. data/lib/mongoid/criteria/inspectable.rb +0 -3
  118. data/lib/mongoid/criteria/marshalable.rb +10 -7
  119. data/lib/mongoid/criteria/modifiable.rb +2 -20
  120. data/lib/mongoid/criteria/options.rb +0 -3
  121. data/lib/mongoid/criteria/permission.rb +1 -2
  122. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -15
  123. data/lib/mongoid/criteria/queryable/expandable.rb +0 -25
  124. data/lib/mongoid/criteria/queryable/extensions/array.rb +4 -40
  125. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -7
  126. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +3 -6
  127. data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -8
  128. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -6
  129. data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -40
  130. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +0 -13
  131. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -20
  132. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -29
  133. data/lib/mongoid/criteria/queryable/extensions/range.rb +46 -16
  134. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +9 -18
  135. data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -4
  136. data/lib/mongoid/criteria/queryable/extensions/string.rb +4 -31
  137. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -21
  138. data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -8
  139. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +16 -6
  140. data/lib/mongoid/criteria/queryable/extensions.rb +0 -5
  141. data/lib/mongoid/criteria/queryable/key.rb +6 -19
  142. data/lib/mongoid/criteria/queryable/macroable.rb +0 -3
  143. data/lib/mongoid/criteria/queryable/mergeable.rb +123 -38
  144. data/lib/mongoid/criteria/queryable/optional.rb +11 -62
  145. data/lib/mongoid/criteria/queryable/options.rb +2 -21
  146. data/lib/mongoid/criteria/queryable/pipeline.rb +1 -14
  147. data/lib/mongoid/criteria/queryable/selectable.rb +138 -125
  148. data/lib/mongoid/criteria/queryable/selector.rb +94 -30
  149. data/lib/mongoid/criteria/queryable/smash.rb +40 -18
  150. data/lib/mongoid/criteria/queryable/storable.rb +14 -10
  151. data/lib/mongoid/criteria/queryable.rb +11 -13
  152. data/lib/mongoid/criteria/scopable.rb +27 -21
  153. data/lib/mongoid/criteria/translator.rb +45 -0
  154. data/lib/mongoid/criteria.rb +88 -108
  155. data/lib/mongoid/deprecable.rb +36 -0
  156. data/lib/mongoid/deprecation.rb +25 -0
  157. data/lib/mongoid/document.rb +149 -99
  158. data/lib/mongoid/equality.rb +32 -16
  159. data/lib/mongoid/errors/ambiguous_relationship.rb +2 -5
  160. data/lib/mongoid/errors/callback.rb +0 -3
  161. data/lib/mongoid/errors/create_collection_failure.rb +33 -0
  162. data/lib/mongoid/errors/criteria_argument_required.rb +0 -1
  163. data/lib/mongoid/errors/delete_restriction.rb +8 -12
  164. data/lib/mongoid/errors/document_not_destroyed.rb +2 -7
  165. data/lib/mongoid/errors/document_not_found.rb +33 -21
  166. data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
  167. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  168. data/lib/mongoid/errors/immutable_attribute.rb +26 -0
  169. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +0 -3
  170. data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
  171. data/lib/mongoid/errors/invalid_collection.rb +0 -1
  172. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  173. data/lib/mongoid/errors/invalid_config_option.rb +1 -4
  174. data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -4
  175. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  176. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
  177. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  178. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  179. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  180. data/lib/mongoid/errors/invalid_field.rb +6 -7
  181. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  182. data/lib/mongoid/errors/invalid_field_option.rb +0 -3
  183. data/lib/mongoid/errors/invalid_field_type.rb +26 -0
  184. data/lib/mongoid/errors/invalid_find.rb +0 -3
  185. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
  186. data/lib/mongoid/errors/invalid_includes.rb +0 -3
  187. data/lib/mongoid/errors/invalid_index.rb +0 -3
  188. data/lib/mongoid/errors/invalid_options.rb +0 -3
  189. data/lib/mongoid/errors/invalid_path.rb +0 -3
  190. data/lib/mongoid/errors/invalid_persistence_option.rb +0 -5
  191. data/lib/mongoid/errors/invalid_query.rb +40 -0
  192. data/lib/mongoid/errors/invalid_relation.rb +1 -8
  193. data/lib/mongoid/errors/invalid_relation_option.rb +1 -4
  194. data/lib/mongoid/errors/invalid_scope.rb +0 -3
  195. data/lib/mongoid/errors/invalid_session_use.rb +1 -6
  196. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +0 -1
  197. data/lib/mongoid/errors/invalid_storage_options.rb +1 -4
  198. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  199. data/lib/mongoid/errors/invalid_time.rb +0 -3
  200. data/lib/mongoid/errors/inverse_not_found.rb +0 -3
  201. data/lib/mongoid/errors/mixed_client_configuration.rb +0 -3
  202. data/lib/mongoid/errors/mixed_relations.rb +0 -3
  203. data/lib/mongoid/errors/mongoid_error.rb +4 -13
  204. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -4
  205. data/lib/mongoid/errors/no_client_config.rb +2 -5
  206. data/lib/mongoid/errors/no_client_database.rb +1 -4
  207. data/lib/mongoid/errors/no_client_hosts.rb +1 -4
  208. data/lib/mongoid/errors/no_clients_config.rb +0 -3
  209. data/lib/mongoid/errors/no_default_client.rb +1 -4
  210. data/lib/mongoid/errors/no_environment.rb +0 -3
  211. data/lib/mongoid/errors/no_map_reduce_output.rb +0 -3
  212. data/lib/mongoid/errors/no_metadata.rb +0 -3
  213. data/lib/mongoid/errors/no_parent.rb +0 -3
  214. data/lib/mongoid/errors/readonly_attribute.rb +1 -4
  215. data/lib/mongoid/errors/readonly_document.rb +1 -6
  216. data/lib/mongoid/errors/scope_overwrite.rb +0 -1
  217. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -2
  218. data/lib/mongoid/errors/unknown_attribute.rb +1 -4
  219. data/lib/mongoid/errors/unknown_model.rb +0 -3
  220. data/lib/mongoid/errors/unsaved_document.rb +1 -2
  221. data/lib/mongoid/errors/unsupported_javascript.rb +0 -3
  222. data/lib/mongoid/errors/validations.rb +0 -1
  223. data/lib/mongoid/errors.rb +15 -4
  224. data/lib/mongoid/evolvable.rb +1 -4
  225. data/lib/mongoid/extensions/array.rb +12 -36
  226. data/lib/mongoid/extensions/big_decimal.rb +33 -21
  227. data/lib/mongoid/extensions/binary.rb +42 -0
  228. data/lib/mongoid/extensions/boolean.rb +8 -6
  229. data/lib/mongoid/extensions/date.rb +26 -29
  230. data/lib/mongoid/extensions/date_time.rb +1 -10
  231. data/lib/mongoid/extensions/decimal128.rb +0 -5
  232. data/lib/mongoid/extensions/false_class.rb +3 -8
  233. data/lib/mongoid/extensions/float.rb +7 -11
  234. data/lib/mongoid/extensions/hash.rb +19 -37
  235. data/lib/mongoid/extensions/integer.rb +7 -13
  236. data/lib/mongoid/extensions/module.rb +1 -4
  237. data/lib/mongoid/extensions/nil_class.rb +0 -5
  238. data/lib/mongoid/extensions/object.rb +11 -48
  239. data/lib/mongoid/extensions/object_id.rb +0 -7
  240. data/lib/mongoid/extensions/range.rb +40 -20
  241. data/lib/mongoid/extensions/regexp.rb +12 -8
  242. data/lib/mongoid/extensions/set.rb +11 -11
  243. data/lib/mongoid/extensions/string.rb +12 -52
  244. data/lib/mongoid/extensions/symbol.rb +4 -22
  245. data/lib/mongoid/extensions/time.rb +28 -26
  246. data/lib/mongoid/extensions/time_with_zone.rb +14 -11
  247. data/lib/mongoid/extensions/true_class.rb +3 -8
  248. data/lib/mongoid/extensions.rb +17 -3
  249. data/lib/mongoid/factory.rb +80 -16
  250. data/lib/mongoid/fields/foreign_key.rb +11 -25
  251. data/lib/mongoid/fields/localized.rb +19 -15
  252. data/lib/mongoid/fields/standard.rb +17 -40
  253. data/lib/mongoid/fields/validators/macro.rb +25 -24
  254. data/lib/mongoid/fields/validators.rb +0 -1
  255. data/lib/mongoid/fields.rb +346 -75
  256. data/lib/mongoid/findable.rb +107 -31
  257. data/lib/mongoid/indexable/specification.rb +2 -17
  258. data/lib/mongoid/indexable/validators/options.rb +6 -9
  259. data/lib/mongoid/indexable.rb +3 -20
  260. data/lib/mongoid/inspectable.rb +2 -11
  261. data/lib/mongoid/interceptable.rb +79 -41
  262. data/lib/mongoid/loggable.rb +0 -9
  263. data/lib/mongoid/matchable.rb +2 -155
  264. data/lib/mongoid/matcher/all.rb +22 -0
  265. data/lib/mongoid/matcher/and.rb +21 -0
  266. data/lib/mongoid/matcher/bits.rb +41 -0
  267. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  268. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  269. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  270. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  271. data/lib/mongoid/matcher/elem_match.rb +36 -0
  272. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  273. data/lib/mongoid/matcher/eq.rb +11 -0
  274. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  275. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  276. data/lib/mongoid/matcher/exists.rb +15 -0
  277. data/lib/mongoid/matcher/expression.rb +35 -0
  278. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  279. data/lib/mongoid/matcher/field_expression.rb +62 -0
  280. data/lib/mongoid/matcher/field_operator.rb +54 -0
  281. data/lib/mongoid/matcher/gt.rb +17 -0
  282. data/lib/mongoid/matcher/gte.rb +17 -0
  283. data/lib/mongoid/matcher/in.rb +25 -0
  284. data/lib/mongoid/matcher/lt.rb +17 -0
  285. data/lib/mongoid/matcher/lte.rb +17 -0
  286. data/lib/mongoid/matcher/mod.rb +17 -0
  287. data/lib/mongoid/matcher/ne.rb +16 -0
  288. data/lib/mongoid/matcher/nin.rb +11 -0
  289. data/lib/mongoid/matcher/nor.rb +25 -0
  290. data/lib/mongoid/matcher/not.rb +29 -0
  291. data/lib/mongoid/matcher/or.rb +21 -0
  292. data/lib/mongoid/matcher/regex.rb +41 -0
  293. data/lib/mongoid/matcher/size.rb +26 -0
  294. data/lib/mongoid/matcher/type.rb +99 -0
  295. data/lib/mongoid/matcher.rb +130 -0
  296. data/lib/mongoid/persistable/creatable.rb +20 -29
  297. data/lib/mongoid/persistable/deletable.rb +4 -22
  298. data/lib/mongoid/persistable/destroyable.rb +9 -10
  299. data/lib/mongoid/persistable/incrementable.rb +0 -5
  300. data/lib/mongoid/persistable/logical.rb +0 -5
  301. data/lib/mongoid/persistable/poppable.rb +0 -5
  302. data/lib/mongoid/persistable/pullable.rb +0 -7
  303. data/lib/mongoid/persistable/pushable.rb +4 -8
  304. data/lib/mongoid/persistable/renamable.rb +0 -5
  305. data/lib/mongoid/persistable/savable.rb +13 -8
  306. data/lib/mongoid/persistable/settable.rb +0 -5
  307. data/lib/mongoid/persistable/unsettable.rb +2 -7
  308. data/lib/mongoid/persistable/updatable.rb +96 -29
  309. data/lib/mongoid/persistable/upsertable.rb +20 -8
  310. data/lib/mongoid/persistable.rb +6 -26
  311. data/lib/mongoid/persistence_context.rb +71 -43
  312. data/lib/mongoid/positional.rb +0 -5
  313. data/lib/mongoid/query_cache.rb +16 -236
  314. data/lib/mongoid/railtie.rb +0 -15
  315. data/lib/mongoid/railties/controller_runtime.rb +1 -2
  316. data/lib/mongoid/railties/database.rake +7 -2
  317. data/lib/mongoid/reloadable.rb +17 -20
  318. data/lib/mongoid/scopable.rb +32 -56
  319. data/lib/mongoid/selectable.rb +5 -17
  320. data/lib/mongoid/serializable.rb +11 -22
  321. data/lib/mongoid/shardable.rb +49 -16
  322. data/lib/mongoid/stateful.rb +57 -19
  323. data/lib/mongoid/stringified_symbol.rb +52 -0
  324. data/lib/mongoid/tasks/database.rake +12 -0
  325. data/lib/mongoid/tasks/database.rb +59 -11
  326. data/lib/mongoid/threaded/lifecycle.rb +5 -26
  327. data/lib/mongoid/threaded.rb +42 -67
  328. data/lib/mongoid/timestamps/created/short.rb +0 -1
  329. data/lib/mongoid/timestamps/created.rb +1 -2
  330. data/lib/mongoid/timestamps/short.rb +0 -1
  331. data/lib/mongoid/timestamps/timeless.rb +0 -7
  332. data/lib/mongoid/timestamps/updated/short.rb +0 -1
  333. data/lib/mongoid/timestamps/updated.rb +2 -5
  334. data/lib/mongoid/timestamps.rb +0 -1
  335. data/lib/mongoid/touchable.rb +34 -13
  336. data/lib/mongoid/traversable.rb +181 -59
  337. data/lib/mongoid/utils.rb +22 -0
  338. data/lib/mongoid/validatable/associated.rb +1 -4
  339. data/lib/mongoid/validatable/format.rb +0 -1
  340. data/lib/mongoid/validatable/length.rb +0 -1
  341. data/lib/mongoid/validatable/localizable.rb +1 -4
  342. data/lib/mongoid/validatable/macros.rb +5 -14
  343. data/lib/mongoid/validatable/presence.rb +6 -13
  344. data/lib/mongoid/validatable/queryable.rb +0 -3
  345. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  346. data/lib/mongoid/validatable.rb +9 -27
  347. data/lib/mongoid/version.rb +1 -2
  348. data/lib/mongoid/warnings.rb +44 -0
  349. data/lib/mongoid.rb +42 -18
  350. data/lib/rails/generators/mongoid/config/config_generator.rb +8 -2
  351. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  352. data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
  353. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  354. data/lib/rails/generators/mongoid_generator.rb +0 -1
  355. data/lib/rails/mongoid.rb +0 -3
  356. data/spec/README.md +19 -4
  357. data/spec/config/mongoid.yml +16 -0
  358. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  359. data/spec/integration/app_spec.rb +345 -0
  360. data/spec/integration/associations/belongs_to_spec.rb +18 -1
  361. data/spec/integration/associations/embedded_dirty_spec.rb +57 -0
  362. data/spec/integration/associations/embedded_spec.rb +163 -1
  363. data/spec/integration/associations/embeds_many_spec.rb +219 -0
  364. data/spec/integration/associations/embeds_one_spec.rb +41 -0
  365. data/spec/integration/associations/foreign_key_spec.rb +9 -1
  366. data/spec/integration/associations/foreign_key_spec_models.rb +0 -1
  367. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
  368. data/spec/integration/associations/has_many_spec.rb +128 -0
  369. data/spec/integration/associations/has_one_spec.rb +272 -0
  370. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  371. data/spec/integration/associations/reverse_population_spec.rb +0 -1
  372. data/spec/integration/associations/reverse_population_spec_models.rb +0 -1
  373. data/spec/integration/associations/scope_option_spec.rb +101 -0
  374. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  375. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  376. data/spec/integration/callbacks_models.rb +192 -0
  377. data/spec/integration/callbacks_spec.rb +584 -0
  378. data/spec/integration/contextual/empty_spec.rb +141 -0
  379. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  380. data/spec/integration/criteria/date_field_spec.rb +40 -0
  381. data/spec/integration/criteria/default_scope_spec.rb +51 -0
  382. data/spec/integration/criteria/logical_spec.rb +43 -0
  383. data/spec/integration/criteria/range_spec.rb +359 -0
  384. data/spec/integration/criteria/time_with_zone_spec.rb +125 -15
  385. data/spec/integration/discriminator_key_spec.rb +391 -0
  386. data/spec/integration/discriminator_value_spec.rb +206 -0
  387. data/spec/integration/document_spec.rb +30 -1
  388. data/spec/integration/dots_and_dollars_spec.rb +277 -0
  389. data/spec/integration/i18n_fallbacks_spec.rb +3 -19
  390. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +130 -45
  391. data/spec/integration/matcher_operator_data/all.yml +140 -0
  392. data/spec/integration/matcher_operator_data/and.yml +93 -0
  393. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  394. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  395. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  396. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  397. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  398. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  399. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  400. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  401. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  402. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  403. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  404. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  405. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  406. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  407. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  408. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  409. data/spec/integration/matcher_operator_data/in.yml +210 -0
  410. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  411. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  412. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  413. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  414. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  415. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  416. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  417. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  418. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  419. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  420. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  421. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  422. data/spec/integration/matcher_operator_data/not.yml +196 -0
  423. data/spec/integration/matcher_operator_data/or.yml +137 -0
  424. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  425. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  426. data/spec/integration/matcher_operator_data/size.yml +174 -0
  427. data/spec/integration/matcher_operator_data/type.yml +70 -0
  428. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  429. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  430. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  431. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  432. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  433. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  434. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  435. data/spec/integration/matcher_operator_data/type_decimal.yml +41 -0
  436. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  437. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  438. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  439. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  440. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  441. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  442. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  443. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  444. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  445. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  446. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  447. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  448. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  449. data/spec/integration/matcher_operator_spec.rb +122 -0
  450. data/spec/integration/matcher_spec.rb +283 -0
  451. data/spec/integration/persistence/range_field_spec.rb +350 -0
  452. data/spec/integration/server_query_spec.rb +141 -0
  453. data/spec/integration/shardable_spec.rb +20 -5
  454. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  455. data/spec/lite_spec_helper.rb +25 -9
  456. data/spec/mongoid/association/accessors_spec.rb +282 -78
  457. data/spec/mongoid/association/auto_save_spec.rb +72 -34
  458. data/spec/mongoid/association/builders_spec.rb +1 -2
  459. data/spec/mongoid/association/constrainable_spec.rb +0 -1
  460. data/spec/mongoid/association/counter_cache_spec.rb +33 -34
  461. data/spec/mongoid/association/depending_spec.rb +429 -339
  462. data/spec/mongoid/association/eager_spec.rb +6 -6
  463. data/spec/mongoid/association/embedded/cyclic_spec.rb +2 -3
  464. data/spec/mongoid/association/embedded/dirty_spec.rb +2 -3
  465. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -2
  466. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -1
  467. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +150 -14
  468. data/spec/mongoid/association/embedded/embedded_in_spec.rb +0 -1
  469. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +0 -1
  470. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -1
  471. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +704 -198
  472. data/spec/mongoid/association/embedded/embeds_many_models.rb +194 -1
  473. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -1
  474. data/spec/mongoid/association/embedded/embeds_many_spec.rb +78 -1
  475. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +0 -1
  476. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -1
  477. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +36 -24
  478. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +0 -1
  479. data/spec/mongoid/association/embedded/embeds_one_models.rb +20 -1
  480. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +0 -1
  481. data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -3
  482. data/spec/mongoid/association/macros_spec.rb +9 -10
  483. data/spec/mongoid/association/nested/many_spec.rb +0 -1
  484. data/spec/mongoid/association/nested/one_spec.rb +16 -13
  485. data/spec/mongoid/association/options_spec.rb +0 -1
  486. data/spec/mongoid/association/polymorphic_spec.rb +0 -1
  487. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -2
  488. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +109 -17
  489. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +50 -15
  490. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +112 -59
  491. data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
  492. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +20 -1
  493. data/spec/mongoid/association/referenced/belongs_to_spec.rb +26 -22
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +1 -2
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +26 -2
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +31 -3
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +0 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +523 -372
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +43 -1
  500. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +0 -1
  501. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +56 -3
  502. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +1 -2
  503. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +130 -1
  504. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +23 -7
  505. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +413 -130
  506. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +0 -1
  507. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +857 -503
  508. data/spec/mongoid/association/referenced/has_many_models.rb +59 -2
  509. data/spec/mongoid/association/referenced/has_many_query_spec.rb +0 -1
  510. data/spec/mongoid/association/referenced/has_many_spec.rb +46 -1
  511. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +0 -1
  512. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +53 -10
  513. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +17 -2
  514. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +133 -28
  515. data/spec/mongoid/association/referenced/has_one_models.rb +63 -1
  516. data/spec/mongoid/association/referenced/has_one_query_spec.rb +0 -1
  517. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -2
  518. data/spec/mongoid/association/reflections_spec.rb +0 -1
  519. data/spec/mongoid/association/syncable_spec.rb +46 -33
  520. data/spec/mongoid/association_spec.rb +0 -1
  521. data/spec/mongoid/atomic/modifiers_spec.rb +47 -1
  522. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +0 -1
  523. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +0 -1
  524. data/spec/mongoid/atomic/paths/root_spec.rb +0 -1
  525. data/spec/mongoid/atomic/paths_spec.rb +91 -13
  526. data/spec/mongoid/atomic_spec.rb +51 -7
  527. data/spec/mongoid/attributes/dynamic_spec.rb +0 -1
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -79
  529. data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +40 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +22 -23
  534. data/spec/mongoid/attributes_spec.rb +888 -62
  535. data/spec/mongoid/cacheable_spec.rb +4 -5
  536. data/spec/mongoid/changeable_spec.rb +464 -73
  537. data/spec/mongoid/clients/factory_spec.rb +91 -9
  538. data/spec/mongoid/clients/options_spec.rb +27 -19
  539. data/spec/mongoid/clients/sessions_spec.rb +27 -67
  540. data/spec/mongoid/clients/transactions_spec.rb +69 -35
  541. data/spec/mongoid/clients_spec.rb +187 -24
  542. data/spec/mongoid/collection_configurable_spec.rb +158 -0
  543. data/spec/mongoid/composable_spec.rb +0 -1
  544. data/spec/mongoid/config/defaults_spec.rb +160 -0
  545. data/spec/mongoid/config/environment_spec.rb +124 -9
  546. data/spec/mongoid/config/options_spec.rb +0 -1
  547. data/spec/mongoid/config_spec.rb +465 -1
  548. data/spec/mongoid/contextual/aggregable/memory_spec.rb +431 -154
  549. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  550. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
  551. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +120 -21
  552. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  553. data/spec/mongoid/contextual/atomic_spec.rb +148 -86
  554. data/spec/mongoid/contextual/geo_near_spec.rb +28 -20
  555. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -20
  556. data/spec/mongoid/contextual/memory_spec.rb +1826 -304
  557. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
  558. data/spec/mongoid/contextual/mongo_spec.rb +3501 -1272
  559. data/spec/mongoid/contextual/none_spec.rb +78 -68
  560. data/spec/mongoid/copyable_spec.rb +657 -37
  561. data/spec/mongoid/copyable_spec_models.rb +28 -1
  562. data/spec/mongoid/criteria/findable_spec.rb +109 -234
  563. data/spec/mongoid/criteria/includable_spec.rb +1492 -0
  564. data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
  565. data/spec/mongoid/criteria/inspectable_spec.rb +0 -1
  566. data/spec/mongoid/criteria/marshalable_spec.rb +18 -2
  567. data/spec/mongoid/criteria/modifiable_spec.rb +37 -38
  568. data/spec/mongoid/criteria/options_spec.rb +0 -1
  569. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +1 -2
  570. data/spec/mongoid/criteria/queryable/expandable_spec.rb +0 -74
  571. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -20
  572. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -27
  573. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +1 -2
  574. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -1
  575. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -1
  576. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +0 -1
  577. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -16
  578. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +0 -1
  579. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +0 -1
  580. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -8
  581. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +0 -1
  582. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +237 -179
  583. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -2
  584. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -8
  585. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +0 -1
  586. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +5 -71
  587. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -60
  588. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +30 -8
  589. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +39 -2
  590. data/spec/mongoid/criteria/queryable/key_spec.rb +0 -1
  591. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +143 -13
  592. data/spec/mongoid/criteria/queryable/optional_spec.rb +16 -486
  593. data/spec/mongoid/criteria/queryable/options_spec.rb +1 -2
  594. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +0 -1
  595. data/spec/mongoid/criteria/queryable/queryable_spec.rb +1 -2
  596. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1186 -195
  597. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  598. data/spec/mongoid/criteria/queryable/selectable_spec.rb +307 -705
  599. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  600. data/spec/mongoid/criteria/queryable/selector_spec.rb +15 -4
  601. data/spec/mongoid/criteria/queryable/smash_spec.rb +0 -1
  602. data/spec/mongoid/criteria/queryable/storable_spec.rb +37 -1
  603. data/spec/mongoid/criteria/scopable_spec.rb +127 -1
  604. data/spec/mongoid/criteria/translator_spec.rb +132 -0
  605. data/spec/mongoid/criteria_projection_spec.rb +406 -0
  606. data/spec/mongoid/criteria_spec.rb +1267 -1739
  607. data/spec/mongoid/document_fields_spec.rb +179 -5
  608. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  609. data/spec/mongoid/document_query_spec.rb +51 -1
  610. data/spec/mongoid/document_spec.rb +151 -88
  611. data/spec/mongoid/equality_spec.rb +142 -42
  612. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +0 -1
  613. data/spec/mongoid/errors/callback_spec.rb +0 -1
  614. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -3
  615. data/spec/mongoid/errors/document_not_destroyed_spec.rb +0 -1
  616. data/spec/mongoid/errors/document_not_found_spec.rb +76 -1
  617. data/spec/mongoid/errors/invalid_collection_spec.rb +0 -1
  618. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +5 -6
  619. data/spec/mongoid/errors/invalid_config_option_spec.rb +0 -1
  620. data/spec/mongoid/errors/invalid_field_option_spec.rb +0 -1
  621. data/spec/mongoid/errors/invalid_field_spec.rb +1 -2
  622. data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
  623. data/spec/mongoid/errors/invalid_find_spec.rb +0 -1
  624. data/spec/mongoid/errors/invalid_includes_spec.rb +0 -1
  625. data/spec/mongoid/errors/invalid_index_spec.rb +0 -1
  626. data/spec/mongoid/errors/invalid_options_spec.rb +0 -1
  627. data/spec/mongoid/errors/invalid_path_spec.rb +0 -1
  628. data/spec/mongoid/errors/invalid_relation_spec.rb +0 -1
  629. data/spec/mongoid/errors/invalid_scope_spec.rb +1 -2
  630. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +0 -1
  631. data/spec/mongoid/errors/invalid_storage_options_spec.rb +0 -1
  632. data/spec/mongoid/errors/invalid_time_spec.rb +0 -1
  633. data/spec/mongoid/errors/inverse_not_found_spec.rb +0 -1
  634. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +0 -1
  635. data/spec/mongoid/errors/mixed_relations_spec.rb +0 -1
  636. data/spec/mongoid/errors/mongoid_error_spec.rb +22 -9
  637. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +0 -1
  638. data/spec/mongoid/errors/no_client_config_spec.rb +2 -3
  639. data/spec/mongoid/errors/no_client_database_spec.rb +3 -4
  640. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -4
  641. data/spec/mongoid/errors/no_clients_config_spec.rb +0 -1
  642. data/spec/mongoid/errors/no_environment_spec.rb +3 -4
  643. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +0 -1
  644. data/spec/mongoid/errors/no_metadata_spec.rb +0 -1
  645. data/spec/mongoid/errors/no_parent_spec.rb +0 -1
  646. data/spec/mongoid/errors/readonly_attribute_spec.rb +0 -1
  647. data/spec/mongoid/errors/readonly_document_spec.rb +2 -3
  648. data/spec/mongoid/errors/scope_overwrite_spec.rb +0 -1
  649. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -2
  650. data/spec/mongoid/errors/unknown_attribute_spec.rb +2 -3
  651. data/spec/mongoid/errors/unsaved_document_spec.rb +0 -1
  652. data/spec/mongoid/errors/unsupported_javascript_spec.rb +0 -1
  653. data/spec/mongoid/errors/validations_spec.rb +0 -1
  654. data/spec/mongoid/extensions/array_spec.rb +16 -3
  655. data/spec/mongoid/extensions/big_decimal_spec.rb +712 -213
  656. data/spec/mongoid/extensions/binary_spec.rb +44 -10
  657. data/spec/mongoid/extensions/boolean_spec.rb +68 -83
  658. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -4
  659. data/spec/mongoid/extensions/date_spec.rb +71 -2
  660. data/spec/mongoid/extensions/date_time_spec.rb +15 -10
  661. data/spec/mongoid/extensions/decimal128_spec.rb +0 -1
  662. data/spec/mongoid/extensions/false_class_spec.rb +1 -2
  663. data/spec/mongoid/extensions/float_spec.rb +53 -75
  664. data/spec/mongoid/extensions/hash_spec.rb +30 -1
  665. data/spec/mongoid/extensions/integer_spec.rb +50 -65
  666. data/spec/mongoid/extensions/module_spec.rb +0 -1
  667. data/spec/mongoid/extensions/nil_class_spec.rb +0 -1
  668. data/spec/mongoid/extensions/object_id_spec.rb +0 -1
  669. data/spec/mongoid/extensions/object_spec.rb +0 -1
  670. data/spec/mongoid/extensions/range_spec.rb +255 -55
  671. data/spec/mongoid/extensions/regexp_spec.rb +58 -34
  672. data/spec/mongoid/extensions/set_spec.rb +106 -1
  673. data/spec/mongoid/extensions/string_spec.rb +58 -31
  674. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  675. data/spec/mongoid/extensions/symbol_spec.rb +18 -26
  676. data/spec/mongoid/extensions/time_spec.rb +639 -107
  677. data/spec/mongoid/extensions/time_with_zone_spec.rb +24 -84
  678. data/spec/mongoid/extensions/true_class_spec.rb +1 -2
  679. data/spec/mongoid/extensions_spec.rb +14 -3
  680. data/spec/mongoid/factory_spec.rb +323 -30
  681. data/spec/mongoid/fields/foreign_key_spec.rb +0 -1
  682. data/spec/mongoid/fields/localized_spec.rb +84 -42
  683. data/spec/mongoid/fields/standard_spec.rb +0 -1
  684. data/spec/mongoid/fields_spec.rb +855 -118
  685. data/spec/mongoid/findable_spec.rb +518 -65
  686. data/spec/mongoid/indexable/specification_spec.rb +2 -3
  687. data/spec/mongoid/indexable_spec.rb +85 -33
  688. data/spec/mongoid/inspectable_spec.rb +37 -3
  689. data/spec/mongoid/interceptable_spec.rb +702 -104
  690. data/spec/mongoid/interceptable_spec_models.rb +235 -4
  691. data/spec/mongoid/loggable_spec.rb +0 -1
  692. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  693. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  694. data/spec/mongoid/matcher/extract_attribute_spec.rb +36 -0
  695. data/spec/mongoid/mongoizable_spec.rb +285 -0
  696. data/spec/mongoid/persistable/creatable_spec.rb +112 -30
  697. data/spec/mongoid/persistable/deletable_spec.rb +298 -19
  698. data/spec/mongoid/persistable/destroyable_spec.rb +226 -19
  699. data/spec/mongoid/persistable/incrementable_spec.rb +45 -9
  700. data/spec/mongoid/persistable/logical_spec.rb +41 -5
  701. data/spec/mongoid/persistable/poppable_spec.rb +40 -5
  702. data/spec/mongoid/persistable/pullable_spec.rb +80 -9
  703. data/spec/mongoid/persistable/pushable_spec.rb +80 -9
  704. data/spec/mongoid/persistable/renamable_spec.rb +39 -4
  705. data/spec/mongoid/persistable/savable_spec.rb +282 -26
  706. data/spec/mongoid/persistable/settable_spec.rb +76 -10
  707. data/spec/mongoid/persistable/unsettable_spec.rb +40 -5
  708. data/spec/mongoid/persistable/updatable_spec.rb +61 -50
  709. data/spec/mongoid/persistable/upsertable_spec.rb +91 -4
  710. data/spec/mongoid/persistable_spec.rb +3 -4
  711. data/spec/mongoid/persistence_context_spec.rb +57 -59
  712. data/spec/mongoid/positional_spec.rb +0 -1
  713. data/spec/mongoid/query_cache_middleware_spec.rb +7 -5
  714. data/spec/mongoid/query_cache_spec.rb +424 -68
  715. data/spec/mongoid/relations/proxy_spec.rb +7 -8
  716. data/spec/mongoid/reloadable_spec.rb +355 -27
  717. data/spec/mongoid/scopable_spec.rb +191 -39
  718. data/spec/mongoid/selectable_spec.rb +6 -7
  719. data/spec/mongoid/serializable_spec.rb +35 -39
  720. data/spec/mongoid/shardable_models.rb +15 -1
  721. data/spec/mongoid/shardable_spec.rb +181 -32
  722. data/spec/mongoid/stateful_spec.rb +151 -10
  723. data/spec/mongoid/tasks/database_rake_spec.rb +87 -14
  724. data/spec/mongoid/tasks/database_spec.rb +128 -2
  725. data/spec/mongoid/threaded_spec.rb +2 -3
  726. data/spec/mongoid/timestamps/created/short_spec.rb +1 -2
  727. data/spec/mongoid/timestamps/created_spec.rb +1 -2
  728. data/spec/mongoid/timestamps/timeless_spec.rb +2 -3
  729. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -4
  730. data/spec/mongoid/timestamps/updated_spec.rb +3 -4
  731. data/spec/mongoid/timestamps_spec.rb +398 -11
  732. data/spec/mongoid/timestamps_spec_models.rb +67 -0
  733. data/spec/mongoid/touchable_spec.rb +525 -36
  734. data/spec/mongoid/touchable_spec_models.rb +59 -0
  735. data/spec/mongoid/traversable_spec.rb +1143 -2
  736. data/spec/mongoid/validatable/associated_spec.rb +0 -1
  737. data/spec/mongoid/validatable/format_spec.rb +0 -1
  738. data/spec/mongoid/validatable/length_spec.rb +0 -1
  739. data/spec/mongoid/validatable/numericality_spec.rb +0 -1
  740. data/spec/mongoid/validatable/presence_spec.rb +26 -23
  741. data/spec/mongoid/validatable/uniqueness_spec.rb +125 -99
  742. data/spec/mongoid/validatable_spec.rb +3 -4
  743. data/spec/mongoid/warnings_spec.rb +35 -0
  744. data/spec/mongoid_spec.rb +35 -10
  745. data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -3
  746. data/spec/rails/mongoid_spec.rb +4 -17
  747. data/spec/shared/LICENSE +20 -0
  748. data/spec/shared/bin/get-mongodb-download-url +17 -0
  749. data/spec/shared/bin/s3-copy +45 -0
  750. data/spec/shared/bin/s3-upload +69 -0
  751. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  752. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  753. data/spec/shared/lib/mrss/constraints.rb +378 -0
  754. data/spec/shared/lib/mrss/docker_runner.rb +298 -0
  755. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  756. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  757. data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
  758. data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
  759. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  760. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  761. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  762. data/spec/shared/lib/mrss/utils.rb +37 -0
  763. data/spec/shared/share/Dockerfile.erb +321 -0
  764. data/spec/shared/share/haproxy-1.conf +16 -0
  765. data/spec/shared/share/haproxy-2.conf +17 -0
  766. data/spec/shared/shlib/config.sh +27 -0
  767. data/spec/shared/shlib/distro.sh +74 -0
  768. data/spec/shared/shlib/server.sh +416 -0
  769. data/spec/shared/shlib/set_env.sh +169 -0
  770. data/spec/spec_helper.rb +24 -54
  771. data/spec/support/authorization.rb +0 -1
  772. data/spec/support/client_registry.rb +9 -0
  773. data/spec/support/constraints.rb +34 -197
  774. data/spec/support/expectations.rb +0 -1
  775. data/spec/support/helpers.rb +1 -1
  776. data/spec/support/immutable_ids.rb +118 -0
  777. data/spec/support/macros.rb +109 -1
  778. data/spec/{app → support}/models/account.rb +1 -2
  779. data/spec/{app → support}/models/acolyte.rb +0 -1
  780. data/spec/{app → support}/models/actor.rb +1 -2
  781. data/spec/{app → support}/models/actress.rb +0 -1
  782. data/spec/{app → support}/models/address.rb +4 -1
  783. data/spec/{app → support}/models/address_component.rb +0 -1
  784. data/spec/{app → support}/models/address_number.rb +0 -1
  785. data/spec/{app → support}/models/agency.rb +0 -1
  786. data/spec/{app → support}/models/agent.rb +0 -1
  787. data/spec/{app → support}/models/album.rb +0 -1
  788. data/spec/{app → support}/models/alert.rb +0 -1
  789. data/spec/{app → support}/models/animal.rb +0 -1
  790. data/spec/{app → support}/models/answer.rb +0 -1
  791. data/spec/{app → support}/models/appointment.rb +0 -1
  792. data/spec/support/models/armrest.rb +9 -0
  793. data/spec/{app → support}/models/array_field.rb +0 -1
  794. data/spec/{app → support}/models/article.rb +0 -1
  795. data/spec/{app → support}/models/artist.rb +2 -2
  796. data/spec/{app → support}/models/artwork.rb +0 -1
  797. data/spec/support/models/audible_sound.rb +3 -0
  798. data/spec/{app → support}/models/audio.rb +0 -1
  799. data/spec/support/models/augmentation.rb +25 -0
  800. data/spec/{app → support}/models/author.rb +0 -1
  801. data/spec/{app → support}/models/baby.rb +0 -1
  802. data/spec/{app → support}/models/band.rb +8 -1
  803. data/spec/{app → support}/models/bar.rb +0 -1
  804. data/spec/{app → support}/models/basic.rb +0 -1
  805. data/spec/{app → support}/models/bed.rb +0 -1
  806. data/spec/{app → support}/models/big_palette.rb +0 -1
  807. data/spec/{app → support}/models/birthday.rb +0 -1
  808. data/spec/support/models/bolt.rb +7 -0
  809. data/spec/{app → support}/models/bomb.rb +0 -1
  810. data/spec/{app → support}/models/book.rb +1 -1
  811. data/spec/{app → support}/models/breed.rb +0 -1
  812. data/spec/{app → support}/models/browser.rb +1 -2
  813. data/spec/{app → support}/models/building.rb +2 -1
  814. data/spec/{app → support}/models/building_address.rb +0 -1
  815. data/spec/{app → support}/models/bus.rb +0 -1
  816. data/spec/{app → support}/models/business.rb +0 -1
  817. data/spec/{app → support}/models/callback_test.rb +0 -1
  818. data/spec/{app → support}/models/canvas.rb +1 -2
  819. data/spec/{app → support}/models/car.rb +0 -1
  820. data/spec/{app → support}/models/cat.rb +0 -1
  821. data/spec/support/models/catalog.rb +24 -0
  822. data/spec/{app → support}/models/category.rb +0 -1
  823. data/spec/{app → support}/models/child.rb +0 -1
  824. data/spec/{app → support}/models/child_doc.rb +3 -4
  825. data/spec/{app → support}/models/church.rb +0 -1
  826. data/spec/{app → support}/models/circle.rb +0 -1
  827. data/spec/{app → support}/models/circuit.rb +0 -1
  828. data/spec/{app → support}/models/circus.rb +3 -1
  829. data/spec/{app → support}/models/code.rb +2 -1
  830. data/spec/{app → support}/models/coding/pull_request.rb +0 -1
  831. data/spec/support/models/coding.rb +3 -0
  832. data/spec/{app → support}/models/comment.rb +0 -1
  833. data/spec/{app → support}/models/company.rb +0 -1
  834. data/spec/{app → support}/models/consumption_period.rb +0 -1
  835. data/spec/{app → support}/models/contextable_item.rb +0 -1
  836. data/spec/{app → support}/models/contractor.rb +0 -1
  837. data/spec/{app → support}/models/cookie.rb +0 -1
  838. data/spec/{app → support}/models/country_code.rb +2 -1
  839. data/spec/{app → support}/models/courier_job.rb +0 -1
  840. data/spec/support/models/cover.rb +10 -0
  841. data/spec/support/models/crate.rb +12 -0
  842. data/spec/support/models/customer.rb +10 -0
  843. data/spec/support/models/customer_address.rb +11 -0
  844. data/spec/support/models/deed.rb +7 -0
  845. data/spec/{app → support}/models/definition.rb +0 -1
  846. data/spec/{app → support}/models/delegating_patient.rb +0 -1
  847. data/spec/{app → support}/models/description.rb +0 -1
  848. data/spec/{app → support}/models/dictionary.rb +6 -1
  849. data/spec/{app → support}/models/division.rb +0 -1
  850. data/spec/{app → support}/models/doctor.rb +0 -1
  851. data/spec/{app → support}/models/dog.rb +0 -1
  852. data/spec/{app → support}/models/dokument.rb +0 -1
  853. data/spec/{app → support}/models/draft.rb +0 -1
  854. data/spec/{app → support}/models/dragon.rb +0 -1
  855. data/spec/{app → support}/models/driver.rb +1 -2
  856. data/spec/{app → support}/models/drug.rb +0 -1
  857. data/spec/{app → support}/models/dungeon.rb +0 -1
  858. data/spec/{app → support}/models/edit.rb +0 -1
  859. data/spec/{app → support}/models/email.rb +0 -1
  860. data/spec/{app → support}/models/employer.rb +0 -1
  861. data/spec/{app → support}/models/entry.rb +0 -1
  862. data/spec/{app → support}/models/eraser.rb +0 -1
  863. data/spec/{app → support}/models/even.rb +0 -1
  864. data/spec/{app → support}/models/event.rb +0 -1
  865. data/spec/{app → support}/models/exhibition.rb +0 -1
  866. data/spec/{app → support}/models/exhibitor.rb +0 -1
  867. data/spec/{app → support}/models/explosion.rb +0 -1
  868. data/spec/{app → support}/models/eye.rb +0 -1
  869. data/spec/{app → support}/models/eye_bowl.rb +0 -1
  870. data/spec/{app → support}/models/face.rb +0 -1
  871. data/spec/support/models/fanatic.rb +8 -0
  872. data/spec/{app → support}/models/favorite.rb +0 -1
  873. data/spec/{app → support}/models/filesystem.rb +0 -1
  874. data/spec/{app → support}/models/fire_hydrant.rb +0 -1
  875. data/spec/{app → support}/models/firefox.rb +0 -1
  876. data/spec/{app → support}/models/fish.rb +0 -1
  877. data/spec/{app → support}/models/folder.rb +0 -1
  878. data/spec/{app → support}/models/folder_item.rb +0 -1
  879. data/spec/{app → support}/models/fruits.rb +0 -1
  880. data/spec/{app → support}/models/game.rb +0 -1
  881. data/spec/{app → support}/models/ghost.rb +0 -1
  882. data/spec/support/models/guitar.rb +4 -0
  883. data/spec/support/models/hole.rb +12 -0
  884. data/spec/{app → support}/models/home.rb +0 -1
  885. data/spec/{app → support}/models/house.rb +0 -1
  886. data/spec/{app → support}/models/html_writer.rb +0 -1
  887. data/spec/{app → support}/models/id_key.rb +0 -1
  888. data/spec/support/models/idnodef.rb +7 -0
  889. data/spec/{app → support}/models/image.rb +0 -1
  890. data/spec/{app → support}/models/implant.rb +9 -1
  891. data/spec/support/models/instrument.rb +8 -0
  892. data/spec/{app → support}/models/item.rb +1 -2
  893. data/spec/{app → support}/models/jar.rb +0 -1
  894. data/spec/{app → support}/models/kaleidoscope.rb +0 -1
  895. data/spec/{app → support}/models/kangaroo.rb +0 -1
  896. data/spec/{app → support}/models/label.rb +4 -2
  897. data/spec/{app → support}/models/language.rb +0 -1
  898. data/spec/{app → support}/models/lat_lng.rb +0 -1
  899. data/spec/{app → support}/models/league.rb +0 -1
  900. data/spec/{app → support}/models/learner.rb +0 -1
  901. data/spec/{app → support}/models/line_item.rb +0 -1
  902. data/spec/{app → support}/models/location.rb +0 -1
  903. data/spec/{app → support}/models/login.rb +0 -1
  904. data/spec/{app → support}/models/manufacturer.rb +0 -1
  905. data/spec/{app → support}/models/meat.rb +0 -1
  906. data/spec/{app → support}/models/membership.rb +1 -1
  907. data/spec/{app → support}/models/message.rb +0 -1
  908. data/spec/{app → support}/models/minim.rb +0 -1
  909. data/spec/{app → support}/models/mixed_drink.rb +0 -1
  910. data/spec/support/models/mop.rb +24 -0
  911. data/spec/{app → support}/models/movie.rb +0 -1
  912. data/spec/{app → support}/models/my_hash.rb +0 -1
  913. data/spec/{app → support}/models/name.rb +0 -1
  914. data/spec/{app → support}/models/name_only.rb +0 -1
  915. data/spec/{app → support}/models/node.rb +0 -1
  916. data/spec/{app → support}/models/note.rb +0 -1
  917. data/spec/support/models/nut.rb +7 -0
  918. data/spec/{app → support}/models/odd.rb +0 -1
  919. data/spec/support/models/order.rb +12 -0
  920. data/spec/{app → support}/models/ordered_post.rb +1 -2
  921. data/spec/{app → support}/models/ordered_preference.rb +0 -1
  922. data/spec/{app → support}/models/oscar.rb +0 -1
  923. data/spec/{app → support}/models/other_owner_object.rb +0 -1
  924. data/spec/{app → support}/models/override.rb +0 -1
  925. data/spec/{app → support}/models/ownable.rb +0 -1
  926. data/spec/{app → support}/models/owner.rb +2 -1
  927. data/spec/{app → support}/models/pack.rb +0 -1
  928. data/spec/{app → support}/models/page.rb +0 -1
  929. data/spec/{app → support}/models/page_question.rb +0 -1
  930. data/spec/{app → support}/models/palette.rb +1 -2
  931. data/spec/{app → support}/models/parent.rb +0 -1
  932. data/spec/{app → support}/models/parent_doc.rb +0 -1
  933. data/spec/support/models/passport.rb +22 -0
  934. data/spec/{app → support}/models/patient.rb +0 -1
  935. data/spec/{app → support}/models/pdf_writer.rb +0 -1
  936. data/spec/{app → support}/models/pencil.rb +0 -1
  937. data/spec/{app → support}/models/person.rb +20 -2
  938. data/spec/{app → support}/models/pet.rb +0 -1
  939. data/spec/{app → support}/models/pet_owner.rb +0 -1
  940. data/spec/{app → support}/models/phone.rb +3 -2
  941. data/spec/support/models/piano.rb +4 -0
  942. data/spec/{app → support}/models/pizza.rb +0 -1
  943. data/spec/{app → support}/models/player.rb +2 -1
  944. data/spec/{app → support}/models/post.rb +0 -1
  945. data/spec/{app → support}/models/post_genre.rb +0 -1
  946. data/spec/support/models/powerup.rb +25 -0
  947. data/spec/{app → support}/models/preference.rb +0 -1
  948. data/spec/{app → support}/models/princess.rb +0 -1
  949. data/spec/{app → support}/models/product.rb +1 -1
  950. data/spec/support/models/profile.rb +17 -0
  951. data/spec/{app → support}/models/pronunciation.rb +0 -1
  952. data/spec/{app → support}/models/pub.rb +0 -1
  953. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -1
  954. data/spec/{app → support}/models/publication/review.rb +0 -1
  955. data/spec/support/models/publication.rb +4 -0
  956. data/spec/{app → support}/models/purchase.rb +0 -1
  957. data/spec/support/models/purchased_item.rb +10 -0
  958. data/spec/{app → support}/models/question.rb +0 -1
  959. data/spec/{app → support}/models/quiz.rb +0 -1
  960. data/spec/{app → support}/models/rating.rb +0 -1
  961. data/spec/{app → support}/models/record.rb +0 -1
  962. data/spec/{app → support}/models/registry.rb +1 -1
  963. data/spec/{app → support}/models/role.rb +0 -1
  964. data/spec/{app → support}/models/root_category.rb +0 -1
  965. data/spec/{app → support}/models/sandwich.rb +0 -1
  966. data/spec/{app → support}/models/scheduler.rb +0 -1
  967. data/spec/support/models/school.rb +14 -0
  968. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -3
  969. data/spec/support/models/sealer.rb +7 -0
  970. data/spec/support/models/seat.rb +24 -0
  971. data/spec/{app → support}/models/seo.rb +0 -1
  972. data/spec/{app → support}/models/series.rb +1 -1
  973. data/spec/{app → support}/models/server.rb +0 -1
  974. data/spec/{app → support}/models/service.rb +0 -1
  975. data/spec/{app → support}/models/shape.rb +2 -3
  976. data/spec/{app → support}/models/shelf.rb +0 -1
  977. data/spec/support/models/shield.rb +18 -0
  978. data/spec/{app → support}/models/shipment_address.rb +0 -1
  979. data/spec/{app → support}/models/shipping_container.rb +0 -1
  980. data/spec/{app → support}/models/shipping_pack.rb +0 -1
  981. data/spec/support/models/shirt.rb +11 -0
  982. data/spec/{app → support}/models/shop.rb +0 -1
  983. data/spec/{app → support}/models/short_agent.rb +0 -1
  984. data/spec/{app → support}/models/short_quiz.rb +0 -1
  985. data/spec/{app → support}/models/simple.rb +0 -1
  986. data/spec/{app → support}/models/slave.rb +0 -1
  987. data/spec/{app → support}/models/song.rb +0 -1
  988. data/spec/{app → support}/models/sound.rb +0 -1
  989. data/spec/support/models/spacer.rb +7 -0
  990. data/spec/{app → support}/models/square.rb +0 -1
  991. data/spec/{app → support}/models/staff.rb +0 -1
  992. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -1
  993. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -1
  994. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -1
  995. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -1
  996. data/spec/{app → support}/models/strategy.rb +0 -1
  997. data/spec/support/models/student.rb +14 -0
  998. data/spec/{app → support}/models/sub_item.rb +0 -1
  999. data/spec/{app → support}/models/subscription.rb +0 -1
  1000. data/spec/{app → support}/models/survey.rb +0 -1
  1001. data/spec/{app → support}/models/symptom.rb +0 -1
  1002. data/spec/support/models/system_role.rb +7 -0
  1003. data/spec/{app → support}/models/tag.rb +0 -1
  1004. data/spec/{app → support}/models/target.rb +0 -1
  1005. data/spec/{app → support}/models/template.rb +0 -1
  1006. data/spec/{app → support}/models/thing.rb +0 -1
  1007. data/spec/support/models/threadlocker.rb +7 -0
  1008. data/spec/{app → support}/models/title.rb +0 -1
  1009. data/spec/{app → support}/models/tool.rb +2 -3
  1010. data/spec/{app → support}/models/topping.rb +0 -1
  1011. data/spec/support/models/toy.rb +9 -0
  1012. data/spec/{app → support}/models/track.rb +0 -1
  1013. data/spec/{app → support}/models/translation.rb +0 -1
  1014. data/spec/{app → support}/models/tree.rb +0 -1
  1015. data/spec/{app → support}/models/truck.rb +2 -1
  1016. data/spec/{app → support}/models/updatable.rb +0 -1
  1017. data/spec/{app → support}/models/user.rb +0 -1
  1018. data/spec/{app → support}/models/user_account.rb +0 -1
  1019. data/spec/{app → support}/models/validation_callback.rb +0 -1
  1020. data/spec/{app → support}/models/vehicle.rb +7 -3
  1021. data/spec/{app → support}/models/version.rb +0 -1
  1022. data/spec/{app → support}/models/vertex.rb +0 -1
  1023. data/spec/{app → support}/models/vet_visit.rb +0 -1
  1024. data/spec/{app → support}/models/video.rb +0 -1
  1025. data/spec/{app → support}/models/video_game.rb +0 -1
  1026. data/spec/support/models/washer.rb +7 -0
  1027. data/spec/support/models/weapon.rb +25 -0
  1028. data/spec/{app → support}/models/wiki_page.rb +1 -1
  1029. data/spec/{app → support}/models/word.rb +0 -1
  1030. data/spec/{app → support}/models/word_origin.rb +0 -1
  1031. data/spec/{app → support}/models/writer.rb +2 -3
  1032. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1033. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1034. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1035. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1036. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1037. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1038. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1039. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1040. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1041. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1042. data/spec/support/shared/time.rb +0 -1
  1043. data/spec/support/spec_config.rb +28 -6
  1044. data.tar.gz.sig +0 -0
  1045. metadata +1216 -799
  1046. metadata.gz.sig +0 -0
  1047. data/lib/mongoid/errors/eager_load.rb +0 -26
  1048. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1049. data/lib/mongoid/matchable/all.rb +0 -30
  1050. data/lib/mongoid/matchable/and.rb +0 -32
  1051. data/lib/mongoid/matchable/default.rb +0 -121
  1052. data/lib/mongoid/matchable/elem_match.rb +0 -36
  1053. data/lib/mongoid/matchable/eq.rb +0 -23
  1054. data/lib/mongoid/matchable/exists.rb +0 -25
  1055. data/lib/mongoid/matchable/gt.rb +0 -25
  1056. data/lib/mongoid/matchable/gte.rb +0 -25
  1057. data/lib/mongoid/matchable/in.rb +0 -26
  1058. data/lib/mongoid/matchable/lt.rb +0 -25
  1059. data/lib/mongoid/matchable/lte.rb +0 -25
  1060. data/lib/mongoid/matchable/ne.rb +0 -23
  1061. data/lib/mongoid/matchable/nin.rb +0 -24
  1062. data/lib/mongoid/matchable/nor.rb +0 -38
  1063. data/lib/mongoid/matchable/or.rb +0 -35
  1064. data/lib/mongoid/matchable/regexp.rb +0 -30
  1065. data/lib/mongoid/matchable/size.rb +0 -23
  1066. data/lib/support/ruby_version.rb +0 -29
  1067. data/spec/app/models/augmentation.rb +0 -14
  1068. data/spec/app/models/coding.rb +0 -4
  1069. data/spec/app/models/passport.rb +0 -8
  1070. data/spec/app/models/powerup.rb +0 -14
  1071. data/spec/app/models/publication.rb +0 -5
  1072. data/spec/app/models/weapon.rb +0 -14
  1073. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1074. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1075. data/spec/mongoid/matchable/all_spec.rb +0 -34
  1076. data/spec/mongoid/matchable/and_spec.rb +0 -190
  1077. data/spec/mongoid/matchable/default_spec.rb +0 -140
  1078. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  1079. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  1080. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  1081. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  1082. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  1083. data/spec/mongoid/matchable/in_spec.rb +0 -52
  1084. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  1085. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  1086. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  1087. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  1088. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  1089. data/spec/mongoid/matchable/or_spec.rb +0 -134
  1090. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  1091. data/spec/mongoid/matchable/size_spec.rb +0 -28
  1092. data/spec/mongoid/matchable_spec.rb +0 -856
  1093. data/spec/support/cluster_config.rb +0 -158
  1094. data/spec/support/lite_constraints.rb +0 -22
@@ -1,17 +1,15 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  require "spec_helper"
4
+ require_relative "../has_and_belongs_to_many_models"
5
5
 
6
6
  describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
7
+ config_override :raise_not_found_error, true
7
8
 
8
9
  around(:each) do |example|
9
- original_raise_not_found_error = Mongoid.raise_not_found_error
10
10
  original_preferences_association = Person.relations["preferences"]
11
- Mongoid.raise_not_found_error = true
12
11
  Person.has_and_belongs_to_many :preferences, autosave: true
13
12
  example.run
14
- Mongoid.raise_not_found_error = original_raise_not_found_error
15
13
  Person.relations["preferences"] = original_preferences_association
16
14
  end
17
15
 
@@ -27,7 +25,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
27
25
  context "when the inverse_of is nil" do
28
26
 
29
27
  let!(:article) do
30
- Article.create
28
+ Article.create!
31
29
  end
32
30
 
33
31
  context "when the child document is new" do
@@ -48,7 +46,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
48
46
  context "when the child document is not new" do
49
47
 
50
48
  let(:preference) do
51
- Preference.create
49
+ Preference.create!
52
50
  end
53
51
 
54
52
  it "does not persist the child document" do
@@ -80,7 +78,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
80
78
  context "when the parent is not a new record" do
81
79
 
82
80
  let(:person) do
83
- Person.create
81
+ Person.create!
84
82
  end
85
83
 
86
84
  let!(:preference) do
@@ -124,11 +122,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
124
122
  context "when appending in a parent create block" do
125
123
 
126
124
  let!(:preference) do
127
- Preference.create(name: "testing")
125
+ Preference.create!(name: "testing")
128
126
  end
129
127
 
130
128
  let!(:person) do
131
- Person.create do |doc|
129
+ Person.create! do |doc|
132
130
  doc.preferences << preference
133
131
  end
134
132
  end
@@ -213,7 +211,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
213
211
  context "when the child is already persisted" do
214
212
 
215
213
  let!(:persisted) do
216
- Preference.create(name: "testy")
214
+ Preference.create!(name: "testy")
217
215
  end
218
216
 
219
217
  let(:preference) do
@@ -222,7 +220,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
222
220
 
223
221
  before do
224
222
  person.preferences.send(method, preference)
225
- person.save
223
+ person.save!
226
224
  end
227
225
 
228
226
  it "adds the documents to the relation" do
@@ -253,7 +251,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
253
251
  context "when setting via the associated ids" do
254
252
 
255
253
  let!(:persisted) do
256
- Preference.create(name: "testy")
254
+ Preference.create!(name: "testy")
257
255
  end
258
256
 
259
257
  let(:preference) do
@@ -265,7 +263,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
265
263
  end
266
264
 
267
265
  before do
268
- person.save
266
+ person.save!
269
267
  end
270
268
 
271
269
  it "adds the documents to the relation" do
@@ -293,7 +291,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
293
291
  context "when the parent is not a new record" do
294
292
 
295
293
  let(:person) do
296
- Person.create
294
+ Person.create!
297
295
  end
298
296
 
299
297
  let(:preference) do
@@ -375,11 +373,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
375
373
  context "when both sides have been persisted" do
376
374
 
377
375
  let(:person) do
378
- Person.create
376
+ Person.create!
379
377
  end
380
378
 
381
379
  let(:event) do
382
- Event.create
380
+ Event.create!
383
381
  end
384
382
 
385
383
  before do
@@ -428,15 +426,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
428
426
  context "when the relation also includes a has_many relation" do
429
427
 
430
428
  let(:artwork) do
431
- Artwork.create
429
+ Artwork.create!
432
430
  end
433
431
 
434
432
  let(:exhibition) do
435
- Exhibition.create
433
+ Exhibition.create!
436
434
  end
437
435
 
438
436
  let(:exhibitor) do
439
- Exhibitor.create(exhibition: exhibition)
437
+ Exhibitor.create!(exhibition: exhibition)
440
438
  end
441
439
 
442
440
  before do
@@ -451,11 +449,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
451
449
  context "when the relation is self referencing" do
452
450
 
453
451
  let(:tag_one) do
454
- Tag.create(text: "one")
452
+ Tag.create!(text: "one")
455
453
  end
456
454
 
457
455
  let(:tag_two) do
458
- Tag.create(text: "two")
456
+ Tag.create!(text: "two")
459
457
  end
460
458
 
461
459
  before do
@@ -564,7 +562,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
564
562
  end
565
563
 
566
564
  let(:preference) do
567
- Preference.create(name: "one")
565
+ Preference.create!(name: "one")
568
566
  end
569
567
 
570
568
  before do
@@ -585,7 +583,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
585
583
  context "when the document is persisted" do
586
584
 
587
585
  before do
588
- person.save
586
+ person.save!
589
587
  end
590
588
 
591
589
  it "does not add the duplicates" do
@@ -656,7 +654,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
656
654
  end
657
655
 
658
656
  let!(:preference) do
659
- Preference.create
657
+ Preference.create!
660
658
  end
661
659
 
662
660
  before do
@@ -703,7 +701,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
703
701
  context "when the parent is not a new record" do
704
702
 
705
703
  let(:person) do
706
- Person.create
704
+ Person.create!
707
705
  end
708
706
 
709
707
  let(:preference) do
@@ -787,7 +785,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
787
785
  expect(person.preferences).to eq([ another_preference ])
788
786
  end
789
787
 
790
- it "persists the relation between another_prefrence and person" do
788
+ it "persists the relation between another_preference and person" do
791
789
  expect(another_preference.people).to eq([ person ])
792
790
  end
793
791
 
@@ -799,7 +797,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
799
797
  context "and person is saved" do
800
798
 
801
799
  before do
802
- person.save
800
+ person.save!
803
801
  person.reload
804
802
  another_preference.reload
805
803
  end
@@ -808,7 +806,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
808
806
  expect(person.preferences).to eq([ another_preference ])
809
807
  end
810
808
 
811
- it "persists the relation between another_prefrence and person" do
809
+ it "persists the relation between another_preference and person" do
812
810
  expect(another_preference.people).to eq([ person ])
813
811
  end
814
812
 
@@ -823,11 +821,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
823
821
 
824
822
  describe "when self-referencing" do
825
823
  let!(:parent) do
826
- Vertex.create
824
+ Vertex.create!
827
825
  end
828
826
 
829
827
  let!(:child) do
830
- Vertex.create(parents: [parent])
828
+ Vertex.create!(parents: [parent])
831
829
  end
832
830
 
833
831
  before do
@@ -964,7 +962,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
964
962
  context "when the relation has been loaded" do
965
963
 
966
964
  let(:person) do
967
- Person.create
965
+ Person.create!
968
966
  end
969
967
 
970
968
  let(:preference) do
@@ -1004,7 +1002,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1004
1002
  end
1005
1003
 
1006
1004
  let(:person) do
1007
- Person.create.tap do |p|
1005
+ Person.create!.tap do |p|
1008
1006
  p.preferences = [ preference ]
1009
1007
  end
1010
1008
  end
@@ -1074,7 +1072,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1074
1072
  context "when the parent is not a new record" do
1075
1073
 
1076
1074
  let(:person) do
1077
- Person.create
1075
+ Person.create!
1078
1076
  end
1079
1077
 
1080
1078
  let!(:preference) do
@@ -1112,7 +1110,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1112
1110
  context "when saving the target" do
1113
1111
 
1114
1112
  before do
1115
- preference.save
1113
+ preference.save!
1116
1114
  end
1117
1115
 
1118
1116
  it "persists the parent keys" do
@@ -1131,13 +1129,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1131
1129
  context "when the parent has been persisted" do
1132
1130
 
1133
1131
  let!(:person) do
1134
- Person.create
1132
+ Person.create!
1135
1133
  end
1136
1134
 
1137
1135
  context "when the children are persisted" do
1138
1136
 
1139
1137
  let!(:preference) do
1140
- person.preferences.create(name: "settings")
1138
+ person.preferences.create!(name: "settings")
1141
1139
  end
1142
1140
 
1143
1141
  let!(:relation) do
@@ -1309,7 +1307,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1309
1307
  context "when the parent is not a new record" do
1310
1308
 
1311
1309
  let(:person) do
1312
- Person.create
1310
+ Person.create!
1313
1311
  end
1314
1312
 
1315
1313
  let!(:preference) do
@@ -1353,11 +1351,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1353
1351
  context "when appending in a parent create block" do
1354
1352
 
1355
1353
  let!(:preference) do
1356
- Preference.create(name: "testing")
1354
+ Preference.create!(name: "testing")
1357
1355
  end
1358
1356
 
1359
1357
  let!(:person) do
1360
- Person.create do |doc|
1358
+ Person.create! do |doc|
1361
1359
  doc.preferences.concat([ preference ])
1362
1360
  end
1363
1361
  end
@@ -1442,7 +1440,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1442
1440
  context "when the child is already persisted" do
1443
1441
 
1444
1442
  let!(:persisted) do
1445
- Preference.create(name: "testy")
1443
+ Preference.create!(name: "testy")
1446
1444
  end
1447
1445
 
1448
1446
  let(:preference) do
@@ -1451,7 +1449,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1451
1449
 
1452
1450
  before do
1453
1451
  person.preferences.concat([ preference ])
1454
- person.save
1452
+ person.save!
1455
1453
  end
1456
1454
 
1457
1455
  it "adds the documents to the relation" do
@@ -1482,7 +1480,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1482
1480
  context "when setting via the associated ids" do
1483
1481
 
1484
1482
  let!(:persisted) do
1485
- Preference.create(name: "testy")
1483
+ Preference.create!(name: "testy")
1486
1484
  end
1487
1485
 
1488
1486
  let(:preference) do
@@ -1494,7 +1492,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1494
1492
  end
1495
1493
 
1496
1494
  before do
1497
- person.save
1495
+ person.save!
1498
1496
  end
1499
1497
 
1500
1498
  it "adds the documents to the relation" do
@@ -1522,7 +1520,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1522
1520
  context "when the parent is not a new record" do
1523
1521
 
1524
1522
  let(:person) do
1525
- Person.create
1523
+ Person.create!
1526
1524
  end
1527
1525
 
1528
1526
  let(:preference) do
@@ -1604,11 +1602,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1604
1602
  context "when both sides have been persisted" do
1605
1603
 
1606
1604
  let(:person) do
1607
- Person.create
1605
+ Person.create!
1608
1606
  end
1609
1607
 
1610
1608
  let(:event) do
1611
- Event.create
1609
+ Event.create!
1612
1610
  end
1613
1611
 
1614
1612
  before do
@@ -1657,15 +1655,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1657
1655
  context "when the relation also includes a has_many relation" do
1658
1656
 
1659
1657
  let(:artwork) do
1660
- Artwork.create
1658
+ Artwork.create!
1661
1659
  end
1662
1660
 
1663
1661
  let(:exhibition) do
1664
- Exhibition.create
1662
+ Exhibition.create!
1665
1663
  end
1666
1664
 
1667
1665
  let(:exhibitor) do
1668
- Exhibitor.create(exhibition: exhibition)
1666
+ Exhibitor.create!(exhibition: exhibition)
1669
1667
  end
1670
1668
 
1671
1669
  before do
@@ -1680,11 +1678,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1680
1678
  context "when the relation is self referencing" do
1681
1679
 
1682
1680
  let(:tag_one) do
1683
- Tag.create(text: "one")
1681
+ Tag.create!(text: "one")
1684
1682
  end
1685
1683
 
1686
1684
  let(:tag_two) do
1687
- Tag.create(text: "two")
1685
+ Tag.create!(text: "two")
1688
1686
  end
1689
1687
 
1690
1688
  before do
@@ -1735,7 +1733,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1735
1733
  describe "#count" do
1736
1734
 
1737
1735
  let(:person) do
1738
- Person.create
1736
+ Person.create!
1739
1737
  end
1740
1738
 
1741
1739
  context "when nothing exists on the relation" do
@@ -1757,10 +1755,47 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1757
1755
  end
1758
1756
  end
1759
1757
 
1758
+ describe "#any?" do
1759
+
1760
+ let(:person) do
1761
+ Person.create!
1762
+ end
1763
+
1764
+ context "when nothing exists on the relation" do
1765
+
1766
+ context "when no document is added" do
1767
+
1768
+ let!(:sandwich) do
1769
+ Sandwich.create!
1770
+ end
1771
+
1772
+ it "returns false" do
1773
+ expect(sandwich.meats.any?).to be false
1774
+ end
1775
+ end
1776
+
1777
+ context "when the document is destroyed" do
1778
+
1779
+ before do
1780
+ Meat.create!
1781
+ end
1782
+
1783
+ let!(:sandwich) do
1784
+ Sandwich.create!
1785
+ end
1786
+
1787
+ it "returns false" do
1788
+ sandwich.destroy
1789
+ expect(sandwich.meats.any?).to be false
1790
+ end
1791
+ end
1792
+ end
1793
+ end
1794
+
1760
1795
  context "when documents have been persisted" do
1761
1796
 
1762
1797
  let!(:preference) do
1763
- person.preferences.create(name: "setting")
1798
+ person.preferences.create!(name: "setting")
1764
1799
  end
1765
1800
 
1766
1801
  it "returns the number of persisted documents" do
@@ -1771,12 +1806,12 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1771
1806
  context "when appending to a loaded relation" do
1772
1807
 
1773
1808
  let!(:preference) do
1774
- person.preferences.create(name: "setting")
1809
+ person.preferences.create!(name: "setting")
1775
1810
  end
1776
1811
 
1777
1812
  before do
1778
1813
  person.preferences.count
1779
- person.preferences << Preference.create(name: "two")
1814
+ person.preferences << Preference.create!(name: "two")
1780
1815
  end
1781
1816
 
1782
1817
  it "returns the number of persisted documents" do
@@ -1800,7 +1835,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1800
1835
  context "when the documents are part of the relation" do
1801
1836
 
1802
1837
  before do
1803
- Preference.create(person_ids: [ person.id ])
1838
+ Preference.create!(person_ids: [ person.id ])
1804
1839
  end
1805
1840
 
1806
1841
  it "returns the count from the db" do
@@ -1811,7 +1846,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1811
1846
  context "when the documents are not part of the relation" do
1812
1847
 
1813
1848
  before do
1814
- Preference.create
1849
+ Preference.create!
1815
1850
  end
1816
1851
 
1817
1852
  it "returns the count from the db" do
@@ -1825,7 +1860,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1825
1860
  context "when documents have been persisted" do
1826
1861
 
1827
1862
  let!(:house) do
1828
- person.houses.create(name: "Wayne Manor")
1863
+ person.houses.create!(name: "Wayne Manor")
1829
1864
  end
1830
1865
 
1831
1866
  it "returns the number of persisted documents" do
@@ -1846,6 +1881,107 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1846
1881
  end
1847
1882
  end
1848
1883
 
1884
+ describe "#any?" do
1885
+
1886
+ let(:sandwich) do
1887
+ Sandwich.create!
1888
+ end
1889
+
1890
+ context "when nothing exists on the relation" do
1891
+
1892
+ context "when no document is added" do
1893
+
1894
+ let!(:sandwich) do
1895
+ Sandwich.create!
1896
+ end
1897
+
1898
+ it "returns false" do
1899
+ expect(sandwich.meats.any?).to be false
1900
+ end
1901
+ end
1902
+
1903
+ context "when the document is destroyed" do
1904
+
1905
+ before do
1906
+ Meat.create!
1907
+ end
1908
+
1909
+ let!(:sandwich) do
1910
+ Sandwich.create!
1911
+ end
1912
+
1913
+ it "returns false" do
1914
+ sandwich.destroy
1915
+ expect(sandwich.meats.any?).to be false
1916
+ end
1917
+ end
1918
+ end
1919
+
1920
+ context "when appending to a relation and _loaded/_unloaded are empty" do
1921
+
1922
+ let!(:sandwich) do
1923
+ Sandwich.create!
1924
+ end
1925
+
1926
+ before do
1927
+ sandwich.meats << Meat.new
1928
+ end
1929
+
1930
+ it "returns true" do
1931
+ expect(sandwich.meats.any?).to be true
1932
+ end
1933
+ end
1934
+
1935
+ context "when appending to a relation in a transaction" do
1936
+ require_transaction_support
1937
+
1938
+ let!(:sandwich) do
1939
+ Sandwich.create!
1940
+ end
1941
+
1942
+ it "returns true" do
1943
+ sandwich.with_session do |session|
1944
+ session.with_transaction do
1945
+ expect{ sandwich.meats << Meat.new }.to_not raise_error
1946
+ expect(sandwich.meats.any?).to be true
1947
+ end
1948
+ end
1949
+ end
1950
+ end
1951
+
1952
+ context "when documents have been persisted" do
1953
+
1954
+ let!(:meat) do
1955
+ sandwich.meats.create!
1956
+ end
1957
+
1958
+ it "returns true" do
1959
+ expect(sandwich.meats.any?).to be true
1960
+ end
1961
+ end
1962
+
1963
+ context "when documents have not been persisted" do
1964
+
1965
+ let!(:meat) do
1966
+ sandwich.meats.build
1967
+ end
1968
+
1969
+ it "returns false" do
1970
+ expect(sandwich.meats.any?).to be true
1971
+ end
1972
+ end
1973
+
1974
+ context "when new documents exist in the database" do
1975
+ before do
1976
+ Meat.create!(sandwiches: [sandwich])
1977
+ end
1978
+
1979
+ it "returns true" do
1980
+ expect(sandwich.meats.any?).to be true
1981
+ end
1982
+ end
1983
+ end
1984
+
1849
1985
  [ :create, :create! ].each do |method|
1850
1986
 
1851
1987
  describe "##{method}" do
@@ -1855,15 +1991,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1855
1991
  context "when using string keys" do
1856
1992
 
1857
1993
  let(:agent) do
1858
- Agent.create(number: "007")
1994
+ Agent.create!(number: "007")
1859
1995
  end
1860
1996
 
1861
1997
  before do
1862
- agent.accounts.create(name: "testing again")
1998
+ agent.accounts.send(method, name: "test again")
1863
1999
  end
1864
2000
 
1865
2001
  it "does not convert the string key to an object id" do
1866
- expect(agent.account_ids).to eq([ "testing-again" ])
2002
+ expect(agent.account_ids).to eq([ "test-again" ])
1867
2003
  end
1868
2004
  end
1869
2005
 
@@ -1935,7 +2071,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1935
2071
  context "when validation fails" do
1936
2072
 
1937
2073
  let(:person) do
1938
- Person.create
2074
+ Person.create!
1939
2075
  end
1940
2076
 
1941
2077
  context "when the relation is not polymorphic" do
@@ -1949,290 +2085,236 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
1949
2085
  end
1950
2086
  end
1951
2087
 
1952
- describe "#delete" do
1953
-
1954
- let(:person) do
1955
- Person.create
1956
- end
1957
-
1958
- let(:preference_one) do
1959
- Preference.create(name: "Testing")
1960
- end
1961
-
1962
- let(:preference_two) do
1963
- Preference.create(name: "Test")
1964
- end
1965
-
1966
- before do
1967
- person.preferences << [ preference_one, preference_two ]
1968
- end
1969
-
1970
- context "when the document exists" do
1971
-
1972
- let!(:deleted) do
1973
- person.preferences.delete(preference_one)
1974
- end
1975
-
1976
- it "removes the document from the relation" do
1977
- expect(person.preferences).to eq([ preference_two ])
1978
- end
1979
-
1980
- it "returns the document" do
1981
- expect(deleted).to eq(preference_one)
1982
- end
2088
+ %i[ delete delete_one ].each do |method|
2089
+ describe "\##{method}" do
2090
+ let(:person) { Person.create! }
2091
+ let(:preference_one) { Preference.create!(name: "Testing") }
2092
+ let(:preference_two) { Preference.create!(name: "Test") }
1983
2093
 
1984
- it "removes the document key from the foreign key" do
1985
- expect(person.preference_ids).to eq([ preference_two.id ])
1986
- end
1987
-
1988
- it "removes the inverse reference" do
1989
- expect(deleted.reload.people).to be_empty
1990
- end
1991
-
1992
- it "removes the base id from the inverse keys" do
1993
- expect(deleted.reload.person_ids).to be_empty
2094
+ before do
2095
+ person.preferences << [ preference_one, preference_two ]
1994
2096
  end
1995
2097
 
1996
- context "and person and preferences are reloaded" do
1997
-
1998
- before do
1999
- person.reload
2000
- preference_one.reload
2001
- preference_two.reload
2098
+ context 'when the document exists' do
2099
+ let!(:deleted) do
2100
+ person.preferences.send(method, preference_one)
2002
2101
  end
2003
2102
 
2004
- it "nullifies the deleted preference" do
2103
+ it 'removes the document from the relation' do
2005
2104
  expect(person.preferences).to eq([ preference_two ])
2006
2105
  end
2007
2106
 
2008
- it "retains the ids for one preference" do
2009
- expect(person.preference_ids).to eq([ preference_two.id ])
2107
+ it 'returns the document' do
2108
+ expect(deleted).to eq(preference_one)
2010
2109
  end
2011
- end
2012
- end
2013
-
2014
- context "when the document does not exist" do
2015
-
2016
- let!(:deleted) do
2017
- person.preferences.delete(Preference.new)
2018
- end
2019
-
2020
- it "returns nil" do
2021
- expect(deleted).to be_nil
2022
- end
2023
-
2024
- it "does not modify the relation" do
2025
- expect(person.preferences).to eq([ preference_one, preference_two ])
2026
- end
2027
-
2028
- it "does not modify the keys" do
2029
- expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2030
- end
2031
- end
2032
-
2033
- context "when :dependent => :nullify is set" do
2034
-
2035
- context "when :inverse_of is set" do
2036
2110
 
2037
- let(:event) do
2038
- Event.create
2111
+ it 'removes the document key from the foreign key' do
2112
+ expect(person.preference_ids).to eq([ preference_two.id ])
2039
2113
  end
2040
2114
 
2041
- before do
2042
- person.administrated_events << [ event ]
2115
+ it 'removes the inverse reference' do
2116
+ expect(deleted.reload.people).to be_empty
2043
2117
  end
2044
2118
 
2045
- it "deletes the document" do
2046
- expect(event.delete).to be true
2119
+ it 'removes the base id from the inverse keys' do
2120
+ expect(deleted.reload.person_ids).to be_empty
2047
2121
  end
2048
- end
2049
- end
2050
2122
 
2051
- context "when the relationships are self referencing" do
2052
-
2053
- let(:tag_one) do
2054
- Tag.create(text: "one")
2055
- end
2123
+ context 'and person and preferences are reloaded' do
2124
+ before do
2125
+ person.reload
2126
+ preference_one.reload
2127
+ preference_two.reload
2128
+ end
2056
2129
 
2057
- let(:tag_two) do
2058
- Tag.create(text: "two")
2059
- end
2130
+ it 'nullifies the deleted preference' do
2131
+ expect(person.preferences).to eq([ preference_two ])
2132
+ end
2060
2133
 
2061
- before do
2062
- tag_one.related << tag_two
2134
+ it 'retains the ids for one preference' do
2135
+ expect(person.preference_ids).to eq([ preference_two.id ])
2136
+ end
2137
+ end
2063
2138
  end
2064
2139
 
2065
- context "when deleting without reloading" do
2066
-
2140
+ context 'when the document does not exist' do
2067
2141
  let!(:deleted) do
2068
- tag_one.related.delete(tag_two)
2069
- end
2070
-
2071
- it "deletes the document from the relation" do
2072
- expect(tag_one.related).to be_empty
2142
+ person.preferences.send(method, Preference.new)
2073
2143
  end
2074
2144
 
2075
- it "deletes the foreign key from the relation" do
2076
- expect(tag_one.related_ids).to be_empty
2145
+ it 'returns nil' do
2146
+ expect(deleted).to be_nil
2077
2147
  end
2078
2148
 
2079
- it "removes the reference from the inverse" do
2080
- expect(deleted.related).to be_empty
2149
+ it 'does not modify the relation' do
2150
+ expect(person.preferences).to eq([ preference_one, preference_two ])
2081
2151
  end
2082
2152
 
2083
- it "removes the foreign keys from the inverse" do
2084
- expect(deleted.related_ids).to be_empty
2153
+ it 'does not modify the keys' do
2154
+ expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
2085
2155
  end
2086
2156
  end
2087
2157
 
2088
- context "when deleting with reloading" do
2089
-
2090
- context "when deleting from the front side" do
2158
+ context 'when :dependent => :nullify is set' do
2159
+ context 'when :inverse_of is set' do
2160
+ let(:event) { Event.create! }
2091
2161
 
2092
- let(:reloaded) do
2093
- tag_one.reload
2094
- end
2095
-
2096
- let!(:deleted) do
2097
- reloaded.related.delete(tag_two)
2098
- end
2099
-
2100
- it "deletes the document from the relation" do
2101
- expect(reloaded.related).to be_empty
2162
+ before do
2163
+ person.administrated_events << [ event ]
2102
2164
  end
2103
2165
 
2104
- it "deletes the foreign key from the relation" do
2105
- expect(reloaded.related_ids).to be_empty
2166
+ it 'deletes the document' do
2167
+ expect(event.delete).to be true
2106
2168
  end
2169
+ end
2170
+ end
2107
2171
 
2108
- it "removes the reference from the inverse" do
2109
- expect(deleted.related).to be_empty
2110
- end
2172
+ context 'when the relationships are self referencing' do
2173
+ let(:tag_one) { Tag.create!(text: "one") }
2174
+ let(:tag_two) { Tag.create!(text: "two") }
2111
2175
 
2112
- it "removes the foreign keys from the inverse" do
2113
- expect(deleted.related_ids).to be_empty
2114
- end
2176
+ before do
2177
+ tag_one.related << tag_two
2115
2178
  end
2116
2179
 
2117
- context "when deleting from the inverse side" do
2118
-
2119
- let(:reloaded) do
2120
- tag_two.reload
2121
- end
2180
+ context 'when deleting without reloading' do
2181
+ let!(:deleted) { tag_one.related.send(method, tag_two) }
2122
2182
 
2123
- let!(:deleted) do
2124
- reloaded.related.delete(tag_one)
2183
+ it 'deletes the document from the relation' do
2184
+ expect(tag_one.related).to be_empty
2125
2185
  end
2126
2186
 
2127
- it "deletes the document from the relation" do
2128
- expect(reloaded.related).to be_empty
2187
+ it 'deletes the foreign key from the relation' do
2188
+ expect(tag_one.related_ids).to be_empty
2129
2189
  end
2130
2190
 
2131
- it "deletes the foreign key from the relation" do
2132
- expect(reloaded.related_ids).to be_empty
2191
+ it 'removes the reference from the inverse' do
2192
+ expect(deleted.related).to be_empty
2133
2193
  end
2134
2194
 
2135
- it "removes the foreign keys from the inverse" do
2195
+ it 'removes the foreign keys from the inverse' do
2136
2196
  expect(deleted.related_ids).to be_empty
2137
2197
  end
2138
2198
  end
2139
- end
2140
- end
2141
2199
 
2142
- context "when the association has callbacks" do
2200
+ context 'when deleting with reloading' do
2201
+ context "when deleting from the front side" do
2202
+ let(:reloaded) { tag_one.reload }
2203
+ let!(:deleted) { reloaded.related.send(method, tag_two) }
2143
2204
 
2144
- let(:post) do
2145
- Post.new
2146
- end
2205
+ it 'deletes the document from the relation' do
2206
+ expect(reloaded.related).to be_empty
2207
+ end
2147
2208
 
2148
- let(:tag) do
2149
- Tag.new
2150
- end
2209
+ it 'deletes the foreign key from the relation' do
2210
+ expect(reloaded.related_ids).to be_empty
2211
+ end
2151
2212
 
2152
- before do
2153
- post.tags << tag
2154
- end
2213
+ it 'removes the reference from the inverse' do
2214
+ expect(deleted.related).to be_empty
2215
+ end
2155
2216
 
2156
- context "when the callback is a before_remove" do
2217
+ it 'removes the foreign keys from the inverse' do
2218
+ expect(deleted.related_ids).to be_empty
2219
+ end
2220
+ end
2157
2221
 
2158
- context "when there are no errors" do
2222
+ context 'when deleting from the inverse side' do
2223
+ let(:reloaded) { tag_two.reload }
2224
+ let!(:deleted) { reloaded.related.send(method, tag_one) }
2159
2225
 
2160
- before do
2161
- post.tags.delete tag
2162
- end
2226
+ it 'deletes the document from the relation' do
2227
+ expect(reloaded.related).to be_empty
2228
+ end
2163
2229
 
2164
- it "executes the callback" do
2165
- expect(post.before_remove_called).to be true
2166
- end
2230
+ it 'deletes the foreign key from the relation' do
2231
+ expect(reloaded.related_ids).to be_empty
2232
+ end
2167
2233
 
2168
- it "removes the document from the relation" do
2169
- expect(post.tags).to be_empty
2234
+ it 'removes the foreign keys from the inverse' do
2235
+ expect(deleted.related_ids).to be_empty
2236
+ end
2170
2237
  end
2171
2238
  end
2239
+ end
2172
2240
 
2173
- context "when errors are raised" do
2174
-
2175
- before do
2176
- expect(post).to receive(:before_remove_tag).and_raise
2177
- begin; post.tags.delete(tag); rescue; end
2178
- end
2241
+ context 'when the association has callbacks' do
2242
+ let(:post) { Post.new }
2243
+ let(:tag) { Tag.new }
2179
2244
 
2180
- it "does not remove the document from the relation" do
2181
- expect(post.tags).to eq([ tag ])
2182
- end
2245
+ before do
2246
+ post.tags << tag
2183
2247
  end
2184
- end
2185
2248
 
2186
- context "when the callback is an after_remove" do
2249
+ context 'when the callback is a before_remove' do
2250
+ context 'when there are no errors' do
2251
+ before do
2252
+ post.tags.send(method, tag)
2253
+ end
2187
2254
 
2188
- context "when no errors are raised" do
2255
+ it 'executes the callback' do
2256
+ expect(post.before_remove_called).to be true
2257
+ end
2189
2258
 
2190
- before do
2191
- post.tags.delete(tag)
2259
+ it 'removes the document from the relation' do
2260
+ expect(post.tags).to be_empty
2261
+ end
2192
2262
  end
2193
2263
 
2194
- it "executes the callback" do
2195
- expect(post.after_remove_called).to be true
2196
- end
2264
+ context "when errors are raised" do
2265
+ before do
2266
+ expect(post).to receive(:before_remove_tag).and_raise
2267
+ begin; post.tags.send(method, tag); rescue; end
2268
+ end
2197
2269
 
2198
- it "removes the document from the relation" do
2199
- expect(post.tags).to be_empty
2270
+ it 'does not remove the document from the relation' do
2271
+ expect(post.tags).to eq([ tag ])
2272
+ end
2200
2273
  end
2201
2274
  end
2202
2275
 
2203
- context "when errors are raised" do
2276
+ context 'when the callback is an after_remove' do
2277
+ context 'when no errors are raised' do
2278
+ before do
2279
+ post.tags.send(method, tag)
2280
+ end
2204
2281
 
2205
- before do
2206
- expect(post).to receive(:after_remove_tag).and_raise
2207
- begin; post.tags.delete(tag); rescue; end
2282
+ it 'executes the callback' do
2283
+ expect(post.after_remove_called).to be true
2284
+ end
2285
+
2286
+ it 'removes the document from the relation' do
2287
+ expect(post.tags).to be_empty
2288
+ end
2208
2289
  end
2209
2290
 
2210
- it "removes the document from the relation" do
2211
- expect(post.tags).to be_empty
2291
+ context 'when errors are raised' do
2292
+ before do
2293
+ expect(post).to receive(:after_remove_tag).and_raise
2294
+ begin; post.tags.send(method, tag); rescue; end
2295
+ end
2296
+
2297
+ it 'removes the document from the relation' do
2298
+ expect(post.tags).to be_empty
2299
+ end
2212
2300
  end
2213
2301
  end
2214
2302
  end
2215
2303
  end
2216
2304
  end
2217
2305
 
2218
- [ :delete_all, :destroy_all ].each do |method|
2219
-
2220
- describe "##{method}" do
2221
-
2222
- context "when the relation is not polymorphic" do
2223
-
2224
- context "when conditions are provided" do
2225
-
2226
- let(:person) do
2227
- Person.create
2228
- end
2306
+ %i[ delete_all destroy_all ].each do |method|
2307
+ describe "\##{method}" do
2308
+ context 'when the relation is not polymorphic' do
2309
+ context 'when conditions are provided' do
2310
+ let(:person) { Person.create! }
2229
2311
 
2230
2312
  let!(:preference_one) do
2231
- person.preferences.create(name: "Testing")
2313
+ person.preferences.create!(name: "Testing")
2232
2314
  end
2233
2315
 
2234
2316
  let!(:preference_two) do
2235
- person.preferences.create(name: "Test")
2317
+ person.preferences.create!(name: "Test")
2236
2318
  end
2237
2319
 
2238
2320
  let!(:deleted) do
@@ -2257,14 +2339,18 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2257
2339
  it "removes the ids from the foreign key" do
2258
2340
  expect(person.preference_ids).to eq([ preference_two.id ])
2259
2341
  end
2342
+
2343
+ it "sets the association locally" do
2344
+ expect(person.preferences).to eq([preference_two])
2345
+ end
2260
2346
  end
2261
2347
 
2262
2348
  context "when conditions are not provided" do
2263
2349
 
2264
2350
  let(:person) do
2265
- Person.create.tap do |person|
2266
- person.preferences.create(name: "Testing")
2267
- person.preferences.create(name: "Test")
2351
+ Person.create!.tap do |person|
2352
+ person.preferences.create!(name: "Testing")
2353
+ person.preferences.create!(name: "Test")
2268
2354
  end
2269
2355
  end
2270
2356
 
@@ -2283,6 +2369,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2283
2369
  it "returns the number of documents deleted" do
2284
2370
  expect(deleted).to eq(2)
2285
2371
  end
2372
+
2373
+ it "sets the association locally" do
2374
+ expect(person.preferences).to eq([])
2375
+ end
2286
2376
  end
2287
2377
  end
2288
2378
  end
@@ -2298,13 +2388,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2298
2388
  describe "#exists?" do
2299
2389
 
2300
2390
  let!(:person) do
2301
- Person.create
2391
+ Person.create!
2302
2392
  end
2303
2393
 
2304
2394
  context "when documents exist in the database" do
2305
2395
 
2306
2396
  before do
2307
- person.preferences.create
2397
+ person.preferences.create!
2308
2398
  end
2309
2399
 
2310
2400
  it "returns true" do
@@ -2329,23 +2419,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2329
2419
  context "when the relation is not polymorphic" do
2330
2420
 
2331
2421
  let(:person) do
2332
- Person.create
2422
+ Person.create!
2333
2423
  end
2334
2424
 
2335
2425
  let!(:preference_one) do
2336
- person.preferences.create(name: "Test")
2426
+ person.preferences.create!(name: "Test")
2337
2427
  end
2338
2428
 
2339
2429
  let!(:preference_two) do
2340
- person.preferences.create(name: "OMG I has relations")
2430
+ person.preferences.create!(name: "OMG I has relations")
2341
2431
  end
2342
2432
 
2343
2433
  let!(:unrelated_pref) do
2344
- Preference.create(name: "orphan annie")
2434
+ Preference.create!(name: "orphan annie")
2345
2435
  end
2346
2436
 
2347
2437
  let!(:unrelated_pref_two) do
2348
- Preference.create(name: "orphan two")
2438
+ Preference.create!(name: "orphan two")
2349
2439
  end
2350
2440
 
2351
2441
  context "when providing an id" do
@@ -2370,39 +2460,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2370
2460
  it "raises an error" do
2371
2461
  expect {
2372
2462
  preference
2373
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2463
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2374
2464
  end
2375
2465
  end
2376
2466
 
2377
2467
  context "when the id does not match" do
2378
2468
 
2379
2469
  context "when config set to raise error" do
2380
-
2381
- before do
2382
- Mongoid.raise_not_found_error = true
2383
- end
2470
+ config_override :raise_not_found_error, true
2384
2471
 
2385
2472
  it "raises an error" do
2386
2473
  expect {
2387
2474
  person.preferences.find(BSON::ObjectId.new)
2388
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2475
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2389
2476
  end
2390
2477
  end
2391
2478
 
2392
2479
  context "when config set not to raise error" do
2480
+ config_override :raise_not_found_error, false
2393
2481
 
2394
2482
  let(:preference) do
2395
2483
  person.preferences.find(BSON::ObjectId.new)
2396
2484
  end
2397
2485
 
2398
- before do
2399
- Mongoid.raise_not_found_error = false
2400
- end
2401
-
2402
- after do
2403
- Mongoid.raise_not_found_error = true
2404
- end
2405
-
2406
2486
  it "returns nil" do
2407
2487
  expect(preference).to be_nil
2408
2488
  end
@@ -2423,7 +2503,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2423
2503
  end
2424
2504
  end
2425
2505
 
2426
- context "when the ids matche unreferenced documents" do
2506
+ context "when the ids match unreferenced documents" do
2427
2507
 
2428
2508
  let(:preferences) do
2429
2509
  person.preferences.find(
@@ -2434,39 +2514,29 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2434
2514
  it "raises an error" do
2435
2515
  expect {
2436
2516
  preferences
2437
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2517
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2438
2518
  end
2439
2519
  end
2440
2520
 
2441
2521
  context "when the ids do not match" do
2442
2522
 
2443
2523
  context "when config set to raise error" do
2444
-
2445
- before do
2446
- Mongoid.raise_not_found_error = true
2447
- end
2524
+ config_override :raise_not_found_error, true
2448
2525
 
2449
2526
  it "raises an error" do
2450
2527
  expect {
2451
2528
  person.preferences.find([ BSON::ObjectId.new ])
2452
- }.to raise_error(Mongoid::Errors::DocumentNotFound)
2529
+ }.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Preference with id\(s\)/)
2453
2530
  end
2454
2531
  end
2455
2532
 
2456
2533
  context "when config set not to raise error" do
2534
+ config_override :raise_not_found_error, false
2457
2535
 
2458
2536
  let(:preferences) do
2459
2537
  person.preferences.find([ BSON::ObjectId.new ])
2460
2538
  end
2461
2539
 
2462
- before do
2463
- Mongoid.raise_not_found_error = false
2464
- end
2465
-
2466
- after do
2467
- Mongoid.raise_not_found_error = true
2468
- end
2469
-
2470
2540
  it "returns an empty array" do
2471
2541
  expect(preferences).to be_empty
2472
2542
  end
@@ -2481,11 +2551,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2481
2551
  context "when the relation is not polymorphic" do
2482
2552
 
2483
2553
  let(:person) do
2484
- Person.create
2554
+ Person.create!
2485
2555
  end
2486
2556
 
2487
2557
  let!(:preference) do
2488
- person.preferences.create(name: "Testing")
2558
+ person.preferences.create!(name: "Testing")
2489
2559
  end
2490
2560
 
2491
2561
  context "when the document exists" do
@@ -2521,11 +2591,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2521
2591
  context "when the relation is not polymorphic" do
2522
2592
 
2523
2593
  let(:person) do
2524
- Person.create
2594
+ Person.create!
2525
2595
  end
2526
2596
 
2527
2597
  let!(:preference) do
2528
- person.preferences.create(name: "Testing")
2598
+ person.preferences.create!(name: "Testing")
2529
2599
  end
2530
2600
 
2531
2601
  context "when the document exists" do
@@ -2570,11 +2640,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2570
2640
  context "when the relation is not polymorphic" do
2571
2641
 
2572
2642
  let(:person) do
2573
- Person.create
2643
+ Person.create!
2574
2644
  end
2575
2645
 
2576
2646
  let!(:preference) do
2577
- person.preferences.create(name: "Testing")
2647
+ person.preferences.create!(name: "Testing")
2578
2648
  end
2579
2649
 
2580
2650
  context "when the document exists" do
@@ -2608,15 +2678,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2608
2678
  describe "#max" do
2609
2679
 
2610
2680
  let(:person) do
2611
- Person.create
2681
+ Person.create!
2612
2682
  end
2613
2683
 
2614
2684
  let(:preference_one) do
2615
- Preference.create(ranking: 5)
2685
+ Preference.create!(ranking: 5)
2616
2686
  end
2617
2687
 
2618
2688
  let(:preference_two) do
2619
- Preference.create(ranking: 10)
2689
+ Preference.create!(ranking: 10)
2620
2690
  end
2621
2691
 
2622
2692
  before do
@@ -2637,15 +2707,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2637
2707
  describe "#max_by" do
2638
2708
 
2639
2709
  let(:person) do
2640
- Person.create
2710
+ Person.create!
2641
2711
  end
2642
2712
 
2643
2713
  let(:preference_one) do
2644
- Preference.create(ranking: 5)
2714
+ Preference.create!(ranking: 5)
2645
2715
  end
2646
2716
 
2647
2717
  let(:preference_two) do
2648
- Preference.create(ranking: 10)
2718
+ Preference.create!(ranking: 10)
2649
2719
  end
2650
2720
 
2651
2721
  before do
@@ -2664,19 +2734,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2664
2734
  describe "#method_missing" do
2665
2735
 
2666
2736
  let!(:person) do
2667
- Person.create
2737
+ Person.create!
2668
2738
  end
2669
2739
 
2670
2740
  let!(:preference_one) do
2671
- person.preferences.create(name: "First", value: "Posting")
2741
+ person.preferences.create!(name: "First", value: "Posting")
2672
2742
  end
2673
2743
 
2674
2744
  let!(:preference_two) do
2675
- person.preferences.create(name: "Second", value: "Testing")
2745
+ person.preferences.create!(name: "Second", value: "Testing")
2676
2746
  end
2677
2747
 
2678
2748
  let!(:unrelated) do
2679
- Preference.create(name: "Third")
2749
+ Preference.create!(name: "Third")
2680
2750
  end
2681
2751
 
2682
2752
  context "when providing a single criteria" do
@@ -2689,7 +2759,8 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2689
2759
  expect(preferences).to eq([ preference_one ])
2690
2760
  end
2691
2761
 
2692
- context 'when providing a collation', if: collation_supported? do
2762
+ context 'when providing a collation' do
2763
+ min_server_version '3.4'
2693
2764
 
2694
2765
  let(:preferences) do
2695
2766
  person.preferences.where(name: "FIRST").collation(locale: 'en_US', strength: 2).to_a
@@ -2750,7 +2821,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2750
2821
  context "when the inverse relation is not defined" do
2751
2822
 
2752
2823
  let!(:house) do
2753
- person.houses.create(name: "Wayne Manor")
2824
+ person.houses.create!(name: "Wayne Manor")
2754
2825
  end
2755
2826
 
2756
2827
  it "returns the distinct values for the fields" do
@@ -2764,15 +2835,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2764
2835
  describe "#min" do
2765
2836
 
2766
2837
  let(:person) do
2767
- Person.create
2838
+ Person.create!
2768
2839
  end
2769
2840
 
2770
2841
  let(:preference_one) do
2771
- Preference.create(ranking: 5)
2842
+ Preference.create!(ranking: 5)
2772
2843
  end
2773
2844
 
2774
2845
  let(:preference_two) do
2775
- Preference.create(ranking: 10)
2846
+ Preference.create!(ranking: 10)
2776
2847
  end
2777
2848
 
2778
2849
  before do
@@ -2793,15 +2864,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2793
2864
  describe "#min_by" do
2794
2865
 
2795
2866
  let(:person) do
2796
- Person.create
2867
+ Person.create!
2797
2868
  end
2798
2869
 
2799
2870
  let(:preference_one) do
2800
- Preference.create(ranking: 5)
2871
+ Preference.create!(ranking: 5)
2801
2872
  end
2802
2873
 
2803
2874
  let(:preference_two) do
2804
- Preference.create(ranking: 10)
2875
+ Preference.create!(ranking: 10)
2805
2876
  end
2806
2877
 
2807
2878
  before do
@@ -2827,15 +2898,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2827
2898
  describe "#nullify_all" do
2828
2899
 
2829
2900
  let(:person) do
2830
- Person.create
2901
+ Person.create!
2831
2902
  end
2832
2903
 
2833
2904
  let!(:preference_one) do
2834
- person.preferences.create(name: "One")
2905
+ person.preferences.create!(name: "One")
2835
2906
  end
2836
2907
 
2837
2908
  let!(:preference_two) do
2838
- person.preferences.create(name: "Two")
2909
+ person.preferences.create!(name: "Two")
2839
2910
  end
2840
2911
 
2841
2912
  before do
@@ -2956,13 +3027,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2956
3027
  describe "##{method}" do
2957
3028
 
2958
3029
  let(:person) do
2959
- Person.create
3030
+ Person.create!
2960
3031
  end
2961
3032
 
2962
3033
  context "when documents have been persisted" do
2963
3034
 
2964
3035
  let!(:preference) do
2965
- person.preferences.create(name: "Testing")
3036
+ person.preferences.create!(name: "Testing")
2966
3037
  end
2967
3038
 
2968
3039
  it "returns the number of documents" do
@@ -2974,7 +3045,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2974
3045
 
2975
3046
  before do
2976
3047
  person.preferences.build(name: "Test")
2977
- person.preferences.create(name: "Test 2")
3048
+ person.preferences.create!(name: "Test 2")
2978
3049
  end
2979
3050
 
2980
3051
  it "returns the total number of documents" do
@@ -2989,15 +3060,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
2989
3060
  context "when the relation has no default scope" do
2990
3061
 
2991
3062
  let!(:person) do
2992
- Person.create
3063
+ Person.create!
2993
3064
  end
2994
3065
 
2995
3066
  let!(:preference_one) do
2996
- person.preferences.create(name: "first")
3067
+ person.preferences.create!(name: "first")
2997
3068
  end
2998
3069
 
2999
3070
  let!(:preference_two) do
3000
- Preference.create(name: "second")
3071
+ Preference.create!(name: "second")
3001
3072
  end
3002
3073
 
3003
3074
  let(:unscoped) do
@@ -3012,15 +3083,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3012
3083
  context "when the relation has a default scope" do
3013
3084
 
3014
3085
  let!(:person) do
3015
- Person.create
3086
+ Person.create!
3016
3087
  end
3017
3088
 
3018
3089
  let!(:house_one) do
3019
- person.houses.create(name: "first")
3090
+ person.houses.create!(name: "first")
3020
3091
  end
3021
3092
 
3022
3093
  let!(:house_two) do
3023
- House.create(name: "second")
3094
+ House.create!(name: "second")
3024
3095
  end
3025
3096
 
3026
3097
  let(:unscoped) do
@@ -3056,10 +3127,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3056
3127
  end
3057
3128
 
3058
3129
  before do
3059
- person.update_attributes(
3130
+ person.update_attributes!(
3060
3131
  houses: [ wife_house, exwife_house, girlfriend_house ]
3061
3132
  )
3062
- person.update_attributes(house_ids: [ girlfriend_house.id ])
3133
+ person.update_attributes!(house_ids: [ girlfriend_house.id ])
3063
3134
  end
3064
3135
 
3065
3136
  context "when reloading" do
@@ -3106,7 +3177,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3106
3177
  end
3107
3178
 
3108
3179
  let!(:business) do
3109
- Business.create(name: "serious", owners: [ user ])
3180
+ Business.create!(name: "serious", owners: [ user ])
3110
3181
  end
3111
3182
 
3112
3183
  before do
@@ -3149,11 +3220,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3149
3220
  context "when the documents are persisted" do
3150
3221
 
3151
3222
  let(:user) do
3152
- User.create(name: "tst")
3223
+ User.create!(name: "tst")
3153
3224
  end
3154
3225
 
3155
3226
  let(:business) do
3156
- Business.create(name: "srs", owners: [ user ])
3227
+ Business.create!(name: "srs", owners: [ user ])
3157
3228
  end
3158
3229
 
3159
3230
  before do
@@ -3197,11 +3268,11 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3197
3268
  context "when binding the relation multiple times" do
3198
3269
 
3199
3270
  let(:person) do
3200
- Person.create
3271
+ Person.create!
3201
3272
  end
3202
3273
 
3203
3274
  let(:preference) do
3204
- person.preferences.create(name: "testing")
3275
+ person.preferences.create!(name: "testing")
3205
3276
  end
3206
3277
 
3207
3278
  before do
@@ -3220,19 +3291,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3220
3291
  context "when the association has order criteria" do
3221
3292
 
3222
3293
  let(:person) do
3223
- Person.create
3294
+ Person.create!
3224
3295
  end
3225
3296
 
3226
3297
  let(:preference_one) do
3227
- OrderedPreference.create(name: 'preference-1', value: 10)
3298
+ OrderedPreference.create!(name: 'preference-1', value: 10)
3228
3299
  end
3229
3300
 
3230
3301
  let(:preference_two) do
3231
- OrderedPreference.create(name: 'preference-2', value: 20)
3302
+ OrderedPreference.create!(name: 'preference-2', value: 20)
3232
3303
  end
3233
3304
 
3234
3305
  let(:preference_three) do
3235
- OrderedPreference.create(name: 'preference-3', value: 20)
3306
+ OrderedPreference.create!(name: 'preference-3', value: 20)
3236
3307
  end
3237
3308
 
3238
3309
  before do
@@ -3256,7 +3327,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3256
3327
  context "when the parent is not a new record and freshly loaded" do
3257
3328
 
3258
3329
  let(:person) do
3259
- Person.create
3330
+ Person.create!
3260
3331
  end
3261
3332
 
3262
3333
  let(:preference) do
@@ -3265,7 +3336,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3265
3336
 
3266
3337
  before do
3267
3338
  person.preferences = [ preference ]
3268
- person.save
3339
+ person.save!
3269
3340
  person.reload
3270
3341
  person.preferences = nil
3271
3342
  end
@@ -3288,15 +3359,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3288
3359
  context "when reloading the relation" do
3289
3360
 
3290
3361
  let!(:person) do
3291
- Person.create
3362
+ Person.create!
3292
3363
  end
3293
3364
 
3294
3365
  let!(:preference_one) do
3295
- Preference.create(name: "one")
3366
+ Preference.create!(name: "one")
3296
3367
  end
3297
3368
 
3298
3369
  let!(:preference_two) do
3299
- Preference.create(name: "two")
3370
+ Preference.create!(name: "two")
3300
3371
  end
3301
3372
 
3302
3373
  before do
@@ -3340,7 +3411,7 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3340
3411
  context "when the document is new" do
3341
3412
 
3342
3413
  let!(:person) do
3343
- Person.create(preference_names: "one, two")
3414
+ Person.create!(preference_names: "one, two")
3344
3415
  end
3345
3416
 
3346
3417
  let(:preference_one) do
@@ -3376,23 +3447,23 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3376
3447
  end
3377
3448
 
3378
3449
  let(:preference_one) do
3379
- Preference.create(name: "one")
3450
+ Preference.create!(name: "one")
3380
3451
  end
3381
3452
 
3382
3453
  let(:preference_two) do
3383
- Preference.create(name: "two")
3454
+ Preference.create!(name: "two")
3384
3455
  end
3385
3456
 
3386
3457
  before do
3387
3458
  person.preference_ids = [ preference_one.id, preference_two.id ]
3388
- person.save
3459
+ person.save!
3389
3460
  end
3390
3461
 
3391
3462
  context "and the order is changed" do
3392
3463
 
3393
3464
  before do
3394
3465
  person.preference_ids = [ preference_two.id, preference_one.id ]
3395
- person.save
3466
+ person.save!
3396
3467
  end
3397
3468
 
3398
3469
  let(:reloaded) do
@@ -3409,13 +3480,13 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3409
3480
  context "and the order is changed and an element is added" do
3410
3481
 
3411
3482
  let(:preference_three) do
3412
- Preference.create(name: "three")
3483
+ Preference.create!(name: "three")
3413
3484
  end
3414
3485
 
3415
3486
  before do
3416
3487
  person.preference_ids =
3417
3488
  [ preference_two.id, preference_one.id, preference_three.id ]
3418
- person.save
3489
+ person.save!
3419
3490
  end
3420
3491
 
3421
3492
  let(:reloaded) do
@@ -3432,16 +3503,16 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3432
3503
  context "and the order is changed and an element is removed" do
3433
3504
 
3434
3505
  let(:preference_three) do
3435
- Preference.create(name: "three")
3506
+ Preference.create!(name: "three")
3436
3507
  end
3437
3508
 
3438
3509
  before do
3439
3510
  person.preference_ids =
3440
3511
  [ preference_one.id, preference_two.id, preference_three.id ]
3441
- person.save
3512
+ person.save!
3442
3513
  person.preference_ids =
3443
3514
  [ preference_three.id, preference_two.id ]
3444
- person.save
3515
+ person.save!
3445
3516
  end
3446
3517
 
3447
3518
  let(:reloaded) do
@@ -3491,15 +3562,15 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3491
3562
  context "when the relation exists" do
3492
3563
 
3493
3564
  let!(:person) do
3494
- Person.create
3565
+ Person.create!
3495
3566
  end
3496
3567
 
3497
3568
  let!(:pref_one) do
3498
- person.preferences.create
3569
+ person.preferences.create!
3499
3570
  end
3500
3571
 
3501
3572
  let!(:pref_two) do
3502
- Preference.create
3573
+ Preference.create!
3503
3574
  end
3504
3575
 
3505
3576
  before do
@@ -3515,15 +3586,19 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3515
3586
  context "when using a different primary key" do
3516
3587
 
3517
3588
  let(:dog) do
3518
- Dog.create(name: 'Doggie')
3589
+ Dog.create!(name: 'Doggie')
3519
3590
  end
3520
3591
 
3521
3592
  let(:cat) do
3522
- Cat.create(name: 'Kitty')
3593
+ Cat.create!(name: 'Kitty')
3594
+ end
3595
+
3596
+ let(:another_cat) do
3597
+ Cat.create!(name: 'Kitten')
3523
3598
  end
3524
3599
 
3525
3600
  let(:fire_hydrant) do
3526
- FireHydrant.create(location: '221B Baker Street')
3601
+ FireHydrant.create!(location: '221B Baker Street')
3527
3602
  end
3528
3603
 
3529
3604
  context "when adding to a one-way many to many" do
@@ -3537,6 +3612,28 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3537
3612
  end
3538
3613
  end
3539
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
+
3540
3637
  context "when adding to a two-way many to many" do
3541
3638
 
3542
3639
  before do
@@ -3593,10 +3690,10 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3593
3690
  end
3594
3691
 
3595
3692
  it "should assign relation from both sides" do
3596
- p1 = Project.create name: 'Foo'
3597
- p2 = Project.create name: 'Bar'
3598
- d1 = Distributor.create name: 'Rock'
3599
- 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'
3600
3697
 
3601
3698
  p1.distributors << d1
3602
3699
  expect(p1.d_ids).to match_array([d1.id])
@@ -3606,4 +3703,58 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
3606
3703
  expect(p2.d_ids).to match_array([d2.id])
3607
3704
  end
3608
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
+ config_override :legacy_attributes, false
3743
+
3744
+ before do
3745
+ HabtmmContract.create!
3746
+ HabtmmSignature.create!
3747
+ end
3748
+
3749
+ let!(:contract) { HabtmmContract.first }
3750
+ let!(:signature) { HabtmmSignature.first }
3751
+
3752
+ before do
3753
+ contract.signature_ids.concat([signature.id])
3754
+ end
3755
+
3756
+ it "works on the first attempt" do
3757
+ expect(contract.signature_ids).to eq([signature.id])
3758
+ end
3759
+ end
3609
3760
  end