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
@@ -0,0 +1,354 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe "#discriminator_key" do
7
+
8
+ context "when the discriminator key is not set on a class" do
9
+ let(:piano) do
10
+ Piano.new
11
+ end
12
+
13
+ let(:guitar) do
14
+ Guitar.new
15
+ end
16
+
17
+ it "sets the child discriminator key to _type: Piano" do
18
+ expect(piano._type).to eq("Piano")
19
+ end
20
+
21
+ it "sets the child discriminator key to _type: Guitar" do
22
+ expect(guitar._type).to eq("Guitar")
23
+ end
24
+ end
25
+
26
+ context "when the discriminator key is changed in the parent" do
27
+ before do
28
+ Instrument.discriminator_key = "hello2"
29
+ end
30
+
31
+ after do
32
+ Instrument.discriminator_key = nil
33
+ end
34
+
35
+ let(:piano) do
36
+ Piano.new
37
+ end
38
+
39
+ let(:guitar) do
40
+ Guitar.new
41
+ end
42
+
43
+ it "changes in the child class: Piano" do
44
+ expect(piano.hello2).to eq("Piano")
45
+ end
46
+
47
+ it "changes in the child class: Guitar" do
48
+ expect(guitar.hello2).to eq("Guitar")
49
+ end
50
+ end
51
+
52
+ context "when the discriminator key is changed at the base level" do
53
+ context "after class creation" do
54
+ before do
55
+ class GlobalIntDiscriminatorParent
56
+ include Mongoid::Document
57
+ end
58
+
59
+ class GlobalIntDiscriminatorChild < GlobalIntDiscriminatorParent
60
+ end
61
+
62
+ Mongoid.discriminator_key = "test"
63
+ end
64
+
65
+ after do
66
+ Mongoid.discriminator_key = "_type"
67
+ end
68
+
69
+ let(:child) do
70
+ GlobalIntDiscriminatorChild.new
71
+ end
72
+
73
+ it "has a discriminator key _type" do
74
+ expect(child._type).to eq("GlobalIntDiscriminatorChild")
75
+ end
76
+
77
+ it "does not have the new global value as a field" do
78
+ expect(defined?(child.test)).to be nil
79
+ end
80
+ end
81
+
82
+ context "before class creation" do
83
+ before do
84
+ Mongoid.discriminator_key = "test"
85
+
86
+ class PreGlobalIntDiscriminatorParent
87
+ include Mongoid::Document
88
+ end
89
+
90
+ class PreGlobalIntDiscriminatorChild < PreGlobalIntDiscriminatorParent
91
+ end
92
+ end
93
+
94
+ after do
95
+ Mongoid.discriminator_key = "_type"
96
+ end
97
+
98
+ let(:child) do
99
+ PreGlobalIntDiscriminatorChild.new
100
+ end
101
+
102
+ it "creates a field with new discriminator key" do
103
+ expect(child.test).to eq("PreGlobalIntDiscriminatorChild")
104
+ end
105
+
106
+ it "does not have the default value as a field" do
107
+ expect(defined?(child._type)).to be nil
108
+ end
109
+ end
110
+ end
111
+
112
+ context "when the discriminator key is changed in the parent" do
113
+ context "after child class creation" do
114
+ before do
115
+ class LocalIntDiscriminatorParent
116
+ include Mongoid::Document
117
+ end
118
+
119
+ class LocalIntDiscriminatorChild < LocalIntDiscriminatorParent
120
+ end
121
+
122
+ LocalIntDiscriminatorParent.discriminator_key = "test2"
123
+ end
124
+
125
+ let(:child) do
126
+ LocalIntDiscriminatorChild.new
127
+ end
128
+
129
+ it "still has _type field in the child" do
130
+ expect(child._type).to include("LocalIntDiscriminatorChild")
131
+ end
132
+
133
+ it "has the new field in the child" do
134
+ expect(child.test2).to include("LocalIntDiscriminatorChild")
135
+ end
136
+ end
137
+
138
+ context "before child class creation" do
139
+ before do
140
+ class PreLocalIntDiscriminatorParent
141
+ include Mongoid::Document
142
+ self.discriminator_key = "test2"
143
+ end
144
+
145
+ class PreLocalIntDiscriminatorChild < PreLocalIntDiscriminatorParent
146
+ end
147
+ end
148
+
149
+ let(:child) do
150
+ PreLocalIntDiscriminatorChild.new
151
+ end
152
+
153
+ it "creates a new field in the child" do
154
+ expect(child.test2).to include("PreLocalIntDiscriminatorChild")
155
+ end
156
+
157
+ it "does not have the default value as a field" do
158
+ expect(defined?(child._type)).to be nil
159
+ end
160
+ end
161
+ end
162
+
163
+ context "when adding to the db" do
164
+ context "when changing the discriminator_key" do
165
+ before do
166
+ class DBDiscriminatorParent
167
+ include Mongoid::Document
168
+ self.discriminator_key = "dkey"
169
+ end
170
+
171
+ class DBDiscriminatorChild < DBDiscriminatorParent
172
+ end
173
+ DBDiscriminatorChild.create!
174
+ end
175
+
176
+ it "has the correct count" do
177
+ expect(DBDiscriminatorChild.count).to eq(1)
178
+ end
179
+
180
+ it "has the correct count in the parent" do
181
+ expect(DBDiscriminatorParent.count).to eq(1)
182
+ end
183
+ end
184
+
185
+ context "when changing the discriminator_key after saving to the db" do
186
+ before do
187
+ class DBDiscriminatorParent
188
+ include Mongoid::Document
189
+ end
190
+
191
+ class DBDiscriminatorChild < DBDiscriminatorParent
192
+ end
193
+ DBDiscriminatorChild.create!
194
+ DBDiscriminatorParent.discriminator_key = "dkey2"
195
+ DBDiscriminatorChild.create!
196
+ end
197
+
198
+ it "only finds the documents with the new discriminator key" do
199
+ expect(DBDiscriminatorChild.count).to eq(1)
200
+ end
201
+
202
+ it "has the correct count in the parent" do
203
+ expect(DBDiscriminatorParent.count).to eq(2)
204
+ end
205
+ end
206
+ end
207
+
208
+ context "documentation tests" do
209
+
210
+ context "Example 1" do
211
+ before do
212
+ class Example1Shape
213
+ include Mongoid::Document
214
+ field :x, type: Integer
215
+ field :y, type: Integer
216
+ embedded_in :canvas
217
+
218
+ self.discriminator_key = "shape_type"
219
+ end
220
+
221
+ class Example1Circle < Example1Shape
222
+ field :radius, type: Float
223
+ end
224
+
225
+ class Example1Rectangle < Example1Shape
226
+ field :width, type: Float
227
+ field :height, type: Float
228
+ end
229
+ end
230
+
231
+ let(:rectangle) do
232
+ Example1Rectangle.new
233
+ end
234
+
235
+ let(:circle) do
236
+ Example1Circle.new
237
+ end
238
+
239
+ it "has the new discriminator key: Rectangle" do
240
+ expect(rectangle.shape_type).to eq("Example1Rectangle")
241
+ end
242
+
243
+ it "does not have the default discriminator key: Rectangle" do
244
+ expect(defined?(rectangle._type)).to be nil
245
+ end
246
+
247
+ it "has the new discriminator key: Circle" do
248
+ expect(circle.shape_type).to eq("Example1Circle")
249
+ end
250
+
251
+ it "does not have the default discriminator key: Circle" do
252
+ expect(defined?(circle._type)).to be nil
253
+ end
254
+ end
255
+
256
+ context "Example 2" do
257
+ before do
258
+ class Example2Shape
259
+ include Mongoid::Document
260
+ field :x, type: Integer
261
+ field :y, type: Integer
262
+ embedded_in :canvas
263
+ end
264
+
265
+ class Example2Circle < Example2Shape
266
+ field :radius, type: Float
267
+ end
268
+
269
+ class Example2Rectangle < Example2Shape
270
+ field :width, type: Float
271
+ field :height, type: Float
272
+ end
273
+
274
+ Example2Shape.discriminator_key = "shape_type"
275
+ end
276
+
277
+ let(:rectangle) do
278
+ Example2Rectangle.new
279
+ end
280
+
281
+ let(:circle) do
282
+ Example2Circle.new
283
+ end
284
+
285
+ it "has the new discriminator key: Rectangle" do
286
+ expect(rectangle.shape_type).to eq("Example2Rectangle")
287
+ end
288
+
289
+ it "has default discriminator key: Rectangle" do
290
+ expect(rectangle._type).to eq("Example2Rectangle")
291
+ end
292
+
293
+ it "has the new discriminator key: Circle" do
294
+ expect(circle.shape_type).to eq("Example2Circle")
295
+ end
296
+
297
+ it "has default discriminator key: Circle" do
298
+ expect(circle._type).to eq("Example2Circle")
299
+ end
300
+ end
301
+
302
+ context "Example 3" do
303
+ before do
304
+
305
+ Mongoid.discriminator_key = "shape_type"
306
+
307
+ class Example3Shape
308
+ include Mongoid::Document
309
+ field :x, type: Integer
310
+ field :y, type: Integer
311
+ embedded_in :canvas
312
+ end
313
+
314
+ class Example3Circle < Example3Shape
315
+ field :radius, type: Float
316
+ end
317
+
318
+ class Example3Rectangle < Example3Shape
319
+ field :width, type: Float
320
+ field :height, type: Float
321
+ end
322
+
323
+ end
324
+
325
+ after do
326
+ Mongoid.discriminator_key = "_type"
327
+ end
328
+
329
+ let(:rectangle) do
330
+ Example3Rectangle.new
331
+ end
332
+
333
+ let(:circle) do
334
+ Example3Circle.new
335
+ end
336
+
337
+ it "has the new discriminator key: Rectangle" do
338
+ expect(rectangle.shape_type).to eq("Example3Rectangle")
339
+ end
340
+
341
+ it "does not have the default discriminator key: Rectangle" do
342
+ expect(defined?(rectangle._type)).to be nil
343
+ end
344
+
345
+ it "has the new discriminator key: Circle" do
346
+ expect(circle.shape_type).to eq("Example3Circle")
347
+ end
348
+
349
+ it "does not have the default discriminator key: Circle" do
350
+ expect(defined?(circle._type)).to be nil
351
+ end
352
+ end
353
+ end
354
+ end
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe "#discriminator_key" do
7
+
8
+ context "when the discriminator value is not set on a class" do
9
+ let(:piano) do
10
+ Piano.new
11
+ end
12
+
13
+ let(:guitar) do
14
+ Guitar.new
15
+ end
16
+
17
+ it "sets the child discriminator key to _type: Piano" do
18
+ expect(piano._type).to eq("Piano")
19
+ end
20
+
21
+ it "sets the child discriminator key to _type: Guitar" do
22
+ expect(guitar._type).to eq("Guitar")
23
+ end
24
+ end
25
+
26
+ context "when the discriminator_value is set on a child" do
27
+ before do
28
+ Piano.discriminator_value = "keys"
29
+ end
30
+
31
+ after do
32
+ Piano.discriminator_value = nil
33
+ end
34
+
35
+ let(:piano) do
36
+ Piano.new
37
+ end
38
+
39
+ it "has the correct discriminator value on the instance" do
40
+ expect(piano._type).to eq("keys")
41
+ end
42
+ end
43
+
44
+ context "when the discriminator key and value are set on a child" do
45
+ before do
46
+ Piano.discriminator_value = "keys"
47
+ Instrument.discriminator_key = "dkey"
48
+ end
49
+
50
+ after do
51
+ Piano.discriminator_value = nil
52
+ Instrument.discriminator_key = nil
53
+ end
54
+
55
+
56
+ let(:piano) do
57
+ Piano.new
58
+ end
59
+
60
+ it "has the correct discriminator value on the instance" do
61
+ expect(piano.dkey).to eq("keys")
62
+ end
63
+ end
64
+
65
+ context "when adding to the db" do
66
+ context "when not changing the discriminator value" do
67
+ before do
68
+ Piano.create!
69
+ end
70
+
71
+ it "has the correct count" do
72
+ expect(Piano.count).to eq(1)
73
+ end
74
+
75
+ it "has the correct count in the parent" do
76
+ expect(Instrument.count).to eq(1)
77
+ end
78
+
79
+ it "has zero count in the sibling" do
80
+ expect(Guitar.count).to eq(0)
81
+ end
82
+ end
83
+
84
+ context "when changing the discriminator value" do
85
+ before do
86
+ Piano.discriminator_value = "keys"
87
+ Piano.create!
88
+ end
89
+
90
+ after do
91
+ Piano.discriminator_value = nil
92
+ end
93
+
94
+ it "has the correct count" do
95
+ expect(Piano.count).to eq(1)
96
+ end
97
+
98
+ it "has the correct count in the parent" do
99
+ expect(Instrument.count).to eq(1)
100
+ end
101
+
102
+ it "has zero count in the sibling" do
103
+ expect(Guitar.count).to eq(0)
104
+ end
105
+ end
106
+
107
+ context "when changing the discriminator key/value" do
108
+ before do
109
+ Instrument.discriminator_key = "dkey"
110
+ Piano.discriminator_value = "keys"
111
+ Piano.create!
112
+ end
113
+
114
+ after do
115
+ Instrument.discriminator_key = nil
116
+ Piano.discriminator_value = nil
117
+ end
118
+
119
+ it "has the correct count" do
120
+ expect(Piano.count).to eq(1)
121
+ end
122
+
123
+ it "has the correct count in the parent" do
124
+ expect(Instrument.count).to eq(1)
125
+ end
126
+
127
+ it "has zero count in the sibling" do
128
+ expect(Guitar.count).to eq(0)
129
+ end
130
+ end
131
+
132
+ context "when calling count before changing the discriminator key/value" do
133
+ before do
134
+ Instrument.count
135
+ Instrument.discriminator_key = "dkey"
136
+ Piano.discriminator_value = "keys"
137
+ Piano.create!
138
+ end
139
+
140
+ after do
141
+ Instrument.discriminator_key = nil
142
+ Piano.discriminator_value = nil
143
+ end
144
+
145
+ it "has the correct count" do
146
+ expect(Piano.count).to eq(1)
147
+ end
148
+
149
+ it "has the correct count in the parent" do
150
+ expect(Instrument.count).to eq(1)
151
+ end
152
+
153
+ it "has zero count in the sibling" do
154
+ expect(Guitar.count).to eq(0)
155
+ end
156
+ end
157
+
158
+ context "when calling create before changing the discriminator key/value" do
159
+ before do
160
+ Piano.create!
161
+ Instrument.discriminator_key = "dkey"
162
+ Piano.discriminator_value = "keys"
163
+ Piano.create!
164
+ end
165
+
166
+ after do
167
+ Instrument.discriminator_key = nil
168
+ Piano.discriminator_value = nil
169
+ end
170
+
171
+ it "has the correct count" do
172
+ expect(Piano.count).to eq(1)
173
+ end
174
+
175
+ it "has the correct count in the parent" do
176
+ expect(Instrument.count).to eq(2)
177
+ end
178
+
179
+ it "has zero count in the sibling" do
180
+ expect(Guitar.count).to eq(0)
181
+ end
182
+ end
183
+
184
+ context "when there exists an unrecognizable discriminator value in the database" do
185
+ before do
186
+ Piano.discriminator_value = "keys"
187
+ Piano.create!(_type: "dvalue")
188
+ end
189
+
190
+ after do
191
+ Piano.discriminator_value = nil
192
+ end
193
+
194
+ it "is not considered a piano" do
195
+ expect(Piano.count).to eq(0)
196
+ end
197
+
198
+ it "is considered an Instrument, the parent" do
199
+ expect(Instrument.count).to eq(1)
200
+ end
201
+
202
+ it "has zero count in the sibling" do
203
+ expect(Guitar.count).to eq(0)
204
+ end
205
+ end
206
+ end
207
+ end