mongoid 7.2.1 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1082) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +20 -20
  4. data/LICENSE +1 -1
  5. data/README.md +7 -12
  6. data/Rakefile +58 -1
  7. data/lib/config/locales/en.yml +191 -60
  8. data/lib/mongoid/association/accessors.rb +67 -53
  9. data/lib/mongoid/association/bindable.rb +77 -31
  10. data/lib/mongoid/association/builders.rb +8 -14
  11. data/lib/mongoid/association/constrainable.rb +2 -5
  12. data/lib/mongoid/association/depending.rb +20 -12
  13. data/lib/mongoid/association/eager.rb +160 -0
  14. data/lib/mongoid/association/eager_loadable.rb +41 -11
  15. data/lib/mongoid/association/embedded/batchable.rb +63 -52
  16. data/lib/mongoid/association/embedded/cyclic.rb +4 -12
  17. data/lib/mongoid/association/embedded/eager.rb +23 -0
  18. data/lib/mongoid/association/embedded/embedded_in/binding.rb +29 -13
  19. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +3 -5
  20. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +25 -23
  21. data/lib/mongoid/association/embedded/embedded_in.rb +11 -26
  22. data/lib/mongoid/association/embedded/embeds_many/binding.rb +4 -9
  23. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +5 -6
  24. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +226 -203
  25. data/lib/mongoid/association/embedded/embeds_many.rb +3 -33
  26. data/lib/mongoid/association/embedded/embeds_one/binding.rb +3 -9
  27. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +20 -8
  28. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +131 -42
  29. data/lib/mongoid/association/embedded/embeds_one.rb +4 -30
  30. data/lib/mongoid/association/embedded.rb +2 -1
  31. data/lib/mongoid/association/macros.rb +47 -16
  32. data/lib/mongoid/association/many.rb +12 -24
  33. data/lib/mongoid/association/marshalable.rb +4 -5
  34. data/lib/mongoid/association/nested/many.rb +14 -19
  35. data/lib/mongoid/association/nested/nested_buildable.rb +36 -13
  36. data/lib/mongoid/association/nested/one.rb +54 -26
  37. data/lib/mongoid/association/nested.rb +1 -3
  38. data/lib/mongoid/association/one.rb +3 -11
  39. data/lib/mongoid/association/options.rb +18 -44
  40. data/lib/mongoid/association/proxy.rb +49 -42
  41. data/lib/mongoid/association/referenced/auto_save.rb +11 -15
  42. data/lib/mongoid/association/referenced/belongs_to/binding.rb +2 -7
  43. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -6
  44. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -2
  45. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +23 -32
  46. data/lib/mongoid/association/referenced/belongs_to.rb +13 -37
  47. data/lib/mongoid/association/referenced/counter_cache.rb +18 -26
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +15 -8
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +1 -3
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -2
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +191 -123
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +23 -42
  53. data/lib/mongoid/association/referenced/has_many/binding.rb +1 -5
  54. data/lib/mongoid/association/referenced/has_many/buildable.rb +1 -3
  55. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -2
  56. data/lib/mongoid/association/referenced/has_many/enumerable.rb +471 -496
  57. data/lib/mongoid/association/referenced/has_many/proxy.rb +182 -179
  58. data/lib/mongoid/association/referenced/has_many.rb +17 -43
  59. data/lib/mongoid/association/referenced/has_one/binding.rb +1 -7
  60. data/lib/mongoid/association/referenced/has_one/buildable.rb +5 -5
  61. data/lib/mongoid/association/referenced/has_one/eager.rb +3 -4
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +38 -41
  63. data/lib/mongoid/association/referenced/has_one.rb +17 -36
  64. data/lib/mongoid/association/referenced/syncable.rb +11 -27
  65. data/lib/mongoid/association/referenced.rb +1 -1
  66. data/lib/mongoid/association/reflections.rb +9 -9
  67. data/lib/mongoid/association/relatable.rb +55 -74
  68. data/lib/mongoid/association.rb +10 -22
  69. data/lib/mongoid/atomic/modifiers.rb +7 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +20 -5
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +1 -5
  72. data/lib/mongoid/atomic/paths/embedded.rb +1 -3
  73. data/lib/mongoid/atomic/paths/root.rb +1 -5
  74. data/lib/mongoid/atomic/paths.rb +1 -1
  75. data/lib/mongoid/atomic.rb +39 -86
  76. data/lib/mongoid/atomic_update_preparer.rb +88 -0
  77. data/lib/mongoid/attributes/dynamic.rb +5 -21
  78. data/lib/mongoid/attributes/embedded.rb +34 -0
  79. data/lib/mongoid/attributes/nested.rb +9 -13
  80. data/lib/mongoid/attributes/processing.rb +43 -28
  81. data/lib/mongoid/attributes/projector.rb +120 -0
  82. data/lib/mongoid/attributes/readonly.rb +4 -8
  83. data/lib/mongoid/attributes.rb +85 -89
  84. data/lib/mongoid/cacheable.rb +5 -9
  85. data/lib/mongoid/changeable.rb +183 -97
  86. data/lib/mongoid/clients/factory.rb +58 -15
  87. data/lib/mongoid/clients/options.rb +117 -8
  88. data/lib/mongoid/clients/sessions.rb +246 -84
  89. data/lib/mongoid/clients/storage_options.rb +37 -11
  90. data/lib/mongoid/clients/validators/storage.rb +4 -24
  91. data/lib/mongoid/clients/validators.rb +1 -1
  92. data/lib/mongoid/clients.rb +37 -14
  93. data/lib/mongoid/collection_configurable.rb +59 -0
  94. data/lib/mongoid/composable.rb +7 -7
  95. data/lib/mongoid/config/defaults.rb +40 -0
  96. data/lib/mongoid/config/encryption.rb +213 -0
  97. data/lib/mongoid/config/environment.rb +25 -5
  98. data/lib/mongoid/config/introspection.rb +152 -0
  99. data/lib/mongoid/config/options.rb +11 -14
  100. data/lib/mongoid/config/validators/async_query_executor.rb +34 -0
  101. data/lib/mongoid/config/validators/client.rb +7 -23
  102. data/lib/mongoid/config/validators/option.rb +1 -3
  103. data/lib/mongoid/config/validators.rb +2 -1
  104. data/lib/mongoid/config.rb +183 -46
  105. data/lib/mongoid/contextual/aggregable/memory.rb +38 -26
  106. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -32
  107. data/lib/mongoid/contextual/aggregable/none.rb +66 -0
  108. data/lib/mongoid/contextual/aggregable.rb +18 -0
  109. data/lib/mongoid/contextual/atomic.rb +97 -30
  110. data/lib/mongoid/contextual/command.rb +3 -5
  111. data/lib/mongoid/contextual/map_reduce.rb +8 -33
  112. data/lib/mongoid/contextual/memory.rb +396 -89
  113. data/lib/mongoid/contextual/mongo/documents_loader.rb +178 -0
  114. data/lib/mongoid/contextual/mongo.rb +640 -311
  115. data/lib/mongoid/contextual/none.rb +244 -30
  116. data/lib/mongoid/contextual/queryable.rb +5 -4
  117. data/lib/mongoid/contextual.rb +18 -7
  118. data/lib/mongoid/copyable.rb +34 -14
  119. data/lib/mongoid/criteria/findable.rb +52 -22
  120. data/lib/mongoid/criteria/includable.rb +31 -34
  121. data/lib/mongoid/criteria/inspectable.rb +4 -3
  122. data/lib/mongoid/criteria/marshalable.rb +14 -7
  123. data/lib/mongoid/criteria/modifiable.rb +5 -19
  124. data/lib/mongoid/criteria/options.rb +1 -3
  125. data/lib/mongoid/criteria/permission.rb +6 -2
  126. data/lib/mongoid/criteria/queryable/aggregable.rb +3 -15
  127. data/lib/mongoid/criteria/queryable/expandable.rb +1 -25
  128. data/lib/mongoid/criteria/queryable/extensions/array.rb +6 -41
  129. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -9
  130. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +5 -7
  131. data/lib/mongoid/criteria/queryable/extensions/date.rb +10 -11
  132. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +8 -7
  133. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -41
  134. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +2 -14
  135. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +3 -21
  136. data/lib/mongoid/criteria/queryable/extensions/object.rb +7 -30
  137. data/lib/mongoid/criteria/queryable/extensions/range.rb +48 -17
  138. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +10 -13
  139. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -5
  140. data/lib/mongoid/criteria/queryable/extensions/string.rb +19 -34
  141. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +6 -22
  142. data/lib/mongoid/criteria/queryable/extensions/time.rb +8 -9
  143. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +9 -9
  144. data/lib/mongoid/criteria/queryable/extensions.rb +1 -5
  145. data/lib/mongoid/criteria/queryable/key.rb +15 -18
  146. data/lib/mongoid/criteria/queryable/macroable.rb +1 -3
  147. data/lib/mongoid/criteria/queryable/mergeable.rb +69 -50
  148. data/lib/mongoid/criteria/queryable/optional.rb +12 -62
  149. data/lib/mongoid/criteria/queryable/options.rb +3 -21
  150. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -14
  151. data/lib/mongoid/criteria/queryable/selectable.rb +87 -124
  152. data/lib/mongoid/criteria/queryable/selector.rb +96 -25
  153. data/lib/mongoid/criteria/queryable/smash.rb +41 -18
  154. data/lib/mongoid/criteria/queryable/storable.rb +14 -9
  155. data/lib/mongoid/criteria/queryable.rb +12 -13
  156. data/lib/mongoid/criteria/scopable.rb +32 -21
  157. data/lib/mongoid/criteria/translator.rb +46 -0
  158. data/lib/mongoid/criteria.rb +60 -109
  159. data/lib/mongoid/deprecable.rb +38 -0
  160. data/lib/mongoid/deprecation.rb +29 -0
  161. data/lib/mongoid/document.rb +263 -173
  162. data/lib/mongoid/encryptable.rb +53 -0
  163. data/lib/mongoid/equality.rb +22 -25
  164. data/lib/mongoid/errors/ambiguous_relationship.rb +3 -5
  165. data/lib/mongoid/errors/attribute_not_loaded.rb +34 -0
  166. data/lib/mongoid/errors/callback.rb +1 -3
  167. data/lib/mongoid/errors/create_collection_failure.rb +34 -0
  168. data/lib/mongoid/errors/criteria_argument_required.rb +1 -1
  169. data/lib/mongoid/errors/delete_restriction.rb +9 -12
  170. data/lib/mongoid/errors/document_not_destroyed.rb +3 -7
  171. data/lib/mongoid/errors/document_not_found.rb +34 -21
  172. data/lib/mongoid/errors/drop_collection_failure.rb +28 -0
  173. data/lib/mongoid/errors/empty_config_file.rb +26 -0
  174. data/lib/mongoid/errors/immutable_attribute.rb +27 -0
  175. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +1 -3
  176. data/lib/mongoid/errors/invalid_async_query_executor.rb +26 -0
  177. data/lib/mongoid/errors/invalid_auto_encryption_configuration.rb +33 -0
  178. data/lib/mongoid/errors/invalid_collection.rb +1 -1
  179. data/lib/mongoid/errors/invalid_config_file.rb +26 -0
  180. data/lib/mongoid/errors/invalid_config_option.rb +2 -4
  181. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -4
  182. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +1 -1
  183. data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +24 -0
  184. data/lib/mongoid/errors/invalid_elem_match_operator.rb +1 -1
  185. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +6 -5
  186. data/lib/mongoid/errors/invalid_estimated_count_scoping.rb +27 -0
  187. data/lib/mongoid/errors/invalid_expression_operator.rb +1 -1
  188. data/lib/mongoid/errors/invalid_field.rb +7 -7
  189. data/lib/mongoid/errors/invalid_field_operator.rb +1 -1
  190. data/lib/mongoid/errors/invalid_field_option.rb +1 -3
  191. data/lib/mongoid/errors/invalid_field_type.rb +27 -0
  192. data/lib/mongoid/errors/invalid_find.rb +1 -3
  193. data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +23 -0
  194. data/lib/mongoid/errors/invalid_includes.rb +1 -3
  195. data/lib/mongoid/errors/invalid_index.rb +1 -3
  196. data/lib/mongoid/errors/invalid_options.rb +1 -3
  197. data/lib/mongoid/errors/invalid_path.rb +1 -3
  198. data/lib/mongoid/errors/invalid_persistence_option.rb +1 -5
  199. data/lib/mongoid/errors/invalid_query.rb +1 -1
  200. data/lib/mongoid/errors/invalid_relation.rb +2 -8
  201. data/lib/mongoid/errors/invalid_relation_option.rb +2 -4
  202. data/lib/mongoid/errors/invalid_scope.rb +1 -3
  203. data/lib/mongoid/errors/invalid_session_nesting.rb +17 -0
  204. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +1 -2
  205. data/lib/mongoid/errors/invalid_storage_options.rb +2 -4
  206. data/lib/mongoid/errors/invalid_time.rb +1 -3
  207. data/lib/mongoid/errors/invalid_transaction_nesting.rb +17 -0
  208. data/lib/mongoid/errors/inverse_not_found.rb +1 -3
  209. data/lib/mongoid/errors/mixed_client_configuration.rb +1 -3
  210. data/lib/mongoid/errors/mixed_relations.rb +1 -3
  211. data/lib/mongoid/errors/mongoid_error.rb +8 -16
  212. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +2 -4
  213. data/lib/mongoid/errors/no_client_config.rb +1 -3
  214. data/lib/mongoid/errors/no_client_database.rb +2 -4
  215. data/lib/mongoid/errors/no_client_hosts.rb +2 -4
  216. data/lib/mongoid/errors/no_clients_config.rb +1 -3
  217. data/lib/mongoid/errors/no_default_client.rb +1 -3
  218. data/lib/mongoid/errors/no_environment.rb +1 -3
  219. data/lib/mongoid/errors/no_map_reduce_output.rb +1 -3
  220. data/lib/mongoid/errors/no_metadata.rb +1 -3
  221. data/lib/mongoid/errors/no_parent.rb +1 -3
  222. data/lib/mongoid/errors/readonly_attribute.rb +2 -4
  223. data/lib/mongoid/errors/readonly_document.rb +2 -6
  224. data/lib/mongoid/errors/rollback.rb +15 -0
  225. data/lib/mongoid/errors/scope_overwrite.rb +1 -1
  226. data/lib/mongoid/errors/sessions_not_supported.rb +17 -0
  227. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -2
  228. data/lib/mongoid/errors/transaction_error.rb +25 -0
  229. data/lib/mongoid/errors/transactions_not_supported.rb +17 -0
  230. data/lib/mongoid/errors/unknown_attribute.rb +2 -4
  231. data/lib/mongoid/errors/unknown_model.rb +1 -3
  232. data/lib/mongoid/errors/unsaved_document.rb +2 -2
  233. data/lib/mongoid/errors/unsupported_javascript.rb +1 -3
  234. data/lib/mongoid/errors/validations.rb +1 -1
  235. data/lib/mongoid/errors.rb +18 -5
  236. data/lib/mongoid/evolvable.rb +2 -4
  237. data/lib/mongoid/extensions/array.rb +20 -58
  238. data/lib/mongoid/extensions/big_decimal.rb +44 -24
  239. data/lib/mongoid/extensions/binary.rb +45 -0
  240. data/lib/mongoid/extensions/boolean.rb +11 -6
  241. data/lib/mongoid/extensions/date.rb +31 -29
  242. data/lib/mongoid/extensions/date_time.rb +5 -16
  243. data/lib/mongoid/extensions/decimal128.rb +3 -5
  244. data/lib/mongoid/extensions/false_class.rb +8 -10
  245. data/lib/mongoid/extensions/float.rb +11 -12
  246. data/lib/mongoid/extensions/hash.rb +28 -148
  247. data/lib/mongoid/extensions/integer.rb +13 -14
  248. data/lib/mongoid/extensions/module.rb +5 -5
  249. data/lib/mongoid/extensions/nil_class.rb +5 -7
  250. data/lib/mongoid/extensions/object.rb +32 -81
  251. data/lib/mongoid/extensions/object_id.rb +3 -7
  252. data/lib/mongoid/extensions/range.rb +47 -24
  253. data/lib/mongoid/extensions/raw_value.rb +34 -0
  254. data/lib/mongoid/extensions/regexp.rb +14 -7
  255. data/lib/mongoid/extensions/set.rb +24 -13
  256. data/lib/mongoid/extensions/string.rb +30 -62
  257. data/lib/mongoid/extensions/symbol.rb +9 -22
  258. data/lib/mongoid/extensions/time.rb +30 -40
  259. data/lib/mongoid/extensions/time_with_zone.rb +18 -11
  260. data/lib/mongoid/extensions/true_class.rb +8 -10
  261. data/lib/mongoid/extensions.rb +3 -20
  262. data/lib/mongoid/factory.rb +178 -37
  263. data/lib/mongoid/fields/encrypted.rb +48 -0
  264. data/lib/mongoid/fields/foreign_key.rb +39 -27
  265. data/lib/mongoid/fields/localized.rb +25 -15
  266. data/lib/mongoid/fields/standard.rb +22 -40
  267. data/lib/mongoid/fields/validators/macro.rb +6 -19
  268. data/lib/mongoid/fields/validators.rb +1 -1
  269. data/lib/mongoid/fields.rb +354 -76
  270. data/lib/mongoid/findable.rb +62 -22
  271. data/lib/mongoid/indexable/specification.rb +55 -34
  272. data/lib/mongoid/indexable/validators/options.rb +7 -9
  273. data/lib/mongoid/indexable.rb +2 -18
  274. data/lib/mongoid/inspectable.rb +34 -11
  275. data/lib/mongoid/interceptable.rb +197 -41
  276. data/lib/mongoid/loadable.rb +83 -0
  277. data/lib/mongoid/loggable.rb +1 -9
  278. data/lib/mongoid/matchable.rb +2 -6
  279. data/lib/mongoid/matcher/all.rb +15 -0
  280. data/lib/mongoid/matcher/and.rb +14 -0
  281. data/lib/mongoid/matcher/bits.rb +60 -0
  282. data/lib/mongoid/matcher/bits_all_clear.rb +41 -0
  283. data/lib/mongoid/matcher/bits_all_set.rb +41 -0
  284. data/lib/mongoid/matcher/bits_any_clear.rb +41 -0
  285. data/lib/mongoid/matcher/bits_any_set.rb +41 -0
  286. data/lib/mongoid/matcher/elem_match.rb +17 -1
  287. data/lib/mongoid/matcher/elem_match_expression.rb +14 -2
  288. data/lib/mongoid/matcher/eq.rb +15 -0
  289. data/lib/mongoid/matcher/eq_impl.rb +54 -2
  290. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +18 -1
  291. data/lib/mongoid/matcher/exists.rb +15 -0
  292. data/lib/mongoid/matcher/expression.rb +22 -14
  293. data/lib/mongoid/matcher/expression_operator.rb +14 -0
  294. data/lib/mongoid/matcher/field_expression.rb +19 -5
  295. data/lib/mongoid/matcher/field_operator.rb +30 -0
  296. data/lib/mongoid/matcher/gt.rb +15 -0
  297. data/lib/mongoid/matcher/gte.rb +15 -0
  298. data/lib/mongoid/matcher/in.rb +15 -0
  299. data/lib/mongoid/matcher/lt.rb +15 -0
  300. data/lib/mongoid/matcher/lte.rb +15 -0
  301. data/lib/mongoid/matcher/mod.rb +33 -0
  302. data/lib/mongoid/matcher/ne.rb +15 -0
  303. data/lib/mongoid/matcher/nin.rb +15 -0
  304. data/lib/mongoid/matcher/nor.rb +14 -0
  305. data/lib/mongoid/matcher/not.rb +16 -0
  306. data/lib/mongoid/matcher/or.rb +14 -0
  307. data/lib/mongoid/matcher/regex.rb +24 -0
  308. data/lib/mongoid/matcher/size.rb +16 -0
  309. data/lib/mongoid/matcher/type.rb +124 -0
  310. data/lib/mongoid/matcher.rb +59 -52
  311. data/lib/mongoid/persistable/creatable.rb +25 -29
  312. data/lib/mongoid/persistable/deletable.rb +10 -23
  313. data/lib/mongoid/persistable/destroyable.rb +37 -11
  314. data/lib/mongoid/persistable/incrementable.rb +2 -6
  315. data/lib/mongoid/persistable/logical.rb +1 -5
  316. data/lib/mongoid/persistable/maxable.rb +37 -0
  317. data/lib/mongoid/persistable/minable.rb +37 -0
  318. data/lib/mongoid/persistable/multipliable.rb +36 -0
  319. data/lib/mongoid/persistable/poppable.rb +1 -5
  320. data/lib/mongoid/persistable/pullable.rb +1 -7
  321. data/lib/mongoid/persistable/pushable.rb +1 -7
  322. data/lib/mongoid/persistable/renamable.rb +1 -5
  323. data/lib/mongoid/persistable/savable.rb +14 -8
  324. data/lib/mongoid/persistable/settable.rb +1 -5
  325. data/lib/mongoid/persistable/unsettable.rb +3 -7
  326. data/lib/mongoid/persistable/updatable.rb +114 -28
  327. data/lib/mongoid/persistable/upsertable.rb +33 -8
  328. data/lib/mongoid/persistable.rb +17 -27
  329. data/lib/mongoid/persistence_context.rb +111 -43
  330. data/lib/mongoid/positional.rb +1 -5
  331. data/lib/mongoid/railtie.rb +23 -15
  332. data/lib/mongoid/railties/bson_object_id_serializer.rb +39 -0
  333. data/lib/mongoid/railties/console_sandbox.rb +42 -0
  334. data/lib/mongoid/railties/controller_runtime.rb +21 -6
  335. data/lib/mongoid/railties/database.rake +19 -2
  336. data/lib/mongoid/reloadable.rb +45 -42
  337. data/lib/mongoid/scopable.rb +25 -53
  338. data/lib/mongoid/search_indexable.rb +167 -0
  339. data/lib/mongoid/selectable.rb +6 -17
  340. data/lib/mongoid/serializable.rb +11 -21
  341. data/lib/mongoid/shardable.rb +50 -16
  342. data/lib/mongoid/stateful.rb +66 -22
  343. data/lib/mongoid/stringified_symbol.rb +19 -7
  344. data/lib/mongoid/tasks/database.rake +25 -0
  345. data/lib/mongoid/tasks/database.rb +84 -8
  346. data/lib/mongoid/tasks/encryption.rake +59 -0
  347. data/lib/mongoid/tasks/encryption.rb +108 -0
  348. data/lib/mongoid/threaded/lifecycle.rb +6 -26
  349. data/lib/mongoid/threaded.rb +131 -92
  350. data/lib/mongoid/timestamps/created/short.rb +1 -1
  351. data/lib/mongoid/timestamps/created.rb +4 -4
  352. data/lib/mongoid/timestamps/short.rb +1 -1
  353. data/lib/mongoid/timestamps/timeless.rb +29 -7
  354. data/lib/mongoid/timestamps/updated/short.rb +1 -1
  355. data/lib/mongoid/timestamps/updated.rb +3 -5
  356. data/lib/mongoid/timestamps.rb +1 -1
  357. data/lib/mongoid/touchable.rb +155 -29
  358. data/lib/mongoid/traversable.rb +180 -125
  359. data/lib/mongoid/utils.rb +52 -0
  360. data/lib/mongoid/validatable/associated.rb +97 -21
  361. data/lib/mongoid/validatable/format.rb +1 -1
  362. data/lib/mongoid/validatable/length.rb +1 -1
  363. data/lib/mongoid/validatable/localizable.rb +2 -4
  364. data/lib/mongoid/validatable/macros.rb +10 -14
  365. data/lib/mongoid/validatable/presence.rb +7 -13
  366. data/lib/mongoid/validatable/queryable.rb +9 -3
  367. data/lib/mongoid/validatable/uniqueness.rb +26 -39
  368. data/lib/mongoid/validatable.rb +20 -29
  369. data/lib/mongoid/version.rb +2 -2
  370. data/lib/mongoid/warnings.rb +37 -0
  371. data/lib/mongoid.rb +56 -22
  372. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -5
  373. data/lib/rails/generators/mongoid/config/templates/mongoid.rb +25 -0
  374. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +44 -64
  375. data/lib/rails/generators/mongoid/model/model_generator.rb +4 -1
  376. data/lib/rails/generators/mongoid_generator.rb +13 -1
  377. data/lib/rails/mongoid.rb +4 -32
  378. data/spec/config/mongoid.yml +16 -1
  379. data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
  380. data/spec/integration/active_job_spec.rb +32 -0
  381. data/spec/integration/app_spec.rb +180 -89
  382. data/spec/integration/associations/belongs_to_spec.rb +19 -1
  383. data/spec/integration/associations/embedded_dirty_spec.rb +58 -0
  384. data/spec/integration/associations/embedded_spec.rb +90 -7
  385. data/spec/integration/associations/embeds_many_spec.rb +197 -1
  386. data/spec/integration/associations/embeds_one_spec.rb +19 -1
  387. data/spec/integration/associations/foreign_key_spec.rb +10 -1
  388. data/spec/integration/associations/foreign_key_spec_models.rb +1 -1
  389. data/spec/integration/associations/has_and_belongs_to_many_spec.rb +62 -0
  390. data/spec/integration/associations/has_many_spec.rb +1 -1
  391. data/spec/integration/associations/has_one_spec.rb +145 -1
  392. data/spec/integration/associations/nested_attributes_assignment_spec.rb +1 -1
  393. data/spec/integration/associations/reverse_population_spec.rb +1 -1
  394. data/spec/integration/associations/reverse_population_spec_models.rb +1 -1
  395. data/spec/integration/associations/scope_option_spec.rb +102 -0
  396. data/spec/integration/atomic/modifiers_spec.rb +1 -1
  397. data/spec/integration/bson_regexp_raw_spec.rb +1 -1
  398. data/spec/integration/callbacks_models.rb +147 -3
  399. data/spec/integration/callbacks_spec.rb +398 -8
  400. data/spec/integration/contextual/empty_spec.rb +142 -0
  401. data/spec/integration/criteria/alias_query_spec.rb +98 -0
  402. data/spec/integration/criteria/date_field_spec.rb +2 -2
  403. data/spec/integration/criteria/default_scope_spec.rb +52 -0
  404. data/spec/integration/criteria/logical_spec.rb +12 -0
  405. data/spec/integration/criteria/range_spec.rb +358 -0
  406. data/spec/integration/criteria/raw_value_spec.rb +525 -0
  407. data/spec/integration/criteria/time_with_zone_spec.rb +126 -15
  408. data/spec/integration/discriminator_key_spec.rb +119 -81
  409. data/spec/integration/discriminator_value_spec.rb +1 -1
  410. data/spec/integration/document_spec.rb +31 -1
  411. data/spec/integration/dots_and_dollars_spec.rb +278 -0
  412. data/spec/integration/encryption_spec.rb +100 -0
  413. data/spec/integration/i18n_fallbacks_spec.rb +10 -52
  414. data/spec/integration/matcher_examples_spec.rb +21 -14
  415. data/spec/integration/matcher_operator_data/bits_all_clear.yml +144 -0
  416. data/spec/integration/matcher_operator_data/bits_all_set.yml +144 -0
  417. data/spec/integration/matcher_operator_data/bits_any_clear.yml +144 -0
  418. data/spec/integration/matcher_operator_data/bits_any_set.yml +144 -0
  419. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  420. data/spec/integration/matcher_operator_data/elem_match.yml +46 -0
  421. data/spec/integration/matcher_operator_data/implicit_traversal.yml +96 -0
  422. data/spec/integration/matcher_operator_data/in.yml +16 -0
  423. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  424. data/spec/integration/matcher_operator_data/size.yml +0 -3
  425. data/spec/integration/matcher_operator_data/type.yml +64 -0
  426. data/spec/integration/matcher_operator_data/type_array.yml +15 -0
  427. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  428. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  429. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  430. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  431. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  432. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  433. data/spec/integration/matcher_operator_data/type_decimal.yml +37 -0
  434. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  435. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  436. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  437. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  438. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  439. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  440. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  441. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  442. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  443. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  444. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  445. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  446. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  447. data/spec/integration/matcher_operator_spec.rb +26 -3
  448. data/spec/integration/matcher_spec.rb +50 -1
  449. data/spec/integration/persistence/range_field_spec.rb +351 -0
  450. data/spec/integration/server_query_spec.rb +1 -1
  451. data/spec/integration/shardable_spec.rb +1 -1
  452. data/spec/integration/stringified_symbol_field_spec.rb +17 -3
  453. data/spec/lite_spec_helper.rb +47 -14
  454. data/spec/mongoid/association/accessors_spec.rb +31 -19
  455. data/spec/mongoid/association/auto_save_spec.rb +73 -34
  456. data/spec/mongoid/association/builders_spec.rb +2 -2
  457. data/spec/mongoid/association/constrainable_spec.rb +1 -1
  458. data/spec/mongoid/association/counter_cache_spec.rb +34 -34
  459. data/spec/mongoid/association/depending_spec.rb +397 -358
  460. data/spec/mongoid/association/eager_spec.rb +56 -6
  461. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -3
  462. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -3
  463. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -2
  464. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +55 -1
  465. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +110 -23
  466. data/spec/mongoid/association/embedded/embedded_in_spec.rb +19 -8
  467. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +1 -1
  468. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +113 -1
  469. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +712 -203
  470. data/spec/mongoid/association/embedded/embeds_many_models.rb +189 -1
  471. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +14 -2
  472. data/spec/mongoid/association/embedded/embeds_many_spec.rb +69 -1
  473. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +1 -1
  474. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +26 -1
  475. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +37 -24
  476. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +1 -1
  477. data/spec/mongoid/association/embedded/embeds_one_models.rb +25 -2
  478. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +2 -2
  479. data/spec/mongoid/association/embedded/embeds_one_spec.rb +29 -1
  480. data/spec/mongoid/association/macros_spec.rb +10 -10
  481. data/spec/mongoid/association/nested/many_spec.rb +1 -1
  482. data/spec/mongoid/association/nested/one_spec.rb +17 -13
  483. data/spec/mongoid/association/options_spec.rb +1 -1
  484. data/spec/mongoid/association/polymorphic_spec.rb +1 -1
  485. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -2
  486. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +110 -17
  487. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +51 -15
  488. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +113 -59
  489. data/spec/mongoid/association/referenced/belongs_to_models.rb +12 -0
  490. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +22 -2
  491. data/spec/mongoid/association/referenced/belongs_to_spec.rb +27 -22
  492. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +2 -2
  493. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +28 -3
  494. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +32 -3
  495. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +1 -1
  496. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +386 -376
  497. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +44 -1
  498. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +2 -2
  499. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +57 -3
  500. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +2 -2
  501. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +131 -1
  502. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +24 -7
  503. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +313 -134
  504. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -1
  505. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +1313 -2109
  506. data/spec/mongoid/association/referenced/has_many_models.rb +39 -2
  507. data/spec/mongoid/association/referenced/has_many_query_spec.rb +2 -2
  508. data/spec/mongoid/association/referenced/has_many_spec.rb +47 -1
  509. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +1 -1
  510. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +54 -10
  511. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -2
  512. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +134 -28
  513. data/spec/mongoid/association/referenced/has_one_models.rb +43 -1
  514. data/spec/mongoid/association/referenced/has_one_query_spec.rb +2 -2
  515. data/spec/mongoid/association/referenced/has_one_spec.rb +22 -1
  516. data/spec/mongoid/association/reflections_spec.rb +1 -1
  517. data/spec/mongoid/association/syncable_spec.rb +47 -33
  518. data/spec/mongoid/association_spec.rb +1 -1
  519. data/spec/mongoid/atomic/modifiers_spec.rb +1 -1
  520. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +1 -1
  521. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +1 -1
  522. data/spec/mongoid/atomic/paths/root_spec.rb +1 -1
  523. data/spec/mongoid/atomic/paths_spec.rb +65 -27
  524. data/spec/mongoid/atomic_spec.rb +29 -7
  525. data/spec/mongoid/atomic_update_preparer_spec.rb +83 -0
  526. data/spec/mongoid/attributes/dynamic_spec.rb +1 -1
  527. data/spec/mongoid/attributes/embedded_spec.rb +118 -0
  528. data/spec/mongoid/attributes/nested_spec.rb +147 -78
  529. data/spec/mongoid/attributes/nested_spec_models.rb +49 -0
  530. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  531. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  532. data/spec/mongoid/attributes/projector_spec.rb +41 -0
  533. data/spec/mongoid/attributes/readonly_spec.rb +23 -23
  534. data/spec/mongoid/attributes_spec.rb +921 -69
  535. data/spec/mongoid/cacheable_spec.rb +5 -5
  536. data/spec/mongoid/changeable_spec.rb +468 -76
  537. data/spec/mongoid/clients/factory_spec.rb +152 -30
  538. data/spec/mongoid/clients/options_spec.rb +24 -12
  539. data/spec/mongoid/clients/sessions_spec.rb +49 -71
  540. data/spec/mongoid/clients/transactions_spec.rb +971 -176
  541. data/spec/mongoid/clients/transactions_spec_models.rb +159 -0
  542. data/spec/mongoid/clients_spec.rb +230 -22
  543. data/spec/mongoid/collection_configurable_spec.rb +159 -0
  544. data/spec/mongoid/composable_spec.rb +1 -1
  545. data/spec/mongoid/config/defaults_spec.rb +99 -0
  546. data/spec/mongoid/config/encryption_spec.rb +152 -0
  547. data/spec/mongoid/config/environment_spec.rb +126 -39
  548. data/spec/mongoid/config/introspection_spec.rb +114 -0
  549. data/spec/mongoid/config/options_spec.rb +1 -1
  550. data/spec/mongoid/config_spec.rb +375 -43
  551. data/spec/mongoid/contextual/aggregable/memory_spec.rb +432 -154
  552. data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
  553. data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +63 -0
  554. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +95 -20
  555. data/spec/mongoid/contextual/aggregable/none_spec.rb +49 -0
  556. data/spec/mongoid/contextual/atomic_spec.rb +329 -87
  557. data/spec/mongoid/contextual/map_reduce_spec.rb +5 -19
  558. data/spec/mongoid/contextual/memory_spec.rb +1479 -127
  559. data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +194 -0
  560. data/spec/mongoid/contextual/mongo_spec.rb +3374 -1254
  561. data/spec/mongoid/contextual/none_spec.rb +79 -68
  562. data/spec/mongoid/copyable_spec.rb +465 -23
  563. data/spec/mongoid/copyable_spec_models.rb +1 -1
  564. data/spec/mongoid/criteria/findable_spec.rb +295 -229
  565. data/spec/mongoid/criteria/includable_spec.rb +1493 -0
  566. data/spec/mongoid/criteria/includable_spec_models.rb +55 -0
  567. data/spec/mongoid/criteria/inspectable_spec.rb +1 -1
  568. data/spec/mongoid/criteria/marshalable_spec.rb +19 -2
  569. data/spec/mongoid/criteria/modifiable_spec.rb +38 -38
  570. data/spec/mongoid/criteria/options_spec.rb +1 -1
  571. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +2 -2
  572. data/spec/mongoid/criteria/queryable/expandable_spec.rb +1 -74
  573. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +8 -20
  574. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +135 -27
  575. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +2 -2
  576. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +32 -12
  577. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +12 -1
  578. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +1 -1
  579. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +1 -16
  580. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +1 -1
  581. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +1 -1
  582. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +74 -8
  583. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +1 -1
  584. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +238 -179
  585. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -12
  586. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +1 -12
  587. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +1 -1
  588. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +48 -132
  589. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +5 -60
  590. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +12 -1
  591. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +12 -1
  592. data/spec/mongoid/criteria/queryable/key_spec.rb +1 -1
  593. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +106 -8
  594. data/spec/mongoid/criteria/queryable/optional_spec.rb +17 -486
  595. data/spec/mongoid/criteria/queryable/options_spec.rb +2 -2
  596. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +1 -1
  597. data/spec/mongoid/criteria/queryable/queryable_spec.rb +2 -2
  598. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +700 -26
  599. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +39 -0
  600. data/spec/mongoid/criteria/queryable/selectable_spec.rb +149 -683
  601. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +590 -0
  602. data/spec/mongoid/criteria/queryable/selector_spec.rb +186 -6
  603. data/spec/mongoid/criteria/queryable/smash_spec.rb +1 -1
  604. data/spec/mongoid/criteria/queryable/storable_spec.rb +87 -1
  605. data/spec/mongoid/criteria/scopable_spec.rb +128 -1
  606. data/spec/mongoid/criteria/translator_spec.rb +133 -0
  607. data/spec/mongoid/criteria_projection_spec.rb +407 -0
  608. data/spec/mongoid/criteria_spec.rb +1029 -1806
  609. data/spec/mongoid/document_fields_spec.rb +180 -5
  610. data/spec/mongoid/document_persistence_context_spec.rb +77 -1
  611. data/spec/mongoid/document_query_spec.rb +55 -4
  612. data/spec/mongoid/document_spec.rb +43 -172
  613. data/spec/mongoid/equality_spec.rb +7 -8
  614. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +1 -1
  615. data/spec/mongoid/errors/attribute_not_loaded_spec.rb +32 -0
  616. data/spec/mongoid/errors/callback_spec.rb +1 -1
  617. data/spec/mongoid/errors/delete_restriction_spec.rb +2 -2
  618. data/spec/mongoid/errors/document_not_destroyed_spec.rb +1 -1
  619. data/spec/mongoid/errors/document_not_found_spec.rb +77 -1
  620. data/spec/mongoid/errors/invalid_collection_spec.rb +1 -1
  621. data/spec/mongoid/errors/{eager_load_spec.rb → invalid_config_file_spec.rb} +6 -6
  622. data/spec/mongoid/errors/invalid_config_option_spec.rb +1 -1
  623. data/spec/mongoid/errors/invalid_field_option_spec.rb +1 -1
  624. data/spec/mongoid/errors/invalid_field_spec.rb +2 -2
  625. data/spec/mongoid/errors/invalid_field_type_spec.rb +56 -0
  626. data/spec/mongoid/errors/invalid_find_spec.rb +1 -1
  627. data/spec/mongoid/errors/invalid_includes_spec.rb +1 -1
  628. data/spec/mongoid/errors/invalid_index_spec.rb +1 -1
  629. data/spec/mongoid/errors/invalid_options_spec.rb +1 -1
  630. data/spec/mongoid/errors/invalid_path_spec.rb +1 -1
  631. data/spec/mongoid/errors/invalid_relation_spec.rb +1 -1
  632. data/spec/mongoid/errors/invalid_scope_spec.rb +2 -2
  633. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +1 -1
  634. data/spec/mongoid/errors/invalid_storage_options_spec.rb +1 -1
  635. data/spec/mongoid/errors/invalid_time_spec.rb +1 -1
  636. data/spec/mongoid/errors/inverse_not_found_spec.rb +1 -1
  637. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +1 -1
  638. data/spec/mongoid/errors/mixed_relations_spec.rb +1 -1
  639. data/spec/mongoid/errors/mongoid_error_spec.rb +4 -4
  640. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +1 -1
  641. data/spec/mongoid/errors/no_client_config_spec.rb +1 -1
  642. data/spec/mongoid/errors/no_client_database_spec.rb +1 -1
  643. data/spec/mongoid/errors/no_client_hosts_spec.rb +1 -1
  644. data/spec/mongoid/errors/no_clients_config_spec.rb +1 -1
  645. data/spec/mongoid/errors/no_environment_spec.rb +4 -4
  646. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +1 -1
  647. data/spec/mongoid/errors/no_metadata_spec.rb +1 -1
  648. data/spec/mongoid/errors/no_parent_spec.rb +1 -1
  649. data/spec/mongoid/errors/readonly_attribute_spec.rb +1 -1
  650. data/spec/mongoid/errors/readonly_document_spec.rb +3 -3
  651. data/spec/mongoid/errors/scope_overwrite_spec.rb +1 -1
  652. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -2
  653. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -3
  654. data/spec/mongoid/errors/unsaved_document_spec.rb +1 -1
  655. data/spec/mongoid/errors/unsupported_javascript_spec.rb +1 -1
  656. data/spec/mongoid/errors/validations_spec.rb +1 -1
  657. data/spec/mongoid/extensions/array_spec.rb +19 -265
  658. data/spec/mongoid/extensions/big_decimal_spec.rb +713 -213
  659. data/spec/mongoid/extensions/binary_spec.rb +45 -10
  660. data/spec/mongoid/extensions/boolean_spec.rb +69 -83
  661. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +15 -11
  662. data/spec/mongoid/extensions/date_spec.rb +74 -22
  663. data/spec/mongoid/extensions/date_time_spec.rb +18 -19
  664. data/spec/mongoid/extensions/decimal128_spec.rb +1 -1
  665. data/spec/mongoid/extensions/false_class_spec.rb +2 -9
  666. data/spec/mongoid/extensions/float_spec.rb +56 -84
  667. data/spec/mongoid/extensions/hash_spec.rb +45 -219
  668. data/spec/mongoid/extensions/integer_spec.rb +53 -73
  669. data/spec/mongoid/extensions/module_spec.rb +1 -1
  670. data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
  671. data/spec/mongoid/extensions/object_id_spec.rb +1 -1
  672. data/spec/mongoid/extensions/object_spec.rb +1 -177
  673. data/spec/mongoid/extensions/range_spec.rb +254 -64
  674. data/spec/mongoid/extensions/raw_value_spec.rb +67 -0
  675. data/spec/mongoid/extensions/regexp_spec.rb +59 -34
  676. data/spec/mongoid/extensions/set_spec.rb +105 -1
  677. data/spec/mongoid/extensions/string_spec.rb +21 -104
  678. data/spec/mongoid/extensions/stringified_symbol_spec.rb +1 -1
  679. data/spec/mongoid/extensions/symbol_spec.rb +15 -53
  680. data/spec/mongoid/extensions/time_spec.rb +345 -131
  681. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -107
  682. data/spec/mongoid/extensions/true_class_spec.rb +2 -9
  683. data/spec/mongoid/factory_spec.rb +63 -2
  684. data/spec/mongoid/fields/foreign_key_spec.rb +282 -120
  685. data/spec/mongoid/fields/localized_spec.rb +85 -42
  686. data/spec/mongoid/fields/standard_spec.rb +1 -1
  687. data/spec/mongoid/fields_spec.rb +826 -121
  688. data/spec/mongoid/findable_spec.rb +442 -80
  689. data/spec/mongoid/indexable/specification_spec.rb +132 -14
  690. data/spec/mongoid/indexable_spec.rb +361 -23
  691. data/spec/mongoid/inspectable_spec.rb +93 -5
  692. data/spec/mongoid/interceptable_spec.rb +926 -116
  693. data/spec/mongoid/interceptable_spec_models.rb +236 -4
  694. data/spec/mongoid/loading_spec.rb +110 -0
  695. data/spec/mongoid/loggable_spec.rb +1 -1
  696. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  697. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +68 -88
  698. data/spec/mongoid/matcher/extract_attribute_spec.rb +5 -15
  699. data/spec/mongoid/mongoizable_spec.rb +286 -0
  700. data/spec/mongoid/monkey_patches_spec.rb +211 -0
  701. data/spec/mongoid/persistable/creatable_spec.rb +5 -5
  702. data/spec/mongoid/persistable/deletable_spec.rb +267 -27
  703. data/spec/mongoid/persistable/destroyable_spec.rb +409 -24
  704. data/spec/mongoid/persistable/incrementable_spec.rb +46 -9
  705. data/spec/mongoid/persistable/logical_spec.rb +42 -5
  706. data/spec/mongoid/persistable/maxable_spec.rb +147 -0
  707. data/spec/mongoid/persistable/minable_spec.rb +147 -0
  708. data/spec/mongoid/persistable/multipliable_spec.rb +227 -0
  709. data/spec/mongoid/persistable/poppable_spec.rb +41 -5
  710. data/spec/mongoid/persistable/pullable_spec.rb +81 -9
  711. data/spec/mongoid/persistable/pushable_spec.rb +81 -9
  712. data/spec/mongoid/persistable/renamable_spec.rb +40 -4
  713. data/spec/mongoid/persistable/savable_spec.rb +114 -20
  714. data/spec/mongoid/persistable/settable_spec.rb +77 -10
  715. data/spec/mongoid/persistable/unsettable_spec.rb +41 -5
  716. data/spec/mongoid/persistable/updatable_spec.rb +64 -52
  717. data/spec/mongoid/persistable/upsertable_spec.rb +124 -4
  718. data/spec/mongoid/persistable_spec.rb +4 -4
  719. data/spec/mongoid/persistence_context_spec.rb +58 -59
  720. data/spec/mongoid/positional_spec.rb +1 -1
  721. data/spec/mongoid/railties/bson_object_id_serializer_spec.rb +24 -0
  722. data/spec/mongoid/railties/console_sandbox_spec.rb +44 -0
  723. data/spec/mongoid/relations/proxy_spec.rb +7 -7
  724. data/spec/mongoid/reloadable_spec.rb +255 -30
  725. data/spec/mongoid/scopable_spec.rb +198 -58
  726. data/spec/mongoid/search_indexable_spec.rb +147 -0
  727. data/spec/mongoid/selectable_spec.rb +7 -7
  728. data/spec/mongoid/serializable_spec.rb +19 -40
  729. data/spec/mongoid/shardable_models.rb +15 -0
  730. data/spec/mongoid/shardable_spec.rb +181 -31
  731. data/spec/mongoid/stateful_spec.rb +152 -10
  732. data/spec/mongoid/tasks/database_rake_spec.rb +193 -42
  733. data/spec/mongoid/tasks/database_spec.rb +175 -2
  734. data/spec/mongoid/tasks/encryption_spec.rb +187 -0
  735. data/spec/mongoid/threaded_spec.rb +40 -3
  736. data/spec/mongoid/timestamps/created/short_spec.rb +2 -2
  737. data/spec/mongoid/timestamps/created_spec.rb +2 -2
  738. data/spec/mongoid/timestamps/timeless_spec.rb +3 -3
  739. data/spec/mongoid/timestamps/updated/short_spec.rb +4 -4
  740. data/spec/mongoid/timestamps/updated_spec.rb +4 -4
  741. data/spec/mongoid/timestamps_spec.rb +399 -11
  742. data/spec/mongoid/timestamps_spec_models.rb +68 -0
  743. data/spec/mongoid/touchable_spec.rb +971 -54
  744. data/spec/mongoid/touchable_spec_models.rb +154 -0
  745. data/spec/mongoid/traversable_spec.rb +79 -37
  746. data/spec/mongoid/validatable/associated_spec.rb +14 -31
  747. data/spec/mongoid/validatable/format_spec.rb +1 -1
  748. data/spec/mongoid/validatable/length_spec.rb +1 -1
  749. data/spec/mongoid/validatable/numericality_spec.rb +1 -1
  750. data/spec/mongoid/validatable/presence_spec.rb +27 -23
  751. data/spec/mongoid/validatable/uniqueness_spec.rb +170 -99
  752. data/spec/mongoid/validatable_spec.rb +4 -4
  753. data/spec/mongoid/warnings_spec.rb +36 -0
  754. data/spec/mongoid_spec.rb +61 -11
  755. data/spec/rails/controller_extension/controller_runtime_spec.rb +3 -3
  756. data/spec/rails/mongoid_spec.rb +28 -132
  757. data/spec/shared/bin/get-mongodb-download-url +17 -0
  758. data/spec/shared/bin/s3-copy +45 -0
  759. data/spec/shared/bin/s3-upload +69 -0
  760. data/spec/shared/lib/mrss/cluster_config.rb +24 -4
  761. data/spec/shared/lib/mrss/constraints.rb +77 -29
  762. data/spec/shared/lib/mrss/docker_runner.rb +40 -4
  763. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  764. data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
  765. data/spec/shared/lib/mrss/lite_constraints.rb +64 -1
  766. data/spec/shared/lib/mrss/server_version_registry.rb +78 -34
  767. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  768. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  769. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  770. data/spec/shared/lib/mrss/utils.rb +37 -0
  771. data/spec/shared/share/Dockerfile.erb +123 -71
  772. data/spec/shared/share/haproxy-1.conf +16 -0
  773. data/spec/shared/share/haproxy-2.conf +17 -0
  774. data/spec/shared/shlib/config.sh +27 -0
  775. data/spec/shared/shlib/distro.sh +2 -1
  776. data/spec/shared/shlib/server.sh +187 -40
  777. data/spec/shared/shlib/set_env.sh +49 -31
  778. data/spec/spec_helper.rb +46 -49
  779. data/spec/support/authorization.rb +1 -1
  780. data/spec/support/client_registry.rb +10 -0
  781. data/spec/support/constraints.rb +25 -1
  782. data/spec/support/crypt/models.rb +50 -0
  783. data/spec/support/crypt.rb +80 -0
  784. data/spec/support/expectations.rb +1 -1
  785. data/spec/support/feature_sandbox.rb +72 -0
  786. data/spec/support/helpers.rb +1 -0
  787. data/spec/support/immutable_ids.rb +119 -0
  788. data/spec/support/macros.rb +107 -1
  789. data/spec/support/models/account.rb +2 -2
  790. data/spec/support/models/acolyte.rb +1 -1
  791. data/spec/support/models/actor.rb +1 -1
  792. data/spec/support/models/actress.rb +1 -1
  793. data/spec/support/models/address.rb +7 -1
  794. data/spec/support/models/address_component.rb +1 -1
  795. data/spec/support/models/address_number.rb +1 -1
  796. data/spec/support/models/agency.rb +1 -1
  797. data/spec/support/models/agent.rb +1 -1
  798. data/spec/support/models/album.rb +1 -1
  799. data/spec/support/models/alert.rb +1 -1
  800. data/spec/support/models/animal.rb +1 -1
  801. data/spec/support/models/answer.rb +1 -1
  802. data/spec/support/models/appointment.rb +1 -1
  803. data/spec/support/models/armrest.rb +1 -1
  804. data/spec/support/models/array_field.rb +1 -1
  805. data/spec/support/models/article.rb +1 -1
  806. data/spec/support/models/artist.rb +3 -2
  807. data/spec/support/models/artwork.rb +1 -1
  808. data/spec/support/models/audible_sound.rb +4 -0
  809. data/spec/support/models/audio.rb +1 -1
  810. data/spec/support/models/augmentation.rb +13 -1
  811. data/spec/support/models/author.rb +1 -1
  812. data/spec/support/models/baby.rb +1 -1
  813. data/spec/support/models/band.rb +13 -1
  814. data/spec/support/models/bar.rb +1 -1
  815. data/spec/support/models/basic.rb +1 -1
  816. data/spec/support/models/bed.rb +1 -1
  817. data/spec/support/models/big_palette.rb +1 -1
  818. data/spec/support/models/birthday.rb +1 -1
  819. data/spec/support/models/bolt.rb +8 -0
  820. data/spec/support/models/bomb.rb +1 -1
  821. data/spec/support/models/book.rb +2 -1
  822. data/spec/support/models/breed.rb +1 -1
  823. data/spec/support/models/browser.rb +1 -1
  824. data/spec/support/models/building.rb +3 -1
  825. data/spec/support/models/building_address.rb +1 -1
  826. data/spec/support/models/bus.rb +1 -1
  827. data/spec/support/models/business.rb +1 -1
  828. data/spec/support/models/callback_test.rb +1 -1
  829. data/spec/support/models/canvas.rb +1 -1
  830. data/spec/support/models/car.rb +1 -1
  831. data/spec/support/models/cat.rb +1 -1
  832. data/spec/support/models/catalog.rb +25 -0
  833. data/spec/support/models/category.rb +1 -1
  834. data/spec/support/models/child.rb +1 -1
  835. data/spec/support/models/child_doc.rb +4 -4
  836. data/spec/support/models/church.rb +1 -1
  837. data/spec/support/models/circle.rb +1 -1
  838. data/spec/support/models/circuit.rb +1 -1
  839. data/spec/support/models/circus.rb +4 -1
  840. data/spec/support/models/code.rb +3 -1
  841. data/spec/support/models/coding/pull_request.rb +1 -1
  842. data/spec/support/models/coding.rb +1 -1
  843. data/spec/support/models/comment.rb +1 -1
  844. data/spec/support/models/company.rb +1 -1
  845. data/spec/support/models/consumption_period.rb +1 -1
  846. data/spec/support/models/contextable_item.rb +1 -1
  847. data/spec/support/models/contractor.rb +1 -1
  848. data/spec/support/models/cookie.rb +1 -1
  849. data/spec/support/models/country_code.rb +3 -1
  850. data/spec/support/models/courier_job.rb +1 -1
  851. data/spec/support/models/cover.rb +11 -0
  852. data/spec/support/models/crate.rb +1 -1
  853. data/spec/support/models/customer.rb +1 -1
  854. data/spec/support/models/customer_address.rb +1 -1
  855. data/spec/support/models/deed.rb +1 -1
  856. data/spec/support/models/definition.rb +1 -1
  857. data/spec/support/models/delegating_patient.rb +1 -1
  858. data/spec/support/models/description.rb +1 -1
  859. data/spec/support/models/dictionary.rb +1 -1
  860. data/spec/support/models/division.rb +1 -1
  861. data/spec/support/models/doctor.rb +1 -1
  862. data/spec/support/models/dog.rb +1 -1
  863. data/spec/support/models/dokument.rb +1 -1
  864. data/spec/support/models/draft.rb +1 -1
  865. data/spec/support/models/dragon.rb +1 -1
  866. data/spec/support/models/driver.rb +1 -1
  867. data/spec/support/models/drug.rb +1 -1
  868. data/spec/support/models/dungeon.rb +1 -1
  869. data/spec/support/models/edit.rb +1 -1
  870. data/spec/support/models/email.rb +1 -1
  871. data/spec/support/models/employer.rb +1 -1
  872. data/spec/support/models/entry.rb +1 -1
  873. data/spec/support/models/eraser.rb +1 -1
  874. data/spec/support/models/even.rb +1 -1
  875. data/spec/support/models/event.rb +1 -1
  876. data/spec/support/models/exhibition.rb +1 -1
  877. data/spec/support/models/exhibitor.rb +1 -1
  878. data/spec/support/models/explosion.rb +1 -1
  879. data/spec/support/models/eye.rb +1 -1
  880. data/spec/support/models/eye_bowl.rb +1 -1
  881. data/spec/support/models/face.rb +1 -1
  882. data/spec/support/models/fanatic.rb +9 -0
  883. data/spec/support/models/favorite.rb +8 -2
  884. data/spec/support/models/filesystem.rb +1 -1
  885. data/spec/support/models/fire_hydrant.rb +1 -1
  886. data/spec/support/models/firefox.rb +1 -1
  887. data/spec/support/models/fish.rb +1 -1
  888. data/spec/support/models/folder.rb +1 -1
  889. data/spec/support/models/folder_item.rb +1 -1
  890. data/spec/support/models/fruits.rb +1 -1
  891. data/spec/support/models/game.rb +1 -1
  892. data/spec/support/models/ghost.rb +1 -1
  893. data/spec/support/models/guitar.rb +1 -1
  894. data/spec/support/models/hole.rb +13 -0
  895. data/spec/support/models/home.rb +1 -1
  896. data/spec/support/models/house.rb +1 -1
  897. data/spec/support/models/html_writer.rb +1 -1
  898. data/spec/support/models/id_key.rb +1 -1
  899. data/spec/support/models/idnodef.rb +1 -1
  900. data/spec/support/models/image.rb +1 -1
  901. data/spec/support/models/implant.rb +10 -1
  902. data/spec/support/models/instrument.rb +1 -1
  903. data/spec/support/models/item.rb +1 -1
  904. data/spec/support/models/jar.rb +1 -1
  905. data/spec/support/models/kaleidoscope.rb +1 -1
  906. data/spec/support/models/kangaroo.rb +1 -1
  907. data/spec/support/models/label.rb +5 -2
  908. data/spec/support/models/language.rb +1 -1
  909. data/spec/support/models/lat_lng.rb +1 -1
  910. data/spec/support/models/league.rb +1 -1
  911. data/spec/support/models/learner.rb +1 -1
  912. data/spec/support/models/line_item.rb +1 -1
  913. data/spec/support/models/location.rb +1 -1
  914. data/spec/support/models/login.rb +1 -1
  915. data/spec/support/models/manufacturer.rb +1 -1
  916. data/spec/support/models/meat.rb +1 -1
  917. data/spec/support/models/membership.rb +2 -1
  918. data/spec/support/models/message.rb +1 -1
  919. data/spec/support/models/minim.rb +1 -1
  920. data/spec/support/models/mixed_drink.rb +1 -1
  921. data/spec/support/models/mop.rb +10 -1
  922. data/spec/support/models/movie.rb +1 -1
  923. data/spec/support/models/my_hash.rb +1 -1
  924. data/spec/support/models/name.rb +11 -1
  925. data/spec/support/models/name_only.rb +1 -1
  926. data/spec/support/models/node.rb +1 -1
  927. data/spec/support/models/note.rb +1 -1
  928. data/spec/support/models/nut.rb +8 -0
  929. data/spec/support/models/odd.rb +1 -1
  930. data/spec/support/models/order.rb +3 -1
  931. data/spec/support/models/ordered_post.rb +2 -2
  932. data/spec/support/models/ordered_preference.rb +1 -1
  933. data/spec/support/models/oscar.rb +1 -1
  934. data/spec/support/models/other_owner_object.rb +1 -1
  935. data/spec/support/models/override.rb +1 -1
  936. data/spec/support/models/ownable.rb +1 -1
  937. data/spec/support/models/owner.rb +1 -1
  938. data/spec/support/models/pack.rb +1 -1
  939. data/spec/support/models/page.rb +1 -1
  940. data/spec/support/models/page_question.rb +1 -1
  941. data/spec/support/models/palette.rb +1 -1
  942. data/spec/support/models/parent.rb +1 -1
  943. data/spec/support/models/parent_doc.rb +1 -1
  944. data/spec/support/models/passport.rb +15 -1
  945. data/spec/support/models/patient.rb +1 -1
  946. data/spec/support/models/pdf_writer.rb +1 -1
  947. data/spec/support/models/pencil.rb +1 -1
  948. data/spec/support/models/person.rb +19 -1
  949. data/spec/support/models/pet.rb +1 -1
  950. data/spec/support/models/pet_owner.rb +1 -1
  951. data/spec/support/models/phone.rb +3 -2
  952. data/spec/support/models/piano.rb +1 -1
  953. data/spec/support/models/pizza.rb +1 -1
  954. data/spec/support/models/player.rb +3 -1
  955. data/spec/support/models/post.rb +1 -1
  956. data/spec/support/models/post_genre.rb +1 -1
  957. data/spec/support/models/powerup.rb +13 -1
  958. data/spec/support/models/preference.rb +1 -1
  959. data/spec/support/models/princess.rb +1 -1
  960. data/spec/support/models/product.rb +2 -1
  961. data/spec/support/models/profile.rb +1 -1
  962. data/spec/support/models/pronunciation.rb +1 -1
  963. data/spec/support/models/pub.rb +1 -1
  964. data/spec/support/models/publication/encyclopedia.rb +1 -1
  965. data/spec/support/models/publication/review.rb +1 -1
  966. data/spec/support/models/publication.rb +1 -1
  967. data/spec/support/models/purchase.rb +1 -1
  968. data/spec/support/models/purchased_item.rb +11 -0
  969. data/spec/support/models/purse.rb +9 -0
  970. data/spec/support/models/question.rb +1 -1
  971. data/spec/support/models/quiz.rb +1 -1
  972. data/spec/support/models/rating.rb +1 -1
  973. data/spec/support/models/record.rb +1 -1
  974. data/spec/support/models/registry.rb +2 -1
  975. data/spec/support/models/role.rb +1 -1
  976. data/spec/support/models/root_category.rb +1 -1
  977. data/spec/support/models/sandbox/app/models/app_models_message.rb +4 -0
  978. data/spec/support/models/sandbox/lib/models/lib_models_message.rb +4 -0
  979. data/spec/support/models/sandbox/sandbox_message.rb +4 -0
  980. data/spec/support/models/sandbox/sandbox_user.rb +4 -0
  981. data/spec/support/models/sandbox/subdir/sandbox_comment.rb +4 -0
  982. data/spec/support/models/sandwich.rb +1 -1
  983. data/spec/support/models/scheduler.rb +1 -1
  984. data/spec/support/models/school.rb +15 -0
  985. data/spec/support/models/scribe.rb +1 -1
  986. data/spec/support/models/sealer.rb +8 -0
  987. data/spec/support/models/seat.rb +1 -1
  988. data/spec/support/models/seo.rb +1 -1
  989. data/spec/support/models/series.rb +1 -1
  990. data/spec/support/models/server.rb +1 -1
  991. data/spec/support/models/service.rb +1 -1
  992. data/spec/support/models/shape.rb +1 -1
  993. data/spec/support/models/shelf.rb +1 -1
  994. data/spec/support/models/shield.rb +19 -0
  995. data/spec/support/models/shipment_address.rb +1 -1
  996. data/spec/support/models/shipping_container.rb +1 -1
  997. data/spec/support/models/shipping_pack.rb +1 -1
  998. data/spec/support/models/shirt.rb +12 -0
  999. data/spec/support/models/shop.rb +1 -1
  1000. data/spec/support/models/short_agent.rb +1 -1
  1001. data/spec/support/models/short_quiz.rb +1 -1
  1002. data/spec/support/models/simple.rb +1 -1
  1003. data/spec/support/models/slave.rb +1 -1
  1004. data/spec/support/models/song.rb +1 -1
  1005. data/spec/support/models/sound.rb +1 -1
  1006. data/spec/support/models/spacer.rb +8 -0
  1007. data/spec/support/models/square.rb +1 -1
  1008. data/spec/support/models/staff.rb +1 -1
  1009. data/spec/support/models/store_as_dup_test1.rb +1 -1
  1010. data/spec/support/models/store_as_dup_test2.rb +1 -1
  1011. data/spec/support/models/store_as_dup_test3.rb +1 -1
  1012. data/spec/support/models/store_as_dup_test4.rb +1 -1
  1013. data/spec/support/models/strategy.rb +1 -1
  1014. data/spec/support/models/student.rb +15 -0
  1015. data/spec/support/models/sub_item.rb +1 -1
  1016. data/spec/support/models/subscription.rb +1 -1
  1017. data/spec/support/models/survey.rb +1 -1
  1018. data/spec/support/models/symptom.rb +1 -1
  1019. data/spec/support/models/system_role.rb +1 -0
  1020. data/spec/support/models/tag.rb +1 -1
  1021. data/spec/support/models/target.rb +1 -1
  1022. data/spec/support/models/template.rb +1 -1
  1023. data/spec/support/models/thing.rb +1 -1
  1024. data/spec/support/models/threadlocker.rb +8 -0
  1025. data/spec/support/models/title.rb +1 -1
  1026. data/spec/support/models/tool.rb +1 -1
  1027. data/spec/support/models/topping.rb +1 -1
  1028. data/spec/support/models/toy.rb +1 -1
  1029. data/spec/support/models/track.rb +1 -1
  1030. data/spec/support/models/translation.rb +1 -1
  1031. data/spec/support/models/tree.rb +1 -1
  1032. data/spec/support/models/truck.rb +1 -1
  1033. data/spec/support/models/updatable.rb +1 -1
  1034. data/spec/support/models/user.rb +1 -1
  1035. data/spec/support/models/user_account.rb +1 -1
  1036. data/spec/support/models/validation_callback.rb +1 -1
  1037. data/spec/support/models/vehicle.rb +1 -1
  1038. data/spec/support/models/version.rb +1 -1
  1039. data/spec/support/models/vertex.rb +1 -1
  1040. data/spec/support/models/vet_visit.rb +1 -1
  1041. data/spec/support/models/video.rb +1 -1
  1042. data/spec/support/models/video_game.rb +1 -1
  1043. data/spec/support/models/washer.rb +8 -0
  1044. data/spec/support/models/weapon.rb +13 -1
  1045. data/spec/support/models/wiki_page.rb +1 -1
  1046. data/spec/support/models/word.rb +1 -1
  1047. data/spec/support/models/word_origin.rb +1 -1
  1048. data/spec/support/models/writer.rb +1 -1
  1049. data/spec/support/rails_mock.rb +32 -0
  1050. data/spec/support/schema_maps/schema_map_aws.json +17 -0
  1051. data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1052. data/spec/support/schema_maps/schema_map_azure.json +17 -0
  1053. data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1054. data/spec/support/schema_maps/schema_map_gcp.json +17 -0
  1055. data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1056. data/spec/support/schema_maps/schema_map_kmip.json +17 -0
  1057. data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1058. data/spec/support/schema_maps/schema_map_local.json +18 -0
  1059. data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1060. data/spec/support/shared/time.rb +3 -22
  1061. data/spec/support/sinatra_mock.rb +7 -0
  1062. data/spec/support/spec_config.rb +42 -7
  1063. data.tar.gz.sig +0 -0
  1064. metadata +883 -562
  1065. metadata.gz.sig +0 -0
  1066. data/lib/mongoid/association/referenced/eager.rb +0 -184
  1067. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +0 -128
  1068. data/lib/mongoid/contextual/geo_near.rb +0 -269
  1069. data/lib/mongoid/errors/eager_load.rb +0 -26
  1070. data/lib/mongoid/errors/invalid_session_use.rb +0 -26
  1071. data/lib/mongoid/errors/invalid_storage_parent.rb +0 -28
  1072. data/lib/mongoid/errors/invalid_value.rb +0 -18
  1073. data/lib/mongoid/query_cache.rb +0 -333
  1074. data/lib/support/ruby_version.rb +0 -29
  1075. data/spec/mongoid/contextual/geo_near_spec.rb +0 -472
  1076. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -61
  1077. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -61
  1078. data/spec/mongoid/extensions_spec.rb +0 -32
  1079. data/spec/mongoid/query_cache_middleware_spec.rb +0 -61
  1080. data/spec/mongoid/query_cache_spec.rb +0 -978
  1081. data/spec/support/cluster_config.rb +0 -158
  1082. data/spec/support/session_registry.rb +0 -50
@@ -0,0 +1,1493 @@
1
+ # frozen_string_literal: true
2
+ # rubocop:todo all
3
+
4
+ require "spec_helper"
5
+ require_relative "./includable_spec_models.rb"
6
+
7
+ describe Mongoid::Criteria::Includable do
8
+
9
+ describe "#includes" do
10
+
11
+ let!(:person) do
12
+ Person.create!(age: 1)
13
+ end
14
+
15
+ context "when providing a name that is not a relation" do
16
+
17
+ it "raises an error" do
18
+ expect {
19
+ Person.includes(:members)
20
+ }.to raise_error(Mongoid::Errors::InvalidIncludes)
21
+ end
22
+ end
23
+
24
+ context "when providing one association" do
25
+
26
+ let!(:user) do
27
+ User.create!(posts: [ post1 ])
28
+ end
29
+
30
+ let!(:post1) do
31
+ Post.create!
32
+ end
33
+
34
+ let(:result) do
35
+ User.includes(:posts).first
36
+ end
37
+
38
+ it "executes the query" do
39
+ expect(result).to eq(user)
40
+ end
41
+
42
+ it "includes the related objects" do
43
+ expect(result.posts).to eq([ post1 ])
44
+ end
45
+ end
46
+
47
+ context "when providing a list of associations" do
48
+
49
+ let!(:user) do
50
+ User.create!(posts: [ post1 ], descriptions: [ description1 ])
51
+ end
52
+
53
+ let!(:post1) do
54
+ Post.create!
55
+ end
56
+
57
+ let!(:description1) do
58
+ Description.create!(details: 1)
59
+ end
60
+
61
+ let(:result) do
62
+ User.includes(:posts, :descriptions).first
63
+ end
64
+
65
+ it "executes the query" do
66
+ expect(result).to eq(user)
67
+ end
68
+
69
+ it "includes the related objects" do
70
+ expect(result.posts).to eq([ post1 ])
71
+ expect(result.descriptions).to eq([ description1 ])
72
+ end
73
+ end
74
+
75
+ context "when providing a nested association" do
76
+
77
+ let!(:user) do
78
+ User.create!
79
+ end
80
+
81
+ before do
82
+ p = Post.create!(alerts: [ Alert.create! ])
83
+ user.posts = [ p ]
84
+ user.save!
85
+ end
86
+
87
+ let(:result) do
88
+ User.includes(:posts => [:alerts]).first
89
+ end
90
+
91
+ it "executes the query" do
92
+ expect(result).to eq(user)
93
+ end
94
+
95
+ it "includes the related objects" do
96
+ expect(result.posts.size).to eq(1)
97
+ expect(result.posts.first.alerts.size).to eq(1)
98
+ end
99
+ end
100
+
101
+ context "when providing a deeply nested association" do
102
+
103
+ let!(:user) do
104
+ User.create!
105
+ end
106
+
107
+ let(:results) do
108
+ User.includes(:posts => [{ :alerts => :items }]).to_a
109
+ end
110
+
111
+ it "executes the query" do
112
+ expect(results.first).to eq(user)
113
+ end
114
+ end
115
+
116
+ context "when the models are inherited" do
117
+
118
+ before(:all) do
119
+ class A
120
+ include Mongoid::Document
121
+ end
122
+
123
+ class B < A
124
+ belongs_to :c
125
+ end
126
+
127
+ class C
128
+ include Mongoid::Document
129
+ has_one :b
130
+ end
131
+ end
132
+
133
+ after(:all) do
134
+ Object.send(:remove_const, :A)
135
+ Object.send(:remove_const, :B)
136
+ Object.send(:remove_const, :C)
137
+ end
138
+
139
+ context "when the includes is on the subclass" do
140
+
141
+ let!(:c_one) do
142
+ C.create!
143
+ end
144
+
145
+ let!(:c_two) do
146
+ C.create!
147
+ end
148
+
149
+ let!(:b) do
150
+ B.create!(c: c_two)
151
+ end
152
+
153
+ let!(:results) do
154
+ C.includes(:b).to_a.detect do |c|
155
+ c.id == c_two.id
156
+ end
157
+ end
158
+
159
+ it "returns the correct documents" do
160
+ expect(results).to eq(c_two)
161
+ end
162
+
163
+ it "does not query the db" do
164
+ expect_query(0) do
165
+ results.b
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ context "when the models are inherited from another one model" do
172
+
173
+ context "when the relation is a has_one" do
174
+
175
+ before(:all) do
176
+ class A
177
+ include Mongoid::Document
178
+ end
179
+
180
+ class B < A
181
+ belongs_to :d
182
+ end
183
+
184
+ class C < A
185
+ belongs_to :d
186
+ end
187
+
188
+ class D
189
+ include Mongoid::Document
190
+ has_one :b
191
+ has_one :c
192
+ end
193
+ end
194
+
195
+ after(:all) do
196
+ Object.send(:remove_const, :A)
197
+ Object.send(:remove_const, :B)
198
+ Object.send(:remove_const, :C)
199
+ Object.send(:remove_const, :D)
200
+ end
201
+
202
+ context "when the includes is on the several relations" do
203
+
204
+ let!(:d_one) do
205
+ D.create!
206
+ end
207
+
208
+ let!(:d_two) do
209
+ D.create!
210
+ end
211
+
212
+ let!(:b) do
213
+ B.create!(d: d_two)
214
+ end
215
+
216
+ let!(:c) do
217
+ C.create!(d: d_two)
218
+ end
219
+
220
+ let!(:results) do
221
+ D.includes(:b, :c).entries.detect do |d|
222
+ d.id == d_two.id
223
+ end
224
+ end
225
+
226
+ it "returns the correct documents" do
227
+ expect(results).to eq(d_two)
228
+ end
229
+
230
+ it "does not query the db on b" do
231
+ expect_query(0) do
232
+ results.b
233
+ end
234
+ end
235
+
236
+ it "does not query the db on c" do
237
+ expect_query(0) do
238
+ results.b
239
+ end
240
+ end
241
+ end
242
+ end
243
+
244
+ context "when the relation is a has_many" do
245
+
246
+ before(:all) do
247
+ class A
248
+ include Mongoid::Document
249
+ end
250
+
251
+ class B < A
252
+ belongs_to :d
253
+ end
254
+
255
+ class C < A
256
+ belongs_to :d
257
+ end
258
+
259
+ class D
260
+ include Mongoid::Document
261
+ has_many :b
262
+ has_many :c
263
+ end
264
+ end
265
+
266
+ after(:all) do
267
+ Object.send(:remove_const, :A)
268
+ Object.send(:remove_const, :B)
269
+ Object.send(:remove_const, :C)
270
+ Object.send(:remove_const, :D)
271
+ end
272
+
273
+ context "when the includes is on the several relations" do
274
+
275
+ let!(:d_one) do
276
+ D.create!
277
+ end
278
+
279
+ let!(:d_two) do
280
+ D.create!
281
+ end
282
+
283
+ let!(:bs) do
284
+ 2.times.map { B.create!(d: d_two) }
285
+ end
286
+
287
+ let!(:cs) do
288
+ 2.times.map { C.create!(d: d_two) }
289
+ end
290
+
291
+ let!(:results) do
292
+ D.includes(:b, :c).entries.detect do |d|
293
+ d.id == d_two.id
294
+ end
295
+ end
296
+
297
+ it "returns the correct documents" do
298
+ expect(results).to eq(d_two)
299
+ end
300
+
301
+ it "does not query the db on b" do
302
+ expect_query(0) do
303
+ results.b
304
+ end
305
+ end
306
+
307
+ it "does not query the db on c" do
308
+ expect_query(0) do
309
+ results.b
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
315
+
316
+ context "when including the same association multiple times" do
317
+
318
+ let(:criteria) do
319
+ Person.all.includes(:posts, :posts).includes(:posts)
320
+ end
321
+
322
+ let(:association) do
323
+ Person.reflect_on_association(:posts)
324
+ end
325
+
326
+ it "does not duplicate the association in the inclusions" do
327
+ expect(criteria.inclusions).to eq([ association ])
328
+ end
329
+ end
330
+
331
+ context "when mapping the results more than once" do
332
+
333
+ let!(:post) do
334
+ person.posts.create!(title: "one")
335
+ end
336
+
337
+ let(:criteria) do
338
+ Post.includes(:person)
339
+ end
340
+
341
+ let!(:results) do
342
+ criteria.map { |doc| doc }
343
+ criteria.map { |doc| doc }
344
+ end
345
+
346
+ it "returns the proper results" do
347
+ expect(results.first.title).to eq("one")
348
+ end
349
+ end
350
+
351
+ context "when including a belongs to relation" do
352
+
353
+ context "when the criteria is from the root" do
354
+
355
+ let!(:person_two) do
356
+ Person.create!(age: 2)
357
+ end
358
+
359
+ let!(:post_one) do
360
+ person.posts.create!(title: "one")
361
+ end
362
+
363
+ let!(:post_two) do
364
+ person_two.posts.create!(title: "two")
365
+ end
366
+
367
+ context "when calling first" do
368
+
369
+ let(:criteria) do
370
+ Post.includes(:person)
371
+ end
372
+
373
+ let!(:document) do
374
+ criteria.first
375
+ end
376
+
377
+ it "eager loads the first document" do
378
+ expect_query(0) do
379
+ expect(document.person).to eq(person)
380
+ end
381
+ end
382
+
383
+ it "returns the first document" do
384
+ expect(document).to eq(post_one)
385
+ end
386
+ end
387
+
388
+ context "when calling last" do
389
+
390
+ let!(:criteria) do
391
+ Post.asc(:_id).includes(:person)
392
+ end
393
+
394
+ let!(:document) do
395
+ criteria.last
396
+ end
397
+
398
+ it "eager loads the last document" do
399
+ expect_query(0) do
400
+ expect(document.person).to eq(person_two)
401
+ end
402
+ end
403
+
404
+ it "returns the last document" do
405
+ expect(document).to eq(post_two)
406
+ end
407
+ end
408
+ end
409
+
410
+ context "when the criteria is from an embedded relation" do
411
+
412
+ let(:peep) do
413
+ Person.create!
414
+ end
415
+
416
+ let!(:address_one) do
417
+ peep.addresses.create!(street: "rosenthaler")
418
+ end
419
+
420
+ let!(:address_two) do
421
+ peep.addresses.create!(street: "weinmeister")
422
+ end
423
+
424
+ let!(:depeche) do
425
+ Band.create!(name: "Depeche Mode")
426
+ end
427
+
428
+ let!(:tool) do
429
+ Band.create!(name: "Tool")
430
+ end
431
+
432
+ before do
433
+ address_one.band = depeche
434
+ address_two.band = tool
435
+ address_one.save!
436
+ address_two.save!
437
+ end
438
+
439
+ context "when calling first" do
440
+
441
+ let(:criteria) do
442
+ peep.reload.addresses.includes(:band)
443
+ end
444
+
445
+ let(:context) do
446
+ criteria.context
447
+ end
448
+
449
+ let!(:document) do
450
+ criteria.first
451
+ end
452
+
453
+ it "eager loads the first document" do
454
+ expect_query(0) do
455
+ expect(document.band).to eq(depeche)
456
+ end
457
+ end
458
+
459
+ it "returns the document" do
460
+ expect(document).to eq(address_one)
461
+ end
462
+ end
463
+
464
+ context "when calling last" do
465
+
466
+ let(:criteria) do
467
+ peep.reload.addresses.includes(:band)
468
+ end
469
+
470
+ let(:context) do
471
+ criteria.context
472
+ end
473
+
474
+ let!(:document) do
475
+ criteria.last
476
+ end
477
+
478
+ it "eager loads the last document" do
479
+ expect_query(0) do
480
+ expect(document.band).to eq(tool)
481
+ end
482
+ end
483
+
484
+ it "returns the document" do
485
+ expect(document).to eq(address_two)
486
+ end
487
+ end
488
+
489
+ context "when iterating all documents" do
490
+
491
+ let(:criteria) do
492
+ peep.reload.addresses.includes(:band)
493
+ end
494
+
495
+ let(:context) do
496
+ criteria.context
497
+ end
498
+
499
+ let!(:documents) do
500
+ criteria.to_a
501
+ end
502
+
503
+ it "eager loads the first document" do
504
+ expect_query(0) do
505
+ expect(documents.first.band).to eq(depeche)
506
+ end
507
+ end
508
+
509
+ it "eager loads the last document" do
510
+ expect_query(0) do
511
+ expect(documents.last.band).to eq(tool)
512
+ end
513
+ end
514
+
515
+ it "returns the documents" do
516
+ expect(documents).to eq([ address_one, address_two ])
517
+ end
518
+ end
519
+ end
520
+ end
521
+
522
+ context "when providing inclusions to the default scope" do
523
+
524
+ before do
525
+ Person.default_scope(->{ Person.includes(:posts) })
526
+ end
527
+
528
+ after do
529
+ Person.default_scoping = nil
530
+ end
531
+
532
+ let!(:post_one) do
533
+ person.posts.create!(title: "one")
534
+ end
535
+
536
+ let!(:post_two) do
537
+ person.posts.create!(title: "two")
538
+ end
539
+
540
+ context "when the criteria has no options" do
541
+
542
+ let!(:criteria) do
543
+ Person.asc(:age).all
544
+ end
545
+
546
+ let!(:documents) do
547
+ criteria.entries
548
+ end
549
+
550
+ it "returns the correct documents" do
551
+ expect(documents).to eq([ person ])
552
+ end
553
+
554
+ it "eager loads the first document" do
555
+ expect_query(0) do
556
+ expect(documents.first.posts.first).to eq(post_one)
557
+ end
558
+ end
559
+
560
+ it "eager loads the last document" do
561
+ expect_query(0) do
562
+ expect(documents.first.posts.last).to eq(post_two)
563
+ end
564
+ end
565
+
566
+ context "when executing the query twice" do
567
+
568
+ let!(:new_criteria) do
569
+ Person.where(id: person.id)
570
+ end
571
+
572
+ let!(:new_context) do
573
+ new_criteria.context
574
+ end
575
+
576
+ before do
577
+ expect(new_context).to receive(:eager_load).with([person]).once.and_call_original
578
+ end
579
+
580
+ let!(:from_db) do
581
+ new_criteria.first
582
+ end
583
+
584
+ it "does not duplicate documents in the relation" do
585
+ expect(person.posts.size).to eq(2)
586
+ end
587
+ end
588
+ end
589
+
590
+ context "when calling first on the criteria" do
591
+
592
+ let(:criteria) do
593
+ Person.asc(:age).all
594
+ end
595
+
596
+ let!(:from_db) do
597
+ criteria.first
598
+ end
599
+
600
+ it "returns the correct documents" do
601
+ expect(from_db).to eq(person)
602
+ end
603
+
604
+ it "eager loads the first document" do
605
+ expect_query(0) do
606
+ expect(from_db.posts.first).to eq(post_one)
607
+ end
608
+ end
609
+
610
+ it "eager loads the last document" do
611
+ expect_query(0) do
612
+ expect(from_db.posts.last).to eq(post_two)
613
+ end
614
+ end
615
+ end
616
+
617
+ context "when calling last on the criteria" do
618
+
619
+ let(:criteria) do
620
+ Person.asc(:age).all
621
+ end
622
+
623
+ let!(:context) do
624
+ criteria.context
625
+ end
626
+
627
+ before do
628
+ expect(context).to receive(:eager_load).with([person]).once.and_call_original
629
+ end
630
+
631
+ let!(:from_db) do
632
+ criteria.last
633
+ end
634
+
635
+ it "returns the correct documents" do
636
+ expect(from_db).to eq(person)
637
+ end
638
+
639
+ it "eager loads the first document" do
640
+ expect_query(0) do
641
+ expect(from_db.posts.first).to eq(post_one)
642
+ end
643
+ end
644
+
645
+ it "eager loads the last document" do
646
+ expect_query(0) do
647
+ expect(from_db.posts.last).to eq(post_two)
648
+ end
649
+ end
650
+ end
651
+
652
+ context "when the criteria has limiting options" do
653
+
654
+ let!(:person_two) do
655
+ Person.create!
656
+ end
657
+
658
+ let!(:post_three) do
659
+ person_two.posts.create!(title: "three")
660
+ end
661
+
662
+ let!(:criteria) do
663
+ Person.asc(:age).limit(1)
664
+ end
665
+
666
+ let!(:documents) do
667
+ criteria.entries
668
+ end
669
+
670
+ it "returns the correct documents" do
671
+ expect(criteria).to eq([ person ])
672
+ end
673
+
674
+ it "eager loads the first document" do
675
+ expect_query(0) do
676
+ expect(documents.first.posts.first).to eq(post_one)
677
+ end
678
+ end
679
+
680
+ it "eager loads the second document" do
681
+ expect_query(0) do
682
+ expect(documents.first.posts.last).to eq(post_two)
683
+ end
684
+ end
685
+ end
686
+ end
687
+
688
+ context "when including a has and belongs to many" do
689
+
690
+ let!(:preference_one) do
691
+ person.preferences.create!(name: "one")
692
+ end
693
+
694
+ let!(:preference_two) do
695
+ person.preferences.create!(name: "two")
696
+ end
697
+
698
+ context "when one of the related items is deleted" do
699
+
700
+ before do
701
+ person.preferences = [ preference_one, preference_two ]
702
+ preference_two.delete
703
+ end
704
+
705
+ let(:criteria) do
706
+ Person.where(id: person.id).includes(:preferences)
707
+ end
708
+
709
+ it "only loads the existing related items" do
710
+ expect(criteria.entries.first.preferences).to eq([ preference_one ])
711
+ end
712
+ end
713
+
714
+ context "when the criteria has no options" do
715
+
716
+ let!(:criteria) do
717
+ Person.asc(:age).includes(:preferences)
718
+ end
719
+
720
+ let!(:documents) do
721
+ criteria.entries
722
+ end
723
+
724
+ it "returns the correct documents" do
725
+ expect(documents).to eq([ person ])
726
+ end
727
+
728
+ it "eager loads the first document" do
729
+ expect_query(0) do
730
+ expect(documents.first.preferences.first).to eq(preference_one)
731
+ end
732
+ end
733
+
734
+ it "eager loads the last document" do
735
+ expect_query(0) do
736
+ expect(documents.first.preferences.last).to eq(preference_two)
737
+ end
738
+ end
739
+ end
740
+
741
+ context "when calling first on the criteria" do
742
+
743
+ let!(:criteria) do
744
+ Person.asc(:age).includes(:preferences)
745
+ end
746
+
747
+ let!(:from_db) do
748
+ criteria.first
749
+ end
750
+
751
+ it "returns the correct documents" do
752
+ expect(from_db).to eq(person)
753
+ end
754
+
755
+ it "eager loads the first document" do
756
+ expect_query(0) do
757
+ expect(from_db.preferences.first).to eq(preference_one)
758
+ end
759
+ end
760
+
761
+ it "eager loads the last document" do
762
+ expect_query(0) do
763
+ expect(from_db.preferences.last).to eq(preference_two)
764
+ end
765
+ end
766
+ end
767
+
768
+ context "when calling last on the criteria" do
769
+
770
+ let!(:criteria) do
771
+ Person.asc(:age).includes(:preferences)
772
+ end
773
+
774
+ let!(:from_db) do
775
+ criteria.last
776
+ end
777
+
778
+ it "returns the correct documents" do
779
+ expect(from_db).to eq(person)
780
+ end
781
+
782
+ it "eager loads the first document" do
783
+ expect_query(0) do
784
+ expect(from_db.preferences.first).to eq(preference_one)
785
+ end
786
+ end
787
+
788
+ it "eager loads the last document" do
789
+ expect_query(0) do
790
+ expect(from_db.preferences.last).to eq(preference_two)
791
+ end
792
+ end
793
+ end
794
+ end
795
+
796
+ context "when including a has many" do
797
+
798
+ let!(:post_one) do
799
+ person.posts.create!(title: "one")
800
+ end
801
+
802
+ let!(:post_two) do
803
+ person.posts.create!(title: "two")
804
+ end
805
+
806
+ context "when the criteria has no options" do
807
+
808
+ let!(:criteria) do
809
+ Person.asc(:age).includes(:posts)
810
+ end
811
+
812
+ let!(:documents) do
813
+ criteria.entries
814
+ end
815
+
816
+ it "returns the correct documents" do
817
+ expect(documents).to eq([ person ])
818
+ end
819
+
820
+ it "eager loads the first document" do
821
+ expect_query(0) do
822
+ expect(documents.first.posts.first).to eq(post_one)
823
+ end
824
+ end
825
+
826
+ it "eager loads the last document" do
827
+ expect_query(0) do
828
+ expect(documents.first.posts.last).to eq(post_two)
829
+ end
830
+ end
831
+ end
832
+
833
+ context "when calling first on the criteria" do
834
+
835
+ let!(:criteria) do
836
+ Person.asc(:age).includes(:posts)
837
+ end
838
+
839
+ let!(:from_db) do
840
+ criteria.first
841
+ end
842
+
843
+ it "returns the correct documents" do
844
+ expect(from_db).to eq(person)
845
+ end
846
+
847
+ context "when subsequently getting all documents" do
848
+
849
+ let!(:documents) do
850
+ criteria.entries
851
+ end
852
+
853
+ it "returns the correct documents" do
854
+ expect(documents).to eq([ person ])
855
+ end
856
+ end
857
+ end
858
+
859
+ context "when calling last on the criteria" do
860
+
861
+ let!(:criteria) do
862
+ Person.asc(:age).includes(:posts)
863
+ end
864
+
865
+ let!(:from_db) do
866
+ criteria.last
867
+ end
868
+
869
+ it "returns the correct documents" do
870
+ expect(from_db).to eq(person)
871
+ end
872
+
873
+ context "when subsequently getting all documents" do
874
+
875
+ let!(:documents) do
876
+ criteria.entries
877
+ end
878
+
879
+ it "returns the correct documents" do
880
+ expect(documents).to eq([ person ])
881
+ end
882
+ end
883
+ end
884
+
885
+ context "when the criteria has limiting options" do
886
+
887
+ let!(:person_two) do
888
+ Person.create!
889
+ end
890
+
891
+ let!(:post_three) do
892
+ person_two.posts.create!(title: "three")
893
+ end
894
+
895
+ let!(:criteria) do
896
+ Person.includes(:posts).asc(:age).limit(1)
897
+ end
898
+
899
+ let(:context) do
900
+ criteria.context
901
+ end
902
+
903
+ before do
904
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
905
+ end
906
+
907
+ let!(:documents) do
908
+ criteria.entries
909
+ end
910
+
911
+ it "returns the correct documents" do
912
+ expect(documents).to eq([ person ])
913
+ end
914
+ end
915
+ end
916
+
917
+ context "when including a has one" do
918
+
919
+ let!(:game_one) do
920
+ person.create_game(name: "one")
921
+ end
922
+
923
+ let!(:game_two) do
924
+ person.create_game(name: "two")
925
+ end
926
+
927
+ context "when the criteria has no options" do
928
+
929
+ let!(:criteria) do
930
+ Person.asc(:age).includes(:game)
931
+ end
932
+
933
+ let(:context) do
934
+ criteria.context
935
+ end
936
+
937
+ before do
938
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
939
+ end
940
+
941
+ let!(:documents) do
942
+ criteria.entries
943
+ end
944
+
945
+ it "returns the correct documents" do
946
+ expect(documents).to eq([ person ])
947
+ end
948
+ end
949
+
950
+ context "when the criteria has limiting options" do
951
+
952
+ let!(:person_two) do
953
+ Person.create!(age: 2)
954
+ end
955
+
956
+ let!(:game_three) do
957
+ person_two.create_game(name: "Skyrim")
958
+ end
959
+
960
+ let!(:criteria) do
961
+ Person.where(id: person.id).includes(:game).asc(:age).limit(1)
962
+ end
963
+
964
+ let(:context) do
965
+ criteria.context
966
+ end
967
+
968
+ before do
969
+ expect(context).to receive(:eager_load).with([ person ]).once.and_call_original
970
+ end
971
+
972
+ let!(:documents) do
973
+ criteria.entries
974
+ end
975
+
976
+ it "returns the correct documents" do
977
+ expect(documents).to eq([ person ])
978
+ end
979
+ end
980
+ end
981
+
982
+ context "when including a belongs to" do
983
+
984
+ let(:person_two) do
985
+ Person.create!(age: 2)
986
+ end
987
+
988
+ let!(:game_one) do
989
+ person.create_game(name: "one")
990
+ end
991
+
992
+ let!(:game_two) do
993
+ person_two.create_game(name: "two")
994
+ end
995
+
996
+ context "when providing no options" do
997
+
998
+ let!(:criteria) do
999
+ Game.includes(:person)
1000
+ end
1001
+
1002
+ let(:context) do
1003
+ criteria.context
1004
+ end
1005
+
1006
+ before do
1007
+ expect(context).to receive(:preload).twice.and_call_original
1008
+ end
1009
+
1010
+ let!(:documents) do
1011
+ criteria.entries
1012
+ end
1013
+
1014
+ it "returns the correct documents" do
1015
+ expect(criteria).to eq([ game_one, game_two ])
1016
+ end
1017
+ end
1018
+
1019
+ context "when the criteria has limiting options" do
1020
+
1021
+ let!(:criteria) do
1022
+ Game.where(id: game_one.id).includes(:person).asc(:_id).limit(1)
1023
+ end
1024
+
1025
+ let(:context) do
1026
+ criteria.context
1027
+ end
1028
+
1029
+ before do
1030
+ expect(context).to receive(:eager_load).with([ game_one ]).once.and_call_original
1031
+ end
1032
+
1033
+ let!(:documents) do
1034
+ criteria.entries
1035
+ end
1036
+
1037
+ it "returns the correct documents" do
1038
+ expect(documents).to eq([ game_one ])
1039
+ end
1040
+ end
1041
+ end
1042
+
1043
+ context "when including multiples in the same criteria" do
1044
+
1045
+ let!(:post_one) do
1046
+ person.posts.create!(title: "one")
1047
+ end
1048
+
1049
+ let!(:post_two) do
1050
+ person.posts.create!(title: "two")
1051
+ end
1052
+
1053
+ let!(:game_one) do
1054
+ person.create_game(name: "one")
1055
+ end
1056
+
1057
+ let!(:game_two) do
1058
+ person.create_game(name: "two")
1059
+ end
1060
+
1061
+ let!(:criteria) do
1062
+ Person.includes(:posts, :game).asc(:age)
1063
+ end
1064
+
1065
+ let(:context) do
1066
+ criteria.context
1067
+ end
1068
+
1069
+ before do
1070
+ expect(context).to receive(:preload).twice.and_call_original
1071
+ end
1072
+
1073
+ let!(:documents) do
1074
+ criteria.entries
1075
+ end
1076
+
1077
+ it "returns the correct documents" do
1078
+ expect(criteria).to eq([ person ])
1079
+ end
1080
+ end
1081
+
1082
+ context "when including nested referenced associations" do
1083
+
1084
+ context "when using a has_one association" do
1085
+ before(:all) do
1086
+ class A
1087
+ include Mongoid::Document
1088
+ has_one :b
1089
+ end
1090
+
1091
+ class B
1092
+ include Mongoid::Document
1093
+ belongs_to :a
1094
+ has_one :c
1095
+ end
1096
+
1097
+ class C
1098
+ include Mongoid::Document
1099
+ belongs_to :b
1100
+ has_one :d
1101
+ end
1102
+
1103
+ class D
1104
+ include Mongoid::Document
1105
+ belongs_to :c
1106
+ end
1107
+ end
1108
+
1109
+ after(:all) do
1110
+ Object.send(:remove_const, :A)
1111
+ Object.send(:remove_const, :B)
1112
+ Object.send(:remove_const, :C)
1113
+ Object.send(:remove_const, :D)
1114
+ end
1115
+
1116
+ let!(:a) do
1117
+ A.create!
1118
+ end
1119
+
1120
+ let!(:b) do
1121
+ B.create!
1122
+ end
1123
+
1124
+ let!(:c) do
1125
+ C.create!
1126
+ end
1127
+
1128
+ let!(:d) do
1129
+ D.create!
1130
+ end
1131
+
1132
+ before do
1133
+ c.d = d
1134
+ b.c = c
1135
+ a.b = b
1136
+ end
1137
+
1138
+ context "when including the belongs_to assocation" do
1139
+ let!(:result) do
1140
+ C.includes(b: :a).first
1141
+ end
1142
+
1143
+ it "finds the right document" do
1144
+ expect(result).to eq(c)
1145
+ expect(result.b).to eq(c.b)
1146
+ expect(result.b.a).to eq(c.b.a)
1147
+ end
1148
+
1149
+ it "does not execute a query" do
1150
+ expect_no_queries do
1151
+ result.b.a
1152
+ end
1153
+ end
1154
+ end
1155
+
1156
+ context "when including a doubly-nested belongs_to assocation" do
1157
+ let!(:result) do
1158
+ D.includes(c: { b: :a }).first
1159
+ end
1160
+
1161
+ it "finds the right document" do
1162
+ expect(result).to eq(d)
1163
+ expect(result.c).to eq(d.c)
1164
+ expect(result.c.b).to eq(d.c.b)
1165
+ expect(result.c.b.a).to eq(d.c.b.a)
1166
+ end
1167
+
1168
+ it "does not execute a query" do
1169
+ expect_no_queries do
1170
+ result.c.b.a
1171
+ end
1172
+ end
1173
+ end
1174
+
1175
+ context "when including the has_many assocation" do
1176
+ let!(:result) do
1177
+ A.includes(b: :c).first
1178
+ end
1179
+
1180
+ it "finds the right document" do
1181
+ expect(result).to eq(a)
1182
+ expect(result.b).to eq(a.b)
1183
+ expect(result.b.c).to eq(a.b.c)
1184
+ end
1185
+
1186
+ it "does not executes a query" do
1187
+ expect_no_queries do
1188
+ result.b.c
1189
+ end
1190
+ end
1191
+ end
1192
+
1193
+ context "when including a doubly-nested has_many assocation" do
1194
+ let!(:result) do
1195
+ A.includes(b: { c: :d }).first
1196
+ end
1197
+
1198
+ it "finds the right document" do
1199
+ expect(result).to eq(a)
1200
+ expect(result.b).to eq(a.b)
1201
+ expect(result.b.c).to eq(a.b.c)
1202
+ expect(result.b.c.d).to eq(a.b.c.d)
1203
+ end
1204
+
1205
+ it "does not execute a query" do
1206
+ expect_no_queries do
1207
+ result.b.c.d
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ context "when there are multiple documents" do
1213
+ let!(:as) do
1214
+ res = 9.times.map do |i|
1215
+ A.create!.tap do |a|
1216
+ a.b = B.create!.tap do |b|
1217
+ b.c = C.create!
1218
+ end
1219
+ end
1220
+ end
1221
+ [a, *res]
1222
+ end
1223
+
1224
+ let!(:results) do
1225
+ A.includes(b: :c).entries.sort
1226
+ end
1227
+
1228
+ it "finds the right document" do
1229
+ as.length.times do |i|
1230
+ expect(as[i]).to eq(results[i])
1231
+ expect(as[i].b).to eq(results[i].b)
1232
+ expect(as[i].b.c).to eq(results[i].b.c)
1233
+ end
1234
+ end
1235
+
1236
+ it "does not execute a query" do
1237
+ expect_no_queries do
1238
+ results.each do |a|
1239
+ a.b.c
1240
+ end
1241
+ end
1242
+ end
1243
+ end
1244
+
1245
+ context "when there are multiple associations" do
1246
+ before(:all) do
1247
+ class A
1248
+ has_one :c
1249
+ end
1250
+
1251
+ class C
1252
+ belongs_to :a
1253
+ end
1254
+ end
1255
+
1256
+ let(:c2) { C.create! }
1257
+ let(:d2) { D.create! }
1258
+
1259
+ before do
1260
+ a.c = c2
1261
+ a.c.d = d2
1262
+ end
1263
+
1264
+ let!(:results) do
1265
+ A.includes(b: { c: :d }, c: :d).first
1266
+ end
1267
+
1268
+ it "finds the right document" do
1269
+ expect(results).to eq(a)
1270
+ expect(results.b).to eq(a.b)
1271
+ expect(results.b.c).to eq(a.b.c)
1272
+ expect(results.b.c.d).to eq(a.b.c.d)
1273
+ expect(results.c).to eq(a.c)
1274
+ expect(results.c.d).to eq(a.c.d)
1275
+ end
1276
+
1277
+ it "does not execute a query" do
1278
+ expect_no_queries do
1279
+ results.c.d
1280
+ results.b.c.d
1281
+ end
1282
+ end
1283
+ end
1284
+ end
1285
+ end
1286
+
1287
+ context "when using a has_many association" do
1288
+
1289
+ let!(:user) do
1290
+ IncUser.create!(posts: posts, comments: user_comments)
1291
+ end
1292
+
1293
+ let!(:posts) do
1294
+ [ IncPost.create!(comments: post_comments) ]
1295
+ end
1296
+
1297
+ let!(:user_comments) do
1298
+ 2.times.map{ IncComment.create! }
1299
+ end
1300
+
1301
+ let!(:post_comments) do
1302
+ 2.times.map{ IncComment.create! }
1303
+ end
1304
+
1305
+ context "when including the same class twice" do
1306
+ let!(:results) do
1307
+ IncPost.includes({ user: :comments }, :comments).entries.sort
1308
+ end
1309
+
1310
+ it "finds the right documents" do
1311
+ posts.length.times do |i|
1312
+ expect(posts[i]).to eq(results[i])
1313
+ expect(posts[i].user).to eq(results[i].user)
1314
+ expect(posts[i].user.comments).to eq(results[i].user.comments)
1315
+ expect(posts[i].comments).to eq(results[i].comments)
1316
+ end
1317
+ end
1318
+
1319
+ it "does not execute a query" do
1320
+ expect_no_queries do
1321
+ results.each do |res|
1322
+ res.user
1323
+ res.user.comments.to_a
1324
+ res.comments.to_a
1325
+ end
1326
+ end
1327
+ end
1328
+ end
1329
+
1330
+ context "when the association chain has a class name twice" do
1331
+ let!(:thread) { IncThread.create!(comments: user_comments) }
1332
+
1333
+ let!(:result) do
1334
+ IncThread.includes(comments: { user: { posts: :comments } }).first
1335
+ end
1336
+
1337
+ it "finds the right document" do
1338
+ expect(result).to eq(thread)
1339
+ result.comments.length.times do |i|
1340
+ c1 = result.comments[i]
1341
+ c2 = thread.comments[i]
1342
+ expect(c1).to eq(c2)
1343
+ expect(c1.user).to eq(c2.user)
1344
+ c1.user.posts.length.times do |i|
1345
+ p1 = c1.user.posts[i]
1346
+ p2 = c2.user.posts[i]
1347
+
1348
+ expect(p1).to eq(p2)
1349
+ expect(p1.comments).to eq(p2.comments)
1350
+ end
1351
+ end
1352
+ end
1353
+
1354
+ it "does not execute a query" do
1355
+ expect_no_queries do
1356
+ result.comments.each do |comment|
1357
+ comment.user.posts.each do |post|
1358
+ post.comments.to_a
1359
+ end
1360
+ end
1361
+ end
1362
+ end
1363
+ end
1364
+ end
1365
+ end
1366
+
1367
+ describe "#inclusions" do
1368
+
1369
+ let(:criteria) do
1370
+ Band.includes(:records)
1371
+ end
1372
+
1373
+ let(:association) do
1374
+ Band.relations["records"]
1375
+ end
1376
+
1377
+ it "returns the inclusions" do
1378
+ expect(criteria.inclusions).to eq([ association ])
1379
+ end
1380
+ end
1381
+
1382
+ describe "#inclusions=" do
1383
+
1384
+ let(:criteria) do
1385
+ Band.all
1386
+ end
1387
+
1388
+ let(:association) do
1389
+ Band.relations["records"]
1390
+ end
1391
+
1392
+ before do
1393
+ criteria.inclusions = [ association ]
1394
+ end
1395
+
1396
+ it "sets the inclusions" do
1397
+ expect(criteria.inclusions).to eq([ association ])
1398
+ end
1399
+ end
1400
+
1401
+ context "When multiple associations reference the same class" do
1402
+ before do
1403
+ IncBlog.create(
1404
+ posts: [
1405
+ IncBlogPost.create(author: IncAuthor.create),
1406
+ IncBlogPost.create(author: IncAuthor.create),
1407
+ IncBlogPost.create(author: IncAuthor.create),
1408
+ ],
1409
+ highlighted_post: IncBlogPost.create(author: IncAuthor.create)
1410
+ )
1411
+ end
1412
+
1413
+ let!(:result) do
1414
+ IncBlog.includes(:posts, highlighted_post: :author).first
1415
+ end
1416
+
1417
+ it "does not execute a query" do
1418
+ expect_no_queries do
1419
+ result.posts.to_a
1420
+ result.highlighted_post
1421
+ end
1422
+ end
1423
+
1424
+ it "executes a query for the non-retrieved elements" do
1425
+ expect_query(3) do
1426
+ result.posts.each do |post|
1427
+ post.author
1428
+ end
1429
+ end
1430
+ end
1431
+ end
1432
+
1433
+ context "When multiple parent_inclusions for the same association" do
1434
+ before do
1435
+ IncBlog.create(
1436
+ posts: [
1437
+ IncBlogPost.create(author: IncAuthor.create),
1438
+ IncBlogPost.create(author: IncAuthor.create),
1439
+ IncBlogPost.create(author: IncAuthor.create),
1440
+ ],
1441
+ highlighted_post: IncBlogPost.create(author: IncAuthor.create),
1442
+ pinned_post: IncBlogPost.create(author: IncAuthor.create)
1443
+ )
1444
+ end
1445
+
1446
+ let!(:result) do
1447
+ IncBlog.includes(:posts, highlighted_post: :author, pinned_post: :author).first
1448
+ end
1449
+
1450
+ it "does not execute a query" do
1451
+ expect_no_queries do
1452
+ result.posts.to_a
1453
+ result.highlighted_post
1454
+ result.pinned_post
1455
+ end
1456
+ end
1457
+
1458
+ it "executes a query for the non-retrieved elements" do
1459
+ expect_query(3) do
1460
+ result.posts.each do |post|
1461
+ post.author
1462
+ end
1463
+ end
1464
+ end
1465
+
1466
+ context "when including an association and using each twice on a criteria" do
1467
+
1468
+ let(:criteria) { IncPost.all.includes(:person) }
1469
+
1470
+ before do
1471
+ p = IncPerson.create!(name: "name")
1472
+ 4.times { IncPost.create!(person: p)}
1473
+ criteria
1474
+ expect_query(2) do
1475
+ criteria.each(&:person)
1476
+ end
1477
+ end
1478
+
1479
+ # The reason we are checking for two operations here is:
1480
+ # - The first operation gets all of the posts
1481
+ # - The second operation gets the person from the first post
1482
+ # Now, all subsequent posts should use the eager loaded person when
1483
+ # trying to retrieve their person.
1484
+ # MONGOID-3942 reported that after iterating the criteria a second time,
1485
+ # the posts would not get the eager loaded person.
1486
+ it "eager loads the criteria" do
1487
+ expect_query(2) do
1488
+ criteria.each(&:person)
1489
+ end
1490
+ end
1491
+ end
1492
+ end
1493
+ end