mongoid 3.1.4 → 3.1.5
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
- data/CHANGELOG.md +34 -0
- data/lib/mongoid/contextual.rb +3 -0
- data/lib/mongoid/criteria.rb +10 -2
- data/lib/mongoid/document.rb +1 -1
- data/lib/mongoid/paranoia.rb +4 -0
- data/lib/mongoid/persistence/upsertion.rb +1 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +16 -2
- data/lib/mongoid/relations/macros.rb +1 -1
- data/lib/mongoid/relations/one.rb +12 -0
- data/lib/mongoid/relations/referenced/in.rb +18 -1
- data/lib/mongoid/relations/referenced/many_to_many.rb +2 -2
- data/lib/mongoid/validations.rb +1 -1
- data/lib/mongoid/validations/localizable.rb +1 -1
- data/lib/mongoid/validations/presence.rb +1 -1
- data/lib/mongoid/validations/uniqueness.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +32 -0
- data/spec/app/models/acolyte.rb +16 -0
- data/spec/app/models/actor.rb +19 -0
- data/spec/app/models/actor_observer.rb +15 -0
- data/spec/app/models/actress.rb +2 -0
- data/spec/app/models/address.rb +72 -0
- data/spec/app/models/address_component.rb +5 -0
- data/spec/app/models/address_number.rb +6 -0
- data/spec/app/models/agency.rb +5 -0
- data/spec/app/models/agent.rb +12 -0
- data/spec/app/models/album.rb +14 -0
- data/spec/app/models/alert.rb +5 -0
- data/spec/app/models/animal.rb +25 -0
- data/spec/app/models/answer.rb +4 -0
- data/spec/app/models/appointment.rb +7 -0
- data/spec/app/models/article.rb +13 -0
- data/spec/app/models/artist.rb +66 -0
- data/spec/app/models/artwork.rb +4 -0
- data/spec/app/models/augmentation.rb +11 -0
- data/spec/app/models/author.rb +6 -0
- data/spec/app/models/band.rb +25 -0
- data/spec/app/models/bar.rb +9 -0
- data/spec/app/models/basic.rb +6 -0
- data/spec/app/models/bed.rb +1 -0
- data/spec/app/models/big_palette.rb +2 -0
- data/spec/app/models/birthday.rb +13 -0
- data/spec/app/models/book.rb +12 -0
- data/spec/app/models/breed.rb +4 -0
- data/spec/app/models/browser.rb +6 -0
- data/spec/app/models/building.rb +7 -0
- data/spec/app/models/building_address.rb +7 -0
- data/spec/app/models/bus.rb +7 -0
- data/spec/app/models/business.rb +5 -0
- data/spec/app/models/callback_recorder.rb +25 -0
- data/spec/app/models/callback_test.rb +9 -0
- data/spec/app/models/canvas.rb +25 -0
- data/spec/app/models/car.rb +1 -0
- data/spec/app/models/cat.rb +8 -0
- data/spec/app/models/category.rb +8 -0
- data/spec/app/models/child.rb +4 -0
- data/spec/app/models/child_doc.rb +22 -0
- data/spec/app/models/church.rb +4 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +4 -0
- data/spec/app/models/circus.rb +7 -0
- data/spec/app/models/code.rb +5 -0
- data/spec/app/models/comment.rb +16 -0
- data/spec/app/models/contractor.rb +7 -0
- data/spec/app/models/cookie.rb +6 -0
- data/spec/app/models/country_code.rb +8 -0
- data/spec/app/models/definition.rb +8 -0
- data/spec/app/models/description.rb +11 -0
- data/spec/app/models/dictionary.rb +10 -0
- data/spec/app/models/division.rb +10 -0
- data/spec/app/models/doctor.rb +12 -0
- data/spec/app/models/dog.rb +7 -0
- data/spec/app/models/dokument.rb +5 -0
- data/spec/app/models/driver.rb +7 -0
- data/spec/app/models/drug.rb +8 -0
- data/spec/app/models/email.rb +6 -0
- data/spec/app/models/employer.rb +5 -0
- data/spec/app/models/entry.rb +6 -0
- data/spec/app/models/eraser.rb +1 -0
- data/spec/app/models/event.rb +22 -0
- data/spec/app/models/exhibition.rb +4 -0
- data/spec/app/models/exhibitor.rb +5 -0
- data/spec/app/models/eye.rb +9 -0
- data/spec/app/models/eye_bowl.rb +9 -0
- data/spec/app/models/face.rb +8 -0
- data/spec/app/models/favorite.rb +6 -0
- data/spec/app/models/filesystem.rb +4 -0
- data/spec/app/models/fire_hydrant.rb +6 -0
- data/spec/app/models/firefox.rb +4 -0
- data/spec/app/models/fish.rb +8 -0
- data/spec/app/models/folder.rb +7 -0
- data/spec/app/models/folder_item.rb +9 -0
- data/spec/app/models/fruits.rb +28 -0
- data/spec/app/models/game.rb +21 -0
- data/spec/app/models/ghost.rb +7 -0
- data/spec/app/models/home.rb +4 -0
- data/spec/app/models/house.rb +8 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/image.rb +22 -0
- data/spec/app/models/implant.rb +16 -0
- data/spec/app/models/item.rb +12 -0
- data/spec/app/models/jar.rb +7 -0
- data/spec/app/models/label.rb +40 -0
- data/spec/app/models/language.rb +5 -0
- data/spec/app/models/lat_lng.rb +15 -0
- data/spec/app/models/league.rb +11 -0
- data/spec/app/models/learner.rb +2 -0
- data/spec/app/models/line_item.rb +6 -0
- data/spec/app/models/location.rb +8 -0
- data/spec/app/models/login.rb +8 -0
- data/spec/app/models/manufacturer.rb +7 -0
- data/spec/app/models/meat.rb +4 -0
- data/spec/app/models/membership.rb +4 -0
- data/spec/app/models/mixed_drink.rb +4 -0
- data/spec/app/models/movie.rb +12 -0
- data/spec/app/models/my_hash.rb +2 -0
- data/spec/app/models/name.rb +23 -0
- data/spec/app/models/node.rb +5 -0
- data/spec/app/models/note.rb +12 -0
- data/spec/app/models/ordered_post.rb +6 -0
- data/spec/app/models/ordered_preference.rb +6 -0
- data/spec/app/models/oscar.rb +15 -0
- data/spec/app/models/override.rb +16 -0
- data/spec/app/models/ownable.rb +6 -0
- data/spec/app/models/owner.rb +6 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +5 -0
- data/spec/app/models/page_question.rb +4 -0
- data/spec/app/models/palette.rb +7 -0
- data/spec/app/models/paranoid_phone.rb +25 -0
- data/spec/app/models/paranoid_post.rb +36 -0
- data/spec/app/models/parent.rb +5 -0
- data/spec/app/models/parent_doc.rb +6 -0
- data/spec/app/models/passport.rb +5 -0
- data/spec/app/models/patient.rb +9 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +1 -0
- data/spec/app/models/person.rb +201 -0
- data/spec/app/models/pet.rb +23 -0
- data/spec/app/models/pet_owner.rb +6 -0
- data/spec/app/models/phone.rb +11 -0
- data/spec/app/models/phone_observer.rb +6 -0
- data/spec/app/models/pizza.rb +7 -0
- data/spec/app/models/player.rb +35 -0
- data/spec/app/models/post.rb +43 -0
- data/spec/app/models/powerup.rb +11 -0
- data/spec/app/models/preference.rb +9 -0
- data/spec/app/models/princess.rb +8 -0
- data/spec/app/models/product.rb +17 -0
- data/spec/app/models/profile.rb +5 -0
- data/spec/app/models/pronunciation.rb +5 -0
- data/spec/app/models/purchase.rb +4 -0
- data/spec/app/models/question.rb +8 -0
- data/spec/app/models/quiz.rb +10 -0
- data/spec/app/models/rating.rb +8 -0
- data/spec/app/models/record.rb +46 -0
- data/spec/app/models/registry.rb +4 -0
- data/spec/app/models/role.rb +7 -0
- data/spec/app/models/root_category.rb +4 -0
- data/spec/app/models/sandwich.rb +4 -0
- data/spec/app/models/scheduler.rb +7 -0
- data/spec/app/models/seo.rb +7 -0
- data/spec/app/models/series.rb +4 -0
- data/spec/app/models/server.rb +13 -0
- data/spec/app/models/service.rb +22 -0
- data/spec/app/models/shape.rb +12 -0
- data/spec/app/models/shelf.rb +5 -0
- data/spec/app/models/shipping_container.rb +5 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +6 -0
- data/spec/app/models/short_agent.rb +4 -0
- data/spec/app/models/short_quiz.rb +5 -0
- data/spec/app/models/slave.rb +6 -0
- data/spec/app/models/song.rb +8 -0
- data/spec/app/models/square.rb +4 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +4 -0
- data/spec/app/models/survey.rb +5 -0
- data/spec/app/models/symptom.rb +6 -0
- data/spec/app/models/tag.rb +8 -0
- data/spec/app/models/target.rb +5 -0
- data/spec/app/models/template.rb +5 -0
- data/spec/app/models/thing.rb +9 -0
- data/spec/app/models/title.rb +4 -0
- data/spec/app/models/tool.rb +8 -0
- data/spec/app/models/topping.rb +5 -0
- data/spec/app/models/track.rb +38 -0
- data/spec/app/models/translation.rb +5 -0
- data/spec/app/models/tree.rb +9 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/user.rb +21 -0
- data/spec/app/models/user_account.rb +10 -0
- data/spec/app/models/validation_callback.rb +10 -0
- data/spec/app/models/vehicle.rb +11 -0
- data/spec/app/models/version.rb +5 -0
- data/spec/app/models/vet_visit.rb +5 -0
- data/spec/app/models/video.rb +17 -0
- data/spec/app/models/video_game.rb +1 -0
- data/spec/app/models/weapon.rb +11 -0
- data/spec/app/models/wiki_page.rb +17 -0
- data/spec/app/models/word.rb +12 -0
- data/spec/app/models/word_origin.rb +11 -0
- data/spec/app/models/writer.rb +11 -0
- data/spec/config/mongoid.yml +40 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +159 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +152 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +106 -0
- data/spec/mongoid/atomic/paths_spec.rb +270 -0
- data/spec/mongoid/atomic/positionable_spec.rb +227 -0
- data/spec/mongoid/atomic_spec.rb +365 -0
- data/spec/mongoid/attributes/processing_spec.rb +149 -0
- data/spec/mongoid/attributes/readonly_spec.rb +169 -0
- data/spec/mongoid/attributes_spec.rb +1705 -0
- data/spec/mongoid/callbacks_spec.rb +1564 -0
- data/spec/mongoid/components_spec.rb +24 -0
- data/spec/mongoid/config/environment_spec.rb +83 -0
- data/spec/mongoid/config/options_spec.rb +56 -0
- data/spec/mongoid/config_spec.rb +334 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
- data/spec/mongoid/contextual/atomic_spec.rb +525 -0
- data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
- data/spec/mongoid/contextual/memory_spec.rb +1236 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1757 -0
- data/spec/mongoid/copyable_spec.rb +393 -0
- data/spec/mongoid/criteria_spec.rb +5140 -0
- data/spec/mongoid/criterion/destructive_spec.rb +101 -0
- data/spec/mongoid/criterion/inspection_spec.rb +27 -0
- data/spec/mongoid/criterion/marshalable_spec.rb +28 -0
- data/spec/mongoid/criterion/modifiable_spec.rb +409 -0
- data/spec/mongoid/criterion/modification_spec.rb +402 -0
- data/spec/mongoid/criterion/scoping_spec.rb +391 -0
- data/spec/mongoid/dirty_spec.rb +1508 -0
- data/spec/mongoid/document_spec.rb +1146 -0
- data/spec/mongoid/equality_spec.rb +241 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
- data/spec/mongoid/errors/callback_spec.rb +29 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
- data/spec/mongoid/errors/eager_load_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
- data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/no_environment_spec.rb +29 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
- data/spec/mongoid/errors/no_parent_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
- data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
- data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
- data/spec/mongoid/errors/validations_spec.rb +45 -0
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +29 -0
- data/spec/mongoid/extensions/array_spec.rb +638 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
- data/spec/mongoid/extensions/binary_spec.rb +60 -0
- data/spec/mongoid/extensions/boolean_spec.rb +135 -0
- data/spec/mongoid/extensions/date_spec.rb +235 -0
- data/spec/mongoid/extensions/date_time_spec.rb +155 -0
- data/spec/mongoid/extensions/false_class_spec.rb +42 -0
- data/spec/mongoid/extensions/float_spec.rb +133 -0
- data/spec/mongoid/extensions/hash_spec.rb +333 -0
- data/spec/mongoid/extensions/integer_spec.rb +136 -0
- data/spec/mongoid/extensions/module_spec.rb +42 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
- data/spec/mongoid/extensions/object_id_spec.rb +946 -0
- data/spec/mongoid/extensions/object_spec.rb +292 -0
- data/spec/mongoid/extensions/range_spec.rb +105 -0
- data/spec/mongoid/extensions/regexp_spec.rb +47 -0
- data/spec/mongoid/extensions/set_spec.rb +33 -0
- data/spec/mongoid/extensions/string_spec.rb +368 -0
- data/spec/mongoid/extensions/symbol_spec.rb +76 -0
- data/spec/mongoid/extensions/time_spec.rb +467 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
- data/spec/mongoid/extensions/true_class_spec.rb +42 -0
- data/spec/mongoid/factory_spec.rb +185 -0
- data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
- data/spec/mongoid/fields/localized_spec.rb +386 -0
- data/spec/mongoid/fields/standard_spec.rb +166 -0
- data/spec/mongoid/fields_spec.rb +1253 -0
- data/spec/mongoid/finders_spec.rb +321 -0
- data/spec/mongoid/hierarchy_spec.rb +244 -0
- data/spec/mongoid/identity_map_spec.rb +564 -0
- data/spec/mongoid/indexes_spec.rb +404 -0
- data/spec/mongoid/inspection_spec.rb +57 -0
- data/spec/mongoid/json_spec.rb +33 -0
- data/spec/mongoid/loggable_spec.rb +21 -0
- data/spec/mongoid/matchers/all_spec.rb +31 -0
- data/spec/mongoid/matchers/and_spec.rb +162 -0
- data/spec/mongoid/matchers/default_spec.rb +130 -0
- data/spec/mongoid/matchers/exists_spec.rb +57 -0
- data/spec/mongoid/matchers/gt_spec.rb +74 -0
- data/spec/mongoid/matchers/gte_spec.rb +74 -0
- data/spec/mongoid/matchers/in_spec.rb +25 -0
- data/spec/mongoid/matchers/lt_spec.rb +74 -0
- data/spec/mongoid/matchers/lte_spec.rb +74 -0
- data/spec/mongoid/matchers/ne_spec.rb +25 -0
- data/spec/mongoid/matchers/nin_spec.rb +25 -0
- data/spec/mongoid/matchers/or_spec.rb +106 -0
- data/spec/mongoid/matchers/size_spec.rb +25 -0
- data/spec/mongoid/matchers_spec.rb +532 -0
- data/spec/mongoid/multi_parameter_attributes_spec.rb +128 -0
- data/spec/mongoid/nested_attributes_spec.rb +4945 -0
- data/spec/mongoid/observer_spec.rb +290 -0
- data/spec/mongoid/paranoia_spec.rb +759 -0
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +262 -0
- data/spec/mongoid/persistence/atomic/bit_spec.rb +88 -0
- data/spec/mongoid/persistence/atomic/inc_spec.rb +133 -0
- data/spec/mongoid/persistence/atomic/pop_spec.rb +111 -0
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/pull_spec.rb +80 -0
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/push_spec.rb +77 -0
- data/spec/mongoid/persistence/atomic/rename_spec.rb +42 -0
- data/spec/mongoid/persistence/atomic/sets_spec.rb +154 -0
- data/spec/mongoid/persistence/atomic/unset_spec.rb +65 -0
- data/spec/mongoid/persistence/atomic_spec.rb +216 -0
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +191 -0
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +8 -0
- data/spec/mongoid/persistence/operations/insert_spec.rb +149 -0
- data/spec/mongoid/persistence/operations/remove_spec.rb +113 -0
- data/spec/mongoid/persistence/operations/update_spec.rb +141 -0
- data/spec/mongoid/persistence/operations/upsert_spec.rb +59 -0
- data/spec/mongoid/persistence/operations_spec.rb +313 -0
- data/spec/mongoid/persistence_spec.rb +2279 -0
- data/spec/mongoid/railties/document_spec.rb +24 -0
- data/spec/mongoid/relations/accessors_spec.rb +844 -0
- data/spec/mongoid/relations/auto_save_spec.rb +261 -0
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
- data/spec/mongoid/relations/builders_spec.rb +226 -0
- data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
- data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
- data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
- data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
- data/spec/mongoid/relations/cascading_spec.rb +355 -0
- data/spec/mongoid/relations/constraint_spec.rb +74 -0
- data/spec/mongoid/relations/conversions_spec.rb +126 -0
- data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
- data/spec/mongoid/relations/cyclic_spec.rb +156 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
- data/spec/mongoid/relations/embedded/in_spec.rb +580 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +3841 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +1055 -0
- data/spec/mongoid/relations/macros_spec.rb +625 -0
- data/spec/mongoid/relations/metadata_spec.rb +2030 -0
- data/spec/mongoid/relations/options_spec.rb +35 -0
- data/spec/mongoid/relations/polymorphic_spec.rb +132 -0
- data/spec/mongoid/relations/proxy_spec.rb +48 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1501 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +3632 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3561 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +1331 -0
- data/spec/mongoid/relations/reflections_spec.rb +101 -0
- data/spec/mongoid/relations/synchronization_spec.rb +453 -0
- data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
- data/spec/mongoid/relations_spec.rb +188 -0
- data/spec/mongoid/reloading_spec.rb +305 -0
- data/spec/mongoid/scoping_spec.rb +978 -0
- data/spec/mongoid/serialization_spec.rb +833 -0
- data/spec/mongoid/sessions/factory_spec.rb +312 -0
- data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
- data/spec/mongoid/sessions_spec.rb +1111 -0
- data/spec/mongoid/sharding_spec.rb +61 -0
- data/spec/mongoid/state_spec.rb +102 -0
- data/spec/mongoid/threaded_spec.rb +296 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
- data/spec/mongoid/timestamps/created_spec.rb +44 -0
- data/spec/mongoid/timestamps/timeless_spec.rb +130 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
- data/spec/mongoid/timestamps/updated_spec.rb +86 -0
- data/spec/mongoid/timestamps_spec.rb +112 -0
- data/spec/mongoid/unit_of_work_spec.rb +196 -0
- data/spec/mongoid/validations/associated_spec.rb +183 -0
- data/spec/mongoid/validations/format_spec.rb +83 -0
- data/spec/mongoid/validations/length_spec.rb +223 -0
- data/spec/mongoid/validations/numericality_spec.rb +30 -0
- data/spec/mongoid/validations/presence_spec.rb +592 -0
- data/spec/mongoid/validations/uniqueness_spec.rb +2399 -0
- data/spec/mongoid/validations_spec.rb +309 -0
- data/spec/mongoid/versioning_spec.rb +540 -0
- data/spec/mongoid_spec.rb +74 -0
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
- data/spec/rails/mongoid_spec.rb +462 -0
- data/spec/spec_helper.rb +93 -0
- metadata +826 -6
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Options do
|
|
4
|
+
|
|
5
|
+
describe ".validate!" do
|
|
6
|
+
|
|
7
|
+
let(:relation) do
|
|
8
|
+
Mongoid::Relations::Embedded::Many
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "when the options are valid for the relation" do
|
|
12
|
+
|
|
13
|
+
let(:options) do
|
|
14
|
+
{ relation: relation, as: :addressable }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "returns true" do
|
|
18
|
+
described_class.validate!(options).should be_true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when the options are invalid for the relation" do
|
|
23
|
+
|
|
24
|
+
let(:options) do
|
|
25
|
+
{ name: :addresses, relation: relation, polymorphic: true }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "raises an error" do
|
|
29
|
+
expect {
|
|
30
|
+
described_class.validate!(options)
|
|
31
|
+
}.to raise_error(Mongoid::Errors::InvalidOptions)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Polymorphic do
|
|
4
|
+
|
|
5
|
+
describe "#polymorph" do
|
|
6
|
+
|
|
7
|
+
let(:klass) do
|
|
8
|
+
Class.new.tap { |c| c.send(:include, Mongoid::Document) }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "when the relation is polymorphic" do
|
|
12
|
+
|
|
13
|
+
context "when the relation stores a foreign key" do
|
|
14
|
+
|
|
15
|
+
let(:metadata) do
|
|
16
|
+
Mongoid::Relations::Metadata.new(
|
|
17
|
+
name: :ratable,
|
|
18
|
+
polymorphic: true,
|
|
19
|
+
relation: Mongoid::Relations::Referenced::In
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
let!(:polymorphed) do
|
|
24
|
+
klass.polymorph(metadata)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "sets polymorphic to true" do
|
|
28
|
+
klass.should be_polymorphic
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "adds the foreign key type field" do
|
|
32
|
+
klass.fields["ratable_type"].should_not be_nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "adds the foreign key inverse field field" do
|
|
36
|
+
klass.fields["ratable_field"].should_not be_nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "returns self" do
|
|
40
|
+
polymorphed.should eq(klass)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "when the relation does not store a foreign key" do
|
|
45
|
+
|
|
46
|
+
let(:metadata) do
|
|
47
|
+
Mongoid::Relations::Metadata.new(
|
|
48
|
+
name: :ratings,
|
|
49
|
+
as: :ratable,
|
|
50
|
+
relation: Mongoid::Relations::Referenced::Many
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
before do
|
|
55
|
+
klass.polymorph(metadata)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "sets polymorphic to true" do
|
|
59
|
+
klass.should be_polymorphic
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "does not add the foreign key type field" do
|
|
63
|
+
klass.fields["ratable_type"].should be_nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "does not add the foreign key inverse field field" do
|
|
67
|
+
klass.fields["ratable_field"].should be_nil
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when the relation is not polymorphic" do
|
|
73
|
+
|
|
74
|
+
let(:metadata) do
|
|
75
|
+
Mongoid::Relations::Metadata.new(
|
|
76
|
+
name: :ratings,
|
|
77
|
+
relation: Mongoid::Relations::Referenced::Many
|
|
78
|
+
)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
before do
|
|
82
|
+
klass.polymorph(metadata)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "sets polymorphic to false" do
|
|
86
|
+
klass.should_not be_polymorphic
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "does not add the foreign key type field" do
|
|
90
|
+
klass.fields["ratable_type"].should be_nil
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "does not add the foreign key inverse field field" do
|
|
94
|
+
klass.fields["ratable_field"].should be_nil
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe ".polymorphic?" do
|
|
100
|
+
|
|
101
|
+
context "when the document is in a polymorphic relation" do
|
|
102
|
+
|
|
103
|
+
it "returns true" do
|
|
104
|
+
Movie.should be_polymorphic
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "when the document is not in a polymorphic relation" do
|
|
109
|
+
|
|
110
|
+
it "returns false" do
|
|
111
|
+
Survey.should_not be_polymorphic
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe "#polymorphic?" do
|
|
117
|
+
|
|
118
|
+
context "when the document is in a polymorphic relation" do
|
|
119
|
+
|
|
120
|
+
it "returns true" do
|
|
121
|
+
Movie.new.should be_polymorphic
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context "when the document is not in a polymorphic relation" do
|
|
126
|
+
|
|
127
|
+
it "returns false" do
|
|
128
|
+
Survey.new.should_not be_polymorphic
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Proxy do
|
|
4
|
+
|
|
5
|
+
describe "#extend" do
|
|
6
|
+
|
|
7
|
+
before(:all) do
|
|
8
|
+
Person.reset_callbacks(:validate)
|
|
9
|
+
module Testable
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after(:all) do
|
|
14
|
+
Object.send(:remove_const, :Testable)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
let(:person) do
|
|
18
|
+
Person.create
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
let(:name) do
|
|
22
|
+
person.build_name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
before do
|
|
26
|
+
name.namable.extend(Testable)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "extends the proxied object" do
|
|
30
|
+
person.should be_a(Testable)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "when extending from the relation definition" do
|
|
34
|
+
|
|
35
|
+
let!(:address) do
|
|
36
|
+
person.addresses.create(street: "hobrecht")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let(:found) do
|
|
40
|
+
person.addresses.find_by_street("hobrecht")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "extends the proxy" do
|
|
44
|
+
found.should eq(address)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,1501 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Referenced::In do
|
|
4
|
+
|
|
5
|
+
before(:all) do
|
|
6
|
+
Person.reset_callbacks(:validate)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:person) do
|
|
10
|
+
Person.create
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#=" do
|
|
14
|
+
|
|
15
|
+
context "when the relation is named target" do
|
|
16
|
+
|
|
17
|
+
let(:target) do
|
|
18
|
+
User.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "when the relation is referenced from an embeds many" do
|
|
22
|
+
|
|
23
|
+
context "when setting via create" do
|
|
24
|
+
|
|
25
|
+
let(:service) do
|
|
26
|
+
person.services.create(target: target)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "sets the target relation" do
|
|
30
|
+
service.target.should eq(target)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when the inverse relation has no reference defined" do
|
|
37
|
+
|
|
38
|
+
let(:agent) do
|
|
39
|
+
Agent.new(title: "007")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
let(:game) do
|
|
43
|
+
Game.new(name: "Donkey Kong")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
agent.game = game
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "sets the relation" do
|
|
51
|
+
agent.game.should eq(game)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "sets the foreign_key" do
|
|
55
|
+
agent.game_id.should eq(game.id)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "when referencing a document from an embedded document" do
|
|
60
|
+
|
|
61
|
+
let(:person) do
|
|
62
|
+
Person.create
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
let(:address) do
|
|
66
|
+
person.addresses.create(street: "Wienerstr")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
let(:account) do
|
|
70
|
+
Account.create(name: "1", number: 1000000)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
before do
|
|
74
|
+
address.account = account
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "sets the relation" do
|
|
78
|
+
address.account.should eq(account)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "does not erase the metadata" do
|
|
82
|
+
address.metadata.should_not be_nil
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "allows saving of the embedded document" do
|
|
86
|
+
address.save.should be_true
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "when the parent is a references one" do
|
|
91
|
+
|
|
92
|
+
context "when the relation is not polymorphic" do
|
|
93
|
+
|
|
94
|
+
context "when the child is a new record" do
|
|
95
|
+
|
|
96
|
+
let(:person) do
|
|
97
|
+
Person.new
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
let(:game) do
|
|
101
|
+
Game.new
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
before do
|
|
105
|
+
game.person = person
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "sets the target of the relation" do
|
|
109
|
+
game.person.target.should eq(person)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "sets the foreign key on the relation" do
|
|
113
|
+
game.person_id.should eq(person.id)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "sets the base on the inverse relation" do
|
|
117
|
+
person.game.should eq(game)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "sets the same instance on the inverse relation" do
|
|
121
|
+
person.game.should eql(game)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "does not save the target" do
|
|
125
|
+
person.should_not be_persisted
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "when the child is not a new record" do
|
|
130
|
+
|
|
131
|
+
let(:person) do
|
|
132
|
+
Person.new
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
let(:game) do
|
|
136
|
+
Game.create
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
before do
|
|
140
|
+
game.person = person
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "sets the target of the relation" do
|
|
144
|
+
game.person.target.should eq(person)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "sets the foreign key of the relation" do
|
|
148
|
+
game.person_id.should eq(person.id)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "sets the base on the inverse relation" do
|
|
152
|
+
person.game.should eq(game)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "sets the same instance on the inverse relation" do
|
|
156
|
+
person.game.should eql(game)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "does not saves the target" do
|
|
160
|
+
person.should_not be_persisted
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context "when the relation is polymorphic" do
|
|
166
|
+
|
|
167
|
+
context "when the parent is a subclass" do
|
|
168
|
+
|
|
169
|
+
let(:canvas) do
|
|
170
|
+
Canvas::Test.create
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
let(:comment) do
|
|
174
|
+
Comment.create(title: "test")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
before do
|
|
178
|
+
comment.commentable = canvas
|
|
179
|
+
comment.save
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "sets the correct value in the type field" do
|
|
183
|
+
comment.commentable_type.should eq("Canvas::Test")
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "can retrieve the document from the database" do
|
|
187
|
+
comment.reload.commentable.should eq(canvas)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
context "when the child is a new record" do
|
|
192
|
+
|
|
193
|
+
let(:bar) do
|
|
194
|
+
Bar.new
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
let(:rating) do
|
|
198
|
+
Rating.new
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
before do
|
|
202
|
+
rating.ratable = bar
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "sets the target of the relation" do
|
|
206
|
+
rating.ratable.target.should eq(bar)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "sets the foreign key on the relation" do
|
|
210
|
+
rating.ratable_id.should eq(bar.id)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it "does not set the inverse of field on the relation" do
|
|
214
|
+
rating.ratable_field.should be_nil
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "sets the base on the inverse relation" do
|
|
218
|
+
bar.rating.should eq(rating)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "sets the same instance on the inverse relation" do
|
|
222
|
+
bar.rating.should eql(rating)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
it "does not save the target" do
|
|
226
|
+
bar.should_not be_persisted
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context "when the child is not a new record" do
|
|
231
|
+
|
|
232
|
+
let(:bar) do
|
|
233
|
+
Bar.new
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
let(:rating) do
|
|
237
|
+
Rating.create
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
before do
|
|
241
|
+
rating.ratable = bar
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it "sets the target of the relation" do
|
|
245
|
+
rating.ratable.target.should eq(bar)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it "sets the foreign key of the relation" do
|
|
249
|
+
rating.ratable_id.should eq(bar.id)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it "does not set the inverse of field on the relation" do
|
|
253
|
+
rating.ratable_field.should be_nil
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it "sets the base on the inverse relation" do
|
|
257
|
+
bar.rating.should eq(rating)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "sets the same instance on the inverse relation" do
|
|
261
|
+
bar.rating.should eql(rating)
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it "does not saves the target" do
|
|
265
|
+
bar.should_not be_persisted
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
context "when the parent is a references many" do
|
|
272
|
+
|
|
273
|
+
context "when the relation is not polymorphic" do
|
|
274
|
+
|
|
275
|
+
context "when the child is a new record" do
|
|
276
|
+
|
|
277
|
+
let(:person) do
|
|
278
|
+
Person.new
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
let(:post) do
|
|
282
|
+
Post.new
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
before do
|
|
286
|
+
post.person = person
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "sets the target of the relation" do
|
|
290
|
+
post.person.target.should eq(person)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
it "sets the foreign key on the relation" do
|
|
294
|
+
post.person_id.should eq(person.id)
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "does not save the target" do
|
|
298
|
+
person.should_not be_persisted
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context "when the child is not a new record" do
|
|
303
|
+
|
|
304
|
+
let(:person) do
|
|
305
|
+
Person.new
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
let(:post) do
|
|
309
|
+
Post.create
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
before do
|
|
313
|
+
post.person = person
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it "sets the target of the relation" do
|
|
317
|
+
post.person.target.should eq(person)
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
it "sets the foreign key of the relation" do
|
|
321
|
+
post.person_id.should eq(person.id)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "does not saves the target" do
|
|
325
|
+
person.should_not be_persisted
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
context "when the relation is polymorphic" do
|
|
331
|
+
|
|
332
|
+
context "when multiple relations against the same class exist" do
|
|
333
|
+
|
|
334
|
+
let(:face) do
|
|
335
|
+
Face.new
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
let(:eye) do
|
|
339
|
+
Eye.new
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
it "raises an error" do
|
|
343
|
+
expect {
|
|
344
|
+
eye.eyeable = face
|
|
345
|
+
}.to raise_error(Mongoid::Errors::InvalidSetPolymorphicRelation)
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
context "when multiple relations of the same name but different class exist" do
|
|
350
|
+
|
|
351
|
+
let(:eye) do
|
|
352
|
+
Eye.new
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
let(:eye_bowl) do
|
|
356
|
+
EyeBowl.new
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
it "should assign as expected" do
|
|
360
|
+
eye.suspended_in = eye_bowl
|
|
361
|
+
eye.suspended_in.target.should eq(eye_bowl)
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
context "when one relation against the same class exists" do
|
|
366
|
+
|
|
367
|
+
context "when the child is a new record" do
|
|
368
|
+
|
|
369
|
+
let(:movie) do
|
|
370
|
+
Movie.new
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
let(:rating) do
|
|
374
|
+
Rating.new
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
before do
|
|
378
|
+
rating.ratable = movie
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
it "sets the target of the relation" do
|
|
382
|
+
rating.ratable.target.should eq(movie)
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
it "sets the foreign key on the relation" do
|
|
386
|
+
rating.ratable_id.should eq(movie.id)
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
it "does not save the target" do
|
|
390
|
+
movie.should_not be_persisted
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
context "when the child is not a new record" do
|
|
395
|
+
|
|
396
|
+
let(:movie) do
|
|
397
|
+
Movie.new
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
let(:rating) do
|
|
401
|
+
Rating.create
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
before do
|
|
405
|
+
rating.ratable = movie
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
it "sets the target of the relation" do
|
|
409
|
+
rating.ratable.target.should eq(movie)
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
it "sets the foreign key of the relation" do
|
|
413
|
+
rating.ratable_id.should eq(movie.id)
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
it "does not saves the target" do
|
|
417
|
+
movie.should_not be_persisted
|
|
418
|
+
end
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
describe "#= nil" do
|
|
426
|
+
|
|
427
|
+
context "when dependent is destroy" do
|
|
428
|
+
|
|
429
|
+
let(:account) do
|
|
430
|
+
Account.create
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
let(:drug) do
|
|
434
|
+
Drug.create
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
let(:person) do
|
|
438
|
+
Person.create
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
context "when relation is has_one" do
|
|
442
|
+
|
|
443
|
+
before do
|
|
444
|
+
Account.belongs_to :person, dependent: :destroy
|
|
445
|
+
Person.has_one :account
|
|
446
|
+
person.account = account
|
|
447
|
+
person.save
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
after :all do
|
|
451
|
+
Account.belongs_to :person, dependent: :nullify
|
|
452
|
+
Person.has_one :account, validate: false
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
context "when parent exists" do
|
|
456
|
+
|
|
457
|
+
context "when child is destroyed" do
|
|
458
|
+
|
|
459
|
+
before do
|
|
460
|
+
account.delete
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
it "deletes child" do
|
|
464
|
+
account.should be_destroyed
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
it "deletes parent" do
|
|
468
|
+
person.should be_destroyed
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
end
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
context "when relation is has_many" do
|
|
475
|
+
|
|
476
|
+
before do
|
|
477
|
+
Drug.belongs_to :person, dependent: :destroy
|
|
478
|
+
Person.has_many :drugs
|
|
479
|
+
person.drugs = [drug]
|
|
480
|
+
person.save
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
after :all do
|
|
484
|
+
Drug.belongs_to :person, dependent: :nullify
|
|
485
|
+
Person.has_many :drugs, validate: false
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
context "when parent exists" do
|
|
489
|
+
|
|
490
|
+
context "when child is destroyed" do
|
|
491
|
+
|
|
492
|
+
before do
|
|
493
|
+
drug.delete
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
it "deletes child" do
|
|
497
|
+
drug.should be_destroyed
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it "deletes parent" do
|
|
501
|
+
person.should be_destroyed
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
context "when dependent is delete" do
|
|
509
|
+
|
|
510
|
+
let(:account) do
|
|
511
|
+
Account.create
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
let(:drug) do
|
|
515
|
+
Drug.create
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
let(:person) do
|
|
519
|
+
Person.create
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
context "when relation is has_one" do
|
|
523
|
+
|
|
524
|
+
before do
|
|
525
|
+
Account.belongs_to :person, dependent: :delete
|
|
526
|
+
Person.has_one :account
|
|
527
|
+
person.account = account
|
|
528
|
+
person.save
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
after :all do
|
|
532
|
+
Account.belongs_to :person, dependent: :nullify
|
|
533
|
+
Person.has_one :account, validate: false
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
context "when parent is persisted" do
|
|
537
|
+
|
|
538
|
+
context "when child is deleted" do
|
|
539
|
+
|
|
540
|
+
before do
|
|
541
|
+
account.delete
|
|
542
|
+
end
|
|
543
|
+
|
|
544
|
+
it "deletes child" do
|
|
545
|
+
account.should be_destroyed
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
it "deletes parent" do
|
|
549
|
+
person.should be_destroyed
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
context "when relation is has_many" do
|
|
556
|
+
|
|
557
|
+
before do
|
|
558
|
+
Drug.belongs_to :person, dependent: :delete
|
|
559
|
+
Person.has_many :drugs
|
|
560
|
+
person.drugs = [drug]
|
|
561
|
+
person.save
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
after :all do
|
|
565
|
+
Drug.belongs_to :person, dependent: :nullify
|
|
566
|
+
Person.has_many :drugs, validate: false
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
context "when parent exists" do
|
|
570
|
+
|
|
571
|
+
context "when child is destroyed" do
|
|
572
|
+
|
|
573
|
+
before do
|
|
574
|
+
drug.delete
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
it "deletes child" do
|
|
578
|
+
drug.should be_destroyed
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
it "deletes parent" do
|
|
582
|
+
person.should be_destroyed
|
|
583
|
+
end
|
|
584
|
+
end
|
|
585
|
+
end
|
|
586
|
+
end
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
context "when dependent is nullify" do
|
|
590
|
+
|
|
591
|
+
let(:account) do
|
|
592
|
+
Account.create
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
let(:drug) do
|
|
596
|
+
Drug.create
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
let(:person) do
|
|
600
|
+
Person.create
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
context "when relation is has_one" do
|
|
604
|
+
|
|
605
|
+
before do
|
|
606
|
+
Account.belongs_to :person, dependent: :nullify
|
|
607
|
+
Person.has_one :account
|
|
608
|
+
person.account = account
|
|
609
|
+
person.save
|
|
610
|
+
end
|
|
611
|
+
|
|
612
|
+
context "when parent is persisted" do
|
|
613
|
+
|
|
614
|
+
context "when child is deleted" do
|
|
615
|
+
|
|
616
|
+
before do
|
|
617
|
+
account.delete
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
it "deletes child" do
|
|
621
|
+
account.should be_destroyed
|
|
622
|
+
end
|
|
623
|
+
|
|
624
|
+
it "doesn't delete parent" do
|
|
625
|
+
person.should_not be_destroyed
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
it "removes the link" do
|
|
629
|
+
person.account.should be_nil
|
|
630
|
+
end
|
|
631
|
+
end
|
|
632
|
+
end
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
context "when relation is has_many" do
|
|
636
|
+
|
|
637
|
+
before do
|
|
638
|
+
Drug.belongs_to :person, dependent: :nullify
|
|
639
|
+
Person.has_many :drugs
|
|
640
|
+
person.drugs = [drug]
|
|
641
|
+
person.save
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
context "when parent exists" do
|
|
645
|
+
|
|
646
|
+
context "when child is destroyed" do
|
|
647
|
+
|
|
648
|
+
before do
|
|
649
|
+
drug.delete
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
it "deletes child" do
|
|
653
|
+
drug.should be_destroyed
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
it "doesn't deletes parent" do
|
|
657
|
+
person.should_not be_destroyed
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
it "removes the link" do
|
|
661
|
+
person.drugs.should eq([])
|
|
662
|
+
end
|
|
663
|
+
end
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
end
|
|
667
|
+
|
|
668
|
+
context "when the inverse relation has no reference defined" do
|
|
669
|
+
|
|
670
|
+
let(:agent) do
|
|
671
|
+
Agent.new(title: "007")
|
|
672
|
+
end
|
|
673
|
+
|
|
674
|
+
let(:game) do
|
|
675
|
+
Game.new(name: "Donkey Kong")
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
before do
|
|
679
|
+
agent.game = game
|
|
680
|
+
agent.game = nil
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
it "removes the relation" do
|
|
684
|
+
agent.game.should be_nil
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
it "removes the foreign_key" do
|
|
688
|
+
agent.game_id.should be_nil
|
|
689
|
+
end
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
context "when the parent is a references one" do
|
|
693
|
+
|
|
694
|
+
context "when the relation is not polymorphic" do
|
|
695
|
+
|
|
696
|
+
context "when the parent is a new record" do
|
|
697
|
+
|
|
698
|
+
let(:person) do
|
|
699
|
+
Person.new
|
|
700
|
+
end
|
|
701
|
+
|
|
702
|
+
let(:game) do
|
|
703
|
+
Game.new
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
before do
|
|
707
|
+
game.person = person
|
|
708
|
+
game.person = nil
|
|
709
|
+
end
|
|
710
|
+
|
|
711
|
+
it "sets the relation to nil" do
|
|
712
|
+
game.person.should be_nil
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
it "removed the inverse relation" do
|
|
716
|
+
person.game.should be_nil
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
it "removes the foreign key value" do
|
|
720
|
+
game.person_id.should be_nil
|
|
721
|
+
end
|
|
722
|
+
end
|
|
723
|
+
|
|
724
|
+
context "when the parent is not a new record" do
|
|
725
|
+
|
|
726
|
+
let(:person) do
|
|
727
|
+
Person.create
|
|
728
|
+
end
|
|
729
|
+
|
|
730
|
+
let(:game) do
|
|
731
|
+
Game.create
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
before do
|
|
735
|
+
game.person = person
|
|
736
|
+
game.person = nil
|
|
737
|
+
end
|
|
738
|
+
|
|
739
|
+
it "sets the relation to nil" do
|
|
740
|
+
game.person.should be_nil
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
it "removed the inverse relation" do
|
|
744
|
+
person.game.should be_nil
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
it "removes the foreign key value" do
|
|
748
|
+
game.person_id.should be_nil
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
it "does not delete the child" do
|
|
752
|
+
game.should_not be_destroyed
|
|
753
|
+
end
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
context "when the relation is polymorphic" do
|
|
758
|
+
|
|
759
|
+
context "when multiple relations against the same class exist" do
|
|
760
|
+
|
|
761
|
+
context "when the parent is a new record" do
|
|
762
|
+
|
|
763
|
+
let(:face) do
|
|
764
|
+
Face.new
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
let(:eye) do
|
|
768
|
+
Eye.new
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
before do
|
|
772
|
+
face.left_eye = eye
|
|
773
|
+
eye.eyeable = nil
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
it "sets the relation to nil" do
|
|
777
|
+
eye.eyeable.should be_nil
|
|
778
|
+
end
|
|
779
|
+
|
|
780
|
+
it "removed the inverse relation" do
|
|
781
|
+
face.left_eye.should be_nil
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
it "removes the foreign key value" do
|
|
785
|
+
eye.eyeable_id.should be_nil
|
|
786
|
+
end
|
|
787
|
+
end
|
|
788
|
+
|
|
789
|
+
context "when the parent is not a new record" do
|
|
790
|
+
|
|
791
|
+
let(:face) do
|
|
792
|
+
Face.new
|
|
793
|
+
end
|
|
794
|
+
|
|
795
|
+
let(:eye) do
|
|
796
|
+
Eye.create
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
before do
|
|
800
|
+
face.left_eye = eye
|
|
801
|
+
eye.eyeable = nil
|
|
802
|
+
end
|
|
803
|
+
|
|
804
|
+
it "sets the relation to nil" do
|
|
805
|
+
eye.eyeable.should be_nil
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
it "removed the inverse relation" do
|
|
809
|
+
face.left_eye.should be_nil
|
|
810
|
+
end
|
|
811
|
+
|
|
812
|
+
it "removes the foreign key value" do
|
|
813
|
+
eye.eyeable_id.should be_nil
|
|
814
|
+
end
|
|
815
|
+
end
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
context "when one relation against the same class exists" do
|
|
819
|
+
|
|
820
|
+
context "when the parent is a new record" do
|
|
821
|
+
|
|
822
|
+
let(:bar) do
|
|
823
|
+
Bar.new
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
let(:rating) do
|
|
827
|
+
Rating.new
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
before do
|
|
831
|
+
rating.ratable = bar
|
|
832
|
+
rating.ratable = nil
|
|
833
|
+
end
|
|
834
|
+
|
|
835
|
+
it "sets the relation to nil" do
|
|
836
|
+
rating.ratable.should be_nil
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
it "removed the inverse relation" do
|
|
840
|
+
bar.rating.should be_nil
|
|
841
|
+
end
|
|
842
|
+
|
|
843
|
+
it "removes the foreign key value" do
|
|
844
|
+
rating.ratable_id.should be_nil
|
|
845
|
+
end
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
context "when the parent is not a new record" do
|
|
849
|
+
|
|
850
|
+
let(:bar) do
|
|
851
|
+
Bar.new
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
let(:rating) do
|
|
855
|
+
Rating.create
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
before do
|
|
859
|
+
rating.ratable = bar
|
|
860
|
+
rating.ratable = nil
|
|
861
|
+
end
|
|
862
|
+
|
|
863
|
+
it "sets the relation to nil" do
|
|
864
|
+
rating.ratable.should be_nil
|
|
865
|
+
end
|
|
866
|
+
|
|
867
|
+
it "removed the inverse relation" do
|
|
868
|
+
bar.rating.should be_nil
|
|
869
|
+
end
|
|
870
|
+
|
|
871
|
+
it "removes the foreign key value" do
|
|
872
|
+
rating.ratable_id.should be_nil
|
|
873
|
+
end
|
|
874
|
+
end
|
|
875
|
+
end
|
|
876
|
+
end
|
|
877
|
+
end
|
|
878
|
+
|
|
879
|
+
context "when the parent is a references many" do
|
|
880
|
+
|
|
881
|
+
context "when the relation is not polymorphic" do
|
|
882
|
+
|
|
883
|
+
context "when the parent is a new record" do
|
|
884
|
+
|
|
885
|
+
let(:person) do
|
|
886
|
+
Person.new
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
let(:post) do
|
|
890
|
+
Post.new
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
before do
|
|
894
|
+
post.person = person
|
|
895
|
+
post.person = nil
|
|
896
|
+
end
|
|
897
|
+
|
|
898
|
+
it "sets the relation to nil" do
|
|
899
|
+
post.person.should be_nil
|
|
900
|
+
end
|
|
901
|
+
|
|
902
|
+
it "removed the inverse relation" do
|
|
903
|
+
person.posts.should be_empty
|
|
904
|
+
end
|
|
905
|
+
|
|
906
|
+
it "removes the foreign key value" do
|
|
907
|
+
post.person_id.should be_nil
|
|
908
|
+
end
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
context "when the parent is not a new record" do
|
|
912
|
+
|
|
913
|
+
let(:person) do
|
|
914
|
+
Person.new
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
let(:post) do
|
|
918
|
+
Post.create
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
before do
|
|
922
|
+
post.person = person
|
|
923
|
+
post.person = nil
|
|
924
|
+
end
|
|
925
|
+
|
|
926
|
+
it "sets the relation to nil" do
|
|
927
|
+
post.person.should be_nil
|
|
928
|
+
end
|
|
929
|
+
|
|
930
|
+
it "removed the inverse relation" do
|
|
931
|
+
person.posts.should be_empty
|
|
932
|
+
end
|
|
933
|
+
|
|
934
|
+
it "removes the foreign key value" do
|
|
935
|
+
post.person_id.should be_nil
|
|
936
|
+
end
|
|
937
|
+
end
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
context "when the relation is polymorphic" do
|
|
941
|
+
|
|
942
|
+
context "when the parent is a new record" do
|
|
943
|
+
|
|
944
|
+
let(:movie) do
|
|
945
|
+
Movie.new
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
let(:rating) do
|
|
949
|
+
Rating.new
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
before do
|
|
953
|
+
rating.ratable = movie
|
|
954
|
+
rating.ratable = nil
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
it "sets the relation to nil" do
|
|
958
|
+
rating.ratable.should be_nil
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
it "removed the inverse relation" do
|
|
962
|
+
movie.ratings.should be_empty
|
|
963
|
+
end
|
|
964
|
+
|
|
965
|
+
it "removes the foreign key value" do
|
|
966
|
+
rating.ratable_id.should be_nil
|
|
967
|
+
end
|
|
968
|
+
end
|
|
969
|
+
|
|
970
|
+
context "when the parent is not a new record" do
|
|
971
|
+
|
|
972
|
+
let(:movie) do
|
|
973
|
+
Movie.new
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
let(:rating) do
|
|
977
|
+
Rating.create
|
|
978
|
+
end
|
|
979
|
+
|
|
980
|
+
before do
|
|
981
|
+
rating.ratable = movie
|
|
982
|
+
rating.ratable = nil
|
|
983
|
+
end
|
|
984
|
+
|
|
985
|
+
it "sets the relation to nil" do
|
|
986
|
+
rating.ratable.should be_nil
|
|
987
|
+
end
|
|
988
|
+
|
|
989
|
+
it "removed the inverse relation" do
|
|
990
|
+
movie.ratings.should be_empty
|
|
991
|
+
end
|
|
992
|
+
|
|
993
|
+
it "removes the foreign key value" do
|
|
994
|
+
rating.ratable_id.should be_nil
|
|
995
|
+
end
|
|
996
|
+
end
|
|
997
|
+
end
|
|
998
|
+
end
|
|
999
|
+
end
|
|
1000
|
+
|
|
1001
|
+
describe ".builder" do
|
|
1002
|
+
|
|
1003
|
+
let(:builder_klass) do
|
|
1004
|
+
Mongoid::Relations::Builders::Referenced::In
|
|
1005
|
+
end
|
|
1006
|
+
|
|
1007
|
+
let(:document) do
|
|
1008
|
+
stub
|
|
1009
|
+
end
|
|
1010
|
+
|
|
1011
|
+
let(:metadata) do
|
|
1012
|
+
stub(extension?: false)
|
|
1013
|
+
end
|
|
1014
|
+
|
|
1015
|
+
it "returns the embedded in builder" do
|
|
1016
|
+
described_class.builder(nil, metadata, document).should
|
|
1017
|
+
be_a_kind_of(builder_klass)
|
|
1018
|
+
end
|
|
1019
|
+
end
|
|
1020
|
+
|
|
1021
|
+
describe ".eager_load" do
|
|
1022
|
+
|
|
1023
|
+
before do
|
|
1024
|
+
Mongoid.identity_map_enabled = true
|
|
1025
|
+
end
|
|
1026
|
+
|
|
1027
|
+
after do
|
|
1028
|
+
Mongoid.identity_map_enabled = false
|
|
1029
|
+
end
|
|
1030
|
+
|
|
1031
|
+
context "when the relation is not polymorphic" do
|
|
1032
|
+
|
|
1033
|
+
let!(:person) do
|
|
1034
|
+
Person.create
|
|
1035
|
+
end
|
|
1036
|
+
|
|
1037
|
+
let!(:post) do
|
|
1038
|
+
person.posts.create(title: "testing")
|
|
1039
|
+
end
|
|
1040
|
+
|
|
1041
|
+
let(:metadata) do
|
|
1042
|
+
Post.relations["person"]
|
|
1043
|
+
end
|
|
1044
|
+
|
|
1045
|
+
let(:eager) do
|
|
1046
|
+
described_class.eager_load(metadata, Post.all)
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
let!(:map) do
|
|
1050
|
+
Mongoid::IdentityMap.get(Person, person.id)
|
|
1051
|
+
end
|
|
1052
|
+
|
|
1053
|
+
it "puts the document in the identity map" do
|
|
1054
|
+
map.should eq(person)
|
|
1055
|
+
end
|
|
1056
|
+
end
|
|
1057
|
+
|
|
1058
|
+
context "when the relation is polymorphic" do
|
|
1059
|
+
|
|
1060
|
+
let(:metadata) do
|
|
1061
|
+
Rating.relations["ratable"]
|
|
1062
|
+
end
|
|
1063
|
+
|
|
1064
|
+
it "raises an error" do
|
|
1065
|
+
expect {
|
|
1066
|
+
described_class.eager_load(metadata, Rating.all)
|
|
1067
|
+
}.to raise_error(Mongoid::Errors::EagerLoad)
|
|
1068
|
+
end
|
|
1069
|
+
end
|
|
1070
|
+
|
|
1071
|
+
context "when the ids has been duplicated" do
|
|
1072
|
+
|
|
1073
|
+
let!(:person) do
|
|
1074
|
+
Person.create
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
let!(:posts) do
|
|
1078
|
+
2.times {|i| person.posts.create(title: "testing#{i}") }
|
|
1079
|
+
person.posts
|
|
1080
|
+
end
|
|
1081
|
+
|
|
1082
|
+
let(:metadata) do
|
|
1083
|
+
Post.relations["person"]
|
|
1084
|
+
end
|
|
1085
|
+
|
|
1086
|
+
let(:eager) do
|
|
1087
|
+
described_class.eager_load(metadata, posts.map(&:person_id))
|
|
1088
|
+
end
|
|
1089
|
+
|
|
1090
|
+
it "duplication should be removed" do
|
|
1091
|
+
eager.count.should eq(1)
|
|
1092
|
+
end
|
|
1093
|
+
end
|
|
1094
|
+
end
|
|
1095
|
+
|
|
1096
|
+
describe ".embedded?" do
|
|
1097
|
+
|
|
1098
|
+
it "returns false" do
|
|
1099
|
+
described_class.should_not be_embedded
|
|
1100
|
+
end
|
|
1101
|
+
end
|
|
1102
|
+
|
|
1103
|
+
describe ".foreign_key_suffix" do
|
|
1104
|
+
|
|
1105
|
+
it "returns _id" do
|
|
1106
|
+
described_class.foreign_key_suffix.should eq("_id")
|
|
1107
|
+
end
|
|
1108
|
+
end
|
|
1109
|
+
|
|
1110
|
+
describe ".macro" do
|
|
1111
|
+
|
|
1112
|
+
it "returns belongs_to" do
|
|
1113
|
+
described_class.macro.should eq(:belongs_to)
|
|
1114
|
+
end
|
|
1115
|
+
end
|
|
1116
|
+
|
|
1117
|
+
describe "#respond_to?" do
|
|
1118
|
+
|
|
1119
|
+
let(:person) do
|
|
1120
|
+
Person.new
|
|
1121
|
+
end
|
|
1122
|
+
|
|
1123
|
+
let(:game) do
|
|
1124
|
+
person.build_game(name: "Tron")
|
|
1125
|
+
end
|
|
1126
|
+
|
|
1127
|
+
let(:document) do
|
|
1128
|
+
game.person
|
|
1129
|
+
end
|
|
1130
|
+
|
|
1131
|
+
Mongoid::Document.public_instance_methods(true).each do |method|
|
|
1132
|
+
|
|
1133
|
+
context "when checking #{method}" do
|
|
1134
|
+
|
|
1135
|
+
it "returns true" do
|
|
1136
|
+
document.respond_to?(method).should be_true
|
|
1137
|
+
end
|
|
1138
|
+
end
|
|
1139
|
+
end
|
|
1140
|
+
end
|
|
1141
|
+
|
|
1142
|
+
describe ".stores_foreign_key?" do
|
|
1143
|
+
|
|
1144
|
+
it "returns true" do
|
|
1145
|
+
described_class.stores_foreign_key?.should be_true
|
|
1146
|
+
end
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
describe ".valid_options" do
|
|
1150
|
+
|
|
1151
|
+
it "returns the valid options" do
|
|
1152
|
+
described_class.valid_options.should eq(
|
|
1153
|
+
[
|
|
1154
|
+
:autobuild,
|
|
1155
|
+
:autosave,
|
|
1156
|
+
:dependent,
|
|
1157
|
+
:foreign_key,
|
|
1158
|
+
:index,
|
|
1159
|
+
:polymorphic,
|
|
1160
|
+
:primary_key,
|
|
1161
|
+
:touch
|
|
1162
|
+
]
|
|
1163
|
+
)
|
|
1164
|
+
end
|
|
1165
|
+
end
|
|
1166
|
+
|
|
1167
|
+
describe ".validation_default" do
|
|
1168
|
+
|
|
1169
|
+
it "returns false" do
|
|
1170
|
+
described_class.validation_default.should be_false
|
|
1171
|
+
end
|
|
1172
|
+
end
|
|
1173
|
+
|
|
1174
|
+
context "when the relation is self referencing" do
|
|
1175
|
+
|
|
1176
|
+
let(:game_one) do
|
|
1177
|
+
Game.new(name: "Diablo")
|
|
1178
|
+
end
|
|
1179
|
+
|
|
1180
|
+
let(:game_two) do
|
|
1181
|
+
Game.new(name: "Warcraft")
|
|
1182
|
+
end
|
|
1183
|
+
|
|
1184
|
+
context "when setting the parent" do
|
|
1185
|
+
|
|
1186
|
+
before do
|
|
1187
|
+
game_one.parent = game_two
|
|
1188
|
+
end
|
|
1189
|
+
|
|
1190
|
+
it "sets the parent" do
|
|
1191
|
+
game_one.parent.should eq(game_two)
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
it "does not set the parent recursively" do
|
|
1195
|
+
game_two.parent.should be_nil
|
|
1196
|
+
end
|
|
1197
|
+
end
|
|
1198
|
+
end
|
|
1199
|
+
|
|
1200
|
+
context "when the relation belongs to a has many and has one" do
|
|
1201
|
+
|
|
1202
|
+
before(:all) do
|
|
1203
|
+
class A
|
|
1204
|
+
include Mongoid::Document
|
|
1205
|
+
has_many :bs, inverse_of: :a
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
class B
|
|
1209
|
+
include Mongoid::Document
|
|
1210
|
+
belongs_to :a, inverse_of: :bs
|
|
1211
|
+
belongs_to :c, inverse_of: :b
|
|
1212
|
+
end
|
|
1213
|
+
|
|
1214
|
+
class C
|
|
1215
|
+
include Mongoid::Document
|
|
1216
|
+
has_one :b, inverse_of: :c
|
|
1217
|
+
end
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
after(:all) do
|
|
1221
|
+
Object.send(:remove_const, :A)
|
|
1222
|
+
Object.send(:remove_const, :B)
|
|
1223
|
+
Object.send(:remove_const, :C)
|
|
1224
|
+
end
|
|
1225
|
+
|
|
1226
|
+
context "when setting the has one" do
|
|
1227
|
+
|
|
1228
|
+
let(:a) do
|
|
1229
|
+
A.new
|
|
1230
|
+
end
|
|
1231
|
+
|
|
1232
|
+
let(:b) do
|
|
1233
|
+
B.new
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
let(:c) do
|
|
1237
|
+
C.new
|
|
1238
|
+
end
|
|
1239
|
+
|
|
1240
|
+
before do
|
|
1241
|
+
b.c = c
|
|
1242
|
+
end
|
|
1243
|
+
|
|
1244
|
+
context "when subsequently setting the has many" do
|
|
1245
|
+
|
|
1246
|
+
before do
|
|
1247
|
+
b.a = a
|
|
1248
|
+
end
|
|
1249
|
+
|
|
1250
|
+
context "when setting the has one again" do
|
|
1251
|
+
|
|
1252
|
+
before do
|
|
1253
|
+
b.c = c
|
|
1254
|
+
end
|
|
1255
|
+
|
|
1256
|
+
it "allows the reset of the has one" do
|
|
1257
|
+
b.c.should eq(c)
|
|
1258
|
+
end
|
|
1259
|
+
end
|
|
1260
|
+
end
|
|
1261
|
+
end
|
|
1262
|
+
end
|
|
1263
|
+
|
|
1264
|
+
context "when replacing the relation with another" do
|
|
1265
|
+
|
|
1266
|
+
let!(:person) do
|
|
1267
|
+
Person.create
|
|
1268
|
+
end
|
|
1269
|
+
|
|
1270
|
+
let!(:post) do
|
|
1271
|
+
Post.create(title: "test")
|
|
1272
|
+
end
|
|
1273
|
+
|
|
1274
|
+
let!(:game) do
|
|
1275
|
+
person.create_game(name: "Tron")
|
|
1276
|
+
end
|
|
1277
|
+
|
|
1278
|
+
before do
|
|
1279
|
+
post.person = game.person
|
|
1280
|
+
post.save
|
|
1281
|
+
end
|
|
1282
|
+
|
|
1283
|
+
it "clones the relation" do
|
|
1284
|
+
post.person.should eq(person)
|
|
1285
|
+
end
|
|
1286
|
+
|
|
1287
|
+
it "sets the foreign key" do
|
|
1288
|
+
post.person_id.should eq(person.id)
|
|
1289
|
+
end
|
|
1290
|
+
|
|
1291
|
+
it "does not remove the previous relation" do
|
|
1292
|
+
game.person.should eq(person)
|
|
1293
|
+
end
|
|
1294
|
+
|
|
1295
|
+
it "does not remove the previous foreign key" do
|
|
1296
|
+
game.person_id.should eq(person.id)
|
|
1297
|
+
end
|
|
1298
|
+
|
|
1299
|
+
context "when reloading" do
|
|
1300
|
+
|
|
1301
|
+
before do
|
|
1302
|
+
post.reload
|
|
1303
|
+
game.reload
|
|
1304
|
+
end
|
|
1305
|
+
|
|
1306
|
+
it "persists the relation" do
|
|
1307
|
+
post.reload.person.should eq(person)
|
|
1308
|
+
end
|
|
1309
|
+
|
|
1310
|
+
it "persists the foreign key" do
|
|
1311
|
+
post.reload.person_id.should eq(game.person_id)
|
|
1312
|
+
end
|
|
1313
|
+
|
|
1314
|
+
it "does not remove the previous relation" do
|
|
1315
|
+
game.person.should eq(person)
|
|
1316
|
+
end
|
|
1317
|
+
|
|
1318
|
+
it "does not remove the previous foreign key" do
|
|
1319
|
+
game.person_id.should eq(person.id)
|
|
1320
|
+
end
|
|
1321
|
+
end
|
|
1322
|
+
end
|
|
1323
|
+
|
|
1324
|
+
context "when the document belongs to a has one and has many" do
|
|
1325
|
+
|
|
1326
|
+
let(:movie) do
|
|
1327
|
+
Movie.create(name: "Infernal Affairs")
|
|
1328
|
+
end
|
|
1329
|
+
|
|
1330
|
+
let(:account) do
|
|
1331
|
+
Account.create(name: "Leung")
|
|
1332
|
+
end
|
|
1333
|
+
|
|
1334
|
+
context "when creating the document" do
|
|
1335
|
+
|
|
1336
|
+
let(:comment) do
|
|
1337
|
+
Comment.create(movie: movie, account: account)
|
|
1338
|
+
end
|
|
1339
|
+
|
|
1340
|
+
it "sets the correct has one" do
|
|
1341
|
+
comment.account.should eq(account)
|
|
1342
|
+
end
|
|
1343
|
+
|
|
1344
|
+
it "sets the correct has many" do
|
|
1345
|
+
comment.movie.should eq(movie)
|
|
1346
|
+
end
|
|
1347
|
+
end
|
|
1348
|
+
end
|
|
1349
|
+
|
|
1350
|
+
context "when reloading the relation" do
|
|
1351
|
+
|
|
1352
|
+
let!(:person_one) do
|
|
1353
|
+
Person.create
|
|
1354
|
+
end
|
|
1355
|
+
|
|
1356
|
+
let!(:person_two) do
|
|
1357
|
+
Person.create(title: "Sir")
|
|
1358
|
+
end
|
|
1359
|
+
|
|
1360
|
+
let!(:game) do
|
|
1361
|
+
Game.create(name: "Starcraft 2")
|
|
1362
|
+
end
|
|
1363
|
+
|
|
1364
|
+
before do
|
|
1365
|
+
game.person = person_one
|
|
1366
|
+
game.save
|
|
1367
|
+
end
|
|
1368
|
+
|
|
1369
|
+
context "when the relation references the same document" do
|
|
1370
|
+
|
|
1371
|
+
before do
|
|
1372
|
+
Person.collection.find({ _id: person_one.id }).
|
|
1373
|
+
update({ "$set" => { title: "Madam" }})
|
|
1374
|
+
end
|
|
1375
|
+
|
|
1376
|
+
let(:reloaded) do
|
|
1377
|
+
game.person(true)
|
|
1378
|
+
end
|
|
1379
|
+
|
|
1380
|
+
it "reloads the document from the database" do
|
|
1381
|
+
reloaded.title.should eq("Madam")
|
|
1382
|
+
end
|
|
1383
|
+
|
|
1384
|
+
it "sets a new document instance" do
|
|
1385
|
+
reloaded.should_not equal(person_one)
|
|
1386
|
+
end
|
|
1387
|
+
end
|
|
1388
|
+
|
|
1389
|
+
context "when the relation references a different document" do
|
|
1390
|
+
|
|
1391
|
+
before do
|
|
1392
|
+
game.person_id = person_two.id
|
|
1393
|
+
game.save
|
|
1394
|
+
end
|
|
1395
|
+
|
|
1396
|
+
let(:reloaded) do
|
|
1397
|
+
game.person(true)
|
|
1398
|
+
end
|
|
1399
|
+
|
|
1400
|
+
it "reloads the new document from the database" do
|
|
1401
|
+
reloaded.title.should eq("Sir")
|
|
1402
|
+
end
|
|
1403
|
+
|
|
1404
|
+
it "sets a new document instance" do
|
|
1405
|
+
reloaded.should_not equal(person_one)
|
|
1406
|
+
end
|
|
1407
|
+
end
|
|
1408
|
+
end
|
|
1409
|
+
|
|
1410
|
+
context "when the parent and child are persisted" do
|
|
1411
|
+
|
|
1412
|
+
context "when the identity map is enabled" do
|
|
1413
|
+
|
|
1414
|
+
before do
|
|
1415
|
+
Mongoid.identity_map_enabled = true
|
|
1416
|
+
end
|
|
1417
|
+
|
|
1418
|
+
after do
|
|
1419
|
+
Mongoid.identity_map_enabled = false
|
|
1420
|
+
end
|
|
1421
|
+
|
|
1422
|
+
let(:series) do
|
|
1423
|
+
Series.create
|
|
1424
|
+
end
|
|
1425
|
+
|
|
1426
|
+
let!(:book_one) do
|
|
1427
|
+
series.books.create
|
|
1428
|
+
end
|
|
1429
|
+
|
|
1430
|
+
let!(:book_two) do
|
|
1431
|
+
series.books.create
|
|
1432
|
+
end
|
|
1433
|
+
|
|
1434
|
+
let(:id) do
|
|
1435
|
+
Book.first.id
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
context "when asking for the inverse multiple times" do
|
|
1439
|
+
|
|
1440
|
+
before do
|
|
1441
|
+
Book.find(id).series.books.to_a
|
|
1442
|
+
end
|
|
1443
|
+
|
|
1444
|
+
it "does not append and save duplicate docs" do
|
|
1445
|
+
Book.find(id).series.books.to_a.length.should eq(2)
|
|
1446
|
+
end
|
|
1447
|
+
|
|
1448
|
+
it "returns the same documents from the map" do
|
|
1449
|
+
Book.find(id).should equal(Book.find(id))
|
|
1450
|
+
end
|
|
1451
|
+
end
|
|
1452
|
+
end
|
|
1453
|
+
end
|
|
1454
|
+
|
|
1455
|
+
context "when creating with a reference to an integer id parent" do
|
|
1456
|
+
|
|
1457
|
+
let!(:jar) do
|
|
1458
|
+
Jar.create do |doc|
|
|
1459
|
+
doc._id = 1
|
|
1460
|
+
end
|
|
1461
|
+
end
|
|
1462
|
+
|
|
1463
|
+
let(:cookie) do
|
|
1464
|
+
Cookie.create(jar_id: "1")
|
|
1465
|
+
end
|
|
1466
|
+
|
|
1467
|
+
it "allows strings to be passed as the id" do
|
|
1468
|
+
cookie.jar.should eq(jar)
|
|
1469
|
+
end
|
|
1470
|
+
|
|
1471
|
+
it "persists the relation" do
|
|
1472
|
+
cookie.reload.jar.should eq(jar)
|
|
1473
|
+
end
|
|
1474
|
+
end
|
|
1475
|
+
|
|
1476
|
+
context "when setting the relation via the foreign key" do
|
|
1477
|
+
|
|
1478
|
+
context "when the relation exists" do
|
|
1479
|
+
|
|
1480
|
+
let!(:person_one) do
|
|
1481
|
+
Person.create
|
|
1482
|
+
end
|
|
1483
|
+
|
|
1484
|
+
let!(:person_two) do
|
|
1485
|
+
Person.create
|
|
1486
|
+
end
|
|
1487
|
+
|
|
1488
|
+
let!(:game) do
|
|
1489
|
+
Game.create(person: person_one)
|
|
1490
|
+
end
|
|
1491
|
+
|
|
1492
|
+
before do
|
|
1493
|
+
game.person_id = person_two.id
|
|
1494
|
+
end
|
|
1495
|
+
|
|
1496
|
+
it "sets the new document on the relation" do
|
|
1497
|
+
game.person.should eq(person_two)
|
|
1498
|
+
end
|
|
1499
|
+
end
|
|
1500
|
+
end
|
|
1501
|
+
end
|