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