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,2297 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require_relative './selectable_shared_examples'
5
+
6
+ class FieldWithSerializer
7
+ def evolve(object)
8
+ Integer.evolve(object)
9
+ end
10
+
11
+ def localized?
12
+ false
13
+ end
14
+ end
15
+
16
+ describe Mongoid::Criteria::Queryable::Selectable do
17
+
18
+ let(:query) do
19
+ Mongoid::Query.new("id" => "_id")
20
+ end
21
+
22
+ shared_examples_for 'supports merge strategies' do
23
+
24
+ context 'when the field is not aliased' do
25
+
26
+ context "when the strategy is not set" do
27
+
28
+ let(:selection) do
29
+ query.send(query_method, first: [ 1, 2 ]).send(query_method, first: [ 3, 4 ])
30
+ end
31
+
32
+ it "combines the conditions with $and" do
33
+ expect(selection.selector).to eq({
34
+ "first" => { operator => [ 1, 2 ] },
35
+ '$and' => [{'first' => {operator => [3, 4]}}],
36
+ })
37
+ end
38
+
39
+ it_behaves_like "returns a cloned query"
40
+ end
41
+
42
+ context "when the strategy is intersect" do
43
+
44
+ let(:selection) do
45
+ query.send(query_method, first: [ 1, 2 ]).intersect.send(query_method, first: [ 2, 3 ])
46
+ end
47
+
48
+ it "intersects the conditions" do
49
+ expect(selection.selector).to eq({
50
+ "first" => { operator => [ 2 ] }
51
+ })
52
+ end
53
+
54
+ it_behaves_like "returns a cloned query"
55
+ end
56
+
57
+ context "when the strategy is override" do
58
+
59
+ let(:selection) do
60
+ query.send(query_method, first: [ 1, 2 ]).override.send(query_method, first: [ 3, 4 ])
61
+ end
62
+
63
+ it "overwrites the first condition" do
64
+ expect(selection.selector).to eq({
65
+ "first" => { operator => [ 3, 4 ] }
66
+ })
67
+ end
68
+
69
+ it_behaves_like "returns a cloned query"
70
+ end
71
+
72
+ context "when the strategy is union" do
73
+
74
+ let(:selection) do
75
+ query.send(query_method, first: [ 1, 2 ]).union.send(query_method, first: [ 3, 4 ])
76
+ end
77
+
78
+ it "unions the conditions" do
79
+ expect(selection.selector).to eq({
80
+ "first" => { operator => [ 1, 2, 3, 4 ] }
81
+ })
82
+ end
83
+
84
+ it_behaves_like "returns a cloned query"
85
+ end
86
+ end
87
+
88
+ context 'when the field is aliased' do
89
+
90
+ context "when the strategy is not set" do
91
+
92
+ let(:selection) do
93
+ query.send(query_method, id: [ 1, 2 ]).send(query_method, _id: [ 3, 4 ])
94
+ end
95
+
96
+ it "combines the conditions with $and" do
97
+ expect(selection.selector).to eq({
98
+ "_id" => { operator => [ 1, 2 ] },
99
+ '$and' => [{'_id' => {operator => [3, 4]}}],
100
+ })
101
+ end
102
+
103
+ it_behaves_like "returns a cloned query"
104
+ end
105
+
106
+ context "when the strategy is intersect" do
107
+
108
+ let(:selection) do
109
+ query.send(query_method, id: [ 1, 2 ]).intersect.send(query_method, _id: [ 2, 3 ])
110
+ end
111
+
112
+ it "intersects the conditions" do
113
+ expect(selection.selector).to eq({
114
+ "_id" => { operator => [ 2 ] }
115
+ })
116
+ end
117
+
118
+ it_behaves_like "returns a cloned query"
119
+ end
120
+
121
+ context "when the strategy is override" do
122
+
123
+ let(:selection) do
124
+ query.send(query_method, _id: [ 1, 2 ]).override.send(query_method, id: [ 3, 4 ])
125
+ end
126
+
127
+ it "overwrites the first condition" do
128
+ expect(selection.selector).to eq({
129
+ "_id" => { operator => [ 3, 4 ] }
130
+ })
131
+ end
132
+
133
+ it_behaves_like "returns a cloned query"
134
+ end
135
+
136
+ context "when the strategy is union" do
137
+
138
+ let(:selection) do
139
+ query.send(query_method, _id: [ 1, 2 ]).union.send(query_method, id: [ 3, 4 ])
140
+ end
141
+
142
+ it "unions the conditions" do
143
+ expect(selection.selector).to eq({
144
+ "_id" => { operator => [ 1, 2, 3, 4 ] }
145
+ })
146
+ end
147
+
148
+ it_behaves_like "returns a cloned query"
149
+ end
150
+ end
151
+
152
+ context 'when the field uses a serializer' do
153
+
154
+ let(:query) do
155
+ Mongoid::Query.new({}, { "field" => FieldWithSerializer.new })
156
+ end
157
+
158
+
159
+ context "when the strategy is not set" do
160
+
161
+ let(:selection) do
162
+ query.send(query_method, field: [ '1', '2' ]).send(query_method, field: [ '3', '4' ])
163
+ end
164
+
165
+ it "combines the conditions with $and" do
166
+ expect(selection.selector).to eq({
167
+ "field" => { operator => [ 1, 2 ] },
168
+ '$and' => [{'field' => {operator => [3, 4]}}],
169
+ })
170
+ end
171
+
172
+ it_behaves_like "returns a cloned query"
173
+ end
174
+
175
+ context "when the strategy is set" do
176
+
177
+ let(:selection) do
178
+ query.send(query_method, field: [ '1', '2' ]).intersect.send(query_method, field: [ '2', '3' ])
179
+ end
180
+
181
+ it "intersects the conditions" do
182
+ expect(selection.selector).to eq({
183
+ "field" => { operator => [ 2 ] }
184
+ })
185
+ end
186
+
187
+ it_behaves_like "returns a cloned query"
188
+ end
189
+ end
190
+
191
+ context 'when operator value is a Range' do
192
+
193
+ context "when there is no existing condition and strategy is not specified" do
194
+
195
+ let(:selection) do
196
+ query.send(query_method, foo: 2..4)
197
+ end
198
+
199
+ it 'expands range to array' do
200
+ expect(selection.selector).to eq({
201
+ "foo" => { operator => [ 2, 3, 4 ] }
202
+ })
203
+
204
+ end
205
+ end
206
+
207
+ context "when there is no existing condition and strategy is specified" do
208
+
209
+ let(:selection) do
210
+ query.union.send(query_method, foo: 2..4)
211
+ end
212
+
213
+ it 'expands range to array' do
214
+ expect(selection.selector).to eq({
215
+ "foo" => { operator => [ 2, 3, 4 ] }
216
+ })
217
+
218
+ end
219
+ end
220
+
221
+ context "when existing condition has Array value" do
222
+
223
+ let(:selection) do
224
+ query.send(query_method, foo: [ 1, 2 ]).union.send(query_method, foo: 2..4)
225
+ end
226
+
227
+ it 'expands range to array' do
228
+ expect(selection.selector).to eq({
229
+ "foo" => { operator => [ 1, 2, 3, 4 ] }
230
+ })
231
+
232
+ end
233
+ end
234
+
235
+ context "when existing condition has Range value" do
236
+
237
+ let(:selection) do
238
+ query.send(query_method, foo: 1..2).union.send(query_method, foo: 2..4)
239
+ end
240
+
241
+ it 'expands range to array' do
242
+ expect(selection.selector).to eq({
243
+ "foo" => { operator => [ 1, 2, 3, 4 ] }
244
+ })
245
+
246
+ end
247
+ end
248
+ end
249
+ end
250
+
251
+ describe "#all" do
252
+
253
+ let(:query_method) { :all }
254
+ let(:operator) { '$all' }
255
+
256
+ context "when provided no criterion" do
257
+
258
+ let(:selection) do
259
+ query.all
260
+ end
261
+
262
+ it "does not add any criterion" do
263
+ expect(selection.selector).to eq({})
264
+ end
265
+
266
+ it "returns the query" do
267
+ expect(selection).to eq(query)
268
+ end
269
+
270
+ it "returns a cloned query" do
271
+ expect(selection).to_not equal(query)
272
+ end
273
+ end
274
+
275
+ it_behaves_like 'requires a non-nil argument'
276
+
277
+ context "when provided a single criterion" do
278
+
279
+ context "when no serializers are provided" do
280
+
281
+ context "when providing an array" do
282
+
283
+ let(:selection) do
284
+ query.all(field: [ 1, 2 ])
285
+ end
286
+
287
+ it "adds the $all selector" do
288
+ expect(selection.selector).to eq({
289
+ "field" => { "$all" => [ 1, 2 ] }
290
+ })
291
+ end
292
+
293
+ it "returns a cloned query" do
294
+ expect(selection).to_not equal(query)
295
+ end
296
+ end
297
+
298
+ context "when providing a single value" do
299
+
300
+ let(:selection) do
301
+ query.all(field: 1)
302
+ end
303
+
304
+ it "adds the $all selector with wrapped value" do
305
+ expect(selection.selector).to eq({
306
+ "field" => { "$all" => [ 1 ] }
307
+ })
308
+ end
309
+
310
+ it "returns a cloned query" do
311
+ expect(selection).to_not equal(query)
312
+ end
313
+ end
314
+ end
315
+
316
+ context "when serializers are provided" do
317
+
318
+ before(:all) do
319
+ class Field
320
+ def evolve(object)
321
+ Integer.evolve(object)
322
+ end
323
+ def localized?
324
+ false
325
+ end
326
+ end
327
+ end
328
+
329
+ after(:all) do
330
+ Object.send(:remove_const, :Field)
331
+ end
332
+
333
+ let!(:query) do
334
+ Mongoid::Query.new({}, { "field" => Field.new })
335
+ end
336
+
337
+ context "when providing an array" do
338
+
339
+ let(:selection) do
340
+ query.all(field: [ "1", "2" ])
341
+ end
342
+
343
+ it "adds the $all selector" do
344
+ expect(selection.selector).to eq({
345
+ "field" => { "$all" => [ 1, 2 ] }
346
+ })
347
+ end
348
+
349
+ it "returns a cloned query" do
350
+ expect(selection).to_not equal(query)
351
+ end
352
+ end
353
+
354
+ context "when providing a single value" do
355
+
356
+ let(:selection) do
357
+ query.all(field: "1")
358
+ end
359
+
360
+ it "adds the $all selector with wrapped value" do
361
+ expect(selection.selector).to eq({
362
+ "field" => { "$all" => [ 1 ] }
363
+ })
364
+ end
365
+
366
+ it "returns a cloned query" do
367
+ expect(selection).to_not equal(query)
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ context "when provided multiple criterion" do
374
+
375
+ context "when the criterion are for different fields" do
376
+
377
+ let(:selection) do
378
+ query.all(first: [ 1, 2 ], second: [ 3, 4 ])
379
+ end
380
+
381
+ it "adds the $all selectors" do
382
+ expect(selection.selector).to eq({
383
+ "first" => { "$all" => [ 1, 2 ] },
384
+ "second" => { "$all" => [ 3, 4 ] }
385
+ })
386
+ end
387
+
388
+ it "returns a cloned query" do
389
+ expect(selection).to_not equal(query)
390
+ end
391
+ end
392
+ end
393
+
394
+ context "when chaining the criterion" do
395
+
396
+ context "when the criterion are for different fields" do
397
+
398
+ let(:selection) do
399
+ query.all(first: [ 1, 2 ]).all(second: [ 3, 4 ])
400
+ end
401
+
402
+ it "adds the $all selectors" do
403
+ expect(selection.selector).to eq({
404
+ "first" => { "$all" => [ 1, 2 ] },
405
+ "second" => { "$all" => [ 3, 4 ] }
406
+ })
407
+ end
408
+
409
+ it "returns a cloned query" do
410
+ expect(selection).to_not equal(query)
411
+ end
412
+ end
413
+
414
+ context "when the criterion are on the same field" do
415
+
416
+ it_behaves_like 'supports merge strategies'
417
+ end
418
+ end
419
+ end
420
+
421
+ describe "#between" do
422
+
423
+ let(:query_method) { :between }
424
+
425
+ it_behaves_like 'requires an argument'
426
+ it_behaves_like 'requires a non-nil argument'
427
+
428
+ context "when provided a single range" do
429
+
430
+ let(:selection) do
431
+ query.between(field: 1..10)
432
+ end
433
+
434
+ it "adds the $gte and $lte selectors" do
435
+ expect(selection.selector).to eq({
436
+ "field" => { "$gte" => 1, "$lte" => 10 }
437
+ })
438
+ end
439
+
440
+ it "returns a cloned query" do
441
+ expect(selection).to_not equal(query)
442
+ end
443
+ end
444
+
445
+ context "when provided multiple ranges" do
446
+
447
+ context "when the ranges are on different fields" do
448
+
449
+ let(:selection) do
450
+ query.between(field: 1..10, key: 5..7)
451
+ end
452
+
453
+ it "adds the $gte and $lte selectors" do
454
+ expect(selection.selector).to eq({
455
+ "field" => { "$gte" => 1, "$lte" => 10 },
456
+ "key" => { "$gte" => 5, "$lte" => 7 }
457
+ })
458
+ end
459
+
460
+ it "returns a cloned query" do
461
+ expect(selection).to_not equal(query)
462
+ end
463
+ end
464
+ end
465
+ end
466
+
467
+ describe "#elem_match" do
468
+
469
+ let(:query_method) { :elem_match }
470
+
471
+ it_behaves_like 'requires an argument'
472
+ it_behaves_like 'requires a non-nil argument'
473
+
474
+ context "when provided a criterion" do
475
+
476
+ context "when there are no nested complex keys" do
477
+
478
+ let(:selection) do
479
+ query.elem_match(users: { name: "value" })
480
+ end
481
+
482
+ it "adds the $elemMatch expression" do
483
+ expect(selection.selector).to eq({
484
+ "users" => { "$elemMatch" => { name: "value" }}
485
+ })
486
+ end
487
+
488
+ it "returns a cloned query" do
489
+ expect(selection).to_not equal(query)
490
+ end
491
+ end
492
+
493
+ context "when there are nested complex keys" do
494
+
495
+ let(:time) do
496
+ Time.now
497
+ end
498
+
499
+ let(:selection) do
500
+ query.elem_match(users: { :time.gt => time })
501
+ end
502
+
503
+ it "adds the $elemMatch expression" do
504
+ expect(selection.selector).to eq({
505
+ "users" => { "$elemMatch" => { "time" => { "$gt" => time }}}
506
+ })
507
+ end
508
+
509
+ it "returns a cloned query" do
510
+ expect(selection).to_not equal(query)
511
+ end
512
+ end
513
+ end
514
+
515
+ context "when providing multiple criteria" do
516
+
517
+ context "when the fields differ" do
518
+
519
+ let(:selection) do
520
+ query.elem_match(
521
+ users: { name: "value" },
522
+ comments: { text: "value" }
523
+ )
524
+ end
525
+
526
+ it "adds the $elemMatch expression" do
527
+ expect(selection.selector).to eq({
528
+ "users" => { "$elemMatch" => { name: "value" }},
529
+ "comments" => { "$elemMatch" => { text: "value" }}
530
+ })
531
+ end
532
+
533
+ it "returns a cloned query" do
534
+ expect(selection).to_not equal(query)
535
+ end
536
+ end
537
+ end
538
+
539
+ context "when chaining multiple criteria" do
540
+
541
+ context "when the fields differ" do
542
+
543
+ let(:selection) do
544
+ query.
545
+ elem_match(users: { name: "value" }).
546
+ elem_match(comments: { text: "value" })
547
+ end
548
+
549
+ it "adds the $elemMatch expression" do
550
+ expect(selection.selector).to eq({
551
+ "users" => { "$elemMatch" => { name: "value" }},
552
+ "comments" => { "$elemMatch" => { text: "value" }}
553
+ })
554
+ end
555
+
556
+ it "returns a cloned query" do
557
+ expect(selection).to_not equal(query)
558
+ end
559
+ end
560
+
561
+ context "when the fields are the same" do
562
+
563
+ let(:selection) do
564
+ query.
565
+ elem_match(users: { name: "value" }).
566
+ elem_match(users: { state: "new" })
567
+ end
568
+
569
+ it "overrides the $elemMatch expression" do
570
+ expect(selection.selector).to eq({
571
+ "users" => { "$elemMatch" => { state: "new" }}
572
+ })
573
+ end
574
+
575
+ it "returns a cloned query" do
576
+ expect(selection).to_not equal(query)
577
+ end
578
+ end
579
+ end
580
+ end
581
+
582
+ describe "#exists" do
583
+
584
+ let(:query_method) { :exists }
585
+
586
+ it_behaves_like 'requires an argument'
587
+ it_behaves_like 'requires a non-nil argument'
588
+
589
+ context "when provided a criterion" do
590
+
591
+ context "when provided a boolean" do
592
+
593
+ let(:selection) do
594
+ query.exists(users: true)
595
+ end
596
+
597
+ it "adds the $exists expression" do
598
+ expect(selection.selector).to eq({
599
+ "users" => { "$exists" => true }
600
+ })
601
+ end
602
+
603
+ it "returns a cloned query" do
604
+ expect(selection).to_not equal(query)
605
+ end
606
+ end
607
+
608
+ context "when provided a string" do
609
+
610
+ let(:selection) do
611
+ query.exists(users: "yes")
612
+ end
613
+
614
+ it "adds the $exists expression" do
615
+ expect(selection.selector).to eq({
616
+ "users" => { "$exists" => true }
617
+ })
618
+ end
619
+
620
+ it "returns a cloned query" do
621
+ expect(selection).to_not equal(query)
622
+ end
623
+ end
624
+ end
625
+
626
+ context "when providing multiple criteria" do
627
+
628
+ context "when the fields differ" do
629
+
630
+ context "when providing boolean values" do
631
+
632
+ let(:selection) do
633
+ query.exists(
634
+ users: true,
635
+ comments: true
636
+ )
637
+ end
638
+
639
+ it "adds the $exists expression" do
640
+ expect(selection.selector).to eq({
641
+ "users" => { "$exists" => true },
642
+ "comments" => { "$exists" => true }
643
+ })
644
+ end
645
+
646
+ it "returns a cloned query" do
647
+ expect(selection).to_not equal(query)
648
+ end
649
+ end
650
+
651
+ context "when providing string values" do
652
+
653
+ let(:selection) do
654
+ query.exists(
655
+ users: "y",
656
+ comments: "true"
657
+ )
658
+ end
659
+
660
+ it "adds the $exists expression" do
661
+ expect(selection.selector).to eq({
662
+ "users" => { "$exists" => true },
663
+ "comments" => { "$exists" => true }
664
+ })
665
+ end
666
+
667
+ it "returns a cloned query" do
668
+ expect(selection).to_not equal(query)
669
+ end
670
+ end
671
+ end
672
+ end
673
+
674
+ context "when chaining multiple criteria" do
675
+
676
+ context "when the fields differ" do
677
+
678
+ let(:selection) do
679
+ query.
680
+ exists(users: true).
681
+ exists(comments: true)
682
+ end
683
+
684
+ it "adds the $exists expression" do
685
+ expect(selection.selector).to eq({
686
+ "users" => { "$exists" => true },
687
+ "comments" => { "$exists" => true }
688
+ })
689
+ end
690
+
691
+ it "returns a cloned query" do
692
+ expect(selection).to_not equal(query)
693
+ end
694
+ end
695
+ end
696
+ end
697
+
698
+ %i(geo_spatial geo_spacial).each do |meth|
699
+ describe "#geo_spacial" do
700
+
701
+ let(:query_method) { meth }
702
+
703
+ it_behaves_like 'requires an argument'
704
+ it_behaves_like 'requires a non-nil argument'
705
+
706
+ context "when provided a criterion" do
707
+
708
+ context "when the geometry is a point intersection" do
709
+
710
+ let(:selection) do
711
+ query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
712
+ end
713
+
714
+ it "adds the $geoIntersects expression" do
715
+ expect(selection.selector).to eq({
716
+ "location" => {
717
+ "$geoIntersects" => {
718
+ "$geometry" => {
719
+ "type" => "Point",
720
+ "coordinates" => [ 1, 10 ]
721
+ }
722
+ }
723
+ }
724
+ })
725
+ end
726
+
727
+ it_behaves_like "returns a cloned query"
728
+ end
729
+
730
+ context "when the geometry is a line intersection" do
731
+
732
+ let(:selection) do
733
+ query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
734
+ end
735
+
736
+ it "adds the $geoIntersects expression" do
737
+ expect(selection.selector).to eq({
738
+ "location" => {
739
+ "$geoIntersects" => {
740
+ "$geometry" => {
741
+ "type" => "LineString",
742
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
743
+ }
744
+ }
745
+ }
746
+ })
747
+ end
748
+
749
+ it_behaves_like "returns a cloned query"
750
+ end
751
+
752
+ context "when the geometry is a polygon intersection" do
753
+
754
+ let(:selection) do
755
+ query.public_send(query_method,
756
+ :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
757
+ )
758
+ end
759
+
760
+ it "adds the $geoIntersects expression" do
761
+ expect(selection.selector).to eq({
762
+ "location" => {
763
+ "$geoIntersects" => {
764
+ "$geometry" => {
765
+ "type" => "Polygon",
766
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
767
+ }
768
+ }
769
+ }
770
+ })
771
+ end
772
+
773
+ it_behaves_like "returns a cloned query"
774
+ end
775
+
776
+ context "when the geometry is within a polygon" do
777
+
778
+ let(:selection) do
779
+ query.public_send(query_method,
780
+ :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
781
+ )
782
+ end
783
+
784
+ it "adds the $geoIntersects expression" do
785
+ expect(selection.selector).to eq({
786
+ "location" => {
787
+ "$geoWithin" => {
788
+ "$geometry" => {
789
+ "type" => "Polygon",
790
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
791
+ }
792
+ }
793
+ }
794
+ })
795
+ end
796
+
797
+ context "when used with the $box operator ($geoWithin query) " do
798
+ let(:selection) do
799
+ query.public_send(query_method,
800
+ :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
801
+ )
802
+ end
803
+
804
+ it "adds the $geoIntersects expression" do
805
+ expect(selection.selector).to eq({
806
+ "location" => {
807
+ "$geoWithin" => {
808
+ "$box" => [
809
+ [ 1, 10 ], [ 2, 10 ]
810
+ ]
811
+ }
812
+ }
813
+ })
814
+ end
815
+ end
816
+
817
+ it_behaves_like "returns a cloned query"
818
+ end
819
+ end
820
+ end
821
+ end
822
+
823
+ describe "#gt" do
824
+
825
+ let(:query_method) { :gt }
826
+
827
+ it_behaves_like 'requires an argument'
828
+ it_behaves_like 'requires a non-nil argument'
829
+
830
+ context "when provided a single criterion" do
831
+
832
+ let(:selection) do
833
+ query.gt(field: 10)
834
+ end
835
+
836
+ it "adds the $gt selector" do
837
+ expect(selection.selector).to eq({
838
+ "field" => { "$gt" => 10 }
839
+ })
840
+ end
841
+
842
+ it "returns a cloned query" do
843
+ expect(selection).to_not equal(query)
844
+ end
845
+ end
846
+
847
+ context "when provided multiple criterion" do
848
+
849
+ context "when the criterion are for different fields" do
850
+
851
+ let(:selection) do
852
+ query.gt(first: 10, second: 15)
853
+ end
854
+
855
+ it "adds the $gt selectors" do
856
+ expect(selection.selector).to eq({
857
+ "first" => { "$gt" => 10 },
858
+ "second" => { "$gt" => 15 }
859
+ })
860
+ end
861
+
862
+ it "returns a cloned query" do
863
+ expect(selection).to_not equal(query)
864
+ end
865
+ end
866
+ end
867
+
868
+ context "when chaining the criterion" do
869
+
870
+ context "when the criterion are for different fields" do
871
+
872
+ let(:selection) do
873
+ query.gt(first: 10).gt(second: 15)
874
+ end
875
+
876
+ it "adds the $gt selectors" do
877
+ expect(selection.selector).to eq({
878
+ "first" => { "$gt" => 10 },
879
+ "second" => { "$gt" => 15 }
880
+ })
881
+ end
882
+
883
+ it "returns a cloned query" do
884
+ expect(selection).to_not equal(query)
885
+ end
886
+ end
887
+
888
+ context "when the criterion are on the same field" do
889
+
890
+ let(:selection) do
891
+ query.gt(first: 10).gt(first: 15)
892
+ end
893
+
894
+ it "overwrites the first $gt selector" do
895
+ expect(selection.selector).to eq({
896
+ "first" => { "$gt" => 15 }
897
+ })
898
+ end
899
+
900
+ it "returns a cloned query" do
901
+ expect(selection).to_not equal(query)
902
+ end
903
+ end
904
+ end
905
+ end
906
+
907
+ describe "#gte" do
908
+
909
+ let(:query_method) { :gte }
910
+
911
+ it_behaves_like 'requires an argument'
912
+ it_behaves_like 'requires a non-nil argument'
913
+
914
+ context "when provided a single criterion" do
915
+
916
+ let(:selection) do
917
+ query.gte(field: 10)
918
+ end
919
+
920
+ it "adds the $gte selector" do
921
+ expect(selection.selector).to eq({
922
+ "field" => { "$gte" => 10 }
923
+ })
924
+ end
925
+
926
+ it "returns a cloned query" do
927
+ expect(selection).to_not equal(query)
928
+ end
929
+ end
930
+
931
+ context "when provided multiple criterion" do
932
+
933
+ context "when the criterion are for different fields" do
934
+
935
+ let(:selection) do
936
+ query.gte(first: 10, second: 15)
937
+ end
938
+
939
+ it "adds the $gte selectors" do
940
+ expect(selection.selector).to eq({
941
+ "first" => { "$gte" => 10 },
942
+ "second" => { "$gte" => 15 }
943
+ })
944
+ end
945
+
946
+ it "returns a cloned query" do
947
+ expect(selection).to_not equal(query)
948
+ end
949
+ end
950
+ end
951
+
952
+ context "when chaining the criterion" do
953
+
954
+ context "when the criterion are for different fields" do
955
+
956
+ let(:selection) do
957
+ query.gte(first: 10).gte(second: 15)
958
+ end
959
+
960
+ it "adds the $gte selectors" do
961
+ expect(selection.selector).to eq({
962
+ "first" => { "$gte" => 10 },
963
+ "second" => { "$gte" => 15 }
964
+ })
965
+ end
966
+
967
+ it "returns a cloned query" do
968
+ expect(selection).to_not equal(query)
969
+ end
970
+ end
971
+
972
+ context "when the criterion are on the same field" do
973
+
974
+ let(:selection) do
975
+ query.gte(first: 10).gte(first: 15)
976
+ end
977
+
978
+ it "overwrites the first $gte selector" do
979
+ expect(selection.selector).to eq({
980
+ "first" => { "$gte" => 15 }
981
+ })
982
+ end
983
+
984
+ it "returns a cloned query" do
985
+ expect(selection).to_not equal(query)
986
+ end
987
+ end
988
+ end
989
+ end
990
+
991
+ describe "#in" do
992
+
993
+ let(:query_method) { :in }
994
+ let(:operator) { '$in' }
995
+
996
+ it_behaves_like 'requires an argument'
997
+ it_behaves_like 'requires a non-nil argument'
998
+
999
+ context "when provided a single criterion" do
1000
+
1001
+ context "when providing an array" do
1002
+
1003
+ let(:selection) do
1004
+ query.in(field: [ 1, 2 ])
1005
+ end
1006
+
1007
+ it "adds the $in selector" do
1008
+ expect(selection.selector).to eq({
1009
+ "field" => { "$in" => [ 1, 2 ] }
1010
+ })
1011
+ end
1012
+
1013
+ it "returns a cloned query" do
1014
+ expect(selection).to_not equal(query)
1015
+ end
1016
+ end
1017
+
1018
+ context "when providing a single value" do
1019
+
1020
+ let(:selection) do
1021
+ query.in(field: 1)
1022
+ end
1023
+
1024
+ it "adds the $in selector with wrapped value" do
1025
+ expect(selection.selector).to eq({
1026
+ "field" => { "$in" => [ 1 ] }
1027
+ })
1028
+ end
1029
+
1030
+ it "returns a cloned query" do
1031
+ expect(selection).to_not equal(query)
1032
+ end
1033
+ end
1034
+ end
1035
+
1036
+ context "when provided multiple criterion" do
1037
+
1038
+ context "when the criterion are for different fields" do
1039
+
1040
+ let(:selection) do
1041
+ query.in(first: [ 1, 2 ], second: 3..4)
1042
+ end
1043
+
1044
+ it "adds the $in selectors" do
1045
+ expect(selection.selector).to eq({
1046
+ "first" => { "$in" => [ 1, 2 ] },
1047
+ "second" => { "$in" => [ 3, 4 ] }
1048
+ })
1049
+ end
1050
+
1051
+ it "returns a cloned query" do
1052
+ expect(selection).to_not equal(query)
1053
+ end
1054
+ end
1055
+ end
1056
+
1057
+ context "when chaining the criterion" do
1058
+
1059
+ context "when the criterion are for different fields" do
1060
+
1061
+ let(:selection) do
1062
+ query.in(first: [ 1, 2 ]).in(second: [ 3, 4 ])
1063
+ end
1064
+
1065
+ it "adds the $in selectors" do
1066
+ expect(selection.selector).to eq({
1067
+ "first" => { "$in" => [ 1, 2 ] },
1068
+ "second" => { "$in" => [ 3, 4 ] }
1069
+ })
1070
+ end
1071
+
1072
+ it "returns a cloned query" do
1073
+ expect(selection).to_not equal(query)
1074
+ end
1075
+ end
1076
+
1077
+ context "when the criterion are on the same field" do
1078
+
1079
+ it_behaves_like 'supports merge strategies'
1080
+ end
1081
+ end
1082
+ end
1083
+
1084
+ describe "#lt" do
1085
+
1086
+ let(:query_method) { :lt }
1087
+
1088
+ it_behaves_like 'requires an argument'
1089
+ it_behaves_like 'requires a non-nil argument'
1090
+
1091
+ context "when provided a single criterion" do
1092
+
1093
+ let(:selection) do
1094
+ query.lt(field: 10)
1095
+ end
1096
+
1097
+ it "adds the $lt selector" do
1098
+ expect(selection.selector).to eq({
1099
+ "field" => { "$lt" => 10 }
1100
+ })
1101
+ end
1102
+
1103
+ it "returns a cloned query" do
1104
+ expect(selection).to_not equal(query)
1105
+ end
1106
+ end
1107
+
1108
+ context "when provided multiple criterion" do
1109
+
1110
+ context "when the criterion are for different fields" do
1111
+
1112
+ let(:selection) do
1113
+ query.lt(first: 10, second: 15)
1114
+ end
1115
+
1116
+ it "adds the $lt selectors" do
1117
+ expect(selection.selector).to eq({
1118
+ "first" => { "$lt" => 10 },
1119
+ "second" => { "$lt" => 15 }
1120
+ })
1121
+ end
1122
+
1123
+ it "returns a cloned query" do
1124
+ expect(selection).to_not equal(query)
1125
+ end
1126
+ end
1127
+ end
1128
+
1129
+ context "when chaining the criterion" do
1130
+
1131
+ context "when the criterion are for different fields" do
1132
+
1133
+ let(:selection) do
1134
+ query.lt(first: 10).lt(second: 15)
1135
+ end
1136
+
1137
+ it "adds the $lt selectors" do
1138
+ expect(selection.selector).to eq({
1139
+ "first" => { "$lt" => 10 },
1140
+ "second" => { "$lt" => 15 }
1141
+ })
1142
+ end
1143
+
1144
+ it "returns a cloned query" do
1145
+ expect(selection).to_not equal(query)
1146
+ end
1147
+ end
1148
+
1149
+ context "when the criterion are on the same field" do
1150
+
1151
+ let(:selection) do
1152
+ query.lt(first: 10).lt(first: 15)
1153
+ end
1154
+
1155
+ it "overwrites the first $lt selector" do
1156
+ expect(selection.selector).to eq({
1157
+ "first" => { "$lt" => 15 }
1158
+ })
1159
+ end
1160
+
1161
+ it "returns a cloned query" do
1162
+ expect(selection).to_not equal(query)
1163
+ end
1164
+ end
1165
+ end
1166
+ end
1167
+
1168
+ describe "#lte" do
1169
+
1170
+ let(:query_method) { :lte }
1171
+
1172
+ it_behaves_like 'requires an argument'
1173
+ it_behaves_like 'requires a non-nil argument'
1174
+
1175
+ context "when provided a single criterion" do
1176
+
1177
+ let(:selection) do
1178
+ query.lte(field: 10)
1179
+ end
1180
+
1181
+ it "adds the $lte selector" do
1182
+ expect(selection.selector).to eq({
1183
+ "field" => { "$lte" => 10 }
1184
+ })
1185
+ end
1186
+
1187
+ it "returns a cloned query" do
1188
+ expect(selection).to_not equal(query)
1189
+ end
1190
+ end
1191
+
1192
+ context "when provided multiple criterion" do
1193
+
1194
+ context "when the criterion are for different fields" do
1195
+
1196
+ let(:selection) do
1197
+ query.lte(first: 10, second: 15)
1198
+ end
1199
+
1200
+ it "adds the $lte selectors" do
1201
+ expect(selection.selector).to eq({
1202
+ "first" => { "$lte" => 10 },
1203
+ "second" => { "$lte" => 15 }
1204
+ })
1205
+ end
1206
+
1207
+ it "returns a cloned query" do
1208
+ expect(selection).to_not equal(query)
1209
+ end
1210
+ end
1211
+ end
1212
+
1213
+ context "when chaining the criterion" do
1214
+
1215
+ context "when the criterion are for different fields" do
1216
+
1217
+ let(:selection) do
1218
+ query.lte(first: 10).lte(second: 15)
1219
+ end
1220
+
1221
+ it "adds the $lte selectors" do
1222
+ expect(selection.selector).to eq({
1223
+ "first" => { "$lte" => 10 },
1224
+ "second" => { "$lte" => 15 }
1225
+ })
1226
+ end
1227
+
1228
+ it "returns a cloned query" do
1229
+ expect(selection).to_not equal(query)
1230
+ end
1231
+ end
1232
+
1233
+ context "when the criterion are on the same field" do
1234
+
1235
+ let(:selection) do
1236
+ query.lte(first: 10).lte(first: 15)
1237
+ end
1238
+
1239
+ it "overwrites the first $lte selector" do
1240
+ expect(selection.selector).to eq({
1241
+ "first" => { "$lte" => 15 }
1242
+ })
1243
+ end
1244
+
1245
+ it "returns a cloned query" do
1246
+ expect(selection).to_not equal(query)
1247
+ end
1248
+ end
1249
+ end
1250
+ end
1251
+
1252
+ describe "#max_distance" do
1253
+
1254
+ let(:query_method) { :max_distance }
1255
+
1256
+ it_behaves_like 'requires an argument'
1257
+ it_behaves_like 'requires a non-nil argument'
1258
+
1259
+ context "when provided a criterion" do
1260
+
1261
+ context "when a $near criterion exists on the same field" do
1262
+
1263
+ let(:selection) do
1264
+ query.near(location: [ 1, 1 ]).max_distance(location: 50)
1265
+ end
1266
+
1267
+ it "adds the $maxDistance expression" do
1268
+ expect(selection.selector).to eq({
1269
+ "location" => { "$near" => [ 1, 1 ], "$maxDistance" => 50 }
1270
+ })
1271
+ end
1272
+
1273
+ it "returns a cloned query" do
1274
+ expect(selection).to_not equal(query)
1275
+ end
1276
+ end
1277
+ end
1278
+ end
1279
+
1280
+ describe "#mod" do
1281
+
1282
+ let(:query_method) { :mod }
1283
+
1284
+ it_behaves_like 'requires an argument'
1285
+ it_behaves_like 'requires a non-nil argument'
1286
+
1287
+ context "when provided a criterion" do
1288
+
1289
+ let(:selection) do
1290
+ query.mod(value: [ 10, 1 ])
1291
+ end
1292
+
1293
+ it "adds the $mod expression" do
1294
+ expect(selection.selector).to eq({
1295
+ "value" => { "$mod" => [ 10, 1 ] }
1296
+ })
1297
+ end
1298
+
1299
+ it "returns a cloned query" do
1300
+ expect(selection).to_not equal(query)
1301
+ end
1302
+ end
1303
+
1304
+ context "when providing multiple criteria" do
1305
+
1306
+ context "when the fields differ" do
1307
+
1308
+ let(:selection) do
1309
+ query.mod(
1310
+ value: [ 10, 1 ],
1311
+ comments: [ 10, 1 ]
1312
+ )
1313
+ end
1314
+
1315
+ it "adds the $mod expression" do
1316
+ expect(selection.selector).to eq({
1317
+ "value" => { "$mod" => [ 10, 1 ] },
1318
+ "comments" => { "$mod" => [ 10, 1 ] }
1319
+ })
1320
+ end
1321
+
1322
+ it "returns a cloned query" do
1323
+ expect(selection).to_not equal(query)
1324
+ end
1325
+ end
1326
+ end
1327
+
1328
+ context "when chaining multiple criteria" do
1329
+
1330
+ context "when the fields differ" do
1331
+
1332
+ let(:selection) do
1333
+ query.
1334
+ mod(value: [ 10, 1 ]).
1335
+ mod(result: [ 10, 1 ])
1336
+ end
1337
+
1338
+ it "adds the $mod expression" do
1339
+ expect(selection.selector).to eq({
1340
+ "value" => { "$mod" => [ 10, 1 ] },
1341
+ "result" => { "$mod" => [ 10, 1 ] }
1342
+ })
1343
+ end
1344
+
1345
+ it "returns a cloned query" do
1346
+ expect(selection).to_not equal(query)
1347
+ end
1348
+ end
1349
+ end
1350
+ end
1351
+
1352
+ describe "#ne" do
1353
+
1354
+ let(:query_method) { :ne }
1355
+
1356
+ it_behaves_like 'requires an argument'
1357
+ it_behaves_like 'requires a non-nil argument'
1358
+
1359
+ context "when provided a criterion" do
1360
+
1361
+ let(:selection) do
1362
+ query.ne(value: 10)
1363
+ end
1364
+
1365
+ it "adds the $ne expression" do
1366
+ expect(selection.selector).to eq({
1367
+ "value" => { "$ne" => 10 }
1368
+ })
1369
+ end
1370
+
1371
+ it "returns a cloned query" do
1372
+ expect(selection).to_not equal(query)
1373
+ end
1374
+ end
1375
+
1376
+ context "when providing multiple criteria" do
1377
+
1378
+ context "when the fields differ" do
1379
+
1380
+ let(:selection) do
1381
+ query.ne(
1382
+ value: 10,
1383
+ comments: 10
1384
+ )
1385
+ end
1386
+
1387
+ it "adds the $ne expression" do
1388
+ expect(selection.selector).to eq({
1389
+ "value" => { "$ne" => 10 },
1390
+ "comments" => { "$ne" => 10 }
1391
+ })
1392
+ end
1393
+
1394
+ it "returns a cloned query" do
1395
+ expect(selection).to_not equal(query)
1396
+ end
1397
+ end
1398
+ end
1399
+
1400
+ context "when chaining multiple criteria" do
1401
+
1402
+ context "when the fields differ" do
1403
+
1404
+ let(:selection) do
1405
+ query.
1406
+ ne(value: 10).
1407
+ ne(result: 10)
1408
+ end
1409
+
1410
+ it "adds the $ne expression" do
1411
+ expect(selection.selector).to eq({
1412
+ "value" => { "$ne" => 10 },
1413
+ "result" => { "$ne" => 10 }
1414
+ })
1415
+ end
1416
+
1417
+ it "returns a cloned query" do
1418
+ expect(selection).to_not equal(query)
1419
+ end
1420
+ end
1421
+ end
1422
+ end
1423
+
1424
+ describe "#near" do
1425
+
1426
+ let(:query_method) { :near }
1427
+
1428
+ it_behaves_like 'requires an argument'
1429
+ it_behaves_like 'requires a non-nil argument'
1430
+
1431
+ context "when provided a criterion" do
1432
+
1433
+ let(:selection) do
1434
+ query.near(location: [ 20, 21 ])
1435
+ end
1436
+
1437
+ it "adds the $near expression" do
1438
+ expect(selection.selector).to eq({
1439
+ "location" => { "$near" => [ 20, 21 ] }
1440
+ })
1441
+ end
1442
+
1443
+ it "returns a cloned query" do
1444
+ expect(selection).to_not equal(query)
1445
+ end
1446
+ end
1447
+
1448
+ context "when providing multiple criteria" do
1449
+
1450
+ context "when the fields differ" do
1451
+
1452
+ let(:selection) do
1453
+ query.near(
1454
+ location: [ 20, 21 ],
1455
+ comments: [ 20, 21 ]
1456
+ )
1457
+ end
1458
+
1459
+ it "adds the $near expression" do
1460
+ expect(selection.selector).to eq({
1461
+ "location" => { "$near" => [ 20, 21 ] },
1462
+ "comments" => { "$near" => [ 20, 21 ] }
1463
+ })
1464
+ end
1465
+
1466
+ it "returns a cloned query" do
1467
+ expect(selection).to_not equal(query)
1468
+ end
1469
+ end
1470
+ end
1471
+
1472
+ context "when chaining multiple criteria" do
1473
+
1474
+ context "when the fields differ" do
1475
+
1476
+ let(:selection) do
1477
+ query.
1478
+ near(location: [ 20, 21 ]).
1479
+ near(comments: [ 20, 21 ])
1480
+ end
1481
+
1482
+ it "adds the $near expression" do
1483
+ expect(selection.selector).to eq({
1484
+ "location" => { "$near" => [ 20, 21 ] },
1485
+ "comments" => { "$near" => [ 20, 21 ] }
1486
+ })
1487
+ end
1488
+
1489
+ it "returns a cloned query" do
1490
+ expect(selection).to_not equal(query)
1491
+ end
1492
+ end
1493
+ end
1494
+ end
1495
+
1496
+ describe "#near_sphere" do
1497
+
1498
+ let(:query_method) { :near_sphere }
1499
+
1500
+ it_behaves_like 'requires an argument'
1501
+ it_behaves_like 'requires a non-nil argument'
1502
+
1503
+ context "when provided a criterion" do
1504
+
1505
+ let(:selection) do
1506
+ query.near_sphere(location: [ 20, 21 ])
1507
+ end
1508
+
1509
+ it "adds the $nearSphere expression" do
1510
+ expect(selection.selector).to eq({
1511
+ "location" => { "$nearSphere" => [ 20, 21 ] }
1512
+ })
1513
+ end
1514
+
1515
+ it "returns a cloned query" do
1516
+ expect(selection).to_not equal(query)
1517
+ end
1518
+ end
1519
+
1520
+ context "when providing multiple criteria" do
1521
+
1522
+ context "when the fields differ" do
1523
+
1524
+ let(:selection) do
1525
+ query.near_sphere(
1526
+ location: [ 20, 21 ],
1527
+ comments: [ 20, 21 ]
1528
+ )
1529
+ end
1530
+
1531
+ it "adds the $nearSphere expression" do
1532
+ expect(selection.selector).to eq({
1533
+ "location" => { "$nearSphere" => [ 20, 21 ] },
1534
+ "comments" => { "$nearSphere" => [ 20, 21 ] }
1535
+ })
1536
+ end
1537
+
1538
+ it "returns a cloned query" do
1539
+ expect(selection).to_not equal(query)
1540
+ end
1541
+ end
1542
+ end
1543
+
1544
+ context "when chaining multiple criteria" do
1545
+
1546
+ context "when the fields differ" do
1547
+
1548
+ let(:selection) do
1549
+ query.
1550
+ near_sphere(location: [ 20, 21 ]).
1551
+ near_sphere(comments: [ 20, 21 ])
1552
+ end
1553
+
1554
+ it "adds the $nearSphere expression" do
1555
+ expect(selection.selector).to eq({
1556
+ "location" => { "$nearSphere" => [ 20, 21 ] },
1557
+ "comments" => { "$nearSphere" => [ 20, 21 ] }
1558
+ })
1559
+ end
1560
+
1561
+ it "returns a cloned query" do
1562
+ expect(selection).to_not equal(query)
1563
+ end
1564
+ end
1565
+ end
1566
+ end
1567
+
1568
+ describe "#nin" do
1569
+
1570
+ let(:query_method) { :nin }
1571
+ let(:operator) { '$nin' }
1572
+
1573
+ it_behaves_like 'requires an argument'
1574
+ it_behaves_like 'requires a non-nil argument'
1575
+
1576
+ context "when provided a single criterion" do
1577
+
1578
+ context "when providing an array" do
1579
+
1580
+ let(:selection) do
1581
+ query.nin(field: [ 1, 2 ])
1582
+ end
1583
+
1584
+ it "adds the $nin selector" do
1585
+ expect(selection.selector).to eq({
1586
+ "field" => { "$nin" => [ 1, 2 ] }
1587
+ })
1588
+ end
1589
+
1590
+ it "returns a cloned query" do
1591
+ expect(selection).to_not equal(query)
1592
+ end
1593
+ end
1594
+
1595
+ context "when providing a single value" do
1596
+
1597
+ let(:selection) do
1598
+ query.nin(field: 1)
1599
+ end
1600
+
1601
+ it "adds the $nin selector with wrapped value" do
1602
+ expect(selection.selector).to eq({
1603
+ "field" => { "$nin" => [ 1 ] }
1604
+ })
1605
+ end
1606
+
1607
+ it "returns a cloned query" do
1608
+ expect(selection).to_not equal(query)
1609
+ end
1610
+ end
1611
+ end
1612
+
1613
+ context "when provided multiple criterion" do
1614
+
1615
+ context "when the criterion are for different fields" do
1616
+
1617
+ let(:selection) do
1618
+ query.nin(first: [ 1, 2 ], second: [ 3, 4 ])
1619
+ end
1620
+
1621
+ it "adds the $nin selectors" do
1622
+ expect(selection.selector).to eq({
1623
+ "first" => { "$nin" => [ 1, 2 ] },
1624
+ "second" => { "$nin" => [ 3, 4 ] }
1625
+ })
1626
+ end
1627
+
1628
+ it "returns a cloned query" do
1629
+ expect(selection).to_not equal(query)
1630
+ end
1631
+ end
1632
+ end
1633
+
1634
+ context "when chaining the criterion" do
1635
+
1636
+ context "when the criterion are for different fields" do
1637
+
1638
+ let(:selection) do
1639
+ query.nin(first: [ 1, 2 ]).nin(second: [ 3, 4 ])
1640
+ end
1641
+
1642
+ it "adds the $nin selectors" do
1643
+ expect(selection.selector).to eq({
1644
+ "first" => { "$nin" => [ 1, 2 ] },
1645
+ "second" => { "$nin" => [ 3, 4 ] }
1646
+ })
1647
+ end
1648
+
1649
+ it "returns a cloned query" do
1650
+ expect(selection).to_not equal(query)
1651
+ end
1652
+ end
1653
+
1654
+ context "when the criterion are on the same field" do
1655
+
1656
+ it_behaves_like 'supports merge strategies'
1657
+ end
1658
+ end
1659
+ end
1660
+
1661
+ describe "#with_size" do
1662
+
1663
+ let(:query_method) { :with_size }
1664
+
1665
+ it_behaves_like 'requires an argument'
1666
+ it_behaves_like 'requires a non-nil argument'
1667
+
1668
+ context "when provided a single criterion" do
1669
+
1670
+ context "when provided an integer" do
1671
+
1672
+ let(:selection) do
1673
+ query.with_size(field: 10)
1674
+ end
1675
+
1676
+ it "adds the $size selector" do
1677
+ expect(selection.selector).to eq({
1678
+ "field" => { "$size" => 10 }
1679
+ })
1680
+ end
1681
+
1682
+ it "returns a cloned query" do
1683
+ expect(selection).to_not equal(query)
1684
+ end
1685
+ end
1686
+
1687
+ context "when provided a string" do
1688
+
1689
+ let(:selection) do
1690
+ query.with_size(field: "10")
1691
+ end
1692
+
1693
+ it "adds the $size selector with an integer" do
1694
+ expect(selection.selector).to eq({
1695
+ "field" => { "$size" => 10 }
1696
+ })
1697
+ end
1698
+
1699
+ it "returns a cloned query" do
1700
+ expect(selection).to_not equal(query)
1701
+ end
1702
+ end
1703
+ end
1704
+
1705
+ context "when provided multiple criterion" do
1706
+
1707
+ context "when the criterion are for different fields" do
1708
+
1709
+ context "when provided integers" do
1710
+
1711
+ let(:selection) do
1712
+ query.with_size(first: 10, second: 15)
1713
+ end
1714
+
1715
+ it "adds the $size selectors" do
1716
+ expect(selection.selector).to eq({
1717
+ "first" => { "$size" => 10 },
1718
+ "second" => { "$size" => 15 }
1719
+ })
1720
+ end
1721
+
1722
+ it "returns a cloned query" do
1723
+ expect(selection).to_not equal(query)
1724
+ end
1725
+ end
1726
+
1727
+ context "when provided strings" do
1728
+
1729
+ let(:selection) do
1730
+ query.with_size(first: "10", second: "15")
1731
+ end
1732
+
1733
+ it "adds the $size selectors" do
1734
+ expect(selection.selector).to eq({
1735
+ "first" => { "$size" => 10 },
1736
+ "second" => { "$size" => 15 }
1737
+ })
1738
+ end
1739
+
1740
+ it "returns a cloned query" do
1741
+ expect(selection).to_not equal(query)
1742
+ end
1743
+ end
1744
+ end
1745
+ end
1746
+
1747
+ context "when chaining the criterion" do
1748
+
1749
+ context "when the criterion are for different fields" do
1750
+
1751
+ let(:selection) do
1752
+ query.with_size(first: 10).with_size(second: 15)
1753
+ end
1754
+
1755
+ it "adds the $size selectors" do
1756
+ expect(selection.selector).to eq({
1757
+ "first" => { "$size" => 10 },
1758
+ "second" => { "$size" => 15 }
1759
+ })
1760
+ end
1761
+
1762
+ it "returns a cloned query" do
1763
+ expect(selection).to_not equal(query)
1764
+ end
1765
+ end
1766
+
1767
+ context "when the criterion are on the same field" do
1768
+
1769
+ let(:selection) do
1770
+ query.with_size(first: 10).with_size(first: 15)
1771
+ end
1772
+
1773
+ it "overwrites the first $size selector" do
1774
+ expect(selection.selector).to eq({
1775
+ "first" => { "$size" => 15 }
1776
+ })
1777
+ end
1778
+
1779
+ it "returns a cloned query" do
1780
+ expect(selection).to_not equal(query)
1781
+ end
1782
+ end
1783
+ end
1784
+ end
1785
+
1786
+ describe "#with_type" do
1787
+
1788
+ let(:query_method) { :with_type }
1789
+
1790
+ it_behaves_like 'requires an argument'
1791
+ it_behaves_like 'requires a non-nil argument'
1792
+
1793
+ context "when provided a single criterion" do
1794
+
1795
+ context "when provided an integer" do
1796
+
1797
+ let(:selection) do
1798
+ query.with_type(field: 10)
1799
+ end
1800
+
1801
+ it "adds the $type selector" do
1802
+ expect(selection.selector).to eq({
1803
+ "field" => { "$type" => 10 }
1804
+ })
1805
+ end
1806
+
1807
+ it "returns a cloned query" do
1808
+ expect(selection).to_not equal(query)
1809
+ end
1810
+ end
1811
+
1812
+ context "when provided a string" do
1813
+
1814
+ let(:selection) do
1815
+ query.with_type(field: "10")
1816
+ end
1817
+
1818
+ it "adds the $type selector" do
1819
+ expect(selection.selector).to eq({
1820
+ "field" => { "$type" => 10 }
1821
+ })
1822
+ end
1823
+
1824
+ it "returns a cloned query" do
1825
+ expect(selection).to_not equal(query)
1826
+ end
1827
+ end
1828
+ end
1829
+
1830
+ context "when provided multiple criterion" do
1831
+
1832
+ context "when the criterion are for different fields" do
1833
+
1834
+ let(:selection) do
1835
+ query.with_type(first: 10, second: 15)
1836
+ end
1837
+
1838
+ it "adds the $type selectors" do
1839
+ expect(selection.selector).to eq({
1840
+ "first" => { "$type" => 10 },
1841
+ "second" => { "$type" => 15 }
1842
+ })
1843
+ end
1844
+
1845
+ it "returns a cloned query" do
1846
+ expect(selection).to_not equal(query)
1847
+ end
1848
+ end
1849
+ end
1850
+
1851
+ context "when chaining the criterion" do
1852
+
1853
+ context "when the criterion are for different fields" do
1854
+
1855
+ let(:selection) do
1856
+ query.with_type(first: 10).with_type(second: 15)
1857
+ end
1858
+
1859
+ it "adds the $type selectors" do
1860
+ expect(selection.selector).to eq({
1861
+ "first" => { "$type" => 10 },
1862
+ "second" => { "$type" => 15 }
1863
+ })
1864
+ end
1865
+
1866
+ it "returns a cloned query" do
1867
+ expect(selection).to_not equal(query)
1868
+ end
1869
+ end
1870
+
1871
+ context "when the criterion are on the same field" do
1872
+
1873
+ let(:selection) do
1874
+ query.with_type(first: 10).with_type(first: 15)
1875
+ end
1876
+
1877
+ it "overwrites the first $type selector" do
1878
+ expect(selection.selector).to eq({
1879
+ "first" => { "$type" => 15 }
1880
+ })
1881
+ end
1882
+
1883
+ it "returns a cloned query" do
1884
+ expect(selection).to_not equal(query)
1885
+ end
1886
+ end
1887
+ end
1888
+ end
1889
+
1890
+ describe "#text_search" do
1891
+
1892
+ context "when providing a search string" do
1893
+
1894
+ let(:selection) do
1895
+ query.text_search("testing")
1896
+ end
1897
+
1898
+ it "constructs a text search document" do
1899
+ expect(selection.selector).to eq({ '$text' => { '$search' => "testing" }})
1900
+ end
1901
+
1902
+ it "returns the cloned selectable" do
1903
+ expect(selection).to be_a(Mongoid::Criteria::Queryable::Selectable)
1904
+ end
1905
+
1906
+ context "when providing text search options" do
1907
+
1908
+ let(:selection) do
1909
+ query.text_search("essais", { :$language => "fr" })
1910
+ end
1911
+
1912
+ it "constructs a text search document" do
1913
+ expect(selection.selector['$text']['$search']).to eq("essais")
1914
+ end
1915
+
1916
+ it "add the options to the text search document" do
1917
+ expect(selection.selector['$text'][:$language]).to eq("fr")
1918
+ end
1919
+
1920
+ it_behaves_like "returns a cloned query"
1921
+ end
1922
+ end
1923
+
1924
+ context 'when given more than once' do
1925
+ let(:selection) do
1926
+ query.text_search("one").text_search('two')
1927
+ end
1928
+
1929
+ # MongoDB server can only handle one text expression at a time,
1930
+ # per https://docs.mongodb.com/manual/reference/operator/query/text/.
1931
+ # Nonetheless we test that the query is built correctly when
1932
+ # a user supplies more than one text condition.
1933
+ it 'merges conditions' do
1934
+ expect(Mongoid.logger).to receive(:warn)
1935
+ expect(selection.selector).to eq('$and' => [
1936
+ {'$text' => {'$search' => 'one'}}
1937
+ ],
1938
+ '$text' => {'$search' => 'two'},
1939
+ )
1940
+ end
1941
+ end
1942
+ end
1943
+
1944
+ describe Symbol do
1945
+
1946
+ describe "#all" do
1947
+
1948
+ let(:key) do
1949
+ :field.all
1950
+ end
1951
+
1952
+ it "returns a selection key" do
1953
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
1954
+ end
1955
+
1956
+ it "sets the name as the key" do
1957
+ expect(key.name).to eq(:field)
1958
+ end
1959
+
1960
+ it "sets the operator as $all" do
1961
+ expect(key.operator).to eq("$all")
1962
+ end
1963
+ end
1964
+
1965
+ describe "#elem_match" do
1966
+
1967
+ let(:key) do
1968
+ :field.elem_match
1969
+ end
1970
+
1971
+ it "returns a selection key" do
1972
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
1973
+ end
1974
+
1975
+ it "sets the name as the key" do
1976
+ expect(key.name).to eq(:field)
1977
+ end
1978
+
1979
+ it "sets the operator as $elemMatch" do
1980
+ expect(key.operator).to eq("$elemMatch")
1981
+ end
1982
+ end
1983
+
1984
+ describe "#exists" do
1985
+
1986
+ let(:key) do
1987
+ :field.exists
1988
+ end
1989
+
1990
+ it "returns a selection key" do
1991
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
1992
+ end
1993
+
1994
+ it "sets the name as the key" do
1995
+ expect(key.name).to eq(:field)
1996
+ end
1997
+
1998
+ it "sets the operator as $exists" do
1999
+ expect(key.operator).to eq("$exists")
2000
+ end
2001
+ end
2002
+
2003
+ describe "#gt" do
2004
+
2005
+ let(:key) do
2006
+ :field.gt
2007
+ end
2008
+
2009
+ it "returns a selection key" do
2010
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2011
+ end
2012
+
2013
+ it "sets the name as the key" do
2014
+ expect(key.name).to eq(:field)
2015
+ end
2016
+
2017
+ it "sets the operator as $gt" do
2018
+ expect(key.operator).to eq("$gt")
2019
+ end
2020
+ end
2021
+
2022
+ describe "#gte" do
2023
+
2024
+ let(:key) do
2025
+ :field.gte
2026
+ end
2027
+
2028
+ it "returns a selection key" do
2029
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2030
+ end
2031
+
2032
+ it "sets the name as the key" do
2033
+ expect(key.name).to eq(:field)
2034
+ end
2035
+
2036
+ it "sets the operator as $gte" do
2037
+ expect(key.operator).to eq("$gte")
2038
+ end
2039
+ end
2040
+
2041
+ describe "#in" do
2042
+
2043
+ let(:key) do
2044
+ :field.in
2045
+ end
2046
+
2047
+ it "returns a selection key" do
2048
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2049
+ end
2050
+
2051
+ it "sets the name as the key" do
2052
+ expect(key.name).to eq(:field)
2053
+ end
2054
+
2055
+ it "sets the operator as $in" do
2056
+ expect(key.operator).to eq("$in")
2057
+ end
2058
+ end
2059
+
2060
+ describe "#lt" do
2061
+
2062
+ let(:key) do
2063
+ :field.lt
2064
+ end
2065
+
2066
+ it "returns a selection key" do
2067
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2068
+ end
2069
+
2070
+ it "sets the name as the key" do
2071
+ expect(key.name).to eq(:field)
2072
+ end
2073
+
2074
+ it "sets the operator as $lt" do
2075
+ expect(key.operator).to eq("$lt")
2076
+ end
2077
+ end
2078
+
2079
+ describe "#lte" do
2080
+
2081
+ let(:key) do
2082
+ :field.lte
2083
+ end
2084
+
2085
+ it "returns a selection key" do
2086
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2087
+ end
2088
+
2089
+ it "sets the name as the key" do
2090
+ expect(key.name).to eq(:field)
2091
+ end
2092
+
2093
+ it "sets the operator as $lte" do
2094
+ expect(key.operator).to eq("$lte")
2095
+ end
2096
+ end
2097
+
2098
+ describe "#mod" do
2099
+
2100
+ let(:key) do
2101
+ :field.mod
2102
+ end
2103
+
2104
+ it "returns a selection key" do
2105
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2106
+ end
2107
+
2108
+ it "sets the name as the key" do
2109
+ expect(key.name).to eq(:field)
2110
+ end
2111
+
2112
+ it "sets the operator as $mod" do
2113
+ expect(key.operator).to eq("$mod")
2114
+ end
2115
+ end
2116
+
2117
+ describe "#ne" do
2118
+
2119
+ let(:key) do
2120
+ :field.ne
2121
+ end
2122
+
2123
+ it "returns a selection key" do
2124
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2125
+ end
2126
+
2127
+ it "sets the name as the key" do
2128
+ expect(key.name).to eq(:field)
2129
+ end
2130
+
2131
+ it "sets the operator as $ne" do
2132
+ expect(key.operator).to eq("$ne")
2133
+ end
2134
+ end
2135
+
2136
+ describe "#near" do
2137
+
2138
+ let(:key) do
2139
+ :field.near
2140
+ end
2141
+
2142
+ it "returns a selection key" do
2143
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2144
+ end
2145
+
2146
+ it "sets the name as the key" do
2147
+ expect(key.name).to eq(:field)
2148
+ end
2149
+
2150
+ it "sets the operator as $near" do
2151
+ expect(key.operator).to eq("$near")
2152
+ end
2153
+ end
2154
+
2155
+ describe "#near_sphere" do
2156
+
2157
+ let(:key) do
2158
+ :field.near_sphere
2159
+ end
2160
+
2161
+ it "returns a selection key" do
2162
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2163
+ end
2164
+
2165
+ it "sets the name as the key" do
2166
+ expect(key.name).to eq(:field)
2167
+ end
2168
+
2169
+ it "sets the operator as $nearSphere" do
2170
+ expect(key.operator).to eq("$nearSphere")
2171
+ end
2172
+ end
2173
+
2174
+ describe "#nin" do
2175
+
2176
+ let(:key) do
2177
+ :field.nin
2178
+ end
2179
+
2180
+ it "returns a selection key" do
2181
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2182
+ end
2183
+
2184
+ it "sets the name as the key" do
2185
+ expect(key.name).to eq(:field)
2186
+ end
2187
+
2188
+ it "sets the operator as $nin" do
2189
+ expect(key.operator).to eq("$nin")
2190
+ end
2191
+ end
2192
+
2193
+ describe "#not" do
2194
+
2195
+ let(:key) do
2196
+ :field.not
2197
+ end
2198
+
2199
+ it "returns a selection key" do
2200
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2201
+ end
2202
+
2203
+ it "sets the name as the key" do
2204
+ expect(key.name).to eq(:field)
2205
+ end
2206
+
2207
+ it "sets the operator as $not" do
2208
+ expect(key.operator).to eq("$not")
2209
+ end
2210
+
2211
+ end
2212
+
2213
+ describe "#with_size" do
2214
+
2215
+ let(:key) do
2216
+ :field.with_size
2217
+ end
2218
+
2219
+ it "returns a selection key" do
2220
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2221
+ end
2222
+
2223
+ it "sets the name as the key" do
2224
+ expect(key.name).to eq(:field)
2225
+ end
2226
+
2227
+ it "sets the operator as $size" do
2228
+ expect(key.operator).to eq("$size")
2229
+ end
2230
+ end
2231
+
2232
+ describe "#with_type" do
2233
+
2234
+ let(:key) do
2235
+ :field.with_type
2236
+ end
2237
+
2238
+ it "returns a selection key" do
2239
+ expect(key).to be_a(Mongoid::Criteria::Queryable::Key)
2240
+ end
2241
+
2242
+ it "sets the name as the key" do
2243
+ expect(key.name).to eq(:field)
2244
+ end
2245
+
2246
+ it "sets the operator as $type" do
2247
+ expect(key.operator).to eq("$type")
2248
+ end
2249
+ end
2250
+ end
2251
+
2252
+ context "when using multiple strategies on the same field" do
2253
+
2254
+ context "when using the strategies via methods" do
2255
+
2256
+ context "when different operators are specified" do
2257
+
2258
+ let(:selection) do
2259
+ query.gt(field: 5).lt(field: 10).ne(field: 7)
2260
+ end
2261
+
2262
+ it "merges the strategies on the same field" do
2263
+ expect(selection.selector).to eq(
2264
+ "field" => { "$gt" => 5, "$lt" => 10, "$ne" => 7 }
2265
+ )
2266
+ end
2267
+ end
2268
+
2269
+ context "when the same operator is specified" do
2270
+
2271
+ let(:selection) do
2272
+ query.where(field: 5).where(field: 10)
2273
+ end
2274
+
2275
+ it "combines conditions" do
2276
+ expect(selection.selector).to eq("field" => 5, '$and' => [{'field' => 10}] )
2277
+ end
2278
+ end
2279
+ end
2280
+
2281
+ context "when using the strategies via #where" do
2282
+
2283
+ context "when using complex keys with different operators" do
2284
+
2285
+ let(:selection) do
2286
+ query.where(:field.gt => 5, :field.lt => 10, :field.ne => 7)
2287
+ end
2288
+
2289
+ it "merges the strategies on the same field" do
2290
+ expect(selection.selector).to eq(
2291
+ "field" => { "$gt" => 5, "$lt" => 10, "$ne" => 7 }
2292
+ )
2293
+ end
2294
+ end
2295
+ end
2296
+ end
2297
+ end