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,1331 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Referenced::One do
|
|
4
|
+
|
|
5
|
+
describe "#=" do
|
|
6
|
+
|
|
7
|
+
context "when the relationship is an illegal embedded reference" do
|
|
8
|
+
|
|
9
|
+
let(:game) do
|
|
10
|
+
Game.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let(:video) do
|
|
14
|
+
Video.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "raises a mixed relation error" do
|
|
18
|
+
expect {
|
|
19
|
+
game.video = video
|
|
20
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "when the relation is cyclic" do
|
|
25
|
+
|
|
26
|
+
let(:user) do
|
|
27
|
+
User.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
let(:role) do
|
|
31
|
+
Role.new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
user.role = role
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "does not raise an error" do
|
|
39
|
+
user.role.should eq(role)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "when the relation is not polymorphic" do
|
|
44
|
+
|
|
45
|
+
context "when the parent is a new record" do
|
|
46
|
+
|
|
47
|
+
let(:person) do
|
|
48
|
+
Person.new
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
let(:game) do
|
|
52
|
+
Game.new
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:metadata) do
|
|
56
|
+
Game.relations["person"]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
before do
|
|
60
|
+
metadata.should_receive(:criteria).never
|
|
61
|
+
person.game = game
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "sets the target of the relation" do
|
|
65
|
+
person.game.target.should eq(game)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "sets the foreign key on the relation" do
|
|
69
|
+
game.person_id.should eq(person.id)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "sets the base on the inverse relation" do
|
|
73
|
+
game.person.should eq(person)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "sets the same instance on the inverse relation" do
|
|
77
|
+
game.person.should eql(person)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "does not save the target" do
|
|
81
|
+
game.should_not be_persisted
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
context "when the parent is not a new record" do
|
|
86
|
+
|
|
87
|
+
let(:person) do
|
|
88
|
+
Person.create
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
let(:game) do
|
|
92
|
+
Game.new
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
before do
|
|
96
|
+
person.game = game
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "sets the target of the relation" do
|
|
100
|
+
person.game.target.should eq(game)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "sets the foreign key of the relation" do
|
|
104
|
+
game.person_id.should eq(person.id)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "sets the base on the inverse relation" do
|
|
108
|
+
game.person.should eq(person)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "sets the same instance on the inverse relation" do
|
|
112
|
+
game.person.should eql(person)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "saves the target" do
|
|
116
|
+
game.should be_persisted
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "when reloading the parent" do
|
|
120
|
+
|
|
121
|
+
before do
|
|
122
|
+
person.reload
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context "when setting a new document on the relation" do
|
|
126
|
+
|
|
127
|
+
before do
|
|
128
|
+
person.game = Game.new
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "detaches the previous relation" do
|
|
132
|
+
expect {
|
|
133
|
+
game.reload
|
|
134
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context "when relation have a different primary_key" do
|
|
141
|
+
|
|
142
|
+
let(:person) do
|
|
143
|
+
Person.create
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
let(:cat) do
|
|
147
|
+
Cat.new
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
before do
|
|
151
|
+
person.cat = cat
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "sets the target of the relation" do
|
|
155
|
+
person.cat.target.should eq(cat)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "sets the foreign key of the relation" do
|
|
159
|
+
cat.person_id.should eq(person.username)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "sets the base on the inverse relation" do
|
|
163
|
+
cat.person.should eq(person)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "sets the same instance on the inverse relation" do
|
|
167
|
+
cat.person.should eql(person)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "saves the target" do
|
|
171
|
+
cat.should be_persisted
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
context "when the relation is polymorphic" do
|
|
177
|
+
|
|
178
|
+
context "when the parent is a new record" do
|
|
179
|
+
|
|
180
|
+
let(:bar) do
|
|
181
|
+
Bar.new
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
let(:rating) do
|
|
185
|
+
Rating.new
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
before do
|
|
189
|
+
bar.rating = rating
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "sets the target of the relation" do
|
|
193
|
+
bar.rating.target.should eq(rating)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it "sets the foreign key on the relation" do
|
|
197
|
+
rating.ratable_id.should eq(bar.id)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "sets the base on the inverse relation" do
|
|
201
|
+
rating.ratable.should eq(bar)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "sets the same instance on the inverse relation" do
|
|
205
|
+
rating.ratable.should eql(bar)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "does not save the target" do
|
|
209
|
+
rating.should_not be_persisted
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context "when the parent is not a new record" do
|
|
214
|
+
|
|
215
|
+
let(:bar) do
|
|
216
|
+
Bar.create
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
let(:rating) do
|
|
220
|
+
Rating.new
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
before do
|
|
224
|
+
bar.rating = rating
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "sets the target of the relation" do
|
|
228
|
+
bar.rating.target.should eq(rating)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it "sets the foreign key of the relation" do
|
|
232
|
+
rating.ratable_id.should eq(bar.id)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "sets the base on the inverse relation" do
|
|
236
|
+
rating.ratable.should eq(bar)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
it "sets the same instance on the inverse relation" do
|
|
240
|
+
rating.ratable.should eql(bar)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "saves the target" do
|
|
244
|
+
rating.should be_persisted
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
context "when replacing an existing persisted (dependent: :destroy) relation" do
|
|
249
|
+
|
|
250
|
+
let!(:person) do
|
|
251
|
+
Person.create
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
let!(:game) do
|
|
255
|
+
person.create_game(name: "Starcraft")
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
context "with a new one created via the parent" do
|
|
259
|
+
|
|
260
|
+
let!(:new_game) do
|
|
261
|
+
person.create_game(name: "Starcraft 2")
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it "sets the new relation on the parent" do
|
|
265
|
+
person.game.should eq(new_game)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it "removes the old foreign key reference" do
|
|
269
|
+
game.person_id.should be_nil
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
it "removes the reference to the parent" do
|
|
273
|
+
game.person.should be_nil
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it "destroys the old child" do
|
|
277
|
+
game.should be_destroyed
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it "leaves the old child unpersisted" do
|
|
281
|
+
game.persisted?.should be_false
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it "leaves the new child persisted" do
|
|
285
|
+
new_game.persisted?.should be_true
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
context "with a new one built via the parent" do
|
|
290
|
+
|
|
291
|
+
let!(:new_game) do
|
|
292
|
+
person.build_game(name: "Starcraft 2")
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it "sets the new relation on the parent" do
|
|
296
|
+
person.game.should eq(new_game)
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it "removes the old foreign key reference" do
|
|
300
|
+
game.person_id.should be_nil
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
it "removes the reference to the parent" do
|
|
304
|
+
game.person.should be_nil
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it "does not destroy the old child" do
|
|
308
|
+
game.should_not be_destroyed
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "leaves the old child persisted" do
|
|
312
|
+
game.persisted?.should be_true
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
it "leaves the new child unpersisted" do
|
|
316
|
+
new_game.persisted?.should be_false
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
context "when replacing an existing unpersisted (dependent: :destroy) relation" do
|
|
322
|
+
|
|
323
|
+
let!(:person) do
|
|
324
|
+
Person.create
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
let!(:game) do
|
|
328
|
+
person.build_game(name: "Starcraft")
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
context "with a new one created via the parent" do
|
|
332
|
+
|
|
333
|
+
let!(:new_game) do
|
|
334
|
+
person.create_game(name: "Starcraft 2")
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
it "sets the new relation on the parent" do
|
|
338
|
+
person.game.should eq(new_game)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
it "removes the old foreign key reference" do
|
|
342
|
+
game.person_id.should be_nil
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it "removes the reference to the parent" do
|
|
346
|
+
game.person.should be_nil
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
it "destroys the old child" do
|
|
350
|
+
game.should be_destroyed
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
it "leaves the old child unpersisted" do
|
|
354
|
+
game.persisted?.should be_false
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
it "leaves the new child persisted" do
|
|
358
|
+
new_game.persisted?.should be_true
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
context "with a new one built via the parent" do
|
|
363
|
+
|
|
364
|
+
let!(:new_game) do
|
|
365
|
+
person.build_game(name: "Starcraft 2")
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
it "sets the new relation on the parent" do
|
|
369
|
+
person.game.should eq(new_game)
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
it "removes the old foreign key reference" do
|
|
373
|
+
game.person_id.should be_nil
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
it "removes the reference to the parent" do
|
|
377
|
+
game.person.should be_nil
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "does not destroy the old child" do
|
|
381
|
+
game.should_not be_destroyed
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it "leaves the old child unpersisted" do
|
|
385
|
+
game.persisted?.should be_false
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
it "leaves the new child unpersisted" do
|
|
389
|
+
new_game.persisted?.should be_false
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
context "when replacing an existing persisted (dependent: :nullify) relation" do
|
|
395
|
+
|
|
396
|
+
let!(:person) do
|
|
397
|
+
Person.create
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
let!(:cat) do
|
|
401
|
+
person.create_cat(name: "Cuddles")
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
context "with a new one created via the parent" do
|
|
405
|
+
|
|
406
|
+
let!(:new_cat) do
|
|
407
|
+
person.create_cat(name: "Brutus")
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
it "sets the new relation on the parent" do
|
|
411
|
+
person.cat.should eq(new_cat)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
it "removes the old foreign key reference" do
|
|
415
|
+
cat.person_id.should be_nil
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
it "removes the reference to the parent" do
|
|
419
|
+
cat.person.should be_nil
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
it "does not destroy the old child" do
|
|
423
|
+
cat.should_not be_destroyed
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
it "leaves the old child persisted" do
|
|
427
|
+
cat.persisted?.should be_true
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it "leaves the new child persisted" do
|
|
431
|
+
new_cat.persisted?.should be_true
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
context "with a new one built via the parent" do
|
|
436
|
+
|
|
437
|
+
let!(:new_cat) do
|
|
438
|
+
person.build_cat(name: "Brutus")
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
it "sets the new relation on the parent" do
|
|
442
|
+
person.cat.should eq(new_cat)
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
it "removes the old foreign key reference" do
|
|
446
|
+
cat.person_id.should be_nil
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it "removes the reference to the parent" do
|
|
450
|
+
cat.person.should be_nil
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
it "does not destroy the old child" do
|
|
454
|
+
cat.should_not be_destroyed
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
it "leaves the old child persisted" do
|
|
458
|
+
cat.persisted?.should be_true
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
it "leaves the new child unpersisted" do
|
|
462
|
+
new_cat.persisted?.should be_false
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
context "when replacing an existing unpersisted (dependent: :nullify) relation" do
|
|
468
|
+
|
|
469
|
+
let!(:person) do
|
|
470
|
+
Person.create
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
let!(:cat) do
|
|
474
|
+
person.build_cat(name: "Cuddles")
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
context "with a new one created via the parent" do
|
|
478
|
+
|
|
479
|
+
let!(:new_cat) do
|
|
480
|
+
person.create_cat(name: "Brutus")
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
it "sets the new relation on the parent" do
|
|
484
|
+
person.cat.should eq(new_cat)
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
it "removes the old foreign key reference" do
|
|
488
|
+
cat.person_id.should be_nil
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
it "removes the reference to the parent" do
|
|
492
|
+
cat.person.should be_nil
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
it "does not destroy the old child" do
|
|
496
|
+
cat.should_not be_destroyed
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
it "leaves the old child unpersisted" do
|
|
500
|
+
cat.persisted?.should be_false
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
it "leaves the new child persisted" do
|
|
504
|
+
new_cat.persisted?.should be_true
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
context "with a new one built via the parent" do
|
|
509
|
+
|
|
510
|
+
let!(:new_cat) do
|
|
511
|
+
person.build_cat(name: "Brutus")
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
it "sets the new relation on the parent" do
|
|
515
|
+
person.cat.should eq(new_cat)
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
it "removes the old foreign key reference" do
|
|
519
|
+
cat.person_id.should be_nil
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
it "removes the reference to the parent" do
|
|
523
|
+
cat.person.should be_nil
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
it "does not destroy the old child" do
|
|
527
|
+
cat.should_not be_destroyed
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
it "leaves the old child unpersisted" do
|
|
531
|
+
cat.persisted?.should be_false
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
it "leaves the new child unpersisted" do
|
|
535
|
+
new_cat.persisted?.should be_false
|
|
536
|
+
end
|
|
537
|
+
end
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
context "when replacing an existing relation with a new one" do
|
|
541
|
+
|
|
542
|
+
let!(:person) do
|
|
543
|
+
Person.create
|
|
544
|
+
end
|
|
545
|
+
|
|
546
|
+
context "when dependent is destroy" do
|
|
547
|
+
|
|
548
|
+
let!(:game) do
|
|
549
|
+
person.create_game(name: "Starcraft")
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
let!(:new_game) do
|
|
553
|
+
Game.create(name: "Starcraft 2")
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
before do
|
|
557
|
+
person.game = new_game
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
it "sets the new relation on the parent" do
|
|
561
|
+
person.game.should eq(new_game)
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
it "removes the old foreign key reference" do
|
|
565
|
+
game.person_id.should be_nil
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
it "removes the reference to the parent" do
|
|
569
|
+
game.person.should be_nil
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
it "destroys the old child" do
|
|
573
|
+
game.should be_destroyed
|
|
574
|
+
end
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
context "when dependent is not set" do
|
|
578
|
+
|
|
579
|
+
let!(:account) do
|
|
580
|
+
person.create_account(name: "savings")
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
let!(:new_account) do
|
|
584
|
+
Account.create(name: "checking")
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
before do
|
|
588
|
+
person.account = new_account
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it "sets the new relation on the parent" do
|
|
592
|
+
person.account.should eq(new_account)
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
it "removes the old foreign key reference" do
|
|
596
|
+
account.person_id.should be_nil
|
|
597
|
+
end
|
|
598
|
+
|
|
599
|
+
it "removes the reference to the parent" do
|
|
600
|
+
account.person.should be_nil
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
it "nullifies the old child" do
|
|
604
|
+
account.should_not be_destroyed
|
|
605
|
+
end
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
describe "#= nil" do
|
|
612
|
+
|
|
613
|
+
context "when the relation is not polymorphic" do
|
|
614
|
+
|
|
615
|
+
context "when the parent is a new record" do
|
|
616
|
+
|
|
617
|
+
let(:person) do
|
|
618
|
+
Person.new
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
let(:game) do
|
|
622
|
+
Game.new
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
before do
|
|
626
|
+
person.game = game
|
|
627
|
+
person.game = nil
|
|
628
|
+
end
|
|
629
|
+
|
|
630
|
+
it "sets the relation to nil" do
|
|
631
|
+
person.game.should be_nil
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
it "removed the inverse relation" do
|
|
635
|
+
game.person.should be_nil
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
it "removes the foreign key value" do
|
|
639
|
+
game.person_id.should be_nil
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
context "when the parent is not a new record" do
|
|
644
|
+
|
|
645
|
+
let(:person) do
|
|
646
|
+
Person.create
|
|
647
|
+
end
|
|
648
|
+
|
|
649
|
+
let(:game) do
|
|
650
|
+
Game.new
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
before do
|
|
654
|
+
person.game = game
|
|
655
|
+
person.game = nil
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it "sets the relation to nil" do
|
|
659
|
+
person.game.should be_nil
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
it "removed the inverse relation" do
|
|
663
|
+
game.person.should be_nil
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
it "removes the foreign key value" do
|
|
667
|
+
game.person_id.should be_nil
|
|
668
|
+
end
|
|
669
|
+
|
|
670
|
+
it "deletes the target from the database" do
|
|
671
|
+
game.should be_destroyed
|
|
672
|
+
end
|
|
673
|
+
end
|
|
674
|
+
end
|
|
675
|
+
|
|
676
|
+
context "when the relation is polymorphic" do
|
|
677
|
+
|
|
678
|
+
context "when the parent is a new record" do
|
|
679
|
+
|
|
680
|
+
let(:bar) do
|
|
681
|
+
Bar.new
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
let(:rating) do
|
|
685
|
+
Rating.new
|
|
686
|
+
end
|
|
687
|
+
|
|
688
|
+
before do
|
|
689
|
+
bar.rating = rating
|
|
690
|
+
bar.rating = nil
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
it "sets the relation to nil" do
|
|
694
|
+
bar.rating.should be_nil
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
it "removed the inverse relation" do
|
|
698
|
+
rating.ratable.should be_nil
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
it "removes the foreign key value" do
|
|
702
|
+
rating.ratable_id.should be_nil
|
|
703
|
+
end
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
context "when the parent is not a new record" do
|
|
707
|
+
|
|
708
|
+
let(:bar) do
|
|
709
|
+
Bar.create
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
let(:rating) do
|
|
713
|
+
Rating.new
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
before do
|
|
717
|
+
bar.rating = rating
|
|
718
|
+
bar.rating = nil
|
|
719
|
+
end
|
|
720
|
+
|
|
721
|
+
it "sets the relation to nil" do
|
|
722
|
+
bar.rating.should be_nil
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
it "removed the inverse relation" do
|
|
726
|
+
rating.ratable.should be_nil
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
it "removes the foreign key value" do
|
|
730
|
+
rating.ratable_id.should be_nil
|
|
731
|
+
end
|
|
732
|
+
|
|
733
|
+
it "applies the appropriate dependent option" do
|
|
734
|
+
rating.should_not be_destroyed
|
|
735
|
+
end
|
|
736
|
+
end
|
|
737
|
+
end
|
|
738
|
+
end
|
|
739
|
+
|
|
740
|
+
describe "#build_#\{name}" do
|
|
741
|
+
|
|
742
|
+
context "when using mass assignment scoping" do
|
|
743
|
+
|
|
744
|
+
let(:person) do
|
|
745
|
+
Person.new
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
let(:account) do
|
|
749
|
+
person.build_account(
|
|
750
|
+
{ name: "bank", balance: "big" }, as: :admin
|
|
751
|
+
)
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
it "allows setting of fields for the role" do
|
|
755
|
+
account.name.should eq("bank")
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
it "does not set fields not allowed for the role" do
|
|
759
|
+
account.balance.should be_nil
|
|
760
|
+
end
|
|
761
|
+
end
|
|
762
|
+
|
|
763
|
+
context "when the relationship is an illegal embedded reference" do
|
|
764
|
+
|
|
765
|
+
let(:game) do
|
|
766
|
+
Game.new
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
it "raises a mixed relation error" do
|
|
770
|
+
expect {
|
|
771
|
+
game.build_video(title: "Tron")
|
|
772
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
context "when the relation is not polymorphic" do
|
|
777
|
+
|
|
778
|
+
context "when using object ids" do
|
|
779
|
+
|
|
780
|
+
let(:person) do
|
|
781
|
+
Person.create
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
let(:game) do
|
|
785
|
+
person.build_game(score: 50)
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
it "returns a new document" do
|
|
789
|
+
game.score.should eq(50)
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
it "sets the foreign key on the document" do
|
|
793
|
+
game.person_id.should eq(person.id)
|
|
794
|
+
end
|
|
795
|
+
|
|
796
|
+
it "sets the inverse relation" do
|
|
797
|
+
game.person.should eq(person)
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
it "does not save the built document" do
|
|
801
|
+
game.should_not be_persisted
|
|
802
|
+
end
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
context "when providing no attributes" do
|
|
806
|
+
|
|
807
|
+
let(:person) do
|
|
808
|
+
Person.create
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
let(:game) do
|
|
812
|
+
person.build_game
|
|
813
|
+
end
|
|
814
|
+
|
|
815
|
+
it "sets the foreign key on the document" do
|
|
816
|
+
game.person_id.should eq(person.id)
|
|
817
|
+
end
|
|
818
|
+
|
|
819
|
+
it "sets the inverse relation" do
|
|
820
|
+
game.person.should eq(person)
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
it "does not save the built document" do
|
|
824
|
+
game.should_not be_persisted
|
|
825
|
+
end
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
context "when providing nil attributes" do
|
|
829
|
+
|
|
830
|
+
let(:person) do
|
|
831
|
+
Person.create
|
|
832
|
+
end
|
|
833
|
+
|
|
834
|
+
let(:game) do
|
|
835
|
+
person.build_game(nil)
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
it "sets the foreign key on the document" do
|
|
839
|
+
game.person_id.should eq(person.id)
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
it "sets the inverse relation" do
|
|
843
|
+
game.person.should eq(person)
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
it "does not save the built document" do
|
|
847
|
+
game.should_not be_persisted
|
|
848
|
+
end
|
|
849
|
+
end
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
context "when the relation is polymorphic" do
|
|
853
|
+
|
|
854
|
+
context "when using object ids" do
|
|
855
|
+
|
|
856
|
+
let(:bar) do
|
|
857
|
+
Bar.create
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
let(:rating) do
|
|
861
|
+
bar.build_rating(value: 5)
|
|
862
|
+
end
|
|
863
|
+
|
|
864
|
+
it "returns a new document" do
|
|
865
|
+
rating.value.should eq(5)
|
|
866
|
+
end
|
|
867
|
+
|
|
868
|
+
it "sets the foreign key on the document" do
|
|
869
|
+
rating.ratable_id.should eq(bar.id)
|
|
870
|
+
end
|
|
871
|
+
|
|
872
|
+
it "sets the inverse relation" do
|
|
873
|
+
rating.ratable.should eq(bar)
|
|
874
|
+
end
|
|
875
|
+
|
|
876
|
+
it "does not save the built document" do
|
|
877
|
+
rating.should_not be_persisted
|
|
878
|
+
end
|
|
879
|
+
end
|
|
880
|
+
end
|
|
881
|
+
end
|
|
882
|
+
|
|
883
|
+
describe ".builder" do
|
|
884
|
+
|
|
885
|
+
let(:builder_klass) do
|
|
886
|
+
Mongoid::Relations::Builders::Referenced::One
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
let(:document) do
|
|
890
|
+
stub
|
|
891
|
+
end
|
|
892
|
+
|
|
893
|
+
let(:metadata) do
|
|
894
|
+
stub(extension?: false)
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
it "returns the embedded in builder" do
|
|
898
|
+
described_class.builder(nil, metadata, document).should
|
|
899
|
+
be_a_kind_of(builder_klass)
|
|
900
|
+
end
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
describe "#create_#\{name}" do
|
|
904
|
+
|
|
905
|
+
context "when using mass assignment scoping" do
|
|
906
|
+
|
|
907
|
+
let(:person) do
|
|
908
|
+
Person.create
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
let(:account) do
|
|
912
|
+
person.create_account(
|
|
913
|
+
{ name: "bank", balance: "big" }, as: :admin
|
|
914
|
+
)
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
it "allows setting of fields for the role" do
|
|
918
|
+
account.name.should eq("bank")
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
it "does not set fields not allowed for the role" do
|
|
922
|
+
account.balance.should be_nil
|
|
923
|
+
end
|
|
924
|
+
end
|
|
925
|
+
|
|
926
|
+
context "when the relationship is an illegal embedded reference" do
|
|
927
|
+
|
|
928
|
+
let(:game) do
|
|
929
|
+
Game.new
|
|
930
|
+
end
|
|
931
|
+
|
|
932
|
+
it "raises a mixed relation error" do
|
|
933
|
+
expect {
|
|
934
|
+
game.create_video(title: "Tron")
|
|
935
|
+
}.to raise_error(Mongoid::Errors::MixedRelations)
|
|
936
|
+
end
|
|
937
|
+
end
|
|
938
|
+
|
|
939
|
+
context "when the relation is not polymorphic" do
|
|
940
|
+
|
|
941
|
+
let(:person) do
|
|
942
|
+
Person.create
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
let(:game) do
|
|
946
|
+
person.create_game(score: 50)
|
|
947
|
+
end
|
|
948
|
+
|
|
949
|
+
it "returns a new document" do
|
|
950
|
+
game.score.should eq(50)
|
|
951
|
+
end
|
|
952
|
+
|
|
953
|
+
it "sets the foreign key on the document" do
|
|
954
|
+
game.person_id.should eq(person.id)
|
|
955
|
+
end
|
|
956
|
+
|
|
957
|
+
it "sets the inverse relation" do
|
|
958
|
+
game.person.should eq(person)
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
it "saves the document" do
|
|
962
|
+
game.should be_persisted
|
|
963
|
+
end
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
context "when providing no attributes" do
|
|
967
|
+
|
|
968
|
+
let(:person) do
|
|
969
|
+
Person.create
|
|
970
|
+
end
|
|
971
|
+
|
|
972
|
+
let(:game) do
|
|
973
|
+
person.create_game
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
it "sets the foreign key on the document" do
|
|
977
|
+
game.person_id.should eq(person.id)
|
|
978
|
+
end
|
|
979
|
+
|
|
980
|
+
it "sets the inverse relation" do
|
|
981
|
+
game.person.should eq(person)
|
|
982
|
+
end
|
|
983
|
+
|
|
984
|
+
it "saves the document" do
|
|
985
|
+
game.should be_persisted
|
|
986
|
+
end
|
|
987
|
+
end
|
|
988
|
+
|
|
989
|
+
context "when providing nil attributes" do
|
|
990
|
+
|
|
991
|
+
let(:person) do
|
|
992
|
+
Person.create
|
|
993
|
+
end
|
|
994
|
+
|
|
995
|
+
let(:game) do
|
|
996
|
+
person.create_game(nil)
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
it "sets the foreign key on the document" do
|
|
1000
|
+
game.person_id.should eq(person.id)
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
it "sets the inverse relation" do
|
|
1004
|
+
game.person.should eq(person)
|
|
1005
|
+
end
|
|
1006
|
+
|
|
1007
|
+
it "saves the document" do
|
|
1008
|
+
game.should be_persisted
|
|
1009
|
+
end
|
|
1010
|
+
end
|
|
1011
|
+
|
|
1012
|
+
context "when the relation is polymorphic" do
|
|
1013
|
+
|
|
1014
|
+
let(:bar) do
|
|
1015
|
+
Bar.create
|
|
1016
|
+
end
|
|
1017
|
+
|
|
1018
|
+
let(:rating) do
|
|
1019
|
+
bar.create_rating(value: 5)
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
it "returns a new document" do
|
|
1023
|
+
rating.value.should eq(5)
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
it "sets the foreign key on the document" do
|
|
1027
|
+
rating.ratable_id.should eq(bar.id)
|
|
1028
|
+
end
|
|
1029
|
+
|
|
1030
|
+
it "sets the inverse relation" do
|
|
1031
|
+
rating.ratable.should eq(bar)
|
|
1032
|
+
end
|
|
1033
|
+
|
|
1034
|
+
it "saves the document" do
|
|
1035
|
+
rating.should be_persisted
|
|
1036
|
+
end
|
|
1037
|
+
end
|
|
1038
|
+
end
|
|
1039
|
+
|
|
1040
|
+
describe ".criteria" do
|
|
1041
|
+
|
|
1042
|
+
let(:id) do
|
|
1043
|
+
Moped::BSON::ObjectId.new
|
|
1044
|
+
end
|
|
1045
|
+
|
|
1046
|
+
context "when the relation is polymorphic" do
|
|
1047
|
+
|
|
1048
|
+
let(:metadata) do
|
|
1049
|
+
Book.relations["rating"]
|
|
1050
|
+
end
|
|
1051
|
+
|
|
1052
|
+
let(:criteria) do
|
|
1053
|
+
described_class.criteria(metadata, id, Book)
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1056
|
+
it "includes the type in the criteria" do
|
|
1057
|
+
criteria.selector.should eq(
|
|
1058
|
+
{
|
|
1059
|
+
"ratable_id" => id,
|
|
1060
|
+
"ratable_type" => "Book",
|
|
1061
|
+
"ratable_field" => { "$in" => [ :rating, nil ] }
|
|
1062
|
+
}
|
|
1063
|
+
)
|
|
1064
|
+
end
|
|
1065
|
+
end
|
|
1066
|
+
|
|
1067
|
+
context "when the relation is not polymorphic" do
|
|
1068
|
+
|
|
1069
|
+
let(:metadata) do
|
|
1070
|
+
Person.relations["game"]
|
|
1071
|
+
end
|
|
1072
|
+
|
|
1073
|
+
let(:criteria) do
|
|
1074
|
+
described_class.criteria(metadata, id, Person)
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
it "does not include the type in the criteria" do
|
|
1078
|
+
criteria.selector.should eq({ "person_id" => id })
|
|
1079
|
+
end
|
|
1080
|
+
end
|
|
1081
|
+
end
|
|
1082
|
+
|
|
1083
|
+
describe ".eager_load" do
|
|
1084
|
+
|
|
1085
|
+
before do
|
|
1086
|
+
Mongoid.identity_map_enabled = true
|
|
1087
|
+
end
|
|
1088
|
+
|
|
1089
|
+
after do
|
|
1090
|
+
Mongoid.identity_map_enabled = false
|
|
1091
|
+
end
|
|
1092
|
+
|
|
1093
|
+
context "when the relation is not polymorphic" do
|
|
1094
|
+
|
|
1095
|
+
let!(:person) do
|
|
1096
|
+
Person.create
|
|
1097
|
+
end
|
|
1098
|
+
|
|
1099
|
+
let!(:game) do
|
|
1100
|
+
person.create_game(name: "Tron")
|
|
1101
|
+
end
|
|
1102
|
+
|
|
1103
|
+
let(:metadata) do
|
|
1104
|
+
Person.relations["game"]
|
|
1105
|
+
end
|
|
1106
|
+
|
|
1107
|
+
let!(:eager) do
|
|
1108
|
+
described_class.eager_load(metadata, Person.all.map(&:_id))
|
|
1109
|
+
end
|
|
1110
|
+
|
|
1111
|
+
let(:map) do
|
|
1112
|
+
Mongoid::IdentityMap.get(Game, {"person_id" => person.id})
|
|
1113
|
+
end
|
|
1114
|
+
|
|
1115
|
+
it "puts the documents in the identity map" do
|
|
1116
|
+
map.should eq(game)
|
|
1117
|
+
end
|
|
1118
|
+
end
|
|
1119
|
+
|
|
1120
|
+
context "when the relation is polymorphic" do
|
|
1121
|
+
|
|
1122
|
+
let!(:book) do
|
|
1123
|
+
Book.create(name: "Game of Thrones")
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
let!(:movie) do
|
|
1127
|
+
Movie.create(name: "Bladerunner")
|
|
1128
|
+
end
|
|
1129
|
+
|
|
1130
|
+
let!(:movie_rating) do
|
|
1131
|
+
movie.ratings.create(value: 10)
|
|
1132
|
+
end
|
|
1133
|
+
|
|
1134
|
+
let!(:book_rating) do
|
|
1135
|
+
book.create_rating(value: 10)
|
|
1136
|
+
end
|
|
1137
|
+
|
|
1138
|
+
let(:metadata) do
|
|
1139
|
+
Book.relations["rating"]
|
|
1140
|
+
end
|
|
1141
|
+
|
|
1142
|
+
let!(:eager) do
|
|
1143
|
+
described_class.eager_load(metadata, Book.all.map(&:_id))
|
|
1144
|
+
end
|
|
1145
|
+
|
|
1146
|
+
let(:map) do
|
|
1147
|
+
Mongoid::IdentityMap.get(Rating, {"ratable_id" => book.id})
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
it "puts the documents in the identity map" do
|
|
1151
|
+
map.should eq(book_rating)
|
|
1152
|
+
end
|
|
1153
|
+
end
|
|
1154
|
+
end
|
|
1155
|
+
|
|
1156
|
+
describe ".embedded?" do
|
|
1157
|
+
|
|
1158
|
+
it "returns false" do
|
|
1159
|
+
described_class.should_not be_embedded
|
|
1160
|
+
end
|
|
1161
|
+
end
|
|
1162
|
+
|
|
1163
|
+
describe ".foreign_key_suffix" do
|
|
1164
|
+
|
|
1165
|
+
it "returns _id" do
|
|
1166
|
+
described_class.foreign_key_suffix.should eq("_id")
|
|
1167
|
+
end
|
|
1168
|
+
end
|
|
1169
|
+
|
|
1170
|
+
describe ".macro" do
|
|
1171
|
+
|
|
1172
|
+
it "returns has_one" do
|
|
1173
|
+
described_class.macro.should eq(:has_one)
|
|
1174
|
+
end
|
|
1175
|
+
end
|
|
1176
|
+
|
|
1177
|
+
describe "#nullify" do
|
|
1178
|
+
|
|
1179
|
+
let(:person) do
|
|
1180
|
+
Person.create
|
|
1181
|
+
end
|
|
1182
|
+
|
|
1183
|
+
let!(:game) do
|
|
1184
|
+
person.create_game(name: "Starcraft II")
|
|
1185
|
+
end
|
|
1186
|
+
|
|
1187
|
+
context "when the instance has been set" do
|
|
1188
|
+
|
|
1189
|
+
before do
|
|
1190
|
+
person.game.nullify
|
|
1191
|
+
end
|
|
1192
|
+
|
|
1193
|
+
it "removes the foreign key from the target" do
|
|
1194
|
+
game.person_id.should be_nil
|
|
1195
|
+
end
|
|
1196
|
+
|
|
1197
|
+
it "removes the reference from the target" do
|
|
1198
|
+
game.person.should be_nil
|
|
1199
|
+
end
|
|
1200
|
+
end
|
|
1201
|
+
|
|
1202
|
+
context "when the instance has been reloaded" do
|
|
1203
|
+
|
|
1204
|
+
let(:from_db) do
|
|
1205
|
+
Person.find(person.id)
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
let(:game_reloaded) do
|
|
1209
|
+
Game.find(game.id)
|
|
1210
|
+
end
|
|
1211
|
+
|
|
1212
|
+
before do
|
|
1213
|
+
from_db.game.nullify
|
|
1214
|
+
end
|
|
1215
|
+
|
|
1216
|
+
it "removes the foreign key from the target" do
|
|
1217
|
+
game_reloaded.person_id.should be_nil
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
it "removes the reference from the target" do
|
|
1221
|
+
game_reloaded.person.should be_nil
|
|
1222
|
+
end
|
|
1223
|
+
end
|
|
1224
|
+
end
|
|
1225
|
+
|
|
1226
|
+
describe "#respond_to?" do
|
|
1227
|
+
|
|
1228
|
+
let(:person) do
|
|
1229
|
+
Person.new
|
|
1230
|
+
end
|
|
1231
|
+
|
|
1232
|
+
let!(:game) do
|
|
1233
|
+
person.build_game(name: "Tron")
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
let(:document) do
|
|
1237
|
+
person.game
|
|
1238
|
+
end
|
|
1239
|
+
|
|
1240
|
+
Mongoid::Document.public_instance_methods(true).each do |method|
|
|
1241
|
+
|
|
1242
|
+
context "when checking #{method}" do
|
|
1243
|
+
|
|
1244
|
+
it "returns true" do
|
|
1245
|
+
document.respond_to?(method).should be_true
|
|
1246
|
+
end
|
|
1247
|
+
end
|
|
1248
|
+
end
|
|
1249
|
+
end
|
|
1250
|
+
|
|
1251
|
+
describe ".stores_foreign_key?" do
|
|
1252
|
+
|
|
1253
|
+
it "returns false" do
|
|
1254
|
+
described_class.stores_foreign_key?.should be_false
|
|
1255
|
+
end
|
|
1256
|
+
end
|
|
1257
|
+
|
|
1258
|
+
describe ".valid_options" do
|
|
1259
|
+
|
|
1260
|
+
it "returns the valid options" do
|
|
1261
|
+
described_class.valid_options.should eq(
|
|
1262
|
+
[ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
|
|
1263
|
+
)
|
|
1264
|
+
end
|
|
1265
|
+
end
|
|
1266
|
+
|
|
1267
|
+
describe ".validation_default" do
|
|
1268
|
+
|
|
1269
|
+
it "returns true" do
|
|
1270
|
+
described_class.validation_default.should be_true
|
|
1271
|
+
end
|
|
1272
|
+
end
|
|
1273
|
+
|
|
1274
|
+
context "when reloading the relation" do
|
|
1275
|
+
|
|
1276
|
+
let!(:person) do
|
|
1277
|
+
Person.create
|
|
1278
|
+
end
|
|
1279
|
+
|
|
1280
|
+
let!(:game_one) do
|
|
1281
|
+
Game.create(name: "Warcraft 3")
|
|
1282
|
+
end
|
|
1283
|
+
|
|
1284
|
+
let!(:game_two) do
|
|
1285
|
+
Game.create(name: "Starcraft 2")
|
|
1286
|
+
end
|
|
1287
|
+
|
|
1288
|
+
before do
|
|
1289
|
+
person.game = game_one
|
|
1290
|
+
end
|
|
1291
|
+
|
|
1292
|
+
context "when the relation references the same document" do
|
|
1293
|
+
|
|
1294
|
+
before do
|
|
1295
|
+
Game.collection.find({ _id: game_one.id }).
|
|
1296
|
+
update({ "$set" => { name: "Diablo 2" }})
|
|
1297
|
+
end
|
|
1298
|
+
|
|
1299
|
+
let(:reloaded) do
|
|
1300
|
+
person.game(true)
|
|
1301
|
+
end
|
|
1302
|
+
|
|
1303
|
+
it "reloads the document from the database" do
|
|
1304
|
+
reloaded.name.should eq("Diablo 2")
|
|
1305
|
+
end
|
|
1306
|
+
|
|
1307
|
+
it "sets a new document instance" do
|
|
1308
|
+
reloaded.should_not equal(game_one)
|
|
1309
|
+
end
|
|
1310
|
+
end
|
|
1311
|
+
|
|
1312
|
+
context "when the relation references a different document" do
|
|
1313
|
+
|
|
1314
|
+
before do
|
|
1315
|
+
person.game = game_two
|
|
1316
|
+
end
|
|
1317
|
+
|
|
1318
|
+
let(:reloaded) do
|
|
1319
|
+
person.game(true)
|
|
1320
|
+
end
|
|
1321
|
+
|
|
1322
|
+
it "reloads the new document from the database" do
|
|
1323
|
+
reloaded.name.should eq("Starcraft 2")
|
|
1324
|
+
end
|
|
1325
|
+
|
|
1326
|
+
it "sets a new document instance" do
|
|
1327
|
+
reloaded.should_not equal(game_one)
|
|
1328
|
+
end
|
|
1329
|
+
end
|
|
1330
|
+
end
|
|
1331
|
+
end
|