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,309 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Validations do
|
|
4
|
+
|
|
5
|
+
let(:account) do
|
|
6
|
+
Account.new(name: "Testing a really long name.")
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "#read_attribute_for_validation" do
|
|
10
|
+
|
|
11
|
+
let(:person) do
|
|
12
|
+
Person.new(title: "Mr")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let!(:address) do
|
|
16
|
+
person.addresses.build(street: "Wienerstr")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "when reading a field" do
|
|
20
|
+
|
|
21
|
+
let(:value) do
|
|
22
|
+
person.read_attribute_for_validation(:title)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "returns the value" do
|
|
26
|
+
value.should eq("Mr")
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when reading a relation" do
|
|
31
|
+
|
|
32
|
+
let(:value) do
|
|
33
|
+
person.read_attribute_for_validation(:addresses)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
let(:documents) do
|
|
37
|
+
Mongoid::Relations::Targets::Enumerable.new([ address ])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
before do
|
|
41
|
+
person.instance_variable_set(:@addresses, documents)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "returns the value" do
|
|
45
|
+
value.should eq([ address ])
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "when validating a non field" do
|
|
50
|
+
|
|
51
|
+
let(:princess) do
|
|
52
|
+
Princess.new
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
let(:value) do
|
|
56
|
+
princess.read_attribute_for_validation(:color)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "does not error on the read" do
|
|
60
|
+
value.should be_empty
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "#valid?" do
|
|
66
|
+
|
|
67
|
+
context "when provided a context" do
|
|
68
|
+
|
|
69
|
+
it "uses the provided context" do
|
|
70
|
+
account.should be_valid(:update)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "when not provided a context" do
|
|
75
|
+
|
|
76
|
+
context "when the document is new" do
|
|
77
|
+
|
|
78
|
+
it "defaults the context to :create" do
|
|
79
|
+
account.should_not be_valid
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context "when the document is persisted" do
|
|
84
|
+
|
|
85
|
+
before do
|
|
86
|
+
account.name = "Testing"
|
|
87
|
+
account.save
|
|
88
|
+
account.name = "Testing a really long name."
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "defaults the context to :update" do
|
|
92
|
+
account.should be_valid
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
context "when the document is fresh from the database" do
|
|
98
|
+
|
|
99
|
+
let!(:pizza) do
|
|
100
|
+
Pizza.new(name: "chicago")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
before do
|
|
104
|
+
pizza.build_topping(name: "cheese")
|
|
105
|
+
pizza.save
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
let(:from_db) do
|
|
109
|
+
Pizza.first
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "loads the required association from the db" do
|
|
113
|
+
from_db.should be_valid
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
context "when validating associated" do
|
|
118
|
+
|
|
119
|
+
context "when the child validates the parent" do
|
|
120
|
+
|
|
121
|
+
let(:movie) do
|
|
122
|
+
Movie.new
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context "when the child is invalid" do
|
|
126
|
+
|
|
127
|
+
let(:rating) do
|
|
128
|
+
Rating.new(value: 1000)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
before do
|
|
132
|
+
movie.ratings << rating
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
context "when validating once" do
|
|
136
|
+
|
|
137
|
+
it "returns false" do
|
|
138
|
+
movie.should_not be_valid
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "adds the errors to the document" do
|
|
142
|
+
movie.valid?
|
|
143
|
+
movie.errors[:ratings].should eq([ "is invalid" ])
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
context "when validating multiple times" do
|
|
148
|
+
|
|
149
|
+
it "returns false every time" do
|
|
150
|
+
movie.should_not be_valid
|
|
151
|
+
movie.should_not be_valid
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
context "when the child does not validate the parent" do
|
|
158
|
+
|
|
159
|
+
before(:all) do
|
|
160
|
+
Person.validates_associated(:services)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
after(:all) do
|
|
164
|
+
Person.reset_callbacks(:validate)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
let(:person) do
|
|
168
|
+
Person.new
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "when the child is invalid" do
|
|
172
|
+
|
|
173
|
+
let(:service) do
|
|
174
|
+
Service.new(sid: "invalid")
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
before do
|
|
178
|
+
person.services << service
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "when validating once" do
|
|
182
|
+
|
|
183
|
+
it "returns false" do
|
|
184
|
+
person.should_not be_valid
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "adds the errors to the document" do
|
|
188
|
+
person.valid?
|
|
189
|
+
person.errors[:services].should eq([ "is invalid" ])
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
context "when validating multiple times" do
|
|
194
|
+
|
|
195
|
+
it "returns false every time" do
|
|
196
|
+
person.should_not be_valid
|
|
197
|
+
person.should_not be_valid
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
describe ".validates_associated" do
|
|
206
|
+
|
|
207
|
+
let(:klass) do
|
|
208
|
+
Class.new do
|
|
209
|
+
include Mongoid::Document
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
context "when adding via the traditional macro" do
|
|
214
|
+
|
|
215
|
+
before do
|
|
216
|
+
klass.validates_associated(:name)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it "adds the validator" do
|
|
220
|
+
klass.validators.first.should be_a(
|
|
221
|
+
Mongoid::Validations::AssociatedValidator
|
|
222
|
+
)
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
context "when adding via the new syntax" do
|
|
227
|
+
|
|
228
|
+
before do
|
|
229
|
+
klass.validates(:name, associated: true)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "adds the validator" do
|
|
233
|
+
klass.validators.first.should be_a(
|
|
234
|
+
Mongoid::Validations::AssociatedValidator
|
|
235
|
+
)
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
describe ".validates_uniqueness_of" do
|
|
241
|
+
|
|
242
|
+
let(:klass) do
|
|
243
|
+
Class.new do
|
|
244
|
+
include Mongoid::Document
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
context "when adding via the traditional macro" do
|
|
249
|
+
|
|
250
|
+
before do
|
|
251
|
+
klass.validates_uniqueness_of(:name)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "adds the validator" do
|
|
255
|
+
klass.validators.first.should be_a(
|
|
256
|
+
Mongoid::Validations::UniquenessValidator
|
|
257
|
+
)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
context "when adding via the new syntax" do
|
|
262
|
+
|
|
263
|
+
before do
|
|
264
|
+
klass.validates(:name, uniqueness: true)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it "adds the validator" do
|
|
268
|
+
klass.validators.first.should be_a(
|
|
269
|
+
Mongoid::Validations::UniquenessValidator
|
|
270
|
+
)
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
describe ".validates_presence_of" do
|
|
276
|
+
|
|
277
|
+
let(:klass) do
|
|
278
|
+
Class.new do
|
|
279
|
+
include Mongoid::Document
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
context "when adding via the traditional macro" do
|
|
284
|
+
|
|
285
|
+
before do
|
|
286
|
+
klass.validates_presence_of(:name)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "adds the validator" do
|
|
290
|
+
klass.validators.first.should be_a(
|
|
291
|
+
Mongoid::Validations::PresenceValidator
|
|
292
|
+
)
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
context "when adding via the new syntax" do
|
|
297
|
+
|
|
298
|
+
before do
|
|
299
|
+
klass.validates(:name, presence: true)
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
it "adds the validator" do
|
|
303
|
+
klass.validators.first.should be_a(
|
|
304
|
+
Mongoid::Validations::PresenceValidator
|
|
305
|
+
)
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Mongoid::Versioning do
|
|
4
|
+
|
|
5
|
+
describe ".max_versions" do
|
|
6
|
+
|
|
7
|
+
context "when provided an integer" do
|
|
8
|
+
|
|
9
|
+
before do
|
|
10
|
+
WikiPage.max_versions(10)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after do
|
|
14
|
+
WikiPage.max_versions(5)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "sets the class version max" do
|
|
18
|
+
WikiPage.version_max.should eq(10)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when provided a string" do
|
|
23
|
+
|
|
24
|
+
before do
|
|
25
|
+
WikiPage.max_versions("10")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
after do
|
|
29
|
+
WikiPage.max_versions(5)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "sets the class version max" do
|
|
33
|
+
WikiPage.version_max.should eq(10)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "#version" do
|
|
39
|
+
|
|
40
|
+
context "when there is no default scope" do
|
|
41
|
+
|
|
42
|
+
context "when the document is new" do
|
|
43
|
+
|
|
44
|
+
it "returns 1" do
|
|
45
|
+
WikiPage.new.version.should eq(1)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "when the document is persisted once" do
|
|
50
|
+
|
|
51
|
+
let(:page) do
|
|
52
|
+
WikiPage.create(title: "1")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "returns 1" do
|
|
56
|
+
page.version.should eq(1)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "when the document is persisted more than once" do
|
|
61
|
+
|
|
62
|
+
let(:page) do
|
|
63
|
+
WikiPage.create(title: "1")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
before do
|
|
67
|
+
3.times { |n| page.update_attribute(:title, "#{n}") }
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "returns the number of versions" do
|
|
71
|
+
page.version.should eq(4)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context "when maximum versions is defined" do
|
|
76
|
+
|
|
77
|
+
let(:page) do
|
|
78
|
+
WikiPage.create(title: "1")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context "when saving over the max versions limit" do
|
|
82
|
+
|
|
83
|
+
before do
|
|
84
|
+
10.times { |n| page.update_attribute(:title, "#{n}") }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "returns the number of versions" do
|
|
88
|
+
page.version.should eq(11)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
context "when performing versionless saves" do
|
|
94
|
+
|
|
95
|
+
let(:page) do
|
|
96
|
+
WikiPage.create(title: "1")
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
before do
|
|
100
|
+
10.times do |n|
|
|
101
|
+
page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "does not increment the version number" do
|
|
106
|
+
page.version.should eq(1)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
context "when there is a default scope" do
|
|
112
|
+
|
|
113
|
+
before :all do
|
|
114
|
+
class WikiPage
|
|
115
|
+
default_scope where(author: "Jim")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
after :all do
|
|
120
|
+
WikiPage.default_scoping = nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context "when the document is new" do
|
|
124
|
+
|
|
125
|
+
it "returns 1" do
|
|
126
|
+
WikiPage.new.version.should eq(1)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
context "when the document is persisted once" do
|
|
131
|
+
|
|
132
|
+
let(:page) do
|
|
133
|
+
WikiPage.create(title: "1")
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "returns 1" do
|
|
137
|
+
page.version.should eq(1)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context "when the document is persisted more than once" do
|
|
142
|
+
|
|
143
|
+
let(:page) do
|
|
144
|
+
WikiPage.create(title: "1")
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
before do
|
|
148
|
+
3.times { |n| page.update_attribute(:title, "#{n}") }
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "returns the number of versions" do
|
|
152
|
+
page.version.should eq(4)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context "when maximum versions is defined" do
|
|
157
|
+
|
|
158
|
+
let(:page) do
|
|
159
|
+
WikiPage.create(title: "1")
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "when saving over the max versions limit" do
|
|
163
|
+
|
|
164
|
+
before do
|
|
165
|
+
10.times { |n| page.update_attribute(:title, "#{n}") }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it "returns the number of versions" do
|
|
169
|
+
page.version.should eq(11)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context "when performing versionless saves" do
|
|
175
|
+
|
|
176
|
+
let(:page) do
|
|
177
|
+
WikiPage.create(title: "1")
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
before do
|
|
181
|
+
10.times do |n|
|
|
182
|
+
page.versionless { |doc| doc.update_attribute(:title, "#{n}") }
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it "does not increment the version number" do
|
|
187
|
+
page.version.should eq(1)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "when not using the default database" do
|
|
193
|
+
|
|
194
|
+
let(:title) { "my new wiki" }
|
|
195
|
+
|
|
196
|
+
let!(:page) do
|
|
197
|
+
WikiPage.with(database: "mongoid_test_alt").create!(description: "1",title: title)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context "when the document is persisted once" do
|
|
201
|
+
|
|
202
|
+
it "returns 1" do
|
|
203
|
+
page.version.should eq(1)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "does not persist to default database" do
|
|
207
|
+
expect {
|
|
208
|
+
WikiPage.find_by(title: title)
|
|
209
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
it "persists to specified database" do
|
|
213
|
+
WikiPage.with(database: "mongoid_test_alt").find_by(title: title).should_not be_nil
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
context "when the document is persisted more than once" do
|
|
218
|
+
|
|
219
|
+
before do
|
|
220
|
+
3.times { |n| page.with(database: "mongoid_test_alt").update_attribute(:description, "#{n}") }
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "returns the number of versions" do
|
|
224
|
+
page.version.should eq(4)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "persists to specified database" do
|
|
228
|
+
WikiPage.with(database: "mongoid_test_alt").find_by(:title => title).should_not be_nil
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it "persists the versions to specified database" do
|
|
232
|
+
WikiPage.with(database: "mongoid_test_alt").find_by(:title => title).version.should eq(4)
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
describe "#versionless" do
|
|
239
|
+
|
|
240
|
+
let(:page) do
|
|
241
|
+
WikiPage.new(created_at: Time.now.utc)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context "when executing the block" do
|
|
245
|
+
|
|
246
|
+
it "sets versionless to true" do
|
|
247
|
+
page.versionless do |doc|
|
|
248
|
+
doc.should be_versionless
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
context "when the block finishes" do
|
|
254
|
+
|
|
255
|
+
it "sets versionless to false" do
|
|
256
|
+
page.versionless
|
|
257
|
+
page.should_not be_versionless
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
describe "#versions" do
|
|
263
|
+
|
|
264
|
+
let(:page) do
|
|
265
|
+
WikiPage.create(title: "1", description: "test") do |wiki|
|
|
266
|
+
wiki.author = "woodchuck"
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
context "when saving the document " do
|
|
271
|
+
|
|
272
|
+
context "when the document has changed" do
|
|
273
|
+
|
|
274
|
+
before do
|
|
275
|
+
page.update_attribute(:title, "2")
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
let(:version) do
|
|
279
|
+
page.versions.first
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it "creates a new version" do
|
|
283
|
+
version.title.should eq("1")
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "properly versions the localized fields" do
|
|
287
|
+
version.description.should eq("test")
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
it "only creates 1 new version" do
|
|
291
|
+
page.versions.count.should eq(1)
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
it "does not version the _id" do
|
|
295
|
+
version._id.should be_nil
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
it "does version the updated_at timestamp" do
|
|
299
|
+
version.updated_at.should_not be_nil
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
context "when only updated_at was changed" do
|
|
303
|
+
|
|
304
|
+
before do
|
|
305
|
+
page.update_attributes(updated_at: Time.now)
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it "does not generate another version" do
|
|
309
|
+
page.versions.count.should eq(1)
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
it "does not embed versions within versions" do
|
|
314
|
+
version.versions.should be_empty
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
it "versions protected fields" do
|
|
318
|
+
version.author.should eq("woodchuck")
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
context "when saving multiple times" do
|
|
322
|
+
|
|
323
|
+
before do
|
|
324
|
+
page.update_attribute(:title, "3")
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
it "does not embed versions within versions" do
|
|
328
|
+
version.versions.should be_empty
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it "does not embed versions multiple levels deep" do
|
|
332
|
+
page.versions.last.versions.should be_empty
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context "when the document has not changed" do
|
|
338
|
+
|
|
339
|
+
before do
|
|
340
|
+
page.save
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
let(:version) do
|
|
344
|
+
page.versions.first
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
it "does not create a new version" do
|
|
348
|
+
version.should be_nil
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
context "when saving over the number of maximum versions" do
|
|
353
|
+
|
|
354
|
+
context "when the document is paranoid" do
|
|
355
|
+
|
|
356
|
+
let!(:post) do
|
|
357
|
+
ParanoidPost.create(title: "test")
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
before do
|
|
361
|
+
3.times do |n|
|
|
362
|
+
post.update_attribute(:title, "#{n}")
|
|
363
|
+
end
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it "only versions the maximum amount" do
|
|
367
|
+
post.versions.target.size.should eq(2)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
it "persists the changes" do
|
|
371
|
+
post.reload.versions.target.size.should eq(2)
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
context "when saving in succession" do
|
|
376
|
+
|
|
377
|
+
before do
|
|
378
|
+
10.times do |n|
|
|
379
|
+
page.update_attribute(:title, "#{n}")
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
let(:versions) do
|
|
384
|
+
page.versions
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
it "only versions the maximum amount" do
|
|
388
|
+
versions.count.should eq(5)
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
it "shifts the versions in order" do
|
|
392
|
+
versions.last.title.should eq("8")
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
it "persists the version shifts" do
|
|
396
|
+
page.reload.versions.last.title.should eq("8")
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
context "when saving in batches" do
|
|
401
|
+
|
|
402
|
+
before do
|
|
403
|
+
2.times do
|
|
404
|
+
5.times do |n|
|
|
405
|
+
WikiPage.find(page.id).update_attributes(title: "#{n}")
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
let(:from_db) do
|
|
411
|
+
WikiPage.find(page.id)
|
|
412
|
+
end
|
|
413
|
+
|
|
414
|
+
let(:versions) do
|
|
415
|
+
from_db.versions
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
it "only versions the maximum amount" do
|
|
419
|
+
versions.count.should eq(5)
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
context "when persisting versionless" do
|
|
425
|
+
|
|
426
|
+
before do
|
|
427
|
+
page.versionless { |doc| doc.update_attribute(:title, "2") }
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it "does not version the document" do
|
|
431
|
+
page.versions.count.should eq(0)
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
context "when deleting versions" do
|
|
436
|
+
|
|
437
|
+
let(:comment) do
|
|
438
|
+
Comment.new(title: "Don't delete me!")
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
let!(:orphaned) do
|
|
442
|
+
Comment.create(title: "Annie")
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
before do
|
|
446
|
+
page.comments << comment
|
|
447
|
+
page.update_attribute(:title, "5")
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
context "when the version had a dependent relation" do
|
|
451
|
+
|
|
452
|
+
before do
|
|
453
|
+
page.versions.delete_all
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
let(:from_db) do
|
|
457
|
+
Comment.find(comment.id)
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
it "does not perform dependent cascading" do
|
|
461
|
+
from_db.should eq(comment)
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
it "does not delete related orphans" do
|
|
465
|
+
Comment.find(orphaned.id).should eq(orphaned)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
it "deletes the version" do
|
|
469
|
+
page.versions.should be_empty
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
it "persists the deletion" do
|
|
473
|
+
page.reload.versions.should be_empty
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
it "retains the root relation" do
|
|
477
|
+
page.reload.comments.should eq([ comment ])
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
end
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
context "when appending a self referencing document with versions" do
|
|
485
|
+
|
|
486
|
+
let(:page) do
|
|
487
|
+
WikiPage.create(title: "1")
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
let(:child) do
|
|
491
|
+
WikiPage.new
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
before do
|
|
495
|
+
page.child_pages << child
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
it "allows the document to be added" do
|
|
499
|
+
page.child_pages.should eq([ child ])
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
it "persists the changes" do
|
|
503
|
+
page.reload.child_pages.should eq([ child ])
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
context "when the identity map is enabled" do
|
|
508
|
+
|
|
509
|
+
before do
|
|
510
|
+
Mongoid.identity_map_enabled = true
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
after do
|
|
514
|
+
Mongoid.identity_map_enabled = false
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
context "when updating a loaded attribute" do
|
|
518
|
+
|
|
519
|
+
let!(:page) do
|
|
520
|
+
WikiPage.create(title: "first")
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
let!(:loaded) do
|
|
524
|
+
WikiPage.find(page.id)
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
before do
|
|
528
|
+
loaded.update_attribute(:title, "revised")
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
let(:reloaded) do
|
|
532
|
+
WikiPage.find(page.id)
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
it "returns the revised im memory document" do
|
|
536
|
+
reloaded.title.should eq("revised")
|
|
537
|
+
end
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
end
|