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,833 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Serialization do
|
|
4
|
+
|
|
5
|
+
describe "#field_names" do
|
|
6
|
+
|
|
7
|
+
let(:band) do
|
|
8
|
+
Band.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "does not duplicate fields" do
|
|
12
|
+
band.send(:field_names, {}).should eq(band.fields.except("_type").keys.sort)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe "#serializable_hash" do
|
|
17
|
+
|
|
18
|
+
let(:person) do
|
|
19
|
+
Person.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when a dynamic attribute has the same name as a ruby method" do
|
|
23
|
+
|
|
24
|
+
before do
|
|
25
|
+
person[:loop] = "testing"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
let(:attributes) do
|
|
29
|
+
person.serializable_hash
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "grabs the attribute direct from the hash" do
|
|
33
|
+
attributes["loop"].should eq("testing")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "when the method for a declared field is overridden" do
|
|
38
|
+
|
|
39
|
+
before do
|
|
40
|
+
person.override_me = 1
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
let(:attributes) do
|
|
44
|
+
person.serializable_hash
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "uses the overridden method" do
|
|
48
|
+
attributes["override_me"].should eq("1")
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
context "when the model has embedded documents" do
|
|
53
|
+
|
|
54
|
+
let!(:address) do
|
|
55
|
+
person.addresses.build(street: "test")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "when providing no custom options" do
|
|
59
|
+
|
|
60
|
+
let(:attributes) do
|
|
61
|
+
person.serializable_hash
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "includes the embedded documents" do
|
|
65
|
+
attributes["addresses"].first.should eq(address.serializable_hash)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "when providing options" do
|
|
70
|
+
|
|
71
|
+
let(:attributes) do
|
|
72
|
+
person.serializable_hash(methods: :id, except: :_id)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
let(:address_attributes) do
|
|
76
|
+
attributes["addresses"].first
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "uses the options" do
|
|
80
|
+
attributes["id"].should eq(person.id)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "uses the options on embedded documents" do
|
|
84
|
+
address_attributes["id"].should eq(address.id)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "when nested multiple levels" do
|
|
89
|
+
|
|
90
|
+
let!(:location) do
|
|
91
|
+
address.locations.build(name: "home")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
let(:attributes) do
|
|
95
|
+
person.serializable_hash
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "includes the deeply nested document" do
|
|
99
|
+
attributes["addresses"][0]["locations"].should_not be_empty
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "when the model has attributes that need conversion" do
|
|
105
|
+
|
|
106
|
+
let(:date) do
|
|
107
|
+
Date.new(1970, 1, 1)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
before do
|
|
111
|
+
person.dob = date
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
let(:attributes) do
|
|
115
|
+
person.serializable_hash
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it "converts the objects to the defined type" do
|
|
119
|
+
attributes["dob"].should eq(date)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context "when a model has defined fields" do
|
|
124
|
+
|
|
125
|
+
let(:attributes) do
|
|
126
|
+
{ "title" => "President", "security_code" => "1234" }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
before do
|
|
130
|
+
person.write_attributes(attributes, false)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
let(:field_names) do
|
|
134
|
+
person.fields.keys.map(&:to_s) - ["_type"]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it "serializes assigned attributes" do
|
|
138
|
+
person.serializable_hash.should include attributes
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "includes all defined fields except _type" do
|
|
142
|
+
person.serializable_hash.keys.should include(*field_names)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "does not include _type" do
|
|
146
|
+
person.serializable_hash.keys.should_not include "_type"
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
context "when providing options" do
|
|
150
|
+
|
|
151
|
+
let(:options) do
|
|
152
|
+
{ only: :name }
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
before do
|
|
156
|
+
person.serializable_hash(options)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "does not modify the options in the argument" do
|
|
160
|
+
options[:except].should be_nil
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
context "when include_type_for_serialization is true" do
|
|
165
|
+
|
|
166
|
+
before do
|
|
167
|
+
Mongoid.include_type_for_serialization = true
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
after do
|
|
171
|
+
Mongoid.include_type_for_serialization = false
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "includes _type field" do
|
|
175
|
+
person.serializable_hash.keys.should include '_type'
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
context "when specifying which fields to only include" do
|
|
180
|
+
|
|
181
|
+
it "only includes the specified fields" do
|
|
182
|
+
person.serializable_hash(only: [:title]).should eq(
|
|
183
|
+
{ "title" => attributes["title"] }
|
|
184
|
+
)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context "when specifying extra inclusions" do
|
|
189
|
+
|
|
190
|
+
it "includes the extra fields" do
|
|
191
|
+
person.serializable_hash(
|
|
192
|
+
methods: [ :_type ]
|
|
193
|
+
).has_key?("_type").should be_true
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
context "when specifying which fields to exclude" do
|
|
198
|
+
|
|
199
|
+
it "excludes the specified fields" do
|
|
200
|
+
person.serializable_hash(except: [:title]).should_not include(
|
|
201
|
+
"title" => attributes["title"]
|
|
202
|
+
)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
context "when a model has dynamic fields" do
|
|
208
|
+
|
|
209
|
+
let(:dynamic_field_name) do
|
|
210
|
+
"dynamic_field_name"
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
let(:dynamic_value) do
|
|
214
|
+
"dynamic_value"
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
before do
|
|
218
|
+
person.write_attribute(dynamic_field_name, dynamic_value)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "includes dynamic fields" do
|
|
222
|
+
person.serializable_hash[dynamic_field_name].should eq(dynamic_value)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
context "when specifying which dynamic fields to only include" do
|
|
226
|
+
|
|
227
|
+
it "only includes the specified dynamic fields" do
|
|
228
|
+
person.serializable_hash(only: [dynamic_field_name]).should eq(
|
|
229
|
+
{ dynamic_field_name => dynamic_value }
|
|
230
|
+
)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
context "when specified which dynamic fields to exclude" do
|
|
235
|
+
|
|
236
|
+
it "excludes the specified fields" do
|
|
237
|
+
person.serializable_hash(except: [dynamic_field_name]).should_not include(
|
|
238
|
+
dynamic_field_name => dynamic_value
|
|
239
|
+
)
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context "when a model has relations" do
|
|
245
|
+
|
|
246
|
+
let(:attributes) do
|
|
247
|
+
{ "title" => "President", "security_code" => "1234" }
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
before do
|
|
251
|
+
person.write_attributes(attributes, false)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
context "when the model is saved before the relation is added" do
|
|
255
|
+
|
|
256
|
+
before do
|
|
257
|
+
person.save
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
context "when a model has an embeds many" do
|
|
261
|
+
|
|
262
|
+
let!(:address_one) do
|
|
263
|
+
person.addresses.build(street: "Kudamm")
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
before do
|
|
267
|
+
person.save
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "includes the relation" do
|
|
271
|
+
person.serializable_hash.keys.should include('addresses')
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
context "when a model has an embeds one" do
|
|
276
|
+
let!(:name) do
|
|
277
|
+
person.build_name(first_name: "Leo", last_name: "Marvin")
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
before do
|
|
281
|
+
person.save
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it "includes the relation" do
|
|
285
|
+
person.serializable_hash.keys.should include('name')
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
context "when the model is saved after the relation is added" do
|
|
291
|
+
|
|
292
|
+
context "when a model has an embeds many" do
|
|
293
|
+
|
|
294
|
+
let!(:address_one) do
|
|
295
|
+
person.addresses.build(street: "Kudamm")
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
before do
|
|
299
|
+
person.save
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
it "includes the relation" do
|
|
303
|
+
person.serializable_hash.keys.should include('addresses')
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
context "when a model has an embeds one" do
|
|
308
|
+
let!(:name) do
|
|
309
|
+
person.build_name(first_name: "Leo", last_name: "Marvin")
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
before do
|
|
313
|
+
person.save
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it "includes the relation" do
|
|
317
|
+
person.serializable_hash.keys.should include('name')
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
context "when including methods" do
|
|
324
|
+
|
|
325
|
+
it "includes the method result" do
|
|
326
|
+
person.serializable_hash(methods: [:foo]).should include(
|
|
327
|
+
"foo" => person.foo
|
|
328
|
+
)
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
context "when including relations" do
|
|
333
|
+
|
|
334
|
+
context "when including a single relation" do
|
|
335
|
+
|
|
336
|
+
context "when including an embeds many" do
|
|
337
|
+
|
|
338
|
+
let!(:address_one) do
|
|
339
|
+
person.addresses.build(street: "Kudamm")
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
let!(:address_two) do
|
|
343
|
+
person.addresses.build(street: "Tauentzienstr")
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
let(:relation_hash) do
|
|
347
|
+
hash["addresses"]
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
pending "when the ids were not loaded" do
|
|
351
|
+
|
|
352
|
+
before do
|
|
353
|
+
person.save
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
let(:from_db) do
|
|
357
|
+
Person.only("addresses.street").first
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
let(:hash) do
|
|
361
|
+
from_db.serializable_hash
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
it "does not generate new ids" do
|
|
365
|
+
hash["addresses"].first["_id"].should be_nil
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
context "when providing the include as a symbol" do
|
|
370
|
+
|
|
371
|
+
let(:hash) do
|
|
372
|
+
person.serializable_hash(include: :addresses)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
it "includes the first relation" do
|
|
376
|
+
relation_hash[0].should include
|
|
377
|
+
{ "_id" => "kudamm", "street" => "Kudamm" }
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "includes the second relation" do
|
|
381
|
+
relation_hash[1].should include
|
|
382
|
+
{ "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
context "when providing the include as an array" do
|
|
387
|
+
|
|
388
|
+
let(:hash) do
|
|
389
|
+
person.serializable_hash(include: [ :addresses ])
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
it "includes the first relation" do
|
|
393
|
+
relation_hash[0].should include
|
|
394
|
+
{ "_id" => "kudamm", "street" => "Kudamm" }
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
it "includes the second relation" do
|
|
398
|
+
relation_hash[1].should include
|
|
399
|
+
{ "_id" => "tauentzienstr", "street" => "Tauentzienstr" }
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
context "when providing the include as a hash" do
|
|
404
|
+
|
|
405
|
+
context "when including one level deep" do
|
|
406
|
+
|
|
407
|
+
let(:hash) do
|
|
408
|
+
person.serializable_hash(include: { addresses: { except: :_id } })
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
it "includes the first relation sans exceptions" do
|
|
412
|
+
relation_hash[0].should include({ "street" => "Kudamm" })
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
it "includes the second relation sans exceptions" do
|
|
416
|
+
relation_hash[1].should include({ "street" => "Tauentzienstr" })
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
context "when including multiple levels deep" do
|
|
421
|
+
|
|
422
|
+
let!(:location) do
|
|
423
|
+
address_one.locations.build(name: "Home")
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
let(:hash) do
|
|
427
|
+
person.serializable_hash(
|
|
428
|
+
include: { addresses: {
|
|
429
|
+
except: :_id, include: { locations: { except: :_id } }
|
|
430
|
+
}
|
|
431
|
+
})
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
it "includes the first relation" do
|
|
435
|
+
relation_hash[0]["locations"].any? do |location|
|
|
436
|
+
location["name"] == "Home"
|
|
437
|
+
end.should be_true
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
context "after retrieved from database" do
|
|
441
|
+
|
|
442
|
+
let(:db_person) do
|
|
443
|
+
Person.all.last
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
let!(:second_location) do
|
|
447
|
+
address_two.locations.build(name: "Hotel")
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
let(:hash) do
|
|
451
|
+
db_person.serializable_hash(
|
|
452
|
+
include: { addresses: {
|
|
453
|
+
except: :_id, include: { locations: { except: :_id } }
|
|
454
|
+
}
|
|
455
|
+
})
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
before do
|
|
459
|
+
person.save
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
it "includes the specific ralations" do
|
|
463
|
+
relation_hash[0]["locations"].map do |location|
|
|
464
|
+
location["name"]
|
|
465
|
+
end.should include "Home"
|
|
466
|
+
relation_hash[1]["locations"].map do |location|
|
|
467
|
+
location["name"]
|
|
468
|
+
end.should include "Hotel"
|
|
469
|
+
end
|
|
470
|
+
end
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
context "when defining a default exclusion" do
|
|
474
|
+
|
|
475
|
+
let!(:name) do
|
|
476
|
+
person.build_name(first_name: "Sebastien")
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
let(:hash) do
|
|
480
|
+
person.serializable_hash(
|
|
481
|
+
except: :_id,
|
|
482
|
+
include: [ :addresses, :name ]
|
|
483
|
+
)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
it "does not contain the root exclusion" do
|
|
487
|
+
hash["_id"].should be_nil
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
it "does not include the embedded many exclusion" do
|
|
491
|
+
relation_hash[0]["_id"].should be_nil
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
it "does not include the embedded one exclusion" do
|
|
495
|
+
hash["name"]["_id"].should be_nil
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
context "when including an embeds one" do
|
|
502
|
+
|
|
503
|
+
let!(:name) do
|
|
504
|
+
person.build_name(first_name: "Leo", last_name: "Marvin")
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
let(:relation_hash) do
|
|
508
|
+
hash["name"]
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
context "when providing the include as a symbol" do
|
|
512
|
+
|
|
513
|
+
let(:hash) do
|
|
514
|
+
person.serializable_hash(include: :name)
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
it "includes the specified relation" do
|
|
518
|
+
relation_hash.should include
|
|
519
|
+
{ "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
|
|
520
|
+
end
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
context "when providing the include as an array" do
|
|
524
|
+
|
|
525
|
+
let(:hash) do
|
|
526
|
+
person.serializable_hash(include: [ :name ])
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
it "includes the specified relation" do
|
|
530
|
+
relation_hash.should include
|
|
531
|
+
{ "_id" => "leo-marvin", "first_name" => "Leo", "last_name" => "Marvin" }
|
|
532
|
+
end
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
context "when providing the include as a hash" do
|
|
536
|
+
|
|
537
|
+
let(:hash) do
|
|
538
|
+
person.serializable_hash(include: { name: { except: :_id }})
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
it "includes the specified relation sans exceptions" do
|
|
542
|
+
relation_hash.should include
|
|
543
|
+
{ "first_name" => "Leo", "last_name" => "Marvin" }
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
context "when including a references many" do
|
|
549
|
+
|
|
550
|
+
let!(:post_one) do
|
|
551
|
+
person.posts.build(title: "First")
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
let!(:post_two) do
|
|
555
|
+
person.posts.build(title: "Second")
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
let(:relation_hash) do
|
|
559
|
+
hash["posts"]
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
context "when providing the include as a symbol" do
|
|
563
|
+
|
|
564
|
+
let(:hash) do
|
|
565
|
+
person.serializable_hash(include: :posts)
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
it "includes the specified relation" do
|
|
569
|
+
relation_hash.should_not be_nil
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
it "includes the first document related fields" do
|
|
573
|
+
relation_hash[0]["title"].should eq("First")
|
|
574
|
+
end
|
|
575
|
+
|
|
576
|
+
it "includes the second document related fields" do
|
|
577
|
+
relation_hash[1]["title"].should eq("Second")
|
|
578
|
+
end
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
context "when providing the include as an array" do
|
|
582
|
+
|
|
583
|
+
let(:hash) do
|
|
584
|
+
person.serializable_hash(include: [ :posts ])
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
it "includes the specified relation" do
|
|
588
|
+
relation_hash.should_not be_nil
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
it "includes the first document related fields" do
|
|
592
|
+
relation_hash[0]["title"].should eq("First")
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
it "includes the second document related fields" do
|
|
596
|
+
relation_hash[1]["title"].should eq("Second")
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
context "when providing the include as a hash" do
|
|
601
|
+
|
|
602
|
+
let(:hash) do
|
|
603
|
+
person.serializable_hash(include: { posts: { except: :_id } })
|
|
604
|
+
end
|
|
605
|
+
|
|
606
|
+
it "includes the specified relation" do
|
|
607
|
+
relation_hash.should_not be_nil
|
|
608
|
+
end
|
|
609
|
+
|
|
610
|
+
it "includes the first document related fields" do
|
|
611
|
+
relation_hash[0]["title"].should eq("First")
|
|
612
|
+
end
|
|
613
|
+
|
|
614
|
+
it "includes the second document related fields" do
|
|
615
|
+
relation_hash[1]["title"].should eq("Second")
|
|
616
|
+
end
|
|
617
|
+
|
|
618
|
+
it "does not include the first document exceptions" do
|
|
619
|
+
relation_hash[0]["_id"].should be_nil
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
it "does not include the second document exceptions" do
|
|
623
|
+
relation_hash[1]["_id"].should be_nil
|
|
624
|
+
end
|
|
625
|
+
end
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
context "when including a references many to many" do
|
|
629
|
+
|
|
630
|
+
let!(:preference_one) do
|
|
631
|
+
person.preferences.build(name: "First")
|
|
632
|
+
end
|
|
633
|
+
|
|
634
|
+
let!(:preference_two) do
|
|
635
|
+
person.preferences.build(name: "Second")
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
let(:relation_hash) do
|
|
639
|
+
hash["preferences"]
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
context "when providing the include as a symbol" do
|
|
643
|
+
|
|
644
|
+
let(:hash) do
|
|
645
|
+
person.serializable_hash(include: :preferences)
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
it "includes the specified relation" do
|
|
649
|
+
relation_hash.should_not be_nil
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
it "includes the first document related fields" do
|
|
653
|
+
relation_hash[0]["name"].should eq("First")
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
it "includes the second document related fields" do
|
|
657
|
+
relation_hash[1]["name"].should eq("Second")
|
|
658
|
+
end
|
|
659
|
+
end
|
|
660
|
+
|
|
661
|
+
context "when providing the include as an array" do
|
|
662
|
+
|
|
663
|
+
let(:hash) do
|
|
664
|
+
person.serializable_hash(include: [ :preferences ])
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
it "includes the specified relation" do
|
|
668
|
+
relation_hash.should_not be_nil
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
it "includes the first document related fields" do
|
|
672
|
+
relation_hash[0]["name"].should eq("First")
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
it "includes the second document related fields" do
|
|
676
|
+
relation_hash[1]["name"].should eq("Second")
|
|
677
|
+
end
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
context "when providing the include as a hash" do
|
|
681
|
+
|
|
682
|
+
let(:hash) do
|
|
683
|
+
person.serializable_hash(
|
|
684
|
+
include: {
|
|
685
|
+
preferences: {
|
|
686
|
+
except: :_id
|
|
687
|
+
}
|
|
688
|
+
},
|
|
689
|
+
except: :preference_ids
|
|
690
|
+
)
|
|
691
|
+
end
|
|
692
|
+
|
|
693
|
+
it "includes the specified relation" do
|
|
694
|
+
relation_hash.should_not be_nil
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
it "includes the first document related fields" do
|
|
698
|
+
relation_hash[0]["name"].should eq("First")
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
it "includes the second document related fields" do
|
|
702
|
+
relation_hash[1]["name"].should eq("Second")
|
|
703
|
+
end
|
|
704
|
+
|
|
705
|
+
it "does not include the first document exceptions" do
|
|
706
|
+
relation_hash[0]["_id"].should be_nil
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
it "does not include the second document exceptions" do
|
|
710
|
+
relation_hash[1]["_id"].should be_nil
|
|
711
|
+
end
|
|
712
|
+
|
|
713
|
+
it "does not include the root exceptions" do
|
|
714
|
+
hash["preference_ids"].should be_nil
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
end
|
|
719
|
+
end
|
|
720
|
+
end
|
|
721
|
+
|
|
722
|
+
describe "#to_json" do
|
|
723
|
+
|
|
724
|
+
let(:person) do
|
|
725
|
+
Person.new
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
context "when including root in json" do
|
|
729
|
+
|
|
730
|
+
before do
|
|
731
|
+
Mongoid.include_root_in_json = true
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
it "uses the mongoid configuration" do
|
|
735
|
+
person.to_json.should include("person")
|
|
736
|
+
end
|
|
737
|
+
end
|
|
738
|
+
|
|
739
|
+
context "when not including root in json" do
|
|
740
|
+
|
|
741
|
+
before do
|
|
742
|
+
Mongoid.include_root_in_json = false
|
|
743
|
+
end
|
|
744
|
+
|
|
745
|
+
it "uses the mongoid configuration" do
|
|
746
|
+
person.to_json.should_not include("person")
|
|
747
|
+
end
|
|
748
|
+
end
|
|
749
|
+
|
|
750
|
+
context "when serializing a relation directly" do
|
|
751
|
+
|
|
752
|
+
context "when serializing an embeds many" do
|
|
753
|
+
|
|
754
|
+
let!(:address) do
|
|
755
|
+
person.addresses.build(street: "Kudamm")
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
let(:json) do
|
|
759
|
+
person.addresses.to_json
|
|
760
|
+
end
|
|
761
|
+
|
|
762
|
+
it "serializes only the relation" do
|
|
763
|
+
json.should include(address.street)
|
|
764
|
+
end
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
context "when serializing a references many" do
|
|
768
|
+
|
|
769
|
+
let!(:post) do
|
|
770
|
+
person.posts.build(title: "testing")
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
let(:json) do
|
|
774
|
+
person.posts.to_json
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
it "serializes only the relation" do
|
|
778
|
+
json.should include(post.title)
|
|
779
|
+
end
|
|
780
|
+
end
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
describe "#to_xml" do
|
|
785
|
+
|
|
786
|
+
context "Moped::BSON::ObjectId" do
|
|
787
|
+
|
|
788
|
+
let(:person) do
|
|
789
|
+
Person.new
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
it "serializes as string" do
|
|
793
|
+
person.to_xml.should include("<_id>#{person.id}</_id>")
|
|
794
|
+
end
|
|
795
|
+
end
|
|
796
|
+
|
|
797
|
+
context "when an Array field is defined" do
|
|
798
|
+
|
|
799
|
+
let(:person) do
|
|
800
|
+
Person.new(
|
|
801
|
+
aliases: [ "Kelly", "Machine Gun" ]
|
|
802
|
+
)
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
it "properly types the array" do
|
|
806
|
+
person.to_xml.should include("<aliases type=\"array\">")
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
it "serializes the array" do
|
|
810
|
+
person.to_xml.should include("<alias>Kelly</alias>")
|
|
811
|
+
person.to_xml.should include("<alias>Machine Gun</alias>")
|
|
812
|
+
end
|
|
813
|
+
end
|
|
814
|
+
|
|
815
|
+
context "when a Hash field is defined" do
|
|
816
|
+
|
|
817
|
+
let(:person) do
|
|
818
|
+
Person.new(
|
|
819
|
+
map: { lat: 24.5, long: 22.1 }
|
|
820
|
+
)
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
it "properly types the hash" do
|
|
824
|
+
person.to_xml.should include("<map>")
|
|
825
|
+
end
|
|
826
|
+
|
|
827
|
+
it "serializes the hash" do
|
|
828
|
+
person.to_xml.should include("<lat type=\"float\">24.5</lat>")
|
|
829
|
+
person.to_xml.should include("<long type=\"float\">22.1</long>")
|
|
830
|
+
end
|
|
831
|
+
end
|
|
832
|
+
end
|
|
833
|
+
end
|