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,402 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Criteria do
|
|
4
|
+
|
|
5
|
+
describe "#update" do
|
|
6
|
+
|
|
7
|
+
let!(:person) do
|
|
8
|
+
Person.create!(title: "Sir")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let!(:address_one) do
|
|
12
|
+
person.addresses.create(street: "Oranienstr")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let!(:address_two) do
|
|
16
|
+
person.addresses.create(street: "Wienerstr")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "when updating the root document" do
|
|
20
|
+
|
|
21
|
+
context "when updating with a criteria" do
|
|
22
|
+
|
|
23
|
+
before do
|
|
24
|
+
Person.where(title: "Sir").update(title: "Madam")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "updates all the matching documents" do
|
|
28
|
+
person.reload.title.should eq("Madam")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context "when updating all directly" do
|
|
33
|
+
|
|
34
|
+
before do
|
|
35
|
+
Person.update(title: "Madam")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "updates all the matching documents" do
|
|
39
|
+
person.reload.title.should eq("Madam")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "when updating an embedded document" do
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
Person.where(title: "Sir").update(
|
|
48
|
+
"addresses.0.city" => "Berlin"
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
let!(:from_db) do
|
|
53
|
+
Person.first
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "updates all the matching documents" do
|
|
57
|
+
from_db.addresses.first.city.should eq("Berlin")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "does not update non matching documents" do
|
|
61
|
+
from_db.addresses.last.city.should be_nil
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "when updating a relation" do
|
|
66
|
+
|
|
67
|
+
context "when the relation is an embeds many" do
|
|
68
|
+
|
|
69
|
+
let(:from_db) do
|
|
70
|
+
Person.first
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "when updating the relation directly" do
|
|
74
|
+
|
|
75
|
+
before do
|
|
76
|
+
person.addresses.update(city: "London")
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "updates the first document" do
|
|
80
|
+
from_db.addresses.first.city.should eq("London")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "does not update the last document" do
|
|
84
|
+
from_db.addresses.last.city.should be_nil
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context "when updating the relation through a criteria" do
|
|
89
|
+
|
|
90
|
+
before do
|
|
91
|
+
person.addresses.where(street: "Oranienstr").update(city: "Berlin")
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "updates the matching documents" do
|
|
95
|
+
from_db.addresses.first.city.should eq("Berlin")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "does not update non matching documents" do
|
|
99
|
+
from_db.addresses.last.city.should be_nil
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "when the relation is a references many" do
|
|
105
|
+
|
|
106
|
+
let!(:post_one) do
|
|
107
|
+
person.posts.create(title: "First")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
let!(:post_two) do
|
|
111
|
+
person.posts.create(title: "Second")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "when updating the relation directly" do
|
|
115
|
+
|
|
116
|
+
before do
|
|
117
|
+
person.posts.update(title: "London")
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
let!(:from_db) do
|
|
121
|
+
Person.first
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "updates the first document" do
|
|
125
|
+
from_db.posts.first.title.should eq("London")
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it "does not update the last document" do
|
|
129
|
+
from_db.posts.last.title.should eq("Second")
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context "when updating the relation through a criteria" do
|
|
134
|
+
|
|
135
|
+
before do
|
|
136
|
+
person.posts.where(title: "First").update(title: "Berlin")
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
let!(:from_db) do
|
|
140
|
+
Person.first
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "updates the matching documents" do
|
|
144
|
+
from_db.posts.where(title: "Berlin").count.should eq(1)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "does not update non matching documents" do
|
|
148
|
+
from_db.posts.where(title: "Second").count.should eq(1)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
context "when the relation is a references many to many" do
|
|
154
|
+
|
|
155
|
+
let(:from_db) do
|
|
156
|
+
Person.first
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
let!(:preference_one) do
|
|
160
|
+
person.preferences.create(name: "First")
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
let!(:preference_two) do
|
|
164
|
+
person.preferences.create(name: "Second")
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context "when updating the relation directly" do
|
|
168
|
+
|
|
169
|
+
before do
|
|
170
|
+
person.preferences.update(name: "London")
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "updates the first document" do
|
|
174
|
+
from_db.preferences.first.name.should eq("London")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "does not update the last document" do
|
|
178
|
+
from_db.preferences.last.name.should eq("Second")
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
context "when updating the relation through a criteria" do
|
|
183
|
+
|
|
184
|
+
before do
|
|
185
|
+
person.preferences.where(name: "First").update(name: "Berlin")
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "updates the matching documents" do
|
|
189
|
+
from_db.preferences.first.name.should eq("Berlin")
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "does not update non matching documents" do
|
|
193
|
+
from_db.preferences.last.name.should eq("Second")
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
describe "#update_all" do
|
|
201
|
+
|
|
202
|
+
let!(:person) do
|
|
203
|
+
Person.create(title: "Sir")
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
let!(:address_one) do
|
|
207
|
+
person.addresses.create(street: "Oranienstr")
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
let!(:address_two) do
|
|
211
|
+
person.addresses.create(street: "Wienerstr")
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context "when updating the root document" do
|
|
215
|
+
|
|
216
|
+
context "when updating with a criteria" do
|
|
217
|
+
|
|
218
|
+
let(:from_db) do
|
|
219
|
+
Person.first
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
before do
|
|
223
|
+
Person.where(title: "Sir").update_all(title: "Madam")
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "updates all the matching documents" do
|
|
227
|
+
from_db.title.should eq("Madam")
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
context "when updating all directly" do
|
|
232
|
+
|
|
233
|
+
let(:from_db) do
|
|
234
|
+
Person.first
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
before do
|
|
238
|
+
Person.update_all(title: "Madam")
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it "updates all the matching documents" do
|
|
242
|
+
from_db.title.should eq("Madam")
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
context "when updating an embedded document" do
|
|
248
|
+
|
|
249
|
+
before do
|
|
250
|
+
Person.where(title: "Sir").update_all(
|
|
251
|
+
"addresses.0.city" => "Berlin"
|
|
252
|
+
)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
let!(:from_db) do
|
|
256
|
+
Person.first
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "updates all the matching documents" do
|
|
260
|
+
from_db.addresses.first.city.should eq("Berlin")
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "does not update non matching documents" do
|
|
264
|
+
from_db.addresses.last.city.should be_nil
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
context "when updating a relation" do
|
|
269
|
+
|
|
270
|
+
context "when the relation is an embeds many" do
|
|
271
|
+
|
|
272
|
+
let(:from_db) do
|
|
273
|
+
Person.first
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
context "when updating the relation directly" do
|
|
277
|
+
|
|
278
|
+
before do
|
|
279
|
+
person.addresses.update_all(city: "London")
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it "updates the first document" do
|
|
283
|
+
from_db.addresses.first.city.should eq("London")
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "updates the last document" do
|
|
287
|
+
from_db.addresses.last.city.should eq("London")
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context "when updating the relation through a criteria" do
|
|
292
|
+
|
|
293
|
+
before do
|
|
294
|
+
person.addresses.where(street: "Oranienstr").update_all(city: "Berlin")
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it "updates the matching documents" do
|
|
298
|
+
from_db.addresses.first.city.should eq("Berlin")
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "does not update non matching documents" do
|
|
302
|
+
from_db.addresses.last.city.should be_nil
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
context "when the relation is a references many" do
|
|
308
|
+
|
|
309
|
+
let!(:post_one) do
|
|
310
|
+
person.posts.create(title: "First")
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
let!(:post_two) do
|
|
314
|
+
person.posts.create(title: "Second")
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
context "when updating the relation directly" do
|
|
318
|
+
|
|
319
|
+
before do
|
|
320
|
+
person.posts.update_all(title: "London")
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
let!(:from_db) do
|
|
324
|
+
Person.first
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
it "updates the first document" do
|
|
328
|
+
from_db.posts.first.title.should eq("London")
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "updates the last document" do
|
|
332
|
+
from_db.posts.last.title.should eq("London")
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
context "when updating the relation through a criteria" do
|
|
337
|
+
|
|
338
|
+
before do
|
|
339
|
+
person.posts.where(title: "First").update_all(title: "Berlin")
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
let!(:from_db) do
|
|
343
|
+
Person.first
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
it "updates the matching documents" do
|
|
347
|
+
from_db.posts.where(title: "Berlin").count.should eq(1)
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
it "does not update non matching documents" do
|
|
351
|
+
from_db.posts.where(title: "Second").count.should eq(1)
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
context "when the relation is a references many to many" do
|
|
357
|
+
|
|
358
|
+
let(:from_db) do
|
|
359
|
+
Person.first
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
let!(:preference_one) do
|
|
363
|
+
person.preferences.create(name: "First")
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
let!(:preference_two) do
|
|
367
|
+
person.preferences.create(name: "Second")
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
context "when updating the relation directly" do
|
|
371
|
+
|
|
372
|
+
before do
|
|
373
|
+
person.preferences.update_all(name: "London")
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
it "updates the first document" do
|
|
377
|
+
from_db.preferences.first.name.should eq("London")
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "updates the last document" do
|
|
381
|
+
from_db.preferences.last.name.should eq("London")
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
context "when updating the relation through a criteria" do
|
|
386
|
+
|
|
387
|
+
before do
|
|
388
|
+
person.preferences.where(name: "First").update_all(name: "Berlin")
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
it "updates the matching documents" do
|
|
392
|
+
from_db.preferences.first.name.should eq("Berlin")
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
it "does not update non matching documents" do
|
|
396
|
+
from_db.preferences.last.name.should eq("Second")
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
end
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Criterion::Scoping do
|
|
4
|
+
|
|
5
|
+
describe "#apply_default_scope" do
|
|
6
|
+
|
|
7
|
+
context "when the default scope has options" do
|
|
8
|
+
|
|
9
|
+
let(:scope) do
|
|
10
|
+
Band.skip(20)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
Band.default_scope scope
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
after do
|
|
18
|
+
Band.default_scoping = nil
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
let(:scoped) do
|
|
22
|
+
Band.all.tap do |criteria|
|
|
23
|
+
criteria.apply_default_scope
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "merges in the options" do
|
|
28
|
+
scoped.options.should eq({ skip: 20 })
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "sets scoped to true" do
|
|
32
|
+
scoped.should be_scoped
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when the default scope has selection" do
|
|
37
|
+
|
|
38
|
+
let(:scope) do
|
|
39
|
+
Band.where(name: "Depeche Mode")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
before do
|
|
43
|
+
Band.default_scope scope
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
after do
|
|
47
|
+
Band.default_scoping = nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
let(:scoped) do
|
|
51
|
+
Band.all.tap do |criteria|
|
|
52
|
+
criteria.apply_default_scope
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "merges in the options" do
|
|
57
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "sets scoped to true" do
|
|
61
|
+
scoped.should be_scoped
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "when the default scope has inclusions" do
|
|
66
|
+
|
|
67
|
+
let(:scope) do
|
|
68
|
+
Band.includes(:records)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
before do
|
|
72
|
+
Band.default_scope scope
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
after do
|
|
76
|
+
Band.default_scoping = nil
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
context "when merging with an empty criteria" do
|
|
80
|
+
|
|
81
|
+
let(:scoped) do
|
|
82
|
+
Band.all.tap do |criteria|
|
|
83
|
+
criteria.apply_default_scope
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "merges in the inclusions" do
|
|
88
|
+
scoped.inclusions.should eq(
|
|
89
|
+
[ Band.relations["records"] ]
|
|
90
|
+
)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "sets scoped to true" do
|
|
94
|
+
scoped.should be_scoped
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "when merging with a criteria that has inclusions" do
|
|
99
|
+
|
|
100
|
+
let(:scoped) do
|
|
101
|
+
Band.includes(:label).tap do |criteria|
|
|
102
|
+
criteria.apply_default_scope
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "merges in the inclusions" do
|
|
107
|
+
scoped.inclusions.should eq(
|
|
108
|
+
[ Band.relations["records"], Band.relations["label"] ]
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "sets scoped to true" do
|
|
113
|
+
scoped.should be_scoped
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe "#remove_scoping" do
|
|
120
|
+
|
|
121
|
+
context "when the other has selection" do
|
|
122
|
+
|
|
123
|
+
let(:criteria) do
|
|
124
|
+
Band.where(name: "Depeche Mode")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
before do
|
|
128
|
+
criteria.remove_scoping(criteria)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "removes the selection" do
|
|
132
|
+
criteria.selector.should be_empty
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context "when the other has options" do
|
|
137
|
+
|
|
138
|
+
context "when both are options only" do
|
|
139
|
+
|
|
140
|
+
let(:criteria) do
|
|
141
|
+
Band.skip(10)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
before do
|
|
145
|
+
criteria.remove_scoping(criteria)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "removes the options" do
|
|
149
|
+
criteria.options.should be_empty
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
context "when the criteria is selection only with nil" do
|
|
154
|
+
|
|
155
|
+
let(:criteria) do
|
|
156
|
+
Band.where(name: nil)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
before do
|
|
160
|
+
criteria.remove_scoping(Band.asc(:_id))
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "removes the options" do
|
|
164
|
+
criteria.options.should be_empty
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "does not remove the selector" do
|
|
168
|
+
criteria.selector.should eq({ "name" => nil })
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
context "when the other has inclusions" do
|
|
174
|
+
|
|
175
|
+
let(:criteria) do
|
|
176
|
+
Band.includes(:records, :label)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
let(:other) do
|
|
180
|
+
Band.includes(:label)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
before do
|
|
184
|
+
criteria.remove_scoping(other)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "removes the matching inclusions" do
|
|
188
|
+
criteria.inclusions.should eq([ Band.relations["records"] ])
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
describe "#scoped" do
|
|
194
|
+
|
|
195
|
+
let(:empty) do
|
|
196
|
+
Mongoid::Criteria.new(Band)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
context "when no options are provided" do
|
|
200
|
+
|
|
201
|
+
let(:scoped) do
|
|
202
|
+
empty.scoped
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it "returns a criteria" do
|
|
206
|
+
scoped.should be_a(Mongoid::Criteria)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "contains an empty selector" do
|
|
210
|
+
scoped.selector.should be_empty
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it "contains empty options" do
|
|
214
|
+
scoped.options.should be_empty
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
context "when options are provided" do
|
|
219
|
+
|
|
220
|
+
let(:scoped) do
|
|
221
|
+
empty.scoped(skip: 10, limit: 10)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "returns a criteria" do
|
|
225
|
+
scoped.should be_a(Mongoid::Criteria)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "contains an empty selector" do
|
|
229
|
+
scoped.selector.should be_empty
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "contains the options" do
|
|
233
|
+
scoped.options.should eq({ skip: 10, limit: 10 })
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "when a default scope exists" do
|
|
238
|
+
|
|
239
|
+
let(:criteria) do
|
|
240
|
+
Band.where(name: "Depeche Mode")
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
before do
|
|
244
|
+
Band.default_scope criteria
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
after do
|
|
248
|
+
Band.default_scoping = nil
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
let(:scoped) do
|
|
252
|
+
empty.scoped
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it "allows the default scope to be added" do
|
|
256
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "flags as scoped" do
|
|
260
|
+
scoped.should be_scoped
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
context "when chained after an unscoped criteria" do
|
|
264
|
+
|
|
265
|
+
let(:scoped) do
|
|
266
|
+
empty.unscoped.scoped
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
it "reapplies the default scope" do
|
|
270
|
+
scoped.selector.should eq({ "name" => "Depeche Mode" })
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
describe "#scoping_options" do
|
|
277
|
+
|
|
278
|
+
let(:criteria) do
|
|
279
|
+
Band.all
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
before do
|
|
283
|
+
criteria.scoping_options = true, false
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "returns the scoping options" do
|
|
287
|
+
criteria.scoping_options.should eq([ true, false ])
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
describe "#scoping_options=" do
|
|
292
|
+
|
|
293
|
+
let(:criteria) do
|
|
294
|
+
Band.all
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
before do
|
|
298
|
+
criteria.scoping_options = true, true
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "sets the scoped flag" do
|
|
302
|
+
criteria.should be_scoped
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
it "sets the unscoped flag" do
|
|
306
|
+
criteria.should be_unscoped
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
describe ".unscoped" do
|
|
311
|
+
|
|
312
|
+
let(:empty) do
|
|
313
|
+
Mongoid::Criteria.new(Band)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
let(:criteria) do
|
|
317
|
+
Band.where(name: "Depeche Mode")
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
before do
|
|
321
|
+
Band.default_scope criteria
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
after do
|
|
325
|
+
Band.default_scoping = nil
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
context "when called directly" do
|
|
329
|
+
|
|
330
|
+
let(:unscoped) do
|
|
331
|
+
empty.unscoped
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
it "removes the default scope from the criteria" do
|
|
335
|
+
unscoped.selector.should be_empty
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
context "when chained after a scoped criteria" do
|
|
339
|
+
|
|
340
|
+
let(:unscoped) do
|
|
341
|
+
empty.scoped.unscoped
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
it "removes all scoping" do
|
|
345
|
+
unscoped.selector.should be_empty
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
context "when used with a block" do
|
|
351
|
+
|
|
352
|
+
context "when a criteria is called in the block" do
|
|
353
|
+
|
|
354
|
+
it "does not allow default scoping to be added in the block" do
|
|
355
|
+
Band.unscoped do
|
|
356
|
+
empty.skip(10).selector.should be_empty
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
context "when a call is made to scoped in the block" do
|
|
362
|
+
|
|
363
|
+
it "does not allow default scoping to be added in the block" do
|
|
364
|
+
Band.unscoped do
|
|
365
|
+
empty.scoped.selector.should be_empty
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
context "when a named scope is called in the block" do
|
|
371
|
+
|
|
372
|
+
before do
|
|
373
|
+
Band.scope(:skipped, Band.skip(10))
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
after do
|
|
377
|
+
class << Band
|
|
378
|
+
undef_method :skipped
|
|
379
|
+
end
|
|
380
|
+
Band._declared_scopes.clear
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
it "does not allow the default scope to be applied" do
|
|
384
|
+
Band.unscoped do
|
|
385
|
+
empty.skipped.selector.should be_empty
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
end
|