mongoid 7.0.2 → 8.1.1

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