mongoid 7.1.5 → 7.2.1

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 (461) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +9 -2
  5. data/Rakefile +33 -7
  6. data/lib/config/locales/en.yml +37 -1
  7. data/lib/mongoid.rb +23 -0
  8. data/lib/mongoid/association/depending.rb +1 -6
  9. data/lib/mongoid/association/many.rb +3 -3
  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 +36 -1
  13. data/lib/mongoid/association/referenced/has_many/proxy.rb +8 -1
  14. data/lib/mongoid/association/referenced/has_one/buildable.rb +9 -1
  15. data/lib/mongoid/association/referenced/has_one/proxy.rb +6 -1
  16. data/lib/mongoid/atomic/modifiers.rb +1 -1
  17. data/lib/mongoid/attributes/dynamic.rb +1 -1
  18. data/lib/mongoid/clients/factory.rb +17 -0
  19. data/lib/mongoid/composable.rb +1 -0
  20. data/lib/mongoid/config.rb +3 -0
  21. data/lib/mongoid/contextual/mongo.rb +23 -4
  22. data/lib/mongoid/copyable.rb +7 -3
  23. data/lib/mongoid/criteria.rb +57 -7
  24. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  25. data/lib/mongoid/criteria/queryable/mergeable.rb +2 -2
  26. data/lib/mongoid/criteria/queryable/selectable.rb +21 -6
  27. data/lib/mongoid/criteria/queryable/selector.rb +3 -7
  28. data/lib/mongoid/criteria/queryable/storable.rb +3 -3
  29. data/lib/mongoid/document.rb +18 -5
  30. data/lib/mongoid/errors.rb +7 -0
  31. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  32. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  33. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  34. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  35. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  36. data/lib/mongoid/errors/invalid_query.rb +41 -0
  37. data/lib/mongoid/extensions.rb +1 -0
  38. data/lib/mongoid/factory.rb +27 -10
  39. data/lib/mongoid/fields.rb +3 -0
  40. data/lib/mongoid/fields/validators/macro.rb +22 -9
  41. data/lib/mongoid/findable.rb +50 -14
  42. data/lib/mongoid/indexable.rb +2 -2
  43. data/lib/mongoid/interceptable.rb +3 -1
  44. data/lib/mongoid/matchable.rb +1 -149
  45. data/lib/mongoid/matcher.rb +127 -0
  46. data/lib/mongoid/matcher/all.rb +22 -0
  47. data/lib/mongoid/matcher/and.rb +21 -0
  48. data/lib/mongoid/matcher/elem_match.rb +35 -0
  49. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  50. data/lib/mongoid/matcher/eq.rb +11 -0
  51. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  52. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  53. data/lib/mongoid/matcher/exists.rb +15 -0
  54. data/lib/mongoid/matcher/expression.rb +40 -0
  55. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  56. data/lib/mongoid/matcher/field_expression.rb +63 -0
  57. data/lib/mongoid/matcher/field_operator.rb +48 -0
  58. data/lib/mongoid/matcher/gt.rb +17 -0
  59. data/lib/mongoid/matcher/gte.rb +17 -0
  60. data/lib/mongoid/matcher/in.rb +25 -0
  61. data/lib/mongoid/matcher/lt.rb +17 -0
  62. data/lib/mongoid/matcher/lte.rb +17 -0
  63. data/lib/mongoid/matcher/ne.rb +16 -0
  64. data/lib/mongoid/matcher/nin.rb +11 -0
  65. data/lib/mongoid/matcher/nor.rb +25 -0
  66. data/lib/mongoid/matcher/not.rb +29 -0
  67. data/lib/mongoid/matcher/or.rb +21 -0
  68. data/lib/mongoid/matcher/regex.rb +41 -0
  69. data/lib/mongoid/matcher/size.rb +26 -0
  70. data/lib/mongoid/persistable/deletable.rb +1 -1
  71. data/lib/mongoid/query_cache.rb +64 -62
  72. data/lib/mongoid/reloadable.rb +2 -2
  73. data/lib/mongoid/serializable.rb +1 -1
  74. data/lib/mongoid/stringified_symbol.rb +53 -0
  75. data/lib/mongoid/traversable.rb +111 -4
  76. data/lib/mongoid/version.rb +1 -1
  77. data/spec/README.md +19 -4
  78. data/spec/integration/app_spec.rb +46 -13
  79. data/spec/integration/associations/embedded_spec.rb +94 -0
  80. data/spec/integration/associations/embeds_many_spec.rb +24 -0
  81. data/spec/integration/associations/embeds_one_spec.rb +24 -0
  82. data/spec/integration/associations/has_many_spec.rb +108 -13
  83. data/spec/integration/associations/has_one_spec.rb +108 -13
  84. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  85. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  86. data/spec/integration/callbacks_models.rb +49 -0
  87. data/spec/integration/callbacks_spec.rb +216 -0
  88. data/spec/integration/discriminator_key_spec.rb +354 -0
  89. data/spec/integration/discriminator_value_spec.rb +207 -0
  90. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  91. data/spec/integration/matcher_operator_data/all.yml +140 -0
  92. data/spec/integration/matcher_operator_data/and.yml +93 -0
  93. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  94. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  95. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  96. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  97. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  98. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  99. data/spec/integration/matcher_operator_data/gt_types.yml +63 -0
  100. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  101. data/spec/integration/matcher_operator_data/gte_types.yml +15 -0
  102. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  103. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  104. data/spec/integration/matcher_operator_data/in.yml +194 -0
  105. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  106. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  107. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  108. data/spec/integration/matcher_operator_data/lt_types.yml +15 -0
  109. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  110. data/spec/integration/matcher_operator_data/lte_types.yml +15 -0
  111. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  112. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  113. data/spec/integration/matcher_operator_data/ne_types.yml +15 -0
  114. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  115. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  116. data/spec/integration/matcher_operator_data/not.yml +196 -0
  117. data/spec/integration/matcher_operator_data/or.yml +137 -0
  118. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  119. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  120. data/spec/integration/matcher_operator_data/size.yml +174 -0
  121. data/spec/integration/matcher_operator_spec.rb +100 -0
  122. data/spec/integration/matcher_spec.rb +189 -0
  123. data/spec/integration/server_query_spec.rb +142 -0
  124. data/spec/integration/stringified_symbol_field_spec.rb +190 -0
  125. data/spec/lite_spec_helper.rb +4 -3
  126. data/spec/mongoid/association/depending_spec.rb +78 -26
  127. data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +50 -0
  128. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  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/has_many/proxy_spec.rb +460 -186
  132. data/spec/mongoid/association/referenced/has_many_models.rb +21 -0
  133. data/spec/mongoid/association/referenced/has_one_models.rb +21 -0
  134. data/spec/mongoid/association/referenced/has_one_spec.rb +1 -1
  135. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  136. data/spec/mongoid/atomic/paths_spec.rb +41 -0
  137. data/spec/mongoid/atomic_spec.rb +23 -0
  138. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  139. data/spec/mongoid/clients/factory_spec.rb +37 -0
  140. data/spec/mongoid/clients/sessions_spec.rb +1 -6
  141. data/spec/mongoid/config_spec.rb +28 -0
  142. data/spec/mongoid/contextual/mongo_spec.rb +70 -16
  143. data/spec/mongoid/copyable_spec.rb +197 -18
  144. data/spec/mongoid/copyable_spec_models.rb +28 -0
  145. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +36 -0
  146. data/spec/mongoid/criteria/queryable/selectable_spec.rb +84 -82
  147. data/spec/mongoid/criteria_spec.rb +204 -39
  148. data/spec/mongoid/document_spec.rb +89 -15
  149. data/spec/mongoid/equality_spec.rb +0 -1
  150. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  151. data/spec/mongoid/extensions/stringified_symbol_spec.rb +85 -0
  152. data/spec/mongoid/factory_spec.rb +261 -28
  153. data/spec/mongoid/fields_spec.rb +48 -2
  154. data/spec/mongoid/findable_spec.rb +32 -0
  155. data/spec/mongoid/indexable_spec.rb +28 -2
  156. data/spec/mongoid/inspectable_spec.rb +29 -2
  157. data/spec/mongoid/interceptable_spec.rb +2 -2
  158. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  159. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  160. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  161. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  162. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  163. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  164. data/spec/mongoid/query_cache_spec.rb +442 -41
  165. data/spec/mongoid/reloadable_spec.rb +72 -0
  166. data/spec/mongoid/serializable_spec.rb +21 -3
  167. data/spec/mongoid/traversable_spec.rb +1100 -0
  168. data/spec/shared/LICENSE +20 -0
  169. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  170. data/spec/shared/lib/mrss/cluster_config.rb +211 -0
  171. data/spec/shared/lib/mrss/constraints.rb +330 -0
  172. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  173. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  174. data/spec/shared/lib/mrss/server_version_registry.rb +69 -0
  175. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  176. data/spec/shared/share/Dockerfile.erb +229 -0
  177. data/spec/shared/shlib/distro.sh +73 -0
  178. data/spec/shared/shlib/server.sh +270 -0
  179. data/spec/shared/shlib/set_env.sh +128 -0
  180. data/spec/spec_helper.rb +4 -2
  181. data/spec/support/constraints.rb +20 -222
  182. data/spec/support/helpers.rb +1 -1
  183. data/spec/{app → support}/models/account.rb +0 -0
  184. data/spec/{app → support}/models/acolyte.rb +0 -0
  185. data/spec/{app → support}/models/actor.rb +1 -1
  186. data/spec/{app → support}/models/actress.rb +0 -0
  187. data/spec/{app → support}/models/address.rb +0 -0
  188. data/spec/{app → support}/models/address_component.rb +0 -0
  189. data/spec/{app → support}/models/address_number.rb +0 -0
  190. data/spec/{app → support}/models/agency.rb +0 -0
  191. data/spec/{app → support}/models/agent.rb +0 -0
  192. data/spec/{app → support}/models/album.rb +0 -0
  193. data/spec/{app → support}/models/alert.rb +0 -0
  194. data/spec/{app → support}/models/animal.rb +0 -0
  195. data/spec/{app → support}/models/answer.rb +0 -0
  196. data/spec/{app → support}/models/appointment.rb +0 -0
  197. data/spec/support/models/armrest.rb +10 -0
  198. data/spec/{app → support}/models/array_field.rb +0 -0
  199. data/spec/{app → support}/models/article.rb +0 -0
  200. data/spec/{app → support}/models/artist.rb +0 -0
  201. data/spec/{app → support}/models/artwork.rb +0 -0
  202. data/spec/{app → support}/models/audio.rb +0 -0
  203. data/spec/{app → support}/models/augmentation.rb +0 -0
  204. data/spec/{app → support}/models/author.rb +0 -0
  205. data/spec/{app → support}/models/baby.rb +0 -0
  206. data/spec/{app → support}/models/band.rb +0 -0
  207. data/spec/{app → support}/models/bar.rb +0 -0
  208. data/spec/{app → support}/models/basic.rb +0 -0
  209. data/spec/{app → support}/models/bed.rb +0 -0
  210. data/spec/{app → support}/models/big_palette.rb +0 -0
  211. data/spec/{app → support}/models/birthday.rb +0 -0
  212. data/spec/{app → support}/models/bomb.rb +0 -0
  213. data/spec/{app → support}/models/book.rb +0 -0
  214. data/spec/{app → support}/models/breed.rb +0 -0
  215. data/spec/{app → support}/models/browser.rb +1 -1
  216. data/spec/{app → support}/models/building.rb +0 -0
  217. data/spec/{app → support}/models/building_address.rb +0 -0
  218. data/spec/{app → support}/models/bus.rb +0 -0
  219. data/spec/{app → support}/models/business.rb +0 -0
  220. data/spec/{app → support}/models/callback_test.rb +0 -0
  221. data/spec/{app → support}/models/canvas.rb +1 -1
  222. data/spec/{app → support}/models/car.rb +0 -0
  223. data/spec/{app → support}/models/cat.rb +0 -0
  224. data/spec/{app → support}/models/category.rb +0 -0
  225. data/spec/{app → support}/models/child.rb +0 -0
  226. data/spec/{app → support}/models/child_doc.rb +0 -0
  227. data/spec/{app → support}/models/church.rb +0 -0
  228. data/spec/{app → support}/models/circle.rb +0 -0
  229. data/spec/{app → support}/models/circuit.rb +0 -0
  230. data/spec/{app → support}/models/circus.rb +0 -0
  231. data/spec/{app → support}/models/code.rb +0 -0
  232. data/spec/{app → support}/models/coding.rb +1 -1
  233. data/spec/{app → support}/models/coding/pull_request.rb +0 -0
  234. data/spec/{app → support}/models/comment.rb +0 -0
  235. data/spec/{app → support}/models/company.rb +0 -0
  236. data/spec/{app → support}/models/consumption_period.rb +0 -0
  237. data/spec/{app → support}/models/contextable_item.rb +0 -0
  238. data/spec/{app → support}/models/contractor.rb +0 -0
  239. data/spec/{app → support}/models/cookie.rb +0 -0
  240. data/spec/{app → support}/models/country_code.rb +0 -0
  241. data/spec/{app → support}/models/courier_job.rb +0 -0
  242. data/spec/support/models/crate.rb +13 -0
  243. data/spec/support/models/customer.rb +11 -0
  244. data/spec/support/models/customer_address.rb +12 -0
  245. data/spec/support/models/deed.rb +8 -0
  246. data/spec/{app → support}/models/definition.rb +0 -0
  247. data/spec/{app → support}/models/delegating_patient.rb +0 -0
  248. data/spec/{app → support}/models/description.rb +0 -0
  249. data/spec/{app → support}/models/dictionary.rb +6 -0
  250. data/spec/{app → support}/models/division.rb +0 -0
  251. data/spec/{app → support}/models/doctor.rb +0 -0
  252. data/spec/{app → support}/models/dog.rb +0 -0
  253. data/spec/{app → support}/models/dokument.rb +0 -0
  254. data/spec/{app → support}/models/draft.rb +0 -0
  255. data/spec/{app → support}/models/dragon.rb +0 -0
  256. data/spec/{app → support}/models/driver.rb +1 -1
  257. data/spec/{app → support}/models/drug.rb +0 -0
  258. data/spec/{app → support}/models/dungeon.rb +0 -0
  259. data/spec/{app → support}/models/edit.rb +0 -0
  260. data/spec/{app → support}/models/email.rb +0 -0
  261. data/spec/{app → support}/models/employer.rb +0 -0
  262. data/spec/{app → support}/models/entry.rb +0 -0
  263. data/spec/{app → support}/models/eraser.rb +0 -0
  264. data/spec/{app → support}/models/even.rb +0 -0
  265. data/spec/{app → support}/models/event.rb +0 -0
  266. data/spec/{app → support}/models/exhibition.rb +0 -0
  267. data/spec/{app → support}/models/exhibitor.rb +0 -0
  268. data/spec/{app → support}/models/explosion.rb +0 -0
  269. data/spec/{app → support}/models/eye.rb +0 -0
  270. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  271. data/spec/{app → support}/models/face.rb +0 -0
  272. data/spec/{app → support}/models/favorite.rb +0 -0
  273. data/spec/{app → support}/models/filesystem.rb +0 -0
  274. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  275. data/spec/{app → support}/models/firefox.rb +0 -0
  276. data/spec/{app → support}/models/fish.rb +0 -0
  277. data/spec/{app → support}/models/folder.rb +0 -0
  278. data/spec/{app → support}/models/folder_item.rb +0 -0
  279. data/spec/{app → support}/models/fruits.rb +0 -0
  280. data/spec/{app → support}/models/game.rb +0 -0
  281. data/spec/{app → support}/models/ghost.rb +0 -0
  282. data/spec/support/models/guitar.rb +5 -0
  283. data/spec/{app → support}/models/home.rb +0 -0
  284. data/spec/{app → support}/models/house.rb +0 -0
  285. data/spec/{app → support}/models/html_writer.rb +0 -0
  286. data/spec/{app → support}/models/id_key.rb +0 -0
  287. data/spec/support/models/idnodef.rb +8 -0
  288. data/spec/{app → support}/models/image.rb +0 -0
  289. data/spec/{app → support}/models/implant.rb +0 -0
  290. data/spec/support/models/instrument.rb +9 -0
  291. data/spec/{app → support}/models/item.rb +1 -1
  292. data/spec/{app → support}/models/jar.rb +0 -0
  293. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  294. data/spec/{app → support}/models/kangaroo.rb +0 -0
  295. data/spec/{app → support}/models/label.rb +0 -0
  296. data/spec/{app → support}/models/language.rb +0 -0
  297. data/spec/{app → support}/models/lat_lng.rb +0 -0
  298. data/spec/{app → support}/models/league.rb +0 -0
  299. data/spec/{app → support}/models/learner.rb +0 -0
  300. data/spec/{app → support}/models/line_item.rb +0 -0
  301. data/spec/{app → support}/models/location.rb +0 -0
  302. data/spec/{app → support}/models/login.rb +0 -0
  303. data/spec/{app → support}/models/manufacturer.rb +0 -0
  304. data/spec/{app → support}/models/meat.rb +0 -0
  305. data/spec/{app → support}/models/membership.rb +0 -0
  306. data/spec/{app → support}/models/message.rb +0 -0
  307. data/spec/{app → support}/models/minim.rb +0 -0
  308. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  309. data/spec/support/models/mop.rb +16 -0
  310. data/spec/{app → support}/models/movie.rb +0 -0
  311. data/spec/{app → support}/models/my_hash.rb +0 -0
  312. data/spec/{app → support}/models/name.rb +0 -0
  313. data/spec/{app → support}/models/name_only.rb +0 -0
  314. data/spec/{app → support}/models/node.rb +0 -0
  315. data/spec/{app → support}/models/note.rb +0 -0
  316. data/spec/{app → support}/models/odd.rb +0 -0
  317. data/spec/support/models/order.rb +11 -0
  318. data/spec/{app → support}/models/ordered_post.rb +0 -0
  319. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  320. data/spec/{app → support}/models/oscar.rb +0 -0
  321. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  322. data/spec/{app → support}/models/override.rb +0 -0
  323. data/spec/{app → support}/models/ownable.rb +0 -0
  324. data/spec/{app → support}/models/owner.rb +2 -0
  325. data/spec/{app → support}/models/pack.rb +0 -0
  326. data/spec/{app → support}/models/page.rb +0 -0
  327. data/spec/{app → support}/models/page_question.rb +0 -0
  328. data/spec/{app → support}/models/palette.rb +1 -1
  329. data/spec/{app → support}/models/parent.rb +0 -0
  330. data/spec/{app → support}/models/parent_doc.rb +0 -0
  331. data/spec/{app → support}/models/passport.rb +0 -0
  332. data/spec/{app → support}/models/patient.rb +0 -0
  333. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  334. data/spec/{app → support}/models/pencil.rb +0 -0
  335. data/spec/{app → support}/models/person.rb +3 -1
  336. data/spec/{app → support}/models/pet.rb +0 -0
  337. data/spec/{app → support}/models/pet_owner.rb +0 -0
  338. data/spec/{app → support}/models/phone.rb +0 -0
  339. data/spec/support/models/piano.rb +5 -0
  340. data/spec/{app → support}/models/pizza.rb +0 -0
  341. data/spec/{app → support}/models/player.rb +0 -0
  342. data/spec/{app → support}/models/post.rb +0 -0
  343. data/spec/{app → support}/models/post_genre.rb +0 -0
  344. data/spec/{app → support}/models/powerup.rb +0 -0
  345. data/spec/{app → support}/models/preference.rb +0 -0
  346. data/spec/{app → support}/models/princess.rb +0 -0
  347. data/spec/{app → support}/models/product.rb +0 -0
  348. data/spec/support/models/profile.rb +18 -0
  349. data/spec/{app → support}/models/pronunciation.rb +0 -0
  350. data/spec/{app → support}/models/pub.rb +0 -0
  351. data/spec/support/models/publication.rb +5 -0
  352. data/spec/{app → support}/models/publication/encyclopedia.rb +0 -0
  353. data/spec/{app → support}/models/publication/review.rb +0 -0
  354. data/spec/{app → support}/models/purchase.rb +0 -0
  355. data/spec/{app → support}/models/question.rb +0 -0
  356. data/spec/{app → support}/models/quiz.rb +0 -0
  357. data/spec/{app → support}/models/rating.rb +0 -0
  358. data/spec/{app → support}/models/record.rb +0 -0
  359. data/spec/{app → support}/models/registry.rb +0 -0
  360. data/spec/{app → support}/models/role.rb +0 -0
  361. data/spec/{app → support}/models/root_category.rb +0 -0
  362. data/spec/{app → support}/models/sandwich.rb +0 -0
  363. data/spec/{app → support}/models/scheduler.rb +0 -0
  364. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  365. data/spec/support/models/seat.rb +25 -0
  366. data/spec/{app → support}/models/seo.rb +0 -0
  367. data/spec/{app → support}/models/series.rb +1 -0
  368. data/spec/{app → support}/models/server.rb +0 -0
  369. data/spec/{app → support}/models/service.rb +0 -0
  370. data/spec/{app → support}/models/shape.rb +2 -2
  371. data/spec/{app → support}/models/shelf.rb +0 -0
  372. data/spec/{app → support}/models/shipment_address.rb +0 -0
  373. data/spec/{app → support}/models/shipping_container.rb +0 -0
  374. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  375. data/spec/{app → support}/models/shop.rb +0 -0
  376. data/spec/{app → support}/models/short_agent.rb +0 -0
  377. data/spec/{app → support}/models/short_quiz.rb +0 -0
  378. data/spec/{app → support}/models/simple.rb +0 -0
  379. data/spec/{app → support}/models/slave.rb +0 -0
  380. data/spec/{app → support}/models/song.rb +0 -0
  381. data/spec/{app → support}/models/sound.rb +0 -0
  382. data/spec/{app → support}/models/square.rb +0 -0
  383. data/spec/{app → support}/models/staff.rb +0 -0
  384. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  385. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  386. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  387. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  388. data/spec/{app → support}/models/strategy.rb +0 -0
  389. data/spec/{app → support}/models/sub_item.rb +0 -0
  390. data/spec/{app → support}/models/subscription.rb +0 -0
  391. data/spec/{app → support}/models/survey.rb +0 -0
  392. data/spec/{app → support}/models/symptom.rb +0 -0
  393. data/spec/support/models/system_role.rb +7 -0
  394. data/spec/{app → support}/models/tag.rb +0 -0
  395. data/spec/{app → support}/models/target.rb +0 -0
  396. data/spec/{app → support}/models/template.rb +0 -0
  397. data/spec/{app → support}/models/thing.rb +0 -0
  398. data/spec/{app → support}/models/title.rb +0 -0
  399. data/spec/{app → support}/models/tool.rb +2 -2
  400. data/spec/{app → support}/models/topping.rb +0 -0
  401. data/spec/support/models/toy.rb +10 -0
  402. data/spec/{app → support}/models/track.rb +0 -0
  403. data/spec/{app → support}/models/translation.rb +0 -0
  404. data/spec/{app → support}/models/tree.rb +0 -0
  405. data/spec/{app → support}/models/truck.rb +2 -0
  406. data/spec/{app → support}/models/updatable.rb +0 -0
  407. data/spec/{app → support}/models/user.rb +0 -0
  408. data/spec/{app → support}/models/user_account.rb +0 -0
  409. data/spec/{app → support}/models/validation_callback.rb +0 -0
  410. data/spec/{app → support}/models/vehicle.rb +7 -2
  411. data/spec/{app → support}/models/version.rb +0 -0
  412. data/spec/{app → support}/models/vertex.rb +0 -0
  413. data/spec/{app → support}/models/vet_visit.rb +0 -0
  414. data/spec/{app → support}/models/video.rb +0 -0
  415. data/spec/{app → support}/models/video_game.rb +0 -0
  416. data/spec/{app → support}/models/weapon.rb +0 -0
  417. data/spec/{app → support}/models/wiki_page.rb +1 -0
  418. data/spec/{app → support}/models/word.rb +0 -0
  419. data/spec/{app → support}/models/word_origin.rb +0 -0
  420. data/spec/{app → support}/models/writer.rb +2 -2
  421. data/spec/support/spec_config.rb +1 -1
  422. metadata +895 -755
  423. metadata.gz.sig +0 -0
  424. data/lib/mongoid/matchable/all.rb +0 -30
  425. data/lib/mongoid/matchable/and.rb +0 -32
  426. data/lib/mongoid/matchable/default.rb +0 -121
  427. data/lib/mongoid/matchable/elem_match.rb +0 -36
  428. data/lib/mongoid/matchable/eq.rb +0 -23
  429. data/lib/mongoid/matchable/exists.rb +0 -25
  430. data/lib/mongoid/matchable/gt.rb +0 -25
  431. data/lib/mongoid/matchable/gte.rb +0 -25
  432. data/lib/mongoid/matchable/in.rb +0 -26
  433. data/lib/mongoid/matchable/lt.rb +0 -25
  434. data/lib/mongoid/matchable/lte.rb +0 -25
  435. data/lib/mongoid/matchable/ne.rb +0 -23
  436. data/lib/mongoid/matchable/nin.rb +0 -24
  437. data/lib/mongoid/matchable/nor.rb +0 -38
  438. data/lib/mongoid/matchable/or.rb +0 -35
  439. data/lib/mongoid/matchable/regexp.rb +0 -30
  440. data/lib/mongoid/matchable/size.rb +0 -23
  441. data/spec/app/models/publication.rb +0 -5
  442. data/spec/mongoid/matchable/all_spec.rb +0 -34
  443. data/spec/mongoid/matchable/and_spec.rb +0 -190
  444. data/spec/mongoid/matchable/default_spec.rb +0 -140
  445. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  446. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  447. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  448. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  449. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  450. data/spec/mongoid/matchable/in_spec.rb +0 -52
  451. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  452. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  453. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  454. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  455. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  456. data/spec/mongoid/matchable/or_spec.rb +0 -134
  457. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  458. data/spec/mongoid/matchable/size_spec.rb +0 -28
  459. data/spec/mongoid/matchable_spec.rb +0 -856
  460. data/spec/support/child_process_helper.rb +0 -76
  461. data/spec/support/lite_constraints.rb +0 -22
@@ -353,5 +353,77 @@ describe Mongoid::Reloadable do
353
353
  expect(reloaded.readonly?).to be(false)
354
354
  end
355
355
  end
356
+
357
+ context 'on sharded cluster' do
358
+ require_topology :sharded
359
+
360
+ before(:all) do
361
+ CONFIG[:clients][:other] = CONFIG[:clients][:default].dup
362
+ CONFIG[:clients][:other][:database] = 'other'
363
+ Mongoid::Clients.clients.values.each(&:close)
364
+ Mongoid::Config.send(:clients=, CONFIG[:clients])
365
+ Mongoid::Clients.with_name(:other).subscribe(Mongo::Monitoring::COMMAND, EventSubscriber.new)
366
+ end
367
+
368
+ let(:subscriber) do
369
+ client = Mongoid::Clients.with_name(:other)
370
+ monitoring = client.send(:monitoring)
371
+ subscriber = monitoring.subscribers['Command'].find do |s|
372
+ s.is_a?(EventSubscriber)
373
+ end
374
+ end
375
+
376
+ let(:find_events) do
377
+ find_events = subscriber.started_events.select { |event| event.command_name.to_s == 'find' }
378
+ end
379
+
380
+ before do
381
+ subscriber.clear_events!
382
+ end
383
+
384
+ context 'without embedded document' do
385
+ let(:profile) do
386
+ Profile.with(client: :other) do |klass|
387
+ klass.create
388
+ end
389
+ end
390
+
391
+ before do
392
+ Profile.with(client: :other) do
393
+ profile.reload
394
+ end
395
+ end
396
+
397
+ it 'uses the shard key to reload the document' do
398
+ expect(find_events.length). to eq(1)
399
+
400
+ event = find_events.first
401
+ expect(event.command['filter'].keys).to include('name')
402
+ end
403
+ end
404
+
405
+
406
+ context 'with embedded document' do
407
+ let(:profile_image) do
408
+ Profile.with(client: :other) do |klass|
409
+ profile = klass.create
410
+ ProfileImage.create(profile: profile)
411
+ end
412
+ end
413
+
414
+ before do
415
+ Profile.with(client: :other) do
416
+ profile_image.reload
417
+ end
418
+ end
419
+
420
+ it 'uses the shard key to reload the embedded document' do
421
+ expect(find_events.length). to eq(1)
422
+
423
+ event = find_events.first
424
+ expect(event.command['filter'].keys).to include('name')
425
+ end
426
+ end
427
+ end
356
428
  end
357
429
  end
@@ -7,12 +7,30 @@ describe Mongoid::Serializable do
7
7
 
8
8
  describe "#field_names" do
9
9
 
10
- let(:band) do
11
- Band.new
10
+ let(:guitar) do
11
+ Guitar.new
12
12
  end
13
13
 
14
14
  it "does not duplicate fields" do
15
- expect(band.send(:field_names, {})).to eq(band.fields.except("_type").keys.sort)
15
+ expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("_type").keys.sort)
16
+ end
17
+
18
+ context "when using a custom discriminator_key" do
19
+ before do
20
+ Instrument.discriminator_key = "dkey"
21
+ end
22
+
23
+ after do
24
+ Instrument.discriminator_key = nil
25
+ end
26
+
27
+ let(:guitar) do
28
+ Guitar.new
29
+ end
30
+
31
+ it "includes _type but does not include the new discriminator key" do
32
+ expect(guitar.send(:field_names, {})).to eq(guitar.fields.except("dkey").keys.sort)
33
+ end
16
34
  end
17
35
  end
18
36
 
@@ -251,4 +251,1104 @@ describe Mongoid::Traversable do
251
251
  end
252
252
  end
253
253
  end
254
+
255
+ describe "#discriminator_key" do
256
+
257
+ context "when the discriminator key is not set on a class" do
258
+ it "sets the global discriminator key to _type" do
259
+ expect(Mongoid.discriminator_key).to eq("_type")
260
+ end
261
+
262
+ it "sets the parent discriminator key to _type" do
263
+ expect(Instrument.discriminator_key).to eq("_type")
264
+ end
265
+
266
+ it "sets the child discriminator key to _type: Piano" do
267
+ expect(Piano.discriminator_key).to eq("_type")
268
+ end
269
+
270
+ it "sets the child discriminator key to _type: Guitar" do
271
+ expect(Guitar.discriminator_key).to eq("_type")
272
+ end
273
+ end
274
+
275
+ context "when the discriminator key is changed at the global level" do
276
+ before do
277
+ Mongoid.discriminator_key = "hello"
278
+ end
279
+
280
+ after do
281
+ Mongoid.discriminator_key = "_type"
282
+ end
283
+
284
+ it "sets the correct value globally" do
285
+ expect(Mongoid.discriminator_key).to eq("hello")
286
+ end
287
+
288
+ it "is changed in the parent" do
289
+ expect(Instrument.discriminator_key).to eq("hello")
290
+ end
291
+
292
+ it "is changed in the child: Piano" do
293
+ expect(Piano.discriminator_key).to eq("hello")
294
+ end
295
+
296
+ it "is changed in the child: Guitar" do
297
+ expect(Guitar.discriminator_key).to eq("hello")
298
+ end
299
+ end
300
+
301
+ context "when the discriminator key is changed in the parent" do
302
+ before do
303
+ Instrument.discriminator_key = "hello2"
304
+ end
305
+
306
+ after do
307
+ Instrument.discriminator_key = nil
308
+ end
309
+
310
+ it "doesn't change the global setting" do
311
+ expect(Mongoid.discriminator_key).to eq("_type")
312
+ end
313
+
314
+ it "changes in the parent" do
315
+ expect(Instrument.discriminator_key).to eq("hello2")
316
+ end
317
+
318
+ it "changes in the child class: Piano" do
319
+ expect(Piano.discriminator_key).to eq("hello2")
320
+ end
321
+
322
+ it "changes in the child class: Guitar" do
323
+ expect(Guitar.discriminator_key).to eq("hello2")
324
+ end
325
+
326
+ context 'when discriminator key is set to nil in parent' do
327
+ before do
328
+ Instrument.discriminator_key = nil
329
+ end
330
+
331
+ it "doesn't change the global setting" do
332
+ expect(Mongoid.discriminator_key).to eq("_type")
333
+ end
334
+
335
+ it 'uses global setting' do
336
+ expect(Instrument.discriminator_key).to eq("_type")
337
+ end
338
+
339
+ it "changes in the child class: Piano" do
340
+ expect(Piano.discriminator_key).to eq("_type")
341
+ end
342
+
343
+ it "changes in the child class: Guitar" do
344
+ expect(Guitar.discriminator_key).to eq("_type")
345
+ end
346
+ end
347
+
348
+ context "when resetting the discriminator key after nil" do
349
+ before do
350
+ Instrument.discriminator_key = nil
351
+ Instrument.discriminator_key = "hello4"
352
+ end
353
+
354
+ it "doesn't change the global setting" do
355
+ expect(Mongoid.discriminator_key).to eq("_type")
356
+ end
357
+
358
+ it 'has the correct value' do
359
+ expect(Instrument.discriminator_key).to eq("hello4")
360
+ end
361
+
362
+ it "changes in the child class: Piano" do
363
+ expect(Piano.discriminator_key).to eq("hello4")
364
+ end
365
+
366
+ it "changes in the child class: Guitar" do
367
+ expect(Guitar.discriminator_key).to eq("hello4")
368
+ end
369
+ end
370
+ end
371
+
372
+ context "when the discriminator key is changed in the child" do
373
+ let(:set_discriminator_key) do
374
+ Guitar.discriminator_key = "hello3"
375
+ end
376
+
377
+ before :each do
378
+ begin
379
+ set_discriminator_key
380
+ rescue
381
+ end
382
+ end
383
+
384
+ it "raises an error" do
385
+ expect do
386
+ set_discriminator_key
387
+ end.to raise_error(Mongoid::Errors::InvalidDiscriminatorKeyTarget)
388
+ end
389
+
390
+ it "doesn't change in that class" do
391
+ expect(Guitar.discriminator_key).to eq("_type")
392
+ end
393
+
394
+ it "doesn't change the global setting" do
395
+ expect(Mongoid.discriminator_key).to eq("_type")
396
+ end
397
+
398
+ it "doesn't change in the sibling" do
399
+ expect(Piano.discriminator_key).to eq("_type")
400
+ end
401
+
402
+ it "doesn't change in the parent" do
403
+ expect(Instrument.discriminator_key).to eq("_type")
404
+ end
405
+ end
406
+
407
+ context "when discriminator key is called on an instance" do
408
+
409
+ let(:guitar) do
410
+ Guitar.new
411
+ end
412
+
413
+ it "raises an error on setter" do
414
+ expect do
415
+ guitar.discriminator_key = "hello3"
416
+ end.to raise_error(NoMethodError)
417
+ end
418
+
419
+ it "raises an error on getter" do
420
+ expect do
421
+ guitar.discriminator_key
422
+ end.to raise_error(NoMethodError)
423
+ end
424
+ end
425
+
426
+ context ".fields" do
427
+ context "when the discriminator key is not changed" do
428
+ it "creates a _type field in the parent" do
429
+ expect(Instrument.fields.keys).to include("_type")
430
+ end
431
+
432
+ it "creates a _type field in the child: Guitar" do
433
+ expect(Guitar.fields.keys).to include("_type")
434
+ end
435
+
436
+ it "creates a _type field in the child: Piano" do
437
+ expect(Piano.fields.keys).to include("_type")
438
+ end
439
+ end
440
+
441
+ context "when the discriminator key is changed at the base level" do
442
+ context "after class creation" do
443
+ before do
444
+ class GlobalDiscriminatorParent
445
+ include Mongoid::Document
446
+ end
447
+
448
+ class GlobalDiscriminatorChild < GlobalDiscriminatorParent
449
+ end
450
+
451
+ Mongoid.discriminator_key = "test"
452
+ end
453
+
454
+ after do
455
+ Mongoid.discriminator_key = "_type"
456
+ end
457
+
458
+ it "creates a field with the old global value in the parent" do
459
+ expect(GlobalDiscriminatorParent.fields.keys).to include("_type")
460
+ end
461
+
462
+ it "creates a field with the old global value in the child" do
463
+ expect(GlobalDiscriminatorChild.fields.keys).to include("_type")
464
+ end
465
+
466
+ it "does not have the new global value in the parent" do
467
+ expect(GlobalDiscriminatorParent.fields.keys).to_not include("test")
468
+ end
469
+
470
+ it "does not have the new global value in the child" do
471
+ expect(GlobalDiscriminatorChild.fields.keys).to_not include("test")
472
+ end
473
+
474
+ end
475
+
476
+ context "before class creation" do
477
+ before do
478
+ Mongoid.discriminator_key = "test"
479
+
480
+ class PreGlobalDiscriminatorParent
481
+ include Mongoid::Document
482
+ end
483
+
484
+ class PreGlobalDiscriminatorChild < PreGlobalDiscriminatorParent
485
+ end
486
+ end
487
+
488
+ after do
489
+ Mongoid.discriminator_key = "_type"
490
+ end
491
+
492
+ it "creates a field with new discriminator key in the parent" do
493
+ expect(PreGlobalDiscriminatorParent.fields.keys).to include("test")
494
+ end
495
+
496
+ it "creates a field with new discriminator key in the child" do
497
+ expect(PreGlobalDiscriminatorChild.fields.keys).to include("test")
498
+ end
499
+
500
+ it "does not have the original discriminator key in the parent" do
501
+ expect(PreGlobalDiscriminatorParent.fields.keys).to_not include("_type")
502
+ end
503
+
504
+ it "does not have the original discriminator key in the child" do
505
+ expect(PreGlobalDiscriminatorChild.fields.keys).to_not include("_type")
506
+ end
507
+ end
508
+ end
509
+
510
+ context "when the discriminator key is changed in the parent" do
511
+ context "after child class creation" do
512
+ before do
513
+ class LocalDiscriminatorParent
514
+ include Mongoid::Document
515
+ end
516
+
517
+ class LocalDiscriminatorChild < LocalDiscriminatorParent
518
+ end
519
+
520
+ LocalDiscriminatorParent.discriminator_key = "test2"
521
+ end
522
+
523
+ it "creates a new field in the parent" do
524
+ expect(LocalDiscriminatorParent.fields.keys).to include("test2")
525
+ end
526
+
527
+ it "does not remove the original field in the parent" do
528
+ expect(LocalDiscriminatorParent.fields.keys).to include("_type")
529
+ end
530
+
531
+ it "still has _type field in the child" do
532
+ expect(LocalDiscriminatorChild.fields.keys).to include("_type")
533
+ end
534
+
535
+ it "has the new field in the child" do
536
+ expect(LocalDiscriminatorChild.fields.keys).to include("test2")
537
+ end
538
+ end
539
+
540
+ context "before child class creation" do
541
+ before do
542
+ class PreLocalDiscriminatorParent
543
+ include Mongoid::Document
544
+ self.discriminator_key = "test2"
545
+ end
546
+
547
+ class PreLocalDiscriminatorChild < PreLocalDiscriminatorParent
548
+ end
549
+ end
550
+
551
+ it "creates a new field in the parent" do
552
+ expect(PreLocalDiscriminatorParent.fields.keys).to include("test2")
553
+ end
554
+
555
+ it "does not create the _type field in the parent" do
556
+ expect(PreLocalDiscriminatorParent.fields.keys).to_not include("_type")
557
+ end
558
+
559
+ it "creates a new field in the child" do
560
+ expect(PreLocalDiscriminatorChild.fields.keys).to include("test2")
561
+ end
562
+ end
563
+
564
+ context "when there's no child class" do
565
+ before do
566
+ class LocalDiscriminatorNonParent
567
+ include Mongoid::Document
568
+ self.discriminator_key = "test2"
569
+ end
570
+ end
571
+
572
+ it "does not create a _type field" do
573
+ expect(LocalDiscriminatorNonParent.fields.keys).to_not include("_type")
574
+ end
575
+
576
+ it "does not create a new field" do
577
+ expect(LocalDiscriminatorNonParent.fields.keys).to_not include("test2")
578
+ end
579
+ end
580
+ end
581
+ end
582
+
583
+ context "when setting the discriminator key as a symbol" do
584
+ context "when the discriminator key is changed at the base level" do
585
+ context "after class creation" do
586
+ before do
587
+ class GlobalSymDiscriminatorParent
588
+ include Mongoid::Document
589
+ end
590
+
591
+ class GlobalSymDiscriminatorChild < GlobalSymDiscriminatorParent
592
+ end
593
+
594
+ Mongoid.discriminator_key = :test
595
+ end
596
+
597
+ after do
598
+ Mongoid.discriminator_key = "_type"
599
+ end
600
+
601
+ it "gets converted to a string in the parent" do
602
+ expect(GlobalSymDiscriminatorParent.fields.keys).to_not include("test")
603
+ end
604
+
605
+ it "gets converted to a string in the child" do
606
+ expect(GlobalSymDiscriminatorChild.fields.keys).to_not include("test")
607
+ end
608
+
609
+ it "is a string globally" do
610
+ expect(Mongoid.discriminator_key).to eq("test")
611
+ end
612
+
613
+ it "is a string in the parent" do
614
+ expect(GlobalSymDiscriminatorParent.discriminator_key).to eq("test")
615
+ end
616
+
617
+ it "is a string in the child" do
618
+ expect(GlobalSymDiscriminatorChild.discriminator_key).to eq("test")
619
+ end
620
+ end
621
+
622
+ context "before class creation" do
623
+ before do
624
+ Mongoid.discriminator_key = :test
625
+
626
+ class PreGlobalSymDiscriminatorParent
627
+ include Mongoid::Document
628
+ end
629
+
630
+ class PreGlobalSymDiscriminatorChild < PreGlobalSymDiscriminatorParent
631
+ end
632
+ end
633
+
634
+ after do
635
+ Mongoid.discriminator_key = "_type"
636
+ end
637
+
638
+ it "creates a field with new discriminator key as a string in the parent" do
639
+ expect(PreGlobalSymDiscriminatorParent.fields.keys).to include("test")
640
+ end
641
+
642
+ it "creates a field with new discriminator key as a string in the child" do
643
+ expect(PreGlobalSymDiscriminatorChild.fields.keys).to include("test")
644
+ end
645
+
646
+ it "is a string globally" do
647
+ expect(Mongoid.discriminator_key).to eq("test")
648
+ end
649
+
650
+ it "is a string in the parent" do
651
+ expect(PreGlobalSymDiscriminatorParent.discriminator_key).to eq("test")
652
+ end
653
+
654
+ it "is a string in the child" do
655
+ expect(PreGlobalSymDiscriminatorChild.discriminator_key).to eq("test")
656
+ end
657
+ end
658
+ end
659
+
660
+ context "when the discriminator key is changed in the parent" do
661
+ context "after child class creation" do
662
+ before do
663
+ class LocalSymDiscriminatorParent
664
+ include Mongoid::Document
665
+ end
666
+
667
+ class LocalSymDiscriminatorChild < LocalSymDiscriminatorParent
668
+ end
669
+
670
+ LocalSymDiscriminatorParent.discriminator_key = :test2
671
+ end
672
+
673
+ it "creates a new field of type string in the parent" do
674
+ expect(LocalSymDiscriminatorParent.fields.keys).to include("test2")
675
+ end
676
+
677
+ it "creates a new field of type string in the child" do
678
+ expect(LocalSymDiscriminatorChild.fields.keys).to include("test2")
679
+ end
680
+
681
+ it "is a string in the parent" do
682
+ expect(LocalSymDiscriminatorParent.discriminator_key).to eq("test2")
683
+ end
684
+
685
+ it "is a string in the child" do
686
+ expect(LocalSymDiscriminatorChild.discriminator_key).to eq("test2")
687
+ end
688
+ end
689
+
690
+ context "before child class creation" do
691
+ before do
692
+ class PreLocalSymDiscriminatorParent
693
+ include Mongoid::Document
694
+ self.discriminator_key = :test2
695
+ end
696
+
697
+ class PreLocalSymDiscriminatorChild < PreLocalSymDiscriminatorParent
698
+ end
699
+ end
700
+
701
+ it "creates a new field of type string in the parent" do
702
+ expect(PreLocalSymDiscriminatorParent.fields.keys).to include("test2")
703
+ end
704
+
705
+ it "creates a new field of type string in the child" do
706
+ expect(PreLocalSymDiscriminatorChild.fields.keys).to include("test2")
707
+ end
708
+
709
+ it "is a string in the parent" do
710
+ expect(PreLocalSymDiscriminatorParent.discriminator_key).to eq("test2")
711
+ end
712
+
713
+ it "is a string in the child" do
714
+ expect(PreLocalSymDiscriminatorChild.discriminator_key).to eq("test2")
715
+ end
716
+ end
717
+ end
718
+ end
719
+
720
+ context "when setting the discriminator key as" do
721
+ context "a number" do
722
+ before do
723
+ Instrument.discriminator_key = 3
724
+ end
725
+
726
+ after do
727
+ Instrument.discriminator_key = nil
728
+ end
729
+
730
+ it "gets converted to a string" do
731
+ expect(Instrument.fields.keys).to include("3")
732
+ end
733
+
734
+ it "is a string in the parent" do
735
+ expect(Instrument.discriminator_key).to eq("3")
736
+ end
737
+
738
+ it "is a string in the child: Guitar" do
739
+ expect(Guitar.discriminator_key).to eq("3")
740
+ end
741
+
742
+ it "is a string in the child: Piano" do
743
+ expect(Piano.discriminator_key).to eq("3")
744
+ end
745
+ end
746
+
747
+ context "a boolean" do
748
+ before do
749
+ Instrument.discriminator_key = true
750
+ end
751
+
752
+ after do
753
+ Instrument.discriminator_key = nil
754
+ end
755
+
756
+ it "gets converted to a string" do
757
+ expect(Instrument.fields.keys).to include("true")
758
+ end
759
+
760
+ it "is a string in the parent" do
761
+ expect(Instrument.discriminator_key).to eq("true")
762
+ end
763
+
764
+ it "is a string in the child: Guitar" do
765
+ expect(Guitar.discriminator_key).to eq("true")
766
+ end
767
+
768
+ it "is a string in the child: Piano" do
769
+ expect(Piano.discriminator_key).to eq("true")
770
+ end
771
+ end
772
+ end
773
+
774
+ context "when setting a field equal to discriminator key and duplicate_fields_exception is true" do
775
+ before do
776
+ Mongoid.duplicate_fields_exception = true
777
+
778
+ class DuplicateDiscriminatorKeyParent
779
+ include Mongoid::Document
780
+ field :dkey, type: String
781
+ end
782
+
783
+ class DuplicateDiscriminatorKeyChild < DuplicateDiscriminatorKeyParent
784
+ end
785
+ end
786
+
787
+ after do
788
+ Mongoid.duplicate_fields_exception = false
789
+ end
790
+
791
+ it "does not raise an error" do
792
+ expect do
793
+ DuplicateDiscriminatorKeyParent.discriminator_key = "dkey"
794
+ end.to_not raise_error
795
+ end
796
+ end
797
+
798
+ context "when the discriminator key conflicts with mongoid's internals" do
799
+
800
+ after do
801
+ Person.discriminator_key = nil
802
+ end
803
+
804
+ [:_association, :invalid].each do |meth|
805
+ context "when the field is named #{meth}" do
806
+
807
+ it "raises an error" do
808
+ expect {
809
+ Person.discriminator_key = meth
810
+ }.to raise_error(Mongoid::Errors::InvalidField)
811
+ end
812
+ end
813
+ end
814
+ end
815
+
816
+ context "when setting a field equal to global discriminator key and duplicate_fields_exception is true" do
817
+ before do
818
+ Mongoid.duplicate_fields_exception = true
819
+ Mongoid.discriminator_key = "dkey"
820
+
821
+ class GlobalDuplicateDiscriminatorKeyParent
822
+ include Mongoid::Document
823
+ end
824
+
825
+ class GlobalDuplicateDiscriminatorKeyChild < GlobalDuplicateDiscriminatorKeyParent
826
+ end
827
+ end
828
+
829
+ after do
830
+ Mongoid.duplicate_fields_exception = false
831
+ Mongoid.discriminator_key = "_type"
832
+ end
833
+
834
+ it "raises an error" do
835
+ expect do
836
+ GlobalDuplicateDiscriminatorKeyParent.class_eval do
837
+ field("dkey")
838
+ end
839
+ end.to raise_error(Mongoid::Errors::InvalidField)
840
+ end
841
+ end
842
+
843
+ context "when the global discriminator key conflicts with mongoid's internals" do
844
+
845
+ after do
846
+ Mongoid.discriminator_key = "_type"
847
+ end
848
+
849
+ [:_association, :invalid].each do |meth|
850
+ context "when the field is named #{meth}" do
851
+
852
+ it "raises an error" do
853
+ expect do
854
+ Mongoid.discriminator_key = meth
855
+ end.to raise_error(Mongoid::Errors::InvalidField)
856
+ end
857
+ end
858
+ end
859
+ end
860
+ end
861
+
862
+ describe "#discriminator_value" do
863
+
864
+ context "when the discriminator value is not set" do
865
+
866
+ it "has the correct discriminator_value" do
867
+ expect(Guitar.discriminator_value).to eq("Guitar")
868
+ end
869
+
870
+ it "has the correct discriminator_value" do
871
+ expect(Piano.discriminator_value).to eq("Piano")
872
+ end
873
+
874
+ it "has the correct discriminator_value" do
875
+ expect(Instrument.discriminator_value).to eq("Instrument")
876
+ end
877
+ end
878
+
879
+
880
+ context "when the discriminator value is set on the child class" do
881
+ before do
882
+ Guitar.discriminator_value = "some string instrument"
883
+ end
884
+
885
+ after do
886
+ Guitar.discriminator_value = nil
887
+ end
888
+
889
+ it "has the correct discriminator_value" do
890
+ expect(Guitar.discriminator_value).to eq("some string instrument")
891
+ end
892
+
893
+ it "does not change the sibling's discriminator value" do
894
+ expect(Piano.discriminator_value).to eq("Piano")
895
+ end
896
+
897
+ it "does not change the parent's discriminator value" do
898
+ expect(Instrument.discriminator_value).to eq("Instrument")
899
+ end
900
+ end
901
+
902
+ context "when the discriminator value is set on the parent" do
903
+ before do
904
+ Instrument.discriminator_value = "musical thingy"
905
+ end
906
+
907
+ after do
908
+ Instrument.discriminator_value = nil
909
+ end
910
+
911
+ it "is changed in the parent" do
912
+ expect(Instrument.discriminator_value).to eq("musical thingy")
913
+ end
914
+
915
+ it "is not changed in the child: Guitar" do
916
+ expect(Guitar.discriminator_value).to eq("Guitar")
917
+ end
918
+
919
+ it "is not changed in the child: Piano" do
920
+ expect(Piano.discriminator_value).to eq("Piano")
921
+ end
922
+ end
923
+
924
+ context "when setting the discriminator value to nil" do
925
+ before do
926
+ Guitar.discriminator_value = "some string instrument"
927
+ Guitar.discriminator_value = nil
928
+ end
929
+
930
+ it "reverts back to default" do
931
+ expect(Guitar.discriminator_value).to eq("Guitar")
932
+ end
933
+ end
934
+
935
+ context "when setting discriminator value on parent that is also a child" do
936
+ before do
937
+ Browser.discriminator_value = "something"
938
+ end
939
+
940
+ after do
941
+ Browser.discriminator_value = nil
942
+ end
943
+
944
+ it "has the correct value in the parent" do
945
+ expect(Browser.discriminator_value).to eq("something")
946
+ end
947
+
948
+ it "doesn't set the grandchild's discriminator value" do
949
+ expect(Firefox.discriminator_value).to eq("Firefox")
950
+ end
951
+ end
952
+
953
+ describe ".fields" do
954
+
955
+ let(:guitar) do
956
+ Guitar.new
957
+ end
958
+
959
+ let(:piano) do
960
+ Piano.new
961
+ end
962
+
963
+ let(:instrument) do
964
+ Instrument.new
965
+ end
966
+
967
+ context "when the discriminator value is not set" do
968
+ it "has the correct discriminator_value" do
969
+ expect(guitar._type).to eq("Guitar")
970
+ end
971
+
972
+ it "has the correct discriminator_value" do
973
+ expect(piano._type).to eq("Piano")
974
+ end
975
+
976
+ it "has the correct discriminator_value" do
977
+ expect(instrument._type).to eq("Instrument")
978
+ end
979
+ end
980
+
981
+ context "when the discriminator value is set on the child class" do
982
+ before do
983
+ Guitar.discriminator_value = "some string instrument"
984
+ end
985
+
986
+ after do
987
+ Guitar.discriminator_value = nil
988
+ end
989
+
990
+ it "has the correct discriminator_value" do
991
+ expect(guitar._type).to eq("some string instrument")
992
+ end
993
+
994
+ it "does not change the sibling's discriminator value" do
995
+ expect(piano._type).to eq("Piano")
996
+ end
997
+
998
+ it "does not change the parent's discriminator value" do
999
+ expect(instrument._type).to eq("Instrument")
1000
+ end
1001
+
1002
+ it "retrieves the correct discriminator_mapping from the parent" do
1003
+ expect(
1004
+ Instrument.get_discriminator_mapping("some string instrument")
1005
+ ).to eq(Guitar)
1006
+ end
1007
+
1008
+ it "retrieves the correct discriminator_mapping from the child: Guitar" do
1009
+ expect(
1010
+ Guitar.get_discriminator_mapping("some string instrument")
1011
+ ).to eq(Guitar)
1012
+ end
1013
+
1014
+ it "is not retrieved from the sibling" do
1015
+ expect(
1016
+ Piano.get_discriminator_mapping("some string instrument")
1017
+ ).to be nil
1018
+ end
1019
+ end
1020
+
1021
+ context "when the discriminator value is set on the parent" do
1022
+ before do
1023
+ Instrument.discriminator_value = "musical thingy"
1024
+ end
1025
+
1026
+ after do
1027
+ Instrument.discriminator_value = nil
1028
+ end
1029
+
1030
+ it "is changed in the parent" do
1031
+ expect(instrument._type).to eq("musical thingy")
1032
+ end
1033
+
1034
+ it "is not changed in the child: Guitar" do
1035
+ expect(guitar._type).to eq("Guitar")
1036
+ end
1037
+
1038
+ it "is not changed in the child: Piano" do
1039
+ expect(piano._type).to eq("Piano")
1040
+ end
1041
+
1042
+ it "retrieves the correct discriminator_mapping from the parent" do
1043
+ expect(
1044
+ Instrument.get_discriminator_mapping("musical thingy")
1045
+ ).to eq(Instrument)
1046
+ end
1047
+
1048
+ it "is not retrieved from the child: Guitar" do
1049
+ expect(
1050
+ Guitar.get_discriminator_mapping("musical thingy")
1051
+ ).to be nil
1052
+ end
1053
+
1054
+ it "is not retrieved from the child: Piano" do
1055
+ expect(
1056
+ Piano.get_discriminator_mapping("musical thingy")
1057
+ ).to be nil
1058
+ end
1059
+ end
1060
+
1061
+ context "when setting the discriminator value to nil" do
1062
+ before do
1063
+ Guitar.discriminator_value = "some string instrument"
1064
+ Guitar.discriminator_value = nil
1065
+ end
1066
+
1067
+ it "reverts back to default" do
1068
+ expect(guitar._type).to eq("Guitar")
1069
+ end
1070
+
1071
+ it "retrieves the correct discriminator_mapping" do
1072
+ expect(
1073
+ Instrument.get_discriminator_mapping("Guitar")
1074
+ ).to eq(Guitar)
1075
+ end
1076
+
1077
+ it "retrieves the old discriminator_mapping" do
1078
+ expect(
1079
+ Instrument.get_discriminator_mapping("some string instrument")
1080
+ ).to eq(Guitar)
1081
+ end
1082
+ end
1083
+
1084
+ context "when setting discriminator value on parent that is also a child" do
1085
+ before do
1086
+ Browser.discriminator_value = "something"
1087
+ end
1088
+
1089
+ after do
1090
+ Browser.discriminator_value = nil
1091
+ end
1092
+
1093
+ let(:browser) do
1094
+ Browser.new
1095
+ end
1096
+
1097
+ let(:firefox) do
1098
+ Firefox.new
1099
+ end
1100
+
1101
+ it "has the correct value in the parent" do
1102
+ expect(browser._type).to eq("something")
1103
+ end
1104
+
1105
+ it "doesn't set the grandchild's discriminator value" do
1106
+ expect(firefox._type).to eq("Firefox")
1107
+ end
1108
+
1109
+ it "retrieves the correct discriminator_mapping from the grandparent" do
1110
+ expect(
1111
+ Canvas.get_discriminator_mapping("something")
1112
+ ).to eq(Browser)
1113
+ end
1114
+
1115
+ it "retrieves the correct discriminator_mapping from the parent" do
1116
+ expect(
1117
+ Browser.get_discriminator_mapping("something")
1118
+ ).to eq(Browser)
1119
+ end
1120
+
1121
+ it "is not retrieved from the grandchild" do
1122
+ expect(
1123
+ Firefox.get_discriminator_mapping("something")
1124
+ ).to be nil
1125
+ end
1126
+ end
1127
+
1128
+ context "when changing the discriminator key" do
1129
+ before do
1130
+ Instrument.discriminator_key = "dkey"
1131
+ Guitar.discriminator_value = "string instrument"
1132
+ end
1133
+
1134
+ after do
1135
+ Instrument.discriminator_key = nil
1136
+ Guitar.discriminator_value = nil
1137
+ end
1138
+
1139
+ let(:guitar) do
1140
+ Guitar.new
1141
+ end
1142
+
1143
+ it "has the correct discriminator_value for the new discriminator_key" do
1144
+ expect(guitar.dkey).to eq("string instrument")
1145
+ end
1146
+
1147
+ it "has the correct discriminator_value for the old discriminator_key" do
1148
+ expect(guitar._type).to eq("string instrument")
1149
+ end
1150
+
1151
+ it "retrieves the correct discriminator_mapping from the parent" do
1152
+ expect(
1153
+ Instrument.get_discriminator_mapping("string instrument")
1154
+ ).to eq(Guitar)
1155
+ end
1156
+
1157
+ it "retrieves the correct discriminator_mapping from the child: Guitar" do
1158
+ expect(
1159
+ Guitar.get_discriminator_mapping("string instrument")
1160
+ ).to eq(Guitar)
1161
+ end
1162
+
1163
+ it "is not retrieved from the sibling" do
1164
+ expect(
1165
+ Piano.get_discriminator_mapping("string instrument")
1166
+ ).to be nil
1167
+ end
1168
+ end
1169
+
1170
+ context "when the discriminator value is set twice" do
1171
+ before do
1172
+ Instrument.discriminator_value = "something"
1173
+ Instrument.discriminator_value = "musical thingy"
1174
+ end
1175
+
1176
+ after do
1177
+ Instrument.discriminator_value = nil
1178
+ end
1179
+
1180
+ it "is changed in the parent" do
1181
+ expect(instrument._type).to eq("musical thingy")
1182
+ end
1183
+
1184
+ it "is not changed in the child: Guitar" do
1185
+ expect(guitar._type).to eq("Guitar")
1186
+ end
1187
+
1188
+ it "is not changed in the child: Piano" do
1189
+ expect(piano._type).to eq("Piano")
1190
+ end
1191
+
1192
+ it "retrieves the correct discriminator_mapping from the parent" do
1193
+ expect(
1194
+ Instrument.get_discriminator_mapping("musical thingy")
1195
+ ).to eq(Instrument)
1196
+ end
1197
+
1198
+ it "is not retrieved from the child: Guitar" do
1199
+ expect(
1200
+ Guitar.get_discriminator_mapping("musical thingy")
1201
+ ).to be nil
1202
+ end
1203
+
1204
+ it "ris not retrieved from the child: Piano" do
1205
+ expect(
1206
+ Piano.get_discriminator_mapping("musical thingy")
1207
+ ).to be nil
1208
+ end
1209
+ end
1210
+ end
1211
+
1212
+ context "when using the Class.new syntax" do
1213
+ context "when assigning to a constant" do
1214
+ before :all do
1215
+ NewClassPerson = Class.new(Person)
1216
+ NewClassPerson2 = Class.new(NewClassPerson)
1217
+ end
1218
+
1219
+ it "has the correct discriminator_value when doing one Class.new" do
1220
+ expect(NewClassPerson.discriminator_value).to eq('NewClassPerson')
1221
+ end
1222
+
1223
+ it "has the correct discriminator_value when doing two Class.new's" do
1224
+ expect(NewClassPerson2.discriminator_value).to eq('NewClassPerson2')
1225
+ end
1226
+ end
1227
+ end
1228
+ end
1229
+
1230
+ describe "#discriminator_mapping" do
1231
+ context "when not changing discriminator_mappings" do
1232
+ it "has the class name as the value: Instrument" do
1233
+ expect(
1234
+ Instrument.get_discriminator_mapping("Instrument")
1235
+ ).to eq(Instrument)
1236
+ end
1237
+
1238
+ it "has the class name as the value: Guitar" do
1239
+ expect(
1240
+ Guitar.get_discriminator_mapping("Guitar")
1241
+ ).to eq(Guitar)
1242
+ end
1243
+
1244
+ it "has the class name as the value: Piano" do
1245
+ expect(
1246
+ Piano.get_discriminator_mapping("Piano")
1247
+ ).to eq(Piano)
1248
+ end
1249
+ end
1250
+
1251
+ context "when adding to the parent" do
1252
+ before do
1253
+ Instrument.add_discriminator_mapping("some_dmap")
1254
+ end
1255
+
1256
+ after do
1257
+ Instrument.add_discriminator_mapping("Instrument")
1258
+ end
1259
+
1260
+ it "can be retrieved from the parent" do
1261
+ expect(
1262
+ Instrument.get_discriminator_mapping("some_dmap")
1263
+ ).to eq(Instrument)
1264
+ end
1265
+
1266
+ it "can be retrieved from the child: Guitar" do
1267
+ expect(
1268
+ Guitar.get_discriminator_mapping("some_dmap")
1269
+ ).to be nil
1270
+ end
1271
+
1272
+ it "can be retrieved from the child: Piano" do
1273
+ expect(
1274
+ Piano.get_discriminator_mapping("some_dmap")
1275
+ ).to be nil
1276
+ end
1277
+ end
1278
+
1279
+ context "when adding to the child" do
1280
+ before do
1281
+ Guitar.add_discriminator_mapping("something")
1282
+ end
1283
+
1284
+ after do
1285
+ Guitar.add_discriminator_mapping("Guitar")
1286
+ end
1287
+
1288
+ it "can be retrieved from the parent" do
1289
+ expect(
1290
+ Instrument.get_discriminator_mapping("something")
1291
+ ).to eq(Guitar)
1292
+ end
1293
+
1294
+ it "can be retrieved from the child: Guitar" do
1295
+ expect(
1296
+ Guitar.get_discriminator_mapping("something")
1297
+ ).to eq(Guitar)
1298
+ end
1299
+
1300
+ it "is not retrieved from the sibling" do
1301
+ expect(
1302
+ Piano.get_discriminator_mapping("something")
1303
+ ).to be nil
1304
+ end
1305
+ end
1306
+
1307
+ context "when adding to the same class twice" do
1308
+ before do
1309
+ Guitar.add_discriminator_mapping("something")
1310
+ Guitar.add_discriminator_mapping("something else")
1311
+ end
1312
+
1313
+ after do
1314
+ Guitar.add_discriminator_mapping("Guitar")
1315
+ end
1316
+
1317
+ it "retrieves the new value from the parent" do
1318
+ expect(
1319
+ Instrument.get_discriminator_mapping("something else")
1320
+ ).to eq(Guitar)
1321
+ end
1322
+
1323
+ it "retrieves the new value from the child: Guitar" do
1324
+ expect(
1325
+ Guitar.get_discriminator_mapping("something else")
1326
+ ).to eq(Guitar)
1327
+ end
1328
+
1329
+ it "is not retrieved from the sibling" do
1330
+ expect(
1331
+ Piano.get_discriminator_mapping("something else")
1332
+ ).to be nil
1333
+ end
1334
+
1335
+ it "retrieves the old value from the parent" do
1336
+ expect(
1337
+ Instrument.get_discriminator_mapping("something")
1338
+ ).to eq(Guitar)
1339
+ end
1340
+
1341
+ it "retrieves the old value from the child: Guitar" do
1342
+ expect(
1343
+ Guitar.get_discriminator_mapping("something")
1344
+ ).to eq(Guitar)
1345
+ end
1346
+
1347
+ it "does not retrieves the old value from the sibling" do
1348
+ expect(
1349
+ Piano.get_discriminator_mapping("something")
1350
+ ).to be nil
1351
+ end
1352
+ end
1353
+ end
254
1354
  end