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,1055 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Relations::Embedded::One do
|
|
4
|
+
|
|
5
|
+
describe "#===" do
|
|
6
|
+
|
|
7
|
+
let(:base) do
|
|
8
|
+
Person.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:target) do
|
|
12
|
+
Name.new
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:metadata) do
|
|
16
|
+
Person.relations["name"]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
let(:relation) do
|
|
20
|
+
described_class.new(base, target, metadata)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "when the proxied document is same class" do
|
|
24
|
+
|
|
25
|
+
it "returns true" do
|
|
26
|
+
(relation === Name.new).should be_true
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe "#=" do
|
|
32
|
+
|
|
33
|
+
context "when the relation is not cyclic" do
|
|
34
|
+
|
|
35
|
+
context "when the parent is a new record" do
|
|
36
|
+
|
|
37
|
+
let(:person) do
|
|
38
|
+
Person.new
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
let(:name) do
|
|
42
|
+
Name.new
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
before do
|
|
46
|
+
person.name = name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "sets the target of the relation" do
|
|
50
|
+
person.name.should eq(name)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "sets the base on the inverse relation" do
|
|
54
|
+
name.namable.should eq(person)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "sets the same instance on the inverse relation" do
|
|
58
|
+
name.namable.should eql(person)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "does not save the target" do
|
|
62
|
+
name.should_not be_persisted
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "with overwritten getter" do
|
|
66
|
+
|
|
67
|
+
before do
|
|
68
|
+
person.name = nil
|
|
69
|
+
def person.name_with_default
|
|
70
|
+
name_without_default or (self.name = Name.new)
|
|
71
|
+
end
|
|
72
|
+
class << person
|
|
73
|
+
alias_method_chain :name, :default
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "sets the target without an invinite recursion" do
|
|
78
|
+
person.name = name
|
|
79
|
+
person.name.should be_present
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "when the parent is not a new record" do
|
|
85
|
+
|
|
86
|
+
let(:person) do
|
|
87
|
+
Person.create
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
let(:name) do
|
|
91
|
+
Name.new
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context "when setting with a hash" do
|
|
95
|
+
|
|
96
|
+
before do
|
|
97
|
+
person.name = {}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
let!(:child_name) do
|
|
101
|
+
person.name
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "sets the target of the relation" do
|
|
105
|
+
person.name.should eq(child_name)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "sets the base on the inverse relation" do
|
|
109
|
+
child_name.namable.should eq(person)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "sets the same instance on the inverse relation" do
|
|
113
|
+
child_name.namable.should eql(person)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "saves the target" do
|
|
117
|
+
child_name.should be_persisted
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "when replacing a relation with a hash" do
|
|
121
|
+
|
|
122
|
+
before do
|
|
123
|
+
person.name = {}
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "sets the relation with the proper object" do
|
|
127
|
+
person.name.should be_a(Name)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context "when setting to the same document" do
|
|
133
|
+
|
|
134
|
+
before do
|
|
135
|
+
person.name = name
|
|
136
|
+
person.name = person.name
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "does not change the relation" do
|
|
140
|
+
person.name.should eq(name)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "does not persist any change" do
|
|
144
|
+
person.reload.name.should eq(name)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context "when setting directly" do
|
|
149
|
+
|
|
150
|
+
before do
|
|
151
|
+
person.name = name
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "sets the target of the relation" do
|
|
155
|
+
person.name.should eq(name)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "sets the base on the inverse relation" do
|
|
159
|
+
name.namable.should eq(person)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "sets the same instance on the inverse relation" do
|
|
163
|
+
name.namable.should eql(person)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "saves the target" do
|
|
167
|
+
name.should be_persisted
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
context "when replacing an exising document" do
|
|
171
|
+
|
|
172
|
+
let(:pet_owner) do
|
|
173
|
+
PetOwner.create
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
let(:pet_one) do
|
|
177
|
+
Pet.new
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
let(:pet_two) do
|
|
181
|
+
Pet.new
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
before do
|
|
185
|
+
pet_owner.pet = pet_one
|
|
186
|
+
pet_owner.pet = pet_two
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it "runs the destroy callbacks on the old document" do
|
|
190
|
+
pet_one.destroy_flag.should be_true
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
context "when setting via the parent attributes" do
|
|
196
|
+
|
|
197
|
+
before do
|
|
198
|
+
person.attributes = { name: name }
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it "sets the target of the relation" do
|
|
202
|
+
person.name.should eq(name)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "does not save the target" do
|
|
206
|
+
name.should_not be_persisted
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
context "when the relation is cyclic" do
|
|
213
|
+
|
|
214
|
+
context "when the parent is a new record" do
|
|
215
|
+
|
|
216
|
+
let(:parent_shelf) do
|
|
217
|
+
Shelf.new
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
let(:child_shelf) do
|
|
221
|
+
Shelf.new
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
before do
|
|
225
|
+
parent_shelf.child_shelf = child_shelf
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "sets the target of the relation" do
|
|
229
|
+
parent_shelf.child_shelf.should eq(child_shelf)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "sets the base on the inverse relation" do
|
|
233
|
+
child_shelf.parent_shelf.should eq(parent_shelf)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "sets the same instance on the inverse relation" do
|
|
237
|
+
child_shelf.parent_shelf.should eql(parent_shelf)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "does not save the target" do
|
|
241
|
+
child_shelf.should_not be_persisted
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
context "when the parent is not a new record" do
|
|
246
|
+
|
|
247
|
+
let(:parent_shelf) do
|
|
248
|
+
Shelf.create
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
let(:child_shelf) do
|
|
252
|
+
Shelf.new
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
before do
|
|
256
|
+
parent_shelf.child_shelf = child_shelf
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "sets the target of the relation" do
|
|
260
|
+
parent_shelf.child_shelf.should eq(child_shelf)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "sets the base on the inverse relation" do
|
|
264
|
+
child_shelf.parent_shelf.should eq(parent_shelf)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it "sets the same instance on the inverse relation" do
|
|
268
|
+
child_shelf.parent_shelf.should eql(parent_shelf)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "saves the target" do
|
|
272
|
+
child_shelf.should be_persisted
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context "when setting a new document multiple times in a row" do
|
|
278
|
+
|
|
279
|
+
let(:parent) do
|
|
280
|
+
Parent.create
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
before do
|
|
284
|
+
parent.first_child = Child.new
|
|
285
|
+
parent.first_child = Child.new
|
|
286
|
+
parent.first_child = Child.new
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "saves the child document" do
|
|
290
|
+
parent.first_child.should be_a(Child)
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
describe "#= nil" do
|
|
296
|
+
|
|
297
|
+
context "when the relation is not cyclic" do
|
|
298
|
+
|
|
299
|
+
context "when the parent is a new record" do
|
|
300
|
+
|
|
301
|
+
let(:person) do
|
|
302
|
+
Person.new
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
let(:name) do
|
|
306
|
+
Name.new
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
before do
|
|
310
|
+
person.name = name
|
|
311
|
+
person.name = nil
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
it "sets the relation to nil" do
|
|
315
|
+
person.name.should be_nil
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
it "removes the inverse relation" do
|
|
319
|
+
name.namable.should be_nil
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
context "when the inverse is already nil" do
|
|
324
|
+
|
|
325
|
+
let(:person) do
|
|
326
|
+
Person.new
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
before do
|
|
330
|
+
person.name = nil
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
it "sets the relation to nil" do
|
|
334
|
+
person.name.should be_nil
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
context "when the parent is persisted" do
|
|
339
|
+
|
|
340
|
+
let(:person) do
|
|
341
|
+
Person.create
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
let(:name) do
|
|
345
|
+
Name.new
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
context "when setting directly" do
|
|
349
|
+
|
|
350
|
+
before do
|
|
351
|
+
person.name = name
|
|
352
|
+
person.name = nil
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
it "sets the relation to nil" do
|
|
356
|
+
person.name.should be_nil
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
it "removed the inverse relation" do
|
|
360
|
+
name.namable.should be_nil
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
it "deletes the child document" do
|
|
364
|
+
name.should be_destroyed
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
context "when setting via parent attributes" do
|
|
369
|
+
|
|
370
|
+
before do
|
|
371
|
+
person.name = name
|
|
372
|
+
person.attributes = { name: nil }
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
it "sets the relation to nil" do
|
|
376
|
+
person.name.should be_nil
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
it "does not delete the child document" do
|
|
380
|
+
name.should_not be_destroyed
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
context "when the relation is cyclic" do
|
|
387
|
+
|
|
388
|
+
context "when the parent is a new record" do
|
|
389
|
+
|
|
390
|
+
let(:parent_shelf) do
|
|
391
|
+
Shelf.new
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
let(:child_shelf) do
|
|
395
|
+
Shelf.new
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
before do
|
|
399
|
+
parent_shelf.child_shelf = child_shelf
|
|
400
|
+
parent_shelf.child_shelf = nil
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
it "sets the relation to nil" do
|
|
404
|
+
parent_shelf.child_shelf.should be_nil
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
it "removes the inverse relation" do
|
|
408
|
+
child_shelf.parent_shelf.should be_nil
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
context "when the inverse is already nil" do
|
|
413
|
+
|
|
414
|
+
let(:parent_shelf) do
|
|
415
|
+
Shelf.new
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
before do
|
|
419
|
+
parent_shelf.child_shelf = nil
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
it "sets the relation to nil" do
|
|
423
|
+
parent_shelf.child_shelf.should be_nil
|
|
424
|
+
end
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
context "when the documents are not new records" do
|
|
428
|
+
|
|
429
|
+
let(:parent_shelf) do
|
|
430
|
+
Shelf.create
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
let(:child_shelf) do
|
|
434
|
+
Shelf.new
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
before do
|
|
438
|
+
parent_shelf.child_shelf = child_shelf
|
|
439
|
+
parent_shelf.child_shelf = nil
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
it "sets the relation to nil" do
|
|
443
|
+
parent_shelf.child_shelf.should be_nil
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
it "removed the inverse relation" do
|
|
447
|
+
child_shelf.parent_shelf.should be_nil
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
it "deletes the child document" do
|
|
451
|
+
child_shelf.should be_destroyed
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
describe "#build_#\{name}" do
|
|
458
|
+
|
|
459
|
+
context "when providing mass assignment scoping" do
|
|
460
|
+
|
|
461
|
+
let(:person) do
|
|
462
|
+
Person.new
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
let(:quiz) do
|
|
466
|
+
person.build_quiz(
|
|
467
|
+
{ topic: "Testing", name: "Test" }, as: :admin
|
|
468
|
+
)
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
it "sets the attributes for the role" do
|
|
472
|
+
quiz.topic.should eq("Testing")
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
it "does not set attributes not for the role" do
|
|
476
|
+
quiz.name.should be_nil
|
|
477
|
+
end
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
context "when the relation is not cyclic" do
|
|
481
|
+
|
|
482
|
+
context "when the parent is a new record" do
|
|
483
|
+
|
|
484
|
+
context "when not providing any attributes" do
|
|
485
|
+
|
|
486
|
+
context "when building once" do
|
|
487
|
+
|
|
488
|
+
let(:person) do
|
|
489
|
+
Person.new
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
let!(:name) do
|
|
493
|
+
person.build_name
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
it "sets the target of the relation" do
|
|
497
|
+
person.name.should eq(name)
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it "sets the base on the inverse relation" do
|
|
501
|
+
name.namable.should eq(person)
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
it "sets no attributes" do
|
|
505
|
+
name.first_name.should be_nil
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
it "does not save the target" do
|
|
509
|
+
name.should_not be_persisted
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
context "when building twice" do
|
|
514
|
+
|
|
515
|
+
let(:person) do
|
|
516
|
+
Person.new
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
let!(:name) do
|
|
520
|
+
person.build_name
|
|
521
|
+
person.build_name
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
it "sets the target of the relation" do
|
|
525
|
+
person.name.should eq(name)
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
it "sets the base on the inverse relation" do
|
|
529
|
+
name.namable.should eq(person)
|
|
530
|
+
end
|
|
531
|
+
|
|
532
|
+
it "sets no attributes" do
|
|
533
|
+
name.first_name.should be_nil
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
it "does not save the target" do
|
|
537
|
+
name.should_not be_persisted
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
context "when passing nil as the attributes" do
|
|
543
|
+
|
|
544
|
+
let(:person) do
|
|
545
|
+
Person.new
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
let!(:name) do
|
|
549
|
+
person.build_name(nil)
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
it "sets the target of the relation" do
|
|
553
|
+
person.name.should eq(name)
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
it "sets the base on the inverse relation" do
|
|
557
|
+
name.namable.should eq(person)
|
|
558
|
+
end
|
|
559
|
+
|
|
560
|
+
it "sets no attributes" do
|
|
561
|
+
name.first_name.should be_nil
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
it "does not save the target" do
|
|
565
|
+
name.should_not be_persisted
|
|
566
|
+
end
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
context "when providing attributes" do
|
|
570
|
+
|
|
571
|
+
let(:person) do
|
|
572
|
+
Person.new
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
let!(:name) do
|
|
576
|
+
person.build_name(first_name: "James")
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
it "sets the target of the relation" do
|
|
580
|
+
person.name.should eq(name)
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
it "sets the base on the inverse relation" do
|
|
584
|
+
name.namable.should eq(person)
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
it "sets the attributes" do
|
|
588
|
+
name.first_name.should eq("James")
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it "does not save the target" do
|
|
592
|
+
name.should_not be_persisted
|
|
593
|
+
end
|
|
594
|
+
end
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
context "when the parent is not a new record" do
|
|
598
|
+
|
|
599
|
+
let(:person) do
|
|
600
|
+
Person.create
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
let!(:name) do
|
|
604
|
+
person.build_name(first_name: "James")
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
it "does not save the target" do
|
|
608
|
+
name.should_not be_persisted
|
|
609
|
+
end
|
|
610
|
+
end
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
context "when the relation is cyclic" do
|
|
614
|
+
|
|
615
|
+
context "when the parent is a new record" do
|
|
616
|
+
|
|
617
|
+
let(:parent_shelf) do
|
|
618
|
+
Shelf.new
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
let!(:child_shelf) do
|
|
622
|
+
parent_shelf.build_child_shelf(level: 1)
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
it "sets the target of the relation" do
|
|
626
|
+
parent_shelf.child_shelf.should eq(child_shelf)
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
it "sets the base on the inverse relation" do
|
|
630
|
+
child_shelf.parent_shelf.should eq(parent_shelf)
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
it "sets the attributes" do
|
|
634
|
+
child_shelf.level.should eq(1)
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
it "does not save the target" do
|
|
638
|
+
child_shelf.should_not be_persisted
|
|
639
|
+
end
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
context "when the parent is not a new record" do
|
|
643
|
+
|
|
644
|
+
let(:parent_shelf) do
|
|
645
|
+
Shelf.create
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
let!(:child_shelf) do
|
|
649
|
+
parent_shelf.build_child_shelf(level: 2)
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
it "does not save the target" do
|
|
653
|
+
child_shelf.should_not be_persisted
|
|
654
|
+
end
|
|
655
|
+
end
|
|
656
|
+
end
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
describe ".builder" do
|
|
660
|
+
|
|
661
|
+
let(:base) do
|
|
662
|
+
Person.new
|
|
663
|
+
end
|
|
664
|
+
|
|
665
|
+
let(:target) do
|
|
666
|
+
Name.new
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
let(:metadata) do
|
|
670
|
+
Person.relations["name"]
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
let(:builder_klass) do
|
|
674
|
+
Mongoid::Relations::Builders::Embedded::One
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
it "returns the embedded one builder" do
|
|
678
|
+
described_class.builder(base, metadata, target).should be_a(builder_klass)
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
describe "#create_#\{name}" do
|
|
683
|
+
|
|
684
|
+
context "when providing mass assignment scoping" do
|
|
685
|
+
|
|
686
|
+
let(:person) do
|
|
687
|
+
Person.new
|
|
688
|
+
end
|
|
689
|
+
|
|
690
|
+
let(:quiz) do
|
|
691
|
+
person.create_quiz(
|
|
692
|
+
{ topic: "Testing", name: "Test" }, as: :admin
|
|
693
|
+
)
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
it "sets the attributes for the role" do
|
|
697
|
+
quiz.topic.should eq("Testing")
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
it "does not set attributes not for the role" do
|
|
701
|
+
quiz.name.should be_nil
|
|
702
|
+
end
|
|
703
|
+
end
|
|
704
|
+
|
|
705
|
+
context "when the parent is a new record" do
|
|
706
|
+
|
|
707
|
+
context "when not providing any attributes" do
|
|
708
|
+
|
|
709
|
+
let(:person) do
|
|
710
|
+
Person.new
|
|
711
|
+
end
|
|
712
|
+
|
|
713
|
+
let!(:name) do
|
|
714
|
+
person.create_name
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
it "sets the target of the relation" do
|
|
718
|
+
person.name.should eq(name)
|
|
719
|
+
end
|
|
720
|
+
|
|
721
|
+
it "sets the base on the inverse relation" do
|
|
722
|
+
name.namable.should eq(person)
|
|
723
|
+
end
|
|
724
|
+
|
|
725
|
+
it "sets no attributes" do
|
|
726
|
+
name.first_name.should be_nil
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
it "saves the target" do
|
|
730
|
+
name.should be_persisted
|
|
731
|
+
end
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
context "when passing nil as the attributes" do
|
|
735
|
+
|
|
736
|
+
let(:person) do
|
|
737
|
+
Person.new
|
|
738
|
+
end
|
|
739
|
+
|
|
740
|
+
let!(:name) do
|
|
741
|
+
person.create_name(nil)
|
|
742
|
+
end
|
|
743
|
+
|
|
744
|
+
it "sets the target of the relation" do
|
|
745
|
+
person.name.should eq(name)
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
it "sets the base on the inverse relation" do
|
|
749
|
+
name.namable.should eq(person)
|
|
750
|
+
end
|
|
751
|
+
|
|
752
|
+
it "sets no attributes" do
|
|
753
|
+
name.first_name.should be_nil
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
it "saves the target" do
|
|
757
|
+
name.should be_persisted
|
|
758
|
+
end
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
context "when providing attributes" do
|
|
762
|
+
|
|
763
|
+
let(:person) do
|
|
764
|
+
Person.new
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
let!(:name) do
|
|
768
|
+
person.create_name(first_name: "James")
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
it "sets the target of the relation" do
|
|
772
|
+
person.name.should eq(name)
|
|
773
|
+
end
|
|
774
|
+
|
|
775
|
+
it "sets the base on the inverse relation" do
|
|
776
|
+
name.namable.should eq(person)
|
|
777
|
+
end
|
|
778
|
+
|
|
779
|
+
it "sets the attributes" do
|
|
780
|
+
name.first_name.should eq("James")
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
it "saves the target" do
|
|
784
|
+
name.should be_persisted
|
|
785
|
+
end
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
context "when the parent is not a new record" do
|
|
789
|
+
|
|
790
|
+
let(:person) do
|
|
791
|
+
Person.create
|
|
792
|
+
end
|
|
793
|
+
|
|
794
|
+
let!(:name) do
|
|
795
|
+
person.create_name(first_name: "James")
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
it "does not save the target" do
|
|
799
|
+
name.should be_persisted
|
|
800
|
+
end
|
|
801
|
+
end
|
|
802
|
+
end
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
describe ".embedded?" do
|
|
806
|
+
|
|
807
|
+
it "returns true" do
|
|
808
|
+
described_class.should be_embedded
|
|
809
|
+
end
|
|
810
|
+
end
|
|
811
|
+
|
|
812
|
+
describe ".foreign_key_suffix" do
|
|
813
|
+
|
|
814
|
+
it "returns nil" do
|
|
815
|
+
described_class.foreign_key_suffix.should be_nil
|
|
816
|
+
end
|
|
817
|
+
end
|
|
818
|
+
|
|
819
|
+
describe ".macro" do
|
|
820
|
+
|
|
821
|
+
it "returns embeds_one" do
|
|
822
|
+
described_class.macro.should eq(:embeds_one)
|
|
823
|
+
end
|
|
824
|
+
end
|
|
825
|
+
|
|
826
|
+
describe ".nested_builder" do
|
|
827
|
+
|
|
828
|
+
let(:nested_builder_klass) do
|
|
829
|
+
Mongoid::Relations::Builders::NestedAttributes::One
|
|
830
|
+
end
|
|
831
|
+
|
|
832
|
+
let(:metadata) do
|
|
833
|
+
Person.relations["name"]
|
|
834
|
+
end
|
|
835
|
+
|
|
836
|
+
let(:attributes) do
|
|
837
|
+
{}
|
|
838
|
+
end
|
|
839
|
+
|
|
840
|
+
it "returns the single nested builder" do
|
|
841
|
+
described_class.nested_builder(metadata, attributes, {}).should
|
|
842
|
+
be_a(nested_builder_klass)
|
|
843
|
+
end
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
describe "#respond_to?" do
|
|
847
|
+
|
|
848
|
+
let(:person) do
|
|
849
|
+
Person.new
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
let!(:name) do
|
|
853
|
+
person.build_name(first_name: "Tony")
|
|
854
|
+
end
|
|
855
|
+
|
|
856
|
+
let(:document) do
|
|
857
|
+
person.name
|
|
858
|
+
end
|
|
859
|
+
|
|
860
|
+
Mongoid::Document.public_instance_methods(true).each do |method|
|
|
861
|
+
|
|
862
|
+
context "when checking #{method}" do
|
|
863
|
+
|
|
864
|
+
it "returns true" do
|
|
865
|
+
document.respond_to?(method).should be_true
|
|
866
|
+
end
|
|
867
|
+
end
|
|
868
|
+
end
|
|
869
|
+
|
|
870
|
+
it "responds to persisted?" do
|
|
871
|
+
document.should respond_to(:persisted?)
|
|
872
|
+
end
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
describe ".valid_options" do
|
|
876
|
+
|
|
877
|
+
it "returns the valid options" do
|
|
878
|
+
described_class.valid_options.should eq(
|
|
879
|
+
[ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
|
|
880
|
+
)
|
|
881
|
+
end
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
describe ".validation_default" do
|
|
885
|
+
|
|
886
|
+
it "returns true" do
|
|
887
|
+
described_class.validation_default.should be_true
|
|
888
|
+
end
|
|
889
|
+
end
|
|
890
|
+
|
|
891
|
+
context "when the embedded document has an array field" do
|
|
892
|
+
|
|
893
|
+
let!(:person) do
|
|
894
|
+
Person.create
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
let!(:name) do
|
|
898
|
+
person.create_name(
|
|
899
|
+
first_name: "Syd",
|
|
900
|
+
last_name: "Vicious",
|
|
901
|
+
aliases: nil
|
|
902
|
+
)
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
context "when saving the array on a persisted document" do
|
|
906
|
+
|
|
907
|
+
let(:from_db) do
|
|
908
|
+
Person.find(person.id).name
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
before do
|
|
912
|
+
from_db.aliases = [ "Syd", "Sydney" ]
|
|
913
|
+
from_db.save
|
|
914
|
+
end
|
|
915
|
+
|
|
916
|
+
it "sets the values of the array" do
|
|
917
|
+
from_db.aliases.should eq([ "Syd", "Sydney" ])
|
|
918
|
+
end
|
|
919
|
+
|
|
920
|
+
it "persists the array" do
|
|
921
|
+
Person.find(person.id).name.aliases.should eq([ "Syd", "Sydney" ])
|
|
922
|
+
end
|
|
923
|
+
end
|
|
924
|
+
end
|
|
925
|
+
|
|
926
|
+
context "when embedding a many under a one" do
|
|
927
|
+
|
|
928
|
+
let!(:person) do
|
|
929
|
+
Person.create
|
|
930
|
+
end
|
|
931
|
+
|
|
932
|
+
before do
|
|
933
|
+
person.create_name
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
context "when the documents are reloaded from the database" do
|
|
937
|
+
|
|
938
|
+
let(:from_db) do
|
|
939
|
+
Person.first
|
|
940
|
+
end
|
|
941
|
+
|
|
942
|
+
context "when adding a new many" do
|
|
943
|
+
|
|
944
|
+
let(:name) do
|
|
945
|
+
from_db.name
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
let!(:translation) do
|
|
949
|
+
name.translations.new
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
context "when saving the root" do
|
|
953
|
+
|
|
954
|
+
before do
|
|
955
|
+
from_db.save
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
it "persists the new document on the first save" do
|
|
959
|
+
from_db.reload.name.translations.should_not be_empty
|
|
960
|
+
end
|
|
961
|
+
end
|
|
962
|
+
end
|
|
963
|
+
end
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
context "when embedding a one under a many" do
|
|
967
|
+
|
|
968
|
+
let!(:person) do
|
|
969
|
+
Person.create
|
|
970
|
+
end
|
|
971
|
+
|
|
972
|
+
let!(:address_one) do
|
|
973
|
+
person.addresses.create(street: "hobrecht")
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
let!(:address_two) do
|
|
977
|
+
person.addresses.create(street: "kreuzberg")
|
|
978
|
+
end
|
|
979
|
+
|
|
980
|
+
context "when a parent was removed outside of mongoid" do
|
|
981
|
+
|
|
982
|
+
before do
|
|
983
|
+
person.collection.where(_id: person.id).update(
|
|
984
|
+
"$pull" => { "addresses" => { _id: address_one.id }}
|
|
985
|
+
)
|
|
986
|
+
end
|
|
987
|
+
|
|
988
|
+
it "reloads the correct number" do
|
|
989
|
+
person.reload.addresses.count.should eq(1)
|
|
990
|
+
end
|
|
991
|
+
|
|
992
|
+
context "when adding a child" do
|
|
993
|
+
|
|
994
|
+
let(:code) do
|
|
995
|
+
Code.new
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
before do
|
|
999
|
+
address_two.code = code
|
|
1000
|
+
end
|
|
1001
|
+
|
|
1002
|
+
it "reloads the correct number" do
|
|
1003
|
+
person.reload.addresses.count.should eq(1)
|
|
1004
|
+
end
|
|
1005
|
+
end
|
|
1006
|
+
end
|
|
1007
|
+
end
|
|
1008
|
+
|
|
1009
|
+
context "when embedded documents are stored without ids" do
|
|
1010
|
+
|
|
1011
|
+
let!(:band) do
|
|
1012
|
+
Band.create(name: "Moderat")
|
|
1013
|
+
end
|
|
1014
|
+
|
|
1015
|
+
before do
|
|
1016
|
+
band.collection.
|
|
1017
|
+
find(_id: band.id).
|
|
1018
|
+
update("$set" => { label: { name: "Mute" }})
|
|
1019
|
+
end
|
|
1020
|
+
|
|
1021
|
+
context "when loading the documents" do
|
|
1022
|
+
|
|
1023
|
+
before do
|
|
1024
|
+
band.reload
|
|
1025
|
+
end
|
|
1026
|
+
|
|
1027
|
+
let(:label) do
|
|
1028
|
+
band.label
|
|
1029
|
+
end
|
|
1030
|
+
|
|
1031
|
+
it "creates proper documents from the db" do
|
|
1032
|
+
label.name.should eq("Mute")
|
|
1033
|
+
end
|
|
1034
|
+
|
|
1035
|
+
it "assigns ids to the documents" do
|
|
1036
|
+
label.id.should_not be_nil
|
|
1037
|
+
end
|
|
1038
|
+
|
|
1039
|
+
context "when subsequently updating the documents" do
|
|
1040
|
+
|
|
1041
|
+
before do
|
|
1042
|
+
label.update_attribute(:name, "Interscope")
|
|
1043
|
+
end
|
|
1044
|
+
|
|
1045
|
+
it "updates the document" do
|
|
1046
|
+
label.name.should eq("Interscope")
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
it "persists the change" do
|
|
1050
|
+
label.reload.name.should eq("Interscope")
|
|
1051
|
+
end
|
|
1052
|
+
end
|
|
1053
|
+
end
|
|
1054
|
+
end
|
|
1055
|
+
end
|