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,223 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Validations::LengthValidator do
|
|
4
|
+
|
|
5
|
+
describe "#validate_each" do
|
|
6
|
+
|
|
7
|
+
let(:product) do
|
|
8
|
+
Product.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "when the field is not localized" do
|
|
12
|
+
|
|
13
|
+
let(:validator) do
|
|
14
|
+
described_class.new(attributes: [:brand_name], in: 1..5)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when the value is valid" do
|
|
18
|
+
|
|
19
|
+
before do
|
|
20
|
+
validator.validate_each(product, :brand_name, "Apple")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "adds no errors" do
|
|
24
|
+
product.errors[:brand_name].should be_empty
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when the value is invalid" do
|
|
29
|
+
|
|
30
|
+
before do
|
|
31
|
+
validator.validate_each(product, :brand_name, "123456")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "adds errors" do
|
|
35
|
+
product.errors[:brand_name].should eq(
|
|
36
|
+
["is too long (maximum is 5 characters)"]
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context "when the field is localized" do
|
|
43
|
+
|
|
44
|
+
let(:validator) do
|
|
45
|
+
described_class.new(attributes: [:website], in: 1..5)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context "when the localized value is valid" do
|
|
49
|
+
|
|
50
|
+
before do
|
|
51
|
+
validator.validate_each(product, :website, { "en" => "12345" })
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "adds no errors" do
|
|
55
|
+
product.errors[:website].should be_empty
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "when one of the localized values is invalid" do
|
|
60
|
+
|
|
61
|
+
before do
|
|
62
|
+
validator.validate_each(
|
|
63
|
+
product,
|
|
64
|
+
:website, { "en" => "12345", "fr" => "123456" }
|
|
65
|
+
)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "adds errors" do
|
|
69
|
+
product.errors[:website].should eq(
|
|
70
|
+
["is too long (maximum is 5 characters)"]
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "when the localized value is invalid" do
|
|
76
|
+
|
|
77
|
+
before do
|
|
78
|
+
validator.validate_each(product, :website, { "en" => "123456" })
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "adds errors" do
|
|
82
|
+
product.errors[:website].should eq(
|
|
83
|
+
["is too long (maximum is 5 characters)"]
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context "when the field is aliased" do
|
|
90
|
+
|
|
91
|
+
context "when the aliased field name is validated" do
|
|
92
|
+
|
|
93
|
+
let(:validator) do
|
|
94
|
+
described_class.new(attributes: [:sku], in: 1..5)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "when the value is valid" do
|
|
98
|
+
|
|
99
|
+
before do
|
|
100
|
+
validator.validate_each(product, :sku, "12345")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "adds no errors" do
|
|
104
|
+
product.errors[:sku].should be_empty
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "when the value is invalid" do
|
|
109
|
+
|
|
110
|
+
before do
|
|
111
|
+
validator.validate_each(product, :sku, "123456")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "adds errors" do
|
|
115
|
+
product.errors[:sku].should eq(["is too long (maximum is 5 characters)"])
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "when the underlying field name is validated" do
|
|
121
|
+
|
|
122
|
+
let(:validator) do
|
|
123
|
+
described_class.new(attributes: [:stock_keeping_unit], in: 1..5)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context "when the value is valid" do
|
|
127
|
+
|
|
128
|
+
before do
|
|
129
|
+
validator.validate_each(product, :stock_keeping_unit, "12345")
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it "adds no errors" do
|
|
133
|
+
product.errors[:stock_keeping_unit].should be_empty
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
context "when the value is invalid" do
|
|
138
|
+
|
|
139
|
+
before do
|
|
140
|
+
validator.validate_each(product, :stock_keeping_unit, "123456")
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "adds errors" do
|
|
144
|
+
product.errors[:stock_keeping_unit].should eq(["is too long (maximum is 5 characters)"])
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
context "when the field is localized" do
|
|
150
|
+
|
|
151
|
+
let(:validator) do
|
|
152
|
+
described_class.new(attributes: [:tagline], in: 1..5)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context "when the localized value is valid" do
|
|
156
|
+
|
|
157
|
+
before do
|
|
158
|
+
validator.validate_each(product, :tagline, { "en" => "12345" })
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "adds no errors" do
|
|
162
|
+
product.errors[:tagline].should be_empty
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context "when one of the localized values is invalid" do
|
|
167
|
+
|
|
168
|
+
before do
|
|
169
|
+
validator.validate_each(
|
|
170
|
+
product,
|
|
171
|
+
:tagline, { "en" => "12345", "fr" => "123456" }
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it "adds errors" do
|
|
176
|
+
product.errors[:tagline].should eq(["is too long (maximum is 5 characters)"])
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "when the localized value is invalid" do
|
|
181
|
+
|
|
182
|
+
before do
|
|
183
|
+
validator.validate_each(product, :tagline, { "en" => "123456" })
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "adds errors" do
|
|
187
|
+
product.errors[:tagline].should eq(["is too long (maximum is 5 characters)"])
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "when validating an array" do
|
|
195
|
+
|
|
196
|
+
before do
|
|
197
|
+
Person.validates :aliases, length: { minimum: 2, allow_blank: false }
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
after do
|
|
201
|
+
Person.reset_callbacks(:validate)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
context "when allow blank is false" do
|
|
205
|
+
|
|
206
|
+
let(:person) do
|
|
207
|
+
Person.new
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
context "when the array is empty" do
|
|
211
|
+
|
|
212
|
+
before do
|
|
213
|
+
person.array = []
|
|
214
|
+
person.valid?
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "adds the errors to the document" do
|
|
218
|
+
person.errors[:aliases].should_not be_empty
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveModel::Validations::NumericalityValidator do
|
|
4
|
+
|
|
5
|
+
describe "#validate_each" do
|
|
6
|
+
|
|
7
|
+
before(:all) do
|
|
8
|
+
class TestModel
|
|
9
|
+
include Mongoid::Document
|
|
10
|
+
field :amount, type: BigDecimal
|
|
11
|
+
validates_numericality_of :amount, allow_blank: false
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
after(:all) do
|
|
16
|
+
Object.send(:remove_const, :TestModel)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "when the value is non numeric" do
|
|
20
|
+
|
|
21
|
+
let(:model) do
|
|
22
|
+
TestModel.new(amount: "asdf")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "returns false" do
|
|
26
|
+
model.should_not be_valid
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Validations::PresenceValidator do
|
|
4
|
+
|
|
5
|
+
describe "#validate_each" do
|
|
6
|
+
|
|
7
|
+
let(:product) do
|
|
8
|
+
Product.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:validator) do
|
|
12
|
+
described_class.new(attributes: product.attributes)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when the field is not localized" do
|
|
16
|
+
|
|
17
|
+
context "when the value is valid" do
|
|
18
|
+
|
|
19
|
+
before do
|
|
20
|
+
validator.validate_each(product, :brand_name, "Apple")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "adds no errors" do
|
|
24
|
+
product.errors[:brand_name].should be_empty
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when the value is nil" do
|
|
29
|
+
|
|
30
|
+
before do
|
|
31
|
+
validator.validate_each(product, :brand_name, nil)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "adds errors" do
|
|
35
|
+
product.errors[:brand_name].should eq(["can't be blank"])
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "when the value is empty" do
|
|
40
|
+
|
|
41
|
+
before do
|
|
42
|
+
validator.validate_each(product, :brand_name, "")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "adds errors" do
|
|
46
|
+
product.errors[:brand_name].should eq(["can't be blank"])
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "when the field is localized" do
|
|
52
|
+
|
|
53
|
+
context "when the value is valid" do
|
|
54
|
+
|
|
55
|
+
before do
|
|
56
|
+
validator.validate_each(product, :name, { "en" => "iPod Nano 8GB - Black" })
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "adds no errors" do
|
|
60
|
+
product.errors[:name].should be_empty
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context "when the value is nil" do
|
|
65
|
+
|
|
66
|
+
before do
|
|
67
|
+
validator.validate_each(product, :name, nil)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "adds errors" do
|
|
71
|
+
product.errors[:name].should eq(["can't be blank"])
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "when the localized value is nil" do
|
|
76
|
+
|
|
77
|
+
before do
|
|
78
|
+
validator.validate_each(product, :name, { "en" => nil })
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "adds errors" do
|
|
82
|
+
product.errors[:name].should eq(["can't be blank in en"])
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "when the value is empty" do
|
|
87
|
+
|
|
88
|
+
before do
|
|
89
|
+
validator.validate_each(product, :name, { "en" => "" })
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "adds errors" do
|
|
93
|
+
product.errors[:name].should eq(["can't be blank in en"])
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "when the value is empty for a language" do
|
|
98
|
+
|
|
99
|
+
before do
|
|
100
|
+
validator.validate_each(
|
|
101
|
+
product,
|
|
102
|
+
:name,
|
|
103
|
+
{ "en" => "iPod Nano 8GB - Black", "de" => "" }
|
|
104
|
+
)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "adds errors" do
|
|
108
|
+
product.errors[:name].should eq(["can't be blank in de"])
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "when the value is empty for all language" do
|
|
113
|
+
|
|
114
|
+
before do
|
|
115
|
+
validator.validate_each(
|
|
116
|
+
product,
|
|
117
|
+
:name,
|
|
118
|
+
{ "en" => "", "de" => "" }
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "adds errors" do
|
|
123
|
+
product.errors[:name].should eq(["can't be blank in en", "can't be blank in de"])
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
context "when the field is aliased" do
|
|
129
|
+
|
|
130
|
+
context "when the aliased field name is validated" do
|
|
131
|
+
|
|
132
|
+
context "when the value is valid" do
|
|
133
|
+
|
|
134
|
+
before do
|
|
135
|
+
validator.validate_each(product, :sku, "12345")
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "adds no errors" do
|
|
139
|
+
product.errors[:sku].should be_empty
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "when the value is invalid" do
|
|
144
|
+
|
|
145
|
+
before do
|
|
146
|
+
validator.validate_each(product, :sku, nil)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "adds errors" do
|
|
150
|
+
product.errors[:sku].should eq(["can't be blank"])
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context "when the underlying field name is validated" do
|
|
156
|
+
|
|
157
|
+
context "when the value is valid" do
|
|
158
|
+
|
|
159
|
+
before do
|
|
160
|
+
validator.validate_each(product, :stock_keeping_unit, "12345")
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "adds no errors" do
|
|
164
|
+
product.errors[:stock_keeping_unit].should be_empty
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
context "when the value is invalid" do
|
|
169
|
+
|
|
170
|
+
before do
|
|
171
|
+
validator.validate_each(product, :stock_keeping_unit, nil)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "adds errors" do
|
|
175
|
+
product.errors[:stock_keeping_unit].should eq(["can't be blank"])
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "when the field is localized" do
|
|
181
|
+
|
|
182
|
+
context "when the localized value is valid" do
|
|
183
|
+
|
|
184
|
+
before do
|
|
185
|
+
validator.validate_each(product, :tagline, { "en" => "12345" })
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "adds no errors" do
|
|
189
|
+
product.errors[:tagline].should be_empty
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context "when one of the localized values is invalid" do
|
|
194
|
+
|
|
195
|
+
before do
|
|
196
|
+
validator.validate_each(
|
|
197
|
+
product,
|
|
198
|
+
:tagline, { "en" => "12345", "fr" => nil }
|
|
199
|
+
)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "adds errors" do
|
|
203
|
+
product.errors[:tagline].should eq(["can't be blank in fr"])
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
context "when validating a relation" do
|
|
211
|
+
|
|
212
|
+
context "when the relation is a has one" do
|
|
213
|
+
|
|
214
|
+
before do
|
|
215
|
+
Person.autosaved_relations.delete_one(:game)
|
|
216
|
+
Person.validates :game, presence: true
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
after do
|
|
220
|
+
Person.autosaved_relations.clear
|
|
221
|
+
Person.reset_callbacks(:save)
|
|
222
|
+
Person.reset_callbacks(:validate)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
context "when the relation is new" do
|
|
226
|
+
|
|
227
|
+
let(:person) do
|
|
228
|
+
Person.new
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
context "when the base is valid" do
|
|
232
|
+
|
|
233
|
+
let!(:game) do
|
|
234
|
+
person.build_game
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "when saving the base" do
|
|
238
|
+
|
|
239
|
+
before do
|
|
240
|
+
person.save
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "saves the relation" do
|
|
244
|
+
game.reload.should eq(game)
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
context "when the relation is a has one and autosave is false" do
|
|
252
|
+
|
|
253
|
+
before do
|
|
254
|
+
Person.relations["game"][:autosave] = false
|
|
255
|
+
Person.validates :game, presence: true
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
after do
|
|
259
|
+
Person.reset_callbacks(:validate)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "does not change autosave on the relation" do
|
|
263
|
+
Person.relations["game"][:autosave].should be_false
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it "does not add any autosaved relations" do
|
|
267
|
+
Person.autosaved_relations.should be_empty
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
context "when the relation is new" do
|
|
271
|
+
|
|
272
|
+
let(:person) do
|
|
273
|
+
Person.new
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
context "when the base is valid" do
|
|
277
|
+
|
|
278
|
+
let!(:game) do
|
|
279
|
+
person.build_game
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
context "when saving the base" do
|
|
283
|
+
|
|
284
|
+
before do
|
|
285
|
+
person.save
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
it "does not save the relation" do
|
|
289
|
+
expect { game.reload }.to raise_error
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
context "when the relation is a belongs to" do
|
|
297
|
+
|
|
298
|
+
let(:product) do
|
|
299
|
+
Product.create(name: "testing")
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context "when the relation is present" do
|
|
303
|
+
|
|
304
|
+
let(:purchase) do
|
|
305
|
+
Purchase.create
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
let(:line_item) do
|
|
309
|
+
purchase.line_items.create(product: product)
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
context "when the foreign key is nil" do
|
|
313
|
+
|
|
314
|
+
before do
|
|
315
|
+
line_item.attributes["product_id"] = nil
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
it "is not valid" do
|
|
319
|
+
line_item.should_not be_valid
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
context "when the relation is a many to many" do
|
|
326
|
+
|
|
327
|
+
before do
|
|
328
|
+
Person.validates :houses, presence: true
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
after do
|
|
332
|
+
Person.autosaved_relations.clear
|
|
333
|
+
Person.reset_callbacks(:save)
|
|
334
|
+
Person.reset_callbacks(:validate)
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context "when the relation has documents" do
|
|
338
|
+
|
|
339
|
+
let!(:house) do
|
|
340
|
+
House.create
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
let!(:person) do
|
|
344
|
+
Person.create(houses: [ house ])
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
context "when the relation is loaded from the db" do
|
|
348
|
+
|
|
349
|
+
let(:loaded) do
|
|
350
|
+
Person.find(person.id)
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
it "is valid" do
|
|
354
|
+
loaded.should be_valid
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
context "when the relation is in memory" do
|
|
359
|
+
|
|
360
|
+
it "is valid" do
|
|
361
|
+
person.should be_valid
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
context "when validating a localized field" do
|
|
369
|
+
|
|
370
|
+
context "when any translation is blank" do
|
|
371
|
+
|
|
372
|
+
let(:product) do
|
|
373
|
+
Product.new
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
before do
|
|
377
|
+
product.name_translations = { "de" => "" }
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it "is not a valid document" do
|
|
381
|
+
product.should_not be_valid
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it "includes the proper errors" do
|
|
385
|
+
product.valid?
|
|
386
|
+
product.errors[:name].should_not be_empty
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
context "when any translation is nil" do
|
|
391
|
+
|
|
392
|
+
let(:product) do
|
|
393
|
+
Product.new
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
before do
|
|
397
|
+
product.name_translations = { "de" => nil }
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
it "is not a valid document" do
|
|
401
|
+
product.should_not be_valid
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
it "includes the proper errors" do
|
|
405
|
+
product.valid?
|
|
406
|
+
product.errors[:name].should_not be_empty
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
context "when the entire field is nil" do
|
|
411
|
+
|
|
412
|
+
let(:product) do
|
|
413
|
+
Product.new
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
before do
|
|
417
|
+
product.name_translations = nil
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
it "is not a valid document" do
|
|
421
|
+
product.should_not be_valid
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
it "includes the proper errors" do
|
|
425
|
+
product.valid?
|
|
426
|
+
product.errors[:name].should_not be_empty
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
context "when the entire field is empty" do
|
|
431
|
+
|
|
432
|
+
let(:product) do
|
|
433
|
+
Product.new
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
before do
|
|
437
|
+
product.name_translations = {}
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
it "is not a valid document" do
|
|
441
|
+
product.should_not be_valid
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
it "includes the proper errors" do
|
|
445
|
+
product.valid?
|
|
446
|
+
product.errors[:name].should_not be_empty
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
context "when the translations are present" do
|
|
451
|
+
|
|
452
|
+
let(:product) do
|
|
453
|
+
Product.new
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
before do
|
|
457
|
+
product.name_translations = { "en" => "test" }
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
it "is a valid document" do
|
|
461
|
+
product.should be_valid
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
context "when presence_of array attribute is updated and saved" do
|
|
467
|
+
|
|
468
|
+
let(:updated_products) do
|
|
469
|
+
[ "Laptop", "Tablet", "Smartphone", "Desktop" ]
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
let(:manufacturer) do
|
|
473
|
+
Manufacturer.create!(products: [ "Laptop", "Tablet" ])
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
before do
|
|
477
|
+
manufacturer.products = updated_products
|
|
478
|
+
manufacturer.save!
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
let(:reloaded) do
|
|
482
|
+
Manufacturer.find(manufacturer.id)
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
it "persists the changes" do
|
|
486
|
+
reloaded.products.should eq(updated_products)
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
context "when an array attribute has been updated" do
|
|
491
|
+
|
|
492
|
+
let(:updated_products) do
|
|
493
|
+
[ "Laptop", "Tablet", "Smartphone", "Desktop" ]
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
let(:manufacturer) do
|
|
497
|
+
Manufacturer.create!(products: [ "Laptop", "Tablet" ])
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
context "when retrieved, flattened and iterated" do
|
|
501
|
+
|
|
502
|
+
before do
|
|
503
|
+
manufacturer.products = updated_products
|
|
504
|
+
attrs = manufacturer.attributes
|
|
505
|
+
[attrs].flatten.each { |attr| }
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
it "does not destroy the models change list" do
|
|
509
|
+
manufacturer.changes.should_not be_empty
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
it "maintains the list of changes" do
|
|
513
|
+
manufacturer.changes.should eq({
|
|
514
|
+
"products" => [
|
|
515
|
+
[ "Laptop", "Tablet" ],
|
|
516
|
+
[ "Laptop", "Tablet", "Smartphone", "Desktop" ]
|
|
517
|
+
]
|
|
518
|
+
})
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
context "when validating a boolean false value" do
|
|
524
|
+
|
|
525
|
+
let(:template) do
|
|
526
|
+
Template.new
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
context "when the value is false" do
|
|
530
|
+
|
|
531
|
+
it "is a valid document" do
|
|
532
|
+
template.should be_valid
|
|
533
|
+
end
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
context "when the value is true" do
|
|
537
|
+
|
|
538
|
+
before do
|
|
539
|
+
template.active = true
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
it "is a valid document" do
|
|
543
|
+
template.should be_valid
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
context "when describing validation on the instance level" do
|
|
549
|
+
|
|
550
|
+
let!(:dictionary) do
|
|
551
|
+
Dictionary.create!(name: "en")
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
let(:validators) do
|
|
555
|
+
dictionary.validates_presence_of :name
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
it "adds the validation only to the instance" do
|
|
559
|
+
validators.should eq([ described_class ])
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
context "when validating an array" do
|
|
564
|
+
|
|
565
|
+
before do
|
|
566
|
+
Person.validates :aliases, presence: { allow_blank: false }
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
after do
|
|
570
|
+
Person.reset_callbacks(:validate)
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
context "when allow blank is false" do
|
|
574
|
+
|
|
575
|
+
let(:person) do
|
|
576
|
+
Person.new
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
context "when the array is empty" do
|
|
580
|
+
|
|
581
|
+
before do
|
|
582
|
+
person.array = []
|
|
583
|
+
person.valid?
|
|
584
|
+
end
|
|
585
|
+
|
|
586
|
+
it "adds the errors to the document" do
|
|
587
|
+
person.errors[:aliases].should_not be_empty
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
end
|
|
591
|
+
end
|
|
592
|
+
end
|