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
@@ -0,0 +1,1801 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe Mongoid::Criteria::Queryable::Optional do
6
+
7
+ let(:query) do
8
+ Mongoid::Query.new
9
+ end
10
+
11
+ shared_examples_for "a cloning option" do
12
+
13
+ it "returns a cloned query" do
14
+ expect(selection).to_not equal(query)
15
+ end
16
+ end
17
+
18
+ [ :asc, :ascending ].each do |method|
19
+
20
+ describe "##{method}" do
21
+
22
+ context "when using the official mongodb driver syntax" do
23
+
24
+ context "when the query is aggregating" do
25
+
26
+ let(:selection) do
27
+ query.project(name: 1).send(method, :field_one, :field_two)
28
+ end
29
+
30
+ it "adds the sorting criteria" do
31
+ expect(selection.options).to eq(
32
+ { sort: { "field_one" => 1, "field_two" => 1 }}
33
+ )
34
+ end
35
+
36
+ it "adds the sort to the aggregation" do
37
+ expect(selection.pipeline).to include(
38
+ { "$sort" => { "field_one" => 1, "field_two" => 1 }}
39
+ )
40
+ end
41
+
42
+ it "does not add multiple entries to the pipeline" do
43
+ expect(selection.pipeline).to_not include(
44
+ { "$sort" => { "field_one" => 1 }}
45
+ )
46
+ end
47
+
48
+ it_behaves_like "a cloning option"
49
+ end
50
+
51
+ context "when provided symbols" do
52
+
53
+ let(:selection) do
54
+ query.send(method, :field_one, :field_two)
55
+ end
56
+
57
+ it "adds the sorting criteria" do
58
+ expect(selection.options).to eq(
59
+ { sort: { "field_one" => 1, "field_two" => 1 }}
60
+ )
61
+ end
62
+
63
+ it_behaves_like "a cloning option"
64
+ end
65
+
66
+ context "when provided an array of symbols" do
67
+
68
+ let(:selection) do
69
+ query.send(method, [ :field_one, :field_two ])
70
+ end
71
+
72
+ it "adds the sorting criteria" do
73
+ expect(selection.options).to eq(
74
+ { sort: { "field_one" => 1, "field_two" => 1 }}
75
+ )
76
+ end
77
+
78
+ it_behaves_like "a cloning option"
79
+ end
80
+
81
+ context "when provided strings" do
82
+
83
+ let(:selection) do
84
+ query.send(method, "field_one", "field_two")
85
+ end
86
+
87
+ it "adds the sorting criteria" do
88
+ expect(selection.options).to eq(
89
+ { sort: { "field_one" => 1, "field_two" => 1 }}
90
+ )
91
+ end
92
+
93
+ it_behaves_like "a cloning option"
94
+ end
95
+
96
+ context "when provided an array of strings" do
97
+
98
+ let(:selection) do
99
+ query.send(method, [ "field_one", "field_two" ])
100
+ end
101
+
102
+ it "adds the sorting criteria" do
103
+ expect(selection.options).to eq(
104
+ { sort: { "field_one" => 1, "field_two" => 1 }}
105
+ )
106
+ end
107
+
108
+ it_behaves_like "a cloning option"
109
+ end
110
+
111
+ context "when provided no options" do
112
+
113
+ let(:selection) do
114
+ query.send(method)
115
+ end
116
+
117
+ it "does not add any sorting criteria" do
118
+ expect(selection.options).to be_empty
119
+ end
120
+
121
+ it "returns the query" do
122
+ expect(selection).to eq(query)
123
+ end
124
+
125
+ it_behaves_like "a cloning option"
126
+ end
127
+
128
+ context "when provided nil" do
129
+
130
+ let(:selection) do
131
+ query.send(method, nil)
132
+ end
133
+
134
+ it "does not add any sorting criteria" do
135
+ expect(selection.options).to be_empty
136
+ end
137
+
138
+ it "returns the query" do
139
+ expect(selection).to eq(query)
140
+ end
141
+
142
+ it_behaves_like "a cloning option"
143
+ end
144
+ end
145
+
146
+ context "when using the mongo-1.x driver syntax" do
147
+
148
+ let(:query) do
149
+ Mongoid::Query.new({}, {}, :mongo1x)
150
+ end
151
+
152
+ context "when provided symbols" do
153
+
154
+ let(:selection) do
155
+ query.send(method, :field_one, :field_two)
156
+ end
157
+
158
+ it "adds the sorting criteria" do
159
+ expect(selection.options).to eq(
160
+ { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
161
+ )
162
+ end
163
+
164
+ it_behaves_like "a cloning option"
165
+ end
166
+
167
+ context "when provided an array of symbols" do
168
+
169
+ let(:selection) do
170
+ query.send(method, [ :field_one, :field_two ])
171
+ end
172
+
173
+ it "adds the sorting criteria" do
174
+ expect(selection.options).to eq(
175
+ { sort: [[ :field_one, 1 ], [ :field_two, 1 ]]}
176
+ )
177
+ end
178
+
179
+ it_behaves_like "a cloning option"
180
+ end
181
+
182
+ context "when provided strings" do
183
+
184
+ let(:selection) do
185
+ query.send(method, "field_one", "field_two")
186
+ end
187
+
188
+ it "adds the sorting criteria" do
189
+ expect(selection.options).to eq(
190
+ { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
191
+ )
192
+ end
193
+
194
+ it_behaves_like "a cloning option"
195
+ end
196
+
197
+ context "when provided an array of strings" do
198
+
199
+ let(:selection) do
200
+ query.send(method, [ "field_one", "field_two" ])
201
+ end
202
+
203
+ it "adds the sorting criteria" do
204
+ expect(selection.options).to eq(
205
+ { sort: [[ "field_one", 1 ], [ "field_two", 1 ]]}
206
+ )
207
+ end
208
+
209
+ it_behaves_like "a cloning option"
210
+ end
211
+
212
+ context "when provided no options" do
213
+
214
+ let(:selection) do
215
+ query.send(method)
216
+ end
217
+
218
+ it "does not add any sorting criteria" do
219
+ expect(selection.options).to be_empty
220
+ end
221
+
222
+ it "returns the query" do
223
+ expect(selection).to eq(query)
224
+ end
225
+
226
+ it_behaves_like "a cloning option"
227
+ end
228
+
229
+ context "when provided nil" do
230
+
231
+ let(:selection) do
232
+ query.send(method, nil)
233
+ end
234
+
235
+ it "does not add any sorting criteria" do
236
+ expect(selection.options).to be_empty
237
+ end
238
+
239
+ it "returns the query" do
240
+ expect(selection).to eq(query)
241
+ end
242
+
243
+ it_behaves_like "a cloning option"
244
+ end
245
+ end
246
+ end
247
+ end
248
+
249
+ describe "#batch_size" do
250
+
251
+ context "when provided no options" do
252
+
253
+ let(:selection) do
254
+ query.batch_size
255
+ end
256
+
257
+ it "does not add any options" do
258
+ expect(selection.options).to eq({})
259
+ end
260
+
261
+ it_behaves_like "a cloning option"
262
+ end
263
+
264
+ context "when provided nil" do
265
+
266
+ let(:selection) do
267
+ query.batch_size(nil)
268
+ end
269
+
270
+ it "does not add any options" do
271
+ expect(selection.options).to eq({})
272
+ end
273
+
274
+ it_behaves_like "a cloning option"
275
+ end
276
+
277
+ context "when provided arguments" do
278
+
279
+ let(:selection) do
280
+ query.batch_size(500)
281
+ end
282
+
283
+ it "adds the field options" do
284
+ expect(selection.options).to eq({ batch_size: 500 })
285
+ end
286
+
287
+ it_behaves_like "a cloning option"
288
+ end
289
+ end
290
+
291
+ [ :desc, :descending ].each do |method|
292
+
293
+ describe "##{method}" do
294
+
295
+ context "when using the official mongodb driver syntax" do
296
+
297
+ context "when the query is aggregating" do
298
+
299
+ let(:selection) do
300
+ query.project(name: 1).send(method, :field_one, :field_two)
301
+ end
302
+
303
+ it "adds the sorting criteria" do
304
+ expect(selection.options).to eq(
305
+ { sort: { "field_one" => -1, "field_two" => -1 }}
306
+ )
307
+ end
308
+
309
+ it "adds the sort to the aggregation" do
310
+ expect(selection.pipeline).to include(
311
+ { "$sort" => { "field_one" => -1, "field_two" => -1 }}
312
+ )
313
+ end
314
+
315
+ it "does not add multiple entries to the pipeline" do
316
+ expect(selection.pipeline).to_not include(
317
+ { "$sort" => { "field_one" => -1 }}
318
+ )
319
+ end
320
+
321
+ it_behaves_like "a cloning option"
322
+ end
323
+
324
+ context "when provided symbols" do
325
+
326
+ let(:selection) do
327
+ query.send(method, :field_one, :field_two)
328
+ end
329
+
330
+ it "adds the sorting criteria" do
331
+ expect(selection.options).to eq(
332
+ { sort: { "field_one" => -1, "field_two" => -1 }}
333
+ )
334
+ end
335
+
336
+ it_behaves_like "a cloning option"
337
+ end
338
+
339
+ context "when provided an array of symbols" do
340
+
341
+ let(:selection) do
342
+ query.send(method, [ :field_one, :field_two ])
343
+ end
344
+
345
+ it "adds the sorting criteria" do
346
+ expect(selection.options).to eq(
347
+ { sort: { "field_one" => -1, "field_two" => -1 }}
348
+ )
349
+ end
350
+
351
+ it_behaves_like "a cloning option"
352
+ end
353
+
354
+ context "when provided strings" do
355
+
356
+ let(:selection) do
357
+ query.send(method, "field_one", "field_two")
358
+ end
359
+
360
+ it "adds the sorting criteria" do
361
+ expect(selection.options).to eq(
362
+ { sort: { "field_one" => -1, "field_two" => -1 }}
363
+ )
364
+ end
365
+
366
+ it_behaves_like "a cloning option"
367
+ end
368
+
369
+ context "when provided an array of strings" do
370
+
371
+ let(:selection) do
372
+ query.send(method, [ "field_one", "field_two" ])
373
+ end
374
+
375
+ it "adds the sorting criteria" do
376
+ expect(selection.options).to eq(
377
+ { sort: { "field_one" => -1, "field_two" => -1 }}
378
+ )
379
+ end
380
+
381
+ it_behaves_like "a cloning option"
382
+ end
383
+
384
+ context "when provided no options" do
385
+
386
+ let(:selection) do
387
+ query.send(method)
388
+ end
389
+
390
+ it "does not add any sorting criteria" do
391
+ expect(selection.options).to be_empty
392
+ end
393
+
394
+ it "returns the query" do
395
+ expect(selection).to eq(query)
396
+ end
397
+
398
+ it_behaves_like "a cloning option"
399
+ end
400
+
401
+ context "when provided nil" do
402
+
403
+ let(:selection) do
404
+ query.send(method, nil)
405
+ end
406
+
407
+ it "does not add any sorting criteria" do
408
+ expect(selection.options).to be_empty
409
+ end
410
+
411
+ it "returns the query" do
412
+ expect(selection).to eq(query)
413
+ end
414
+
415
+ it_behaves_like "a cloning option"
416
+ end
417
+ end
418
+
419
+ context "when using the mongo-1.x driver syntax" do
420
+
421
+ let(:query) do
422
+ Mongoid::Query.new({}, {}, :mongo1x)
423
+ end
424
+
425
+ context "when provided symbols" do
426
+
427
+ let(:selection) do
428
+ query.send(method, :field_one, :field_two)
429
+ end
430
+
431
+ it "adds the sorting criteria" do
432
+ expect(selection.options).to eq(
433
+ { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
434
+ )
435
+ end
436
+
437
+ it_behaves_like "a cloning option"
438
+ end
439
+
440
+ context "when provided an array of symbols" do
441
+
442
+ let(:selection) do
443
+ query.send(method, [ :field_one, :field_two ])
444
+ end
445
+
446
+ it "adds the sorting criteria" do
447
+ expect(selection.options).to eq(
448
+ { sort: [[ :field_one, -1 ], [ :field_two, -1 ]]}
449
+ )
450
+ end
451
+
452
+ it_behaves_like "a cloning option"
453
+ end
454
+
455
+ context "when provided strings" do
456
+
457
+ let(:selection) do
458
+ query.send(method, "field_one", "field_two")
459
+ end
460
+
461
+ it "adds the sorting criteria" do
462
+ expect(selection.options).to eq(
463
+ { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
464
+ )
465
+ end
466
+
467
+ it_behaves_like "a cloning option"
468
+ end
469
+
470
+ context "when provided an array of strings" do
471
+
472
+ let(:selection) do
473
+ query.send(method, [ "field_one", "field_two" ])
474
+ end
475
+
476
+ it "adds the sorting criteria" do
477
+ expect(selection.options).to eq(
478
+ { sort: [[ "field_one", -1 ], [ "field_two", -1 ]]}
479
+ )
480
+ end
481
+
482
+ it_behaves_like "a cloning option"
483
+ end
484
+
485
+ context "when provided no options" do
486
+
487
+ let(:selection) do
488
+ query.send(method)
489
+ end
490
+
491
+ it "does not add any sorting criteria" do
492
+ expect(selection.options).to be_empty
493
+ end
494
+
495
+ it "returns the query" do
496
+ expect(selection).to eq(query)
497
+ end
498
+
499
+ it_behaves_like "a cloning option"
500
+ end
501
+
502
+ context "when provided nil" do
503
+
504
+ let(:selection) do
505
+ query.send(method, nil)
506
+ end
507
+
508
+ it "does not add any sorting criteria" do
509
+ expect(selection.options).to be_empty
510
+ end
511
+
512
+ it "returns the query" do
513
+ expect(selection).to eq(query)
514
+ end
515
+
516
+ it_behaves_like "a cloning option"
517
+ end
518
+ end
519
+ end
520
+ end
521
+
522
+ describe "#hint" do
523
+
524
+ context "when provided no options" do
525
+
526
+ let(:selection) do
527
+ query.hint
528
+ end
529
+
530
+ it "does not add any options" do
531
+ expect(selection.options).to eq({})
532
+ end
533
+
534
+ it "returns the query" do
535
+ expect(selection).to eq(query)
536
+ end
537
+
538
+ it_behaves_like "a cloning option"
539
+ end
540
+
541
+ context "when provided nil" do
542
+
543
+ let(:selection) do
544
+ query.hint(nil)
545
+ end
546
+
547
+ it "does not add any options" do
548
+ expect(selection.options).to eq({})
549
+ end
550
+
551
+ it "returns the query" do
552
+ expect(selection).to eq(query)
553
+ end
554
+
555
+ it_behaves_like "a cloning option"
556
+ end
557
+
558
+ context "when provided arguments" do
559
+
560
+ context "when the argument is a hash" do
561
+
562
+ let(:selection) do
563
+ query.hint("$natural" => 1)
564
+ end
565
+
566
+ it "adds the field options" do
567
+ expect(selection.options).to eq({ hint: { "$natural" => 1 }})
568
+ end
569
+
570
+ it_behaves_like "a cloning option"
571
+ end
572
+ end
573
+ end
574
+
575
+ describe "#limit" do
576
+
577
+ context "when provided no options" do
578
+
579
+ let(:selection) do
580
+ query.limit
581
+ end
582
+
583
+ it "does not add any options" do
584
+ expect(selection.options).to eq({})
585
+ end
586
+
587
+ it "returns the query" do
588
+ expect(selection).to eq(query)
589
+ end
590
+
591
+ it_behaves_like "a cloning option"
592
+ end
593
+
594
+ context "when provided nil" do
595
+
596
+ let(:selection) do
597
+ query.limit(nil)
598
+ end
599
+
600
+ it "does not add any options" do
601
+ expect(selection.options).to eq({})
602
+ end
603
+
604
+ it "returns the query" do
605
+ expect(selection).to eq(query)
606
+ end
607
+
608
+ it_behaves_like "a cloning option"
609
+ end
610
+
611
+ context "when the query is aggregating" do
612
+
613
+ let(:selection) do
614
+ query.project(name: 1).limit(10)
615
+ end
616
+
617
+ it "adds the field options" do
618
+ expect(selection.options).to eq({ limit: 10 })
619
+ end
620
+
621
+ it "adds the limit to the aggregation" do
622
+ expect(selection.pipeline).to include({ "$limit" => 10 })
623
+ end
624
+
625
+ it_behaves_like "a cloning option"
626
+ end
627
+
628
+ context "when provided arguments" do
629
+
630
+ context "when the argument is an integer" do
631
+
632
+ let(:selection) do
633
+ query.limit(10)
634
+ end
635
+
636
+ it "adds the field options" do
637
+ expect(selection.options).to eq({ limit: 10 })
638
+ end
639
+
640
+ it_behaves_like "a cloning option"
641
+ end
642
+
643
+ context "when the argument is a float" do
644
+
645
+ let(:selection) do
646
+ query.limit(10.25)
647
+ end
648
+
649
+ it "adds the field options as an integer" do
650
+ expect(selection.options).to eq({ limit: 10 })
651
+ end
652
+
653
+ it_behaves_like "a cloning option"
654
+ end
655
+
656
+ context "when the argument is a string" do
657
+
658
+ let(:selection) do
659
+ query.limit("10")
660
+ end
661
+
662
+ it "adds the field options as an integer" do
663
+ expect(selection.options).to eq({ limit: 10 })
664
+ end
665
+
666
+ it_behaves_like "a cloning option"
667
+ end
668
+ end
669
+ end
670
+
671
+ describe "#max_scan" do
672
+
673
+ context "when provided no options" do
674
+
675
+ let(:selection) do
676
+ query.max_scan
677
+ end
678
+
679
+ it "does not add any options" do
680
+ expect(selection.options).to eq({})
681
+ end
682
+
683
+ it "returns the query" do
684
+ expect(selection).to eq(query)
685
+ end
686
+
687
+ it_behaves_like "a cloning option"
688
+ end
689
+
690
+ context "when provided nil" do
691
+
692
+ let(:selection) do
693
+ query.max_scan(nil)
694
+ end
695
+
696
+ it "does not add any options" do
697
+ expect(selection.options).to eq({})
698
+ end
699
+
700
+ it "returns the query" do
701
+ expect(selection).to eq(query)
702
+ end
703
+
704
+ it_behaves_like "a cloning option"
705
+ end
706
+
707
+ context "when provided arguments" do
708
+
709
+ let(:selection) do
710
+ query.max_scan(500)
711
+ end
712
+
713
+ it "adds the field options" do
714
+ expect(selection.options).to eq({ max_scan: 500 })
715
+ end
716
+
717
+ it_behaves_like "a cloning option"
718
+ end
719
+ end
720
+
721
+ describe "#max_time_ms" do
722
+
723
+ context "when provided no options" do
724
+
725
+ let(:selection) do
726
+ query.max_time_ms
727
+ end
728
+
729
+ it "does not add any options" do
730
+ expect(selection.options).to eq({})
731
+ end
732
+
733
+ it "returns the query" do
734
+ expect(selection).to eq(query)
735
+ end
736
+
737
+ it_behaves_like "a cloning option"
738
+ end
739
+
740
+ context "when provided nil" do
741
+
742
+ let(:selection) do
743
+ query.max_time_ms(nil)
744
+ end
745
+
746
+ it "does not add any options" do
747
+ expect(selection.options).to eq({})
748
+ end
749
+
750
+ it "returns the query" do
751
+ expect(selection).to eq(query)
752
+ end
753
+
754
+ it_behaves_like "a cloning option"
755
+ end
756
+
757
+ context "when provided arguments" do
758
+
759
+ let(:selection) do
760
+ query.max_time_ms(500)
761
+ end
762
+
763
+ it "adds the field options" do
764
+ expect(selection.options).to eq({ max_time_ms: 500 })
765
+ end
766
+
767
+ it_behaves_like "a cloning option"
768
+ end
769
+ end
770
+
771
+ describe "#no_timeout" do
772
+
773
+ let(:selection) do
774
+ query.no_timeout
775
+ end
776
+
777
+ it "adds the timeout option" do
778
+ expect(selection.options).to eq({ timeout: false })
779
+ end
780
+
781
+ it_behaves_like "a cloning option"
782
+ end
783
+
784
+ describe "#only" do
785
+
786
+ context "when provided no options" do
787
+
788
+ let(:selection) do
789
+ query.only
790
+ end
791
+
792
+ it "does not add any options" do
793
+ expect(selection.options).to eq({})
794
+ end
795
+
796
+ it "returns the query" do
797
+ expect(selection).to eq(query)
798
+ end
799
+
800
+ it_behaves_like "a cloning option"
801
+ end
802
+
803
+ context "when provided nil" do
804
+
805
+ let(:selection) do
806
+ query.only(nil)
807
+ end
808
+
809
+ it "does not add any options" do
810
+ expect(selection.options).to eq({})
811
+ end
812
+
813
+ it "returns the query" do
814
+ expect(selection).to eq(query)
815
+ end
816
+
817
+ it_behaves_like "a cloning option"
818
+ end
819
+
820
+ context "when provided fields" do
821
+
822
+ context "as several arguments" do
823
+
824
+ let(:selection) do
825
+ query.only(:first, :second)
826
+ end
827
+
828
+ it "adds the field options" do
829
+ expect(selection.options).to eq(
830
+ { fields: { "first" => 1, "second" => 1 }}
831
+ )
832
+ end
833
+
834
+ it_behaves_like "a cloning option"
835
+ end
836
+
837
+ context "as one argument - array" do
838
+
839
+ let(:selection) do
840
+ query.only([:first, :second])
841
+ end
842
+
843
+ it "adds the field options" do
844
+ expect(selection.options).to eq(
845
+ { fields: { "first" => 1, "second" => 1 }}
846
+ )
847
+ end
848
+
849
+ it_behaves_like "a cloning option"
850
+ end
851
+ end
852
+
853
+ context "when #without was called first" do
854
+
855
+ let(:selection) do
856
+ query.without(:id).only(:first)
857
+ end
858
+
859
+ it "adds both fields to option" do
860
+ expect(selection.options).to eq(
861
+ { fields: { "id" => 0, "first" => 1 } }
862
+ )
863
+ end
864
+ end
865
+ end
866
+
867
+ [ :order, :order_by ].each do |method|
868
+
869
+ describe "##{method}" do
870
+
871
+ context "when using the official mongodb driver syntax" do
872
+
873
+ context "when provided a hash" do
874
+
875
+ context "when the query is aggregating" do
876
+
877
+ let(:selection) do
878
+ query.project(name: 1).send("#{method}", field_one: 1, field_two: -1)
879
+ end
880
+
881
+ it "adds the sorting criteria" do
882
+ expect(selection.options).to eq(
883
+ { sort: { "field_one" => 1, "field_two" => -1 }}
884
+ )
885
+ end
886
+
887
+ it "adds the sort to the aggregation" do
888
+ expect(selection.pipeline).to include(
889
+ { "$sort" => { "field_one" => 1, "field_two" => -1 }}
890
+ )
891
+ end
892
+
893
+ it "does not add multiple entries to the pipeline" do
894
+ expect(selection.pipeline).to_not include(
895
+ { "$sort" => { "field_one" => 1 }}
896
+ )
897
+ end
898
+
899
+ it_behaves_like "a cloning option"
900
+ end
901
+
902
+ context "when the hash has integer values" do
903
+
904
+ let(:selection) do
905
+ query.send("#{method}", field_one: 1, field_two: -1)
906
+ end
907
+
908
+ it "adds the sorting criteria" do
909
+ expect(selection.options).to eq(
910
+ { sort: { "field_one" => 1, "field_two" => -1 }}
911
+ )
912
+ end
913
+
914
+ it_behaves_like "a cloning option"
915
+ end
916
+
917
+ context "when the hash has symbol values" do
918
+
919
+ let(:selection) do
920
+ query.send("#{method}", field_one: :asc, field_two: :desc)
921
+ end
922
+
923
+ it "adds the sorting criteria" do
924
+ expect(selection.options).to eq(
925
+ { sort: { "field_one" => 1, "field_two" => -1 }}
926
+ )
927
+ end
928
+
929
+ it_behaves_like "a cloning option"
930
+ end
931
+
932
+ context "when the hash has string values" do
933
+
934
+ let(:selection) do
935
+ query.send("#{method}", field_one: "asc", field_two: "desc")
936
+ end
937
+
938
+ it "adds the sorting criteria" do
939
+ expect(selection.options).to eq(
940
+ { sort: { "field_one" => 1, "field_two" => -1 }}
941
+ )
942
+ end
943
+
944
+ it_behaves_like "a cloning option"
945
+ end
946
+ end
947
+
948
+ context "when provided an array" do
949
+
950
+ context "when the array is multi-dimensional" do
951
+
952
+ context "when the arrays have integer values" do
953
+
954
+ let(:selection) do
955
+ query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
956
+ end
957
+
958
+ it "adds the sorting criteria" do
959
+ expect(selection.options).to eq(
960
+ { sort: { "field_one" => 1, "field_two" => -1 }}
961
+ )
962
+ end
963
+
964
+ it_behaves_like "a cloning option"
965
+ end
966
+
967
+ context "when the arrays have symbol values" do
968
+
969
+ let(:selection) do
970
+ query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
971
+ end
972
+
973
+ it "adds the sorting criteria" do
974
+ expect(selection.options).to eq(
975
+ { sort: { "field_one" => 1, "field_two" => -1 }}
976
+ )
977
+ end
978
+
979
+ it_behaves_like "a cloning option"
980
+ end
981
+
982
+ context "when the arrays have string values" do
983
+
984
+ let(:selection) do
985
+ query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
986
+ end
987
+
988
+ it "adds the sorting criteria" do
989
+ expect(selection.options).to eq(
990
+ { sort: { "field_one" => 1, "field_two" => -1 }}
991
+ )
992
+ end
993
+
994
+ it_behaves_like "a cloning option"
995
+ end
996
+ end
997
+
998
+ context "when the array is selectable keys" do
999
+
1000
+ let(:selection) do
1001
+ query.send("#{method}", [ :field_one.asc, :field_two.desc ])
1002
+ end
1003
+
1004
+ it "adds the sorting criteria" do
1005
+ expect(selection.options).to eq(
1006
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1007
+ )
1008
+ end
1009
+
1010
+ it_behaves_like "a cloning option"
1011
+ end
1012
+ end
1013
+
1014
+ context "when provided values" do
1015
+
1016
+ context "when the values are arrays" do
1017
+
1018
+ context "when the values have integer directions" do
1019
+
1020
+ let(:selection) do
1021
+ query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
1022
+ end
1023
+
1024
+ it "adds the sorting criteria" do
1025
+ expect(selection.options).to eq(
1026
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1027
+ )
1028
+ end
1029
+
1030
+ it_behaves_like "a cloning option"
1031
+ end
1032
+
1033
+ context "when the values have symbol directions" do
1034
+
1035
+ let(:selection) do
1036
+ query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
1037
+ end
1038
+
1039
+ it "adds the sorting criteria" do
1040
+ expect(selection.options).to eq(
1041
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1042
+ )
1043
+ end
1044
+
1045
+ it_behaves_like "a cloning option"
1046
+ end
1047
+
1048
+ context "when the values have string directions" do
1049
+
1050
+ let(:selection) do
1051
+ query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
1052
+ end
1053
+
1054
+ it "adds the sorting criteria" do
1055
+ expect(selection.options).to eq(
1056
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1057
+ )
1058
+ end
1059
+
1060
+ it_behaves_like "a cloning option"
1061
+ end
1062
+ end
1063
+
1064
+ context "when the values are selectable keys" do
1065
+
1066
+ let(:selection) do
1067
+ query.send("#{method}", :field_one.asc, :field_two.desc)
1068
+ end
1069
+
1070
+ it "adds the sorting criteria" do
1071
+ expect(selection.options).to eq(
1072
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1073
+ )
1074
+ end
1075
+
1076
+ it_behaves_like "a cloning option"
1077
+ end
1078
+ end
1079
+
1080
+ context "when provided a string" do
1081
+
1082
+ context "when the direction is lowercase" do
1083
+
1084
+ context "when abbreviated" do
1085
+
1086
+ let(:selection) do
1087
+ query.send("#{method}", "field_one asc, field_two desc")
1088
+ end
1089
+
1090
+ it "adds the sorting criteria" do
1091
+ expect(selection.options).to eq(
1092
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1093
+ )
1094
+ end
1095
+
1096
+ it_behaves_like "a cloning option"
1097
+ end
1098
+
1099
+ context "when spelled out" do
1100
+
1101
+ let(:selection) do
1102
+ query.send("#{method}", "field_one ascending, field_two descending")
1103
+ end
1104
+
1105
+ it "adds the sorting criteria" do
1106
+ expect(selection.options).to eq(
1107
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1108
+ )
1109
+ end
1110
+
1111
+ it_behaves_like "a cloning option"
1112
+ end
1113
+ end
1114
+
1115
+ context "when the direction is uppercase" do
1116
+
1117
+ context "when abbreviated" do
1118
+
1119
+ let(:selection) do
1120
+ query.send("#{method}", "field_one ASC, field_two DESC")
1121
+ end
1122
+
1123
+ it "adds the sorting criteria" do
1124
+ expect(selection.options).to eq(
1125
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1126
+ )
1127
+ end
1128
+
1129
+ it_behaves_like "a cloning option"
1130
+ end
1131
+
1132
+ context "when spelled out" do
1133
+
1134
+ let(:selection) do
1135
+ query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
1136
+ end
1137
+
1138
+ it "adds the sorting criteria" do
1139
+ expect(selection.options).to eq(
1140
+ { sort: { "field_one" => 1, "field_two" => -1 }}
1141
+ )
1142
+ end
1143
+
1144
+ it_behaves_like "a cloning option"
1145
+ end
1146
+ end
1147
+ end
1148
+
1149
+ context "when provided no options" do
1150
+
1151
+ let(:selection) do
1152
+ query.order_by
1153
+ end
1154
+
1155
+ it "returns the query" do
1156
+ expect(selection).to eq(query)
1157
+ end
1158
+
1159
+ it_behaves_like "a cloning option"
1160
+ end
1161
+
1162
+ context "when provided nil" do
1163
+
1164
+ let(:selection) do
1165
+ query.send("#{method}", nil)
1166
+ end
1167
+
1168
+ it "returns the query" do
1169
+ expect(selection).to eq(query)
1170
+ end
1171
+
1172
+ it_behaves_like "a cloning option"
1173
+ end
1174
+ end
1175
+
1176
+ context "when using the mongo-1.x driver syntax" do
1177
+
1178
+ let(:query) do
1179
+ Mongoid::Query.new({}, {}, :mongo1x)
1180
+ end
1181
+
1182
+ context "when provided a hash" do
1183
+
1184
+ context "when the hash has integer values" do
1185
+
1186
+ let(:selection) do
1187
+ query.send("#{method}", field_one: 1, field_two: -1)
1188
+ end
1189
+
1190
+ it "adds the sorting criteria" do
1191
+ expect(selection.options).to eq(
1192
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1193
+ )
1194
+ end
1195
+
1196
+ it_behaves_like "a cloning option"
1197
+ end
1198
+
1199
+ context "when the hash has symbol values" do
1200
+
1201
+ let(:selection) do
1202
+ query.send("#{method}", field_one: :asc, field_two: :desc)
1203
+ end
1204
+
1205
+ it "adds the sorting criteria" do
1206
+ expect(selection.options).to eq(
1207
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1208
+ )
1209
+ end
1210
+
1211
+ it_behaves_like "a cloning option"
1212
+ end
1213
+
1214
+ context "when the hash has string values" do
1215
+
1216
+ let(:selection) do
1217
+ query.send("#{method}", field_one: "asc", field_two: "desc")
1218
+ end
1219
+
1220
+ it "adds the sorting criteria" do
1221
+ expect(selection.options).to eq(
1222
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1223
+ )
1224
+ end
1225
+
1226
+ it_behaves_like "a cloning option"
1227
+ end
1228
+ end
1229
+
1230
+ context "when provided an array" do
1231
+
1232
+ context "when the array is multi-dimensional" do
1233
+
1234
+ context "when the arrays have integer values" do
1235
+
1236
+ let(:selection) do
1237
+ query.send("#{method}", [[ :field_one, 1 ],[ :field_two, -1 ]])
1238
+ end
1239
+
1240
+ it "adds the sorting criteria" do
1241
+ expect(selection.options).to eq(
1242
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1243
+ )
1244
+ end
1245
+
1246
+ it_behaves_like "a cloning option"
1247
+ end
1248
+
1249
+ context "when the arrays have symbol values" do
1250
+
1251
+ let(:selection) do
1252
+ query.send("#{method}", [[ :field_one, :asc ],[ :field_two, :desc ]])
1253
+ end
1254
+
1255
+ it "adds the sorting criteria" do
1256
+ expect(selection.options).to eq(
1257
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1258
+ )
1259
+ end
1260
+
1261
+ it_behaves_like "a cloning option"
1262
+ end
1263
+
1264
+ context "when the arrays have string values" do
1265
+
1266
+ let(:selection) do
1267
+ query.send("#{method}", [[ :field_one, "asc" ],[ :field_two, "desc" ]])
1268
+ end
1269
+
1270
+ it "adds the sorting criteria" do
1271
+ expect(selection.options).to eq(
1272
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1273
+ )
1274
+ end
1275
+
1276
+ it_behaves_like "a cloning option"
1277
+ end
1278
+ end
1279
+
1280
+ context "when the array is selectable keys" do
1281
+
1282
+ let(:selection) do
1283
+ query.send("#{method}", [ :field_one.asc, :field_two.desc ])
1284
+ end
1285
+
1286
+ it "adds the sorting criteria" do
1287
+ expect(selection.options).to eq(
1288
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1289
+ )
1290
+ end
1291
+
1292
+ it_behaves_like "a cloning option"
1293
+ end
1294
+ end
1295
+
1296
+ context "when provided values" do
1297
+
1298
+ context "when the values are arrays" do
1299
+
1300
+ context "when the values have integer directions" do
1301
+
1302
+ let(:selection) do
1303
+ query.send("#{method}", [ :field_one, 1 ],[ :field_two, -1 ])
1304
+ end
1305
+
1306
+ it "adds the sorting criteria" do
1307
+ expect(selection.options).to eq(
1308
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1309
+ )
1310
+ end
1311
+
1312
+ it_behaves_like "a cloning option"
1313
+ end
1314
+
1315
+ context "when the values have symbol directions" do
1316
+
1317
+ let(:selection) do
1318
+ query.send("#{method}", [ :field_one, :asc ],[ :field_two, :desc ])
1319
+ end
1320
+
1321
+ it "adds the sorting criteria" do
1322
+ expect(selection.options).to eq(
1323
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1324
+ )
1325
+ end
1326
+
1327
+ it_behaves_like "a cloning option"
1328
+ end
1329
+
1330
+ context "when the values have string directions" do
1331
+
1332
+ let(:selection) do
1333
+ query.send("#{method}", [ :field_one, "asc" ],[ :field_two, "desc" ])
1334
+ end
1335
+
1336
+ it "adds the sorting criteria" do
1337
+ expect(selection.options).to eq(
1338
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1339
+ )
1340
+ end
1341
+
1342
+ it_behaves_like "a cloning option"
1343
+ end
1344
+ end
1345
+
1346
+ context "when the values are selectable keys" do
1347
+
1348
+ let(:selection) do
1349
+ query.send("#{method}", :field_one.asc, :field_two.desc)
1350
+ end
1351
+
1352
+ it "adds the sorting criteria" do
1353
+ expect(selection.options).to eq(
1354
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1355
+ )
1356
+ end
1357
+
1358
+ it_behaves_like "a cloning option"
1359
+ end
1360
+ end
1361
+
1362
+ context "when provided a string" do
1363
+
1364
+ context "when the direction is lowercase" do
1365
+
1366
+ context "when abbreviated" do
1367
+
1368
+ let(:selection) do
1369
+ query.send("#{method}", "field_one asc, field_two desc")
1370
+ end
1371
+
1372
+ it "adds the sorting criteria" do
1373
+ expect(selection.options).to eq(
1374
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1375
+ )
1376
+ end
1377
+
1378
+ it_behaves_like "a cloning option"
1379
+ end
1380
+
1381
+ context "when spelled out" do
1382
+
1383
+ let(:selection) do
1384
+ query.send("#{method}", "field_one ascending, field_two descending")
1385
+ end
1386
+
1387
+ it "adds the sorting criteria" do
1388
+ expect(selection.options).to eq(
1389
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1390
+ )
1391
+ end
1392
+
1393
+ it_behaves_like "a cloning option"
1394
+ end
1395
+ end
1396
+
1397
+ context "when the direction is uppercase" do
1398
+
1399
+ context "when abbreviated" do
1400
+
1401
+ let(:selection) do
1402
+ query.send("#{method}", "field_one ASC, field_two DESC")
1403
+ end
1404
+
1405
+ it "adds the sorting criteria" do
1406
+ expect(selection.options).to eq(
1407
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1408
+ )
1409
+ end
1410
+
1411
+ it_behaves_like "a cloning option"
1412
+ end
1413
+
1414
+ context "when spelled out" do
1415
+
1416
+ let(:selection) do
1417
+ query.send("#{method}", "field_one ASCENDING, field_two DESCENDING")
1418
+ end
1419
+
1420
+ it "adds the sorting criteria" do
1421
+ expect(selection.options).to eq(
1422
+ { sort: [[ :field_one, 1 ], [ :field_two, -1 ]]}
1423
+ )
1424
+ end
1425
+
1426
+ it_behaves_like "a cloning option"
1427
+ end
1428
+ end
1429
+ end
1430
+
1431
+ context "when provided no options" do
1432
+
1433
+ let(:selection) do
1434
+ query.order_by
1435
+ end
1436
+
1437
+ it "returns the query" do
1438
+ expect(selection).to eq(query)
1439
+ end
1440
+
1441
+ it_behaves_like "a cloning option"
1442
+ end
1443
+
1444
+ context "when provided nil" do
1445
+
1446
+ let(:selection) do
1447
+ query.send("#{method}", nil)
1448
+ end
1449
+
1450
+ it "returns the query" do
1451
+ expect(selection).to eq(query)
1452
+ end
1453
+
1454
+ it_behaves_like "a cloning option"
1455
+ end
1456
+ end
1457
+ end
1458
+ end
1459
+
1460
+ describe "#reoder" do
1461
+
1462
+ let(:selection) do
1463
+ query.order_by(field_one: 1, field_two: -1)
1464
+ end
1465
+
1466
+ let!(:reordered) do
1467
+ selection.reorder(field_three: 1)
1468
+ end
1469
+
1470
+ it "replaces all order options with the new options" do
1471
+ expect(reordered.options).to eq(sort: { "field_three" => 1 })
1472
+ end
1473
+
1474
+ it 'does not alter the original criteria object' do
1475
+ expect(selection.options[:sort]).to eq({ 'field_one' => 1, 'field_two' => -1 })
1476
+ end
1477
+ end
1478
+
1479
+ [ :skip, :offset ].each do |method|
1480
+
1481
+ describe "\##{method}" do
1482
+
1483
+ context "when provided no options" do
1484
+
1485
+ let(:selection) do
1486
+ query.send(method)
1487
+ end
1488
+
1489
+ it "does not add any options" do
1490
+ expect(selection.options).to eq({})
1491
+ end
1492
+
1493
+ it "returns the query" do
1494
+ expect(selection).to eq(query)
1495
+ end
1496
+
1497
+ it_behaves_like "a cloning option"
1498
+ end
1499
+
1500
+ context "when provided nil" do
1501
+
1502
+ let(:selection) do
1503
+ query.send(method, nil)
1504
+ end
1505
+
1506
+ it "does not add any options" do
1507
+ expect(selection.options).to eq({})
1508
+ end
1509
+
1510
+ it "returns the query" do
1511
+ expect(selection).to eq(query)
1512
+ end
1513
+
1514
+ it_behaves_like "a cloning option"
1515
+ end
1516
+
1517
+ context "when the query is aggregating" do
1518
+
1519
+ let(:selection) do
1520
+ query.project(name: 1).skip(10)
1521
+ end
1522
+
1523
+ it "adds the field options" do
1524
+ expect(selection.options).to eq({ skip: 10 })
1525
+ end
1526
+
1527
+ it "adds the skip to the aggregation" do
1528
+ expect(selection.pipeline).to include({ "$skip" => 10 })
1529
+ end
1530
+
1531
+ it_behaves_like "a cloning option"
1532
+ end
1533
+
1534
+ context "when provided arguments" do
1535
+
1536
+ context "when provided an integer" do
1537
+
1538
+ let(:selection) do
1539
+ query.send(method, 10)
1540
+ end
1541
+
1542
+ it "adds the field options" do
1543
+ expect(selection.options).to eq({ skip: 10 })
1544
+ end
1545
+
1546
+ it_behaves_like "a cloning option"
1547
+ end
1548
+
1549
+ context "when provided a float" do
1550
+
1551
+ let(:selection) do
1552
+ query.send(method, 10.25)
1553
+ end
1554
+
1555
+ it "adds the field options converted to an integer" do
1556
+ expect(selection.options).to eq({ skip: 10 })
1557
+ end
1558
+
1559
+ it_behaves_like "a cloning option"
1560
+ end
1561
+
1562
+ context "when provided a non number" do
1563
+
1564
+ let(:selection) do
1565
+ query.send(method, "10")
1566
+ end
1567
+
1568
+ it "adds the field options converted to an integer" do
1569
+ expect(selection.options).to eq({ skip: 10 })
1570
+ end
1571
+
1572
+ it_behaves_like "a cloning option"
1573
+ end
1574
+ end
1575
+ end
1576
+ end
1577
+
1578
+ describe "#slice" do
1579
+
1580
+ context "when provided no options" do
1581
+
1582
+ let(:selection) do
1583
+ query.slice
1584
+ end
1585
+
1586
+ it "does not add any options" do
1587
+ expect(selection.options).to eq({})
1588
+ end
1589
+
1590
+ it "returns the query" do
1591
+ expect(selection).to eq(query)
1592
+ end
1593
+
1594
+ it_behaves_like "a cloning option"
1595
+ end
1596
+
1597
+ context "when provided nil" do
1598
+
1599
+ let(:selection) do
1600
+ query.slice(nil)
1601
+ end
1602
+
1603
+ it "does not add any options" do
1604
+ expect(selection.options).to eq({})
1605
+ end
1606
+
1607
+ it "returns the query" do
1608
+ expect(selection).to eq(query)
1609
+ end
1610
+
1611
+ it_behaves_like "a cloning option"
1612
+ end
1613
+
1614
+ context "when provided a single argument" do
1615
+
1616
+ let(:selection) do
1617
+ query.slice(:first => 5)
1618
+ end
1619
+
1620
+ it "adds the field options" do
1621
+ expect(selection.options).to eq(
1622
+ { fields: { "first" => { "$slice" => 5 }}}
1623
+ )
1624
+ end
1625
+
1626
+ it_behaves_like "a cloning option"
1627
+ end
1628
+
1629
+ context "when provided a multiple arguments" do
1630
+
1631
+ let(:selection) do
1632
+ query.slice(:first => 5, :second => [ 0, 3 ])
1633
+ end
1634
+
1635
+ it "adds the field options" do
1636
+ expect(selection.options).to eq({ fields:
1637
+ { "first" => { "$slice" => 5 }, "second" => { "$slice" => [ 0, 3 ] }}
1638
+ })
1639
+ end
1640
+
1641
+ it_behaves_like "a cloning option"
1642
+ end
1643
+
1644
+ context "when existing field arguments exist" do
1645
+
1646
+ let(:limited) do
1647
+ query.only(:name)
1648
+ end
1649
+
1650
+ let(:selection) do
1651
+ limited.slice(:first => 5, :second => [ 0, 3 ])
1652
+ end
1653
+
1654
+ it "adds the field options" do
1655
+ expect(selection.options).to eq({
1656
+ fields: {
1657
+ "name" => 1,
1658
+ "first" => { "$slice" => 5 },
1659
+ "second" => { "$slice" => [ 0, 3 ] }
1660
+ }
1661
+ })
1662
+ end
1663
+
1664
+ it_behaves_like "a cloning option"
1665
+ end
1666
+ end
1667
+
1668
+ describe "#snapshot" do
1669
+
1670
+ let(:selection) do
1671
+ query.snapshot
1672
+ end
1673
+
1674
+ it "adds the snapshot option" do
1675
+ expect(selection.options).to eq({ snapshot: true })
1676
+ end
1677
+
1678
+ it_behaves_like "a cloning option"
1679
+ end
1680
+
1681
+ describe "#comment" do
1682
+
1683
+ let(:selection) do
1684
+ query.comment('slow query')
1685
+ end
1686
+
1687
+ it "adds the comment option" do
1688
+ expect(selection.options).to eq({ comment: 'slow query' })
1689
+ end
1690
+
1691
+ it_behaves_like "a cloning option"
1692
+ end
1693
+
1694
+ describe "#cursor_type" do
1695
+
1696
+ let(:selection) do
1697
+ query.cursor_type(:tailable)
1698
+ end
1699
+
1700
+ it "adds the cursor type option" do
1701
+ expect(selection.options).to eq({ cursor_type: :tailable })
1702
+ end
1703
+
1704
+ it_behaves_like "a cloning option"
1705
+ end
1706
+
1707
+ describe "#collation" do
1708
+
1709
+ let(:selection) do
1710
+ query.collation(locale: 'fr', strength: 2)
1711
+ end
1712
+
1713
+ it "adds the collation option" do
1714
+ expect(selection.options).to eq(collation: {'locale' => 'fr', 'strength' => 2})
1715
+ end
1716
+
1717
+ it_behaves_like "a cloning option"
1718
+ end
1719
+
1720
+ describe "#without" do
1721
+
1722
+ context "when provided no options" do
1723
+
1724
+ let(:selection) do
1725
+ query.without
1726
+ end
1727
+
1728
+ it "does not add any options" do
1729
+ expect(selection.options).to eq({})
1730
+ end
1731
+
1732
+ it "returns the query" do
1733
+ expect(selection).to eq(query)
1734
+ end
1735
+
1736
+ it_behaves_like "a cloning option"
1737
+ end
1738
+
1739
+ context "when provided nil" do
1740
+
1741
+ let(:selection) do
1742
+ query.without(nil)
1743
+ end
1744
+
1745
+ it "does not add any options" do
1746
+ expect(selection.options).to eq({})
1747
+ end
1748
+
1749
+ it "returns the query" do
1750
+ expect(selection).to eq(query)
1751
+ end
1752
+
1753
+ it_behaves_like "a cloning option"
1754
+ end
1755
+
1756
+ context "when provided fields" do
1757
+
1758
+ context "as several arguments" do
1759
+
1760
+ let(:selection) do
1761
+ query.without(:first, :second)
1762
+ end
1763
+
1764
+ it "adds the field options" do
1765
+ expect(selection.options).to eq(
1766
+ { fields: { "first" => 0, "second" => 0 }}
1767
+ )
1768
+ end
1769
+
1770
+ it_behaves_like "a cloning option"
1771
+ end
1772
+
1773
+ context "as one argument - array" do
1774
+
1775
+ let(:selection) do
1776
+ query.without([:first, :second])
1777
+ end
1778
+
1779
+ it "adds the field options" do
1780
+ expect(selection.options).to eq(
1781
+ { fields: { "first" => 0, "second" => 0 }}
1782
+ )
1783
+ end
1784
+
1785
+ it_behaves_like "a cloning option"
1786
+ end
1787
+ end
1788
+
1789
+ context "when #only was called before" do
1790
+ let(:selection) do
1791
+ query.only(:first).without(:id)
1792
+ end
1793
+
1794
+ it "adds both fields to options" do
1795
+ expect(selection.options).to eq(
1796
+ { fields: { "first" => 1, "id" => 0 } }
1797
+ )
1798
+ end
1799
+ end
1800
+ end
1801
+ end