mongoid 7.1.0.rc0 → 7.2.0.rc1

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 (508) 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 +6 -6
  5. data/LICENSE +1 -1
  6. data/README.md +14 -7
  7. data/Rakefile +21 -0
  8. data/lib/config/locales/en.yml +42 -6
  9. data/lib/mongoid.rb +26 -2
  10. data/lib/mongoid/association/accessors.rb +37 -2
  11. data/lib/mongoid/association/depending.rb +1 -6
  12. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  14. data/lib/mongoid/association/many.rb +5 -4
  15. data/lib/mongoid/association/proxy.rb +6 -4
  16. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
  17. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  18. data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
  19. data/lib/mongoid/association/referenced/eager.rb +29 -9
  20. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  21. data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
  22. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
  23. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  24. data/lib/mongoid/atomic.rb +13 -3
  25. data/lib/mongoid/atomic/modifiers.rb +1 -1
  26. data/lib/mongoid/attributes.rb +28 -20
  27. data/lib/mongoid/attributes/dynamic.rb +1 -1
  28. data/lib/mongoid/clients/factory.rb +19 -2
  29. data/lib/mongoid/clients/options.rb +8 -8
  30. data/lib/mongoid/clients/sessions.rb +20 -4
  31. data/lib/mongoid/clients/storage_options.rb +5 -5
  32. data/lib/mongoid/composable.rb +1 -0
  33. data/lib/mongoid/config.rb +45 -12
  34. data/lib/mongoid/config/options.rb +5 -2
  35. data/lib/mongoid/contextual.rb +5 -4
  36. data/lib/mongoid/contextual/geo_near.rb +3 -2
  37. data/lib/mongoid/contextual/map_reduce.rb +3 -2
  38. data/lib/mongoid/contextual/mongo.rb +25 -5
  39. data/lib/mongoid/copyable.rb +2 -2
  40. data/lib/mongoid/criteria.rb +80 -11
  41. data/lib/mongoid/criteria/modifiable.rb +2 -1
  42. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  43. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  45. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  46. data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
  47. data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
  48. data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
  49. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  50. data/lib/mongoid/criteria/queryable/storable.rb +106 -101
  51. data/lib/mongoid/document.rb +15 -3
  52. data/lib/mongoid/errors.rb +7 -0
  53. data/lib/mongoid/errors/eager_load.rb +2 -0
  54. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  55. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  56. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  57. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  58. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  59. data/lib/mongoid/errors/invalid_query.rb +41 -0
  60. data/lib/mongoid/errors/no_client_config.rb +2 -2
  61. data/lib/mongoid/errors/no_default_client.rb +1 -1
  62. data/lib/mongoid/extensions/hash.rb +4 -2
  63. data/lib/mongoid/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/factory.rb +27 -10
  65. data/lib/mongoid/fields.rb +2 -1
  66. data/lib/mongoid/fields/standard.rb +2 -1
  67. data/lib/mongoid/fields/validators/macro.rb +26 -10
  68. data/lib/mongoid/findable.rb +55 -18
  69. data/lib/mongoid/indexable.rb +2 -2
  70. data/lib/mongoid/interceptable.rb +5 -1
  71. data/lib/mongoid/matchable.rb +1 -149
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/matcher/all.rb +22 -0
  74. data/lib/mongoid/matcher/and.rb +21 -0
  75. data/lib/mongoid/matcher/elem_match.rb +35 -0
  76. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  77. data/lib/mongoid/matcher/eq.rb +11 -0
  78. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  79. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  80. data/lib/mongoid/matcher/exists.rb +15 -0
  81. data/lib/mongoid/matcher/expression.rb +40 -0
  82. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  83. data/lib/mongoid/matcher/field_expression.rb +63 -0
  84. data/lib/mongoid/matcher/field_operator.rb +52 -0
  85. data/lib/mongoid/matcher/gt.rb +17 -0
  86. data/lib/mongoid/matcher/gte.rb +17 -0
  87. data/lib/mongoid/matcher/in.rb +25 -0
  88. data/lib/mongoid/matcher/lt.rb +17 -0
  89. data/lib/mongoid/matcher/lte.rb +17 -0
  90. data/lib/mongoid/matcher/ne.rb +16 -0
  91. data/lib/mongoid/matcher/nin.rb +11 -0
  92. data/lib/mongoid/matcher/nor.rb +25 -0
  93. data/lib/mongoid/matcher/not.rb +29 -0
  94. data/lib/mongoid/matcher/or.rb +21 -0
  95. data/lib/mongoid/matcher/regex.rb +41 -0
  96. data/lib/mongoid/matcher/size.rb +26 -0
  97. data/lib/mongoid/persistable/deletable.rb +1 -1
  98. data/lib/mongoid/persistable/pushable.rb +11 -2
  99. data/lib/mongoid/persistence_context.rb +6 -6
  100. data/lib/mongoid/query_cache.rb +83 -38
  101. data/lib/mongoid/railties/database.rake +7 -0
  102. data/lib/mongoid/reloadable.rb +2 -2
  103. data/lib/mongoid/serializable.rb +11 -3
  104. data/lib/mongoid/shardable.rb +56 -4
  105. data/lib/mongoid/tasks/database.rake +10 -5
  106. data/lib/mongoid/tasks/database.rb +83 -0
  107. data/lib/mongoid/timestamps/timeless.rb +3 -1
  108. data/lib/mongoid/traversable.rb +111 -4
  109. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  110. data/lib/mongoid/version.rb +1 -1
  111. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
  112. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  113. data/spec/integration/app_spec.rb +254 -0
  114. data/spec/integration/associations/embedded_spec.rb +148 -0
  115. data/spec/integration/associations/has_many_spec.rb +69 -0
  116. data/spec/integration/associations/has_one_spec.rb +69 -0
  117. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  118. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  119. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  120. data/spec/integration/criteria/date_field_spec.rb +41 -0
  121. data/spec/integration/criteria/logical_spec.rb +13 -0
  122. data/spec/integration/discriminator_key_spec.rb +354 -0
  123. data/spec/integration/discriminator_value_spec.rb +207 -0
  124. data/spec/integration/document_spec.rb +22 -0
  125. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  126. data/spec/integration/matcher_operator_data/all.yml +140 -0
  127. data/spec/integration/matcher_operator_data/and.yml +93 -0
  128. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  129. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  130. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  131. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  132. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  133. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  134. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  135. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  136. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  137. data/spec/integration/matcher_operator_data/in.yml +194 -0
  138. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  139. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  140. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  141. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  142. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  143. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  144. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  145. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  146. data/spec/integration/matcher_operator_data/not.yml +196 -0
  147. data/spec/integration/matcher_operator_data/or.yml +137 -0
  148. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  149. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  150. data/spec/integration/matcher_operator_data/size.yml +174 -0
  151. data/spec/integration/matcher_operator_spec.rb +100 -0
  152. data/spec/integration/matcher_spec.rb +189 -0
  153. data/spec/integration/server_query_spec.rb +142 -0
  154. data/spec/integration/shardable_spec.rb +149 -0
  155. data/spec/lite_spec_helper.rb +15 -4
  156. data/spec/mongoid/association/accessors_spec.rb +238 -63
  157. data/spec/mongoid/association/depending_spec.rb +78 -26
  158. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  159. data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  161. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  162. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  163. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  165. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
  166. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
  167. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  168. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  169. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  170. data/spec/mongoid/atomic_spec.rb +23 -0
  171. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  172. data/spec/mongoid/attributes_spec.rb +19 -7
  173. data/spec/mongoid/changeable_spec.rb +23 -0
  174. data/spec/mongoid/clients/factory_spec.rb +45 -8
  175. data/spec/mongoid/clients/options_spec.rb +11 -11
  176. data/spec/mongoid/clients/sessions_spec.rb +9 -10
  177. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  178. data/spec/mongoid/clients_spec.rb +2 -2
  179. data/spec/mongoid/config_spec.rb +28 -0
  180. data/spec/mongoid/contextual/atomic_spec.rb +22 -11
  181. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  182. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  183. data/spec/mongoid/contextual/mongo_spec.rb +146 -69
  184. data/spec/mongoid/copyable_spec.rb +153 -1
  185. data/spec/mongoid/copyable_spec_models.rb +14 -0
  186. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
  187. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  188. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  189. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  190. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  191. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
  192. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
  193. data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
  194. data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
  195. data/spec/mongoid/criteria_spec.rb +240 -41
  196. data/spec/mongoid/document_fields_spec.rb +29 -0
  197. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  198. data/spec/mongoid/document_spec.rb +89 -15
  199. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  200. data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
  201. data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
  202. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
  203. data/spec/mongoid/factory_spec.rb +261 -28
  204. data/spec/mongoid/fields_spec.rb +72 -3
  205. data/spec/mongoid/findable_spec.rb +32 -0
  206. data/spec/mongoid/indexable_spec.rb +34 -6
  207. data/spec/mongoid/inspectable_spec.rb +29 -2
  208. data/spec/mongoid/interceptable_spec.rb +64 -2
  209. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  210. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  211. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  212. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  213. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  214. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  215. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  216. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  217. data/spec/mongoid/query_cache_spec.rb +498 -29
  218. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  219. data/spec/mongoid/reloadable_spec.rb +72 -0
  220. data/spec/mongoid/scopable_spec.rb +2 -1
  221. data/spec/mongoid/serializable_spec.rb +149 -20
  222. data/spec/mongoid/shardable_models.rb +61 -0
  223. data/spec/mongoid/shardable_spec.rb +69 -16
  224. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  225. data/spec/mongoid/tasks/database_spec.rb +1 -1
  226. data/spec/mongoid/traversable_spec.rb +1100 -0
  227. data/spec/spec_helper.rb +4 -33
  228. data/spec/support/child_process_helper.rb +79 -0
  229. data/spec/support/cluster_config.rb +3 -3
  230. data/spec/support/constraints.rb +50 -10
  231. data/spec/support/expectations.rb +3 -1
  232. data/spec/support/helpers.rb +11 -0
  233. data/spec/support/lite_constraints.rb +22 -0
  234. data/spec/{app → support}/models/account.rb +0 -0
  235. data/spec/{app → support}/models/acolyte.rb +0 -0
  236. data/spec/{app → support}/models/actor.rb +1 -1
  237. data/spec/{app → support}/models/actress.rb +0 -0
  238. data/spec/{app → support}/models/address.rb +0 -0
  239. data/spec/{app → support}/models/address_component.rb +0 -0
  240. data/spec/{app → support}/models/address_number.rb +0 -0
  241. data/spec/{app → support}/models/agency.rb +0 -0
  242. data/spec/{app → support}/models/agent.rb +0 -0
  243. data/spec/{app → support}/models/album.rb +0 -0
  244. data/spec/{app → support}/models/alert.rb +0 -0
  245. data/spec/{app → support}/models/animal.rb +0 -0
  246. data/spec/{app → support}/models/answer.rb +0 -0
  247. data/spec/{app → support}/models/appointment.rb +0 -0
  248. data/spec/support/models/armrest.rb +10 -0
  249. data/spec/{app → support}/models/array_field.rb +0 -0
  250. data/spec/{app → support}/models/article.rb +0 -0
  251. data/spec/{app → support}/models/artist.rb +0 -0
  252. data/spec/{app → support}/models/artwork.rb +0 -0
  253. data/spec/{app → support}/models/audio.rb +0 -0
  254. data/spec/{app → support}/models/augmentation.rb +0 -0
  255. data/spec/{app → support}/models/author.rb +0 -0
  256. data/spec/{app → support}/models/baby.rb +0 -0
  257. data/spec/{app → support}/models/band.rb +0 -0
  258. data/spec/{app → support}/models/bar.rb +0 -0
  259. data/spec/{app → support}/models/basic.rb +0 -0
  260. data/spec/{app → support}/models/bed.rb +0 -0
  261. data/spec/{app → support}/models/big_palette.rb +0 -0
  262. data/spec/{app → support}/models/birthday.rb +0 -0
  263. data/spec/{app → support}/models/bomb.rb +0 -0
  264. data/spec/{app → support}/models/book.rb +0 -0
  265. data/spec/{app → support}/models/breed.rb +0 -0
  266. data/spec/{app → support}/models/browser.rb +1 -1
  267. data/spec/{app → support}/models/building.rb +0 -0
  268. data/spec/{app → support}/models/building_address.rb +0 -0
  269. data/spec/{app → support}/models/bus.rb +0 -0
  270. data/spec/{app → support}/models/business.rb +0 -0
  271. data/spec/{app → support}/models/callback_test.rb +0 -0
  272. data/spec/{app → support}/models/canvas.rb +1 -1
  273. data/spec/{app → support}/models/car.rb +0 -0
  274. data/spec/{app → support}/models/cat.rb +0 -0
  275. data/spec/{app → support}/models/category.rb +0 -0
  276. data/spec/{app → support}/models/child.rb +0 -0
  277. data/spec/{app → support}/models/child_doc.rb +0 -0
  278. data/spec/{app → support}/models/church.rb +0 -0
  279. data/spec/{app → support}/models/circle.rb +0 -0
  280. data/spec/{app → support}/models/circuit.rb +0 -0
  281. data/spec/{app → support}/models/circus.rb +0 -0
  282. data/spec/{app → support}/models/code.rb +0 -0
  283. data/spec/support/models/coding.rb +4 -0
  284. data/spec/support/models/coding/pull_request.rb +12 -0
  285. data/spec/{app → support}/models/comment.rb +0 -0
  286. data/spec/{app → support}/models/company.rb +0 -0
  287. data/spec/{app → support}/models/consumption_period.rb +0 -0
  288. data/spec/{app → support}/models/contextable_item.rb +0 -0
  289. data/spec/{app → support}/models/contractor.rb +0 -0
  290. data/spec/{app → support}/models/cookie.rb +0 -0
  291. data/spec/{app → support}/models/country_code.rb +0 -0
  292. data/spec/{app → support}/models/courier_job.rb +0 -0
  293. data/spec/support/models/crate.rb +13 -0
  294. data/spec/support/models/deed.rb +8 -0
  295. data/spec/{app → support}/models/definition.rb +0 -0
  296. data/spec/support/models/delegating_patient.rb +16 -0
  297. data/spec/{app → support}/models/description.rb +0 -0
  298. data/spec/{app → support}/models/dictionary.rb +0 -0
  299. data/spec/{app → support}/models/division.rb +0 -0
  300. data/spec/{app → support}/models/doctor.rb +0 -0
  301. data/spec/{app → support}/models/dog.rb +0 -0
  302. data/spec/{app → support}/models/dokument.rb +0 -0
  303. data/spec/{app → support}/models/draft.rb +0 -0
  304. data/spec/{app → support}/models/dragon.rb +0 -0
  305. data/spec/{app → support}/models/driver.rb +1 -1
  306. data/spec/{app → support}/models/drug.rb +0 -0
  307. data/spec/{app → support}/models/dungeon.rb +0 -0
  308. data/spec/{app → support}/models/edit.rb +0 -0
  309. data/spec/{app → support}/models/email.rb +0 -0
  310. data/spec/{app → support}/models/employer.rb +0 -0
  311. data/spec/{app → support}/models/entry.rb +0 -0
  312. data/spec/{app → support}/models/eraser.rb +0 -0
  313. data/spec/{app → support}/models/even.rb +0 -0
  314. data/spec/{app → support}/models/event.rb +0 -0
  315. data/spec/{app → support}/models/exhibition.rb +0 -0
  316. data/spec/{app → support}/models/exhibitor.rb +0 -0
  317. data/spec/{app → support}/models/explosion.rb +0 -0
  318. data/spec/{app → support}/models/eye.rb +0 -0
  319. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  320. data/spec/{app → support}/models/face.rb +0 -0
  321. data/spec/{app → support}/models/favorite.rb +0 -0
  322. data/spec/{app → support}/models/filesystem.rb +0 -0
  323. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  324. data/spec/{app → support}/models/firefox.rb +0 -0
  325. data/spec/{app → support}/models/fish.rb +0 -0
  326. data/spec/{app → support}/models/folder.rb +0 -0
  327. data/spec/{app → support}/models/folder_item.rb +0 -0
  328. data/spec/{app → support}/models/fruits.rb +0 -0
  329. data/spec/{app → support}/models/game.rb +0 -0
  330. data/spec/{app → support}/models/ghost.rb +0 -0
  331. data/spec/support/models/guitar.rb +5 -0
  332. data/spec/{app → support}/models/home.rb +0 -0
  333. data/spec/{app → support}/models/house.rb +0 -0
  334. data/spec/{app → support}/models/html_writer.rb +0 -0
  335. data/spec/{app → support}/models/id_key.rb +0 -0
  336. data/spec/support/models/idnodef.rb +8 -0
  337. data/spec/{app → support}/models/image.rb +0 -0
  338. data/spec/{app → support}/models/implant.rb +0 -0
  339. data/spec/support/models/instrument.rb +9 -0
  340. data/spec/{app → support}/models/item.rb +1 -1
  341. data/spec/{app → support}/models/jar.rb +0 -0
  342. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  343. data/spec/{app → support}/models/kangaroo.rb +0 -0
  344. data/spec/{app → support}/models/label.rb +0 -0
  345. data/spec/{app → support}/models/language.rb +0 -0
  346. data/spec/{app → support}/models/lat_lng.rb +0 -0
  347. data/spec/{app → support}/models/league.rb +0 -0
  348. data/spec/{app → support}/models/learner.rb +0 -0
  349. data/spec/{app → support}/models/line_item.rb +0 -0
  350. data/spec/{app → support}/models/location.rb +0 -0
  351. data/spec/{app → support}/models/login.rb +0 -0
  352. data/spec/{app → support}/models/manufacturer.rb +0 -0
  353. data/spec/{app → support}/models/meat.rb +0 -0
  354. data/spec/{app → support}/models/membership.rb +0 -0
  355. data/spec/{app → support}/models/message.rb +0 -0
  356. data/spec/{app → support}/models/minim.rb +0 -0
  357. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  358. data/spec/support/models/mop.rb +16 -0
  359. data/spec/{app → support}/models/movie.rb +0 -0
  360. data/spec/{app → support}/models/my_hash.rb +0 -0
  361. data/spec/{app → support}/models/name.rb +0 -0
  362. data/spec/{app → support}/models/name_only.rb +0 -0
  363. data/spec/{app → support}/models/node.rb +0 -0
  364. data/spec/{app → support}/models/note.rb +0 -0
  365. data/spec/{app → support}/models/odd.rb +0 -0
  366. data/spec/{app → support}/models/ordered_post.rb +0 -0
  367. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  368. data/spec/{app → support}/models/oscar.rb +0 -0
  369. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  370. data/spec/{app → support}/models/override.rb +0 -0
  371. data/spec/{app → support}/models/ownable.rb +0 -0
  372. data/spec/{app → support}/models/owner.rb +2 -0
  373. data/spec/{app → support}/models/pack.rb +0 -0
  374. data/spec/{app → support}/models/page.rb +0 -0
  375. data/spec/{app → support}/models/page_question.rb +0 -0
  376. data/spec/{app → support}/models/palette.rb +1 -1
  377. data/spec/{app → support}/models/parent.rb +0 -0
  378. data/spec/{app → support}/models/parent_doc.rb +0 -0
  379. data/spec/{app → support}/models/passport.rb +1 -0
  380. data/spec/{app → support}/models/patient.rb +0 -0
  381. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  382. data/spec/{app → support}/models/pencil.rb +0 -0
  383. data/spec/{app → support}/models/person.rb +1 -1
  384. data/spec/{app → support}/models/pet.rb +0 -0
  385. data/spec/{app → support}/models/pet_owner.rb +0 -0
  386. data/spec/{app → support}/models/phone.rb +1 -0
  387. data/spec/support/models/piano.rb +5 -0
  388. data/spec/{app → support}/models/pizza.rb +0 -0
  389. data/spec/{app → support}/models/player.rb +0 -0
  390. data/spec/{app → support}/models/post.rb +0 -0
  391. data/spec/{app → support}/models/post_genre.rb +0 -0
  392. data/spec/{app → support}/models/powerup.rb +0 -0
  393. data/spec/{app → support}/models/preference.rb +0 -0
  394. data/spec/{app → support}/models/princess.rb +0 -0
  395. data/spec/{app → support}/models/product.rb +0 -0
  396. data/spec/support/models/profile.rb +18 -0
  397. data/spec/{app → support}/models/pronunciation.rb +0 -0
  398. data/spec/{app → support}/models/pub.rb +0 -0
  399. data/spec/support/models/publication.rb +5 -0
  400. data/spec/support/models/publication/encyclopedia.rb +12 -0
  401. data/spec/support/models/publication/review.rb +14 -0
  402. data/spec/{app → support}/models/purchase.rb +0 -0
  403. data/spec/{app → support}/models/question.rb +0 -0
  404. data/spec/{app → support}/models/quiz.rb +0 -0
  405. data/spec/{app → support}/models/rating.rb +0 -0
  406. data/spec/{app → support}/models/record.rb +0 -0
  407. data/spec/{app → support}/models/registry.rb +0 -0
  408. data/spec/{app → support}/models/role.rb +0 -0
  409. data/spec/{app → support}/models/root_category.rb +0 -0
  410. data/spec/{app → support}/models/sandwich.rb +0 -0
  411. data/spec/{app → support}/models/scheduler.rb +0 -0
  412. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  413. data/spec/support/models/seat.rb +25 -0
  414. data/spec/{app → support}/models/seo.rb +0 -0
  415. data/spec/{app → support}/models/series.rb +0 -0
  416. data/spec/{app → support}/models/server.rb +0 -0
  417. data/spec/{app → support}/models/service.rb +0 -0
  418. data/spec/{app → support}/models/shape.rb +2 -2
  419. data/spec/{app → support}/models/shelf.rb +0 -0
  420. data/spec/{app → support}/models/shipment_address.rb +0 -0
  421. data/spec/{app → support}/models/shipping_container.rb +0 -0
  422. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  423. data/spec/{app → support}/models/shop.rb +0 -0
  424. data/spec/{app → support}/models/short_agent.rb +0 -0
  425. data/spec/{app → support}/models/short_quiz.rb +0 -0
  426. data/spec/{app → support}/models/simple.rb +0 -0
  427. data/spec/{app → support}/models/slave.rb +0 -0
  428. data/spec/{app → support}/models/song.rb +0 -0
  429. data/spec/{app → support}/models/sound.rb +0 -0
  430. data/spec/{app → support}/models/square.rb +0 -0
  431. data/spec/{app → support}/models/staff.rb +0 -0
  432. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  433. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  434. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  435. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  436. data/spec/{app → support}/models/strategy.rb +0 -0
  437. data/spec/{app → support}/models/sub_item.rb +0 -0
  438. data/spec/{app → support}/models/subscription.rb +0 -0
  439. data/spec/{app → support}/models/survey.rb +0 -0
  440. data/spec/{app → support}/models/symptom.rb +0 -0
  441. data/spec/support/models/system_role.rb +7 -0
  442. data/spec/{app → support}/models/tag.rb +0 -0
  443. data/spec/{app → support}/models/target.rb +0 -0
  444. data/spec/{app → support}/models/template.rb +0 -0
  445. data/spec/{app → support}/models/thing.rb +0 -0
  446. data/spec/{app → support}/models/title.rb +0 -0
  447. data/spec/{app → support}/models/tool.rb +2 -2
  448. data/spec/{app → support}/models/topping.rb +0 -0
  449. data/spec/support/models/toy.rb +10 -0
  450. data/spec/{app → support}/models/track.rb +0 -0
  451. data/spec/{app → support}/models/translation.rb +0 -0
  452. data/spec/{app → support}/models/tree.rb +0 -0
  453. data/spec/{app → support}/models/truck.rb +2 -0
  454. data/spec/{app → support}/models/updatable.rb +0 -0
  455. data/spec/{app → support}/models/user.rb +0 -0
  456. data/spec/{app → support}/models/user_account.rb +0 -0
  457. data/spec/{app → support}/models/validation_callback.rb +0 -0
  458. data/spec/{app → support}/models/vehicle.rb +7 -2
  459. data/spec/{app → support}/models/version.rb +0 -0
  460. data/spec/{app → support}/models/vertex.rb +0 -0
  461. data/spec/{app → support}/models/vet_visit.rb +0 -0
  462. data/spec/{app → support}/models/video.rb +0 -0
  463. data/spec/{app → support}/models/video_game.rb +0 -0
  464. data/spec/{app → support}/models/weapon.rb +0 -0
  465. data/spec/{app → support}/models/wiki_page.rb +0 -0
  466. data/spec/{app → support}/models/word.rb +0 -0
  467. data/spec/{app → support}/models/word_origin.rb +0 -0
  468. data/spec/{app → support}/models/writer.rb +2 -2
  469. data/spec/support/session_registry.rb +50 -0
  470. data/spec/support/spec_config.rb +13 -5
  471. data/spec/support/spec_organizer.rb +130 -0
  472. metadata +882 -752
  473. metadata.gz.sig +0 -0
  474. data/lib/mongoid/matchable/all.rb +0 -30
  475. data/lib/mongoid/matchable/and.rb +0 -32
  476. data/lib/mongoid/matchable/default.rb +0 -121
  477. data/lib/mongoid/matchable/elem_match.rb +0 -36
  478. data/lib/mongoid/matchable/eq.rb +0 -23
  479. data/lib/mongoid/matchable/exists.rb +0 -25
  480. data/lib/mongoid/matchable/gt.rb +0 -25
  481. data/lib/mongoid/matchable/gte.rb +0 -25
  482. data/lib/mongoid/matchable/in.rb +0 -26
  483. data/lib/mongoid/matchable/lt.rb +0 -25
  484. data/lib/mongoid/matchable/lte.rb +0 -25
  485. data/lib/mongoid/matchable/ne.rb +0 -23
  486. data/lib/mongoid/matchable/nin.rb +0 -24
  487. data/lib/mongoid/matchable/nor.rb +0 -38
  488. data/lib/mongoid/matchable/or.rb +0 -35
  489. data/lib/mongoid/matchable/regexp.rb +0 -30
  490. data/lib/mongoid/matchable/size.rb +0 -23
  491. data/spec/mongoid/matchable/all_spec.rb +0 -34
  492. data/spec/mongoid/matchable/and_spec.rb +0 -190
  493. data/spec/mongoid/matchable/default_spec.rb +0 -140
  494. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  495. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  496. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  497. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  498. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  499. data/spec/mongoid/matchable/in_spec.rb +0 -52
  500. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  501. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  502. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  503. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  504. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  505. data/spec/mongoid/matchable/or_spec.rb +0 -134
  506. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  507. data/spec/mongoid/matchable/size_spec.rb +0 -28
  508. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -732,108 +732,89 @@ describe Mongoid::Criteria::Queryable::Selectable do
732
732
  end
733
733
  end
734
734
 
735
- describe "#geo_spacial" do
735
+ %i(geo_spatial geo_spacial).each do |meth|
736
+ describe "#geo_spacial" do
736
737
 
737
- let(:query_method) { :geo_spacial }
738
+ let(:query_method) { meth }
738
739
 
739
- it_behaves_like 'requires an argument'
740
- it_behaves_like 'requires a non-nil argument'
740
+ it_behaves_like 'requires an argument'
741
+ it_behaves_like 'requires a non-nil argument'
741
742
 
742
- context "when provided a criterion" do
743
+ context "when provided a criterion" do
743
744
 
744
- context "when the geometry is a point intersection" do
745
+ context "when the geometry is a point intersection" do
745
746
 
746
- let(:selection) do
747
- query.geo_spacial(:location.intersects_point => [ 1, 10 ])
748
- end
747
+ let(:selection) do
748
+ query.public_send(query_method, :location.intersects_point => [ 1, 10 ])
749
+ end
749
750
 
750
- it "adds the $geoIntersects expression" do
751
- expect(selection.selector).to eq({
752
- "location" => {
753
- "$geoIntersects" => {
754
- "$geometry" => {
755
- "type" => "Point",
756
- "coordinates" => [ 1, 10 ]
751
+ it "adds the $geoIntersects expression" do
752
+ expect(selection.selector).to eq({
753
+ "location" => {
754
+ "$geoIntersects" => {
755
+ "$geometry" => {
756
+ "type" => "Point",
757
+ "coordinates" => [ 1, 10 ]
758
+ }
757
759
  }
758
760
  }
759
- }
760
- })
761
- end
761
+ })
762
+ end
762
763
 
763
- it_behaves_like "returns a cloned query"
764
- end
764
+ it_behaves_like "returns a cloned query"
765
+ end
765
766
 
766
- context "when the geometry is a line intersection" do
767
+ context "when the geometry is a line intersection" do
767
768
 
768
- let(:selection) do
769
- query.geo_spacial(:location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
770
- end
769
+ let(:selection) do
770
+ query.public_send(query_method, :location.intersects_line => [[ 1, 10 ], [ 2, 10 ]])
771
+ end
771
772
 
772
- it "adds the $geoIntersects expression" do
773
- expect(selection.selector).to eq({
774
- "location" => {
775
- "$geoIntersects" => {
776
- "$geometry" => {
777
- "type" => "LineString",
778
- "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
773
+ it "adds the $geoIntersects expression" do
774
+ expect(selection.selector).to eq({
775
+ "location" => {
776
+ "$geoIntersects" => {
777
+ "$geometry" => {
778
+ "type" => "LineString",
779
+ "coordinates" => [[ 1, 10 ], [ 2, 10 ]]
780
+ }
779
781
  }
780
782
  }
781
- }
782
- })
783
- end
783
+ })
784
+ end
784
785
 
785
- it_behaves_like "returns a cloned query"
786
- end
786
+ it_behaves_like "returns a cloned query"
787
+ end
787
788
 
788
- context "when the geometry is a polygon intersection" do
789
+ context "when the geometry is a polygon intersection" do
789
790
 
790
- let(:selection) do
791
- query.geo_spacial(
792
- :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
793
- )
794
- end
791
+ let(:selection) do
792
+ query.public_send(query_method,
793
+ :location.intersects_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
794
+ )
795
+ end
795
796
 
796
- it "adds the $geoIntersects expression" do
797
- expect(selection.selector).to eq({
798
- "location" => {
799
- "$geoIntersects" => {
800
- "$geometry" => {
801
- "type" => "Polygon",
802
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
797
+ it "adds the $geoIntersects expression" do
798
+ expect(selection.selector).to eq({
799
+ "location" => {
800
+ "$geoIntersects" => {
801
+ "$geometry" => {
802
+ "type" => "Polygon",
803
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
804
+ }
803
805
  }
804
806
  }
805
- }
806
- })
807
- end
808
-
809
- it_behaves_like "returns a cloned query"
810
- end
811
-
812
- context "when the geometry is within a polygon" do
807
+ })
808
+ end
813
809
 
814
- let(:selection) do
815
- query.geo_spacial(
816
- :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
817
- )
810
+ it_behaves_like "returns a cloned query"
818
811
  end
819
812
 
820
- it "adds the $geoIntersects expression" do
821
- expect(selection.selector).to eq({
822
- "location" => {
823
- "$geoWithin" => {
824
- "$geometry" => {
825
- "type" => "Polygon",
826
- "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
827
- }
828
- }
829
- }
830
- })
831
- end
813
+ context "when the geometry is within a polygon" do
832
814
 
833
- context "when used with the $box operator ($geoWithin query) " do
834
815
  let(:selection) do
835
- query.geo_spacial(
836
- :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
816
+ query.public_send(query_method,
817
+ :location.within_polygon => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
837
818
  )
838
819
  end
839
820
 
@@ -841,16 +822,37 @@ describe Mongoid::Criteria::Queryable::Selectable do
841
822
  expect(selection.selector).to eq({
842
823
  "location" => {
843
824
  "$geoWithin" => {
844
- "$box" => [
845
- [ 1, 10 ], [ 2, 10 ]
846
- ]
825
+ "$geometry" => {
826
+ "type" => "Polygon",
827
+ "coordinates" => [[[ 1, 10 ], [ 2, 10 ], [ 1, 10 ]]]
828
+ }
847
829
  }
848
830
  }
849
831
  })
850
832
  end
851
- end
852
833
 
853
- it_behaves_like "returns a cloned query"
834
+ context "when used with the $box operator ($geoWithin query) " do
835
+ let(:selection) do
836
+ query.public_send(query_method,
837
+ :location.within_box => [[ 1, 10 ], [ 2, 10 ]]
838
+ )
839
+ end
840
+
841
+ it "adds the $geoIntersects expression" do
842
+ expect(selection.selector).to eq({
843
+ "location" => {
844
+ "$geoWithin" => {
845
+ "$box" => [
846
+ [ 1, 10 ], [ 2, 10 ]
847
+ ]
848
+ }
849
+ }
850
+ })
851
+ end
852
+ end
853
+
854
+ it_behaves_like "returns a cloned query"
855
+ end
854
856
  end
855
857
  end
856
858
  end
@@ -2450,6 +2452,58 @@ describe Mongoid::Criteria::Queryable::Selectable do
2450
2452
  end
2451
2453
  end
2452
2454
  end
2455
+
2456
+ context 'when using an MQL logical operator manually' do
2457
+ let(:base_query) do
2458
+ query.where(test: 1)
2459
+ end
2460
+
2461
+ let(:selection) do
2462
+ base_query.where(mql_operator => ['hello' => 'world'])
2463
+ end
2464
+
2465
+ shared_examples_for 'adds conditions to existing query' do
2466
+ it 'adds conditions to existing query' do
2467
+ selection.selector.should == {
2468
+ 'test' => 1,
2469
+ mql_operator => ['hello' => 'world'],
2470
+ }
2471
+ end
2472
+ end
2473
+
2474
+ shared_examples_for 'adds conditions to existing query with an extra $and' do
2475
+ it 'adds conditions to existing query' do
2476
+ selection.selector.should == {
2477
+ 'test' => 1,
2478
+ mql_operator => ['hello' => 'world'],
2479
+ }
2480
+ end
2481
+ end
2482
+
2483
+ context '$or' do
2484
+ let(:mql_operator) { '$or' }
2485
+
2486
+ it_behaves_like 'adds conditions to existing query with an extra $and'
2487
+ end
2488
+
2489
+ context '$nor' do
2490
+ let(:mql_operator) { '$nor' }
2491
+
2492
+ it_behaves_like 'adds conditions to existing query with an extra $and'
2493
+ end
2494
+
2495
+ context '$not' do
2496
+ let(:mql_operator) { '$not' }
2497
+
2498
+ it_behaves_like 'adds conditions to existing query'
2499
+ end
2500
+
2501
+ context '$and' do
2502
+ let(:mql_operator) { '$and' }
2503
+
2504
+ it_behaves_like 'adds conditions to existing query'
2505
+ end
2506
+ end
2453
2507
  end
2454
2508
 
2455
2509
  describe Symbol do
@@ -52,6 +52,22 @@ describe Mongoid::Criteria::Queryable::Storable do
52
52
  end
53
53
  end
54
54
 
55
+ context '$and to query with $and which already has the given key' do
56
+ let(:query) do
57
+ Mongoid::Query.new.where('$and' => [{foo: 'zoom'}])
58
+ end
59
+
60
+ let(:modified) do
61
+ query.send(query_method, '$and', [{'foo' => 'bar'}])
62
+ end
63
+
64
+ it 'adds to existing $and' do
65
+ modified.selector.should == {
66
+ '$and' => [{'foo' => 'zoom'}, {'foo' => 'bar'}],
67
+ }
68
+ end
69
+ end
70
+
55
71
  end
56
72
 
57
73
  context '$or operator' do
@@ -74,9 +90,11 @@ describe Mongoid::Criteria::Queryable::Storable do
74
90
  query.send(query_method, '$or', [{'foo' => 'bar'}])
75
91
  end
76
92
 
77
- it 'replaces top level' do
93
+ it 'adds the new conditions' do
78
94
  modified.selector.should == {
79
- '$or' => [{'zoom' => 'zoom'}, {'foo' => 'bar'}]}
95
+ 'zoom' => 'zoom',
96
+ '$or' => ['foo' => 'bar'],
97
+ }
80
98
  end
81
99
  end
82
100
 
@@ -98,6 +116,66 @@ describe Mongoid::Criteria::Queryable::Storable do
98
116
  end
99
117
  end
100
118
 
119
+ describe '#add_field_expression' do
120
+ context 'simple field and value write' do
121
+ let(:modified) do
122
+ query.add_field_expression('foo', 'bar')
123
+ end
124
+
125
+ it 'adds the condition' do
126
+ modified.selector.should == {
127
+ 'foo' => 'bar'
128
+ }
129
+ end
130
+ end
131
+
132
+ context 'an operator write' do
133
+ let(:modified) do
134
+ query.add_field_expression('$eq', {'foo' => 'bar'})
135
+ end
136
+
137
+ it 'is not allowed' do
138
+ lambda do
139
+ modified
140
+ end.should raise_error(ArgumentError, /Field cannot be an operator/)
141
+ end
142
+ end
143
+
144
+ context 'when another field exists in destination' do
145
+ let(:base) do
146
+ query.add_field_expression('foo', 'bar')
147
+ end
148
+
149
+ let(:modified) do
150
+ base.add_field_expression('zoom', 'zoom')
151
+ end
152
+
153
+ it 'adds the condition' do
154
+ modified.selector.should == {
155
+ 'foo' => 'bar',
156
+ 'zoom' => 'zoom',
157
+ }
158
+ end
159
+ end
160
+
161
+ context 'when field being added already exists in destination' do
162
+ let(:base) do
163
+ query.add_field_expression('foo', 'bar')
164
+ end
165
+
166
+ let(:modified) do
167
+ base.add_field_expression('foo', 'zoom')
168
+ end
169
+
170
+ it 'adds the new condition using $and' do
171
+ modified.selector.should == {
172
+ 'foo' => 'bar',
173
+ '$and' => ['foo' => 'zoom'],
174
+ }
175
+ end
176
+ end
177
+ end
178
+
101
179
  describe '#add_operator_expression' do
102
180
  let(:query_method) { :add_operator_expression }
103
181
 
@@ -786,12 +786,72 @@ describe Mongoid::Criteria do
786
786
 
787
787
  describe "#field_list" do
788
788
 
789
+ context "when using the default discriminator key" do
790
+ let(:criteria) do
791
+ Doctor.only(:_id)
792
+ end
793
+
794
+ it "returns the fields with required _id minus type" do
795
+ expect(criteria.field_list).to eq([ "_id" ])
796
+ end
797
+ end
798
+
799
+ context "when using a custom discriminator key" do
800
+ before do
801
+ Person.discriminator_key = "dkey"
802
+ end
803
+
804
+ after do
805
+ Person.discriminator_key = nil
806
+ end
807
+
808
+ let(:criteria) do
809
+ Doctor.only(:_id, :_type)
810
+ end
811
+
812
+ it "returns the fields with type without dkey" do
813
+ expect(criteria.field_list).to eq([ "_id", "_type" ])
814
+ end
815
+ end
816
+ end
817
+
818
+ describe "#find" do
819
+ let!(:depeche) do
820
+ Band.create!(name: "Depeche Mode")
821
+ end
822
+
789
823
  let(:criteria) do
790
- Band.only(:name)
824
+ Band.where(name: "Depeche Mode")
825
+ end
826
+
827
+ context "when given a block" do
828
+ it "behaves as Enumerable" do
829
+ result = criteria.find { |c| c.name == "Depeche Mode" }
830
+ expect(result).to eq(depeche)
831
+ end
832
+ end
833
+
834
+ context "when given a Proc and a block" do
835
+ it "behaves as Enumerable" do
836
+ result = criteria.find(-> {"default"}) { |c| c.name == "Not Depeche Mode" }
837
+ expect(result).to eq("default")
838
+ end
839
+ end
840
+
841
+ context "when given a Proc" do
842
+ it "behaves as Enumerable" do
843
+ lambda do
844
+ criteria.find(-> {"default"})
845
+ # Proc is not serializable to a BSON type
846
+ end.should raise_error(BSON::Error::UnserializableClass)
847
+ end
791
848
  end
792
849
 
793
- it "returns the fields with required _id minus type" do
794
- expect(criteria.field_list).to eq([ "_id", "name" ])
850
+ context "when given an id" do
851
+ it "behaves as Findable" do
852
+ result = criteria.find(depeche.id)
853
+ expect(result).to eq(depeche)
854
+ end
795
855
  end
796
856
  end
797
857
 
@@ -2337,7 +2397,7 @@ describe Mongoid::Criteria do
2337
2397
  end
2338
2398
 
2339
2399
  it "returns the map/reduce results" do
2340
- expect(map_reduce).to eq([
2400
+ expect(map_reduce.sort_by { |doc| doc['_id'] }).to eq([
2341
2401
  { "_id" => "Depeche Mode", "value" => { "likes" => 200 }},
2342
2402
  { "_id" => "Tool", "value" => { "likes" => 100 }}
2343
2403
  ])
@@ -2804,13 +2864,36 @@ describe Mongoid::Criteria do
2804
2864
  end
2805
2865
 
2806
2866
  context "when using inheritance" do
2867
+ context "when using the default discriminator key" do
2868
+ let(:criteria) do
2869
+ Doctor.only(:_id)
2870
+ end
2807
2871
 
2808
- let(:criteria) do
2809
- Doctor.only(:_id)
2872
+ it "adds _type to the fields" do
2873
+ expect(criteria.options[:fields]).to include("_type")
2874
+ end
2810
2875
  end
2811
2876
 
2812
- it "adds _type to the fields" do
2813
- expect(criteria.options[:fields]["_type"]).to eq(1)
2877
+ context "when setting a custom discriminator key" do
2878
+ before do
2879
+ Person.discriminator_key = "dkey"
2880
+ end
2881
+
2882
+ after do
2883
+ Person.discriminator_key = nil
2884
+ end
2885
+
2886
+ let(:criteria) do
2887
+ Doctor.only(:_id)
2888
+ end
2889
+
2890
+ it "adds custom discriminator key to the fields" do
2891
+ expect(criteria.options[:fields]).to include("dkey")
2892
+ end
2893
+
2894
+ it "does not add _type to the fields" do
2895
+ expect(criteria.options[:fields]).to_not include("_type")
2896
+ end
2814
2897
  end
2815
2898
  end
2816
2899
 
@@ -3386,34 +3469,75 @@ describe Mongoid::Criteria do
3386
3469
  end
3387
3470
 
3388
3471
  describe "#type" do
3472
+ context "when using the default discriminator_key" do
3473
+ context "when the type is a string" do
3389
3474
 
3390
- context "when the type is a string" do
3475
+ let!(:browser) do
3476
+ Browser.create
3477
+ end
3391
3478
 
3392
- let!(:browser) do
3393
- Browser.create
3394
- end
3479
+ let(:criteria) do
3480
+ Canvas.all.type("Browser")
3481
+ end
3395
3482
 
3396
- let(:criteria) do
3397
- Canvas.all.type("Browser")
3483
+ it "returns documents with the provided type" do
3484
+ expect(criteria).to eq([ browser ])
3485
+ end
3398
3486
  end
3399
3487
 
3400
- it "returns documents with the provided type" do
3401
- expect(criteria).to eq([ browser ])
3488
+ context "when the type is an Array of type" do
3489
+
3490
+ let!(:browser) do
3491
+ Firefox.create
3492
+ end
3493
+
3494
+ let(:criteria) do
3495
+ Canvas.all.type([ "Browser", "Firefox" ])
3496
+ end
3497
+
3498
+ it "returns documents with the provided types" do
3499
+ expect(criteria).to eq([ browser ])
3500
+ end
3402
3501
  end
3403
3502
  end
3404
3503
 
3405
- context "when the type is an Array of type" do
3504
+ context "when using a custom discriminator_key" do
3505
+ before do
3506
+ Canvas.discriminator_key = "dkey"
3507
+ end
3406
3508
 
3407
- let!(:browser) do
3408
- Firefox.create
3509
+ after do
3510
+ Canvas.discriminator_key = nil
3409
3511
  end
3410
3512
 
3411
- let(:criteria) do
3412
- Canvas.all.type([ "Browser", "Firefox" ])
3513
+ context "when the type is a string" do
3514
+
3515
+ let!(:browser) do
3516
+ Browser.create
3517
+ end
3518
+
3519
+ let(:criteria) do
3520
+ Canvas.all.type("Browser")
3521
+ end
3522
+
3523
+ it "returns documents with the provided type" do
3524
+ expect(criteria).to eq([ browser ])
3525
+ end
3413
3526
  end
3414
3527
 
3415
- it "returns documents with the provided types" do
3416
- expect(criteria).to eq([ browser ])
3528
+ context "when the type is an Array of type" do
3529
+
3530
+ let!(:browser) do
3531
+ Firefox.create
3532
+ end
3533
+
3534
+ let(:criteria) do
3535
+ Canvas.all.type([ "Browser", "Firefox" ])
3536
+ end
3537
+
3538
+ it "returns documents with the provided types" do
3539
+ expect(criteria).to eq([ browser ])
3540
+ end
3417
3541
  end
3418
3542
  end
3419
3543
  end
@@ -3428,6 +3552,38 @@ describe Mongoid::Criteria do
3428
3552
  Band.create(name: "Tool")
3429
3553
  end
3430
3554
 
3555
+ context 'when provided no arguments' do
3556
+ context 'on a model class' do
3557
+ it 'returns an empty criteria' do
3558
+ Band.where.selector.should == {}
3559
+ end
3560
+ end
3561
+
3562
+ context 'on an association' do
3563
+ it 'returns an empty criteria' do
3564
+ match.records.where.selector.should == {}
3565
+ end
3566
+ end
3567
+ end
3568
+
3569
+ context 'when provided multiple arguments' do
3570
+ context 'on a model class' do
3571
+ it 'raises ArgumentError' do
3572
+ lambda do
3573
+ Band.where({foo: 1}, {bar: 2})
3574
+ end.should raise_error(ArgumentError, /where requires zero or one arguments/)
3575
+ end
3576
+ end
3577
+
3578
+ context 'on an association' do
3579
+ it 'raises ArgumentError' do
3580
+ lambda do
3581
+ match.records.where({foo: 1}, {bar: 2})
3582
+ end.should raise_error(ArgumentError, /where requires zero or one arguments/)
3583
+ end
3584
+ end
3585
+ end
3586
+
3431
3587
  context "when provided a string" do
3432
3588
 
3433
3589
  context "when the criteria is embedded" do
@@ -3502,7 +3658,8 @@ describe Mongoid::Criteria do
3502
3658
  end
3503
3659
  end
3504
3660
 
3505
- context "when querying on a BSON::Decimal128", if: decimal128_supported? do
3661
+ context "when querying on a BSON::Decimal128" do
3662
+ min_server_version '3.4'
3506
3663
 
3507
3664
  let(:decimal) do
3508
3665
  BSON::Decimal128.new("0.0005")
@@ -3590,6 +3747,7 @@ describe Mongoid::Criteria do
3590
3747
  end
3591
3748
 
3592
3749
  context "when the code has scope" do
3750
+ max_server_version '4.2'
3593
3751
 
3594
3752
  let(:criteria) do
3595
3753
  Band.for_js("this.name == param", param: "Depeche Mode")
@@ -3701,7 +3859,7 @@ describe Mongoid::Criteria do
3701
3859
  end
3702
3860
  end
3703
3861
 
3704
- describe "#geo_spacial" do
3862
+ describe "#geo_spatial" do
3705
3863
 
3706
3864
  context "when checking within a polygon" do
3707
3865
 
@@ -3714,7 +3872,7 @@ describe Mongoid::Criteria do
3714
3872
  end
3715
3873
 
3716
3874
  let(:criteria) do
3717
- Bar.geo_spacial(
3875
+ Bar.geo_spatial(
3718
3876
  :location.within_polygon => [[[ 50, 10 ], [ 50, 20 ], [ 60, 20 ], [ 60, 10 ], [ 50, 10 ]]]
3719
3877
  )
3720
3878
  end
@@ -3798,34 +3956,75 @@ describe Mongoid::Criteria do
3798
3956
  end
3799
3957
 
3800
3958
  describe "#type_selection" do
3959
+ context "when using the default discriminator_key" do
3960
+ context "when only one subclass exists" do
3801
3961
 
3802
- context "when only one subclass exists" do
3962
+ let(:criteria) do
3963
+ described_class.new(Firefox)
3964
+ end
3803
3965
 
3804
- let(:criteria) do
3805
- described_class.new(Firefox)
3806
- end
3966
+ let(:selection) do
3967
+ criteria.send(:type_selection)
3968
+ end
3807
3969
 
3808
- let(:selection) do
3809
- criteria.send(:type_selection)
3970
+ it "does not use an $in query" do
3971
+ expect(selection).to eq({ _type: "Firefox" })
3972
+ end
3810
3973
  end
3811
3974
 
3812
- it "does not use an $in query" do
3813
- expect(selection).to eq({ _type: "Firefox" })
3975
+ context "when more than one subclass exists" do
3976
+
3977
+ let(:criteria) do
3978
+ described_class.new(Browser)
3979
+ end
3980
+
3981
+ let(:selection) do
3982
+ criteria.send(:type_selection)
3983
+ end
3984
+
3985
+ it "does not use an $in query" do
3986
+ expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
3987
+ end
3814
3988
  end
3815
3989
  end
3816
3990
 
3817
- context "when more than one subclass exists" do
3991
+ context "when using a custom discriminator_key" do
3992
+ before do
3993
+ Canvas.discriminator_key = "dkey"
3994
+ end
3818
3995
 
3819
- let(:criteria) do
3820
- described_class.new(Browser)
3996
+ after do
3997
+ Canvas.discriminator_key = nil
3821
3998
  end
3822
3999
 
3823
- let(:selection) do
3824
- criteria.send(:type_selection)
4000
+ context "when only one subclass exists" do
4001
+
4002
+ let(:criteria) do
4003
+ described_class.new(Firefox)
4004
+ end
4005
+
4006
+ let(:selection) do
4007
+ criteria.send(:type_selection)
4008
+ end
4009
+
4010
+ it "does not use an $in query" do
4011
+ expect(selection).to eq({ dkey: "Firefox" })
4012
+ end
3825
4013
  end
3826
4014
 
3827
- it "does not use an $in query" do
3828
- expect(selection).to eq({ _type: { "$in" => [ "Firefox", "Browser" ]}})
4015
+ context "when more than one subclass exists" do
4016
+
4017
+ let(:criteria) do
4018
+ described_class.new(Browser)
4019
+ end
4020
+
4021
+ let(:selection) do
4022
+ criteria.send(:type_selection)
4023
+ end
4024
+
4025
+ it "does not use an $in query" do
4026
+ expect(selection).to eq({ dkey: { "$in" => [ "Firefox", "Browser" ]}})
4027
+ end
3829
4028
  end
3830
4029
  end
3831
4030
  end