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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +6 -6
- data/LICENSE +1 -1
- data/README.md +14 -7
- data/Rakefile +21 -0
- data/lib/config/locales/en.yml +42 -6
- data/lib/mongoid.rb +26 -2
- data/lib/mongoid/association/accessors.rb +37 -2
- data/lib/mongoid/association/depending.rb +1 -6
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_one.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -4
- data/lib/mongoid/association/proxy.rb +6 -4
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to/eager.rb +38 -2
- data/lib/mongoid/association/referenced/eager.rb +29 -9
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +30 -15
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/atomic.rb +13 -3
- data/lib/mongoid/atomic/modifiers.rb +1 -1
- data/lib/mongoid/attributes.rb +28 -20
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/clients/factory.rb +19 -2
- data/lib/mongoid/clients/options.rb +8 -8
- data/lib/mongoid/clients/sessions.rb +20 -4
- data/lib/mongoid/clients/storage_options.rb +5 -5
- data/lib/mongoid/composable.rb +1 -0
- data/lib/mongoid/config.rb +45 -12
- data/lib/mongoid/config/options.rb +5 -2
- data/lib/mongoid/contextual.rb +5 -4
- data/lib/mongoid/contextual/geo_near.rb +3 -2
- data/lib/mongoid/contextual/map_reduce.rb +3 -2
- data/lib/mongoid/contextual/mongo.rb +25 -5
- data/lib/mongoid/copyable.rb +2 -2
- data/lib/mongoid/criteria.rb +80 -11
- data/lib/mongoid/criteria/modifiable.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +6 -6
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +12 -0
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +75 -8
- data/lib/mongoid/criteria/queryable/pipeline.rb +3 -2
- data/lib/mongoid/criteria/queryable/selectable.rb +141 -19
- data/lib/mongoid/criteria/queryable/selector.rb +3 -3
- data/lib/mongoid/criteria/queryable/storable.rb +106 -101
- data/lib/mongoid/document.rb +15 -3
- data/lib/mongoid/errors.rb +7 -0
- data/lib/mongoid/errors/eager_load.rb +2 -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/errors/no_client_config.rb +2 -2
- data/lib/mongoid/errors/no_default_client.rb +1 -1
- data/lib/mongoid/extensions/hash.rb +4 -2
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/factory.rb +27 -10
- data/lib/mongoid/fields.rb +2 -1
- data/lib/mongoid/fields/standard.rb +2 -1
- data/lib/mongoid/fields/validators/macro.rb +26 -10
- data/lib/mongoid/findable.rb +55 -18
- data/lib/mongoid/indexable.rb +2 -2
- data/lib/mongoid/interceptable.rb +5 -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 +52 -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/persistable/pushable.rb +11 -2
- data/lib/mongoid/persistence_context.rb +6 -6
- data/lib/mongoid/query_cache.rb +83 -38
- data/lib/mongoid/railties/database.rake +7 -0
- data/lib/mongoid/reloadable.rb +2 -2
- data/lib/mongoid/serializable.rb +11 -3
- data/lib/mongoid/shardable.rb +56 -4
- data/lib/mongoid/tasks/database.rake +10 -5
- data/lib/mongoid/tasks/database.rb +83 -0
- data/lib/mongoid/timestamps/timeless.rb +3 -1
- data/lib/mongoid/traversable.rb +111 -4
- data/lib/mongoid/validatable/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +32 -23
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +1 -1
- data/spec/integration/app_spec.rb +254 -0
- data/spec/integration/associations/embedded_spec.rb +148 -0
- data/spec/integration/associations/has_many_spec.rb +69 -0
- data/spec/integration/associations/has_one_spec.rb +69 -0
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -0
- data/spec/integration/bson_regexp_raw_spec.rb +20 -0
- data/spec/integration/criteria/date_field_spec.rb +41 -0
- data/spec/integration/criteria/logical_spec.rb +13 -0
- data/spec/integration/discriminator_key_spec.rb +354 -0
- data/spec/integration/discriminator_value_spec.rb +207 -0
- data/spec/integration/document_spec.rb +22 -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/gte.yml +132 -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/lte.yml +132 -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/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/shardable_spec.rb +149 -0
- data/spec/lite_spec_helper.rb +15 -4
- data/spec/mongoid/association/accessors_spec.rb +238 -63
- data/spec/mongoid/association/depending_spec.rb +78 -26
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +33 -0
- data/spec/mongoid/association/embedded/embeds_many_models.rb +20 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +10 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +0 -2
- data/spec/mongoid/association/referenced/belongs_to/eager_spec.rb +193 -10
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +140 -1
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +146 -68
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +462 -187
- data/spec/mongoid/association/referenced/has_many_models.rb +9 -0
- data/spec/mongoid/association/referenced/has_one_models.rb +9 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +47 -0
- data/spec/mongoid/atomic_spec.rb +23 -0
- data/spec/mongoid/attributes/nested_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +19 -7
- data/spec/mongoid/changeable_spec.rb +23 -0
- data/spec/mongoid/clients/factory_spec.rb +45 -8
- data/spec/mongoid/clients/options_spec.rb +11 -11
- data/spec/mongoid/clients/sessions_spec.rb +9 -10
- data/spec/mongoid/clients/transactions_spec.rb +20 -8
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +28 -0
- data/spec/mongoid/contextual/atomic_spec.rb +22 -11
- data/spec/mongoid/contextual/geo_near_spec.rb +11 -2
- data/spec/mongoid/contextual/map_reduce_spec.rb +20 -5
- data/spec/mongoid/contextual/mongo_spec.rb +146 -69
- data/spec/mongoid/copyable_spec.rb +153 -1
- data/spec/mongoid/copyable_spec_models.rb +14 -0
- data/spec/mongoid/criteria/queryable/extensions/regexp_raw_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/regexp_spec.rb +7 -7
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +19 -7
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +28 -1
- data/spec/mongoid/criteria/queryable/mergeable_spec.rb +45 -12
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +1051 -392
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +136 -82
- data/spec/mongoid/criteria/queryable/storable_spec.rb +80 -2
- data/spec/mongoid/criteria_spec.rb +240 -41
- data/spec/mongoid/document_fields_spec.rb +29 -0
- data/spec/mongoid/document_persistence_context_spec.rb +33 -0
- data/spec/mongoid/document_spec.rb +89 -15
- data/spec/mongoid/errors/delete_restriction_spec.rb +1 -1
- data/spec/mongoid/errors/no_client_config_spec.rb +2 -2
- data/spec/mongoid/errors/no_client_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_client_hosts_spec.rb +3 -3
- data/spec/mongoid/factory_spec.rb +261 -28
- data/spec/mongoid/fields_spec.rb +72 -3
- data/spec/mongoid/findable_spec.rb +32 -0
- data/spec/mongoid/indexable_spec.rb +34 -6
- data/spec/mongoid/inspectable_spec.rb +29 -2
- data/spec/mongoid/interceptable_spec.rb +64 -2
- data/spec/mongoid/interceptable_spec_models.rb +76 -0
- 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/pushable_spec.rb +55 -1
- 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 +498 -29
- data/spec/mongoid/relations/proxy_spec.rb +1 -1
- data/spec/mongoid/reloadable_spec.rb +72 -0
- data/spec/mongoid/scopable_spec.rb +2 -1
- data/spec/mongoid/serializable_spec.rb +149 -20
- data/spec/mongoid/shardable_models.rb +61 -0
- data/spec/mongoid/shardable_spec.rb +69 -16
- data/spec/mongoid/tasks/database_rake_spec.rb +13 -13
- data/spec/mongoid/tasks/database_spec.rb +1 -1
- data/spec/mongoid/traversable_spec.rb +1100 -0
- data/spec/spec_helper.rb +4 -33
- data/spec/support/child_process_helper.rb +79 -0
- data/spec/support/cluster_config.rb +3 -3
- data/spec/support/constraints.rb +50 -10
- data/spec/support/expectations.rb +3 -1
- data/spec/support/helpers.rb +11 -0
- data/spec/support/lite_constraints.rb +22 -0
- 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/support/models/coding.rb +4 -0
- data/spec/support/models/coding/pull_request.rb +12 -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/deed.rb +8 -0
- data/spec/{app → support}/models/definition.rb +0 -0
- data/spec/support/models/delegating_patient.rb +16 -0
- data/spec/{app → support}/models/description.rb +0 -0
- data/spec/{app → support}/models/dictionary.rb +0 -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/{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 +1 -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 +1 -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 +1 -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/support/models/publication/encyclopedia.rb +12 -0
- data/spec/support/models/publication/review.rb +14 -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 +0 -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 +0 -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/session_registry.rb +50 -0
- data/spec/support/spec_config.rb +13 -5
- data/spec/support/spec_organizer.rb +130 -0
- metadata +882 -752
- 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/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
@@ -48,7 +48,7 @@ shared_context "rails rake task" do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
describe "db:drop"
|
51
|
+
describe "db:drop" do
|
52
52
|
include_context "rake task"
|
53
53
|
include_context "rails rake task"
|
54
54
|
|
@@ -61,7 +61,7 @@ describe "db:drop", if: non_legacy_server? do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
-
describe "db:purge"
|
64
|
+
describe "db:purge" do
|
65
65
|
include_context "rake task"
|
66
66
|
include_context "rails rake task"
|
67
67
|
|
@@ -74,7 +74,7 @@ describe "db:purge", if: non_legacy_server? do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
describe "db:seed"
|
77
|
+
describe "db:seed" do
|
78
78
|
include_context "rake task"
|
79
79
|
include_context "rails rake task"
|
80
80
|
|
@@ -88,7 +88,7 @@ describe "db:seed", if: non_legacy_server? do
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
describe "db:setup"
|
91
|
+
describe "db:setup" do
|
92
92
|
include_context "rake task"
|
93
93
|
include_context "rails rake task"
|
94
94
|
|
@@ -120,7 +120,7 @@ describe "db:setup", if: non_legacy_server? do
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
-
describe "db:reset"
|
123
|
+
describe "db:reset" do
|
124
124
|
include_context "rake task"
|
125
125
|
include_context "rails rake task"
|
126
126
|
|
@@ -138,7 +138,7 @@ describe "db:reset", if: non_legacy_server? do
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
describe "db:create"
|
141
|
+
describe "db:create" do
|
142
142
|
include_context "rake task"
|
143
143
|
include_context "rails rake task"
|
144
144
|
|
@@ -147,7 +147,7 @@ describe "db:create", if: non_legacy_server? do
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
-
describe "db:migrate"
|
150
|
+
describe "db:migrate" do
|
151
151
|
include_context "rake task"
|
152
152
|
include_context "rails rake task"
|
153
153
|
|
@@ -156,7 +156,7 @@ describe "db:migrate", if: non_legacy_server? do
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
-
describe "db:test:prepare"
|
159
|
+
describe "db:test:prepare" do
|
160
160
|
include_context "rake task"
|
161
161
|
include_context "rails rake task"
|
162
162
|
|
@@ -177,7 +177,7 @@ describe "db:test:prepare", if: non_legacy_server? do
|
|
177
177
|
end
|
178
178
|
end
|
179
179
|
|
180
|
-
describe "db:mongoid:create_indexes"
|
180
|
+
describe "db:mongoid:create_indexes" do
|
181
181
|
include_context "rake task"
|
182
182
|
|
183
183
|
it_behaves_like "create_indexes"
|
@@ -201,7 +201,7 @@ describe "db:mongoid:create_indexes", if: non_legacy_server? do
|
|
201
201
|
end
|
202
202
|
end
|
203
203
|
|
204
|
-
describe "db:mongoid:remove_undefined_indexes"
|
204
|
+
describe "db:mongoid:remove_undefined_indexes" do
|
205
205
|
include_context "rake task"
|
206
206
|
|
207
207
|
it "receives remove_undefined_indexes" do
|
@@ -227,7 +227,7 @@ describe "db:mongoid:remove_undefined_indexes", if: non_legacy_server? do
|
|
227
227
|
end
|
228
228
|
end
|
229
229
|
|
230
|
-
describe "db:mongoid:remove_indexes"
|
230
|
+
describe "db:mongoid:remove_indexes" do
|
231
231
|
include_context "rake task"
|
232
232
|
|
233
233
|
it "receives remove_indexes" do
|
@@ -253,7 +253,7 @@ describe "db:mongoid:remove_indexes", if: non_legacy_server? do
|
|
253
253
|
end
|
254
254
|
end
|
255
255
|
|
256
|
-
describe "db:mongoid:drop"
|
256
|
+
describe "db:mongoid:drop" do
|
257
257
|
include_context "rake task"
|
258
258
|
|
259
259
|
it "works" do
|
@@ -269,7 +269,7 @@ describe "db:mongoid:drop", if: non_legacy_server? do
|
|
269
269
|
end
|
270
270
|
end
|
271
271
|
|
272
|
-
describe "db:mongoid:purge"
|
272
|
+
describe "db:mongoid:purge" do
|
273
273
|
include_context "rake task"
|
274
274
|
|
275
275
|
it "receives a purge" do
|
@@ -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
|