mongoid 7.0.13 → 7.1.0.rc0

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 (860) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +7 -7
  5. data/LICENSE +1 -1
  6. data/README.md +24 -18
  7. data/Rakefile +7 -45
  8. data/lib/config/locales/en.yml +56 -47
  9. data/lib/mongoid.rb +8 -1
  10. data/lib/mongoid/association.rb +9 -6
  11. data/lib/mongoid/association/accessors.rb +95 -52
  12. data/lib/mongoid/association/bindable.rb +7 -5
  13. data/lib/mongoid/association/builders.rb +4 -3
  14. data/lib/mongoid/association/constrainable.rb +4 -2
  15. data/lib/mongoid/association/depending.rb +5 -2
  16. data/lib/mongoid/association/eager_loadable.rb +2 -0
  17. data/lib/mongoid/association/embedded.rb +3 -0
  18. data/lib/mongoid/association/embedded/batchable.rb +4 -2
  19. data/lib/mongoid/association/embedded/cyclic.rb +8 -6
  20. data/lib/mongoid/association/embedded/embedded_in.rb +6 -3
  21. data/lib/mongoid/association/embedded/embedded_in/binding.rb +4 -1
  22. data/lib/mongoid/association/embedded/embedded_in/buildable.rb +8 -2
  23. data/lib/mongoid/association/embedded/embedded_in/proxy.rb +15 -12
  24. data/lib/mongoid/association/embedded/embeds_many.rb +8 -6
  25. data/lib/mongoid/association/embedded/embeds_many/binding.rb +5 -2
  26. data/lib/mongoid/association/embedded/embeds_many/buildable.rb +9 -3
  27. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +41 -38
  28. data/lib/mongoid/association/embedded/embeds_one.rb +8 -6
  29. data/lib/mongoid/association/embedded/embeds_one/binding.rb +5 -2
  30. data/lib/mongoid/association/embedded/embeds_one/buildable.rb +10 -4
  31. data/lib/mongoid/association/embedded/embeds_one/proxy.rb +17 -14
  32. data/lib/mongoid/association/macros.rb +38 -36
  33. data/lib/mongoid/association/many.rb +11 -9
  34. data/lib/mongoid/association/marshalable.rb +3 -1
  35. data/lib/mongoid/association/nested.rb +4 -1
  36. data/lib/mongoid/association/nested/many.rb +17 -15
  37. data/lib/mongoid/association/nested/nested_buildable.rb +6 -3
  38. data/lib/mongoid/association/nested/one.rb +11 -9
  39. data/lib/mongoid/association/one.rb +3 -1
  40. data/lib/mongoid/association/options.rb +9 -6
  41. data/lib/mongoid/association/proxy.rb +12 -10
  42. data/lib/mongoid/association/referenced.rb +3 -0
  43. data/lib/mongoid/association/referenced/auto_save.rb +4 -1
  44. data/lib/mongoid/association/referenced/belongs_to.rb +6 -3
  45. data/lib/mongoid/association/referenced/belongs_to/binding.rb +3 -1
  46. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +6 -3
  47. data/lib/mongoid/association/referenced/belongs_to/eager.rb +2 -0
  48. data/lib/mongoid/association/referenced/belongs_to/proxy.rb +16 -14
  49. data/lib/mongoid/association/referenced/counter_cache.rb +2 -0
  50. data/lib/mongoid/association/referenced/eager.rb +9 -7
  51. data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +13 -6
  52. data/lib/mongoid/association/referenced/has_and_belongs_to_many/binding.rb +12 -6
  53. data/lib/mongoid/association/referenced/has_and_belongs_to_many/buildable.rb +5 -2
  54. data/lib/mongoid/association/referenced/has_and_belongs_to_many/eager.rb +2 -0
  55. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +25 -18
  56. data/lib/mongoid/association/referenced/has_many.rb +7 -4
  57. data/lib/mongoid/association/referenced/has_many/binding.rb +3 -1
  58. data/lib/mongoid/association/referenced/has_many/buildable.rb +5 -2
  59. data/lib/mongoid/association/referenced/has_many/eager.rb +2 -0
  60. data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -3
  61. data/lib/mongoid/association/referenced/has_many/proxy.rb +43 -41
  62. data/lib/mongoid/association/referenced/has_one.rb +5 -2
  63. data/lib/mongoid/association/referenced/has_one/binding.rb +4 -2
  64. data/lib/mongoid/association/referenced/has_one/buildable.rb +8 -1
  65. data/lib/mongoid/association/referenced/has_one/eager.rb +2 -0
  66. data/lib/mongoid/association/referenced/has_one/nested_builder.rb +11 -9
  67. data/lib/mongoid/association/referenced/has_one/proxy.rb +17 -15
  68. data/lib/mongoid/association/referenced/syncable.rb +7 -5
  69. data/lib/mongoid/association/reflections.rb +7 -5
  70. data/lib/mongoid/association/relatable.rb +17 -14
  71. data/lib/mongoid/atomic.rb +5 -13
  72. data/lib/mongoid/atomic/modifiers.rb +24 -1
  73. data/lib/mongoid/atomic/paths.rb +2 -0
  74. data/lib/mongoid/atomic/paths/embedded.rb +2 -0
  75. data/lib/mongoid/atomic/paths/embedded/many.rb +4 -2
  76. data/lib/mongoid/atomic/paths/embedded/one.rb +4 -2
  77. data/lib/mongoid/atomic/paths/root.rb +4 -2
  78. data/lib/mongoid/attributes.rb +35 -49
  79. data/lib/mongoid/attributes/dynamic.rb +2 -0
  80. data/lib/mongoid/attributes/nested.rb +7 -5
  81. data/lib/mongoid/attributes/processing.rb +8 -6
  82. data/lib/mongoid/attributes/readonly.rb +3 -1
  83. data/lib/mongoid/cacheable.rb +3 -1
  84. data/lib/mongoid/changeable.rb +3 -1
  85. data/lib/mongoid/clients.rb +2 -0
  86. data/lib/mongoid/clients/factory.rb +1 -0
  87. data/lib/mongoid/clients/options.rb +2 -0
  88. data/lib/mongoid/clients/sessions.rb +7 -20
  89. data/lib/mongoid/clients/storage_options.rb +2 -0
  90. data/lib/mongoid/clients/validators.rb +2 -0
  91. data/lib/mongoid/clients/validators/storage.rb +2 -0
  92. data/lib/mongoid/composable.rb +4 -2
  93. data/lib/mongoid/config.rb +15 -2
  94. data/lib/mongoid/config/environment.rb +2 -0
  95. data/lib/mongoid/config/options.rb +17 -12
  96. data/lib/mongoid/config/validators.rb +2 -0
  97. data/lib/mongoid/config/validators/client.rb +2 -0
  98. data/lib/mongoid/config/validators/option.rb +2 -0
  99. data/lib/mongoid/contextual.rb +2 -0
  100. data/lib/mongoid/contextual/aggregable/memory.rb +3 -1
  101. data/lib/mongoid/contextual/aggregable/mongo.rb +3 -1
  102. data/lib/mongoid/contextual/atomic.rb +24 -6
  103. data/lib/mongoid/contextual/command.rb +2 -0
  104. data/lib/mongoid/contextual/geo_near.rb +2 -1
  105. data/lib/mongoid/contextual/map_reduce.rb +2 -0
  106. data/lib/mongoid/contextual/memory.rb +4 -2
  107. data/lib/mongoid/contextual/mongo.rb +4 -0
  108. data/lib/mongoid/contextual/none.rb +2 -0
  109. data/lib/mongoid/contextual/queryable.rb +2 -0
  110. data/lib/mongoid/copyable.rb +3 -1
  111. data/lib/mongoid/criteria.rb +3 -7
  112. data/lib/mongoid/criteria/findable.rb +11 -1
  113. data/lib/mongoid/criteria/includable.rb +8 -6
  114. data/lib/mongoid/criteria/inspectable.rb +2 -0
  115. data/lib/mongoid/criteria/marshalable.rb +2 -0
  116. data/lib/mongoid/criteria/modifiable.rb +3 -2
  117. data/lib/mongoid/criteria/options.rb +2 -0
  118. data/lib/mongoid/criteria/permission.rb +2 -0
  119. data/lib/mongoid/criteria/queryable.rb +7 -2
  120. data/lib/mongoid/criteria/queryable/aggregable.rb +2 -0
  121. data/lib/mongoid/criteria/queryable/expandable.rb +93 -0
  122. data/lib/mongoid/criteria/queryable/extensions.rb +2 -0
  123. data/lib/mongoid/criteria/queryable/extensions/array.rb +3 -1
  124. data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +3 -1
  125. data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -0
  126. data/lib/mongoid/criteria/queryable/extensions/date.rb +3 -1
  127. data/lib/mongoid/criteria/queryable/extensions/date_time.rb +5 -6
  128. data/lib/mongoid/criteria/queryable/extensions/hash.rb +3 -1
  129. data/lib/mongoid/criteria/queryable/extensions/nil_class.rb +3 -1
  130. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +4 -2
  131. data/lib/mongoid/criteria/queryable/extensions/object.rb +3 -1
  132. data/lib/mongoid/criteria/queryable/extensions/range.rb +3 -1
  133. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +7 -5
  134. data/lib/mongoid/criteria/queryable/extensions/set.rb +3 -1
  135. data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -1
  136. data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
  137. data/lib/mongoid/criteria/queryable/extensions/time.rb +3 -1
  138. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +3 -13
  139. data/lib/mongoid/criteria/queryable/key.rb +34 -6
  140. data/lib/mongoid/criteria/queryable/macroable.rb +3 -1
  141. data/lib/mongoid/criteria/queryable/mergeable.rb +86 -11
  142. data/lib/mongoid/criteria/queryable/optional.rb +5 -3
  143. data/lib/mongoid/criteria/queryable/options.rb +2 -0
  144. data/lib/mongoid/criteria/queryable/pipeline.rb +2 -0
  145. data/lib/mongoid/criteria/queryable/selectable.rb +264 -87
  146. data/lib/mongoid/criteria/queryable/selector.rb +38 -5
  147. data/lib/mongoid/criteria/queryable/smash.rb +2 -0
  148. data/lib/mongoid/criteria/queryable/storable.rb +228 -0
  149. data/lib/mongoid/criteria/scopable.rb +2 -0
  150. data/lib/mongoid/document.rb +4 -3
  151. data/lib/mongoid/equality.rb +3 -2
  152. data/lib/mongoid/errors.rb +3 -0
  153. data/lib/mongoid/errors/ambiguous_relationship.rb +4 -2
  154. data/lib/mongoid/errors/callback.rb +2 -0
  155. data/lib/mongoid/errors/criteria_argument_required.rb +19 -0
  156. data/lib/mongoid/errors/delete_restriction.rb +3 -2
  157. data/lib/mongoid/errors/document_not_destroyed.rb +2 -0
  158. data/lib/mongoid/errors/document_not_found.rb +2 -0
  159. data/lib/mongoid/errors/eager_load.rb +4 -2
  160. data/lib/mongoid/errors/in_memory_collation_not_supported.rb +2 -0
  161. data/lib/mongoid/errors/invalid_collection.rb +2 -0
  162. data/lib/mongoid/errors/invalid_config_option.rb +2 -0
  163. data/lib/mongoid/errors/invalid_dependent_strategy.rb +2 -0
  164. data/lib/mongoid/errors/invalid_field.rb +2 -0
  165. data/lib/mongoid/errors/invalid_field_option.rb +2 -0
  166. data/lib/mongoid/errors/invalid_find.rb +2 -0
  167. data/lib/mongoid/errors/invalid_includes.rb +2 -0
  168. data/lib/mongoid/errors/invalid_index.rb +2 -0
  169. data/lib/mongoid/errors/invalid_options.rb +4 -2
  170. data/lib/mongoid/errors/invalid_path.rb +2 -0
  171. data/lib/mongoid/errors/invalid_persistence_option.rb +2 -0
  172. data/lib/mongoid/errors/invalid_relation.rb +4 -2
  173. data/lib/mongoid/errors/invalid_relation_option.rb +4 -2
  174. data/lib/mongoid/errors/invalid_scope.rb +2 -0
  175. data/lib/mongoid/errors/invalid_session_use.rb +2 -0
  176. data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +6 -4
  177. data/lib/mongoid/errors/invalid_storage_options.rb +2 -0
  178. data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
  179. data/lib/mongoid/errors/invalid_time.rb +2 -0
  180. data/lib/mongoid/errors/invalid_value.rb +2 -0
  181. data/lib/mongoid/errors/inverse_not_found.rb +3 -1
  182. data/lib/mongoid/errors/mixed_client_configuration.rb +2 -0
  183. data/lib/mongoid/errors/mixed_relations.rb +2 -0
  184. data/lib/mongoid/errors/mongoid_error.rb +2 -0
  185. data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +3 -1
  186. data/lib/mongoid/errors/no_client_config.rb +2 -0
  187. data/lib/mongoid/errors/no_client_database.rb +2 -0
  188. data/lib/mongoid/errors/no_client_hosts.rb +2 -0
  189. data/lib/mongoid/errors/no_clients_config.rb +2 -0
  190. data/lib/mongoid/errors/no_default_client.rb +2 -0
  191. data/lib/mongoid/errors/no_environment.rb +2 -0
  192. data/lib/mongoid/errors/no_map_reduce_output.rb +2 -0
  193. data/lib/mongoid/errors/no_metadata.rb +2 -0
  194. data/lib/mongoid/errors/no_parent.rb +2 -0
  195. data/lib/mongoid/errors/readonly_attribute.rb +2 -0
  196. data/lib/mongoid/errors/readonly_document.rb +2 -0
  197. data/lib/mongoid/errors/scope_overwrite.rb +2 -0
  198. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +3 -0
  199. data/lib/mongoid/errors/unknown_attribute.rb +2 -0
  200. data/lib/mongoid/errors/unknown_model.rb +2 -0
  201. data/lib/mongoid/errors/unsaved_document.rb +2 -0
  202. data/lib/mongoid/errors/unsupported_javascript.rb +2 -0
  203. data/lib/mongoid/errors/validations.rb +2 -0
  204. data/lib/mongoid/evolvable.rb +3 -1
  205. data/lib/mongoid/extensions.rb +2 -0
  206. data/lib/mongoid/extensions/array.rb +23 -6
  207. data/lib/mongoid/extensions/big_decimal.rb +2 -0
  208. data/lib/mongoid/extensions/boolean.rb +2 -0
  209. data/lib/mongoid/extensions/date.rb +13 -3
  210. data/lib/mongoid/extensions/date_time.rb +4 -3
  211. data/lib/mongoid/extensions/decimal128.rb +2 -0
  212. data/lib/mongoid/extensions/false_class.rb +2 -0
  213. data/lib/mongoid/extensions/float.rb +5 -3
  214. data/lib/mongoid/extensions/hash.rb +49 -11
  215. data/lib/mongoid/extensions/integer.rb +5 -3
  216. data/lib/mongoid/extensions/module.rb +2 -0
  217. data/lib/mongoid/extensions/nil_class.rb +2 -0
  218. data/lib/mongoid/extensions/object.rb +16 -4
  219. data/lib/mongoid/extensions/object_id.rb +2 -0
  220. data/lib/mongoid/extensions/range.rb +2 -0
  221. data/lib/mongoid/extensions/regexp.rb +3 -1
  222. data/lib/mongoid/extensions/set.rb +2 -0
  223. data/lib/mongoid/extensions/string.rb +18 -9
  224. data/lib/mongoid/extensions/symbol.rb +2 -0
  225. data/lib/mongoid/extensions/time.rb +14 -0
  226. data/lib/mongoid/extensions/time_with_zone.rb +14 -0
  227. data/lib/mongoid/extensions/true_class.rb +2 -0
  228. data/lib/mongoid/factory.rb +28 -5
  229. data/lib/mongoid/fields.rb +4 -3
  230. data/lib/mongoid/fields/foreign_key.rb +3 -1
  231. data/lib/mongoid/fields/localized.rb +2 -0
  232. data/lib/mongoid/fields/standard.rb +4 -2
  233. data/lib/mongoid/fields/validators.rb +2 -0
  234. data/lib/mongoid/fields/validators/macro.rb +13 -2
  235. data/lib/mongoid/findable.rb +6 -2
  236. data/lib/mongoid/indexable.rb +3 -1
  237. data/lib/mongoid/indexable/specification.rb +3 -1
  238. data/lib/mongoid/indexable/validators/options.rb +2 -0
  239. data/lib/mongoid/inspectable.rb +3 -1
  240. data/lib/mongoid/interceptable.rb +5 -5
  241. data/lib/mongoid/loggable.rb +13 -7
  242. data/lib/mongoid/matchable.rb +2 -0
  243. data/lib/mongoid/matchable/all.rb +2 -0
  244. data/lib/mongoid/matchable/and.rb +2 -0
  245. data/lib/mongoid/matchable/default.rb +2 -0
  246. data/lib/mongoid/matchable/elem_match.rb +2 -0
  247. data/lib/mongoid/matchable/eq.rb +1 -0
  248. data/lib/mongoid/matchable/exists.rb +2 -0
  249. data/lib/mongoid/matchable/gt.rb +2 -0
  250. data/lib/mongoid/matchable/gte.rb +2 -0
  251. data/lib/mongoid/matchable/in.rb +2 -0
  252. data/lib/mongoid/matchable/lt.rb +2 -0
  253. data/lib/mongoid/matchable/lte.rb +2 -0
  254. data/lib/mongoid/matchable/ne.rb +2 -0
  255. data/lib/mongoid/matchable/nin.rb +2 -0
  256. data/lib/mongoid/matchable/nor.rb +2 -1
  257. data/lib/mongoid/matchable/or.rb +2 -0
  258. data/lib/mongoid/matchable/regexp.rb +5 -2
  259. data/lib/mongoid/matchable/size.rb +2 -0
  260. data/lib/mongoid/persistable.rb +133 -15
  261. data/lib/mongoid/persistable/creatable.rb +3 -1
  262. data/lib/mongoid/persistable/deletable.rb +3 -1
  263. data/lib/mongoid/persistable/destroyable.rb +3 -1
  264. data/lib/mongoid/persistable/incrementable.rb +6 -2
  265. data/lib/mongoid/persistable/logical.rb +4 -1
  266. data/lib/mongoid/persistable/poppable.rb +3 -1
  267. data/lib/mongoid/persistable/pullable.rb +3 -1
  268. data/lib/mongoid/persistable/pushable.rb +5 -12
  269. data/lib/mongoid/persistable/renamable.rb +10 -3
  270. data/lib/mongoid/persistable/savable.rb +3 -1
  271. data/lib/mongoid/persistable/settable.rb +3 -1
  272. data/lib/mongoid/persistable/unsettable.rb +8 -3
  273. data/lib/mongoid/persistable/updatable.rb +3 -1
  274. data/lib/mongoid/persistable/upsertable.rb +3 -1
  275. data/lib/mongoid/persistence_context.rb +27 -15
  276. data/lib/mongoid/positional.rb +2 -0
  277. data/lib/mongoid/query_cache.rb +26 -69
  278. data/lib/mongoid/railtie.rb +3 -1
  279. data/lib/mongoid/railties/controller_runtime.rb +4 -1
  280. data/lib/mongoid/railties/database.rake +2 -0
  281. data/lib/mongoid/reloadable.rb +4 -2
  282. data/lib/mongoid/scopable.rb +2 -1
  283. data/lib/mongoid/selectable.rb +3 -1
  284. data/lib/mongoid/serializable.rb +13 -11
  285. data/lib/mongoid/shardable.rb +3 -1
  286. data/lib/mongoid/stateful.rb +3 -1
  287. data/lib/mongoid/tasks/database.rake +2 -0
  288. data/lib/mongoid/tasks/database.rb +2 -0
  289. data/lib/mongoid/threaded.rb +2 -0
  290. data/lib/mongoid/threaded/lifecycle.rb +2 -0
  291. data/lib/mongoid/timestamps.rb +3 -1
  292. data/lib/mongoid/timestamps/created.rb +3 -1
  293. data/lib/mongoid/timestamps/created/short.rb +2 -0
  294. data/lib/mongoid/timestamps/short.rb +2 -0
  295. data/lib/mongoid/timestamps/timeless.rb +3 -1
  296. data/lib/mongoid/timestamps/updated.rb +3 -1
  297. data/lib/mongoid/timestamps/updated/short.rb +2 -0
  298. data/lib/mongoid/touchable.rb +20 -12
  299. data/lib/mongoid/traversable.rb +4 -2
  300. data/lib/mongoid/validatable.rb +7 -5
  301. data/lib/mongoid/validatable/associated.rb +4 -2
  302. data/lib/mongoid/validatable/format.rb +2 -0
  303. data/lib/mongoid/validatable/length.rb +2 -0
  304. data/lib/mongoid/validatable/localizable.rb +2 -0
  305. data/lib/mongoid/validatable/macros.rb +2 -0
  306. data/lib/mongoid/validatable/presence.rb +4 -2
  307. data/lib/mongoid/validatable/queryable.rb +2 -0
  308. data/lib/mongoid/validatable/uniqueness.rb +5 -3
  309. data/lib/mongoid/version.rb +2 -1
  310. data/lib/rails/generators/mongoid/config/config_generator.rb +3 -8
  311. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +12 -6
  312. data/lib/rails/generators/mongoid/model/model_generator.rb +3 -1
  313. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  314. data/lib/rails/generators/mongoid_generator.rb +2 -0
  315. data/lib/rails/mongoid.rb +4 -2
  316. data/lib/support/ruby_version.rb +3 -0
  317. data/spec/app/models/account.rb +3 -0
  318. data/spec/app/models/acolyte.rb +3 -0
  319. data/spec/app/models/actor.rb +3 -0
  320. data/spec/app/models/actress.rb +3 -0
  321. data/spec/app/models/address.rb +3 -0
  322. data/spec/app/models/address_component.rb +3 -0
  323. data/spec/app/models/address_number.rb +3 -0
  324. data/spec/app/models/agency.rb +3 -0
  325. data/spec/app/models/agent.rb +3 -0
  326. data/spec/app/models/album.rb +3 -0
  327. data/spec/app/models/alert.rb +3 -0
  328. data/spec/app/models/animal.rb +3 -0
  329. data/spec/app/models/answer.rb +3 -0
  330. data/spec/app/models/appointment.rb +3 -0
  331. data/spec/app/models/array_field.rb +1 -0
  332. data/spec/app/models/article.rb +3 -0
  333. data/spec/app/models/artist.rb +3 -0
  334. data/spec/app/models/artwork.rb +3 -0
  335. data/spec/app/models/audio.rb +3 -0
  336. data/spec/app/models/augmentation.rb +3 -0
  337. data/spec/app/models/author.rb +3 -0
  338. data/spec/app/models/baby.rb +3 -0
  339. data/spec/app/models/band.rb +3 -0
  340. data/spec/app/models/bar.rb +3 -0
  341. data/spec/app/models/basic.rb +3 -0
  342. data/spec/app/models/bed.rb +3 -0
  343. data/spec/app/models/big_palette.rb +3 -0
  344. data/spec/app/models/birthday.rb +3 -0
  345. data/spec/app/models/bomb.rb +3 -0
  346. data/spec/app/models/book.rb +3 -0
  347. data/spec/app/models/breed.rb +3 -0
  348. data/spec/app/models/browser.rb +3 -0
  349. data/spec/app/models/building.rb +3 -0
  350. data/spec/app/models/building_address.rb +3 -0
  351. data/spec/app/models/bus.rb +3 -0
  352. data/spec/app/models/business.rb +3 -0
  353. data/spec/app/models/callback_test.rb +3 -0
  354. data/spec/app/models/canvas.rb +3 -0
  355. data/spec/app/models/car.rb +3 -0
  356. data/spec/app/models/cat.rb +3 -0
  357. data/spec/app/models/category.rb +3 -0
  358. data/spec/app/models/child.rb +3 -0
  359. data/spec/app/models/child_doc.rb +3 -0
  360. data/spec/app/models/church.rb +3 -0
  361. data/spec/app/models/circle.rb +3 -0
  362. data/spec/app/models/circuit.rb +3 -0
  363. data/spec/app/models/circus.rb +3 -0
  364. data/spec/app/models/code.rb +3 -0
  365. data/spec/app/models/comment.rb +3 -0
  366. data/spec/app/models/company.rb +3 -0
  367. data/spec/app/models/consumption_period.rb +3 -0
  368. data/spec/app/models/contextable_item.rb +3 -0
  369. data/spec/app/models/contractor.rb +3 -0
  370. data/spec/app/models/cookie.rb +3 -0
  371. data/spec/app/models/country_code.rb +3 -0
  372. data/spec/app/models/courier_job.rb +3 -0
  373. data/spec/app/models/definition.rb +3 -0
  374. data/spec/app/models/description.rb +3 -0
  375. data/spec/app/models/dictionary.rb +3 -0
  376. data/spec/app/models/division.rb +3 -0
  377. data/spec/app/models/doctor.rb +3 -0
  378. data/spec/app/models/dog.rb +3 -0
  379. data/spec/app/models/dokument.rb +3 -0
  380. data/spec/app/models/draft.rb +3 -0
  381. data/spec/app/models/dragon.rb +3 -0
  382. data/spec/app/models/driver.rb +3 -0
  383. data/spec/app/models/drug.rb +3 -0
  384. data/spec/app/models/dungeon.rb +3 -0
  385. data/spec/app/models/edit.rb +3 -0
  386. data/spec/app/models/email.rb +3 -0
  387. data/spec/app/models/employer.rb +3 -0
  388. data/spec/app/models/entry.rb +3 -0
  389. data/spec/app/models/eraser.rb +3 -0
  390. data/spec/app/models/even.rb +3 -0
  391. data/spec/app/models/event.rb +3 -0
  392. data/spec/app/models/exhibition.rb +3 -0
  393. data/spec/app/models/exhibitor.rb +3 -0
  394. data/spec/app/models/explosion.rb +3 -0
  395. data/spec/app/models/eye.rb +3 -0
  396. data/spec/app/models/eye_bowl.rb +3 -0
  397. data/spec/app/models/face.rb +3 -0
  398. data/spec/app/models/favorite.rb +3 -0
  399. data/spec/app/models/filesystem.rb +3 -0
  400. data/spec/app/models/fire_hydrant.rb +3 -0
  401. data/spec/app/models/firefox.rb +3 -0
  402. data/spec/app/models/fish.rb +3 -0
  403. data/spec/app/models/folder.rb +3 -0
  404. data/spec/app/models/folder_item.rb +3 -0
  405. data/spec/app/models/fruits.rb +3 -0
  406. data/spec/app/models/game.rb +3 -0
  407. data/spec/app/models/ghost.rb +3 -0
  408. data/spec/app/models/home.rb +3 -0
  409. data/spec/app/models/house.rb +3 -0
  410. data/spec/app/models/html_writer.rb +3 -0
  411. data/spec/app/models/id_key.rb +3 -0
  412. data/spec/app/models/image.rb +3 -0
  413. data/spec/app/models/implant.rb +3 -0
  414. data/spec/app/models/item.rb +3 -0
  415. data/spec/app/models/jar.rb +3 -0
  416. data/spec/app/models/kaleidoscope.rb +3 -0
  417. data/spec/app/models/kangaroo.rb +4 -1
  418. data/spec/app/models/label.rb +3 -0
  419. data/spec/app/models/language.rb +3 -0
  420. data/spec/app/models/lat_lng.rb +3 -0
  421. data/spec/app/models/league.rb +3 -0
  422. data/spec/app/models/learner.rb +3 -0
  423. data/spec/app/models/line_item.rb +3 -0
  424. data/spec/app/models/location.rb +3 -0
  425. data/spec/app/models/login.rb +3 -0
  426. data/spec/app/models/manufacturer.rb +3 -0
  427. data/spec/app/models/meat.rb +3 -0
  428. data/spec/app/models/membership.rb +3 -0
  429. data/spec/app/models/message.rb +3 -0
  430. data/spec/app/models/minim.rb +1 -1
  431. data/spec/app/models/mixed_drink.rb +3 -0
  432. data/spec/app/models/movie.rb +3 -0
  433. data/spec/app/models/my_hash.rb +3 -0
  434. data/spec/app/models/name.rb +3 -0
  435. data/spec/app/models/name_only.rb +9 -0
  436. data/spec/app/models/node.rb +3 -0
  437. data/spec/app/models/note.rb +3 -0
  438. data/spec/app/models/odd.rb +3 -0
  439. data/spec/app/models/ordered_post.rb +3 -0
  440. data/spec/app/models/ordered_preference.rb +3 -0
  441. data/spec/app/models/oscar.rb +3 -0
  442. data/spec/app/models/other_owner_object.rb +3 -0
  443. data/spec/app/models/override.rb +3 -0
  444. data/spec/app/models/ownable.rb +3 -0
  445. data/spec/app/models/owner.rb +3 -0
  446. data/spec/app/models/pack.rb +3 -0
  447. data/spec/app/models/page.rb +3 -0
  448. data/spec/app/models/page_question.rb +3 -0
  449. data/spec/app/models/palette.rb +3 -0
  450. data/spec/app/models/parent.rb +3 -0
  451. data/spec/app/models/parent_doc.rb +3 -0
  452. data/spec/app/models/passport.rb +3 -0
  453. data/spec/app/models/patient.rb +3 -0
  454. data/spec/app/models/pdf_writer.rb +3 -0
  455. data/spec/app/models/pencil.rb +3 -0
  456. data/spec/app/models/person.rb +3 -0
  457. data/spec/app/models/pet.rb +3 -0
  458. data/spec/app/models/pet_owner.rb +3 -0
  459. data/spec/app/models/phone.rb +3 -0
  460. data/spec/app/models/pizza.rb +3 -0
  461. data/spec/app/models/player.rb +3 -0
  462. data/spec/app/models/post.rb +3 -0
  463. data/spec/app/models/post_genre.rb +3 -0
  464. data/spec/app/models/powerup.rb +3 -0
  465. data/spec/app/models/preference.rb +3 -0
  466. data/spec/app/models/princess.rb +3 -0
  467. data/spec/app/models/product.rb +3 -0
  468. data/spec/app/models/profile.rb +3 -0
  469. data/spec/app/models/pronunciation.rb +3 -0
  470. data/spec/app/models/pub.rb +3 -0
  471. data/spec/app/models/purchase.rb +3 -0
  472. data/spec/app/models/question.rb +3 -0
  473. data/spec/app/models/quiz.rb +3 -0
  474. data/spec/app/models/rating.rb +3 -0
  475. data/spec/app/models/record.rb +3 -0
  476. data/spec/app/models/registry.rb +3 -0
  477. data/spec/app/models/role.rb +3 -0
  478. data/spec/app/models/root_category.rb +3 -0
  479. data/spec/app/models/sandwich.rb +3 -0
  480. data/spec/app/models/scheduler.rb +3 -0
  481. data/spec/app/models/seo.rb +3 -0
  482. data/spec/app/models/series.rb +3 -0
  483. data/spec/app/models/server.rb +3 -0
  484. data/spec/app/models/service.rb +3 -0
  485. data/spec/app/models/shape.rb +3 -0
  486. data/spec/app/models/shelf.rb +3 -0
  487. data/spec/app/models/shipment_address.rb +3 -0
  488. data/spec/app/models/shipping_container.rb +3 -0
  489. data/spec/app/models/shipping_pack.rb +3 -0
  490. data/spec/app/models/shop.rb +3 -0
  491. data/spec/app/models/short_agent.rb +3 -0
  492. data/spec/app/models/short_quiz.rb +3 -0
  493. data/spec/app/models/simple.rb +3 -0
  494. data/spec/app/models/slave.rb +3 -0
  495. data/spec/app/models/song.rb +3 -0
  496. data/spec/app/models/sound.rb +3 -0
  497. data/spec/app/models/square.rb +3 -0
  498. data/spec/app/models/staff.rb +3 -0
  499. data/spec/app/models/store_as_dup_test1.rb +3 -0
  500. data/spec/app/models/store_as_dup_test2.rb +3 -0
  501. data/spec/app/models/store_as_dup_test3.rb +1 -0
  502. data/spec/app/models/store_as_dup_test4.rb +1 -0
  503. data/spec/app/models/strategy.rb +3 -0
  504. data/spec/app/models/sub_item.rb +3 -0
  505. data/spec/app/models/subscription.rb +3 -0
  506. data/spec/app/models/survey.rb +3 -0
  507. data/spec/app/models/symptom.rb +3 -0
  508. data/spec/app/models/tag.rb +3 -0
  509. data/spec/app/models/target.rb +3 -0
  510. data/spec/app/models/template.rb +3 -0
  511. data/spec/app/models/thing.rb +3 -0
  512. data/spec/app/models/title.rb +3 -0
  513. data/spec/app/models/tool.rb +3 -0
  514. data/spec/app/models/topping.rb +3 -0
  515. data/spec/app/models/track.rb +3 -0
  516. data/spec/app/models/translation.rb +3 -0
  517. data/spec/app/models/tree.rb +3 -0
  518. data/spec/app/models/truck.rb +3 -0
  519. data/spec/app/models/updatable.rb +1 -0
  520. data/spec/app/models/user.rb +3 -0
  521. data/spec/app/models/user_account.rb +3 -0
  522. data/spec/app/models/validation_callback.rb +3 -0
  523. data/spec/app/models/vehicle.rb +3 -0
  524. data/spec/app/models/version.rb +3 -0
  525. data/spec/app/models/vertex.rb +4 -1
  526. data/spec/app/models/vet_visit.rb +3 -0
  527. data/spec/app/models/video.rb +3 -0
  528. data/spec/app/models/video_game.rb +3 -0
  529. data/spec/app/models/weapon.rb +3 -0
  530. data/spec/app/models/wiki_page.rb +3 -0
  531. data/spec/app/models/word.rb +3 -0
  532. data/spec/app/models/word_origin.rb +3 -0
  533. data/spec/app/models/writer.rb +3 -0
  534. data/spec/config/mongoid.yml +1 -0
  535. data/spec/integration/associations/belongs_to_spec.rb +3 -0
  536. data/spec/integration/associations/embedded_spec.rb +0 -55
  537. data/spec/integration/associations/foreign_key_spec.rb +99 -0
  538. data/spec/integration/associations/foreign_key_spec_models.rb +65 -0
  539. data/spec/integration/associations/reverse_population_spec.rb +35 -0
  540. data/spec/integration/associations/reverse_population_spec_models.rb +37 -0
  541. data/spec/integration/criteria/default_scope_spec.rb +21 -0
  542. data/spec/integration/criteria/logical_spec.rb +81 -0
  543. data/spec/integration/i18n_fallbacks_spec.rb +90 -0
  544. data/spec/lite_spec_helper.rb +11 -18
  545. data/spec/mongoid/association/accessors_spec.rb +3 -0
  546. data/spec/mongoid/association/auto_save_spec.rb +3 -0
  547. data/spec/mongoid/association/builders_spec.rb +3 -0
  548. data/spec/mongoid/association/constrainable_spec.rb +3 -0
  549. data/spec/mongoid/association/counter_cache_spec.rb +3 -0
  550. data/spec/mongoid/association/depending_spec.rb +3 -0
  551. data/spec/mongoid/association/eager_spec.rb +3 -0
  552. data/spec/mongoid/association/embedded/cyclic_spec.rb +3 -0
  553. data/spec/mongoid/association/embedded/dirty_spec.rb +3 -0
  554. data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +3 -0
  555. data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +3 -0
  556. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +3 -50
  557. data/spec/mongoid/association/embedded/embedded_in_spec.rb +4 -1
  558. data/spec/mongoid/association/embedded/embeds_many/binding_spec.rb +3 -0
  559. data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +3 -0
  560. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +3 -0
  561. data/spec/mongoid/association/embedded/embeds_many_models.rb +0 -19
  562. data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +52 -0
  563. data/spec/mongoid/association/embedded/embeds_many_spec.rb +4 -11
  564. data/spec/mongoid/association/embedded/embeds_one/binding_spec.rb +3 -0
  565. data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +3 -0
  566. data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +3 -0
  567. data/spec/mongoid/association/embedded/embeds_one_dnl_models.rb +3 -0
  568. data/spec/mongoid/association/embedded/embeds_one_models.rb +3 -0
  569. data/spec/mongoid/association/embedded/embeds_one_query_spec.rb +29 -0
  570. data/spec/mongoid/association/embedded/embeds_one_spec.rb +6 -1
  571. data/spec/mongoid/association/macros_spec.rb +3 -0
  572. data/spec/mongoid/association/nested/many_spec.rb +3 -0
  573. data/spec/mongoid/association/nested/one_spec.rb +3 -0
  574. data/spec/mongoid/association/options_spec.rb +3 -0
  575. data/spec/mongoid/association/polymorphic_spec.rb +3 -0
  576. data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +3 -0
  577. data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +3 -0
  578. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +12 -0
  579. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +3 -0
  580. data/spec/mongoid/association/referenced/belongs_to_query_spec.rb +38 -0
  581. data/spec/mongoid/association/referenced/belongs_to_spec.rb +3 -0
  582. data/spec/mongoid/association/referenced/has_and_belongs_to_many/binding_spec.rb +3 -0
  583. data/spec/mongoid/association/referenced/has_and_belongs_to_many/buildable_spec.rb +3 -0
  584. data/spec/mongoid/association/referenced/has_and_belongs_to_many/eager_spec.rb +16 -0
  585. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_persistence_spec.rb +26 -5
  586. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +38 -154
  587. data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +26 -2
  588. data/spec/mongoid/association/referenced/has_and_belongs_to_many_query_spec.rb +40 -0
  589. data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +26 -2
  590. data/spec/mongoid/association/referenced/has_many/binding_spec.rb +3 -0
  591. data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +3 -0
  592. data/spec/mongoid/association/referenced/has_many/eager_spec.rb +18 -3
  593. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +71 -146
  594. data/spec/mongoid/association/referenced/has_many/proxy_query_spec.rb +1 -0
  595. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +4 -2
  596. data/spec/mongoid/association/referenced/has_many_models.rb +3 -0
  597. data/spec/mongoid/association/referenced/has_many_query_spec.rb +38 -0
  598. data/spec/mongoid/association/referenced/has_many_spec.rb +3 -0
  599. data/spec/mongoid/association/referenced/has_one/binding_spec.rb +3 -0
  600. data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +3 -0
  601. data/spec/mongoid/association/referenced/has_one/eager_spec.rb +18 -3
  602. data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +3 -0
  603. data/spec/mongoid/association/referenced/has_one_models.rb +3 -0
  604. data/spec/mongoid/association/referenced/has_one_query_spec.rb +38 -0
  605. data/spec/mongoid/association/referenced/has_one_spec.rb +3 -0
  606. data/spec/mongoid/association/reflections_spec.rb +3 -0
  607. data/spec/mongoid/association/syncable_spec.rb +3 -0
  608. data/spec/mongoid/association_spec.rb +3 -0
  609. data/spec/mongoid/atomic/modifiers_spec.rb +3 -0
  610. data/spec/mongoid/atomic/paths/embedded/many_spec.rb +3 -0
  611. data/spec/mongoid/atomic/paths/embedded/one_spec.rb +3 -0
  612. data/spec/mongoid/atomic/paths/root_spec.rb +3 -0
  613. data/spec/mongoid/atomic/paths_spec.rb +3 -41
  614. data/spec/mongoid/atomic_spec.rb +3 -0
  615. data/spec/mongoid/attributes/nested_spec.rb +3 -0
  616. data/spec/mongoid/attributes/readonly_spec.rb +3 -0
  617. data/spec/mongoid/attributes_spec.rb +10 -260
  618. data/spec/mongoid/cacheable_spec.rb +3 -0
  619. data/spec/mongoid/changeable_spec.rb +3 -0
  620. data/spec/mongoid/clients/factory_spec.rb +38 -20
  621. data/spec/mongoid/clients/options_spec.rb +24 -13
  622. data/spec/mongoid/clients/sessions_spec.rb +7 -8
  623. data/spec/mongoid/clients/transactions_spec.rb +14 -23
  624. data/spec/mongoid/clients_spec.rb +5 -2
  625. data/spec/mongoid/composable_spec.rb +3 -0
  626. data/spec/mongoid/config/environment_spec.rb +3 -0
  627. data/spec/mongoid/config/options_spec.rb +23 -3
  628. data/spec/mongoid/config_spec.rb +39 -0
  629. data/spec/mongoid/contextual/aggregable/memory_spec.rb +3 -0
  630. data/spec/mongoid/contextual/aggregable/mongo_spec.rb +3 -0
  631. data/spec/mongoid/contextual/atomic_spec.rb +113 -37
  632. data/spec/mongoid/contextual/geo_near_spec.rb +5 -11
  633. data/spec/mongoid/contextual/map_reduce_spec.rb +8 -20
  634. data/spec/mongoid/contextual/memory_spec.rb +3 -0
  635. data/spec/mongoid/contextual/mongo_spec.rb +58 -76
  636. data/spec/mongoid/contextual/none_spec.rb +3 -0
  637. data/spec/mongoid/copyable_spec.rb +3 -0
  638. data/spec/mongoid/copyable_spec_models.rb +3 -0
  639. data/spec/mongoid/criteria/findable_spec.rb +58 -0
  640. data/spec/mongoid/criteria/inspectable_spec.rb +3 -0
  641. data/spec/mongoid/criteria/marshalable_spec.rb +3 -0
  642. data/spec/mongoid/criteria/modifiable_spec.rb +7 -3
  643. data/spec/mongoid/criteria/options_spec.rb +3 -0
  644. data/spec/mongoid/criteria/queryable/aggregable_spec.rb +3 -0
  645. data/spec/mongoid/criteria/queryable/expandable_spec.rb +135 -0
  646. data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +3 -0
  647. data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +3 -0
  648. data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +3 -0
  649. data/spec/mongoid/criteria/queryable/extensions/boolean_spec.rb +3 -0
  650. data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +3 -0
  651. data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +36 -17
  652. data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +3 -0
  653. data/spec/mongoid/criteria/queryable/extensions/float_spec.rb +3 -0
  654. data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +3 -0
  655. data/spec/mongoid/criteria/queryable/extensions/integer_spec.rb +3 -0
  656. data/spec/mongoid/criteria/queryable/extensions/nil_class_spec.rb +3 -0
  657. data/spec/mongoid/criteria/queryable/extensions/object_spec.rb +3 -0
  658. data/spec/mongoid/criteria/queryable/extensions/range_spec.rb +3 -0
  659. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +3 -0
  660. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +10 -7
  661. data/spec/mongoid/criteria/queryable/extensions/set_spec.rb +3 -0
  662. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -1
  663. data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +3 -0
  664. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +31 -35
  665. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +4 -28
  666. data/spec/mongoid/criteria/queryable/key_spec.rb +3 -0
  667. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +3 -0
  668. data/spec/mongoid/criteria/queryable/optional_spec.rb +3 -0
  669. data/spec/mongoid/criteria/queryable/options_spec.rb +3 -0
  670. data/spec/mongoid/criteria/queryable/pipeline_spec.rb +3 -0
  671. data/spec/mongoid/criteria/queryable/queryable_spec.rb +3 -0
  672. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +564 -156
  673. data/spec/mongoid/criteria/queryable/selectable_spec.rb +950 -2165
  674. data/spec/mongoid/criteria/queryable/selector_spec.rb +3 -0
  675. data/spec/mongoid/criteria/queryable/smash_spec.rb +3 -0
  676. data/spec/mongoid/criteria/queryable/storable_spec.rb +112 -0
  677. data/spec/mongoid/criteria/scopable_spec.rb +3 -0
  678. data/spec/mongoid/criteria_spec.rb +39 -4
  679. data/spec/mongoid/document_fields_spec.rb +0 -29
  680. data/spec/mongoid/document_query_spec.rb +39 -0
  681. data/spec/mongoid/document_spec.rb +3 -0
  682. data/spec/mongoid/equality_spec.rb +3 -0
  683. data/spec/mongoid/errors/ambiguous_relationship_spec.rb +6 -3
  684. data/spec/mongoid/errors/callback_spec.rb +3 -0
  685. data/spec/mongoid/errors/delete_restriction_spec.rb +3 -0
  686. data/spec/mongoid/errors/document_not_destroyed_spec.rb +3 -0
  687. data/spec/mongoid/errors/document_not_found_spec.rb +3 -0
  688. data/spec/mongoid/errors/eager_load_spec.rb +3 -0
  689. data/spec/mongoid/errors/invalid_collection_spec.rb +3 -0
  690. data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -0
  691. data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -0
  692. data/spec/mongoid/errors/invalid_field_spec.rb +3 -0
  693. data/spec/mongoid/errors/invalid_find_spec.rb +3 -0
  694. data/spec/mongoid/errors/invalid_includes_spec.rb +3 -0
  695. data/spec/mongoid/errors/invalid_index_spec.rb +3 -0
  696. data/spec/mongoid/errors/invalid_options_spec.rb +5 -2
  697. data/spec/mongoid/errors/invalid_path_spec.rb +3 -0
  698. data/spec/mongoid/errors/invalid_relation_spec.rb +5 -2
  699. data/spec/mongoid/errors/invalid_scope_spec.rb +3 -0
  700. data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -0
  701. data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -0
  702. data/spec/mongoid/errors/invalid_time_spec.rb +3 -0
  703. data/spec/mongoid/errors/inverse_not_found_spec.rb +4 -1
  704. data/spec/mongoid/errors/mixed_client_configuration_spec.rb +3 -0
  705. data/spec/mongoid/errors/mixed_relations_spec.rb +3 -0
  706. data/spec/mongoid/errors/mongoid_error_spec.rb +3 -0
  707. data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +6 -3
  708. data/spec/mongoid/errors/no_client_config_spec.rb +3 -0
  709. data/spec/mongoid/errors/no_client_database_spec.rb +3 -0
  710. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -0
  711. data/spec/mongoid/errors/no_clients_config_spec.rb +3 -0
  712. data/spec/mongoid/errors/no_environment_spec.rb +3 -0
  713. data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -0
  714. data/spec/mongoid/errors/no_metadata_spec.rb +5 -2
  715. data/spec/mongoid/errors/no_parent_spec.rb +4 -1
  716. data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -0
  717. data/spec/mongoid/errors/readonly_document_spec.rb +3 -0
  718. data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -0
  719. data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -0
  720. data/spec/mongoid/errors/unknown_attribute_spec.rb +3 -0
  721. data/spec/mongoid/errors/unsaved_document_spec.rb +4 -1
  722. data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -0
  723. data/spec/mongoid/errors/validations_spec.rb +3 -0
  724. data/spec/mongoid/extensions/array_spec.rb +26 -43
  725. data/spec/mongoid/extensions/big_decimal_spec.rb +3 -0
  726. data/spec/mongoid/extensions/binary_spec.rb +3 -0
  727. data/spec/mongoid/extensions/boolean_spec.rb +3 -0
  728. data/spec/mongoid/extensions/date_class_mongoize_spec.rb +336 -0
  729. data/spec/mongoid/extensions/date_spec.rb +9 -160
  730. data/spec/mongoid/extensions/date_time_spec.rb +18 -60
  731. data/spec/mongoid/extensions/decimal128_spec.rb +3 -0
  732. data/spec/mongoid/extensions/false_class_spec.rb +3 -0
  733. data/spec/mongoid/extensions/float_spec.rb +18 -3
  734. data/spec/mongoid/extensions/hash_spec.rb +106 -0
  735. data/spec/mongoid/extensions/integer_spec.rb +15 -2
  736. data/spec/mongoid/extensions/module_spec.rb +3 -0
  737. data/spec/mongoid/extensions/nil_class_spec.rb +3 -0
  738. data/spec/mongoid/extensions/object_id_spec.rb +3 -0
  739. data/spec/mongoid/extensions/object_spec.rb +14 -24
  740. data/spec/mongoid/extensions/range_spec.rb +3 -0
  741. data/spec/mongoid/extensions/regexp_spec.rb +3 -0
  742. data/spec/mongoid/extensions/set_spec.rb +3 -0
  743. data/spec/mongoid/extensions/string_spec.rb +60 -26
  744. data/spec/mongoid/extensions/symbol_spec.rb +3 -0
  745. data/spec/mongoid/extensions/time_spec.rb +30 -0
  746. data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -0
  747. data/spec/mongoid/extensions/true_class_spec.rb +3 -0
  748. data/spec/mongoid/extensions_spec.rb +3 -0
  749. data/spec/mongoid/factory_spec.rb +29 -2
  750. data/spec/mongoid/fields/foreign_key_spec.rb +3 -0
  751. data/spec/mongoid/fields/localized_spec.rb +3 -0
  752. data/spec/mongoid/fields/standard_spec.rb +3 -0
  753. data/spec/mongoid/fields_spec.rb +18 -0
  754. data/spec/mongoid/findable_spec.rb +3 -0
  755. data/spec/mongoid/indexable/specification_spec.rb +3 -0
  756. data/spec/mongoid/indexable_spec.rb +7 -6
  757. data/spec/mongoid/inspectable_spec.rb +3 -0
  758. data/spec/mongoid/interceptable_spec.rb +3 -0
  759. data/spec/mongoid/loggable_spec.rb +3 -0
  760. data/spec/mongoid/matchable/all_spec.rb +3 -0
  761. data/spec/mongoid/matchable/and_spec.rb +3 -0
  762. data/spec/mongoid/matchable/default_spec.rb +4 -1
  763. data/spec/mongoid/matchable/elem_match_spec.rb +3 -0
  764. data/spec/mongoid/matchable/eq_spec.rb +1 -0
  765. data/spec/mongoid/matchable/exists_spec.rb +3 -0
  766. data/spec/mongoid/matchable/gt_spec.rb +3 -0
  767. data/spec/mongoid/matchable/gte_spec.rb +3 -0
  768. data/spec/mongoid/matchable/in_spec.rb +3 -0
  769. data/spec/mongoid/matchable/lt_spec.rb +3 -0
  770. data/spec/mongoid/matchable/lte_spec.rb +3 -0
  771. data/spec/mongoid/matchable/ne_spec.rb +3 -0
  772. data/spec/mongoid/matchable/nin_spec.rb +3 -0
  773. data/spec/mongoid/matchable/nor_spec.rb +1 -0
  774. data/spec/mongoid/matchable/or_spec.rb +3 -0
  775. data/spec/mongoid/matchable/regexp_spec.rb +5 -2
  776. data/spec/mongoid/matchable/size_spec.rb +3 -0
  777. data/spec/mongoid/matchable_spec.rb +5 -2
  778. data/spec/mongoid/persistable/creatable_spec.rb +3 -0
  779. data/spec/mongoid/persistable/deletable_spec.rb +3 -0
  780. data/spec/mongoid/persistable/destroyable_spec.rb +3 -0
  781. data/spec/mongoid/persistable/incrementable_spec.rb +17 -0
  782. data/spec/mongoid/persistable/logical_spec.rb +17 -0
  783. data/spec/mongoid/persistable/poppable_spec.rb +17 -0
  784. data/spec/mongoid/persistable/pullable_spec.rb +31 -0
  785. data/spec/mongoid/persistable/pushable_spec.rb +32 -55
  786. data/spec/mongoid/persistable/renamable_spec.rb +17 -0
  787. data/spec/mongoid/persistable/savable_spec.rb +7 -4
  788. data/spec/mongoid/persistable/settable_spec.rb +17 -30
  789. data/spec/mongoid/persistable/unsettable_spec.rb +17 -0
  790. data/spec/mongoid/persistable/updatable_spec.rb +3 -0
  791. data/spec/mongoid/persistable/upsertable_spec.rb +3 -0
  792. data/spec/mongoid/persistable_spec.rb +85 -8
  793. data/spec/mongoid/persistence_context_spec.rb +3 -0
  794. data/spec/mongoid/positional_spec.rb +3 -0
  795. data/spec/mongoid/query_cache_middleware_spec.rb +48 -0
  796. data/spec/mongoid/query_cache_spec.rb +12 -121
  797. data/spec/mongoid/relations/proxy_spec.rb +4 -1
  798. data/spec/mongoid/reloadable_spec.rb +3 -0
  799. data/spec/mongoid/scopable_spec.rb +4 -2
  800. data/spec/mongoid/selectable_spec.rb +3 -0
  801. data/spec/mongoid/serializable_spec.rb +3 -0
  802. data/spec/mongoid/shardable_spec.rb +3 -0
  803. data/spec/mongoid/stateful_spec.rb +3 -0
  804. data/spec/mongoid/tasks/database_rake_spec.rb +16 -13
  805. data/spec/mongoid/tasks/database_spec.rb +4 -1
  806. data/spec/mongoid/threaded_spec.rb +3 -0
  807. data/spec/mongoid/timestamps/created/short_spec.rb +3 -0
  808. data/spec/mongoid/timestamps/created_spec.rb +3 -0
  809. data/spec/mongoid/timestamps/timeless_spec.rb +3 -0
  810. data/spec/mongoid/timestamps/updated/short_spec.rb +3 -0
  811. data/spec/mongoid/timestamps/updated_spec.rb +3 -0
  812. data/spec/mongoid/timestamps_spec.rb +3 -0
  813. data/spec/mongoid/touchable_spec.rb +49 -3
  814. data/spec/mongoid/traversable_spec.rb +3 -0
  815. data/spec/mongoid/validatable/associated_spec.rb +3 -0
  816. data/spec/mongoid/validatable/format_spec.rb +3 -0
  817. data/spec/mongoid/validatable/length_spec.rb +3 -0
  818. data/spec/mongoid/validatable/numericality_spec.rb +3 -0
  819. data/spec/mongoid/validatable/presence_spec.rb +3 -0
  820. data/spec/mongoid/validatable/uniqueness_spec.rb +3 -0
  821. data/spec/mongoid/validatable_spec.rb +3 -0
  822. data/spec/mongoid_spec.rb +3 -0
  823. data/spec/rails/controller_extension/controller_runtime_spec.rb +4 -1
  824. data/spec/rails/mongoid_spec.rb +5 -2
  825. data/spec/spec_helper.rb +50 -15
  826. data/spec/support/authorization.rb +3 -0
  827. data/spec/support/cluster_config.rb +3 -3
  828. data/spec/support/constraints.rb +211 -17
  829. data/spec/support/expectations.rb +3 -0
  830. data/spec/support/macros.rb +1 -0
  831. data/spec/support/shared/time.rb +54 -0
  832. data/spec/support/spec_config.rb +7 -20
  833. metadata +508 -515
  834. metadata.gz.sig +2 -1
  835. data/lib/mongoid/criteria/queryable/forwardable.rb +0 -65
  836. data/spec/app/models/customer.rb +0 -11
  837. data/spec/app/models/customer_address.rb +0 -12
  838. data/spec/app/models/delegating_patient.rb +0 -16
  839. data/spec/integration/app_spec.rb +0 -341
  840. data/spec/integration/callbacks_models.rb +0 -49
  841. data/spec/integration/callbacks_spec.rb +0 -216
  842. data/spec/integration/criteria/date_field_spec.rb +0 -41
  843. data/spec/integration/document_spec.rb +0 -22
  844. data/spec/mongoid/criteria/queryable/forwardable_spec.rb +0 -87
  845. data/spec/mongoid/document_persistence_context_spec.rb +0 -33
  846. data/spec/shared/LICENSE +0 -20
  847. data/spec/shared/bin/get-mongodb-download-url +0 -17
  848. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  849. data/spec/shared/lib/mrss/cluster_config.rb +0 -221
  850. data/spec/shared/lib/mrss/constraints.rb +0 -354
  851. data/spec/shared/lib/mrss/docker_runner.rb +0 -265
  852. data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
  853. data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
  854. data/spec/shared/lib/mrss/spec_organizer.rb +0 -162
  855. data/spec/shared/lib/mrss/utils.rb +0 -15
  856. data/spec/shared/share/Dockerfile.erb +0 -231
  857. data/spec/shared/shlib/distro.sh +0 -73
  858. data/spec/shared/shlib/server.sh +0 -290
  859. data/spec/shared/shlib/set_env.sh +0 -128
  860. data/spec/support/session_registry.rb +0 -50
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe ActiveSupport::TimeWithZone do
@@ -322,37 +325,10 @@ describe ActiveSupport::TimeWithZone do
322
325
  end
323
326
  end
324
327
 
325
- describe "#__evolve_date__" do
326
-
327
- let(:evolved) do
328
- time.__evolve_date__
329
- end
330
-
331
- context 'beginning of day' do
332
- let(:time) do
333
- time_zone.local(2010, 1, 1, 0, 0, 1).freeze
334
- end
335
-
336
- it "returns midnight utc" do
337
- expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
338
- end
339
- end
340
-
341
- context 'end of day' do
342
- let(:time) do
343
- time_zone.local(2010, 1, 1, 23, 59, 59).freeze
344
- end
345
-
346
- it "returns midnight utc" do
347
- expect(evolved).to eq(Time.utc(2010, 1, 1, 0, 0, 0))
348
- end
349
- end
350
- end
351
-
352
328
  describe "#__evolve_time__" do
353
329
 
354
330
  let(:date) do
355
- time_zone.local(2010, 1, 1, 12, 0, 0).freeze
331
+ time_zone.local(2010, 1, 1, 12, 0, 0)
356
332
  end
357
333
 
358
334
  let(:evolved) do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Criteria::Queryable::Key do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Criteria::Queryable::Mergeable do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Criteria::Queryable::Optional do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Criteria::Queryable::Options do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Criteria::Queryable::Pipeline do
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  require "spec_helper"
2
5
 
3
6
  describe Mongoid::Query do
@@ -9,6 +9,83 @@ describe Mongoid::Criteria::Queryable::Selectable do
9
9
  Mongoid::Query.new("id" => "_id")
10
10
  end
11
11
 
12
+ shared_examples_for 'returns a cloned query' do
13
+
14
+ it "returns a cloned query" do
15
+ expect(selection).to_not equal(query)
16
+ end
17
+ end
18
+
19
+ shared_examples_for 'a non-combining logical operation' do
20
+
21
+ context 'when there is a single predicate' do
22
+ let(:query) do
23
+ Mongoid::Query.new.send(tested_method, hello: 'world')
24
+ end
25
+
26
+ it 'adds the predicate' do
27
+ expect(query.selector).to eq(expected_operator => [{'hello' => 'world'}])
28
+ end
29
+ end
30
+
31
+ context 'when the single predicate is wrapped in an array' do
32
+ let(:query) do
33
+ Mongoid::Query.new.send(tested_method, [{hello: 'world'}])
34
+ end
35
+
36
+ it 'adds the predicate' do
37
+ expect(query.selector).to eq(expected_operator => [{'hello' => 'world'}])
38
+ end
39
+ end
40
+
41
+ context 'when argument is a Criteria' do
42
+ let(:query) do
43
+ Mongoid::Query.new.where(hello: 'world')
44
+ end
45
+
46
+ let(:other) do
47
+ Mongoid::Query.new.where(foo: 'bar')
48
+ end
49
+
50
+ let(:result) { query.send(tested_method, other) }
51
+
52
+ it 'combines' do
53
+ # This is used for $or / $nor, the two conditions should remain
54
+ # as separate hashes
55
+ expect(result.selector).to eq(expected_operator => [{'hello' => 'world'}, {'foo' => 'bar'}])
56
+ end
57
+ end
58
+
59
+ context 'when argument is a mix of Criteria and hashes' do
60
+ let(:query) do
61
+ Mongoid::Query.new.where(hello: 'world')
62
+ end
63
+
64
+ let(:other1) do
65
+ Mongoid::Query.new.where(foo: 'bar')
66
+ end
67
+
68
+ let(:other2) do
69
+ {bar: 42}
70
+ end
71
+
72
+ let(:other3) do
73
+ Mongoid::Query.new.where(a: 2)
74
+ end
75
+
76
+ let(:result) { query.send(tested_method, other1, other2, other3) }
77
+
78
+ it 'combines' do
79
+ expect(result.selector).to eq(expected_operator => [
80
+ {'hello' => 'world'},
81
+ {'foo' => 'bar'},
82
+ {'bar' => 42},
83
+ {'a' => 2},
84
+ ])
85
+ end
86
+ end
87
+ end
88
+
12
89
  describe "#and" do
13
90
 
14
91
  context "when provided no criterion" do
@@ -25,9 +102,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
25
102
  expect(selection).to eq(query)
26
103
  end
27
104
 
28
- it "returns a cloned query" do
29
- expect(selection).to_not equal(query)
30
- end
105
+ it_behaves_like 'returns a cloned query'
31
106
  end
32
107
 
33
108
  context "when provided nil" do
@@ -44,25 +119,78 @@ describe Mongoid::Criteria::Queryable::Selectable do
44
119
  expect(selection).to eq(query)
45
120
  end
46
121
 
47
- it "returns a cloned query" do
48
- expect(selection).to_not equal(query)
49
- end
122
+ it_behaves_like 'returns a cloned query'
50
123
  end
51
124
 
52
125
  context "when provided a single criterion" do
53
126
 
127
+ shared_examples_for 'adds the conditions to top level' do
128
+
129
+ it "adds the conditions to top level" do
130
+ expect(selection.selector).to eq({
131
+ "field" => [ 1, 2 ]
132
+ })
133
+ end
134
+
135
+ it_behaves_like 'returns a cloned query'
136
+ end
137
+
54
138
  let(:selection) do
55
139
  query.and(field: [ 1, 2 ])
56
140
  end
57
141
 
58
- it "adds the $and selector" do
59
- expect(selection.selector).to eq({
60
- "$and" => [{ "field" => [ 1, 2 ] }]
61
- })
142
+ it_behaves_like 'adds the conditions to top level'
143
+
144
+ context 'when the criterion is wrapped in an array' do
145
+ let(:selection) do
146
+ query.and([{field: [ 1, 2 ] }])
147
+ end
148
+
149
+ it_behaves_like 'adds the conditions to top level'
62
150
  end
63
151
 
64
- it "returns a cloned query" do
65
- expect(selection).to_not equal(query)
152
+ context 'when the criterion is wrapped in a deep array with nil elements' do
153
+ let(:selection) do
154
+ query.and([[[{field: [ 1, 2 ] }]], [nil]])
155
+ end
156
+
157
+ it_behaves_like 'adds the conditions to top level'
158
+ end
159
+ end
160
+
161
+ context "when provided a single criterion that is handled via Key" do
162
+
163
+ shared_examples_for 'adds the conditions to top level' do
164
+
165
+ it "adds the conditions to top level" do
166
+ expect(selection.selector).to eq({
167
+ "field" => {'$gt' => 3 },
168
+ })
169
+ end
170
+
171
+ it_behaves_like 'returns a cloned query'
172
+ end
173
+
174
+ let(:selection) do
175
+ query.and(:field.gt => 3)
176
+ end
177
+
178
+ it_behaves_like 'adds the conditions to top level'
179
+
180
+ context 'when the criterion is wrapped in an array' do
181
+ let(:selection) do
182
+ query.and([{ :field.gt => 3 }])
183
+ end
184
+
185
+ it_behaves_like 'adds the conditions to top level'
186
+ end
187
+
188
+ context 'when the criterion is wrapped in a deep array with nil elements' do
189
+ let(:selection) do
190
+ query.and([[[{ :field.gt => 3 }]], [nil]])
191
+ end
192
+
193
+ it_behaves_like 'adds the conditions to top level'
66
194
  end
67
195
  end
68
196
 
@@ -72,142 +200,254 @@ describe Mongoid::Criteria::Queryable::Selectable do
72
200
  query.and(:test.elem_match => { :field.in => [ 1, 2 ] })
73
201
  end
74
202
 
75
- it "adds the $and selector" do
203
+ it "builds the correct selector" do
76
204
  expect(selection.selector).to eq({
77
- "$and" => [{ "test" => { "$elemMatch" => { "field" => { "$in" => [ 1, 2 ] }}}}]
205
+ "test" => { "$elemMatch" => { "field" => { "$in" => [ 1, 2 ] }}}
78
206
  })
79
207
  end
80
208
 
81
- it "returns a cloned query" do
82
- expect(selection).to_not equal(query)
83
- end
209
+ it_behaves_like 'returns a cloned query'
84
210
  end
85
211
 
86
- context "when provided multiple criterion" do
212
+ context "when provided multiple criteria" do
87
213
 
88
- context "when the criterion is already included" do
214
+ context "when the criteria is already included" do
89
215
 
90
216
  let(:selection) do
91
217
  query.and({ first: [ 1, 2 ] }).and({ first: [ 1, 2 ] })
92
218
  end
93
219
 
94
- it "does not duplicate the $and selector" do
220
+ it "adds all conditions" do
95
221
  expect(selection.selector).to eq({
222
+ 'first' => [1, 2],
96
223
  "$and" => [
97
224
  { "first" => [ 1, 2 ] }
98
225
  ]
99
226
  })
100
227
  end
101
228
 
102
- it "returns a cloned query" do
103
- expect(selection).to_not equal(query)
104
- end
229
+ it_behaves_like 'returns a cloned query'
105
230
  end
106
231
 
107
- context "when the criterion are for different fields" do
232
+ context "when the new criterion is for different fields" do
108
233
 
109
234
  let(:selection) do
110
235
  query.and({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
111
236
  end
112
237
 
113
- it "adds the $and selector" do
238
+ it "adds all conditions to top level" do
114
239
  expect(selection.selector).to eq({
115
- "$and" => [
116
- { "first" => [ 1, 2 ] },
117
- { "second" => [ 3, 4 ] }
118
- ]
240
+ "first" => [ 1, 2 ],
241
+ "second" => [ 3, 4 ],
119
242
  })
120
243
  end
121
244
 
122
- it "returns a cloned query" do
123
- expect(selection).to_not equal(query)
124
- end
245
+ it_behaves_like 'returns a cloned query'
125
246
  end
126
247
 
127
- context "when the criterion are on the same field" do
248
+ context "when the new criterion is for the same field" do
128
249
 
129
250
  let(:selection) do
130
251
  query.and({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
131
252
  end
132
253
 
133
- it "appends both $and expressions" do
254
+ it "combines via $and operator" do
134
255
  expect(selection.selector).to eq({
256
+ "first" => [ 1, 2 ],
135
257
  "$and" => [
136
- { "first" => [ 1, 2 ] },
137
258
  { "first" => [ 3, 4 ] }
138
259
  ]
139
260
  })
140
261
  end
141
262
 
142
- it "returns a cloned query" do
143
- expect(selection).to_not equal(query)
144
- end
263
+ it_behaves_like 'returns a cloned query'
145
264
  end
146
265
  end
147
266
 
148
- context "when chaining the criterion" do
267
+ context "when chaining the criteria" do
149
268
 
150
- context "when the criterion are for different fields" do
269
+ context "when the criteria are for different fields" do
151
270
 
152
271
  let(:selection) do
153
272
  query.and(first: [ 1, 2 ]).and(second: [ 3, 4 ])
154
273
  end
155
274
 
156
- it "adds the $and selectors" do
275
+ it "adds the conditions to top level" do
157
276
  expect(selection.selector).to eq({
158
- "$and" => [
159
- { "first" => [ 1, 2 ] },
160
- { "second" => [ 3, 4 ] }
161
- ]
277
+ "first" => [ 1, 2 ],
278
+ "second" => [ 3, 4 ],
162
279
  })
163
280
  end
164
281
 
165
- it "returns a cloned query" do
166
- expect(selection).to_not equal(query)
167
- end
282
+ it_behaves_like 'returns a cloned query'
168
283
  end
169
284
 
170
- context "when the criterion are on the same field" do
285
+ context "when the criteria are on the same field" do
171
286
 
172
287
  let(:selection) do
173
288
  query.and(first: [ 1, 2 ]).and(first: [ 3, 4 ])
174
289
  end
175
290
 
176
- it "appends both $and expressions" do
291
+ it "combines via $and operator" do
177
292
  expect(selection.selector).to eq({
293
+ "first" => [ 1, 2 ],
178
294
  "$and" => [
179
- { "first" => [ 1, 2 ] },
180
295
  { "first" => [ 3, 4 ] }
181
296
  ]
182
297
  })
183
298
  end
184
299
 
185
- it "returns a cloned query" do
186
- expect(selection).to_not equal(query)
300
+ it_behaves_like 'returns a cloned query'
301
+ end
302
+ end
303
+
304
+ context 'when argument is a Criteria' do
305
+ let(:query) do
306
+ Mongoid::Query.new.where(hello: 'world')
307
+ end
308
+
309
+ let(:result) { query.and(other) }
310
+
311
+ context 'different fields' do
312
+
313
+ let(:other) do
314
+ Mongoid::Query.new.where(foo: 'bar')
315
+ end
316
+
317
+ it 'combines both fields at top level' do
318
+ expect(result.selector).to eq('hello' => 'world', 'foo' => 'bar')
319
+ end
320
+ end
321
+
322
+ context 'same field' do
323
+
324
+ let(:other) do
325
+ Mongoid::Query.new.where(hello: /bar/)
326
+ end
327
+
328
+ it 'combines fields with $and' do
329
+ expect(result.selector).to eq('hello' => 'world', '$and' => [{'hello' => /bar/}])
187
330
  end
188
331
  end
189
332
  end
333
+
334
+ context 'when argument is a mix of Criteria and hashes' do
335
+ let(:query) do
336
+ Mongoid::Query.new.where(hello: 'world')
337
+ end
338
+
339
+ let(:other1) do
340
+ Mongoid::Query.new.where(foo: 'bar')
341
+ end
342
+
343
+ let(:other2) do
344
+ {bar: 42}
345
+ end
346
+
347
+ let(:other3) do
348
+ Mongoid::Query.new.where(a: 2)
349
+ end
350
+
351
+ let(:result) { query.and(other1, other2, other3) }
352
+
353
+ it 'combines' do
354
+ expect(result.selector).to eq('hello' => 'world',
355
+ 'foo' => 'bar',
356
+ 'bar' => 42,
357
+ 'a' => 2,
358
+ )
359
+ end
360
+ end
361
+
362
+ context 'when Key instances are used and types involved have serializers' do
363
+ let(:time) { Time.now }
364
+
365
+ let(:query) do
366
+ Band.all.and(:created_at.gt => time)
367
+ end
368
+
369
+ let(:expected) do
370
+ {'created_at' => {'$gt' => time.utc}}
371
+ end
372
+
373
+ it 'combines and evolves' do
374
+ expect(query.selector).to eq(expected)
375
+ end
376
+ end
377
+
378
+ describe 'query shape' do
379
+ shared_examples_for 'adds most recent criterion as $and' do
380
+ let(:selector) { scope.selector }
381
+
382
+ it 'adds most recent criterion as $and' do
383
+ expect(selector).to eq('foo' => 1, '$and' => [{'foo' => 2}])
384
+ end
385
+ end
386
+
387
+ context 'and/and' do
388
+ let(:scope) do
389
+ Band.and(foo: 1).and(foo: 2)
390
+ end
391
+
392
+ it_behaves_like 'adds most recent criterion as $and'
393
+ end
394
+
395
+ context 'and/and' do
396
+ let(:scope) do
397
+ Band.and(foo: 1).and(foo: 2)
398
+ end
399
+
400
+ it_behaves_like 'adds most recent criterion as $and'
401
+ end
402
+
403
+ context 'and/where' do
404
+ let(:scope) do
405
+ Band.and(foo: 1).where(foo: 2)
406
+ end
407
+
408
+ it_behaves_like 'adds most recent criterion as $and'
409
+ end
410
+
411
+ context 'where/and' do
412
+ let(:scope) do
413
+ Band.where(foo: 1).and(foo: 2)
414
+ end
415
+
416
+ it_behaves_like 'adds most recent criterion as $and'
417
+ end
418
+
419
+ context 'where/where' do
420
+ let(:scope) do
421
+ Band.where(foo: 1).where(foo: 2)
422
+ end
423
+
424
+ it_behaves_like 'adds most recent criterion as $and'
425
+ end
426
+ end
190
427
  end
191
428
 
192
429
  describe "#or" do
193
430
 
194
- context "when provided no criterion" do
431
+ let(:tested_method) { :or }
432
+ let(:expected_operator) { '$or' }
433
+
434
+ it_behaves_like 'a non-combining logical operation'
435
+
436
+ context "when provided no arguments" do
195
437
 
196
438
  let(:selection) do
197
439
  query.or
198
440
  end
199
441
 
200
- it "does not add any criterion" do
442
+ it_behaves_like 'returns a cloned query'
443
+
444
+ it "does not add any criteria" do
201
445
  expect(selection.selector).to eq({})
202
446
  end
203
447
 
204
448
  it "returns the query" do
205
449
  expect(selection).to eq(query)
206
450
  end
207
-
208
- it "returns a cloned query" do
209
- expect(selection).to_not equal(query)
210
- end
211
451
  end
212
452
 
213
453
  context "when provided nil" do
@@ -216,17 +456,15 @@ describe Mongoid::Criteria::Queryable::Selectable do
216
456
  query.or(nil)
217
457
  end
218
458
 
219
- it "does not add any criterion" do
459
+ it_behaves_like 'returns a cloned query'
460
+
461
+ it "does not add any criteria" do
220
462
  expect(selection.selector).to eq({})
221
463
  end
222
464
 
223
465
  it "returns the query" do
224
466
  expect(selection).to eq(query)
225
467
  end
226
-
227
- it "returns a cloned query" do
228
- expect(selection).to_not equal(query)
229
- end
230
468
  end
231
469
 
232
470
  context "when provided a single criterion" do
@@ -235,25 +473,87 @@ describe Mongoid::Criteria::Queryable::Selectable do
235
473
  query.or(field: [ 1, 2 ])
236
474
  end
237
475
 
476
+ it_behaves_like 'returns a cloned query'
477
+
238
478
  it "adds the $or selector" do
239
479
  expect(selection.selector).to eq({
240
480
  "$or" => [{ "field" => [ 1, 2 ] }]
241
481
  })
242
482
  end
243
483
 
244
- it "returns a cloned query" do
245
- expect(selection).to_not equal(query)
484
+ context 'when the criterion is wrapped in array' do
485
+
486
+ let(:selection) do
487
+ query.or([{ field: [ 1, 2 ] }])
488
+ end
489
+
490
+ it_behaves_like 'returns a cloned query'
491
+
492
+ it "adds the $or selector" do
493
+ expect(selection.selector).to eq({
494
+ "$or" => [{ "field" => [ 1, 2 ] }]
495
+ })
496
+ end
497
+
498
+ context 'when the array has nil as one of the elements' do
499
+
500
+ let(:selection) do
501
+ query.or([{ field: [ 1, 2 ] }, nil])
502
+ end
503
+
504
+ it_behaves_like 'returns a cloned query'
505
+
506
+ it "adds the $or selector ignoring the nil element" do
507
+ expect(selection.selector).to eq({
508
+ "$or" => [{ "field" => [ 1, 2 ] }]
509
+ })
510
+ end
511
+ end
512
+ end
513
+
514
+ context 'when query already has a condition on another field' do
515
+
516
+ let(:selection) do
517
+ query.where(foo: 'bar').or(field: [ 1, 2 ])
518
+ end
519
+
520
+ it 'moves original conditions under $or' do
521
+ expect(selection.selector).to eq({
522
+ "$or" => [{'foo' => 'bar'}, { "field" => [ 1, 2 ] }]
523
+ })
524
+ end
525
+ end
526
+
527
+ context 'when query already has an $or condition and another condition' do
528
+
529
+ let(:selection) do
530
+ query.or(field: [ 1, 2 ]).where(foo: 'bar').or(test: 1)
531
+ end
532
+
533
+ it 'unions existing conditions' do
534
+ expect(selection.selector).to eq(
535
+ '$or' => [
536
+ {
537
+ "$or" => [{ "field" => [ 1, 2 ] }],
538
+ 'foo' => 'bar',
539
+ },
540
+ {'test' => 1},
541
+ ]
542
+ )
543
+ end
246
544
  end
247
545
  end
248
546
 
249
- context "when provided multiple criterion" do
547
+ context "when provided multiple criteria" do
250
548
 
251
- context "when the criterion are for different fields" do
549
+ context "when the criteria are for different fields" do
252
550
 
253
551
  let(:selection) do
254
552
  query.or({ first: [ 1, 2 ] }, { second: [ 3, 4 ] })
255
553
  end
256
554
 
555
+ it_behaves_like 'returns a cloned query'
556
+
257
557
  it "adds the $or selector" do
258
558
  expect(selection.selector).to eq({
259
559
  "$or" => [
@@ -262,13 +562,9 @@ describe Mongoid::Criteria::Queryable::Selectable do
262
562
  ]
263
563
  })
264
564
  end
265
-
266
- it "returns a cloned query" do
267
- expect(selection).to_not equal(query)
268
- end
269
565
  end
270
566
 
271
- context "when a criterion has a selectable key" do
567
+ context "when the criteria uses a Key instance" do
272
568
 
273
569
  let(:selection) do
274
570
  query.or({ first: [ 1, 2 ] }, { :second.gt => 3 })
@@ -283,12 +579,10 @@ describe Mongoid::Criteria::Queryable::Selectable do
283
579
  })
284
580
  end
285
581
 
286
- it "returns a cloned query" do
287
- expect(selection).to_not equal(query)
288
- end
582
+ it_behaves_like 'returns a cloned query'
289
583
  end
290
584
 
291
- context "when the criterion has an aliased field" do
585
+ context "when a criterion has an aliased field" do
292
586
 
293
587
  let(:selection) do
294
588
  query.or({ id: 1 })
@@ -300,9 +594,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
300
594
  })
301
595
  end
302
596
 
303
- it "returns a cloned query" do
304
- expect(selection).to_not equal(query)
305
- end
597
+ it_behaves_like 'returns a cloned query'
306
598
  end
307
599
 
308
600
  context "when a criterion is wrapped in an array" do
@@ -311,6 +603,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
311
603
  query.or([{ first: [ 1, 2 ] }, { :second.gt => 3 }])
312
604
  end
313
605
 
606
+ it_behaves_like 'returns a cloned query'
607
+
314
608
  it "adds the $or selector" do
315
609
  expect(selection.selector).to eq({
316
610
  "$or" => [
@@ -319,18 +613,16 @@ describe Mongoid::Criteria::Queryable::Selectable do
319
613
  ]
320
614
  })
321
615
  end
322
-
323
- it "returns a cloned query" do
324
- expect(selection).to_not equal(query)
325
- end
326
616
  end
327
617
 
328
- context "when the criterion are on the same field" do
618
+ context "when the criteria are on the same field" do
329
619
 
330
620
  let(:selection) do
331
621
  query.or({ first: [ 1, 2 ] }, { first: [ 3, 4 ] })
332
622
  end
333
623
 
624
+ it_behaves_like 'returns a cloned query'
625
+
334
626
  it "appends both $or expressions" do
335
627
  expect(selection.selector).to eq({
336
628
  "$or" => [
@@ -339,10 +631,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
339
631
  ]
340
632
  })
341
633
  end
342
-
343
- it "returns a cloned query" do
344
- expect(selection).to_not equal(query)
345
- end
346
634
  end
347
635
  end
348
636
 
@@ -354,6 +642,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
354
642
  query.or(first: [ 1, 2 ]).or(second: [ 3, 4 ])
355
643
  end
356
644
 
645
+ it_behaves_like 'returns a cloned query'
646
+
357
647
  it "adds the $or selectors" do
358
648
  expect(selection.selector).to eq({
359
649
  "$or" => [
@@ -362,10 +652,6 @@ describe Mongoid::Criteria::Queryable::Selectable do
362
652
  ]
363
653
  })
364
654
  end
365
-
366
- it "returns a cloned query" do
367
- expect(selection).to_not equal(query)
368
- end
369
655
  end
370
656
 
371
657
  context "when the criterion are on the same field" do
@@ -374,6 +660,8 @@ describe Mongoid::Criteria::Queryable::Selectable do
374
660
  query.or(first: [ 1, 2 ]).or(first: [ 3, 4 ])
375
661
  end
376
662
 
663
+ it_behaves_like 'returns a cloned query'
664
+
377
665
  it "appends both $or expressions" do
378
666
  expect(selection.selector).to eq({
379
667
  "$or" => [
@@ -382,16 +670,17 @@ describe Mongoid::Criteria::Queryable::Selectable do
382
670
  ]
383
671
  })
384
672
  end
385
-
386
- it "returns a cloned query" do
387
- expect(selection).to_not equal(query)
388
- end
389
673
  end
390
674
  end
391
675
  end
392
676
 
393
677
  describe "#nor" do
394
678
 
679
+ let(:tested_method) { :nor }
680
+ let(:expected_operator) { '$nor' }
681
+
682
+ it_behaves_like 'a non-combining logical operation'
683
+
395
684
  context "when provided no criterion" do
396
685
 
397
686
  let(:selection) do
@@ -406,9 +695,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
406
695
  expect(selection).to eq(query)
407
696
  end
408
697
 
409
- it "returns a cloned query" do
410
- expect(selection).to_not equal(query)
411
- end
698
+ it_behaves_like 'returns a cloned query'
412
699
  end
413
700
 
414
701
  context "when provided nil" do
@@ -425,9 +712,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
425
712
  expect(selection).to eq(query)
426
713
  end
427
714
 
428
- it "returns a cloned query" do
429
- expect(selection).to_not equal(query)
430
- end
715
+ it_behaves_like 'returns a cloned query'
431
716
  end
432
717
 
433
718
  context "when provided a single criterion" do
@@ -442,9 +727,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
442
727
  })
443
728
  end
444
729
 
445
- it "returns a cloned query" do
446
- expect(selection).to_not equal(query)
447
- end
730
+ it_behaves_like 'returns a cloned query'
448
731
  end
449
732
 
450
733
  context "when provided multiple criterion" do
@@ -464,9 +747,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
464
747
  })
465
748
  end
466
749
 
467
- it "returns a cloned query" do
468
- expect(selection).to_not equal(query)
469
- end
750
+ it_behaves_like 'returns a cloned query'
470
751
  end
471
752
 
472
753
  context "when the criterion are on the same field" do
@@ -484,9 +765,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
484
765
  })
485
766
  end
486
767
 
487
- it "returns a cloned query" do
488
- expect(selection).to_not equal(query)
489
- end
768
+ it_behaves_like 'returns a cloned query'
490
769
  end
491
770
  end
492
771
 
@@ -507,9 +786,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
507
786
  })
508
787
  end
509
788
 
510
- it "returns a cloned query" do
511
- expect(selection).to_not equal(query)
512
- end
789
+ it_behaves_like 'returns a cloned query'
513
790
  end
514
791
 
515
792
  context "when the criterion are on the same field" do
@@ -527,9 +804,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
527
804
  })
528
805
  end
529
806
 
530
- it "returns a cloned query" do
531
- expect(selection).to_not equal(query)
532
- end
807
+ it_behaves_like 'returns a cloned query'
533
808
  end
534
809
  end
535
810
  end
@@ -561,27 +836,45 @@ describe Mongoid::Criteria::Queryable::Selectable do
561
836
  expect(query.negating).to be nil
562
837
  end
563
838
 
564
- context "when the following criteria is a query method" do
565
-
839
+ shared_examples_for 'negates the next condition' do
566
840
  let(:selection) do
567
- query.not.all(field: [ 1, 2 ])
841
+ query.not.send(query_method, field: [ 1, 2 ])
568
842
  end
569
843
 
570
- it "negates the all selection" do
844
+ it "negates the next condition" do
571
845
  expect(selection.selector).to eq(
572
- { "field" => { "$not" => { "$all" => [ 1, 2 ] }}}
846
+ { "field" => { "$not" => { operator => [ 1, 2 ] }}}
573
847
  )
574
848
  end
575
849
 
576
- it "returns a cloned query" do
577
- expect(selection).to_not equal(query)
578
- end
850
+ it_behaves_like 'returns a cloned query'
579
851
 
580
852
  it "removes the negation on the clone" do
581
853
  expect(selection).to_not be_negating
582
854
  end
583
855
  end
584
856
 
857
+ context "when the next condition is #all" do
858
+ let(:query_method) { :all }
859
+ let(:operator) { '$all' }
860
+
861
+ it_behaves_like 'negates the next condition'
862
+ end
863
+
864
+ context "when the next condition is #in" do
865
+ let(:query_method) { :in }
866
+ let(:operator) { '$in' }
867
+
868
+ it_behaves_like 'negates the next condition'
869
+ end
870
+
871
+ context "when the next condition is #nin" do
872
+ let(:query_method) { :nin }
873
+ let(:operator) { '$nin' }
874
+
875
+ it_behaves_like 'negates the next condition'
876
+ end
877
+
585
878
  context "when the following criteria is a gt method" do
586
879
 
587
880
  let(:selection) do
@@ -594,9 +887,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
594
887
  )
595
888
  end
596
889
 
597
- it "returns a coned query" do
598
- expect(selection).to_not eq(query)
599
- end
890
+ it_behaves_like 'returns a cloned query'
600
891
 
601
892
  it "removes the negation on the clone" do
602
893
  expect(selection).to_not be_negating
@@ -615,9 +906,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
615
906
  )
616
907
  end
617
908
 
618
- it "returns a cloned query" do
619
- expect(selection).to_not equal(query)
620
- end
909
+ it_behaves_like 'returns a cloned query'
621
910
 
622
911
  it "removes the negation on the clone" do
623
912
  expect(selection).to_not be_negating
@@ -636,9 +925,26 @@ describe Mongoid::Criteria::Queryable::Selectable do
636
925
  )
637
926
  end
638
927
 
639
- it "returns a cloned query" do
640
- expect(selection).to_not equal(query)
928
+ it_behaves_like 'returns a cloned query'
929
+
930
+ it "removes the negation on the clone" do
931
+ expect(selection).to_not be_negating
641
932
  end
933
+ end
934
+
935
+ context 'when the following criteria uses string were form' do
936
+
937
+ let(:selection) do
938
+ query.not.where('hello world')
939
+ end
940
+
941
+ it "negates the selection with an operator" do
942
+ expect(selection.selector).to eq(
943
+ '$and' => [{'$nor' => [{'$where' => 'hello world'}]}]
944
+ )
945
+ end
946
+
947
+ it_behaves_like 'returns a cloned query'
642
948
 
643
949
  it "removes the negation on the clone" do
644
950
  expect(selection).to_not be_negating
@@ -661,9 +967,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
661
967
  expect(selection).to eq(query)
662
968
  end
663
969
 
664
- it "returns a cloned query" do
665
- expect(selection).to_not equal(query)
666
- end
970
+ it_behaves_like 'returns a cloned query'
667
971
  end
668
972
 
669
973
  context "when provided a single criterion" do
@@ -678,14 +982,31 @@ describe Mongoid::Criteria::Queryable::Selectable do
678
982
  })
679
983
  end
680
984
 
681
- it "returns a cloned query" do
682
- expect(selection).to_not equal(query)
985
+ it_behaves_like 'returns a cloned query'
986
+ end
987
+
988
+ context "when negating a field in the original selector" do
989
+ let(:query) do
990
+ Mongoid::Query.new("id" => "_id").where(field: 'foo')
991
+ end
992
+
993
+ let(:selection) do
994
+ query.not(field: 'bar')
995
+ end
996
+
997
+ it "combines the conditions" do
998
+ expect(selection.selector).to eq({
999
+ "field" => 'foo',
1000
+ '$and' => [{'$nor' => [{ "field" => 'bar' }]}],
1001
+ })
683
1002
  end
1003
+
1004
+ it_behaves_like 'returns a cloned query'
684
1005
  end
685
1006
 
686
- context "when provided multiple criterion" do
1007
+ context "when provided multiple criteria" do
687
1008
 
688
- context "when the criterion are for different fields" do
1009
+ context "when the criteria are for different fields" do
689
1010
 
690
1011
  let(:selection) do
691
1012
  query.not(first: /1/, second: /2/)
@@ -698,9 +1019,23 @@ describe Mongoid::Criteria::Queryable::Selectable do
698
1019
  })
699
1020
  end
700
1021
 
701
- it "returns a cloned query" do
702
- expect(selection).to_not equal(query)
1022
+ it_behaves_like 'returns a cloned query'
1023
+ end
1024
+
1025
+ context "when the criteria are given in separate arguments" do
1026
+
1027
+ let(:selection) do
1028
+ query.not({first: /1/}, {second: /2/})
1029
+ end
1030
+
1031
+ it "adds the $not selectors" do
1032
+ expect(selection.selector).to eq({
1033
+ "first" => { "$not" => /1/ },
1034
+ "second" => { "$not" => /2/ }
1035
+ })
703
1036
  end
1037
+
1038
+ it_behaves_like 'returns a cloned query'
704
1039
  end
705
1040
  end
706
1041
 
@@ -719,9 +1054,7 @@ describe Mongoid::Criteria::Queryable::Selectable do
719
1054
  })
720
1055
  end
721
1056
 
722
- it "returns a cloned query" do
723
- expect(selection).to_not equal(query)
724
- end
1057
+ it_behaves_like 'returns a cloned query'
725
1058
  end
726
1059
 
727
1060
  context "when the criterion are on the same field" do
@@ -730,15 +1063,14 @@ describe Mongoid::Criteria::Queryable::Selectable do
730
1063
  query.not(first: /1/).not(first: /2/)
731
1064
  end
732
1065
 
733
- it "overwrites the first $not selector" do
734
- expect(selection.selector).to eq({
735
- "first" => { "$not" => /2/ }
736
- })
1066
+ it "combines conditions" do
1067
+ expect(selection.selector).to eq(
1068
+ "first" => { "$not" => /1/ },
1069
+ '$and' => [{'$nor' => [{'first' => /2/}]}],
1070
+ )
737
1071
  end
738
1072
 
739
- it "returns a cloned query" do
740
- expect(selection).to_not equal(query)
741
- end
1073
+ it_behaves_like 'returns a cloned query'
742
1074
  end
743
1075
 
744
1076
  context "when the criterion are a double negative" do
@@ -753,9 +1085,85 @@ describe Mongoid::Criteria::Queryable::Selectable do
753
1085
  })
754
1086
  end
755
1087
 
756
- it "returns a cloned query" do
757
- expect(selection).to_not equal(query)
758
- end
1088
+ it_behaves_like 'returns a cloned query'
1089
+ end
1090
+ end
1091
+
1092
+ context 'when argument is a Criteria' do
1093
+ let(:query) do
1094
+ Mongoid::Query.new.where(hello: 'world')
1095
+ end
1096
+
1097
+ let(:other) do
1098
+ Mongoid::Query.new.where(foo: 'bar')
1099
+ end
1100
+
1101
+ let(:result) { query.not(other) }
1102
+
1103
+ it 'combines' do
1104
+ expect(result.selector).to eq('hello' => 'world', 'foo' => {'$ne' => 'bar'})
1105
+ end
1106
+ end
1107
+
1108
+ context 'when argument is a simple Criteria with multiple fields' do
1109
+ let(:query) do
1110
+ Mongoid::Query.new.where(hello: 'world')
1111
+ end
1112
+
1113
+ let(:other) do
1114
+ Mongoid::Query.new.where(a: 1, b: 2)
1115
+ end
1116
+
1117
+ let(:result) { query.not(other) }
1118
+
1119
+ it 'combines fields into top level criteria' do
1120
+ expect(result.selector).to eq('hello' => 'world',
1121
+ 'a' => {'$ne' => 1}, 'b' => {'$ne' => 2})
1122
+ end
1123
+ end
1124
+
1125
+ context 'when argument is a complex Criteria' do
1126
+ let(:query) do
1127
+ Mongoid::Query.new.where(hello: 'world')
1128
+ end
1129
+
1130
+ let(:other) do
1131
+ Mongoid::Query.new.where('$nor' => [{a: 1, b: 2}])
1132
+ end
1133
+
1134
+ let(:result) { query.not(other) }
1135
+
1136
+ it 'combines with $and of $nor' do
1137
+ expect(result.selector).to eq('hello' => 'world', '$and' => [{'$nor' => [{
1138
+ '$nor' => [{'a' => 1, 'b' => 2}]}]}])
1139
+ end
1140
+ end
1141
+
1142
+ context 'when argument is a mix of Criteria and hashes' do
1143
+ let(:query) do
1144
+ Mongoid::Query.new.where(hello: 'world')
1145
+ end
1146
+
1147
+ let(:other1) do
1148
+ Mongoid::Query.new.where(foo: 'bar')
1149
+ end
1150
+
1151
+ let(:other2) do
1152
+ {bar: 42}
1153
+ end
1154
+
1155
+ let(:other3) do
1156
+ Mongoid::Query.new.where(a: 2)
1157
+ end
1158
+
1159
+ let(:result) { query.not(other1, other2, other3) }
1160
+
1161
+ it 'combines' do
1162
+ expect(result.selector).to eq('hello' => 'world',
1163
+ 'foo' => {'$ne' => 'bar'},
1164
+ 'bar' => {'$ne' => 42},
1165
+ 'a' => {'$ne' => 2},
1166
+ )
759
1167
  end
760
1168
  end
761
1169
  end