mongoid 7.1.8 → 7.2.3
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 +1 -3
- data.tar.gz.sig +0 -0
- data/README.md +9 -2
- 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/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 -3
- data/lib/mongoid/criteria/queryable/storable.rb +3 -3
- data/lib/mongoid/document.rb +15 -3
- 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/matchable.rb +1 -149
- data/lib/mongoid/matcher.rb +103 -0
- data/lib/mongoid/matcher/all.rb +22 -0
- data/lib/mongoid/matcher/and.rb +21 -0
- data/lib/mongoid/matcher/elem_match.rb +36 -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 +31 -0
- data/lib/mongoid/matcher/expression_operator.rb +19 -0
- data/lib/mongoid/matcher/field_expression.rb +62 -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/associations/embedded_spec.rb +94 -0
- data/spec/integration/associations/has_many_spec.rb +67 -14
- data/spec/integration/associations/has_one_spec.rb +67 -14
- data/spec/integration/associations/nested_attributes_assignment_spec.rb +116 -0
- data/spec/integration/atomic/modifiers_spec.rb +117 -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 +409 -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 +112 -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/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 +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_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_spec.rb +84 -82
- data/spec/mongoid/criteria_spec.rb +204 -39
- data/spec/mongoid/document_fields_spec.rb +26 -0
- 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/numeric_keys.yml +104 -0
- data/spec/mongoid/matcher/extract_attribute_data/traversal.yml +239 -0
- data/spec/mongoid/matcher/extract_attribute_spec.rb +37 -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/spec_helper.rb +2 -2
- data/spec/support/constraints.rb +24 -0
- 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/{app → support}/models/customer.rb +0 -0
- data/spec/{app → support}/models/customer_address.rb +0 -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 +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 +26 -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 +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 +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 +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/spec_config.rb +1 -1
- metadata +617 -508
- metadata.gz.sig +3 -4
- 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
@@ -6,6 +6,9 @@ class HmmCompany
|
|
6
6
|
|
7
7
|
field :p, type: Integer
|
8
8
|
has_many :emails, primary_key: :p, foreign_key: :f, class_name: 'HmmEmail'
|
9
|
+
|
10
|
+
# The addresses are added with different dependency mechanisms in tests:
|
11
|
+
#has_many :addresses, class_name: 'HmmAddress', dependent: :destroy
|
9
12
|
end
|
10
13
|
|
11
14
|
class HmmEmail
|
@@ -15,6 +18,12 @@ class HmmEmail
|
|
15
18
|
belongs_to :company, primary_key: :p, foreign_key: :f, class_name: 'HmmCompany'
|
16
19
|
end
|
17
20
|
|
21
|
+
class HmmAddress
|
22
|
+
include Mongoid::Document
|
23
|
+
|
24
|
+
belongs_to :company, class_name: 'HmmCompany'
|
25
|
+
end
|
26
|
+
|
18
27
|
class HmmSchool
|
19
28
|
include Mongoid::Document
|
20
29
|
|
@@ -38,3 +47,15 @@ class HmmTicket
|
|
38
47
|
|
39
48
|
belongs_to :person
|
40
49
|
end
|
50
|
+
|
51
|
+
class HmmBus
|
52
|
+
include Mongoid::Document
|
53
|
+
|
54
|
+
has_many :seats, class_name: 'HmmBusSeat'
|
55
|
+
end
|
56
|
+
|
57
|
+
class HmmBusSeat
|
58
|
+
include Mongoid::Document
|
59
|
+
|
60
|
+
# No belongs_to :bus
|
61
|
+
end
|
@@ -6,6 +6,9 @@ class HomCollege
|
|
6
6
|
|
7
7
|
has_one :accreditation, class_name: 'HomAccreditation'
|
8
8
|
|
9
|
+
# The address is added with different dependency mechanisms in tests:
|
10
|
+
#has_one :address, class_name: 'HomAddress', dependent: :destroy
|
11
|
+
|
9
12
|
field :state, type: String
|
10
13
|
end
|
11
14
|
|
@@ -24,6 +27,12 @@ class HomAccreditation::Child
|
|
24
27
|
belongs_to :hom_college
|
25
28
|
end
|
26
29
|
|
30
|
+
class HomAddress
|
31
|
+
include Mongoid::Document
|
32
|
+
|
33
|
+
belongs_to :college, class_name: 'HomCollege'
|
34
|
+
end
|
35
|
+
|
27
36
|
module HomNs
|
28
37
|
class PrefixedParent
|
29
38
|
include Mongoid::Document
|
@@ -49,3 +58,15 @@ class HomPolymorphicChild
|
|
49
58
|
|
50
59
|
belongs_to :p_parent, polymorphic: true
|
51
60
|
end
|
61
|
+
|
62
|
+
class HomBus
|
63
|
+
include Mongoid::Document
|
64
|
+
|
65
|
+
has_one :driver, class_name: 'HomBusDriver'
|
66
|
+
end
|
67
|
+
|
68
|
+
class HomBusDriver
|
69
|
+
include Mongoid::Document
|
70
|
+
|
71
|
+
# No belongs_to :bus
|
72
|
+
end
|
@@ -9,6 +9,26 @@ describe Mongoid::Atomic::Modifiers do
|
|
9
9
|
described_class.new
|
10
10
|
end
|
11
11
|
|
12
|
+
describe "#push_conflict?" do
|
13
|
+
let(:result) { modifiers.send(:push_conflict?, field) }
|
14
|
+
|
15
|
+
context 'for embeds many subdocument' do
|
16
|
+
context 'when another field on subdocument is being set' do
|
17
|
+
before do
|
18
|
+
modifiers.set('foo.0.a' => 1)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:field) { 'foo' }
|
22
|
+
|
23
|
+
it 'does not conflict' do
|
24
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-4982'
|
25
|
+
|
26
|
+
result.should be false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
12
32
|
describe "#add_to_set" do
|
13
33
|
|
14
34
|
context "when the unique adds are empty" do
|
@@ -344,6 +364,33 @@ describe Mongoid::Atomic::Modifiers do
|
|
344
364
|
end
|
345
365
|
end
|
346
366
|
end
|
367
|
+
|
368
|
+
context 'when there is another operation on a sibling of a key which is nested' do
|
369
|
+
|
370
|
+
let(:first_op) do
|
371
|
+
{ "addresses.0.name" => 'test' }
|
372
|
+
end
|
373
|
+
|
374
|
+
let(:push_op) do
|
375
|
+
{ "addresses.0.locations" => { "street" => "Oxford St" } }
|
376
|
+
end
|
377
|
+
|
378
|
+
before do
|
379
|
+
modifiers.set(first_op)
|
380
|
+
modifiers.push(push_op)
|
381
|
+
end
|
382
|
+
|
383
|
+
it "does not conflict and adds push to top level" do
|
384
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-4982'
|
385
|
+
|
386
|
+
modifiers.should == {
|
387
|
+
'$set' => { "addresses.0.name" => 'test' },
|
388
|
+
'$push' => {"addresses.0.locations" => {'$each' => [
|
389
|
+
{ "street" => "Oxford St" },
|
390
|
+
]}},
|
391
|
+
}
|
392
|
+
end
|
393
|
+
end
|
347
394
|
end
|
348
395
|
|
349
396
|
describe "#set" do
|
data/spec/mongoid/atomic_spec.rb
CHANGED
@@ -362,6 +362,29 @@ describe Mongoid::Atomic do
|
|
362
362
|
)
|
363
363
|
end
|
364
364
|
end
|
365
|
+
|
366
|
+
context 'when adding nested embedded docs and updating top level embedded doc' do
|
367
|
+
let!(:truck) { Truck.create! }
|
368
|
+
let!(:crate) { truck.crates.create!(volume: 1) }
|
369
|
+
|
370
|
+
before do
|
371
|
+
truck.crates.first.volume = 2
|
372
|
+
truck.crates.first.toys.build(name: 'Bear')
|
373
|
+
truck.crates.build
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'correctly distributes the operations' do
|
377
|
+
pending 'https://jira.mongodb.org/browse/MONGOID-4982'
|
378
|
+
|
379
|
+
truck.atomic_updates.should == {
|
380
|
+
'$set' => {'crates.0.volume' => 2},
|
381
|
+
'$push' => {'crates.0.toys' => {'$each' => [crate.toys.first.attributes]}},
|
382
|
+
conflicts: {
|
383
|
+
'$push' => {'crates' => {'$each' => [truck.crates.last.attributes]}},
|
384
|
+
},
|
385
|
+
}
|
386
|
+
end
|
387
|
+
end
|
365
388
|
end
|
366
389
|
end
|
367
390
|
end
|
@@ -65,6 +65,11 @@ describe Mongoid::Clients::Factory do
|
|
65
65
|
expect(client).to be_a(Mongo::Client)
|
66
66
|
end
|
67
67
|
|
68
|
+
it 'does not produce driver warnings' do
|
69
|
+
Mongo::Logger.logger.should_not receive(:warn)
|
70
|
+
client
|
71
|
+
end
|
72
|
+
|
68
73
|
let(:cluster_addresses) do
|
69
74
|
cluster.addresses.map(&:to_s)
|
70
75
|
end
|
@@ -74,6 +79,38 @@ describe Mongoid::Clients::Factory do
|
|
74
79
|
it "sets the platform to Mongoid's platform constant" do
|
75
80
|
expect(client.options[:platform]).to eq(Mongoid::PLATFORM_DETAILS)
|
76
81
|
end
|
82
|
+
|
83
|
+
context 'driver 2.13+' do
|
84
|
+
min_driver_version '2.13'
|
85
|
+
|
86
|
+
it 'sets Mongoid as a wrapping library' do
|
87
|
+
client.options[:wrapping_libraries].should == [BSON::Document.new(
|
88
|
+
Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY)]
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when configuration specifies a wrapping library' do
|
92
|
+
|
93
|
+
let(:config) do
|
94
|
+
{
|
95
|
+
default: { hosts: SpecConfig.instance.addresses, database: database_id },
|
96
|
+
analytics: {
|
97
|
+
hosts: SpecConfig.instance.addresses,
|
98
|
+
database: database_id,
|
99
|
+
options: {
|
100
|
+
wrapping_libraries: [{name: 'Foo'}],
|
101
|
+
},
|
102
|
+
}
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'adds Mongoid as another wrapping library' do
|
107
|
+
client.options[:wrapping_libraries].should == [
|
108
|
+
BSON::Document.new(Mongoid::Clients::Factory::MONGOID_WRAPPING_LIBRARY),
|
109
|
+
{'name' => 'Foo'},
|
110
|
+
]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
77
114
|
end
|
78
115
|
|
79
116
|
context "when the configuration has no ports" do
|
@@ -20,12 +20,7 @@ describe Mongoid::Clients::Sessions do
|
|
20
20
|
|
21
21
|
let(:subscriber) do
|
22
22
|
client = Mongoid::Clients.with_name(:other)
|
23
|
-
monitoring =
|
24
|
-
client.send(:monitoring)
|
25
|
-
else
|
26
|
-
# driver 2.5
|
27
|
-
client.instance_variable_get('@monitoring')
|
28
|
-
end
|
23
|
+
monitoring = client.send(:monitoring)
|
29
24
|
monitoring.subscribers['Command'].find do |s|
|
30
25
|
s.is_a?(EventSubscriber)
|
31
26
|
end
|
data/spec/mongoid/config_spec.rb
CHANGED
@@ -197,6 +197,34 @@ describe Mongoid::Config do
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
200
|
+
context 'when discriminator_key override' do
|
201
|
+
context 'is not set in the config' do
|
202
|
+
it 'has the value _type by default' do
|
203
|
+
Mongoid::Config.reset
|
204
|
+
configuration = CONFIG.merge(options: {})
|
205
|
+
|
206
|
+
Mongoid.configure { |config| config.load_configuration(configuration) }
|
207
|
+
|
208
|
+
expect(Mongoid::Config.discriminator_key).to be("_type")
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'is set in the config' do
|
213
|
+
it 'sets the value' do
|
214
|
+
Mongoid::Config.reset
|
215
|
+
configuration = CONFIG.merge(options: {discriminator_key: "test"})
|
216
|
+
|
217
|
+
Mongoid.configure { |config| config.load_configuration(configuration) }
|
218
|
+
|
219
|
+
expect(Mongoid::Config.discriminator_key).to be("test")
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'is set globally' do
|
223
|
+
expect(Mongoid.discriminator_key).to be("test")
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
200
228
|
describe "#load!" do
|
201
229
|
|
202
230
|
before(:all) do
|
@@ -109,11 +109,8 @@ describe Mongoid::Contextual::Mongo do
|
|
109
109
|
described_class.new(criteria.cache)
|
110
110
|
end
|
111
111
|
|
112
|
-
before do
|
113
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
114
|
-
end
|
115
|
-
|
116
112
|
it "returns the count cached value after first call" do
|
113
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
117
114
|
2.times { expect(context.count).to eq(1) }
|
118
115
|
end
|
119
116
|
end
|
@@ -195,6 +192,71 @@ describe Mongoid::Contextual::Mongo do
|
|
195
192
|
end
|
196
193
|
end
|
197
194
|
|
195
|
+
describe "#estimated_count" do
|
196
|
+
|
197
|
+
let!(:depeche) do
|
198
|
+
Band.create(name: "Depeche Mode")
|
199
|
+
end
|
200
|
+
|
201
|
+
let!(:new_order) do
|
202
|
+
Band.create(name: "New Order")
|
203
|
+
end
|
204
|
+
|
205
|
+
let(:criteria) do
|
206
|
+
Band.where
|
207
|
+
end
|
208
|
+
|
209
|
+
context "when not providing options" do
|
210
|
+
it 'returns the correct count' do
|
211
|
+
expect(criteria.estimated_count).to eq(2)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
context "when providing options" do
|
216
|
+
it 'returns the correct count' do
|
217
|
+
expect(criteria.estimated_count(maxTimeMS: 1000)).to eq(2)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context "when context is cached" do
|
222
|
+
|
223
|
+
let(:context) do
|
224
|
+
described_class.new(criteria.cache)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "returns the count cached value after first call" do
|
228
|
+
expect(context.view).to receive(:estimated_document_count).once.and_return(1)
|
229
|
+
2.times do
|
230
|
+
context.estimated_count
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context "when the criteria contains a selector", :focus do
|
236
|
+
let(:criteria) do
|
237
|
+
Band.where(name: "New Order")
|
238
|
+
end
|
239
|
+
|
240
|
+
context "when not providing options" do
|
241
|
+
it 'raises an error' do
|
242
|
+
expect do
|
243
|
+
criteria.estimated_count
|
244
|
+
end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
context "when providing options" do
|
249
|
+
it 'raises an error' do
|
250
|
+
expect do
|
251
|
+
criteria.estimated_count(maxTimeMS: 1000)
|
252
|
+
end.to raise_error(Mongoid::Errors::InvalidEstimatedCountCriteria)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
|
198
260
|
[ :delete, :delete_all ].each do |method|
|
199
261
|
|
200
262
|
describe "##{method}" do
|
@@ -1399,12 +1461,8 @@ describe Mongoid::Contextual::Mongo do
|
|
1399
1461
|
end
|
1400
1462
|
|
1401
1463
|
context "when calling more than once" do
|
1402
|
-
|
1403
|
-
before do
|
1404
|
-
expect(context.view).to receive(:count).once.and_return(2)
|
1405
|
-
end
|
1406
|
-
|
1407
1464
|
it "returns the cached value for subsequent calls" do
|
1465
|
+
expect(context.view).to receive(:count_documents).once.and_return(2)
|
1408
1466
|
2.times { expect(context.send(method)).to eq(2) }
|
1409
1467
|
end
|
1410
1468
|
end
|
@@ -1413,10 +1471,10 @@ describe Mongoid::Contextual::Mongo do
|
|
1413
1471
|
|
1414
1472
|
before do
|
1415
1473
|
context.entries
|
1416
|
-
expect(context.view).to receive(:count).once.and_return(2)
|
1417
1474
|
end
|
1418
1475
|
|
1419
1476
|
it "returns the cached value for all calls" do
|
1477
|
+
expect(context.view).to receive(:count_documents).once.and_return(2)
|
1420
1478
|
expect(context.send(method)).to eq(2)
|
1421
1479
|
end
|
1422
1480
|
|
@@ -1448,12 +1506,8 @@ describe Mongoid::Contextual::Mongo do
|
|
1448
1506
|
end
|
1449
1507
|
|
1450
1508
|
context "when calling more than once" do
|
1451
|
-
|
1452
|
-
before do
|
1453
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
1454
|
-
end
|
1455
|
-
|
1456
1509
|
it "returns the cached value for subsequent calls" do
|
1510
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
1457
1511
|
2.times { expect(context.send(method)).to eq(1) }
|
1458
1512
|
end
|
1459
1513
|
end
|
@@ -1462,10 +1516,10 @@ describe Mongoid::Contextual::Mongo do
|
|
1462
1516
|
|
1463
1517
|
before do
|
1464
1518
|
context.entries
|
1465
|
-
expect(context.view).to receive(:count).once.and_return(1)
|
1466
1519
|
end
|
1467
1520
|
|
1468
1521
|
it "returns the cached value for all calls" do
|
1522
|
+
expect(context.view).to receive(:count_documents).once.and_return(1)
|
1469
1523
|
expect(context.send(method)).to eq(1)
|
1470
1524
|
end
|
1471
1525
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
# -*- coding: utf-8 -*-
|
5
4
|
require "spec_helper"
|
6
5
|
|
7
6
|
require_relative './copyable_spec_models'
|
@@ -65,30 +64,58 @@ describe Mongoid::Copyable do
|
|
65
64
|
|
66
65
|
context "when a document has fields from a legacy schema" do
|
67
66
|
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
shared_examples 'behaves as expected' do
|
68
|
+
let!(:instance) do
|
69
|
+
cls.create(name: "test")
|
70
|
+
end
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
before do
|
73
|
+
legacy_fields = { "this_is_not_a_field" => 1, "this_legacy_field_is_nil" => nil }
|
74
|
+
cls.collection.find(_id: instance.id).update_one("$set" => legacy_fields)
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
let(:cloned) do
|
78
|
+
instance.reload.send(method)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "sets the legacy attribute" do
|
82
|
+
expect(cloned.attributes['this_is_not_a_field']).to eq(1)
|
83
|
+
end
|
80
84
|
|
81
|
-
|
82
|
-
|
85
|
+
it "contains legacy attributes that are nil" do
|
86
|
+
expect(cloned.attributes.key?('this_legacy_field_is_nil')).to eq(true)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "copies the known attributes" do
|
90
|
+
expect(cloned.name).to eq('test')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'calls constructor with explicitly declared attributes only' do
|
94
|
+
expect(cls).to receive(:new).with('name' => 'test').and_call_original
|
95
|
+
cloned
|
96
|
+
end
|
83
97
|
end
|
84
98
|
|
85
|
-
|
86
|
-
|
99
|
+
context 'without Attributes::Dynamic' do
|
100
|
+
let(:cls) { CopyableSpec::Reg }
|
101
|
+
|
102
|
+
before do
|
103
|
+
cls.should_not include(Mongoid::Attributes::Dynamic)
|
104
|
+
end
|
105
|
+
|
106
|
+
include_examples 'behaves as expected'
|
87
107
|
end
|
88
108
|
|
89
|
-
|
90
|
-
|
109
|
+
context 'with Attributes::Dynamic' do
|
110
|
+
let(:cls) { CopyableSpec::Dyn }
|
111
|
+
|
112
|
+
before do
|
113
|
+
cls.should include(Mongoid::Attributes::Dynamic)
|
114
|
+
end
|
115
|
+
|
116
|
+
include_examples 'behaves as expected'
|
91
117
|
end
|
118
|
+
|
92
119
|
end
|
93
120
|
|
94
121
|
context "when using store_as" do
|
@@ -195,7 +222,7 @@ describe Mongoid::Copyable do
|
|
195
222
|
I18n.enforce_available_locales = false
|
196
223
|
I18n.locale = 'pt_BR'
|
197
224
|
person.addresses.type(ShipmentAddress).each { |address| address.shipping_name = "Título" }
|
198
|
-
person.save
|
225
|
+
person.save!
|
199
226
|
end
|
200
227
|
|
201
228
|
after do
|
@@ -353,6 +380,83 @@ describe Mongoid::Copyable do
|
|
353
380
|
end
|
354
381
|
end
|
355
382
|
end
|
383
|
+
|
384
|
+
context "when using a custom discriminator_key" do
|
385
|
+
before do
|
386
|
+
Person.discriminator_key = "dkey"
|
387
|
+
end
|
388
|
+
|
389
|
+
after do
|
390
|
+
Person.discriminator_key = nil
|
391
|
+
end
|
392
|
+
|
393
|
+
let(:copy) do
|
394
|
+
person.send(method)
|
395
|
+
end
|
396
|
+
|
397
|
+
before do
|
398
|
+
person[:versions] = [ { number: 1 } ]
|
399
|
+
end
|
400
|
+
|
401
|
+
it "copys embeds many documents" do
|
402
|
+
expect(copy.addresses).to eq(person.addresses)
|
403
|
+
end
|
404
|
+
|
405
|
+
it "copys deep embeds many documents" do
|
406
|
+
expect(copy.name.translations).to eq(person.name.translations)
|
407
|
+
end
|
408
|
+
|
409
|
+
it "sets the embedded many documents as new" do
|
410
|
+
expect(copy.addresses.first).to be_new_record
|
411
|
+
end
|
412
|
+
|
413
|
+
it "sets the deep embedded many documents as new" do
|
414
|
+
expect(copy.name.translations.first).to be_new_record
|
415
|
+
end
|
416
|
+
|
417
|
+
it "creates new embeds many instances" do
|
418
|
+
expect(copy.addresses).to_not equal(person.addresses)
|
419
|
+
end
|
420
|
+
|
421
|
+
it "creates new deep embeds many instances" do
|
422
|
+
expect(copy.name.translations).to_not equal(person.name.translations)
|
423
|
+
end
|
424
|
+
|
425
|
+
it "copys embeds one documents" do
|
426
|
+
expect(copy.name).to eq(person.name)
|
427
|
+
end
|
428
|
+
|
429
|
+
it "flags the embeds one documents as new" do
|
430
|
+
expect(copy.name).to be_new_record
|
431
|
+
end
|
432
|
+
|
433
|
+
it "creates a new embeds one instance" do
|
434
|
+
expect(copy.name).to_not equal(person.name)
|
435
|
+
end
|
436
|
+
|
437
|
+
context "when saving the copy" do
|
438
|
+
|
439
|
+
let(:reloaded) do
|
440
|
+
copy.reload
|
441
|
+
end
|
442
|
+
|
443
|
+
before do
|
444
|
+
copy.save(validate: false)
|
445
|
+
end
|
446
|
+
|
447
|
+
it "persists the attributes" do
|
448
|
+
expect(reloaded.title).to eq("Sir")
|
449
|
+
end
|
450
|
+
|
451
|
+
it "persists the embeds many relation" do
|
452
|
+
expect(reloaded.addresses).to eq(person.addresses)
|
453
|
+
end
|
454
|
+
|
455
|
+
it "persists the embeds one relation" do
|
456
|
+
expect(reloaded.name).to eq(person.name)
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
356
460
|
end
|
357
461
|
|
358
462
|
context "when the document is not new" do
|
@@ -517,6 +621,81 @@ describe Mongoid::Copyable do
|
|
517
621
|
end
|
518
622
|
end
|
519
623
|
end
|
624
|
+
|
625
|
+
context "when cloning a document with an embedded child class and a custom discriminator value" do
|
626
|
+
|
627
|
+
before do
|
628
|
+
ShipmentAddress.discriminator_value = "dvalue"
|
629
|
+
end
|
630
|
+
|
631
|
+
after do
|
632
|
+
ShipmentAddress.discriminator_value = nil
|
633
|
+
end
|
634
|
+
|
635
|
+
let!(:shipment_address) do
|
636
|
+
person.addresses.build({}, ShipmentAddress)
|
637
|
+
end
|
638
|
+
|
639
|
+
before do
|
640
|
+
person.save
|
641
|
+
end
|
642
|
+
|
643
|
+
let!(:from_db) do
|
644
|
+
Person.find(person.id)
|
645
|
+
end
|
646
|
+
|
647
|
+
let(:copy) do
|
648
|
+
from_db.send(method)
|
649
|
+
end
|
650
|
+
|
651
|
+
it "copys embeds many documents" do
|
652
|
+
expect(copy.addresses).to eq(person.addresses)
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
context 'when cloning a document with embedded child that uses inheritance' do
|
657
|
+
let(:original) do
|
658
|
+
CopyableSpec::A.new(influencers: [child_cls.new])
|
659
|
+
end
|
660
|
+
|
661
|
+
let(:copy) do
|
662
|
+
original.send(method)
|
663
|
+
end
|
664
|
+
|
665
|
+
context 'embedded child is root of hierarchy' do
|
666
|
+
let(:child_cls) do
|
667
|
+
CopyableSpec::Influencer
|
668
|
+
end
|
669
|
+
|
670
|
+
before do
|
671
|
+
# When embedded class is the root in hierarchy, their
|
672
|
+
# discriminator value is not explicitly stored.
|
673
|
+
child_cls.discriminator_mapping[child_cls.name].should be nil
|
674
|
+
end
|
675
|
+
|
676
|
+
it 'works' do
|
677
|
+
copy.class.should be original.class
|
678
|
+
copy.object_id.should_not == original.object_id
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
context 'embedded child is leaf of hierarchy' do
|
683
|
+
let(:child_cls) do
|
684
|
+
CopyableSpec::Youtuber
|
685
|
+
end
|
686
|
+
|
687
|
+
before do
|
688
|
+
# When embedded class is a leaf in hierarchy, their
|
689
|
+
# discriminator value is explicitly stored.
|
690
|
+
child_cls.discriminator_mapping[child_cls.name].should_not be nil
|
691
|
+
end
|
692
|
+
|
693
|
+
it 'works' do
|
694
|
+
copy.class.should be original.class
|
695
|
+
copy.object_id.should_not == original.object_id
|
696
|
+
end
|
697
|
+
end
|
698
|
+
end
|
520
699
|
end
|
521
700
|
end
|
522
701
|
end
|