mongoid 7.1.0.rc0 → 7.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (508) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +6 -6
  5. data/LICENSE +1 -1
  6. data/README.md +14 -7
  7. data/Rakefile +21 -0
  8. data/lib/config/locales/en.yml +42 -6
  9. data/lib/mongoid.rb +26 -2
  10. data/lib/mongoid/association/accessors.rb +37 -2
  11. data/lib/mongoid/association/depending.rb +1 -6
  12. data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
  13. data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
  14. data/lib/mongoid/association/many.rb +5 -4
  15. data/lib/mongoid/association/proxy.rb +6 -4
  16. data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
  17. data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
  18. data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
  19. data/lib/mongoid/association/referenced/eager.rb +29 -9
  20. data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
  21. data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
  22. data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
  23. data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
  24. data/lib/mongoid/atomic.rb +13 -3
  25. data/lib/mongoid/atomic/modifiers.rb +1 -1
  26. data/lib/mongoid/attributes.rb +28 -20
  27. data/lib/mongoid/attributes/dynamic.rb +1 -1
  28. data/lib/mongoid/clients/factory.rb +19 -2
  29. data/lib/mongoid/clients/options.rb +8 -8
  30. data/lib/mongoid/clients/sessions.rb +20 -4
  31. data/lib/mongoid/clients/storage_options.rb +5 -5
  32. data/lib/mongoid/composable.rb +1 -0
  33. data/lib/mongoid/config.rb +45 -12
  34. data/lib/mongoid/config/options.rb +5 -2
  35. data/lib/mongoid/contextual.rb +5 -4
  36. data/lib/mongoid/contextual/geo_near.rb +3 -2
  37. data/lib/mongoid/contextual/map_reduce.rb +3 -2
  38. data/lib/mongoid/contextual/mongo.rb +25 -5
  39. data/lib/mongoid/copyable.rb +2 -2
  40. data/lib/mongoid/criteria.rb +80 -11
  41. data/lib/mongoid/criteria/modifiable.rb +2 -1
  42. data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
  43. data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
  44. data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
  45. data/lib/mongoid/criteria/queryable/key.rb +1 -1
  46. data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
  47. data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
  48. data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
  49. data/lib/mongoid/criteria/queryable/selector.rb +3 -3
  50. data/lib/mongoid/criteria/queryable/storable.rb +106 -101
  51. data/lib/mongoid/document.rb +15 -3
  52. data/lib/mongoid/errors.rb +7 -0
  53. data/lib/mongoid/errors/eager_load.rb +2 -0
  54. data/lib/mongoid/errors/invalid_discriminator_key_target.rb +25 -0
  55. data/lib/mongoid/errors/invalid_elem_match_operator.rb +33 -0
  56. data/lib/mongoid/errors/invalid_estimated_count_criteria.rb +26 -0
  57. data/lib/mongoid/errors/invalid_expression_operator.rb +28 -0
  58. data/lib/mongoid/errors/invalid_field_operator.rb +33 -0
  59. data/lib/mongoid/errors/invalid_query.rb +41 -0
  60. data/lib/mongoid/errors/no_client_config.rb +2 -2
  61. data/lib/mongoid/errors/no_default_client.rb +1 -1
  62. data/lib/mongoid/extensions/hash.rb +4 -2
  63. data/lib/mongoid/extensions/regexp.rb +1 -1
  64. data/lib/mongoid/factory.rb +27 -10
  65. data/lib/mongoid/fields.rb +2 -1
  66. data/lib/mongoid/fields/standard.rb +2 -1
  67. data/lib/mongoid/fields/validators/macro.rb +26 -10
  68. data/lib/mongoid/findable.rb +55 -18
  69. data/lib/mongoid/indexable.rb +2 -2
  70. data/lib/mongoid/interceptable.rb +5 -1
  71. data/lib/mongoid/matchable.rb +1 -149
  72. data/lib/mongoid/matcher.rb +127 -0
  73. data/lib/mongoid/matcher/all.rb +22 -0
  74. data/lib/mongoid/matcher/and.rb +21 -0
  75. data/lib/mongoid/matcher/elem_match.rb +35 -0
  76. data/lib/mongoid/matcher/elem_match_expression.rb +20 -0
  77. data/lib/mongoid/matcher/eq.rb +11 -0
  78. data/lib/mongoid/matcher/eq_impl.rb +32 -0
  79. data/lib/mongoid/matcher/eq_impl_with_regexp.rb +21 -0
  80. data/lib/mongoid/matcher/exists.rb +15 -0
  81. data/lib/mongoid/matcher/expression.rb +40 -0
  82. data/lib/mongoid/matcher/expression_operator.rb +19 -0
  83. data/lib/mongoid/matcher/field_expression.rb +63 -0
  84. data/lib/mongoid/matcher/field_operator.rb +52 -0
  85. data/lib/mongoid/matcher/gt.rb +17 -0
  86. data/lib/mongoid/matcher/gte.rb +17 -0
  87. data/lib/mongoid/matcher/in.rb +25 -0
  88. data/lib/mongoid/matcher/lt.rb +17 -0
  89. data/lib/mongoid/matcher/lte.rb +17 -0
  90. data/lib/mongoid/matcher/ne.rb +16 -0
  91. data/lib/mongoid/matcher/nin.rb +11 -0
  92. data/lib/mongoid/matcher/nor.rb +25 -0
  93. data/lib/mongoid/matcher/not.rb +29 -0
  94. data/lib/mongoid/matcher/or.rb +21 -0
  95. data/lib/mongoid/matcher/regex.rb +41 -0
  96. data/lib/mongoid/matcher/size.rb +26 -0
  97. data/lib/mongoid/persistable/deletable.rb +1 -1
  98. data/lib/mongoid/persistable/pushable.rb +11 -2
  99. data/lib/mongoid/persistence_context.rb +6 -6
  100. data/lib/mongoid/query_cache.rb +83 -38
  101. data/lib/mongoid/railties/database.rake +7 -0
  102. data/lib/mongoid/reloadable.rb +2 -2
  103. data/lib/mongoid/serializable.rb +11 -3
  104. data/lib/mongoid/shardable.rb +56 -4
  105. data/lib/mongoid/tasks/database.rake +10 -5
  106. data/lib/mongoid/tasks/database.rb +83 -0
  107. data/lib/mongoid/timestamps/timeless.rb +3 -1
  108. data/lib/mongoid/traversable.rb +111 -4
  109. data/lib/mongoid/validatable/uniqueness.rb +1 -1
  110. data/lib/mongoid/version.rb +1 -1
  111. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
  112. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
  113. data/spec/integration/app_spec.rb +254 -0
  114. data/spec/integration/associations/embedded_spec.rb +148 -0
  115. data/spec/integration/associations/has_many_spec.rb +69 -0
  116. data/spec/integration/associations/has_one_spec.rb +69 -0
  117. data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
  118. data/spec/integration/atomic/modifiers_spec.rb +117 -0
  119. data/spec/integration/bson_regexp_raw_spec.rb +20 -0
  120. data/spec/integration/criteria/date_field_spec.rb +41 -0
  121. data/spec/integration/criteria/logical_spec.rb +13 -0
  122. data/spec/integration/discriminator_key_spec.rb +354 -0
  123. data/spec/integration/discriminator_value_spec.rb +207 -0
  124. data/spec/integration/document_spec.rb +22 -0
  125. data/spec/integration/{matchable_spec.rb → matcher_examples_spec.rb} +120 -41
  126. data/spec/integration/matcher_operator_data/all.yml +140 -0
  127. data/spec/integration/matcher_operator_data/and.yml +93 -0
  128. data/spec/integration/matcher_operator_data/elem_match.yml +363 -0
  129. data/spec/integration/matcher_operator_data/elem_match_expr.yml +213 -0
  130. data/spec/integration/matcher_operator_data/eq.yml +191 -0
  131. data/spec/integration/matcher_operator_data/exists.yml +213 -0
  132. data/spec/integration/matcher_operator_data/generic_op.yml +17 -0
  133. data/spec/integration/matcher_operator_data/gt.yml +132 -0
  134. data/spec/integration/matcher_operator_data/gte.yml +132 -0
  135. data/spec/integration/matcher_operator_data/implicit.yml +331 -0
  136. data/spec/integration/matcher_operator_data/implicit_traversal.yml +16 -0
  137. data/spec/integration/matcher_operator_data/in.yml +194 -0
  138. data/spec/integration/matcher_operator_data/invalid_op.yml +59 -0
  139. data/spec/integration/matcher_operator_data/invalid_syntax.yml +39 -0
  140. data/spec/integration/matcher_operator_data/lt.yml +132 -0
  141. data/spec/integration/matcher_operator_data/lte.yml +132 -0
  142. data/spec/integration/matcher_operator_data/multiple.yml +29 -0
  143. data/spec/integration/matcher_operator_data/ne.yml +150 -0
  144. data/spec/integration/matcher_operator_data/nin.yml +114 -0
  145. data/spec/integration/matcher_operator_data/nor.yml +126 -0
  146. data/spec/integration/matcher_operator_data/not.yml +196 -0
  147. data/spec/integration/matcher_operator_data/or.yml +137 -0
  148. data/spec/integration/matcher_operator_data/regex.yml +174 -0
  149. data/spec/integration/matcher_operator_data/regex_options.yml +72 -0
  150. data/spec/integration/matcher_operator_data/size.yml +174 -0
  151. data/spec/integration/matcher_operator_spec.rb +100 -0
  152. data/spec/integration/matcher_spec.rb +189 -0
  153. data/spec/integration/server_query_spec.rb +142 -0
  154. data/spec/integration/shardable_spec.rb +149 -0
  155. data/spec/lite_spec_helper.rb +15 -4
  156. data/spec/mongoid/association/accessors_spec.rb +238 -63
  157. data/spec/mongoid/association/depending_spec.rb +78 -26
  158. data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
  159. data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
  160. data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
  161. data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
  162. data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
  163. data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
  164. data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
  165. data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
  166. data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
  167. data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
  168. data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
  169. data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
  170. data/spec/mongoid/atomic_spec.rb +23 -0
  171. data/spec/mongoid/attributes/nested_spec.rb +1 -1
  172. data/spec/mongoid/attributes_spec.rb +19 -7
  173. data/spec/mongoid/changeable_spec.rb +23 -0
  174. data/spec/mongoid/clients/factory_spec.rb +45 -8
  175. data/spec/mongoid/clients/options_spec.rb +11 -11
  176. data/spec/mongoid/clients/sessions_spec.rb +9 -10
  177. data/spec/mongoid/clients/transactions_spec.rb +20 -8
  178. data/spec/mongoid/clients_spec.rb +2 -2
  179. data/spec/mongoid/config_spec.rb +28 -0
  180. data/spec/mongoid/contextual/atomic_spec.rb +22 -11
  181. data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
  182. data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
  183. data/spec/mongoid/contextual/mongo_spec.rb +146 -69
  184. data/spec/mongoid/copyable_spec.rb +153 -1
  185. data/spec/mongoid/copyable_spec_models.rb +14 -0
  186. data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
  187. data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
  188. data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
  189. data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
  190. data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
  191. data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
  192. data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
  193. data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
  194. data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
  195. data/spec/mongoid/criteria_spec.rb +240 -41
  196. data/spec/mongoid/document_fields_spec.rb +29 -0
  197. data/spec/mongoid/document_persistence_context_spec.rb +33 -0
  198. data/spec/mongoid/document_spec.rb +89 -15
  199. data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
  200. data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
  201. data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
  202. data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
  203. data/spec/mongoid/factory_spec.rb +261 -28
  204. data/spec/mongoid/fields_spec.rb +72 -3
  205. data/spec/mongoid/findable_spec.rb +32 -0
  206. data/spec/mongoid/indexable_spec.rb +34 -6
  207. data/spec/mongoid/inspectable_spec.rb +29 -2
  208. data/spec/mongoid/interceptable_spec.rb +64 -2
  209. data/spec/mongoid/interceptable_spec_models.rb +76 -0
  210. data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +259 -0
  211. data/spec/mongoid/matcher/extract_attribute_spec.rb +47 -0
  212. data/spec/mongoid/persistable/creatable_spec.rb +108 -25
  213. data/spec/mongoid/persistable/deletable_spec.rb +86 -0
  214. data/spec/mongoid/persistable/pushable_spec.rb +55 -1
  215. data/spec/mongoid/persistable/savable_spec.rb +174 -16
  216. data/spec/mongoid/query_cache_middleware_spec.rb +16 -3
  217. data/spec/mongoid/query_cache_spec.rb +498 -29
  218. data/spec/mongoid/relations/proxy_spec.rb +1 -1
  219. data/spec/mongoid/reloadable_spec.rb +72 -0
  220. data/spec/mongoid/scopable_spec.rb +2 -1
  221. data/spec/mongoid/serializable_spec.rb +149 -20
  222. data/spec/mongoid/shardable_models.rb +61 -0
  223. data/spec/mongoid/shardable_spec.rb +69 -16
  224. data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
  225. data/spec/mongoid/tasks/database_spec.rb +1 -1
  226. data/spec/mongoid/traversable_spec.rb +1100 -0
  227. data/spec/spec_helper.rb +4 -33
  228. data/spec/support/child_process_helper.rb +79 -0
  229. data/spec/support/cluster_config.rb +3 -3
  230. data/spec/support/constraints.rb +50 -10
  231. data/spec/support/expectations.rb +3 -1
  232. data/spec/support/helpers.rb +11 -0
  233. data/spec/support/lite_constraints.rb +22 -0
  234. data/spec/{app → support}/models/account.rb +0 -0
  235. data/spec/{app → support}/models/acolyte.rb +0 -0
  236. data/spec/{app → support}/models/actor.rb +1 -1
  237. data/spec/{app → support}/models/actress.rb +0 -0
  238. data/spec/{app → support}/models/address.rb +0 -0
  239. data/spec/{app → support}/models/address_component.rb +0 -0
  240. data/spec/{app → support}/models/address_number.rb +0 -0
  241. data/spec/{app → support}/models/agency.rb +0 -0
  242. data/spec/{app → support}/models/agent.rb +0 -0
  243. data/spec/{app → support}/models/album.rb +0 -0
  244. data/spec/{app → support}/models/alert.rb +0 -0
  245. data/spec/{app → support}/models/animal.rb +0 -0
  246. data/spec/{app → support}/models/answer.rb +0 -0
  247. data/spec/{app → support}/models/appointment.rb +0 -0
  248. data/spec/support/models/armrest.rb +10 -0
  249. data/spec/{app → support}/models/array_field.rb +0 -0
  250. data/spec/{app → support}/models/article.rb +0 -0
  251. data/spec/{app → support}/models/artist.rb +0 -0
  252. data/spec/{app → support}/models/artwork.rb +0 -0
  253. data/spec/{app → support}/models/audio.rb +0 -0
  254. data/spec/{app → support}/models/augmentation.rb +0 -0
  255. data/spec/{app → support}/models/author.rb +0 -0
  256. data/spec/{app → support}/models/baby.rb +0 -0
  257. data/spec/{app → support}/models/band.rb +0 -0
  258. data/spec/{app → support}/models/bar.rb +0 -0
  259. data/spec/{app → support}/models/basic.rb +0 -0
  260. data/spec/{app → support}/models/bed.rb +0 -0
  261. data/spec/{app → support}/models/big_palette.rb +0 -0
  262. data/spec/{app → support}/models/birthday.rb +0 -0
  263. data/spec/{app → support}/models/bomb.rb +0 -0
  264. data/spec/{app → support}/models/book.rb +0 -0
  265. data/spec/{app → support}/models/breed.rb +0 -0
  266. data/spec/{app → support}/models/browser.rb +1 -1
  267. data/spec/{app → support}/models/building.rb +0 -0
  268. data/spec/{app → support}/models/building_address.rb +0 -0
  269. data/spec/{app → support}/models/bus.rb +0 -0
  270. data/spec/{app → support}/models/business.rb +0 -0
  271. data/spec/{app → support}/models/callback_test.rb +0 -0
  272. data/spec/{app → support}/models/canvas.rb +1 -1
  273. data/spec/{app → support}/models/car.rb +0 -0
  274. data/spec/{app → support}/models/cat.rb +0 -0
  275. data/spec/{app → support}/models/category.rb +0 -0
  276. data/spec/{app → support}/models/child.rb +0 -0
  277. data/spec/{app → support}/models/child_doc.rb +0 -0
  278. data/spec/{app → support}/models/church.rb +0 -0
  279. data/spec/{app → support}/models/circle.rb +0 -0
  280. data/spec/{app → support}/models/circuit.rb +0 -0
  281. data/spec/{app → support}/models/circus.rb +0 -0
  282. data/spec/{app → support}/models/code.rb +0 -0
  283. data/spec/support/models/coding.rb +4 -0
  284. data/spec/support/models/coding/pull_request.rb +12 -0
  285. data/spec/{app → support}/models/comment.rb +0 -0
  286. data/spec/{app → support}/models/company.rb +0 -0
  287. data/spec/{app → support}/models/consumption_period.rb +0 -0
  288. data/spec/{app → support}/models/contextable_item.rb +0 -0
  289. data/spec/{app → support}/models/contractor.rb +0 -0
  290. data/spec/{app → support}/models/cookie.rb +0 -0
  291. data/spec/{app → support}/models/country_code.rb +0 -0
  292. data/spec/{app → support}/models/courier_job.rb +0 -0
  293. data/spec/support/models/crate.rb +13 -0
  294. data/spec/support/models/deed.rb +8 -0
  295. data/spec/{app → support}/models/definition.rb +0 -0
  296. data/spec/support/models/delegating_patient.rb +16 -0
  297. data/spec/{app → support}/models/description.rb +0 -0
  298. data/spec/{app → support}/models/dictionary.rb +0 -0
  299. data/spec/{app → support}/models/division.rb +0 -0
  300. data/spec/{app → support}/models/doctor.rb +0 -0
  301. data/spec/{app → support}/models/dog.rb +0 -0
  302. data/spec/{app → support}/models/dokument.rb +0 -0
  303. data/spec/{app → support}/models/draft.rb +0 -0
  304. data/spec/{app → support}/models/dragon.rb +0 -0
  305. data/spec/{app → support}/models/driver.rb +1 -1
  306. data/spec/{app → support}/models/drug.rb +0 -0
  307. data/spec/{app → support}/models/dungeon.rb +0 -0
  308. data/spec/{app → support}/models/edit.rb +0 -0
  309. data/spec/{app → support}/models/email.rb +0 -0
  310. data/spec/{app → support}/models/employer.rb +0 -0
  311. data/spec/{app → support}/models/entry.rb +0 -0
  312. data/spec/{app → support}/models/eraser.rb +0 -0
  313. data/spec/{app → support}/models/even.rb +0 -0
  314. data/spec/{app → support}/models/event.rb +0 -0
  315. data/spec/{app → support}/models/exhibition.rb +0 -0
  316. data/spec/{app → support}/models/exhibitor.rb +0 -0
  317. data/spec/{app → support}/models/explosion.rb +0 -0
  318. data/spec/{app → support}/models/eye.rb +0 -0
  319. data/spec/{app → support}/models/eye_bowl.rb +0 -0
  320. data/spec/{app → support}/models/face.rb +0 -0
  321. data/spec/{app → support}/models/favorite.rb +0 -0
  322. data/spec/{app → support}/models/filesystem.rb +0 -0
  323. data/spec/{app → support}/models/fire_hydrant.rb +0 -0
  324. data/spec/{app → support}/models/firefox.rb +0 -0
  325. data/spec/{app → support}/models/fish.rb +0 -0
  326. data/spec/{app → support}/models/folder.rb +0 -0
  327. data/spec/{app → support}/models/folder_item.rb +0 -0
  328. data/spec/{app → support}/models/fruits.rb +0 -0
  329. data/spec/{app → support}/models/game.rb +0 -0
  330. data/spec/{app → support}/models/ghost.rb +0 -0
  331. data/spec/support/models/guitar.rb +5 -0
  332. data/spec/{app → support}/models/home.rb +0 -0
  333. data/spec/{app → support}/models/house.rb +0 -0
  334. data/spec/{app → support}/models/html_writer.rb +0 -0
  335. data/spec/{app → support}/models/id_key.rb +0 -0
  336. data/spec/support/models/idnodef.rb +8 -0
  337. data/spec/{app → support}/models/image.rb +0 -0
  338. data/spec/{app → support}/models/implant.rb +0 -0
  339. data/spec/support/models/instrument.rb +9 -0
  340. data/spec/{app → support}/models/item.rb +1 -1
  341. data/spec/{app → support}/models/jar.rb +0 -0
  342. data/spec/{app → support}/models/kaleidoscope.rb +0 -0
  343. data/spec/{app → support}/models/kangaroo.rb +0 -0
  344. data/spec/{app → support}/models/label.rb +0 -0
  345. data/spec/{app → support}/models/language.rb +0 -0
  346. data/spec/{app → support}/models/lat_lng.rb +0 -0
  347. data/spec/{app → support}/models/league.rb +0 -0
  348. data/spec/{app → support}/models/learner.rb +0 -0
  349. data/spec/{app → support}/models/line_item.rb +0 -0
  350. data/spec/{app → support}/models/location.rb +0 -0
  351. data/spec/{app → support}/models/login.rb +0 -0
  352. data/spec/{app → support}/models/manufacturer.rb +0 -0
  353. data/spec/{app → support}/models/meat.rb +0 -0
  354. data/spec/{app → support}/models/membership.rb +0 -0
  355. data/spec/{app → support}/models/message.rb +0 -0
  356. data/spec/{app → support}/models/minim.rb +0 -0
  357. data/spec/{app → support}/models/mixed_drink.rb +0 -0
  358. data/spec/support/models/mop.rb +16 -0
  359. data/spec/{app → support}/models/movie.rb +0 -0
  360. data/spec/{app → support}/models/my_hash.rb +0 -0
  361. data/spec/{app → support}/models/name.rb +0 -0
  362. data/spec/{app → support}/models/name_only.rb +0 -0
  363. data/spec/{app → support}/models/node.rb +0 -0
  364. data/spec/{app → support}/models/note.rb +0 -0
  365. data/spec/{app → support}/models/odd.rb +0 -0
  366. data/spec/{app → support}/models/ordered_post.rb +0 -0
  367. data/spec/{app → support}/models/ordered_preference.rb +0 -0
  368. data/spec/{app → support}/models/oscar.rb +0 -0
  369. data/spec/{app → support}/models/other_owner_object.rb +0 -0
  370. data/spec/{app → support}/models/override.rb +0 -0
  371. data/spec/{app → support}/models/ownable.rb +0 -0
  372. data/spec/{app → support}/models/owner.rb +2 -0
  373. data/spec/{app → support}/models/pack.rb +0 -0
  374. data/spec/{app → support}/models/page.rb +0 -0
  375. data/spec/{app → support}/models/page_question.rb +0 -0
  376. data/spec/{app → support}/models/palette.rb +1 -1
  377. data/spec/{app → support}/models/parent.rb +0 -0
  378. data/spec/{app → support}/models/parent_doc.rb +0 -0
  379. data/spec/{app → support}/models/passport.rb +1 -0
  380. data/spec/{app → support}/models/patient.rb +0 -0
  381. data/spec/{app → support}/models/pdf_writer.rb +0 -0
  382. data/spec/{app → support}/models/pencil.rb +0 -0
  383. data/spec/{app → support}/models/person.rb +1 -1
  384. data/spec/{app → support}/models/pet.rb +0 -0
  385. data/spec/{app → support}/models/pet_owner.rb +0 -0
  386. data/spec/{app → support}/models/phone.rb +1 -0
  387. data/spec/support/models/piano.rb +5 -0
  388. data/spec/{app → support}/models/pizza.rb +0 -0
  389. data/spec/{app → support}/models/player.rb +0 -0
  390. data/spec/{app → support}/models/post.rb +0 -0
  391. data/spec/{app → support}/models/post_genre.rb +0 -0
  392. data/spec/{app → support}/models/powerup.rb +0 -0
  393. data/spec/{app → support}/models/preference.rb +0 -0
  394. data/spec/{app → support}/models/princess.rb +0 -0
  395. data/spec/{app → support}/models/product.rb +0 -0
  396. data/spec/support/models/profile.rb +18 -0
  397. data/spec/{app → support}/models/pronunciation.rb +0 -0
  398. data/spec/{app → support}/models/pub.rb +0 -0
  399. data/spec/support/models/publication.rb +5 -0
  400. data/spec/support/models/publication/encyclopedia.rb +12 -0
  401. data/spec/support/models/publication/review.rb +14 -0
  402. data/spec/{app → support}/models/purchase.rb +0 -0
  403. data/spec/{app → support}/models/question.rb +0 -0
  404. data/spec/{app → support}/models/quiz.rb +0 -0
  405. data/spec/{app → support}/models/rating.rb +0 -0
  406. data/spec/{app → support}/models/record.rb +0 -0
  407. data/spec/{app → support}/models/registry.rb +0 -0
  408. data/spec/{app → support}/models/role.rb +0 -0
  409. data/spec/{app → support}/models/root_category.rb +0 -0
  410. data/spec/{app → support}/models/sandwich.rb +0 -0
  411. data/spec/{app → support}/models/scheduler.rb +0 -0
  412. data/spec/{app/models/profile.rb → support/models/scribe.rb} +2 -2
  413. data/spec/support/models/seat.rb +25 -0
  414. data/spec/{app → support}/models/seo.rb +0 -0
  415. data/spec/{app → support}/models/series.rb +0 -0
  416. data/spec/{app → support}/models/server.rb +0 -0
  417. data/spec/{app → support}/models/service.rb +0 -0
  418. data/spec/{app → support}/models/shape.rb +2 -2
  419. data/spec/{app → support}/models/shelf.rb +0 -0
  420. data/spec/{app → support}/models/shipment_address.rb +0 -0
  421. data/spec/{app → support}/models/shipping_container.rb +0 -0
  422. data/spec/{app → support}/models/shipping_pack.rb +0 -0
  423. data/spec/{app → support}/models/shop.rb +0 -0
  424. data/spec/{app → support}/models/short_agent.rb +0 -0
  425. data/spec/{app → support}/models/short_quiz.rb +0 -0
  426. data/spec/{app → support}/models/simple.rb +0 -0
  427. data/spec/{app → support}/models/slave.rb +0 -0
  428. data/spec/{app → support}/models/song.rb +0 -0
  429. data/spec/{app → support}/models/sound.rb +0 -0
  430. data/spec/{app → support}/models/square.rb +0 -0
  431. data/spec/{app → support}/models/staff.rb +0 -0
  432. data/spec/{app → support}/models/store_as_dup_test1.rb +0 -0
  433. data/spec/{app → support}/models/store_as_dup_test2.rb +0 -0
  434. data/spec/{app → support}/models/store_as_dup_test3.rb +0 -0
  435. data/spec/{app → support}/models/store_as_dup_test4.rb +0 -0
  436. data/spec/{app → support}/models/strategy.rb +0 -0
  437. data/spec/{app → support}/models/sub_item.rb +0 -0
  438. data/spec/{app → support}/models/subscription.rb +0 -0
  439. data/spec/{app → support}/models/survey.rb +0 -0
  440. data/spec/{app → support}/models/symptom.rb +0 -0
  441. data/spec/support/models/system_role.rb +7 -0
  442. data/spec/{app → support}/models/tag.rb +0 -0
  443. data/spec/{app → support}/models/target.rb +0 -0
  444. data/spec/{app → support}/models/template.rb +0 -0
  445. data/spec/{app → support}/models/thing.rb +0 -0
  446. data/spec/{app → support}/models/title.rb +0 -0
  447. data/spec/{app → support}/models/tool.rb +2 -2
  448. data/spec/{app → support}/models/topping.rb +0 -0
  449. data/spec/support/models/toy.rb +10 -0
  450. data/spec/{app → support}/models/track.rb +0 -0
  451. data/spec/{app → support}/models/translation.rb +0 -0
  452. data/spec/{app → support}/models/tree.rb +0 -0
  453. data/spec/{app → support}/models/truck.rb +2 -0
  454. data/spec/{app → support}/models/updatable.rb +0 -0
  455. data/spec/{app → support}/models/user.rb +0 -0
  456. data/spec/{app → support}/models/user_account.rb +0 -0
  457. data/spec/{app → support}/models/validation_callback.rb +0 -0
  458. data/spec/{app → support}/models/vehicle.rb +7 -2
  459. data/spec/{app → support}/models/version.rb +0 -0
  460. data/spec/{app → support}/models/vertex.rb +0 -0
  461. data/spec/{app → support}/models/vet_visit.rb +0 -0
  462. data/spec/{app → support}/models/video.rb +0 -0
  463. data/spec/{app → support}/models/video_game.rb +0 -0
  464. data/spec/{app → support}/models/weapon.rb +0 -0
  465. data/spec/{app → support}/models/wiki_page.rb +0 -0
  466. data/spec/{app → support}/models/word.rb +0 -0
  467. data/spec/{app → support}/models/word_origin.rb +0 -0
  468. data/spec/{app → support}/models/writer.rb +2 -2
  469. data/spec/support/session_registry.rb +50 -0
  470. data/spec/support/spec_config.rb +13 -5
  471. data/spec/support/spec_organizer.rb +130 -0
  472. metadata +882 -752
  473. metadata.gz.sig +0 -0
  474. data/lib/mongoid/matchable/all.rb +0 -30
  475. data/lib/mongoid/matchable/and.rb +0 -32
  476. data/lib/mongoid/matchable/default.rb +0 -121
  477. data/lib/mongoid/matchable/elem_match.rb +0 -36
  478. data/lib/mongoid/matchable/eq.rb +0 -23
  479. data/lib/mongoid/matchable/exists.rb +0 -25
  480. data/lib/mongoid/matchable/gt.rb +0 -25
  481. data/lib/mongoid/matchable/gte.rb +0 -25
  482. data/lib/mongoid/matchable/in.rb +0 -26
  483. data/lib/mongoid/matchable/lt.rb +0 -25
  484. data/lib/mongoid/matchable/lte.rb +0 -25
  485. data/lib/mongoid/matchable/ne.rb +0 -23
  486. data/lib/mongoid/matchable/nin.rb +0 -24
  487. data/lib/mongoid/matchable/nor.rb +0 -38
  488. data/lib/mongoid/matchable/or.rb +0 -35
  489. data/lib/mongoid/matchable/regexp.rb +0 -30
  490. data/lib/mongoid/matchable/size.rb +0 -23
  491. data/spec/mongoid/matchable/all_spec.rb +0 -34
  492. data/spec/mongoid/matchable/and_spec.rb +0 -190
  493. data/spec/mongoid/matchable/default_spec.rb +0 -140
  494. data/spec/mongoid/matchable/elem_match_spec.rb +0 -109
  495. data/spec/mongoid/matchable/eq_spec.rb +0 -49
  496. data/spec/mongoid/matchable/exists_spec.rb +0 -60
  497. data/spec/mongoid/matchable/gt_spec.rb +0 -89
  498. data/spec/mongoid/matchable/gte_spec.rb +0 -87
  499. data/spec/mongoid/matchable/in_spec.rb +0 -52
  500. data/spec/mongoid/matchable/lt_spec.rb +0 -88
  501. data/spec/mongoid/matchable/lte_spec.rb +0 -88
  502. data/spec/mongoid/matchable/ne_spec.rb +0 -49
  503. data/spec/mongoid/matchable/nin_spec.rb +0 -51
  504. data/spec/mongoid/matchable/nor_spec.rb +0 -210
  505. data/spec/mongoid/matchable/or_spec.rb +0 -134
  506. data/spec/mongoid/matchable/regexp_spec.rb +0 -62
  507. data/spec/mongoid/matchable/size_spec.rb +0 -28
  508. data/spec/mongoid/matchable_spec.rb +0 -856
@@ -48,7 +48,7 @@ shared_context "rails rake task" do
48
48
  end
49
49
  end
50
50
 
51
- describe "db:drop", if: non_legacy_server? do
51
+ describe "db:drop" do
52
52
  include_context "rake task"
53
53
  include_context "rails rake task"
54
54
 
@@ -61,7 +61,7 @@ describe "db:drop", if: non_legacy_server? do
61
61
  end
62
62
  end
63
63
 
64
- describe "db:purge", if: non_legacy_server? do
64
+ describe "db:purge" do
65
65
  include_context "rake task"
66
66
  include_context "rails rake task"
67
67
 
@@ -74,7 +74,7 @@ describe "db:purge", if: non_legacy_server? do
74
74
  end
75
75
  end
76
76
 
77
- describe "db:seed", if: non_legacy_server? do
77
+ describe "db:seed" do
78
78
  include_context "rake task"
79
79
  include_context "rails rake task"
80
80
 
@@ -88,7 +88,7 @@ describe "db:seed", if: non_legacy_server? do
88
88
  end
89
89
  end
90
90
 
91
- describe "db:setup", if: non_legacy_server? do
91
+ describe "db:setup" do
92
92
  include_context "rake task"
93
93
  include_context "rails rake task"
94
94
 
@@ -120,7 +120,7 @@ describe "db:setup", if: non_legacy_server? do
120
120
  end
121
121
  end
122
122
 
123
- describe "db:reset", if: non_legacy_server? do
123
+ describe "db:reset" do
124
124
  include_context "rake task"
125
125
  include_context "rails rake task"
126
126
 
@@ -138,7 +138,7 @@ describe "db:reset", if: non_legacy_server? do
138
138
  end
139
139
  end
140
140
 
141
- describe "db:create", if: non_legacy_server? do
141
+ describe "db:create" do
142
142
  include_context "rake task"
143
143
  include_context "rails rake task"
144
144
 
@@ -147,7 +147,7 @@ describe "db:create", if: non_legacy_server? do
147
147
  end
148
148
  end
149
149
 
150
- describe "db:migrate", if: non_legacy_server? do
150
+ describe "db:migrate" do
151
151
  include_context "rake task"
152
152
  include_context "rails rake task"
153
153
 
@@ -156,7 +156,7 @@ describe "db:migrate", if: non_legacy_server? do
156
156
  end
157
157
  end
158
158
 
159
- describe "db:test:prepare", if: non_legacy_server? do
159
+ describe "db:test:prepare" do
160
160
  include_context "rake task"
161
161
  include_context "rails rake task"
162
162
 
@@ -177,7 +177,7 @@ describe "db:test:prepare", if: non_legacy_server? do
177
177
  end
178
178
  end
179
179
 
180
- describe "db:mongoid:create_indexes", if: non_legacy_server? do
180
+ describe "db:mongoid:create_indexes" do
181
181
  include_context "rake task"
182
182
 
183
183
  it_behaves_like "create_indexes"
@@ -201,7 +201,7 @@ describe "db:mongoid:create_indexes", if: non_legacy_server? do
201
201
  end
202
202
  end
203
203
 
204
- describe "db:mongoid:remove_undefined_indexes", if: non_legacy_server? do
204
+ describe "db:mongoid:remove_undefined_indexes" do
205
205
  include_context "rake task"
206
206
 
207
207
  it "receives remove_undefined_indexes" do
@@ -227,7 +227,7 @@ describe "db:mongoid:remove_undefined_indexes", if: non_legacy_server? do
227
227
  end
228
228
  end
229
229
 
230
- describe "db:mongoid:remove_indexes", if: non_legacy_server? do
230
+ describe "db:mongoid:remove_indexes" do
231
231
  include_context "rake task"
232
232
 
233
233
  it "receives remove_indexes" do
@@ -253,7 +253,7 @@ describe "db:mongoid:remove_indexes", if: non_legacy_server? do
253
253
  end
254
254
  end
255
255
 
256
- describe "db:mongoid:drop", if: non_legacy_server? do
256
+ describe "db:mongoid:drop" do
257
257
  include_context "rake task"
258
258
 
259
259
  it "works" do
@@ -269,7 +269,7 @@ describe "db:mongoid:drop", if: non_legacy_server? do
269
269
  end
270
270
  end
271
271
 
272
- describe "db:mongoid:purge", if: non_legacy_server? do
272
+ describe "db:mongoid:purge" do
273
273
  include_context "rake task"
274
274
 
275
275
  it "receives a purge" do
@@ -136,7 +136,7 @@ describe "Mongoid::Tasks::Database" do
136
136
  expect(removed_indexes).to be_empty
137
137
  end
138
138
 
139
- context 'when the index is a text index', if: non_legacy_server? do
139
+ context 'when the index is a text index' do
140
140
 
141
141
  before do
142
142
  class Band
@@ -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