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