mongoid 7.1.11 → 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 (485) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +10 -3
  4. data/Rakefile +11 -30
  5. data/lib/config/locales/en.yml +37 -14
  6. data/lib/mongoid/association/depending.rb +1 -6
  7. data/lib/mongoid/association/embedded/embeds_many/proxy.rb +1 -1
  8. data/lib/mongoid/association/many.rb +3 -3
  9. data/lib/mongoid/association/proxy.rb +1 -1
  10. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  11. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  12. data/lib/mongoid/association/referenced/has_many/enumerable.rb +37 -2
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +9 -2
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +1 -6
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/attributes.rb +1 -8
  19. data/lib/mongoid/clients/factory.rb +17 -0
  20. data/lib/mongoid/composable.rb +1 -0
  21. data/lib/mongoid/config/environment.rb +1 -9
  22. data/lib/mongoid/config.rb +3 -0
  23. data/lib/mongoid/contextual/atomic.rb +2 -7
  24. data/lib/mongoid/contextual/mongo.rb +23 -4
  25. data/lib/mongoid/contextual/none.rb +0 -3
  26. data/lib/mongoid/copyable.rb +2 -2
  27. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  28. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  29. data/lib/mongoid/criteria/queryable/selectable.rb +23 -8
  30. data/lib/mongoid/criteria/queryable/selector.rb +7 -3
  31. data/lib/mongoid/criteria/queryable/storable.rb +7 -7
  32. data/lib/mongoid/criteria.rb +58 -8
  33. data/lib/mongoid/document.rb +19 -9
  34. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  35. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  37. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  38. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  39. data/lib/mongoid/errors/invalid_query.rb +41 -0
  40. data/lib/mongoid/errors/mongoid_error.rb +1 -1
  41. data/lib/mongoid/errors.rb +7 -2
  42. data/lib/mongoid/factory.rb +27 -10
  43. data/lib/mongoid/fields/validators/macro.rb +22 -9
  44. data/lib/mongoid/findable.rb +50 -14
  45. data/lib/mongoid/indexable.rb +2 -2
  46. data/lib/mongoid/interceptable.rb +2 -4
  47. data/lib/mongoid/matchable.rb +1 -149
  48. data/lib/mongoid/matcher/all.rb +22 -0
  49. data/lib/mongoid/matcher/and.rb +21 -0
  50. data/lib/mongoid/matcher/elem_match.rb +35 -0
  51. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  52. data/lib/mongoid/matcher/eq.rb +11 -0
  53. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  54. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  55. data/lib/mongoid/matcher/exists.rb +15 -0
  56. data/lib/mongoid/matcher/expression.rb +40 -0
  57. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  58. data/lib/mongoid/matcher/field_expression.rb +63 -0
  59. data/lib/mongoid/matcher/field_operator.rb +52 -0
  60. data/lib/mongoid/matcher/gt.rb +17 -0
  61. data/lib/mongoid/matcher/gte.rb +17 -0
  62. data/lib/mongoid/matcher/in.rb +25 -0
  63. data/lib/mongoid/matcher/lt.rb +17 -0
  64. data/lib/mongoid/matcher/lte.rb +17 -0
  65. data/lib/mongoid/matcher/ne.rb +16 -0
  66. data/lib/mongoid/matcher/nin.rb +11 -0
  67. data/lib/mongoid/matcher/nor.rb +25 -0
  68. data/lib/mongoid/matcher/not.rb +29 -0
  69. data/lib/mongoid/matcher/or.rb +21 -0
  70. data/lib/mongoid/matcher/regex.rb +41 -0
  71. data/lib/mongoid/matcher/size.rb +26 -0
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/persistable/deletable.rb +1 -1
  74. data/lib/mongoid/persistence_context.rb +1 -3
  75. data/lib/mongoid/query_cache.rb +64 -62
  76. data/lib/mongoid/reloadable.rb +2 -7
  77. data/lib/mongoid/serializable.rb +1 -1
  78. data/lib/mongoid/tasks/database.rb +1 -1
  79. data/lib/mongoid/traversable.rb +111 -4
  80. data/lib/mongoid/validatable/associated.rb +1 -1
  81. data/lib/mongoid/validatable/presence.rb +3 -3
  82. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  83. data/lib/mongoid/version.rb +1 -1
  84. data/lib/mongoid.rb +23 -1
  85. data/lib/rails/generators/mongoid/config/config_generator.rb +1 -8
  86. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +1 -1
  87. data/spec/integration/app_spec.rb +88 -178
  88. data/spec/integration/associations/embedded_spec.rb +94 -0
  89. data/spec/integration/associations/has_many_spec.rb +39 -46
  90. data/spec/integration/associations/has_one_spec.rb +39 -46
  91. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  92. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  93. data/spec/integration/discriminator_key_spec.rb +354 -0
  94. data/spec/integration/discriminator_value_spec.rb +207 -0
  95. data/spec/integration/document_spec.rb +0 -21
  96. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  97. data/spec/integration/matcher_operator_data/all.yml +140 -0
  98. data/spec/integration/matcher_operator_data/and.yml +93 -0
  99. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  100. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  101. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  102. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  103. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  104. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  105. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  106. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  107. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  108. data/spec/integration/matcher_operator_data/in.yml +194 -0
  109. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  110. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  111. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  112. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  113. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  114. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  115. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  116. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  117. data/spec/integration/matcher_operator_data/not.yml +196 -0
  118. data/spec/integration/matcher_operator_data/or.yml +137 -0
  119. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  120. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  121. data/spec/integration/matcher_operator_data/size.yml +174 -0
  122. data/spec/integration/matcher_operator_spec.rb +100 -0
  123. data/spec/integration/matcher_spec.rb +189 -0
  124. data/spec/integration/server_query_spec.rb +142 -0
  125. data/spec/lite_spec_helper.rb +7 -7
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +0 -50
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -17
  129. data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
  130. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  131. data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +0 -17
  132. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +460 -186
  133. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  134. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +0 -41
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/attributes_spec.rb +0 -241
  140. data/spec/mongoid/clients/factory_spec.rb +35 -9
  141. data/spec/mongoid/clients/options_spec.rb +3 -11
  142. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  143. data/spec/mongoid/config/environment_spec.rb +8 -86
  144. data/spec/mongoid/config_spec.rb +28 -0
  145. data/spec/mongoid/contextual/atomic_spec.rb +29 -81
  146. data/spec/mongoid/contextual/geo_near_spec.rb +1 -1
  147. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  148. data/spec/mongoid/copyable_spec.rb +153 -1
  149. data/spec/mongoid/copyable_spec_models.rb +14 -0
  150. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +0 -36
  151. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  152. data/spec/mongoid/criteria_spec.rb +204 -43
  153. data/spec/mongoid/document_query_spec.rb +0 -51
  154. data/spec/mongoid/document_spec.rb +90 -36
  155. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  156. data/spec/mongoid/errors/mongoid_error_spec.rb +8 -20
  157. data/spec/mongoid/factory_spec.rb +261 -28
  158. data/spec/mongoid/fields_spec.rb +48 -2
  159. data/spec/mongoid/findable_spec.rb +32 -0
  160. data/spec/mongoid/indexable_spec.rb +28 -2
  161. data/spec/mongoid/inspectable_spec.rb +29 -2
  162. data/spec/mongoid/interceptable_spec.rb +2 -2
  163. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  164. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  165. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  166. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  167. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  168. data/spec/mongoid/persistable/settable_spec.rb +0 -30
  169. data/spec/mongoid/persistable/updatable_spec.rb +0 -2
  170. data/spec/mongoid/persistable_spec.rb +2 -2
  171. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  172. data/spec/mongoid/query_cache_spec.rb +442 -41
  173. data/spec/mongoid/reloadable_spec.rb +72 -0
  174. data/spec/mongoid/serializable_spec.rb +21 -3
  175. data/spec/mongoid/traversable_spec.rb +1100 -0
  176. data/spec/spec_helper.rb +3 -5
  177. data/spec/support/child_process_helper.rb +79 -0
  178. data/spec/support/constraints.rb +250 -0
  179. data/spec/support/helpers.rb +1 -1
  180. data/spec/support/lite_constraints.rb +22 -0
  181. data/spec/{app → support}/models/account.rb +0 -0
  182. data/spec/{app → support}/models/acolyte.rb +0 -0
  183. data/spec/{app → support}/models/actor.rb +1 -1
  184. data/spec/{app → support}/models/actress.rb +0 -0
  185. data/spec/{app → support}/models/address.rb +0 -4
  186. data/spec/{app → support}/models/address_component.rb +0 -0
  187. data/spec/{app → support}/models/address_number.rb +0 -0
  188. data/spec/{app → support}/models/agency.rb +0 -0
  189. data/spec/{app → support}/models/agent.rb +0 -0
  190. data/spec/{app → support}/models/album.rb +0 -0
  191. data/spec/{app → support}/models/alert.rb +0 -0
  192. data/spec/{app → support}/models/animal.rb +0 -0
  193. data/spec/{app → support}/models/answer.rb +0 -0
  194. data/spec/{app → support}/models/appointment.rb +0 -0
  195. data/spec/support/models/armrest.rb +10 -0
  196. data/spec/{app → support}/models/array_field.rb +0 -0
  197. data/spec/{app → support}/models/article.rb +0 -0
  198. data/spec/{app → support}/models/artist.rb +0 -0
  199. data/spec/{app → support}/models/artwork.rb +0 -0
  200. data/spec/{app → support}/models/audio.rb +0 -0
  201. data/spec/{app → support}/models/augmentation.rb +0 -0
  202. data/spec/{app → support}/models/author.rb +0 -0
  203. data/spec/{app → support}/models/baby.rb +0 -0
  204. data/spec/{app → support}/models/band.rb +0 -0
  205. data/spec/{app → support}/models/bar.rb +0 -0
  206. data/spec/{app → support}/models/basic.rb +0 -0
  207. data/spec/{app → support}/models/bed.rb +0 -0
  208. data/spec/{app → support}/models/big_palette.rb +0 -0
  209. data/spec/{app → support}/models/birthday.rb +0 -0
  210. data/spec/{app → support}/models/bomb.rb +0 -0
  211. data/spec/{app → support}/models/book.rb +0 -0
  212. data/spec/{app → support}/models/breed.rb +0 -0
  213. data/spec/{app → support}/models/browser.rb +1 -1
  214. data/spec/{app → support}/models/building.rb +0 -0
  215. data/spec/{app → support}/models/building_address.rb +0 -0
  216. data/spec/{app → support}/models/bus.rb +0 -0
  217. data/spec/{app → support}/models/business.rb +0 -0
  218. data/spec/{app → support}/models/callback_test.rb +0 -0
  219. data/spec/{app → support}/models/canvas.rb +1 -1
  220. data/spec/{app → support}/models/car.rb +0 -0
  221. data/spec/{app → support}/models/cat.rb +0 -0
  222. data/spec/{app → support}/models/category.rb +0 -0
  223. data/spec/{app → support}/models/child.rb +0 -0
  224. data/spec/{app → support}/models/child_doc.rb +0 -0
  225. data/spec/{app → support}/models/church.rb +0 -0
  226. data/spec/{app → support}/models/circle.rb +0 -0
  227. data/spec/{app → support}/models/circuit.rb +0 -0
  228. data/spec/{app → support}/models/circus.rb +0 -0
  229. data/spec/{app → support}/models/code.rb +0 -0
  230. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  231. data/spec/{app → support}/models/coding.rb +1 -1
  232. data/spec/{app → support}/models/comment.rb +0 -0
  233. data/spec/{app → support}/models/company.rb +0 -0
  234. data/spec/{app → support}/models/consumption_period.rb +0 -0
  235. data/spec/{app → support}/models/contextable_item.rb +0 -0
  236. data/spec/{app → support}/models/contractor.rb +0 -0
  237. data/spec/{app → support}/models/cookie.rb +0 -0
  238. data/spec/{app → support}/models/country_code.rb +0 -0
  239. data/spec/{app → support}/models/courier_job.rb +0 -0
  240. data/spec/support/models/crate.rb +13 -0
  241. data/spec/support/models/deed.rb +8 -0
  242. data/spec/{app → support}/models/definition.rb +0 -0
  243. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  244. data/spec/{app → support}/models/description.rb +0 -0
  245. data/spec/{app → support}/models/dictionary.rb +0 -6
  246. data/spec/{app → support}/models/division.rb +0 -0
  247. data/spec/{app → support}/models/doctor.rb +0 -0
  248. data/spec/{app → support}/models/dog.rb +0 -0
  249. data/spec/{app → support}/models/dokument.rb +0 -0
  250. data/spec/{app → support}/models/draft.rb +0 -0
  251. data/spec/{app → support}/models/dragon.rb +0 -0
  252. data/spec/{app → support}/models/driver.rb +1 -1
  253. data/spec/{app → support}/models/drug.rb +0 -0
  254. data/spec/{app → support}/models/dungeon.rb +0 -0
  255. data/spec/{app → support}/models/edit.rb +0 -0
  256. data/spec/{app → support}/models/email.rb +0 -0
  257. data/spec/{app → support}/models/employer.rb +0 -0
  258. data/spec/{app → support}/models/entry.rb +0 -0
  259. data/spec/{app → support}/models/eraser.rb +0 -0
  260. data/spec/{app → support}/models/even.rb +0 -0
  261. data/spec/{app → support}/models/event.rb +0 -0
  262. data/spec/{app → support}/models/exhibition.rb +0 -0
  263. data/spec/{app → support}/models/exhibitor.rb +0 -0
  264. data/spec/{app → support}/models/explosion.rb +0 -0
  265. data/spec/{app → support}/models/eye.rb +0 -0
  266. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  267. data/spec/{app → support}/models/face.rb +0 -0
  268. data/spec/{app → support}/models/favorite.rb +0 -0
  269. data/spec/{app → support}/models/filesystem.rb +0 -0
  270. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  271. data/spec/{app → support}/models/firefox.rb +0 -0
  272. data/spec/{app → support}/models/fish.rb +0 -0
  273. data/spec/{app → support}/models/folder.rb +0 -0
  274. data/spec/{app → support}/models/folder_item.rb +0 -0
  275. data/spec/{app → support}/models/fruits.rb +0 -0
  276. data/spec/{app → support}/models/game.rb +0 -0
  277. data/spec/{app → support}/models/ghost.rb +0 -0
  278. data/spec/support/models/guitar.rb +5 -0
  279. data/spec/{app → support}/models/home.rb +0 -0
  280. data/spec/{app → support}/models/house.rb +0 -0
  281. data/spec/{app → support}/models/html_writer.rb +0 -0
  282. data/spec/{app → support}/models/id_key.rb +0 -0
  283. data/spec/support/models/idnodef.rb +8 -0
  284. data/spec/{app → support}/models/image.rb +0 -0
  285. data/spec/{app → support}/models/implant.rb +0 -0
  286. data/spec/support/models/instrument.rb +9 -0
  287. data/spec/{app → support}/models/item.rb +1 -1
  288. data/spec/{app → support}/models/jar.rb +0 -0
  289. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  290. data/spec/{app → support}/models/kangaroo.rb +0 -0
  291. data/spec/{app → support}/models/label.rb +0 -0
  292. data/spec/{app → support}/models/language.rb +0 -0
  293. data/spec/{app → support}/models/lat_lng.rb +0 -0
  294. data/spec/{app → support}/models/league.rb +0 -0
  295. data/spec/{app → support}/models/learner.rb +0 -0
  296. data/spec/{app → support}/models/line_item.rb +0 -0
  297. data/spec/{app → support}/models/location.rb +0 -0
  298. data/spec/{app → support}/models/login.rb +0 -0
  299. data/spec/{app → support}/models/manufacturer.rb +0 -0
  300. data/spec/{app → support}/models/meat.rb +0 -0
  301. data/spec/{app → support}/models/membership.rb +0 -0
  302. data/spec/{app → support}/models/message.rb +0 -0
  303. data/spec/{app → support}/models/minim.rb +0 -0
  304. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  305. data/spec/{app → support}/models/mop.rb +0 -10
  306. data/spec/{app → support}/models/movie.rb +0 -0
  307. data/spec/{app → support}/models/my_hash.rb +0 -0
  308. data/spec/{app → support}/models/name.rb +0 -0
  309. data/spec/{app → support}/models/name_only.rb +0 -0
  310. data/spec/{app → support}/models/node.rb +0 -0
  311. data/spec/{app → support}/models/note.rb +0 -0
  312. data/spec/{app → support}/models/odd.rb +0 -0
  313. data/spec/{app → support}/models/ordered_post.rb +0 -0
  314. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  315. data/spec/{app → support}/models/oscar.rb +0 -0
  316. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  317. data/spec/{app → support}/models/override.rb +0 -0
  318. data/spec/{app → support}/models/ownable.rb +0 -0
  319. data/spec/{app → support}/models/owner.rb +2 -0
  320. data/spec/{app → support}/models/pack.rb +0 -0
  321. data/spec/{app → support}/models/page.rb +0 -0
  322. data/spec/{app → support}/models/page_question.rb +0 -0
  323. data/spec/{app → support}/models/palette.rb +1 -1
  324. data/spec/{app → support}/models/parent.rb +0 -0
  325. data/spec/{app → support}/models/parent_doc.rb +0 -0
  326. data/spec/{app → support}/models/passport.rb +0 -0
  327. data/spec/{app → support}/models/patient.rb +0 -0
  328. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  329. data/spec/{app → support}/models/pencil.rb +0 -0
  330. data/spec/{app → support}/models/person.rb +1 -12
  331. data/spec/{app → support}/models/pet.rb +0 -0
  332. data/spec/{app → support}/models/pet_owner.rb +0 -0
  333. data/spec/{app → support}/models/phone.rb +0 -0
  334. data/spec/support/models/piano.rb +5 -0
  335. data/spec/{app → support}/models/pizza.rb +0 -0
  336. data/spec/{app → support}/models/player.rb +0 -0
  337. data/spec/{app → support}/models/post.rb +0 -0
  338. data/spec/{app → support}/models/post_genre.rb +0 -0
  339. data/spec/{app → support}/models/powerup.rb +0 -0
  340. data/spec/{app → support}/models/preference.rb +0 -0
  341. data/spec/{app → support}/models/princess.rb +0 -0
  342. data/spec/{app → support}/models/product.rb +0 -0
  343. data/spec/support/models/profile.rb +18 -0
  344. data/spec/{app → support}/models/pronunciation.rb +0 -0
  345. data/spec/{app → support}/models/pub.rb +0 -0
  346. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  347. data/spec/{app → support}/models/publication/review.rb +0 -0
  348. data/spec/support/models/publication.rb +5 -0
  349. data/spec/{app → support}/models/purchase.rb +0 -0
  350. data/spec/{app → support}/models/question.rb +0 -0
  351. data/spec/{app → support}/models/quiz.rb +0 -0
  352. data/spec/{app → support}/models/rating.rb +0 -0
  353. data/spec/{app → support}/models/record.rb +0 -0
  354. data/spec/{app → support}/models/registry.rb +0 -0
  355. data/spec/{app → support}/models/role.rb +0 -0
  356. data/spec/{app → support}/models/root_category.rb +0 -0
  357. data/spec/{app → support}/models/sandwich.rb +0 -0
  358. data/spec/{app → support}/models/scheduler.rb +0 -0
  359. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  360. data/spec/support/models/seat.rb +25 -0
  361. data/spec/{app → support}/models/seo.rb +0 -0
  362. data/spec/{app → support}/models/series.rb +0 -1
  363. data/spec/{app → support}/models/server.rb +0 -0
  364. data/spec/{app → support}/models/service.rb +0 -0
  365. data/spec/{app → support}/models/shape.rb +2 -2
  366. data/spec/{app → support}/models/shelf.rb +0 -0
  367. data/spec/{app → support}/models/shipment_address.rb +0 -0
  368. data/spec/{app → support}/models/shipping_container.rb +0 -0
  369. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  370. data/spec/{app → support}/models/shop.rb +0 -0
  371. data/spec/{app → support}/models/short_agent.rb +0 -0
  372. data/spec/{app → support}/models/short_quiz.rb +0 -0
  373. data/spec/{app → support}/models/simple.rb +0 -0
  374. data/spec/{app → support}/models/slave.rb +0 -0
  375. data/spec/{app → support}/models/song.rb +0 -0
  376. data/spec/{app → support}/models/sound.rb +0 -0
  377. data/spec/{app → support}/models/square.rb +0 -0
  378. data/spec/{app → support}/models/staff.rb +0 -0
  379. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  380. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  381. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  382. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  383. data/spec/{app → support}/models/strategy.rb +0 -0
  384. data/spec/{app → support}/models/sub_item.rb +0 -0
  385. data/spec/{app → support}/models/subscription.rb +0 -0
  386. data/spec/{app → support}/models/survey.rb +0 -0
  387. data/spec/{app → support}/models/symptom.rb +0 -0
  388. data/spec/support/models/system_role.rb +7 -0
  389. data/spec/{app → support}/models/tag.rb +0 -0
  390. data/spec/{app → support}/models/target.rb +0 -0
  391. data/spec/{app → support}/models/template.rb +0 -0
  392. data/spec/{app → support}/models/thing.rb +0 -0
  393. data/spec/{app → support}/models/title.rb +0 -0
  394. data/spec/{app → support}/models/tool.rb +2 -2
  395. data/spec/{app → support}/models/topping.rb +0 -0
  396. data/spec/support/models/toy.rb +10 -0
  397. data/spec/{app → support}/models/track.rb +0 -0
  398. data/spec/{app → support}/models/translation.rb +0 -0
  399. data/spec/{app → support}/models/tree.rb +0 -0
  400. data/spec/{app → support}/models/truck.rb +2 -0
  401. data/spec/{app → support}/models/updatable.rb +0 -0
  402. data/spec/{app → support}/models/user.rb +0 -0
  403. data/spec/{app → support}/models/user_account.rb +0 -0
  404. data/spec/{app → support}/models/validation_callback.rb +0 -0
  405. data/spec/{app → support}/models/vehicle.rb +7 -2
  406. data/spec/{app → support}/models/version.rb +0 -0
  407. data/spec/{app → support}/models/vertex.rb +0 -0
  408. data/spec/{app → support}/models/vet_visit.rb +0 -0
  409. data/spec/{app → support}/models/video.rb +0 -0
  410. data/spec/{app → support}/models/video_game.rb +0 -0
  411. data/spec/{app → support}/models/weapon.rb +0 -0
  412. data/spec/{app → support}/models/wiki_page.rb +0 -1
  413. data/spec/{app → support}/models/word.rb +0 -0
  414. data/spec/{app → support}/models/word_origin.rb +0 -0
  415. data/spec/{app → support}/models/writer.rb +2 -2
  416. data/spec/support/spec_config.rb +1 -9
  417. data/spec/support/spec_organizer.rb +130 -0
  418. data.tar.gz.sig +0 -0
  419. metadata +847 -844
  420. metadata.gz.sig +0 -0
  421. data/lib/mongoid/errors/empty_config_file.rb +0 -26
  422. data/lib/mongoid/errors/invalid_config_file.rb +0 -26
  423. data/lib/mongoid/matchable/all.rb +0 -30
  424. data/lib/mongoid/matchable/and.rb +0 -32
  425. data/lib/mongoid/matchable/default.rb +0 -121
  426. data/lib/mongoid/matchable/elem_match.rb +0 -36
  427. data/lib/mongoid/matchable/eq.rb +0 -23
  428. data/lib/mongoid/matchable/exists.rb +0 -25
  429. data/lib/mongoid/matchable/gt.rb +0 -25
  430. data/lib/mongoid/matchable/gte.rb +0 -25
  431. data/lib/mongoid/matchable/in.rb +0 -26
  432. data/lib/mongoid/matchable/lt.rb +0 -25
  433. data/lib/mongoid/matchable/lte.rb +0 -25
  434. data/lib/mongoid/matchable/ne.rb +0 -23
  435. data/lib/mongoid/matchable/nin.rb +0 -24
  436. data/lib/mongoid/matchable/nor.rb +0 -38
  437. data/lib/mongoid/matchable/or.rb +0 -35
  438. data/lib/mongoid/matchable/regexp.rb +0 -30
  439. data/lib/mongoid/matchable/size.rb +0 -23
  440. data/spec/app/models/customer.rb +0 -11
  441. data/spec/app/models/customer_address.rb +0 -12
  442. data/spec/app/models/publication.rb +0 -5
  443. data/spec/integration/associations/embeds_many_spec.rb +0 -24
  444. data/spec/integration/associations/embeds_one_spec.rb +0 -24
  445. data/spec/integration/callbacks_models.rb +0 -49
  446. data/spec/integration/callbacks_spec.rb +0 -216
  447. data/spec/integration/contextual/empty_spec.rb +0 -142
  448. data/spec/mongoid/errors/invalid_config_file_spec.rb +0 -32
  449. data/spec/mongoid/matchable/all_spec.rb +0 -34
  450. data/spec/mongoid/matchable/and_spec.rb +0 -190
  451. data/spec/mongoid/matchable/default_spec.rb +0 -140
  452. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  453. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  454. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  455. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  456. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  457. data/spec/mongoid/matchable/in_spec.rb +0 -52
  458. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  459. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  460. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  461. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  462. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  463. data/spec/mongoid/matchable/or_spec.rb +0 -134
  464. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  465. data/spec/mongoid/matchable/size_spec.rb +0 -28
  466. data/spec/mongoid/matchable_spec.rb +0 -856
  467. data/spec/shared/LICENSE +0 -20
  468. data/spec/shared/bin/get-mongodb-download-url +0 -17
  469. data/spec/shared/bin/s3-copy +0 -45
  470. data/spec/shared/bin/s3-upload +0 -69
  471. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  472. data/spec/shared/lib/mrss/cluster_config.rb +0 -226
  473. data/spec/shared/lib/mrss/constraints.rb +0 -385
  474. data/spec/shared/lib/mrss/docker_runner.rb +0 -271
  475. data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
  476. data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
  477. data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
  478. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  479. data/spec/shared/lib/mrss/utils.rb +0 -15
  480. data/spec/shared/share/Dockerfile.erb +0 -323
  481. data/spec/shared/share/haproxy-1.conf +0 -16
  482. data/spec/shared/share/haproxy-2.conf +0 -17
  483. data/spec/shared/shlib/distro.sh +0 -73
  484. data/spec/shared/shlib/server.sh +0 -367
  485. data/spec/shared/shlib/set_env.sh +0 -131
@@ -191,6 +191,32 @@ describe Mongoid::Indexable do
191
191
  expect(spec.options).to eq(unique: false, background: true)
192
192
  end
193
193
  end
194
+
195
+ context "when using a custom discriminator_key" do
196
+ context "when indexes have not been added" do
197
+ let(:klass) do
198
+ Class.new do
199
+ include Mongoid::Document
200
+ self.discriminator_key = "dkey"
201
+ def self.hereditary?
202
+ true
203
+ end
204
+ end
205
+ end
206
+
207
+ before do
208
+ klass.add_indexes
209
+ end
210
+
211
+ let(:spec) do
212
+ klass.index_specification(dkey: 1)
213
+ end
214
+
215
+ it "adds the _type index" do
216
+ expect(spec.options).to eq(unique: false, background: true)
217
+ end
218
+ end
219
+ end
194
220
  end
195
221
 
196
222
  describe ".index" do
@@ -383,7 +409,7 @@ describe Mongoid::Indexable do
383
409
  end
384
410
  end
385
411
 
386
- context "when providing a geospacial index" do
412
+ context "when providing a geospatial index" do
387
413
 
388
414
  before do
389
415
  klass.index({ location: "2d" }, { min: -200, max: 200, bits: 32 })
@@ -393,7 +419,7 @@ describe Mongoid::Indexable do
393
419
  klass.index_specification(location: "2d").options
394
420
  end
395
421
 
396
- it "sets the geospacial index" do
422
+ it "sets the geospatial index" do
397
423
  expect(options).to eq({ min: -200, max: 200, bits: 32 })
398
424
  end
399
425
  end
@@ -26,12 +26,39 @@ describe Mongoid::Inspectable do
26
26
  end
27
27
 
28
28
  it "displays defined fields" do
29
- expect(inspected).to include("title: \"CEO\"")
29
+ expect(inspected).to include(%q,title: "CEO",)
30
30
  end
31
31
 
32
32
  it "displays field aliases" do
33
33
  expect(inspected).to include("t(test):")
34
34
  end
35
+
36
+ it "displays the default discriminator key" do
37
+ expect(inspected).to include(%q,_type: "Person",)
38
+ end
39
+ end
40
+
41
+ context "when using a custom discriminator key" do
42
+
43
+ before do
44
+ Person.discriminator_key = "dkey"
45
+ end
46
+
47
+ after do
48
+ Person.discriminator_key = nil
49
+ end
50
+
51
+ let(:person) do
52
+ Person.new(title: "CEO")
53
+ end
54
+
55
+ let(:inspected) do
56
+ person.inspect
57
+ end
58
+
59
+ it "displays the new discriminator key" do
60
+ expect(inspected).to include(%q,dkey: "Person",)
61
+ end
35
62
  end
36
63
 
37
64
  context "when allowing dynamic fields" do
@@ -45,7 +72,7 @@ describe Mongoid::Inspectable do
45
72
  end
46
73
 
47
74
  it "includes dynamic attributes" do
48
- expect(inspected).to include("some_attribute: \"foo\"")
75
+ expect(inspected).to include(%q,some_attribute: "foo",)
49
76
  end
50
77
  end
51
78
  end
@@ -1707,8 +1707,8 @@ describe Mongoid::Interceptable do
1707
1707
  context "when loading a model multiple times" do
1708
1708
 
1709
1709
  before do
1710
- load "spec/app/models/callback_test.rb"
1711
- load "spec/app/models/callback_test.rb"
1710
+ load File.join(MODELS, "callback_test.rb")
1711
+ load File.join(MODELS, "callback_test.rb")
1712
1712
  end
1713
1713
 
1714
1714
  let(:callback) do
@@ -0,0 +1,259 @@
1
+ - name: scalar retrieval
2
+ document:
3
+ name: foo
4
+ key: name
5
+
6
+ exists: true
7
+ value: foo
8
+ expanded: false
9
+
10
+ - name: scalar leaf
11
+ document: &foo-bar-foo-bar-2
12
+ foo:
13
+ bar:
14
+ foo:
15
+ bar:
16
+ 2
17
+ key: foo.bar.foo.bar
18
+
19
+ exists: true
20
+ value: 2
21
+ expanded: false
22
+
23
+ - name: scalar non-leaf
24
+ document: *foo-bar-foo-bar-2
25
+ key: foo.bar
26
+
27
+ exists: true
28
+ value:
29
+ foo:
30
+ bar:
31
+ 2
32
+ expanded: false
33
+
34
+ - name: array leaf
35
+ document: &foo-bar-foo-bar-array-2
36
+ foo:
37
+ bar:
38
+ foo:
39
+ bar:
40
+ - 2
41
+ key: foo.bar.foo.bar
42
+
43
+ exists: true
44
+ value:
45
+ - 2
46
+ expanded: false
47
+
48
+ - name: scalar non-leaf
49
+ document: *foo-bar-foo-bar-array-2
50
+ key: foo.bar
51
+
52
+ exists: true
53
+ value:
54
+ foo:
55
+ bar:
56
+ - 2
57
+ expanded: false
58
+
59
+ - name: array non-leaf
60
+ document: &foo-bar-array-foo-bar-2
61
+ foo:
62
+ -
63
+ bar:
64
+ foo:
65
+ bar:
66
+ 2
67
+ key: foo.bar.foo.bar
68
+
69
+ exists: true
70
+ value:
71
+ - 2
72
+ expanded: true
73
+
74
+ - name: array non-leaf with non-leaf query
75
+ document: *foo-bar-array-foo-bar-2
76
+ key: foo.bar
77
+
78
+ exists: true
79
+ value:
80
+ -
81
+ foo:
82
+ bar:
83
+ 2
84
+ expanded: true
85
+
86
+ - name: array non-leaf with query for missing non-leaf key
87
+ document: *foo-bar-array-foo-bar-2
88
+ key: foo.missing
89
+
90
+ exists: false
91
+ value: []
92
+ expanded: true
93
+
94
+ - name: path past end of document
95
+ document: &foo-hello-world
96
+ foo:
97
+ hello: world
98
+ key: foo.bar.foo.bar
99
+
100
+ exists: false
101
+ value: ~
102
+ expanded: false
103
+
104
+ - name: query for missing leaf key
105
+ document: *foo-hello-world
106
+ key: foo.bar
107
+
108
+ exists: false
109
+ value: ~
110
+ expanded: false
111
+
112
+ - name: array index - hash leaf
113
+ document: &foo-one-two
114
+ foo:
115
+ - one: 1
116
+ - two: 2
117
+ bar: [3, 4]
118
+ key: foo.1.two
119
+
120
+ exists: true
121
+ value: 2
122
+ expanded: false
123
+
124
+ - name: array index - hash non-leaf
125
+ document: *foo-one-two
126
+ key: foo.1
127
+
128
+ exists: true
129
+ value:
130
+ two: 2
131
+ expanded: false
132
+
133
+ - name: array index - scalar leaf
134
+ document: *foo-one-two
135
+ key: bar.1
136
+
137
+ exists: true
138
+ value: 4
139
+ expanded: false
140
+
141
+ - name: array index - scalar leaf - missing
142
+ document: *foo-one-two
143
+ key: bar.2
144
+
145
+ exists: false
146
+ value: ~
147
+ expanded: false
148
+
149
+ - name: array index - scalar leaf - missing with further hash subscription
150
+ document: *foo-one-two
151
+ key: bar.2.any
152
+
153
+ exists: false
154
+ value: ~
155
+ expanded: false
156
+
157
+ - name: non-sequential nested arrays - hash leaf - one value
158
+ document: &books-authors
159
+ books:
160
+ -
161
+ authors:
162
+ - name: Steve
163
+ -
164
+ authors:
165
+ - name: Boris
166
+ - name: Pasha
167
+ key: books.0.authors.name
168
+
169
+ exists: true
170
+ value: [Steve]
171
+ expanded: true
172
+
173
+ - name: non-sequential nested arrays - hash non-leaf - one value
174
+ document: *books-authors
175
+ key: books.0
176
+
177
+ exists: true
178
+ value:
179
+ authors:
180
+ - name: Steve
181
+ expanded: false
182
+
183
+ - name: non-sequential nested arrays - hash non-leaf - multiple values
184
+ document: *books-authors
185
+ key: books.1
186
+
187
+ exists: true
188
+ value:
189
+ authors:
190
+ - name: Boris
191
+ - name: Pasha
192
+ expanded: false
193
+
194
+ - name: sequential nested arrays - numerically indexed leaf
195
+ document: &groups
196
+ groups:
197
+ - [1]
198
+ key: groups.0.0
199
+
200
+ exists: true
201
+ value: 1
202
+ expanded: false
203
+
204
+ - name: sequential nested arrays - numerically indexed leaf - missing
205
+ document: *groups
206
+ key: groups.0.1
207
+
208
+ exists: false
209
+ value: ~
210
+ expanded: false
211
+
212
+ - name: sequential nested arrays - missing hash path through non-leaf
213
+ document: *groups
214
+ key: groups.missing
215
+
216
+ exists: false
217
+ value: []
218
+ expanded: true
219
+
220
+ - name: sequential nested arrays - missing hash path through leaf
221
+ document: *groups
222
+ key: groups.0.missing
223
+
224
+ exists: false
225
+ value: []
226
+ expanded: true
227
+
228
+ - name: sequential nested arrays - missing hash path past leaf
229
+ document: *groups
230
+ key: groups.0.0.missing
231
+
232
+ exists: false
233
+ value: ~
234
+ expanded: false
235
+
236
+ - name: mix of arrays and hashes in an array
237
+ document:
238
+ foo:
239
+ -
240
+ -
241
+ bar: 1
242
+ - bar: 2
243
+ key: foo.bar
244
+
245
+ exists: true
246
+ value: [2]
247
+ expanded: true
248
+
249
+ - name: numeric index through a primitive value not supporting subscription operator
250
+ document:
251
+ occupants:
252
+ -
253
+ age: 20
254
+ key:
255
+ occupants.0.age.0
256
+
257
+ exists: false
258
+ value: ~
259
+ expanded: false
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Matcher.extract_attribute' do
7
+ Dir[File.join(File.dirname(__FILE__), 'extract_attribute_data', '*.yml')].sort.each do |path|
8
+ context File.basename(path) do
9
+ specs = YAML.load(File.read(path))
10
+
11
+ specs.each do |spec|
12
+ context spec['name'] do
13
+
14
+ if spec['pending']
15
+ pending spec['pending'].to_s
16
+ end
17
+
18
+ let(:document) do
19
+ spec['document']
20
+ end
21
+
22
+ let(:key) { spec['key'] }
23
+
24
+ let(:actual) do
25
+ Mongoid::Matcher.extract_attribute(document, key)
26
+ end
27
+
28
+ let(:expected_exists) { spec['exists'] }
29
+ let(:expected_value) { spec['value'] }
30
+ let(:expected_expanded) { spec['expanded'] }
31
+
32
+ it 'has the expected exists flag' do
33
+ actual[0].should == expected_exists
34
+ end
35
+
36
+ it 'has the expected value' do
37
+ actual[1].should == expected_value
38
+ end
39
+
40
+ it 'has the expected expanded flag' do
41
+ actual[2].should == expected_expanded
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -143,29 +143,84 @@ describe Mongoid::Persistable::Creatable do
143
143
  end
144
144
 
145
145
  context "when the document is a subclass of a root class" do
146
+ context "when using the default discriminator key" do
147
+ let!(:browser) do
148
+ Browser.create(version: 3, name: "Test")
149
+ end
146
150
 
147
- let!(:browser) do
148
- Browser.create(version: 3, name: "Test")
149
- end
151
+ let(:collection) do
152
+ Canvas.collection
153
+ end
150
154
 
151
- let(:collection) do
152
- Canvas.collection
153
- end
155
+ let(:attributes) do
156
+ collection.find({ name: "Test"}).first
157
+ end
154
158
 
155
- let(:attributes) do
156
- collection.find({ name: "Test"}).first
157
- end
159
+ it "persists the versions" do
160
+ expect(attributes["version"]).to eq(3)
161
+ end
158
162
 
159
- it "persists the versions" do
160
- expect(attributes["version"]).to eq(3)
163
+ it "persists the type" do
164
+ expect(attributes["_type"]).to eq("Browser")
165
+ end
166
+
167
+ it "persists the attributes" do
168
+ expect(attributes["name"]).to eq("Test")
169
+ end
161
170
  end
162
171
 
163
- it "persists the type" do
164
- expect(attributes["_type"]).to eq("Browser")
172
+ context "when using a custom discriminator key" do
173
+ before do
174
+ Canvas.discriminator_key = "dkey"
175
+ end
176
+
177
+ after do
178
+ Canvas.discriminator_key = nil
179
+ end
180
+
181
+ let!(:browser) do
182
+ Browser.create(version: 3, name: "Test")
183
+ end
184
+
185
+ let(:collection) do
186
+ Canvas.collection
187
+ end
188
+
189
+ let(:attributes) do
190
+ collection.find({ name: "Test"}).first
191
+ end
192
+
193
+ it "persists the new discriminator key" do
194
+ expect(attributes["dkey"]).to eq("Browser")
195
+ end
165
196
  end
166
197
 
167
- it "persists the attributes" do
168
- expect(attributes["name"]).to eq("Test")
198
+ context "when using a custom discriminator key and discriminator value" do
199
+ before do
200
+ Canvas.discriminator_key = "dkey"
201
+ Browser.discriminator_value = "dvalue"
202
+ end
203
+
204
+ after do
205
+ Canvas.discriminator_key = nil
206
+ Browser.discriminator_value = nil
207
+ end
208
+
209
+ let!(:browser) do
210
+ Browser.create(version: 3, name: "Test")
211
+ end
212
+
213
+ let(:collection) do
214
+ Canvas.collection
215
+ end
216
+
217
+ let(:attributes) do
218
+ collection.find({ name: "Test"}).first
219
+ end
220
+
221
+ it "persists the new discriminator key" do
222
+ expect(attributes["dkey"]).to eq("dvalue")
223
+ end
169
224
  end
170
225
  end
171
226
 
@@ -207,7 +262,7 @@ describe Mongoid::Persistable::Creatable do
207
262
  expect(Canvas.where(name: "Testy").first).to eq(firefox)
208
263
  end
209
264
 
210
- it "returnss on of this subclasses if you find by _type" do
265
+ it "returns on of this subclasses if you find by _type" do
211
266
  expect(Canvas.where(:_type.in => ['Firefox']).count).to eq(1)
212
267
  end
213
268
  end
@@ -266,8 +321,8 @@ describe Mongoid::Persistable::Creatable do
266
321
  end
267
322
 
268
323
  it "does not bleed relations from one subclass to another" do
269
- expect(Truck.relations.keys).to eq(%w/ shipping_container driver bed /)
270
- expect(Car.relations.keys).to eq(%w/ shipping_container driver /)
324
+ expect(Truck.relations.keys).to eq(%w/ shipping_container driver crates seats bed /)
325
+ expect(Car.relations.keys).to eq(%w/ shipping_container driver crates seats /)
271
326
  end
272
327
 
273
328
  context "when appending new documents" do
@@ -343,17 +398,45 @@ describe Mongoid::Persistable::Creatable do
343
398
  end
344
399
 
345
400
  context "#find_or_initialize_by" do
401
+ context "when using the default discriminator key" do
402
+ before do
403
+ container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
404
+ end
346
405
 
347
- before do
348
- container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
349
- end
406
+ it "initializes the given type document" do
407
+ expect(container.vehicles.map(&:class)).to eq([ Car ])
408
+ end
350
409
 
351
- it "initializes the given type document" do
352
- expect(container.vehicles.map(&:class)).to eq([ Car ])
410
+ it "initializes with the given attributes" do
411
+ expect(container.vehicles.map(&:driver)).to eq([ driver ])
412
+ end
413
+
414
+ it "initializes with a type field that equals the class" do
415
+ expect(
416
+ container.vehicles.first.attributes["_type"]
417
+ ).to eq("Car")
418
+ end
353
419
  end
354
420
 
355
- it "initializes with the given attributes" do
356
- expect(container.vehicles.map(&:driver)).to eq([ driver ])
421
+ context "when using a custom discriminator key" do
422
+ before do
423
+ Vehicle.discriminator_key = "dkey"
424
+ container.vehicles.find_or_initialize_by({ driver_id: driver.id }, Car)
425
+ end
426
+
427
+ it "initializes the given type document" do
428
+ expect(container.vehicles.map(&:class)).to eq([ Car ])
429
+ end
430
+
431
+ it "initializes with the given attributes" do
432
+ expect(container.vehicles.map(&:driver)).to eq([ driver ])
433
+ end
434
+
435
+ it "initializes with a dkey field that equals the class" do
436
+ expect(
437
+ container.vehicles.first.attributes["dkey"]
438
+ ).to eq("Car")
439
+ end
357
440
  end
358
441
  end
359
442
 
@@ -173,6 +173,92 @@ describe Mongoid::Persistable::Deletable do
173
173
  end
174
174
  end
175
175
  end
176
+
177
+ context "when deleting all documents with a custom discriminator key" do
178
+ before do
179
+ Canvas.discriminator_key = "dkey"
180
+ end
181
+
182
+ after do
183
+ Canvas.discriminator_key = nil
184
+ end
185
+
186
+ let!(:firefox) do
187
+ Firefox.create(name: "firefox")
188
+ end
189
+
190
+ let!(:firefox2) do
191
+ Firefox.create(name: "firefox 2")
192
+ end
193
+
194
+ let!(:browser) do
195
+ Browser.create(name: "browser")
196
+ end
197
+
198
+ let!(:canvas) do
199
+ Canvas.create(name: "canvas")
200
+ end
201
+
202
+ before do
203
+ Firefox.delete_all
204
+ end
205
+
206
+ it "deletes from the parent class collection" do
207
+ expect(Canvas.count).to eq(2)
208
+ end
209
+
210
+ it "returns correct counts for child classes" do
211
+ expect(Firefox.count).to eq(0)
212
+ end
213
+
214
+ it "returns correct counts for root subclasses" do
215
+ expect(Browser.count).to eq(1)
216
+ end
217
+ end
218
+
219
+ context "when deleting all documents with a custom discriminator value" do
220
+ before do
221
+ Canvas.discriminator_key = "dkey"
222
+ Firefox.discriminator_value = "dvalue"
223
+ end
224
+
225
+ after do
226
+ Canvas.discriminator_key = nil
227
+ Firefox.discriminator_value = nil
228
+ end
229
+
230
+ let!(:firefox) do
231
+ Firefox.create(name: "firefox")
232
+ end
233
+
234
+ let!(:firefox2) do
235
+ Firefox.create(name: "firefox 2")
236
+ end
237
+
238
+ let!(:browser) do
239
+ Browser.create(name: "browser")
240
+ end
241
+
242
+ let!(:canvas) do
243
+ Canvas.create(name: "canvas")
244
+ end
245
+
246
+ before do
247
+ Firefox.delete_all
248
+ end
249
+
250
+ it "deletes from the parent class collection" do
251
+ expect(Canvas.count).to eq(2)
252
+ end
253
+
254
+ it "returns correct counts for child classes" do
255
+ expect(Firefox.count).to eq(0)
256
+ end
257
+
258
+ it "returns correct counts for root subclasses" do
259
+ expect(Browser.count).to eq(1)
260
+ end
261
+ end
176
262
  end
177
263
 
178
264
  describe "#delete_all" do