mongoid 5.4.1 → 7.4.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 (1354) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +30 -30
  4. data/LICENSE +1 -0
  5. data/README.md +33 -19
  6. data/Rakefile +75 -5
  7. data/lib/config/locales/en.yml +180 -64
  8. data/lib/mongoid/association/accessors.rb +402 -0
  9. data/lib/mongoid/association/bindable.rb +179 -0
  10. data/lib/mongoid/association/builders.rb +84 -0
  11. data/lib/mongoid/association/constrainable.rb +43 -0
  12. data/lib/mongoid/association/depending.rb +128 -0
  13. data/lib/mongoid/association/eager_loadable.rb +35 -0
  14. data/lib/mongoid/association/embedded/batchable.rb +358 -0
  15. data/lib/mongoid/association/embedded/cyclic.rb +102 -0
  16. data/lib/mongoid/association/embedded/embedded_in/binding.rb +52 -0
  17. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +38 -0
  18. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +111 -0
  19. data/lib/mongoid/association/embedded/embedded_in.rb +134 -0
  20. data/lib/mongoid/association/embedded/embeds_many/binding.rb +41 -0
  21. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +45 -0
  22. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +549 -0
  23. data/lib/mongoid/association/embedded/embeds_many.rb +183 -0
  24. data/lib/mongoid/association/embedded/embeds_one/binding.rb +43 -0
  25. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +39 -0
  26. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +145 -0
  27. data/lib/mongoid/association/embedded/embeds_one.rb +150 -0
  28. data/lib/mongoid/association/embedded.rb +6 -0
  29. data/lib/mongoid/association/macros.rb +207 -0
  30. data/lib/mongoid/association/many.rb +198 -0
  31. data/lib/mongoid/association/marshalable.rb +31 -0
  32. data/lib/mongoid/association/nested/many.rb +191 -0
  33. data/lib/mongoid/association/nested/nested_buildable.rb +66 -0
  34. data/lib/mongoid/association/nested/one.rb +116 -0
  35. data/lib/mongoid/association/nested.rb +15 -0
  36. data/lib/mongoid/association/one.rb +53 -0
  37. data/lib/mongoid/association/options.rb +122 -0
  38. data/lib/mongoid/association/proxy.rb +189 -0
  39. data/lib/mongoid/association/referenced/auto_save.rb +73 -0
  40. data/lib/mongoid/association/referenced/belongs_to/binding.rb +82 -0
  41. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +48 -0
  42. data/lib/mongoid/association/referenced/belongs_to/eager.rb +73 -0
  43. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +125 -0
  44. data/lib/mongoid/association/referenced/belongs_to.rb +226 -0
  45. data/lib/mongoid/association/referenced/counter_cache.rb +152 -0
  46. data/lib/mongoid/association/referenced/eager.rb +163 -0
  47. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +72 -0
  48. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +40 -0
  49. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +53 -0
  50. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +292 -0
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +270 -0
  52. data/lib/mongoid/association/referenced/has_many/binding.rb +36 -0
  53. data/lib/mongoid/association/referenced/has_many/buildable.rb +38 -0
  54. data/lib/mongoid/association/referenced/has_many/eager.rb +44 -0
  55. data/lib/mongoid/association/referenced/has_many/enumerable.rb +498 -0
  56. data/lib/mongoid/association/referenced/has_many/proxy.rb +545 -0
  57. data/lib/mongoid/association/referenced/has_many.rb +251 -0
  58. data/lib/mongoid/association/referenced/has_one/binding.rb +42 -0
  59. data/lib/mongoid/association/referenced/has_one/buildable.rb +74 -0
  60. data/lib/mongoid/association/referenced/has_one/eager.rb +36 -0
  61. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +113 -0
  62. data/lib/mongoid/association/referenced/has_one/proxy.rb +111 -0
  63. data/lib/mongoid/association/referenced/has_one.rb +184 -0
  64. data/lib/mongoid/association/referenced/syncable.rb +155 -0
  65. data/lib/mongoid/association/referenced.rb +9 -0
  66. data/lib/mongoid/association/reflections.rb +69 -0
  67. data/lib/mongoid/association/relatable.rb +455 -0
  68. data/lib/mongoid/association.rb +135 -0
  69. data/lib/mongoid/atomic/modifiers.rb +29 -53
  70. data/lib/mongoid/atomic/paths/embedded/many.rb +5 -8
  71. data/lib/mongoid/atomic/paths/embedded/one.rb +5 -8
  72. data/lib/mongoid/atomic/paths/embedded.rb +3 -4
  73. data/lib/mongoid/atomic/paths/root.rb +4 -7
  74. data/lib/mongoid/atomic/paths.rb +2 -1
  75. data/lib/mongoid/atomic.rb +47 -52
  76. data/lib/mongoid/attributes/dynamic.rb +19 -33
  77. data/lib/mongoid/attributes/nested.rb +29 -21
  78. data/lib/mongoid/attributes/processing.rb +11 -26
  79. data/lib/mongoid/attributes/projector.rb +119 -0
  80. data/lib/mongoid/attributes/readonly.rb +24 -7
  81. data/lib/mongoid/attributes.rb +110 -106
  82. data/lib/mongoid/cacheable.rb +33 -0
  83. data/lib/mongoid/changeable.rb +39 -57
  84. data/lib/mongoid/clients/factory.rb +42 -17
  85. data/lib/mongoid/clients/options.rb +62 -258
  86. data/lib/mongoid/clients/sessions.rb +125 -0
  87. data/lib/mongoid/clients/storage_options.rb +9 -81
  88. data/lib/mongoid/clients/validators/storage.rb +2 -9
  89. data/lib/mongoid/clients/validators.rb +2 -1
  90. data/lib/mongoid/clients.rb +13 -73
  91. data/lib/mongoid/composable.rb +33 -10
  92. data/lib/mongoid/config/environment.rb +36 -14
  93. data/lib/mongoid/config/options.rb +20 -23
  94. data/lib/mongoid/config/validators/client.rb +2 -17
  95. data/lib/mongoid/config/validators/option.rb +2 -3
  96. data/lib/mongoid/config/validators.rb +2 -1
  97. data/lib/mongoid/config.rb +112 -39
  98. data/lib/mongoid/contextual/aggregable/memory.rb +17 -12
  99. data/lib/mongoid/contextual/aggregable/mongo.rb +26 -27
  100. data/lib/mongoid/contextual/aggregable/none.rb +65 -0
  101. data/lib/mongoid/contextual/aggregable.rb +17 -0
  102. data/lib/mongoid/contextual/atomic.rb +31 -33
  103. data/lib/mongoid/contextual/command.rb +2 -5
  104. data/lib/mongoid/contextual/geo_near.rb +7 -38
  105. data/lib/mongoid/contextual/map_reduce.rb +12 -36
  106. data/lib/mongoid/contextual/memory.rb +34 -64
  107. data/lib/mongoid/contextual/mongo.rb +228 -113
  108. data/lib/mongoid/contextual/none.rb +51 -23
  109. data/lib/mongoid/contextual/queryable.rb +2 -3
  110. data/lib/mongoid/contextual.rb +7 -9
  111. data/lib/mongoid/copyable.rb +32 -19
  112. data/lib/mongoid/criteria/findable.rb +12 -15
  113. data/lib/mongoid/criteria/includable.rb +21 -28
  114. data/lib/mongoid/criteria/inspectable.rb +2 -3
  115. data/lib/mongoid/criteria/marshalable.rb +4 -7
  116. data/lib/mongoid/criteria/modifiable.rb +38 -24
  117. data/lib/mongoid/criteria/options.rb +24 -0
  118. data/lib/mongoid/criteria/permission.rb +2 -1
  119. data/lib/mongoid/criteria/queryable/aggregable.rb +109 -0
  120. data/lib/mongoid/criteria/queryable/expandable.rb +68 -0
  121. data/lib/mongoid/criteria/queryable/extensions/array.rb +162 -0
  122. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +36 -0
  123. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +33 -0
  124. data/lib/mongoid/criteria/queryable/extensions/date.rb +58 -0
  125. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +47 -0
  126. data/lib/mongoid/criteria/queryable/extensions/hash.rb +177 -0
  127. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +75 -0
  128. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +81 -0
  129. data/lib/mongoid/criteria/queryable/extensions/object.rb +181 -0
  130. data/lib/mongoid/criteria/queryable/extensions/range.rb +94 -0
  131. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +72 -0
  132. data/lib/mongoid/criteria/queryable/extensions/set.rb +33 -0
  133. data/lib/mongoid/criteria/queryable/extensions/string.rb +122 -0
  134. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +72 -0
  135. data/lib/mongoid/criteria/queryable/extensions/time.rb +55 -0
  136. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +61 -0
  137. data/lib/mongoid/criteria/queryable/extensions.rb +25 -0
  138. data/lib/mongoid/criteria/queryable/key.rb +177 -0
  139. data/lib/mongoid/criteria/queryable/macroable.rb +26 -0
  140. data/lib/mongoid/criteria/queryable/mergeable.rb +413 -0
  141. data/lib/mongoid/criteria/queryable/optional.rb +386 -0
  142. data/lib/mongoid/criteria/queryable/options.rb +136 -0
  143. data/lib/mongoid/criteria/queryable/pipeline.rb +106 -0
  144. data/lib/mongoid/criteria/queryable/selectable.rb +943 -0
  145. data/lib/mongoid/criteria/queryable/selector.rb +202 -0
  146. data/lib/mongoid/criteria/queryable/smash.rb +95 -0
  147. data/lib/mongoid/criteria/queryable/storable.rb +237 -0
  148. data/lib/mongoid/criteria/queryable.rb +85 -0
  149. data/lib/mongoid/criteria/scopable.rb +27 -19
  150. data/lib/mongoid/criteria.rb +93 -76
  151. data/lib/mongoid/document.rb +62 -109
  152. data/lib/mongoid/equality.rb +29 -12
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +5 -6
  154. data/lib/mongoid/errors/callback.rb +2 -3
  155. data/lib/mongoid/errors/criteria_argument_required.rb +18 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +10 -13
  157. data/lib/mongoid/errors/document_not_destroyed.rb +4 -7
  158. data/lib/mongoid/errors/document_not_found.rb +2 -9
  159. data/lib/mongoid/errors/eager_load.rb +6 -5
  160. data/lib/mongoid/errors/empty_config_file.rb +25 -0
  161. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -3
  162. data/lib/mongoid/errors/invalid_collection.rb +2 -1
  163. data/lib/mongoid/errors/invalid_config_file.rb +25 -0
  164. data/lib/mongoid/errors/invalid_config_option.rb +2 -3
  165. data/lib/mongoid/errors/invalid_dependent_strategy.rb +31 -0
  166. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +24 -0
  167. data/lib/mongoid/errors/invalid_elem_match_operator.rb +32 -0
  168. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +25 -0
  169. data/lib/mongoid/errors/invalid_expression_operator.rb +27 -0
  170. data/lib/mongoid/errors/invalid_field.rb +4 -7
  171. data/lib/mongoid/errors/invalid_field_operator.rb +32 -0
  172. data/lib/mongoid/errors/invalid_field_option.rb +2 -3
  173. data/lib/mongoid/errors/invalid_find.rb +2 -3
  174. data/lib/mongoid/errors/invalid_includes.rb +2 -3
  175. data/lib/mongoid/errors/invalid_index.rb +2 -3
  176. data/lib/mongoid/errors/invalid_options.rb +4 -5
  177. data/lib/mongoid/errors/invalid_path.rb +2 -3
  178. data/lib/mongoid/errors/invalid_persistence_option.rb +26 -0
  179. data/lib/mongoid/errors/invalid_query.rb +40 -0
  180. data/lib/mongoid/errors/invalid_relation.rb +61 -0
  181. data/lib/mongoid/errors/invalid_relation_option.rb +28 -0
  182. data/lib/mongoid/errors/invalid_scope.rb +2 -3
  183. data/lib/mongoid/errors/invalid_session_use.rb +21 -0
  184. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -5
  185. data/lib/mongoid/errors/invalid_storage_options.rb +2 -3
  186. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -3
  187. data/lib/mongoid/errors/invalid_time.rb +2 -3
  188. data/lib/mongoid/errors/invalid_value.rb +2 -1
  189. data/lib/mongoid/errors/inverse_not_found.rb +3 -4
  190. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -3
  191. data/lib/mongoid/errors/mixed_relations.rb +2 -3
  192. data/lib/mongoid/errors/mongoid_error.rb +3 -10
  193. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -4
  194. data/lib/mongoid/errors/no_client_config.rb +4 -5
  195. data/lib/mongoid/errors/no_client_database.rb +2 -3
  196. data/lib/mongoid/errors/no_client_hosts.rb +2 -3
  197. data/lib/mongoid/errors/no_clients_config.rb +2 -3
  198. data/lib/mongoid/errors/no_default_client.rb +3 -4
  199. data/lib/mongoid/errors/no_environment.rb +2 -3
  200. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -3
  201. data/lib/mongoid/errors/no_metadata.rb +2 -3
  202. data/lib/mongoid/errors/no_parent.rb +2 -3
  203. data/lib/mongoid/errors/readonly_attribute.rb +2 -3
  204. data/lib/mongoid/errors/readonly_document.rb +3 -6
  205. data/lib/mongoid/errors/scope_overwrite.rb +2 -1
  206. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -0
  207. data/lib/mongoid/errors/unknown_attribute.rb +2 -3
  208. data/lib/mongoid/errors/unknown_model.rb +24 -0
  209. data/lib/mongoid/errors/unsaved_document.rb +3 -2
  210. data/lib/mongoid/errors/unsupported_javascript.rb +2 -3
  211. data/lib/mongoid/errors/validations.rb +2 -1
  212. data/lib/mongoid/errors.rb +18 -1
  213. data/lib/mongoid/evolvable.rb +4 -5
  214. data/lib/mongoid/extensions/array.rb +33 -42
  215. data/lib/mongoid/extensions/big_decimal.rb +17 -17
  216. data/lib/mongoid/extensions/boolean.rb +3 -5
  217. data/lib/mongoid/extensions/date.rb +17 -13
  218. data/lib/mongoid/extensions/date_time.rb +4 -12
  219. data/lib/mongoid/extensions/decimal128.rb +3 -6
  220. data/lib/mongoid/extensions/false_class.rb +4 -7
  221. data/lib/mongoid/extensions/float.rb +5 -10
  222. data/lib/mongoid/extensions/hash.rb +57 -38
  223. data/lib/mongoid/extensions/integer.rb +5 -12
  224. data/lib/mongoid/extensions/module.rb +2 -3
  225. data/lib/mongoid/extensions/nil_class.rb +2 -5
  226. data/lib/mongoid/extensions/object.rb +21 -48
  227. data/lib/mongoid/extensions/object_id.rb +2 -7
  228. data/lib/mongoid/extensions/range.rb +3 -11
  229. data/lib/mongoid/extensions/regexp.rb +4 -4
  230. data/lib/mongoid/extensions/set.rb +2 -7
  231. data/lib/mongoid/extensions/string.rb +27 -44
  232. data/lib/mongoid/extensions/symbol.rb +2 -7
  233. data/lib/mongoid/extensions/time.rb +16 -10
  234. data/lib/mongoid/extensions/time_with_zone.rb +25 -7
  235. data/lib/mongoid/extensions/true_class.rb +4 -7
  236. data/lib/mongoid/extensions.rb +18 -11
  237. data/lib/mongoid/factory.rb +60 -10
  238. data/lib/mongoid/fields/foreign_key.rb +8 -27
  239. data/lib/mongoid/fields/localized.rb +2 -11
  240. data/lib/mongoid/fields/standard.rb +8 -50
  241. data/lib/mongoid/fields/validators/macro.rb +50 -14
  242. data/lib/mongoid/fields/validators.rb +2 -1
  243. data/lib/mongoid/fields.rb +118 -67
  244. data/lib/mongoid/findable.rb +60 -24
  245. data/lib/mongoid/indexable/specification.rb +3 -16
  246. data/lib/mongoid/indexable/validators/options.rb +2 -7
  247. data/lib/mongoid/indexable.rb +26 -36
  248. data/lib/mongoid/inspectable.rb +4 -11
  249. data/lib/mongoid/interceptable.rb +27 -57
  250. data/lib/mongoid/loggable.rb +13 -16
  251. data/lib/mongoid/matchable.rb +5 -146
  252. data/lib/mongoid/matcher/all.rb +22 -0
  253. data/lib/mongoid/matcher/and.rb +21 -0
  254. data/lib/mongoid/matcher/bits.rb +41 -0
  255. data/lib/mongoid/matcher/bits_all_clear.rb +20 -0
  256. data/lib/mongoid/matcher/bits_all_set.rb +20 -0
  257. data/lib/mongoid/matcher/bits_any_clear.rb +20 -0
  258. data/lib/mongoid/matcher/bits_any_set.rb +20 -0
  259. data/lib/mongoid/matcher/elem_match.rb +36 -0
  260. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  261. data/lib/mongoid/matcher/eq.rb +11 -0
  262. data/lib/mongoid/matcher/eq_impl.rb +67 -0
  263. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +26 -0
  264. data/lib/mongoid/matcher/exists.rb +15 -0
  265. data/lib/mongoid/matcher/expression.rb +35 -0
  266. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  267. data/lib/mongoid/matcher/field_expression.rb +62 -0
  268. data/lib/mongoid/matcher/field_operator.rb +54 -0
  269. data/lib/mongoid/matcher/gt.rb +17 -0
  270. data/lib/mongoid/matcher/gte.rb +17 -0
  271. data/lib/mongoid/matcher/in.rb +25 -0
  272. data/lib/mongoid/matcher/lt.rb +17 -0
  273. data/lib/mongoid/matcher/lte.rb +17 -0
  274. data/lib/mongoid/matcher/mod.rb +17 -0
  275. data/lib/mongoid/matcher/ne.rb +16 -0
  276. data/lib/mongoid/matcher/nin.rb +11 -0
  277. data/lib/mongoid/matcher/nor.rb +25 -0
  278. data/lib/mongoid/matcher/not.rb +29 -0
  279. data/lib/mongoid/matcher/or.rb +21 -0
  280. data/lib/mongoid/matcher/regex.rb +41 -0
  281. data/lib/mongoid/matcher/size.rb +26 -0
  282. data/lib/mongoid/matcher/type.rb +99 -0
  283. data/lib/mongoid/matcher.rb +110 -0
  284. data/lib/mongoid/persistable/creatable.rb +9 -24
  285. data/lib/mongoid/persistable/deletable.rb +16 -29
  286. data/lib/mongoid/persistable/destroyable.rb +12 -15
  287. data/lib/mongoid/persistable/incrementable.rb +7 -8
  288. data/lib/mongoid/persistable/logical.rb +5 -7
  289. data/lib/mongoid/persistable/poppable.rb +3 -6
  290. data/lib/mongoid/persistable/pullable.rb +3 -8
  291. data/lib/mongoid/persistable/pushable.rb +14 -10
  292. data/lib/mongoid/persistable/renamable.rb +10 -8
  293. data/lib/mongoid/persistable/savable.rb +3 -8
  294. data/lib/mongoid/persistable/settable.rb +61 -19
  295. data/lib/mongoid/persistable/unsettable.rb +8 -8
  296. data/lib/mongoid/persistable/updatable.rb +38 -33
  297. data/lib/mongoid/persistable/upsertable.rb +5 -9
  298. data/lib/mongoid/persistable.rb +137 -45
  299. data/lib/mongoid/persistence_context.rb +222 -0
  300. data/lib/mongoid/positional.rb +3 -6
  301. data/lib/mongoid/query_cache.rb +141 -110
  302. data/lib/mongoid/railtie.rb +20 -17
  303. data/lib/mongoid/railties/controller_runtime.rb +88 -0
  304. data/lib/mongoid/railties/database.rake +9 -0
  305. data/lib/mongoid/reloadable.rb +14 -19
  306. data/lib/mongoid/scopable.rb +11 -38
  307. data/lib/mongoid/selectable.rb +8 -17
  308. data/lib/mongoid/serializable.rb +29 -34
  309. data/lib/mongoid/shardable.rb +80 -17
  310. data/lib/mongoid/stateful.rb +4 -10
  311. data/lib/mongoid/stringified_symbol.rb +52 -0
  312. data/lib/mongoid/tasks/database.rake +12 -5
  313. data/lib/mongoid/tasks/database.rb +88 -7
  314. data/lib/mongoid/threaded/lifecycle.rb +2 -21
  315. data/lib/mongoid/threaded.rb +70 -49
  316. data/lib/mongoid/timestamps/created/short.rb +2 -1
  317. data/lib/mongoid/timestamps/created.rb +3 -2
  318. data/lib/mongoid/timestamps/short.rb +2 -1
  319. data/lib/mongoid/timestamps/timeless.rb +6 -9
  320. data/lib/mongoid/timestamps/updated/short.rb +2 -1
  321. data/lib/mongoid/timestamps/updated.rb +3 -4
  322. data/lib/mongoid/timestamps.rb +3 -2
  323. data/lib/mongoid/touchable.rb +132 -0
  324. data/lib/mongoid/traversable.rb +181 -61
  325. data/lib/mongoid/validatable/associated.rb +5 -6
  326. data/lib/mongoid/validatable/format.rb +2 -1
  327. data/lib/mongoid/validatable/length.rb +2 -1
  328. data/lib/mongoid/validatable/localizable.rb +2 -3
  329. data/lib/mongoid/validatable/macros.rb +3 -8
  330. data/lib/mongoid/validatable/presence.rb +10 -15
  331. data/lib/mongoid/validatable/queryable.rb +2 -3
  332. data/lib/mongoid/validatable/uniqueness.rb +26 -40
  333. data/lib/mongoid/validatable.rb +16 -35
  334. data/lib/mongoid/version.rb +3 -2
  335. data/lib/mongoid.rb +35 -17
  336. data/lib/rails/generators/mongoid/config/config_generator.rb +10 -2
  337. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +54 -21
  338. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -2
  339. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  340. data/lib/rails/generators/mongoid_generator.rb +2 -1
  341. data/lib/rails/mongoid.rb +4 -5
  342. data/spec/README.md +33 -0
  343. data/spec/config/mongoid.yml +28 -2
  344. data/spec/integration/app_spec.rb +343 -0
  345. data/spec/integration/associations/belongs_to_spec.rb +15 -0
  346. data/spec/integration/associations/embedded_dirty_spec.rb +29 -0
  347. data/spec/integration/associations/embedded_spec.rb +268 -0
  348. data/spec/integration/associations/embeds_many_spec.rb +206 -0
  349. data/spec/integration/associations/embeds_one_spec.rb +23 -0
  350. data/spec/integration/associations/foreign_key_spec.rb +98 -0
  351. data/spec/integration/associations/foreign_key_spec_models.rb +64 -0
  352. data/spec/integration/associations/has_many_spec.rb +128 -0
  353. data/spec/integration/associations/has_one_spec.rb +176 -0
  354. data/spec/integration/associations/nested_attributes_assignment_spec.rb +115 -0
  355. data/spec/integration/associations/reverse_population_spec.rb +34 -0
  356. data/spec/integration/associations/reverse_population_spec_models.rb +36 -0
  357. data/spec/integration/associations/scope_option_spec.rb +101 -0
  358. data/spec/integration/atomic/modifiers_spec.rb +116 -0
  359. data/spec/integration/bson_regexp_raw_spec.rb +19 -0
  360. data/spec/integration/callbacks_models.rb +61 -0
  361. data/spec/integration/callbacks_spec.rb +228 -0
  362. data/spec/integration/contextual/empty_spec.rb +141 -0
  363. data/spec/integration/criteria/alias_query_spec.rb +161 -0
  364. data/spec/integration/criteria/date_field_spec.rb +40 -0
  365. data/spec/integration/criteria/default_scope_spec.rb +72 -0
  366. data/spec/integration/criteria/logical_spec.rb +124 -0
  367. data/spec/integration/criteria/range_spec.rb +265 -0
  368. data/spec/integration/criteria/time_with_zone_spec.rb +142 -0
  369. data/spec/integration/discriminator_key_spec.rb +353 -0
  370. data/spec/integration/discriminator_value_spec.rb +206 -0
  371. data/spec/integration/document_spec.rb +51 -0
  372. data/spec/integration/i18n_fallbacks_spec.rb +89 -0
  373. data/spec/integration/matcher_examples_spec.rb +758 -0
  374. data/spec/integration/matcher_operator_data/all.yml +140 -0
  375. data/spec/integration/matcher_operator_data/and.yml +93 -0
  376. data/spec/integration/matcher_operator_data/bits_all_clear.yml +159 -0
  377. data/spec/integration/matcher_operator_data/bits_all_set.yml +159 -0
  378. data/spec/integration/matcher_operator_data/bits_any_clear.yml +159 -0
  379. data/spec/integration/matcher_operator_data/bits_any_set.yml +159 -0
  380. data/spec/integration/matcher_operator_data/comment.yml +22 -0
  381. data/spec/integration/matcher_operator_data/elem_match.yml +409 -0
  382. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  383. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  384. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  385. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  386. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  387. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  388. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  389. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  390. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  391. data/spec/integration/matcher_operator_data/implicit_traversal.yml +112 -0
  392. data/spec/integration/matcher_operator_data/in.yml +210 -0
  393. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  394. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  395. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  396. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  397. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  398. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  399. data/spec/integration/matcher_operator_data/mod.yml +55 -0
  400. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  401. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  402. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  403. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  404. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  405. data/spec/integration/matcher_operator_data/not.yml +196 -0
  406. data/spec/integration/matcher_operator_data/or.yml +137 -0
  407. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  408. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  409. data/spec/integration/matcher_operator_data/size.yml +174 -0
  410. data/spec/integration/matcher_operator_data/type.yml +70 -0
  411. data/spec/integration/matcher_operator_data/type_array.yml +16 -0
  412. data/spec/integration/matcher_operator_data/type_binary.yml +18 -0
  413. data/spec/integration/matcher_operator_data/type_boolean.yml +39 -0
  414. data/spec/integration/matcher_operator_data/type_code.yml +26 -0
  415. data/spec/integration/matcher_operator_data/type_code_with_scope.yml +26 -0
  416. data/spec/integration/matcher_operator_data/type_date.yml +39 -0
  417. data/spec/integration/matcher_operator_data/type_db_pointer.yml +19 -0
  418. data/spec/integration/matcher_operator_data/type_decimal.yml +40 -0
  419. data/spec/integration/matcher_operator_data/type_double.yml +15 -0
  420. data/spec/integration/matcher_operator_data/type_int32.yml +33 -0
  421. data/spec/integration/matcher_operator_data/type_int64.yml +33 -0
  422. data/spec/integration/matcher_operator_data/type_max_key.yml +17 -0
  423. data/spec/integration/matcher_operator_data/type_min_key.yml +17 -0
  424. data/spec/integration/matcher_operator_data/type_null.yml +23 -0
  425. data/spec/integration/matcher_operator_data/type_object.yml +23 -0
  426. data/spec/integration/matcher_operator_data/type_object_id.yml +25 -0
  427. data/spec/integration/matcher_operator_data/type_regex.yml +44 -0
  428. data/spec/integration/matcher_operator_data/type_string.yml +15 -0
  429. data/spec/integration/matcher_operator_data/type_symbol.yml +32 -0
  430. data/spec/integration/matcher_operator_data/type_timestamp.yml +25 -0
  431. data/spec/integration/matcher_operator_data/type_undefined.yml +17 -0
  432. data/spec/integration/matcher_operator_spec.rb +124 -0
  433. data/spec/integration/matcher_spec.rb +283 -0
  434. data/spec/integration/server_query_spec.rb +141 -0
  435. data/spec/integration/shardable_spec.rb +148 -0
  436. data/spec/integration/stringified_symbol_field_spec.rb +203 -0
  437. data/spec/lite_spec_helper.rb +83 -0
  438. data/spec/mongoid/association/accessors_spec.rb +1067 -0
  439. data/spec/mongoid/association/auto_save_spec.rb +403 -0
  440. data/spec/mongoid/association/builders_spec.rb +255 -0
  441. data/spec/mongoid/association/constrainable_spec.rb +117 -0
  442. data/spec/mongoid/association/counter_cache_spec.rb +452 -0
  443. data/spec/mongoid/association/depending_spec.rb +959 -0
  444. data/spec/mongoid/association/eager_spec.rb +281 -0
  445. data/spec/mongoid/association/embedded/cyclic_spec.rb +180 -0
  446. data/spec/mongoid/association/embedded/dirty_spec.rb +67 -0
  447. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +173 -0
  448. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +36 -0
  449. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +559 -0
  450. data/spec/mongoid/association/embedded/embedded_in_spec.rb +903 -0
  451. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +56 -0
  452. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +106 -0
  453. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +4652 -0
  454. data/spec/mongoid/association/embedded/embeds_many_models.rb +69 -0
  455. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +51 -0
  456. data/spec/mongoid/association/embedded/embeds_many_spec.rb +864 -0
  457. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +79 -0
  458. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +81 -0
  459. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +1025 -0
  460. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +8 -0
  461. data/spec/mongoid/association/embedded/embeds_one_models.rb +54 -0
  462. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +28 -0
  463. data/spec/mongoid/association/embedded/embeds_one_spec.rb +956 -0
  464. data/spec/mongoid/association/macros_spec.rb +1116 -0
  465. data/spec/mongoid/association/nested/many_spec.rb +232 -0
  466. data/spec/mongoid/association/nested/one_spec.rb +253 -0
  467. data/spec/mongoid/association/options_spec.rb +1323 -0
  468. data/spec/mongoid/association/polymorphic_spec.rb +162 -0
  469. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +243 -0
  470. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +238 -0
  471. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +412 -0
  472. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +1373 -0
  473. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +57 -0
  474. data/spec/mongoid/association/referenced/belongs_to_spec.rb +2046 -0
  475. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +180 -0
  476. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +148 -0
  477. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +196 -0
  478. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +76 -0
  479. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +3773 -0
  480. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +67 -0
  481. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +39 -0
  482. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +1071 -0
  483. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +155 -0
  484. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +142 -0
  485. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +290 -0
  486. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2232 -0
  487. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +23 -0
  488. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4092 -0
  489. data/spec/mongoid/association/referenced/has_many_models.rb +95 -0
  490. data/spec/mongoid/association/referenced/has_many_query_spec.rb +37 -0
  491. data/spec/mongoid/association/referenced/has_many_spec.rb +1248 -0
  492. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +133 -0
  493. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +159 -0
  494. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +193 -0
  495. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +1142 -0
  496. data/spec/mongoid/association/referenced/has_one_models.rb +97 -0
  497. data/spec/mongoid/association/referenced/has_one_query_spec.rb +37 -0
  498. data/spec/mongoid/association/referenced/has_one_spec.rb +1383 -0
  499. data/spec/mongoid/association/reflections_spec.rb +92 -0
  500. data/spec/mongoid/association/syncable_spec.rb +499 -0
  501. data/spec/mongoid/association_spec.rb +191 -0
  502. data/spec/mongoid/atomic/modifiers_spec.rb +52 -3
  503. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +2 -0
  504. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +2 -0
  505. data/spec/mongoid/atomic/paths/root_spec.rb +2 -0
  506. data/spec/mongoid/atomic/paths_spec.rb +107 -12
  507. data/spec/mongoid/atomic_spec.rb +36 -11
  508. data/spec/mongoid/attributes/dynamic_spec.rb +152 -0
  509. data/spec/mongoid/attributes/nested_spec.rb +115 -91
  510. data/spec/mongoid/attributes/projector_data/embedded.yml +105 -0
  511. data/spec/mongoid/attributes/projector_data/fields.yml +93 -0
  512. data/spec/mongoid/attributes/projector_spec.rb +44 -0
  513. data/spec/mongoid/attributes/readonly_spec.rb +111 -111
  514. data/spec/mongoid/attributes_spec.rb +501 -33
  515. data/spec/mongoid/cacheable_spec.rb +114 -0
  516. data/spec/mongoid/changeable_spec.rb +118 -35
  517. data/spec/mongoid/clients/factory_spec.rb +176 -34
  518. data/spec/mongoid/clients/options_spec.rb +431 -98
  519. data/spec/mongoid/clients/sessions_spec.rb +335 -0
  520. data/spec/mongoid/clients/transactions_spec.rb +415 -0
  521. data/spec/mongoid/clients_spec.rb +318 -114
  522. data/spec/mongoid/composable_spec.rb +9 -0
  523. data/spec/mongoid/config/environment_spec.rb +88 -8
  524. data/spec/mongoid/config/options_spec.rb +22 -3
  525. data/spec/mongoid/config_spec.rb +371 -13
  526. data/spec/mongoid/contextual/aggregable/memory_spec.rb +53 -11
  527. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +122 -20
  528. data/spec/mongoid/contextual/aggregable/none_spec.rb +60 -0
  529. data/spec/mongoid/contextual/atomic_spec.rb +245 -84
  530. data/spec/mongoid/contextual/geo_near_spec.rb +31 -19
  531. data/spec/mongoid/contextual/map_reduce_spec.rb +24 -7
  532. data/spec/mongoid/contextual/memory_spec.rb +44 -23
  533. data/spec/mongoid/contextual/mongo_spec.rb +780 -155
  534. data/spec/mongoid/contextual/none_spec.rb +14 -71
  535. data/spec/mongoid/copyable_spec.rb +297 -23
  536. data/spec/mongoid/copyable_spec_models.rb +47 -0
  537. data/spec/mongoid/criteria/findable_spec.rb +77 -20
  538. data/spec/mongoid/criteria/inspectable_spec.rb +2 -0
  539. data/spec/mongoid/criteria/marshalable_spec.rb +2 -0
  540. data/spec/mongoid/criteria/modifiable_spec.rb +506 -50
  541. data/spec/mongoid/criteria/options_spec.rb +31 -0
  542. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +372 -0
  543. data/spec/mongoid/criteria/queryable/expandable_spec.rb +61 -0
  544. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +525 -0
  545. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +61 -0
  546. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +60 -0
  547. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +215 -0
  548. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +332 -0
  549. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +423 -0
  550. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +60 -0
  551. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +67 -0
  552. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +329 -0
  553. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +67 -0
  554. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +79 -0
  555. data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +53 -0
  556. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +110 -0
  557. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +370 -0
  558. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +91 -0
  559. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +92 -0
  560. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +41 -0
  561. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +347 -0
  562. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +169 -0
  563. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +395 -0
  564. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +376 -0
  565. data/spec/mongoid/criteria/queryable/key_spec.rb +96 -0
  566. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +182 -0
  567. data/spec/mongoid/criteria/queryable/optional_spec.rb +1801 -0
  568. data/spec/mongoid/criteria/queryable/options_spec.rb +362 -0
  569. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +214 -0
  570. data/spec/mongoid/criteria/queryable/queryable_spec.rb +139 -0
  571. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +2069 -0
  572. data/spec/mongoid/criteria/queryable/selectable_shared_examples.rb +38 -0
  573. data/spec/mongoid/criteria/queryable/selectable_spec.rb +2297 -0
  574. data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +589 -0
  575. data/spec/mongoid/criteria/queryable/selector_spec.rb +883 -0
  576. data/spec/mongoid/criteria/queryable/smash_spec.rb +32 -0
  577. data/spec/mongoid/criteria/queryable/storable_spec.rb +226 -0
  578. data/spec/mongoid/criteria/scopable_spec.rb +210 -0
  579. data/spec/mongoid/criteria_projection_spec.rb +410 -0
  580. data/spec/mongoid/criteria_spec.rb +876 -402
  581. data/spec/mongoid/document_fields_spec.rb +113 -0
  582. data/spec/mongoid/document_persistence_context_spec.rb +32 -0
  583. data/spec/mongoid/document_query_spec.rb +89 -0
  584. data/spec/mongoid/document_spec.rb +214 -104
  585. data/spec/mongoid/equality_spec.rb +144 -41
  586. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +5 -3
  587. data/spec/mongoid/errors/callback_spec.rb +2 -0
  588. data/spec/mongoid/errors/delete_restriction_spec.rb +4 -2
  589. data/spec/mongoid/errors/document_not_destroyed_spec.rb +2 -0
  590. data/spec/mongoid/errors/document_not_found_spec.rb +2 -0
  591. data/spec/mongoid/errors/eager_load_spec.rb +2 -0
  592. data/spec/mongoid/errors/invalid_collection_spec.rb +2 -0
  593. data/spec/mongoid/errors/invalid_config_file_spec.rb +31 -0
  594. data/spec/mongoid/errors/invalid_config_option_spec.rb +2 -0
  595. data/spec/mongoid/errors/invalid_field_option_spec.rb +2 -0
  596. data/spec/mongoid/errors/invalid_field_spec.rb +2 -0
  597. data/spec/mongoid/errors/invalid_find_spec.rb +2 -0
  598. data/spec/mongoid/errors/invalid_includes_spec.rb +2 -0
  599. data/spec/mongoid/errors/invalid_index_spec.rb +2 -0
  600. data/spec/mongoid/errors/invalid_options_spec.rb +4 -2
  601. data/spec/mongoid/errors/invalid_path_spec.rb +2 -0
  602. data/spec/mongoid/errors/invalid_relation_spec.rb +39 -0
  603. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -1
  604. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +2 -0
  605. data/spec/mongoid/errors/invalid_storage_options_spec.rb +2 -0
  606. data/spec/mongoid/errors/invalid_time_spec.rb +2 -0
  607. data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -1
  608. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +2 -0
  609. data/spec/mongoid/errors/mixed_relations_spec.rb +2 -0
  610. data/spec/mongoid/errors/mongoid_error_spec.rb +28 -11
  611. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +5 -3
  612. data/spec/mongoid/errors/no_client_config_spec.rb +4 -2
  613. data/spec/mongoid/errors/no_client_database_spec.rb +5 -3
  614. data/spec/mongoid/errors/no_client_hosts_spec.rb +5 -3
  615. data/spec/mongoid/errors/no_clients_config_spec.rb +2 -0
  616. data/spec/mongoid/errors/no_environment_spec.rb +2 -0
  617. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +2 -0
  618. data/spec/mongoid/errors/no_metadata_spec.rb +4 -2
  619. data/spec/mongoid/errors/no_parent_spec.rb +3 -1
  620. data/spec/mongoid/errors/readonly_attribute_spec.rb +2 -0
  621. data/spec/mongoid/errors/readonly_document_spec.rb +2 -0
  622. data/spec/mongoid/errors/scope_overwrite_spec.rb +2 -0
  623. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +2 -0
  624. data/spec/mongoid/errors/unknown_attribute_spec.rb +4 -2
  625. data/spec/mongoid/errors/unsaved_document_spec.rb +3 -1
  626. data/spec/mongoid/errors/unsupported_javascript_spec.rb +2 -0
  627. data/spec/mongoid/errors/validations_spec.rb +2 -0
  628. data/spec/mongoid/extensions/array_spec.rb +36 -58
  629. data/spec/mongoid/extensions/big_decimal_spec.rb +323 -19
  630. data/spec/mongoid/extensions/binary_spec.rb +2 -0
  631. data/spec/mongoid/extensions/boolean_spec.rb +16 -0
  632. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +335 -0
  633. data/spec/mongoid/extensions/date_spec.rb +8 -164
  634. data/spec/mongoid/extensions/date_time_spec.rb +19 -66
  635. data/spec/mongoid/extensions/decimal128_spec.rb +3 -1
  636. data/spec/mongoid/extensions/false_class_spec.rb +3 -1
  637. data/spec/mongoid/extensions/float_spec.rb +25 -4
  638. data/spec/mongoid/extensions/hash_spec.rb +138 -1
  639. data/spec/mongoid/extensions/integer_spec.rb +22 -3
  640. data/spec/mongoid/extensions/module_spec.rb +2 -0
  641. data/spec/mongoid/extensions/nil_class_spec.rb +2 -0
  642. data/spec/mongoid/extensions/object_id_spec.rb +2 -0
  643. data/spec/mongoid/extensions/object_spec.rb +27 -31
  644. data/spec/mongoid/extensions/range_spec.rb +9 -0
  645. data/spec/mongoid/extensions/regexp_spec.rb +25 -0
  646. data/spec/mongoid/extensions/set_spec.rb +2 -0
  647. data/spec/mongoid/extensions/string_spec.rb +113 -31
  648. data/spec/mongoid/extensions/stringified_symbol_spec.rb +84 -0
  649. data/spec/mongoid/extensions/symbol_spec.rb +2 -0
  650. data/spec/mongoid/extensions/time_spec.rb +31 -6
  651. data/spec/mongoid/extensions/time_with_zone_spec.rb +35 -6
  652. data/spec/mongoid/extensions/true_class_spec.rb +3 -1
  653. data/spec/mongoid/extensions_spec.rb +16 -2
  654. data/spec/mongoid/factory_spec.rb +304 -15
  655. data/spec/mongoid/fields/foreign_key_spec.rb +26 -32
  656. data/spec/mongoid/fields/localized_spec.rb +6 -4
  657. data/spec/mongoid/fields/standard_spec.rb +2 -0
  658. data/spec/mongoid/fields_spec.rb +420 -38
  659. data/spec/mongoid/findable_spec.rb +98 -19
  660. data/spec/mongoid/indexable/specification_spec.rb +2 -0
  661. data/spec/mongoid/indexable_spec.rb +69 -17
  662. data/spec/mongoid/inspectable_spec.rb +39 -2
  663. data/spec/mongoid/interceptable_spec.rb +273 -114
  664. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  665. data/spec/mongoid/loggable_spec.rb +2 -0
  666. data/spec/mongoid/matcher/extract_attribute_data/numeric_keys.yml +104 -0
  667. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
  668. data/spec/mongoid/matcher/extract_attribute_spec.rb +40 -0
  669. data/spec/mongoid/persistable/creatable_spec.rb +119 -29
  670. data/spec/mongoid/persistable/deletable_spec.rb +307 -11
  671. data/spec/mongoid/persistable/destroyable_spec.rb +225 -12
  672. data/spec/mongoid/persistable/incrementable_spec.rb +29 -13
  673. data/spec/mongoid/persistable/logical_spec.rb +19 -3
  674. data/spec/mongoid/persistable/poppable_spec.rb +19 -3
  675. data/spec/mongoid/persistable/pullable_spec.rb +36 -6
  676. data/spec/mongoid/persistable/pushable_spec.rb +91 -7
  677. data/spec/mongoid/persistable/renamable_spec.rb +18 -2
  678. data/spec/mongoid/persistable/savable_spec.rb +218 -50
  679. data/spec/mongoid/persistable/settable_spec.rb +213 -32
  680. data/spec/mongoid/persistable/unsettable_spec.rb +19 -3
  681. data/spec/mongoid/persistable/updatable_spec.rb +222 -21
  682. data/spec/mongoid/persistable/upsertable_spec.rb +4 -2
  683. data/spec/mongoid/persistable_spec.rb +116 -25
  684. data/spec/mongoid/persistence_context_spec.rb +696 -0
  685. data/spec/mongoid/positional_spec.rb +3 -1
  686. data/spec/mongoid/query_cache_middleware_spec.rb +68 -0
  687. data/spec/mongoid/query_cache_spec.rb +647 -45
  688. data/spec/mongoid/relations/proxy_spec.rb +126 -98
  689. data/spec/mongoid/reloadable_spec.rb +346 -17
  690. data/spec/mongoid/scopable_spec.rb +82 -22
  691. data/spec/mongoid/selectable_spec.rb +8 -6
  692. data/spec/mongoid/serializable_spec.rb +160 -79
  693. data/spec/mongoid/shardable_models.rb +61 -0
  694. data/spec/mongoid/shardable_spec.rb +145 -26
  695. data/spec/mongoid/stateful_spec.rb +3 -1
  696. data/spec/mongoid/tasks/database_rake_spec.rb +15 -13
  697. data/spec/mongoid/tasks/database_spec.rb +3 -1
  698. data/spec/mongoid/threaded_spec.rb +72 -2
  699. data/spec/mongoid/timestamps/created/short_spec.rb +3 -1
  700. data/spec/mongoid/timestamps/created_spec.rb +3 -1
  701. data/spec/mongoid/timestamps/timeless_spec.rb +4 -2
  702. data/spec/mongoid/timestamps/updated/short_spec.rb +5 -3
  703. data/spec/mongoid/timestamps/updated_spec.rb +5 -3
  704. data/spec/mongoid/timestamps_spec.rb +8 -6
  705. data/spec/mongoid/touchable_spec.rb +588 -0
  706. data/spec/mongoid/touchable_spec_models.rb +53 -0
  707. data/spec/mongoid/traversable_spec.rb +1167 -1
  708. data/spec/mongoid/validatable/associated_spec.rb +3 -1
  709. data/spec/mongoid/validatable/format_spec.rb +2 -0
  710. data/spec/mongoid/validatable/length_spec.rb +2 -0
  711. data/spec/mongoid/validatable/numericality_spec.rb +2 -0
  712. data/spec/mongoid/validatable/presence_spec.rb +33 -26
  713. data/spec/mongoid/validatable/uniqueness_spec.rb +119 -81
  714. data/spec/mongoid/validatable_spec.rb +21 -3
  715. data/spec/mongoid_spec.rb +2 -0
  716. data/spec/rails/controller_extension/controller_runtime_spec.rb +112 -0
  717. data/spec/rails/mongoid_spec.rb +4 -2
  718. data/spec/shared/LICENSE +20 -0
  719. data/spec/shared/bin/get-mongodb-download-url +17 -0
  720. data/spec/shared/bin/s3-copy +45 -0
  721. data/spec/shared/bin/s3-upload +69 -0
  722. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  723. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  724. data/spec/shared/lib/mrss/constraints.rb +386 -0
  725. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  726. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  727. data/spec/shared/lib/mrss/lite_constraints.rb +199 -0
  728. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  729. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  730. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  731. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  732. data/spec/shared/lib/mrss/utils.rb +15 -0
  733. data/spec/shared/share/Dockerfile.erb +339 -0
  734. data/spec/shared/share/haproxy-1.conf +16 -0
  735. data/spec/shared/share/haproxy-2.conf +17 -0
  736. data/spec/shared/shlib/distro.sh +74 -0
  737. data/spec/shared/shlib/server.sh +379 -0
  738. data/spec/shared/shlib/set_env.sh +132 -0
  739. data/spec/spec_helper.rb +133 -53
  740. data/spec/support/authorization.rb +2 -0
  741. data/spec/support/client_registry.rb +9 -0
  742. data/spec/support/constraints.rb +53 -0
  743. data/spec/support/expectations.rb +21 -3
  744. data/spec/support/helpers.rb +11 -0
  745. data/spec/support/macros.rb +42 -0
  746. data/spec/support/models/account.rb +38 -0
  747. data/spec/support/models/acolyte.rb +19 -0
  748. data/spec/support/models/actor.rb +20 -0
  749. data/spec/support/models/actress.rb +4 -0
  750. data/spec/support/models/address.rb +85 -0
  751. data/spec/support/models/address_component.rb +7 -0
  752. data/spec/support/models/address_number.rb +8 -0
  753. data/spec/support/models/agency.rb +7 -0
  754. data/spec/support/models/agent.rb +18 -0
  755. data/spec/support/models/album.rb +20 -0
  756. data/spec/support/models/alert.rb +9 -0
  757. data/spec/support/models/animal.rb +28 -0
  758. data/spec/support/models/answer.rb +8 -0
  759. data/spec/support/models/appointment.rb +9 -0
  760. data/spec/support/models/armrest.rb +9 -0
  761. data/spec/support/models/array_field.rb +7 -0
  762. data/spec/support/models/article.rb +14 -0
  763. data/spec/support/models/artist.rb +91 -0
  764. data/spec/support/models/artwork.rb +6 -0
  765. data/spec/support/models/audible_sound.rb +3 -0
  766. data/spec/support/models/audio.rb +7 -0
  767. data/spec/support/models/augmentation.rb +13 -0
  768. data/spec/support/models/author.rb +8 -0
  769. data/spec/support/models/baby.rb +6 -0
  770. data/spec/support/models/band.rb +37 -0
  771. data/spec/support/models/bar.rb +12 -0
  772. data/spec/support/models/basic.rb +8 -0
  773. data/spec/support/models/bed.rb +3 -0
  774. data/spec/support/models/big_palette.rb +4 -0
  775. data/spec/support/models/birthday.rb +15 -0
  776. data/spec/support/models/bolt.rb +7 -0
  777. data/spec/support/models/bomb.rb +6 -0
  778. data/spec/support/models/book.rb +18 -0
  779. data/spec/support/models/breed.rb +6 -0
  780. data/spec/support/models/browser.rb +8 -0
  781. data/spec/support/models/building.rb +8 -0
  782. data/spec/support/models/building_address.rb +9 -0
  783. data/spec/support/models/bus.rb +9 -0
  784. data/spec/support/models/business.rb +7 -0
  785. data/spec/support/models/callback_test.rb +11 -0
  786. data/spec/support/models/canvas.rb +27 -0
  787. data/spec/support/models/car.rb +3 -0
  788. data/spec/support/models/cat.rb +10 -0
  789. data/spec/support/models/category.rb +10 -0
  790. data/spec/support/models/child.rb +6 -0
  791. data/spec/support/models/child_doc.rb +24 -0
  792. data/spec/support/models/church.rb +8 -0
  793. data/spec/support/models/circle.rb +5 -0
  794. data/spec/support/models/circuit.rb +6 -0
  795. data/spec/support/models/circus.rb +9 -0
  796. data/spec/support/models/code.rb +13 -0
  797. data/spec/support/models/coding/pull_request.rb +11 -0
  798. data/spec/support/models/coding.rb +3 -0
  799. data/spec/support/models/comment.rb +18 -0
  800. data/spec/support/models/company.rb +7 -0
  801. data/spec/support/models/consumption_period.rb +9 -0
  802. data/spec/support/models/contextable_item.rb +7 -0
  803. data/spec/support/models/contractor.rb +7 -0
  804. data/spec/support/models/cookie.rb +8 -0
  805. data/spec/support/models/country_code.rb +12 -0
  806. data/spec/support/models/courier_job.rb +6 -0
  807. data/spec/support/models/crate.rb +12 -0
  808. data/spec/support/models/customer.rb +10 -0
  809. data/spec/support/models/customer_address.rb +11 -0
  810. data/spec/support/models/deed.rb +7 -0
  811. data/spec/support/models/definition.rb +11 -0
  812. data/spec/support/models/delegating_patient.rb +15 -0
  813. data/spec/support/models/description.rb +13 -0
  814. data/spec/support/models/dictionary.rb +18 -0
  815. data/spec/support/models/division.rb +12 -0
  816. data/spec/support/models/doctor.rb +14 -0
  817. data/spec/support/models/dog.rb +9 -0
  818. data/spec/support/models/dokument.rb +8 -0
  819. data/spec/support/models/draft.rb +11 -0
  820. data/spec/support/models/dragon.rb +6 -0
  821. data/spec/support/models/driver.rb +9 -0
  822. data/spec/support/models/drug.rb +8 -0
  823. data/spec/support/models/dungeon.rb +6 -0
  824. data/spec/support/models/edit.rb +7 -0
  825. data/spec/support/models/email.rb +8 -0
  826. data/spec/support/models/employer.rb +7 -0
  827. data/spec/support/models/entry.rb +8 -0
  828. data/spec/support/models/eraser.rb +3 -0
  829. data/spec/support/models/even.rb +9 -0
  830. data/spec/support/models/event.rb +24 -0
  831. data/spec/support/models/exhibition.rb +6 -0
  832. data/spec/support/models/exhibitor.rb +8 -0
  833. data/spec/support/models/explosion.rb +6 -0
  834. data/spec/support/models/eye.rb +11 -0
  835. data/spec/support/models/eye_bowl.rb +11 -0
  836. data/spec/support/models/face.rb +10 -0
  837. data/spec/support/models/favorite.rb +8 -0
  838. data/spec/support/models/filesystem.rb +7 -0
  839. data/spec/support/models/fire_hydrant.rb +8 -0
  840. data/spec/support/models/firefox.rb +6 -0
  841. data/spec/support/models/fish.rb +9 -0
  842. data/spec/support/models/folder.rb +9 -0
  843. data/spec/support/models/folder_item.rb +11 -0
  844. data/spec/support/models/fruits.rb +36 -0
  845. data/spec/support/models/game.rb +21 -0
  846. data/spec/support/models/ghost.rb +9 -0
  847. data/spec/support/models/guitar.rb +4 -0
  848. data/spec/support/models/hole.rb +12 -0
  849. data/spec/support/models/home.rb +6 -0
  850. data/spec/support/models/house.rb +8 -0
  851. data/spec/support/models/html_writer.rb +5 -0
  852. data/spec/support/models/id_key.rb +8 -0
  853. data/spec/support/models/idnodef.rb +7 -0
  854. data/spec/support/models/image.rb +24 -0
  855. data/spec/support/models/implant.rb +18 -0
  856. data/spec/support/models/instrument.rb +8 -0
  857. data/spec/support/models/item.rb +10 -0
  858. data/spec/support/models/jar.rb +9 -0
  859. data/spec/support/models/kaleidoscope.rb +8 -0
  860. data/spec/support/models/kangaroo.rb +6 -0
  861. data/spec/support/models/label.rb +50 -0
  862. data/spec/support/models/language.rb +7 -0
  863. data/spec/support/models/lat_lng.rb +17 -0
  864. data/spec/support/models/league.rb +13 -0
  865. data/spec/support/models/learner.rb +4 -0
  866. data/spec/support/models/line_item.rb +8 -0
  867. data/spec/support/models/location.rb +10 -0
  868. data/spec/support/models/login.rb +10 -0
  869. data/spec/support/models/manufacturer.rb +9 -0
  870. data/spec/support/models/meat.rb +6 -0
  871. data/spec/support/models/membership.rb +6 -0
  872. data/spec/support/models/message.rb +13 -0
  873. data/spec/support/models/minim.rb +6 -0
  874. data/spec/support/models/mixed_drink.rb +6 -0
  875. data/spec/support/models/mop.rb +24 -0
  876. data/spec/support/models/movie.rb +15 -0
  877. data/spec/support/models/my_hash.rb +4 -0
  878. data/spec/support/models/name.rb +26 -0
  879. data/spec/support/models/name_only.rb +8 -0
  880. data/spec/support/models/node.rb +7 -0
  881. data/spec/support/models/note.rb +19 -0
  882. data/spec/support/models/nut.rb +7 -0
  883. data/spec/support/models/odd.rb +9 -0
  884. data/spec/support/models/order.rb +12 -0
  885. data/spec/support/models/ordered_post.rb +13 -0
  886. data/spec/support/models/ordered_preference.rb +8 -0
  887. data/spec/support/models/oscar.rb +16 -0
  888. data/spec/support/models/other_owner_object.rb +4 -0
  889. data/spec/support/models/override.rb +18 -0
  890. data/spec/support/models/ownable.rb +8 -0
  891. data/spec/support/models/owner.rb +10 -0
  892. data/spec/support/models/pack.rb +5 -0
  893. data/spec/support/models/page.rb +18 -0
  894. data/spec/support/models/page_question.rb +6 -0
  895. data/spec/support/models/palette.rb +9 -0
  896. data/spec/support/models/parent.rb +7 -0
  897. data/spec/support/models/parent_doc.rb +8 -0
  898. data/spec/support/models/passport.rb +13 -0
  899. data/spec/support/models/patient.rb +11 -0
  900. data/spec/support/models/pdf_writer.rb +5 -0
  901. data/spec/support/models/pencil.rb +3 -0
  902. data/spec/support/models/person.rb +230 -0
  903. data/spec/support/models/pet.rb +25 -0
  904. data/spec/support/models/pet_owner.rb +8 -0
  905. data/spec/support/models/phone.rb +13 -0
  906. data/spec/support/models/piano.rb +4 -0
  907. data/spec/support/models/pizza.rb +9 -0
  908. data/spec/support/models/player.rb +37 -0
  909. data/spec/support/models/post.rb +52 -0
  910. data/spec/support/models/post_genre.rb +8 -0
  911. data/spec/support/models/powerup.rb +13 -0
  912. data/spec/support/models/preference.rb +11 -0
  913. data/spec/support/models/princess.rb +12 -0
  914. data/spec/support/models/product.rb +19 -0
  915. data/spec/support/models/profile.rb +17 -0
  916. data/spec/support/models/pronunciation.rb +7 -0
  917. data/spec/support/models/pub.rb +8 -0
  918. data/spec/support/models/publication/encyclopedia.rb +11 -0
  919. data/spec/support/models/publication/review.rb +13 -0
  920. data/spec/support/models/publication.rb +4 -0
  921. data/spec/support/models/purchase.rb +6 -0
  922. data/spec/support/models/purchased_item.rb +10 -0
  923. data/spec/support/models/question.rb +10 -0
  924. data/spec/support/models/quiz.rb +9 -0
  925. data/spec/support/models/rating.rb +10 -0
  926. data/spec/support/models/record.rb +54 -0
  927. data/spec/support/models/registry.rb +6 -0
  928. data/spec/support/models/role.rb +9 -0
  929. data/spec/support/models/root_category.rb +6 -0
  930. data/spec/support/models/sandwich.rb +11 -0
  931. data/spec/support/models/scheduler.rb +9 -0
  932. data/spec/support/models/scribe.rb +7 -0
  933. data/spec/support/models/sealer.rb +7 -0
  934. data/spec/support/models/seat.rb +24 -0
  935. data/spec/support/models/seo.rb +9 -0
  936. data/spec/support/models/series.rb +7 -0
  937. data/spec/support/models/server.rb +15 -0
  938. data/spec/support/models/service.rb +24 -0
  939. data/spec/support/models/shape.rb +14 -0
  940. data/spec/support/models/shelf.rb +7 -0
  941. data/spec/support/models/shipment_address.rb +5 -0
  942. data/spec/support/models/shipping_container.rb +7 -0
  943. data/spec/support/models/shipping_pack.rb +5 -0
  944. data/spec/support/models/shirt.rb +11 -0
  945. data/spec/support/models/shop.rb +8 -0
  946. data/spec/support/models/short_agent.rb +6 -0
  947. data/spec/support/models/short_quiz.rb +7 -0
  948. data/spec/support/models/simple.rb +7 -0
  949. data/spec/support/models/slave.rb +8 -0
  950. data/spec/support/models/song.rb +10 -0
  951. data/spec/support/models/sound.rb +7 -0
  952. data/spec/support/models/spacer.rb +7 -0
  953. data/spec/support/models/square.rb +6 -0
  954. data/spec/support/models/staff.rb +9 -0
  955. data/spec/support/models/store_as_dup_test1.rb +7 -0
  956. data/spec/support/models/store_as_dup_test2.rb +7 -0
  957. data/spec/support/models/store_as_dup_test3.rb +7 -0
  958. data/spec/support/models/store_as_dup_test4.rb +7 -0
  959. data/spec/support/models/strategy.rb +5 -0
  960. data/spec/support/models/sub_item.rb +5 -0
  961. data/spec/support/models/subscription.rb +7 -0
  962. data/spec/support/models/survey.rb +7 -0
  963. data/spec/support/models/symptom.rb +8 -0
  964. data/spec/support/models/system_role.rb +7 -0
  965. data/spec/support/models/tag.rb +10 -0
  966. data/spec/support/models/target.rb +7 -0
  967. data/spec/support/models/template.rb +7 -0
  968. data/spec/support/models/thing.rb +11 -0
  969. data/spec/support/models/threadlocker.rb +7 -0
  970. data/spec/support/models/title.rb +5 -0
  971. data/spec/support/models/tool.rb +10 -0
  972. data/spec/support/models/topping.rb +7 -0
  973. data/spec/support/models/toy.rb +9 -0
  974. data/spec/support/models/track.rb +40 -0
  975. data/spec/support/models/translation.rb +7 -0
  976. data/spec/support/models/tree.rb +11 -0
  977. data/spec/support/models/truck.rb +7 -0
  978. data/spec/support/models/updatable.rb +7 -0
  979. data/spec/support/models/user.rb +23 -0
  980. data/spec/support/models/user_account.rb +12 -0
  981. data/spec/support/models/validation_callback.rb +12 -0
  982. data/spec/support/models/vehicle.rb +18 -0
  983. data/spec/support/models/version.rb +7 -0
  984. data/spec/support/models/vertex.rb +8 -0
  985. data/spec/support/models/vet_visit.rb +7 -0
  986. data/spec/support/models/video.rb +15 -0
  987. data/spec/support/models/video_game.rb +3 -0
  988. data/spec/support/models/washer.rb +7 -0
  989. data/spec/support/models/weapon.rb +13 -0
  990. data/spec/support/models/wiki_page.rb +17 -0
  991. data/spec/support/models/word.rb +17 -0
  992. data/spec/support/models/word_origin.rb +13 -0
  993. data/spec/support/models/writer.rb +13 -0
  994. data/spec/support/shared/time.rb +53 -0
  995. data/spec/support/spec_config.rb +60 -0
  996. data.tar.gz.sig +0 -0
  997. metadata +1347 -813
  998. metadata.gz.sig +0 -0
  999. data/lib/mongoid/clients/thread_options.rb +0 -19
  1000. data/lib/mongoid/extensions/origin/regexp_raw.rb +0 -43
  1001. data/lib/mongoid/matchable/all.rb +0 -27
  1002. data/lib/mongoid/matchable/and.rb +0 -30
  1003. data/lib/mongoid/matchable/default.rb +0 -72
  1004. data/lib/mongoid/matchable/exists.rb +0 -23
  1005. data/lib/mongoid/matchable/gt.rb +0 -21
  1006. data/lib/mongoid/matchable/gte.rb +0 -21
  1007. data/lib/mongoid/matchable/in.rb +0 -24
  1008. data/lib/mongoid/matchable/lt.rb +0 -21
  1009. data/lib/mongoid/matchable/lte.rb +0 -21
  1010. data/lib/mongoid/matchable/ne.rb +0 -21
  1011. data/lib/mongoid/matchable/nin.rb +0 -22
  1012. data/lib/mongoid/matchable/or.rb +0 -33
  1013. data/lib/mongoid/matchable/regexp.rb +0 -27
  1014. data/lib/mongoid/matchable/size.rb +0 -21
  1015. data/lib/mongoid/railties/document.rb +0 -12
  1016. data/lib/mongoid/relations/accessors.rb +0 -264
  1017. data/lib/mongoid/relations/auto_save.rb +0 -86
  1018. data/lib/mongoid/relations/binding.rb +0 -218
  1019. data/lib/mongoid/relations/bindings/embedded/in.rb +0 -59
  1020. data/lib/mongoid/relations/bindings/embedded/many.rb +0 -43
  1021. data/lib/mongoid/relations/bindings/embedded/one.rb +0 -45
  1022. data/lib/mongoid/relations/bindings/referenced/in.rb +0 -65
  1023. data/lib/mongoid/relations/bindings/referenced/many.rb +0 -38
  1024. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +0 -70
  1025. data/lib/mongoid/relations/bindings/referenced/one.rb +0 -44
  1026. data/lib/mongoid/relations/bindings.rb +0 -9
  1027. data/lib/mongoid/relations/builder.rb +0 -57
  1028. data/lib/mongoid/relations/builders/embedded/in.rb +0 -29
  1029. data/lib/mongoid/relations/builders/embedded/many.rb +0 -36
  1030. data/lib/mongoid/relations/builders/embedded/one.rb +0 -30
  1031. data/lib/mongoid/relations/builders/nested_attributes/many.rb +0 -199
  1032. data/lib/mongoid/relations/builders/nested_attributes/one.rb +0 -126
  1033. data/lib/mongoid/relations/builders/referenced/in.rb +0 -26
  1034. data/lib/mongoid/relations/builders/referenced/many.rb +0 -26
  1035. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +0 -39
  1036. data/lib/mongoid/relations/builders/referenced/one.rb +0 -26
  1037. data/lib/mongoid/relations/builders.rb +0 -106
  1038. data/lib/mongoid/relations/cascading/delete.rb +0 -44
  1039. data/lib/mongoid/relations/cascading/destroy.rb +0 -43
  1040. data/lib/mongoid/relations/cascading/nullify.rb +0 -35
  1041. data/lib/mongoid/relations/cascading/restrict.rb +0 -39
  1042. data/lib/mongoid/relations/cascading.rb +0 -56
  1043. data/lib/mongoid/relations/constraint.rb +0 -55
  1044. data/lib/mongoid/relations/conversions.rb +0 -34
  1045. data/lib/mongoid/relations/counter_cache.rb +0 -150
  1046. data/lib/mongoid/relations/cyclic.rb +0 -107
  1047. data/lib/mongoid/relations/eager/base.rb +0 -153
  1048. data/lib/mongoid/relations/eager/belongs_to.rb +0 -31
  1049. data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +0 -47
  1050. data/lib/mongoid/relations/eager/has_many.rb +0 -38
  1051. data/lib/mongoid/relations/eager/has_one.rb +0 -30
  1052. data/lib/mongoid/relations/eager.rb +0 -41
  1053. data/lib/mongoid/relations/embedded/batchable.rb +0 -382
  1054. data/lib/mongoid/relations/embedded/in.rb +0 -229
  1055. data/lib/mongoid/relations/embedded/many.rb +0 -642
  1056. data/lib/mongoid/relations/embedded/one.rb +0 -222
  1057. data/lib/mongoid/relations/macros.rb +0 -359
  1058. data/lib/mongoid/relations/many.rb +0 -238
  1059. data/lib/mongoid/relations/marshalable.rb +0 -32
  1060. data/lib/mongoid/relations/metadata.rb +0 -1179
  1061. data/lib/mongoid/relations/nested_builder.rb +0 -74
  1062. data/lib/mongoid/relations/one.rb +0 -60
  1063. data/lib/mongoid/relations/options.rb +0 -49
  1064. data/lib/mongoid/relations/polymorphic.rb +0 -39
  1065. data/lib/mongoid/relations/proxy.rb +0 -245
  1066. data/lib/mongoid/relations/referenced/in.rb +0 -295
  1067. data/lib/mongoid/relations/referenced/many.rb +0 -808
  1068. data/lib/mongoid/relations/referenced/many_to_many.rb +0 -472
  1069. data/lib/mongoid/relations/referenced/one.rb +0 -276
  1070. data/lib/mongoid/relations/reflections.rb +0 -64
  1071. data/lib/mongoid/relations/synchronization.rb +0 -169
  1072. data/lib/mongoid/relations/targets/enumerable.rb +0 -473
  1073. data/lib/mongoid/relations/targets.rb +0 -2
  1074. data/lib/mongoid/relations/touchable.rb +0 -94
  1075. data/lib/mongoid/relations.rb +0 -148
  1076. data/lib/support/ruby_version.rb +0 -26
  1077. data/spec/app/models/account.rb +0 -36
  1078. data/spec/app/models/acolyte.rb +0 -17
  1079. data/spec/app/models/actor.rb +0 -18
  1080. data/spec/app/models/actress.rb +0 -2
  1081. data/spec/app/models/address.rb +0 -79
  1082. data/spec/app/models/address_component.rb +0 -5
  1083. data/spec/app/models/address_number.rb +0 -6
  1084. data/spec/app/models/agency.rb +0 -5
  1085. data/spec/app/models/agent.rb +0 -14
  1086. data/spec/app/models/album.rb +0 -14
  1087. data/spec/app/models/alert.rb +0 -7
  1088. data/spec/app/models/animal.rb +0 -25
  1089. data/spec/app/models/answer.rb +0 -6
  1090. data/spec/app/models/appointment.rb +0 -7
  1091. data/spec/app/models/article.rb +0 -12
  1092. data/spec/app/models/artist.rb +0 -66
  1093. data/spec/app/models/artwork.rb +0 -4
  1094. data/spec/app/models/audio.rb +0 -5
  1095. data/spec/app/models/augmentation.rb +0 -11
  1096. data/spec/app/models/author.rb +0 -6
  1097. data/spec/app/models/baby.rb +0 -4
  1098. data/spec/app/models/band.rb +0 -28
  1099. data/spec/app/models/bar.rb +0 -10
  1100. data/spec/app/models/basic.rb +0 -6
  1101. data/spec/app/models/bed.rb +0 -1
  1102. data/spec/app/models/big_palette.rb +0 -2
  1103. data/spec/app/models/birthday.rb +0 -13
  1104. data/spec/app/models/bomb.rb +0 -4
  1105. data/spec/app/models/book.rb +0 -15
  1106. data/spec/app/models/breed.rb +0 -4
  1107. data/spec/app/models/browser.rb +0 -6
  1108. data/spec/app/models/building.rb +0 -6
  1109. data/spec/app/models/building_address.rb +0 -7
  1110. data/spec/app/models/bus.rb +0 -7
  1111. data/spec/app/models/business.rb +0 -5
  1112. data/spec/app/models/callback_test.rb +0 -9
  1113. data/spec/app/models/canvas.rb +0 -25
  1114. data/spec/app/models/car.rb +0 -1
  1115. data/spec/app/models/cat.rb +0 -8
  1116. data/spec/app/models/category.rb +0 -8
  1117. data/spec/app/models/child.rb +0 -4
  1118. data/spec/app/models/child_doc.rb +0 -22
  1119. data/spec/app/models/church.rb +0 -6
  1120. data/spec/app/models/circle.rb +0 -3
  1121. data/spec/app/models/circuit.rb +0 -4
  1122. data/spec/app/models/circus.rb +0 -7
  1123. data/spec/app/models/code.rb +0 -11
  1124. data/spec/app/models/comment.rb +0 -16
  1125. data/spec/app/models/company.rb +0 -5
  1126. data/spec/app/models/consumption_period.rb +0 -7
  1127. data/spec/app/models/contextable_item.rb +0 -5
  1128. data/spec/app/models/contractor.rb +0 -5
  1129. data/spec/app/models/cookie.rb +0 -6
  1130. data/spec/app/models/country_code.rb +0 -8
  1131. data/spec/app/models/courier_job.rb +0 -4
  1132. data/spec/app/models/definition.rb +0 -9
  1133. data/spec/app/models/description.rb +0 -11
  1134. data/spec/app/models/dictionary.rb +0 -10
  1135. data/spec/app/models/division.rb +0 -10
  1136. data/spec/app/models/doctor.rb +0 -12
  1137. data/spec/app/models/dog.rb +0 -7
  1138. data/spec/app/models/dokument.rb +0 -5
  1139. data/spec/app/models/draft.rb +0 -9
  1140. data/spec/app/models/dragon.rb +0 -4
  1141. data/spec/app/models/driver.rb +0 -7
  1142. data/spec/app/models/drug.rb +0 -6
  1143. data/spec/app/models/dungeon.rb +0 -4
  1144. data/spec/app/models/edit.rb +0 -5
  1145. data/spec/app/models/email.rb +0 -6
  1146. data/spec/app/models/employer.rb +0 -5
  1147. data/spec/app/models/entry.rb +0 -6
  1148. data/spec/app/models/eraser.rb +0 -1
  1149. data/spec/app/models/even.rb +0 -7
  1150. data/spec/app/models/event.rb +0 -22
  1151. data/spec/app/models/exhibition.rb +0 -4
  1152. data/spec/app/models/exhibitor.rb +0 -6
  1153. data/spec/app/models/explosion.rb +0 -4
  1154. data/spec/app/models/eye.rb +0 -9
  1155. data/spec/app/models/eye_bowl.rb +0 -9
  1156. data/spec/app/models/face.rb +0 -8
  1157. data/spec/app/models/favorite.rb +0 -6
  1158. data/spec/app/models/filesystem.rb +0 -5
  1159. data/spec/app/models/fire_hydrant.rb +0 -6
  1160. data/spec/app/models/firefox.rb +0 -4
  1161. data/spec/app/models/fish.rb +0 -7
  1162. data/spec/app/models/folder.rb +0 -7
  1163. data/spec/app/models/folder_item.rb +0 -9
  1164. data/spec/app/models/fruits.rb +0 -34
  1165. data/spec/app/models/game.rb +0 -19
  1166. data/spec/app/models/ghost.rb +0 -7
  1167. data/spec/app/models/home.rb +0 -4
  1168. data/spec/app/models/house.rb +0 -6
  1169. data/spec/app/models/html_writer.rb +0 -3
  1170. data/spec/app/models/id_key.rb +0 -6
  1171. data/spec/app/models/image.rb +0 -22
  1172. data/spec/app/models/implant.rb +0 -16
  1173. data/spec/app/models/item.rb +0 -8
  1174. data/spec/app/models/jar.rb +0 -7
  1175. data/spec/app/models/kaleidoscope.rb +0 -6
  1176. data/spec/app/models/kangaroo.rb +0 -4
  1177. data/spec/app/models/label.rb +0 -47
  1178. data/spec/app/models/language.rb +0 -5
  1179. data/spec/app/models/lat_lng.rb +0 -15
  1180. data/spec/app/models/league.rb +0 -11
  1181. data/spec/app/models/learner.rb +0 -2
  1182. data/spec/app/models/line_item.rb +0 -6
  1183. data/spec/app/models/location.rb +0 -8
  1184. data/spec/app/models/login.rb +0 -8
  1185. data/spec/app/models/manufacturer.rb +0 -7
  1186. data/spec/app/models/meat.rb +0 -4
  1187. data/spec/app/models/membership.rb +0 -4
  1188. data/spec/app/models/message.rb +0 -11
  1189. data/spec/app/models/mixed_drink.rb +0 -4
  1190. data/spec/app/models/movie.rb +0 -13
  1191. data/spec/app/models/my_hash.rb +0 -2
  1192. data/spec/app/models/name.rb +0 -24
  1193. data/spec/app/models/node.rb +0 -5
  1194. data/spec/app/models/note.rb +0 -17
  1195. data/spec/app/models/odd.rb +0 -7
  1196. data/spec/app/models/ordered_post.rb +0 -6
  1197. data/spec/app/models/ordered_preference.rb +0 -6
  1198. data/spec/app/models/oscar.rb +0 -15
  1199. data/spec/app/models/override.rb +0 -16
  1200. data/spec/app/models/ownable.rb +0 -6
  1201. data/spec/app/models/owner.rb +0 -6
  1202. data/spec/app/models/pack.rb +0 -3
  1203. data/spec/app/models/page.rb +0 -16
  1204. data/spec/app/models/page_question.rb +0 -4
  1205. data/spec/app/models/palette.rb +0 -7
  1206. data/spec/app/models/parent.rb +0 -5
  1207. data/spec/app/models/parent_doc.rb +0 -6
  1208. data/spec/app/models/passport.rb +0 -5
  1209. data/spec/app/models/patient.rb +0 -9
  1210. data/spec/app/models/pdf_writer.rb +0 -3
  1211. data/spec/app/models/pencil.rb +0 -1
  1212. data/spec/app/models/person.rb +0 -207
  1213. data/spec/app/models/pet.rb +0 -23
  1214. data/spec/app/models/pet_owner.rb +0 -6
  1215. data/spec/app/models/phone.rb +0 -9
  1216. data/spec/app/models/pizza.rb +0 -7
  1217. data/spec/app/models/player.rb +0 -35
  1218. data/spec/app/models/post.rb +0 -50
  1219. data/spec/app/models/post_genre.rb +0 -6
  1220. data/spec/app/models/powerup.rb +0 -11
  1221. data/spec/app/models/preference.rb +0 -9
  1222. data/spec/app/models/princess.rb +0 -8
  1223. data/spec/app/models/product.rb +0 -17
  1224. data/spec/app/models/profile.rb +0 -5
  1225. data/spec/app/models/pronunciation.rb +0 -5
  1226. data/spec/app/models/pub.rb +0 -6
  1227. data/spec/app/models/purchase.rb +0 -4
  1228. data/spec/app/models/question.rb +0 -8
  1229. data/spec/app/models/quiz.rb +0 -7
  1230. data/spec/app/models/rating.rb +0 -8
  1231. data/spec/app/models/record.rb +0 -51
  1232. data/spec/app/models/registry.rb +0 -4
  1233. data/spec/app/models/role.rb +0 -7
  1234. data/spec/app/models/root_category.rb +0 -4
  1235. data/spec/app/models/sandwich.rb +0 -9
  1236. data/spec/app/models/scheduler.rb +0 -7
  1237. data/spec/app/models/seo.rb +0 -7
  1238. data/spec/app/models/series.rb +0 -4
  1239. data/spec/app/models/server.rb +0 -13
  1240. data/spec/app/models/service.rb +0 -22
  1241. data/spec/app/models/shape.rb +0 -12
  1242. data/spec/app/models/shelf.rb +0 -5
  1243. data/spec/app/models/shipment_address.rb +0 -2
  1244. data/spec/app/models/shipping_container.rb +0 -5
  1245. data/spec/app/models/shipping_pack.rb +0 -3
  1246. data/spec/app/models/shop.rb +0 -6
  1247. data/spec/app/models/short_agent.rb +0 -4
  1248. data/spec/app/models/short_quiz.rb +0 -5
  1249. data/spec/app/models/simple.rb +0 -5
  1250. data/spec/app/models/slave.rb +0 -6
  1251. data/spec/app/models/song.rb +0 -8
  1252. data/spec/app/models/sound.rb +0 -5
  1253. data/spec/app/models/square.rb +0 -4
  1254. data/spec/app/models/staff.rb +0 -7
  1255. data/spec/app/models/store_as_dup_test1.rb +0 -5
  1256. data/spec/app/models/store_as_dup_test2.rb +0 -5
  1257. data/spec/app/models/strategy.rb +0 -3
  1258. data/spec/app/models/sub_item.rb +0 -3
  1259. data/spec/app/models/subscription.rb +0 -4
  1260. data/spec/app/models/survey.rb +0 -5
  1261. data/spec/app/models/symptom.rb +0 -6
  1262. data/spec/app/models/tag.rb +0 -8
  1263. data/spec/app/models/target.rb +0 -5
  1264. data/spec/app/models/template.rb +0 -5
  1265. data/spec/app/models/thing.rb +0 -9
  1266. data/spec/app/models/title.rb +0 -3
  1267. data/spec/app/models/tool.rb +0 -8
  1268. data/spec/app/models/topping.rb +0 -5
  1269. data/spec/app/models/track.rb +0 -38
  1270. data/spec/app/models/translation.rb +0 -5
  1271. data/spec/app/models/tree.rb +0 -9
  1272. data/spec/app/models/truck.rb +0 -3
  1273. data/spec/app/models/user.rb +0 -21
  1274. data/spec/app/models/user_account.rb +0 -10
  1275. data/spec/app/models/validation_callback.rb +0 -10
  1276. data/spec/app/models/vehicle.rb +0 -11
  1277. data/spec/app/models/version.rb +0 -5
  1278. data/spec/app/models/vet_visit.rb +0 -5
  1279. data/spec/app/models/video.rb +0 -13
  1280. data/spec/app/models/video_game.rb +0 -1
  1281. data/spec/app/models/weapon.rb +0 -11
  1282. data/spec/app/models/wiki_page.rb +0 -14
  1283. data/spec/app/models/word.rb +0 -15
  1284. data/spec/app/models/word_origin.rb +0 -11
  1285. data/spec/app/models/writer.rb +0 -11
  1286. data/spec/mongoid/extensions/origin/regexp_raw_spec.rb +0 -89
  1287. data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +0 -184
  1288. data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +0 -201
  1289. data/spec/mongoid/matchable/all_spec.rb +0 -31
  1290. data/spec/mongoid/matchable/and_spec.rb +0 -187
  1291. data/spec/mongoid/matchable/default_spec.rb +0 -130
  1292. data/spec/mongoid/matchable/exists_spec.rb +0 -57
  1293. data/spec/mongoid/matchable/gt_spec.rb +0 -75
  1294. data/spec/mongoid/matchable/gte_spec.rb +0 -74
  1295. data/spec/mongoid/matchable/in_spec.rb +0 -49
  1296. data/spec/mongoid/matchable/lt_spec.rb +0 -74
  1297. data/spec/mongoid/matchable/lte_spec.rb +0 -74
  1298. data/spec/mongoid/matchable/ne_spec.rb +0 -46
  1299. data/spec/mongoid/matchable/nin_spec.rb +0 -48
  1300. data/spec/mongoid/matchable/or_spec.rb +0 -131
  1301. data/spec/mongoid/matchable/regexp_spec.rb +0 -59
  1302. data/spec/mongoid/matchable/size_spec.rb +0 -25
  1303. data/spec/mongoid/matchable_spec.rb +0 -708
  1304. data/spec/mongoid/railties/document_spec.rb +0 -24
  1305. data/spec/mongoid/relations/accessors_spec.rb +0 -821
  1306. data/spec/mongoid/relations/auto_save_spec.rb +0 -281
  1307. data/spec/mongoid/relations/bindings/embedded/in_spec.rb +0 -171
  1308. data/spec/mongoid/relations/bindings/embedded/many_spec.rb +0 -54
  1309. data/spec/mongoid/relations/bindings/embedded/one_spec.rb +0 -77
  1310. data/spec/mongoid/relations/bindings/referenced/in_spec.rb +0 -241
  1311. data/spec/mongoid/relations/bindings/referenced/many_spec.rb +0 -153
  1312. data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +0 -178
  1313. data/spec/mongoid/relations/bindings/referenced/one_spec.rb +0 -131
  1314. data/spec/mongoid/relations/builders/embedded/in_spec.rb +0 -34
  1315. data/spec/mongoid/relations/builders/embedded/many_spec.rb +0 -132
  1316. data/spec/mongoid/relations/builders/embedded/one_spec.rb +0 -99
  1317. data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +0 -233
  1318. data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +0 -250
  1319. data/spec/mongoid/relations/builders/referenced/in_spec.rb +0 -230
  1320. data/spec/mongoid/relations/builders/referenced/many_spec.rb +0 -137
  1321. data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +0 -178
  1322. data/spec/mongoid/relations/builders/referenced/one_spec.rb +0 -111
  1323. data/spec/mongoid/relations/builders_spec.rb +0 -226
  1324. data/spec/mongoid/relations/cascading/delete_spec.rb +0 -101
  1325. data/spec/mongoid/relations/cascading/destroy_spec.rb +0 -47
  1326. data/spec/mongoid/relations/cascading/nullify_spec.rb +0 -32
  1327. data/spec/mongoid/relations/cascading/restrict_spec.rb +0 -68
  1328. data/spec/mongoid/relations/cascading_spec.rb +0 -355
  1329. data/spec/mongoid/relations/constraint_spec.rb +0 -75
  1330. data/spec/mongoid/relations/conversions_spec.rb +0 -128
  1331. data/spec/mongoid/relations/counter_cache_spec.rb +0 -389
  1332. data/spec/mongoid/relations/cyclic_spec.rb +0 -178
  1333. data/spec/mongoid/relations/eager/belongs_to_spec.rb +0 -163
  1334. data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +0 -117
  1335. data/spec/mongoid/relations/eager/has_many_spec.rb +0 -244
  1336. data/spec/mongoid/relations/eager/has_one_spec.rb +0 -163
  1337. data/spec/mongoid/relations/eager_spec.rb +0 -239
  1338. data/spec/mongoid/relations/embedded/dirty_spec.rb +0 -65
  1339. data/spec/mongoid/relations/embedded/in_spec.rb +0 -579
  1340. data/spec/mongoid/relations/embedded/many_spec.rb +0 -4166
  1341. data/spec/mongoid/relations/embedded/one_spec.rb +0 -1067
  1342. data/spec/mongoid/relations/macros_spec.rb +0 -631
  1343. data/spec/mongoid/relations/metadata_spec.rb +0 -1971
  1344. data/spec/mongoid/relations/options_spec.rb +0 -35
  1345. data/spec/mongoid/relations/polymorphic_spec.rb +0 -128
  1346. data/spec/mongoid/relations/referenced/in_spec.rb +0 -1326
  1347. data/spec/mongoid/relations/referenced/many_spec.rb +0 -3806
  1348. data/spec/mongoid/relations/referenced/many_to_many_spec.rb +0 -3589
  1349. data/spec/mongoid/relations/referenced/one_spec.rb +0 -1240
  1350. data/spec/mongoid/relations/reflections_spec.rb +0 -101
  1351. data/spec/mongoid/relations/synchronization_spec.rb +0 -449
  1352. data/spec/mongoid/relations/targets/enumerable_spec.rb +0 -1717
  1353. data/spec/mongoid/relations/touchable_spec.rb +0 -362
  1354. data/spec/mongoid/relations_spec.rb +0 -189
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "spec_helper"
2
4
 
3
5
  describe Mongoid::Contextual::Mongo do
@@ -7,7 +9,7 @@ describe Mongoid::Contextual::Mongo do
7
9
  describe "##{method}" do
8
10
 
9
11
  before do
10
- Band.create(name: "Depeche Mode")
12
+ Band.create!(name: "Depeche Mode")
11
13
  end
12
14
 
13
15
  context "when the count is zero" do
@@ -78,11 +80,11 @@ describe Mongoid::Contextual::Mongo do
78
80
  describe "#count" do
79
81
 
80
82
  let!(:depeche) do
81
- Band.create(name: "Depeche Mode")
83
+ Band.create!(name: "Depeche Mode")
82
84
  end
83
85
 
84
86
  let!(:new_order) do
85
- Band.create(name: "New Order")
87
+ Band.create!(name: "New Order")
86
88
  end
87
89
 
88
90
  let(:criteria) do
@@ -106,11 +108,8 @@ describe Mongoid::Contextual::Mongo do
106
108
  described_class.new(criteria.cache)
107
109
  end
108
110
 
109
- before do
110
- expect(context.view).to receive(:count).once.and_return(1)
111
- end
112
-
113
111
  it "returns the count cached value after first call" do
112
+ expect(context.view).to receive(:count_documents).once.and_return(1)
114
113
  2.times { expect(context.count).to eq(1) }
115
114
  end
116
115
  end
@@ -134,7 +133,7 @@ describe Mongoid::Contextual::Mongo do
134
133
  context "and a limit true" do
135
134
 
136
135
  before do
137
- 2.times { Band.create(name: "Depeche Mode", likes: 1) }
136
+ 2.times { Band.create!(name: "Depeche Mode", likes: 1) }
138
137
  end
139
138
 
140
139
  let(:count) do
@@ -152,7 +151,7 @@ describe Mongoid::Contextual::Mongo do
152
151
  context "when provided limit" do
153
152
 
154
153
  before do
155
- 2.times { Band.create(name: "Depeche Mode") }
154
+ 2.times { Band.create!(name: "Depeche Mode") }
156
155
  end
157
156
 
158
157
  let(:context) do
@@ -168,7 +167,8 @@ describe Mongoid::Contextual::Mongo do
168
167
  end
169
168
  end
170
169
 
171
- context 'when a collation is specified', if: collation_supported? do
170
+ context 'when a collation is specified' do
171
+ min_server_version '3.4'
172
172
 
173
173
  let(:context) do
174
174
  described_class.new(criteria)
@@ -191,16 +191,81 @@ describe Mongoid::Contextual::Mongo do
191
191
  end
192
192
  end
193
193
 
194
+ describe "#estimated_count" do
195
+
196
+ let!(:depeche) do
197
+ Band.create!(name: "Depeche Mode")
198
+ end
199
+
200
+ let!(:new_order) do
201
+ Band.create!(name: "New Order")
202
+ end
203
+
204
+ let(:criteria) do
205
+ Band.where
206
+ end
207
+
208
+ context "when not providing options" do
209
+ it 'returns the correct count' do
210
+ expect(criteria.estimated_count).to eq(2)
211
+ end
212
+ end
213
+
214
+ context "when providing options" do
215
+ it 'returns the correct count' do
216
+ expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
217
+ end
218
+ end
219
+
220
+ context "when context is cached" do
221
+
222
+ let(:context) do
223
+ described_class.new(criteria.cache)
224
+ end
225
+
226
+ it "returns the count cached value after first call" do
227
+ expect(context.view).to receive(:estimated_document_count).once.and_return(1)
228
+ 2.times do
229
+ context.estimated_count
230
+ end
231
+ end
232
+ end
233
+
234
+ context "when the criteria contains a selector", :focus do
235
+ let(:criteria) do
236
+ Band.where(name: "New Order")
237
+ end
238
+
239
+ context "when not providing options" do
240
+ it 'raises an error' do
241
+ expect do
242
+ criteria.estimated_count
243
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
244
+ end
245
+ end
246
+
247
+ context "when providing options" do
248
+ it 'raises an error' do
249
+ expect do
250
+ criteria.estimated_count(maxTimeMS: 1000)
251
+ end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
252
+ end
253
+ end
254
+ end
255
+ end
256
+
257
+
258
+
194
259
  [ :delete, :delete_all ].each do |method|
195
260
 
196
261
  describe "##{method}" do
197
262
 
198
263
  let!(:depeche_mode) do
199
- Band.create(name: "Depeche Mode")
264
+ Band.create!(name: "Depeche Mode")
200
265
  end
201
266
 
202
267
  let!(:new_order) do
203
- Band.create(name: "New Order")
268
+ Band.create!(name: "New Order")
204
269
  end
205
270
 
206
271
  context "when the selector is contraining" do
@@ -228,36 +293,37 @@ describe Mongoid::Contextual::Mongo do
228
293
  it "returns the number of documents deleted" do
229
294
  expect(deleted).to eq(1)
230
295
  end
231
- end
232
296
 
233
- context 'when the criteria has a collation', if: collation_supported? do
297
+ context 'when the criteria has a collation' do
298
+ min_server_version '3.4'
234
299
 
235
- let(:criteria) do
236
- Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
237
- end
300
+ let(:criteria) do
301
+ Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
302
+ end
238
303
 
239
- let(:context) do
240
- described_class.new(criteria)
241
- end
304
+ let(:context) do
305
+ described_class.new(criteria)
306
+ end
242
307
 
243
- let!(:deleted) do
244
- context.send(method)
245
- end
308
+ let!(:deleted) do
309
+ context.send(method)
310
+ end
246
311
 
247
- it "deletes the matching documents" do
248
- expect(Band.find(new_order.id)).to eq(new_order)
249
- end
312
+ it "deletes the matching documents" do
313
+ expect(Band.find(new_order.id)).to eq(new_order)
314
+ end
250
315
 
251
- it "deletes the correct number of documents" do
252
- expect(Band.count).to eq(1)
253
- end
316
+ it "deletes the correct number of documents" do
317
+ expect(Band.count).to eq(1)
318
+ end
254
319
 
255
- it "returns the number of documents deleted" do
256
- expect(deleted).to eq(1)
320
+ it "returns the number of documents deleted" do
321
+ expect(deleted).to eq(1)
322
+ end
257
323
  end
258
324
  end
259
325
 
260
- context "when the selector is not constraining" do
326
+ context "when the selector is not contraining" do
261
327
 
262
328
  let(:criteria) do
263
329
  Band.all
@@ -275,6 +341,23 @@ describe Mongoid::Contextual::Mongo do
275
341
  expect(Band.count).to eq(0)
276
342
  end
277
343
  end
344
+
345
+ context 'when the write concern is unacknowledged' do
346
+
347
+ let(:criteria) do
348
+ Band.all
349
+ end
350
+
351
+ let!(:deleted) do
352
+ criteria.with(write: { w: 0 }) do |crit|
353
+ crit.send(method)
354
+ end
355
+ end
356
+
357
+ it 'returns 0' do
358
+ expect(deleted).to eq(0)
359
+ end
360
+ end
278
361
  end
279
362
  end
280
363
 
@@ -283,11 +366,11 @@ describe Mongoid::Contextual::Mongo do
283
366
  describe "##{method}" do
284
367
 
285
368
  let!(:depeche_mode) do
286
- Band.create(name: "Depeche Mode")
369
+ Band.create!(name: "Depeche Mode")
287
370
  end
288
371
 
289
372
  let!(:new_order) do
290
- Band.create(name: "New Order")
373
+ Band.create!(name: "New Order")
291
374
  end
292
375
 
293
376
  context "when the selector is contraining" do
@@ -316,7 +399,8 @@ describe Mongoid::Contextual::Mongo do
316
399
  expect(destroyed).to eq(1)
317
400
  end
318
401
 
319
- context 'when the criteria has a collation', if: collation_supported? do
402
+ context 'when the criteria has a collation' do
403
+ min_server_version '3.4'
320
404
 
321
405
  let(:criteria) do
322
406
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -363,32 +447,109 @@ describe Mongoid::Contextual::Mongo do
363
447
  end
364
448
  end
365
449
  end
450
+
451
+ context 'when the write concern is unacknowledged' do
452
+
453
+ before do
454
+ 2.times { Band.create! }
455
+ end
456
+
457
+ let(:criteria) do
458
+ Band.all
459
+ end
460
+
461
+ let!(:deleted) do
462
+ criteria.with(write: { w: 0 }) do |crit|
463
+ crit.send(method)
464
+ end
465
+ end
466
+
467
+ it 'returns 0' do
468
+ expect(deleted).to eq(0)
469
+ end
470
+ end
366
471
  end
367
472
 
368
473
  describe "#distinct" do
369
474
 
370
475
  before do
371
- Band.create(name: "Depeche Mode", years: 30)
372
- Band.create(name: "New Order", years: 25)
476
+ Band.create!(name: "Depeche Mode", years: 30, sales: "1E2")
477
+ Band.create!(name: "New Order", years: 25, sales: "2E3")
478
+ Band.create!(name: "10,000 Maniacs", years: 20, sales: "1E2")
373
479
  end
374
480
 
375
- context "when limiting the result set" do
481
+ with_config_values :legacy_pluck_distinct, true, false do
482
+ context "when limiting the result set" do
376
483
 
377
- let(:criteria) do
378
- Band.where(name: "Depeche Mode")
484
+ let(:criteria) do
485
+ Band.where(name: "Depeche Mode")
486
+ end
487
+
488
+ let(:context) do
489
+ described_class.new(criteria)
490
+ end
491
+
492
+ it "returns the distinct matching fields" do
493
+ expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
494
+ end
379
495
  end
380
496
 
381
- let(:context) do
382
- described_class.new(criteria)
497
+ context "when not limiting the result set" do
498
+
499
+ let(:criteria) do
500
+ Band.criteria
501
+ end
502
+
503
+ let(:context) do
504
+ described_class.new(criteria)
505
+ end
506
+
507
+ it "returns the distinct field values" do
508
+ expect(context.distinct(:name).sort).to eq([ "10,000 Maniacs", "Depeche Mode", "New Order" ].sort)
509
+ end
383
510
  end
384
511
 
385
- it "returns the distinct matching fields" do
386
- expect(context.distinct(:name)).to eq([ "Depeche Mode" ])
512
+ context "when providing an aliased field" do
513
+
514
+ let(:criteria) do
515
+ Band.criteria
516
+ end
517
+
518
+ let(:context) do
519
+ described_class.new(criteria)
520
+ end
521
+
522
+ it "returns the distinct field values" do
523
+ expect(context.distinct(:years).sort).to eq([ 20, 25, 30 ])
524
+ end
387
525
  end
388
- end
389
526
 
390
- context "when not limiting the result set" do
527
+ context 'when a collation is specified' do
528
+ min_server_version '3.4'
391
529
 
530
+ before do
531
+ Band.create!(name: 'DEPECHE MODE')
532
+ end
533
+
534
+ let(:context) do
535
+ described_class.new(criteria)
536
+ end
537
+
538
+ let(:expected_results) do
539
+ ["10,000 Maniacs", "Depeche Mode", "New Order"]
540
+ end
541
+
542
+ let(:criteria) do
543
+ Band.where({}).collation(locale: 'en_US', strength: 2)
544
+ end
545
+
546
+ it 'applies the collation' do
547
+ expect(context.distinct(:name).sort).to eq(expected_results.sort)
548
+ end
549
+ end
550
+ end
551
+
552
+ context "when providing a demongoizable field" do
392
553
  let(:criteria) do
393
554
  Band.criteria
394
555
  end
@@ -397,46 +558,241 @@ describe Mongoid::Contextual::Mongo do
397
558
  described_class.new(criteria)
398
559
  end
399
560
 
400
- it "returns the distinct field values" do
401
- expect(context.distinct(:name)).to eq([ "Depeche Mode", "New Order" ])
561
+ context "when legacy_pluck_distinct is set" do
562
+ config_override :legacy_pluck_distinct, true
563
+
564
+ it "returns the non-demongoized distinct field values" do
565
+ expect(context.distinct(:sales).sort).to eq([ "1E2", "2E3" ])
566
+ end
567
+ end
568
+
569
+ context "when legacy_pluck_distinct is not set" do
570
+ config_override :legacy_pluck_distinct, false
571
+
572
+ it "returns the non-demongoized distinct field values" do
573
+ expect(context.distinct(:sales).sort).to eq([ BigDecimal("1E2"), BigDecimal("2E3") ])
574
+ end
402
575
  end
403
576
  end
404
577
 
405
- context "when providing an aliased field" do
578
+ context "when getting a localized field" do
579
+ before do
580
+ I18n.locale = :en
581
+ d = Dictionary.create!(description: 'english-text')
582
+ I18n.locale = :de
583
+ d.description = 'deutsch-text'
584
+ d.save!
585
+ end
406
586
 
407
587
  let(:criteria) do
408
- Band.criteria
588
+ Dictionary.criteria
409
589
  end
410
590
 
411
591
  let(:context) do
412
592
  described_class.new(criteria)
413
593
  end
414
594
 
415
- it "returns the distinct field values" do
416
- expect(context.distinct(:years)).to eq([ 30, 25 ])
595
+ context "when getting the field without _translations" do
596
+ context "when legacy_pluck_distinct is set" do
597
+ config_override :legacy_pluck_distinct, true
598
+
599
+ it "gets the full hash" do
600
+ expect(context.distinct(:description)).to eq([{ "de" => "deutsch-text", "en" => "english-text" }])
601
+ end
602
+ end
603
+
604
+ context "when legacy_pluck_distinct is not set" do
605
+ config_override :legacy_pluck_distinct, false
606
+
607
+ it "gets the demongoized localized field" do
608
+ expect(context.distinct(:description)).to eq([ 'deutsch-text' ])
609
+ end
610
+ end
611
+ end
612
+
613
+ context "when getting the field with _translations" do
614
+ context "when legacy_pluck_distinct is set" do
615
+ config_override :legacy_pluck_distinct, true
616
+
617
+ it "gets an empty list" do
618
+ expect(context.distinct(:description_translations)).to eq([])
619
+ end
620
+ end
621
+
622
+ context "when legacy_pluck_distinct is not set" do
623
+ config_override :legacy_pluck_distinct, false
624
+
625
+ it "gets the full hash" do
626
+ expect(context.distinct(:description_translations)).to eq([ { "de" => "deutsch-text", "en" => "english-text" } ])
627
+ end
628
+ end
417
629
  end
418
- end
419
630
 
420
- context 'when a collation is specified', if: collation_supported? do
631
+ context 'when plucking a specific locale' do
421
632
 
422
- before do
423
- Band.create(name: 'DEPECHE MODE')
633
+ let(:distinct) do
634
+ context.distinct(:'description.de')
635
+ end
636
+
637
+ context "when legacy_pluck_distinct is set" do
638
+ config_override :legacy_pluck_distinct, true
639
+
640
+ it 'returns the specific translation' do
641
+ expect(distinct).to eq([ 'deutsch-text' ])
642
+ end
643
+ end
644
+
645
+ context "when legacy_pluck_distinct is not set" do
646
+ config_override :legacy_pluck_distinct, false
647
+
648
+ it 'returns the specific translation' do
649
+ expect(distinct).to eq([ "deutsch-text" ])
650
+ end
651
+ end
424
652
  end
425
653
 
426
- let(:context) do
427
- described_class.new(criteria)
654
+ context 'when plucking a specific locale from _translations field' do
655
+
656
+ let(:distinct) do
657
+ context.distinct(:'description_translations.de')
658
+ end
659
+
660
+ context "when legacy_pluck_distinct is set" do
661
+ config_override :legacy_pluck_distinct, true
662
+
663
+ it 'returns the empty list' do
664
+ expect(distinct).to eq([])
665
+ end
666
+ end
667
+
668
+ context "when legacy_pluck_distinct is not set" do
669
+ config_override :legacy_pluck_distinct, false
670
+
671
+ it 'returns the specific translations' do
672
+ expect(distinct).to eq(['deutsch-text'])
673
+ end
674
+ end
428
675
  end
429
676
 
430
- let(:expected_results) do
431
- ["Depeche Mode", "New Order"]
677
+ context 'when fallbacks are enabled with a locale list' do
678
+ require_fallbacks
679
+
680
+ around(:all) do |example|
681
+ prev_fallbacks = I18n.fallbacks.dup
682
+ I18n.fallbacks[:he] = [ :en ]
683
+ example.run
684
+ I18n.fallbacks = prev_fallbacks
685
+ end
686
+
687
+ let(:distinct) do
688
+ context.distinct(:description).first
689
+ end
690
+
691
+ context "when legacy_pluck_distinct is set" do
692
+ config_override :legacy_pluck_distinct, true
693
+
694
+ it "does not correctly use the fallback" do
695
+ distinct.should == {"de"=>"deutsch-text", "en"=>"english-text"}
696
+ end
697
+ end
698
+
699
+ context "when legacy_pluck_distinct is not set" do
700
+ config_override :legacy_pluck_distinct, false
701
+
702
+ it "correctly uses the fallback" do
703
+ I18n.locale = :en
704
+ d = Dictionary.create!(description: 'english-text')
705
+ I18n.locale = :he
706
+ distinct.should == "english-text"
707
+ end
708
+ end
432
709
  end
433
710
 
434
- let(:criteria) do
435
- Band.where({}).collation(locale: 'en_US', strength: 2)
711
+ context "when the localized field is embedded" do
712
+ before do
713
+ p = Passport.new
714
+ I18n.locale = :en
715
+ p.name = "Neil"
716
+ I18n.locale = :he
717
+ p.name = "Nissim"
718
+
719
+ Person.create!(passport: p, employer_id: 12345)
720
+ end
721
+
722
+ let(:criteria) do
723
+ Person.where(employer_id: 12345)
724
+ end
725
+
726
+ let(:context) do
727
+ described_class.new(criteria)
728
+ end
729
+
730
+ let(:distinct) do
731
+ context.distinct("pass.name").first
732
+ end
733
+
734
+ let(:distinct_translations) do
735
+ context.distinct("pass.name_translations").first
736
+ end
737
+
738
+ let(:distinct_translations_field) do
739
+ context.distinct("pass.name_translations.en").first
740
+ end
741
+
742
+ context "when legacy_pluck_distinct is set" do
743
+ config_override :legacy_pluck_distinct, true
744
+
745
+ it "returns the full hash" do
746
+ expect(distinct).to eq({ "en" => "Neil", "he" => "Nissim" })
747
+ end
748
+
749
+ it "returns the empty hash" do
750
+ expect(distinct_translations).to eq(nil)
751
+ end
752
+
753
+ it "returns the empty hash" do
754
+ expect(distinct_translations_field).to eq(nil)
755
+ end
756
+ end
757
+
758
+ context "when legacy_pluck_distinct is not set" do
759
+ config_override :legacy_pluck_distinct, false
760
+
761
+ it "returns the translation for the current locale" do
762
+ expect(distinct).to eq("Nissim")
763
+ end
764
+
765
+ it "returns the full _translation hash" do
766
+ expect(distinct_translations).to eq({ "en" => "Neil", "he" => "Nissim" })
767
+ end
768
+
769
+ it "returns the translation for the requested locale" do
770
+ expect(distinct_translations_field).to eq("Neil")
771
+ end
772
+ end
773
+ end
774
+ end
775
+
776
+ context "when getting an embedded field" do
777
+
778
+ let(:label) { Label.new(sales: "1E2") }
779
+ let!(:band) { Band.create!(label: label) }
780
+ let(:criteria) { Band.where(_id: band.id) }
781
+ let(:context) { described_class.new(criteria) }
782
+
783
+ context "when legacy_pluck_distinct is set" do
784
+ config_override :legacy_pluck_distinct, true
785
+
786
+ it "returns the distinct matching fields" do
787
+ expect(context.distinct("label.sales")).to eq([ "1E2" ])
788
+ end
436
789
  end
437
790
 
438
- it 'applies the collation' do
439
- expect(context.distinct(:name)).to eq(expected_results)
791
+ context "when legacy_pluck_distinct is not set" do
792
+ config_override :legacy_pluck_distinct, false
793
+ it "returns the distinct matching fields" do
794
+ expect(context.distinct("label.sales")).to eq([ BigDecimal("1E2") ])
795
+ end
440
796
  end
441
797
  end
442
798
  end
@@ -444,7 +800,7 @@ describe Mongoid::Contextual::Mongo do
444
800
  describe "#each" do
445
801
 
446
802
  before do
447
- Band.create(name: "Depeche Mode")
803
+ Band.create!(name: "Depeche Mode")
448
804
  end
449
805
 
450
806
  let(:criteria) do
@@ -455,7 +811,8 @@ describe Mongoid::Contextual::Mongo do
455
811
  described_class.new(criteria)
456
812
  end
457
813
 
458
- context 'when the criteria has a collation', if: collation_supported? do
814
+ context 'when the criteria has a collation' do
815
+ min_server_version '3.4'
459
816
 
460
817
  let(:criteria) do
461
818
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -521,7 +878,7 @@ describe Mongoid::Contextual::Mongo do
521
878
  context "when iterating with next" do
522
879
 
523
880
  before do
524
- 10.times { |i| Band.create(name: "Test #{i}") }
881
+ 10.times { |i| Band.create!(name: "Test #{i}") }
525
882
  end
526
883
 
527
884
  let(:criteria) do
@@ -533,12 +890,50 @@ describe Mongoid::Contextual::Mongo do
533
890
  end
534
891
 
535
892
  it "does not load all documents" do
536
- expect(Mongo::Logger.logger).to receive(:debug?).exactly(2).times.and_call_original
893
+ subscriber = Mrss::EventSubscriber.new
894
+ context.view.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
895
+
537
896
  enum.next
897
+
898
+ find_events = subscriber.all_events.select do |evt|
899
+ evt.command_name == 'find'
900
+ end
901
+ expect(find_events.length).to be(2)
902
+ get_more_events = subscriber.all_events.select do |evt|
903
+ evt.command_name == 'getMore'
904
+ end
905
+ expect(get_more_events.length).to be(0)
906
+ ensure
907
+ context.view.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
538
908
  end
539
909
  end
540
910
  end
541
911
  end
912
+
913
+ context 'when the criteria has a parent document' do
914
+
915
+ before do
916
+ Post.create!(person: person)
917
+ Post.create!(person: person)
918
+ Post.create!(person: person)
919
+ end
920
+
921
+ let(:person) do
922
+ Person.new
923
+ end
924
+
925
+ let(:criteria) do
926
+ person.posts.all
927
+ end
928
+
929
+ let(:persons) do
930
+ criteria.collect(&:person)
931
+ end
932
+
933
+ it 'sets the same parent object on each related object' do
934
+ expect(persons.uniq.size).to eq(1)
935
+ end
936
+ end
542
937
  end
543
938
 
544
939
  describe "#eager_load" do
@@ -553,12 +948,12 @@ describe Mongoid::Contextual::Mongo do
553
948
 
554
949
  context "when no documents are returned" do
555
950
 
556
- let(:game_metadata) do
951
+ let(:game_association) do
557
952
  Person.reflect_on_association(:game)
558
953
  end
559
954
 
560
955
  it "does not make any additional database queries" do
561
- expect(game_metadata).to receive(:eager_load).never
956
+ expect(game_association).to receive(:eager_load).never
562
957
  context.send(:eager_load, [])
563
958
  end
564
959
  end
@@ -567,7 +962,7 @@ describe Mongoid::Contextual::Mongo do
567
962
  describe "#exists?" do
568
963
 
569
964
  before do
570
- Band.create(name: "Depeche Mode")
965
+ Band.create!(name: "Depeche Mode")
571
966
  end
572
967
 
573
968
  context "when the count is zero" do
@@ -680,11 +1075,11 @@ describe Mongoid::Contextual::Mongo do
680
1075
  describe "#find_one_and_replace" do
681
1076
 
682
1077
  let!(:depeche) do
683
- Band.create(name: "Depeche Mode")
1078
+ Band.create!(name: "Depeche Mode")
684
1079
  end
685
1080
 
686
1081
  let!(:tool) do
687
- Band.create(name: "Tool")
1082
+ Band.create!(name: "Tool")
688
1083
  end
689
1084
 
690
1085
  context "when the selector matches" do
@@ -787,7 +1182,8 @@ describe Mongoid::Contextual::Mongo do
787
1182
  end
788
1183
  end
789
1184
 
790
- context 'when a collation is specified on the criteria', if: collation_supported? do
1185
+ context 'when a collation is specified on the criteria' do
1186
+ min_server_version '3.4'
791
1187
 
792
1188
  let(:criteria) do
793
1189
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -835,11 +1231,11 @@ describe Mongoid::Contextual::Mongo do
835
1231
  describe "#find_one_and_update" do
836
1232
 
837
1233
  let!(:depeche) do
838
- Band.create(name: "Depeche Mode")
1234
+ Band.create!(name: "Depeche Mode")
839
1235
  end
840
1236
 
841
1237
  let!(:tool) do
842
- Band.create(name: "Tool")
1238
+ Band.create!(name: "Tool")
843
1239
  end
844
1240
 
845
1241
  context "when the selector matches" do
@@ -940,7 +1336,8 @@ describe Mongoid::Contextual::Mongo do
940
1336
  end
941
1337
  end
942
1338
 
943
- context 'when a collation is specified on the criteria', if: collation_supported? do
1339
+ context 'when a collation is specified on the criteria' do
1340
+ min_server_version '3.4'
944
1341
 
945
1342
  let(:criteria) do
946
1343
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -987,7 +1384,7 @@ describe Mongoid::Contextual::Mongo do
987
1384
  describe "#find_one_and_delete" do
988
1385
 
989
1386
  let!(:depeche) do
990
- Band.create(name: "Depeche Mode")
1387
+ Band.create!(name: "Depeche Mode")
991
1388
  end
992
1389
 
993
1390
  let(:criteria) do
@@ -1014,7 +1411,8 @@ describe Mongoid::Contextual::Mongo do
1014
1411
  }.to raise_error(Mongoid::Errors::DocumentNotFound)
1015
1412
  end
1016
1413
 
1017
- context 'when a collation is specified on the criteria', if: collation_supported? do
1414
+ context 'when a collation is specified on the criteria' do
1415
+ min_server_version '3.4'
1018
1416
 
1019
1417
  let(:criteria) do
1020
1418
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1065,11 +1463,11 @@ describe Mongoid::Contextual::Mongo do
1065
1463
  describe "##{method}" do
1066
1464
 
1067
1465
  let!(:depeche_mode) do
1068
- Band.create(name: "Depeche Mode")
1466
+ Band.create!(name: "Depeche Mode")
1069
1467
  end
1070
1468
 
1071
1469
  let!(:new_order) do
1072
- Band.create(name: "New Order")
1470
+ Band.create!(name: "New Order")
1073
1471
  end
1074
1472
 
1075
1473
  context "when the context is not cached" do
@@ -1086,7 +1484,8 @@ describe Mongoid::Contextual::Mongo do
1086
1484
  expect(context.send(method)).to eq(depeche_mode)
1087
1485
  end
1088
1486
 
1089
- context 'when the criteria has a collation', if: collation_supported? do
1487
+ context 'when the criteria has a collation' do
1488
+ min_server_version '3.4'
1090
1489
 
1091
1490
  let(:criteria) do
1092
1491
  Band.where(name: "DEPECHE MODE").collation(locale: 'en_US', strength: 2)
@@ -1124,6 +1523,92 @@ describe Mongoid::Contextual::Mongo do
1124
1523
  end
1125
1524
  end
1126
1525
 
1526
+ context 'when the criteria has no sort' do
1527
+
1528
+ let(:criteria) do
1529
+ Band.all
1530
+ end
1531
+
1532
+ let(:context) do
1533
+ described_class.new(criteria)
1534
+ end
1535
+
1536
+
1537
+ it 'applies a sort on _id' do
1538
+ expect(context.send(method)).to eq(depeche_mode)
1539
+ end
1540
+
1541
+ context 'when calling #last' do
1542
+
1543
+ it 'returns the last document, sorted by _id' do
1544
+ expect(context.send(method)).to eq(depeche_mode)
1545
+ expect(context.last).to eq(new_order)
1546
+ end
1547
+ end
1548
+
1549
+ context 'with option { sort: :none }' do
1550
+
1551
+ let(:opts) do
1552
+ { id_sort: :none }
1553
+ end
1554
+
1555
+ it 'does not apply the sort on _id' do
1556
+ expect(context.send(method, opts)).to eq(depeche_mode)
1557
+ end
1558
+
1559
+ context 'when calling #last' do
1560
+
1561
+ it 'does not apply a sort on _id' do
1562
+ expect(context.send(method, opts)).to eq(depeche_mode)
1563
+ expect(context.last(opts)).to eq(depeche_mode)
1564
+ end
1565
+ end
1566
+ end
1567
+ end
1568
+
1569
+ context 'when the criteria has a sort' do
1570
+
1571
+ let(:criteria) do
1572
+ Band.desc(:name)
1573
+ end
1574
+
1575
+ let(:context) do
1576
+ described_class.new(criteria)
1577
+ end
1578
+
1579
+
1580
+ it 'applies the criteria sort' do
1581
+ expect(context.send(method)).to eq(new_order)
1582
+ end
1583
+
1584
+ context 'when calling #last' do
1585
+
1586
+ it 'applies the criteria sort' do
1587
+ expect(context.send(method)).to eq(new_order)
1588
+ expect(context.last).to eq(depeche_mode)
1589
+ end
1590
+ end
1591
+
1592
+ context 'with option { sort: :none }' do
1593
+
1594
+ let(:opts) do
1595
+ { id_sort: :none }
1596
+ end
1597
+
1598
+ it 'applies the criteria sort' do
1599
+ expect(context.send(method, opts)).to eq(new_order)
1600
+ end
1601
+
1602
+ context 'when calling #last' do
1603
+
1604
+ it 'applies the criteria sort' do
1605
+ expect(context.send(method, opts)).to eq(new_order)
1606
+ expect(context.last(opts)).to eq(depeche_mode)
1607
+ end
1608
+ end
1609
+ end
1610
+ end
1611
+
1127
1612
  context "when using .sort" do
1128
1613
 
1129
1614
  let(:criteria) do
@@ -1219,8 +1704,8 @@ describe Mongoid::Contextual::Mongo do
1219
1704
  describe "##{method}" do
1220
1705
 
1221
1706
  before do
1222
- Band.create(name: "Depeche Mode")
1223
- Band.create(name: "New Order")
1707
+ Band.create!(name: "Depeche Mode")
1708
+ Band.create!(name: "New Order")
1224
1709
  end
1225
1710
 
1226
1711
  context "when the criteria has a limit" do
@@ -1238,12 +1723,8 @@ describe Mongoid::Contextual::Mongo do
1238
1723
  end
1239
1724
 
1240
1725
  context "when calling more than once" do
1241
-
1242
- before do
1243
- expect(context.view).to receive(:count).once.and_return(2)
1244
- end
1245
-
1246
1726
  it "returns the cached value for subsequent calls" do
1727
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1247
1728
  2.times { expect(context.send(method)).to eq(2) }
1248
1729
  end
1249
1730
  end
@@ -1252,10 +1733,10 @@ describe Mongoid::Contextual::Mongo do
1252
1733
 
1253
1734
  before do
1254
1735
  context.entries
1255
- expect(context.view).to receive(:count).once.and_return(2)
1256
1736
  end
1257
1737
 
1258
1738
  it "returns the cached value for all calls" do
1739
+ expect(context.view).to receive(:count_documents).once.and_return(2)
1259
1740
  expect(context.send(method)).to eq(2)
1260
1741
  end
1261
1742
 
@@ -1287,12 +1768,8 @@ describe Mongoid::Contextual::Mongo do
1287
1768
  end
1288
1769
 
1289
1770
  context "when calling more than once" do
1290
-
1291
- before do
1292
- expect(context.view).to receive(:count).once.and_return(1)
1293
- end
1294
-
1295
1771
  it "returns the cached value for subsequent calls" do
1772
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1296
1773
  2.times { expect(context.send(method)).to eq(1) }
1297
1774
  end
1298
1775
  end
@@ -1301,10 +1778,10 @@ describe Mongoid::Contextual::Mongo do
1301
1778
 
1302
1779
  before do
1303
1780
  context.entries
1304
- expect(context.view).to receive(:count).once.and_return(1)
1305
1781
  end
1306
1782
 
1307
1783
  it "returns the cached value for all calls" do
1784
+ expect(context.view).to receive(:count_documents).once.and_return(1)
1308
1785
  expect(context.send(method)).to eq(1)
1309
1786
  end
1310
1787
 
@@ -1326,11 +1803,11 @@ describe Mongoid::Contextual::Mongo do
1326
1803
  describe "#limit" do
1327
1804
 
1328
1805
  let!(:depeche_mode) do
1329
- Band.create(name: "Depeche Mode")
1806
+ Band.create!(name: "Depeche Mode")
1330
1807
  end
1331
1808
 
1332
1809
  let!(:new_order) do
1333
- Band.create(name: "New Order")
1810
+ Band.create!(name: "New Order")
1334
1811
  end
1335
1812
 
1336
1813
  let(:criteria) do
@@ -1349,8 +1826,8 @@ describe Mongoid::Contextual::Mongo do
1349
1826
  describe "#map" do
1350
1827
 
1351
1828
  before do
1352
- Band.create(name: "Depeche Mode")
1353
- Band.create(name: "New Order")
1829
+ Band.create!(name: "Depeche Mode")
1830
+ Band.create!(name: "New Order")
1354
1831
  end
1355
1832
 
1356
1833
  let(:criteria) do
@@ -1379,11 +1856,11 @@ describe Mongoid::Contextual::Mongo do
1379
1856
  describe "#map_reduce" do
1380
1857
 
1381
1858
  let!(:depeche_mode) do
1382
- Band.create(name: "Depeche Mode", likes: 200)
1859
+ Band.create!(name: "Depeche Mode", likes: 200)
1383
1860
  end
1384
1861
 
1385
1862
  let!(:tool) do
1386
- Band.create(name: "Tool", likes: 100)
1863
+ Band.create!(name: "Tool", likes: 100)
1387
1864
  end
1388
1865
 
1389
1866
  let(:map) do
@@ -1404,6 +1881,10 @@ describe Mongoid::Contextual::Mongo do
1404
1881
  }}
1405
1882
  end
1406
1883
 
1884
+ let(:ordered_results) do
1885
+ results['results'].sort_by { |doc| doc['_id'] }
1886
+ end
1887
+
1407
1888
  context "when no selection is provided" do
1408
1889
 
1409
1890
  let(:criteria) do
@@ -1435,36 +1916,40 @@ describe Mongoid::Contextual::Mongo do
1435
1916
  end
1436
1917
 
1437
1918
  it "contains the entire raw results" do
1438
- expect(results["results"]).to eq([
1919
+ expect(ordered_results).to eq([
1439
1920
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1440
1921
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1441
1922
  ])
1442
1923
  end
1443
1924
 
1444
- it "contains the execution time" do
1445
- expect(results.time).to_not be_nil
1446
- end
1925
+ context 'when statistics are available' do
1926
+ max_server_version '4.2'
1447
1927
 
1448
- it "contains the count statistics" do
1449
- expect(results["counts"]).to eq({
1450
- "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1451
- })
1452
- end
1928
+ it "contains the execution time" do
1929
+ expect(results.time).to_not be_nil
1930
+ end
1453
1931
 
1454
- it "contains the input count" do
1455
- expect(results.input).to eq(2)
1456
- end
1932
+ it "contains the count statistics" do
1933
+ expect(results["counts"]).to eq({
1934
+ "input" => 2, "emit" => 2, "reduce" => 0, "output" => 2
1935
+ })
1936
+ end
1457
1937
 
1458
- it "contains the emitted count" do
1459
- expect(results.emitted).to eq(2)
1460
- end
1938
+ it "contains the input count" do
1939
+ expect(results.input).to eq(2)
1940
+ end
1461
1941
 
1462
- it "contains the reduced count" do
1463
- expect(results.reduced).to eq(0)
1464
- end
1942
+ it "contains the emitted count" do
1943
+ expect(results.emitted).to eq(2)
1944
+ end
1945
+
1946
+ it "contains the reduced count" do
1947
+ expect(results.reduced).to eq(0)
1948
+ end
1465
1949
 
1466
- it "contains the output count" do
1467
- expect(results.output).to eq(2)
1950
+ it "contains the output count" do
1951
+ expect(results.output).to eq(2)
1952
+ end
1468
1953
  end
1469
1954
  end
1470
1955
 
@@ -1493,35 +1978,39 @@ describe Mongoid::Contextual::Mongo do
1493
1978
  end
1494
1979
 
1495
1980
  it "contains the entire raw results" do
1496
- expect(results["results"]).to eq([
1981
+ expect(ordered_results).to eq([
1497
1982
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
1498
1983
  ])
1499
1984
  end
1500
1985
 
1501
- it "contains the execution time" do
1502
- expect(results.time).to_not be_nil
1503
- end
1986
+ context 'when statistics are available' do
1987
+ max_server_version '4.2'
1504
1988
 
1505
- it "contains the count statistics" do
1506
- expect(results["counts"]).to eq({
1507
- "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1508
- })
1509
- end
1989
+ it "contains the execution time" do
1990
+ expect(results.time).to_not be_nil
1991
+ end
1510
1992
 
1511
- it "contains the input count" do
1512
- expect(results.input).to eq(1)
1513
- end
1993
+ it "contains the count statistics" do
1994
+ expect(results["counts"]).to eq({
1995
+ "input" => 1, "emit" => 1, "reduce" => 0, "output" => 1
1996
+ })
1997
+ end
1514
1998
 
1515
- it "contains the emitted count" do
1516
- expect(results.emitted).to eq(1)
1517
- end
1999
+ it "contains the input count" do
2000
+ expect(results.input).to eq(1)
2001
+ end
1518
2002
 
1519
- it "contains the reduced count" do
1520
- expect(results.reduced).to eq(0)
1521
- end
2003
+ it "contains the emitted count" do
2004
+ expect(results.emitted).to eq(1)
2005
+ end
1522
2006
 
1523
- it "contains the output count" do
1524
- expect(results.output).to eq(1)
2007
+ it "contains the reduced count" do
2008
+ expect(results.reduced).to eq(0)
2009
+ end
2010
+
2011
+ it "contains the output count" do
2012
+ expect(results.output).to eq(1)
2013
+ end
1525
2014
  end
1526
2015
  end
1527
2016
 
@@ -1561,7 +2050,7 @@ describe Mongoid::Contextual::Mongo do
1561
2050
  end
1562
2051
 
1563
2052
  it "contains the entire raw results" do
1564
- expect(results["results"]).to eq([
2053
+ expect(ordered_results).to eq([
1565
2054
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
1566
2055
  { "_id" => "Tool", "value" => { "likes" => 100 }}
1567
2056
  ])
@@ -1569,6 +2058,9 @@ describe Mongoid::Contextual::Mongo do
1569
2058
  end
1570
2059
 
1571
2060
  context "when limiting is provided" do
2061
+ # map/reduce with limit is not supported on sharded clusters:
2062
+ # https://jira.mongodb.org/browse/SERVER-2099
2063
+ require_topology :single, :replica_set
1572
2064
 
1573
2065
  let(:criteria) do
1574
2066
  Band.limit(1)
@@ -1674,6 +2166,67 @@ describe Mongoid::Contextual::Mongo do
1674
2166
  end
1675
2167
  end
1676
2168
 
2169
+ context "when the output specifies a different db" do
2170
+ # Limit is not supported in sharded clusters
2171
+ require_topology :single, :replica_set
2172
+
2173
+ let(:criteria) do
2174
+ Band.limit(1)
2175
+ end
2176
+
2177
+ let(:context) do
2178
+ described_class.new(criteria)
2179
+ end
2180
+
2181
+ after do
2182
+ Band.with(database: 'another-db') do |b|
2183
+ b.all.delete
2184
+ end
2185
+ end
2186
+
2187
+ context 'when db is a string' do
2188
+
2189
+ let(:results) do
2190
+ context.map_reduce(map, reduce).out(merge: :mr_output, db: 'another-db')
2191
+ end
2192
+
2193
+ it "returns the correct number of documents" do
2194
+ expect(results.count).to eq(1)
2195
+ end
2196
+
2197
+ it "contains the entire results" do
2198
+ expect(results).to eq([
2199
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
2200
+ ])
2201
+ end
2202
+
2203
+ it 'writes to the specified db' do
2204
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
2205
+ end
2206
+ end
2207
+
2208
+ context 'when db is a symbol' do
2209
+
2210
+ let(:results) do
2211
+ context.map_reduce(map, reduce).out(merge: :mr_output, 'db' => 'another-db')
2212
+ end
2213
+
2214
+ it "returns the correct number of documents" do
2215
+ expect(results.count).to eq(1)
2216
+ end
2217
+
2218
+ it "contains the entire results" do
2219
+ expect(results).to eq([
2220
+ { "_id" => "Depeche Mode", "value" => { "likes" => 200 }}
2221
+ ])
2222
+ end
2223
+
2224
+ it 'writes to the specified db' do
2225
+ expect(Band.mongo_client.with(database: 'another-db')[:mr_output].find.count).to eq(1)
2226
+ end
2227
+ end
2228
+ end
2229
+
1677
2230
  context "when providing no output" do
1678
2231
 
1679
2232
  let(:criteria) do
@@ -1732,11 +2285,11 @@ describe Mongoid::Contextual::Mongo do
1732
2285
  describe "#skip" do
1733
2286
 
1734
2287
  let!(:depeche_mode) do
1735
- Band.create(name: "Depeche Mode")
2288
+ Band.create!(name: "Depeche Mode")
1736
2289
  end
1737
2290
 
1738
2291
  let!(:new_order) do
1739
- Band.create(name: "New Order")
2292
+ Band.create!(name: "New Order")
1740
2293
  end
1741
2294
 
1742
2295
  let(:criteria) do
@@ -1755,11 +2308,11 @@ describe Mongoid::Contextual::Mongo do
1755
2308
  describe "#sort" do
1756
2309
 
1757
2310
  let!(:depeche_mode) do
1758
- Band.create(name: "Depeche Mode")
2311
+ Band.create!(name: "Depeche Mode")
1759
2312
  end
1760
2313
 
1761
2314
  let!(:new_order) do
1762
- Band.create(name: "New Order")
2315
+ Band.create!(name: "New Order")
1763
2316
  end
1764
2317
 
1765
2318
  let(:criteria) do
@@ -1798,11 +2351,11 @@ describe Mongoid::Contextual::Mongo do
1798
2351
  describe "#update" do
1799
2352
 
1800
2353
  let!(:depeche_mode) do
1801
- Band.create(name: "Depeche Mode")
2354
+ Band.create!(name: "Depeche Mode")
1802
2355
  end
1803
2356
 
1804
2357
  let!(:new_order) do
1805
- Band.create(name: "New Order")
2358
+ Band.create!(name: "New Order")
1806
2359
  end
1807
2360
 
1808
2361
  let(:criteria) do
@@ -1816,11 +2369,11 @@ describe Mongoid::Contextual::Mongo do
1816
2369
  context "when adding an element to a HABTM set" do
1817
2370
 
1818
2371
  let(:person) do
1819
- Person.create
2372
+ Person.create!
1820
2373
  end
1821
2374
 
1822
2375
  let(:preference) do
1823
- Preference.create
2376
+ Preference.create!
1824
2377
  end
1825
2378
 
1826
2379
  before do
@@ -1949,16 +2502,52 @@ describe Mongoid::Contextual::Mongo do
1949
2502
  expect(context.update).to be false
1950
2503
  end
1951
2504
  end
2505
+
2506
+ context 'when provided array filters' do
2507
+ min_server_version '3.6'
2508
+
2509
+ before do
2510
+ Band.delete_all
2511
+ b = Band.new(name: 'Depeche Mode')
2512
+ b.labels << Label.new(name: 'Warner')
2513
+ b.labels << Label.new(name: 'Sony')
2514
+ b.labels << Label.new(name: 'Cbs')
2515
+ b.save!
2516
+
2517
+ b = Band.new(name: 'FKA Twigs')
2518
+ b.labels << Label.new(name: 'Warner')
2519
+ b.labels << Label.new(name: 'Cbs')
2520
+ b.save!
2521
+ end
2522
+
2523
+
2524
+ let(:criteria) do
2525
+ Band.where(name: 'Depeche Mode')
2526
+ end
2527
+
2528
+ let!(:update) do
2529
+ context.update({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2530
+ array_filters: [{ 'i.name' => 'Cbs' }])
2531
+ end
2532
+
2533
+ it 'applies the array filters' do
2534
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2535
+ end
2536
+
2537
+ it 'does not affect other documents' do
2538
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Cbs'])
2539
+ end
2540
+ end
1952
2541
  end
1953
2542
 
1954
2543
  describe "#update_all" do
1955
2544
 
1956
2545
  let!(:depeche_mode) do
1957
- Band.create(name: "Depeche Mode", origin: "Essex")
2546
+ Band.create!(name: "Depeche Mode", origin: "Essex")
1958
2547
  end
1959
2548
 
1960
2549
  let!(:new_order) do
1961
- Band.create(name: "New Order")
2550
+ Band.create!(name: "New Order")
1962
2551
  end
1963
2552
 
1964
2553
  let(:criteria) do
@@ -2086,11 +2675,47 @@ describe Mongoid::Contextual::Mongo do
2086
2675
  expect(context.update_all).to be false
2087
2676
  end
2088
2677
  end
2678
+
2679
+ context 'when provided array filters' do
2680
+ min_server_version '3.6'
2681
+
2682
+ before do
2683
+ Band.delete_all
2684
+ b = Band.new(name: 'Depeche Mode')
2685
+ b.labels << Label.new(name: 'Warner')
2686
+ b.labels << Label.new(name: 'Sony')
2687
+ b.labels << Label.new(name: 'Cbs')
2688
+ b.save!
2689
+
2690
+ b = Band.new(name: 'FKA Twigs')
2691
+ b.labels << Label.new(name: 'Warner')
2692
+ b.labels << Label.new(name: 'Cbs')
2693
+ b.save!
2694
+ end
2695
+
2696
+
2697
+ let(:criteria) do
2698
+ Band.all
2699
+ end
2700
+
2701
+ let!(:update) do
2702
+ context.update_all({ '$set' => { 'labels.$[i].name' => 'Sony' } },
2703
+ array_filters: [{ 'i.name' => 'Cbs' }])
2704
+ end
2705
+
2706
+ it 'applies the array filters' do
2707
+ expect(Band.where(name: 'Depeche Mode').first.labels.collect(&:name)).to match_array(['Warner', 'Sony', 'Sony'])
2708
+ end
2709
+
2710
+ it 'updates all documents' do
2711
+ expect(Band.where(name: 'FKA Twigs').first.labels.collect(&:name)).to match_array(['Warner', 'Sony'])
2712
+ end
2713
+ end
2089
2714
  end
2090
2715
 
2091
2716
  describe '#pipeline' do
2092
2717
 
2093
- context 'when the criteria has a selector', if: non_legacy_server? do
2718
+ context 'when the criteria has a selector' do
2094
2719
 
2095
2720
  before do
2096
2721
  Artist.index(name: "text")
@@ -2110,7 +2735,7 @@ describe Mongoid::Contextual::Mongo do
2110
2735
  end
2111
2736
 
2112
2737
  it 'creates a pipeline with the selector as one of the $match criteria' do
2113
- expect(pipeline_match).to include({ :'$text' => { :'$search' => "New Order" } })
2738
+ expect(pipeline_match).to include({ '$text' => { '$search' => "New Order" } })
2114
2739
  end
2115
2740
 
2116
2741
  it 'creates a pipeline with the $exists operator as one of the $match criteria' do