ibm_db 3.0.0-x86-mingw32 → 3.0.1-x86-mingw32
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/CHANGES +4 -0
- data/MANIFEST +14 -14
- data/README +225 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/OLD/extconf.rb +264 -0
- data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
- data/ext/extconf.rb +291 -264
- data/ext/ibm_db.c +2 -2
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4 -4
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +115 -115
- data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
- data/test/assets/example.log +1 -0
- data/test/assets/flowers.jpg +0 -0
- data/test/assets/test.txt +1 -0
- data/test/cases/adapter_test.rb +261 -207
- data/test/cases/aggregations_test.rb +158 -0
- data/test/cases/ar_schema_test.rb +161 -0
- data/test/cases/associations/association_scope_test.rb +21 -0
- data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
- data/test/cases/associations/callbacks_test.rb +192 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
- data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
- data/test/cases/associations/eager_singularization_test.rb +148 -0
- data/test/cases/associations/eager_test.rb +1411 -0
- data/test/cases/associations/extension_test.rb +82 -0
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
- data/test/cases/associations/has_many_associations_test.rb +2162 -0
- data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
- data/test/cases/associations/has_one_associations_test.rb +610 -0
- data/test/cases/associations/has_one_through_associations_test.rb +380 -0
- data/test/cases/associations/inner_join_association_test.rb +139 -0
- data/test/cases/associations/inverse_associations_test.rb +693 -0
- data/test/cases/associations/join_model_test.rb +754 -743
- data/test/cases/associations/nested_through_associations_test.rb +579 -0
- data/test/cases/associations/required_test.rb +82 -0
- data/test/cases/associations_test.rb +380 -0
- data/test/cases/attribute_decorators_test.rb +125 -0
- data/test/cases/attribute_methods/read_test.rb +60 -0
- data/test/cases/attribute_methods/serialization_test.rb +29 -0
- data/test/cases/attribute_methods_test.rb +952 -822
- data/test/cases/attribute_set_test.rb +200 -0
- data/test/cases/attribute_test.rb +180 -0
- data/test/cases/attributes_test.rb +136 -0
- data/test/cases/autosave_association_test.rb +1595 -0
- data/test/cases/base_test.rb +1638 -2133
- data/test/cases/batches_test.rb +212 -0
- data/test/cases/binary_test.rb +52 -0
- data/test/cases/bind_parameter_test.rb +100 -0
- data/test/cases/calculations_test.rb +646 -482
- data/test/cases/callbacks_test.rb +543 -0
- data/test/cases/clone_test.rb +40 -0
- data/test/cases/coders/yaml_column_test.rb +63 -0
- data/test/cases/column_alias_test.rb +17 -0
- data/test/cases/column_definition_test.rb +123 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
- data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
- data/test/cases/connection_adapters/quoting_test.rb +13 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
- data/test/cases/connection_management_test.rb +122 -0
- data/test/cases/connection_pool_test.rb +346 -0
- data/test/cases/connection_specification/resolver_test.rb +116 -0
- data/test/cases/core_test.rb +112 -0
- data/test/cases/counter_cache_test.rb +209 -0
- data/test/cases/custom_locking_test.rb +17 -0
- data/test/cases/database_statements_test.rb +19 -0
- data/test/cases/date_time_test.rb +61 -0
- data/test/cases/defaults_test.rb +223 -0
- data/test/cases/dirty_test.rb +775 -0
- data/test/cases/disconnected_test.rb +28 -0
- data/test/cases/dup_test.rb +157 -0
- data/test/cases/enum_test.rb +290 -0
- data/test/cases/explain_subscriber_test.rb +64 -0
- data/test/cases/explain_test.rb +76 -0
- data/test/cases/finder_respond_to_test.rb +60 -0
- data/test/cases/finder_test.rb +1166 -0
- data/test/cases/fixture_set/file_test.rb +138 -0
- data/test/cases/fixtures_test.rb +897 -0
- data/test/cases/forbidden_attributes_protection_test.rb +99 -0
- data/test/cases/habtm_destroy_order_test.rb +61 -0
- data/test/cases/helper.rb +210 -0
- data/test/cases/hot_compatibility_test.rb +54 -0
- data/test/cases/i18n_test.rb +45 -0
- data/test/cases/inheritance_test.rb +375 -0
- data/test/cases/integration_test.rb +139 -0
- data/test/cases/invalid_connection_test.rb +22 -0
- data/test/cases/invalid_date_test.rb +32 -0
- data/test/cases/invertible_migration_test.rb +295 -0
- data/test/cases/json_serialization_test.rb +302 -0
- data/test/cases/locking_test.rb +477 -0
- data/test/cases/log_subscriber_test.rb +136 -0
- data/test/cases/migration/change_schema_test - Copy.rb +448 -0
- data/test/cases/migration/change_schema_test.rb +472 -0
- data/test/cases/migration/change_table_test.rb +224 -0
- data/test/cases/migration/column_attributes_test.rb +192 -0
- data/test/cases/migration/column_positioning_test.rb +56 -0
- data/test/cases/migration/columns_test.rb +304 -0
- data/test/cases/migration/command_recorder_test.rb +305 -0
- data/test/cases/migration/create_join_table_test.rb +148 -0
- data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
- data/test/cases/migration/foreign_key_test.rb +360 -0
- data/test/cases/migration/helper.rb +39 -0
- data/test/cases/migration/index_test.rb +216 -0
- data/test/cases/migration/logger_test.rb +36 -0
- data/test/cases/migration/pending_migrations_test.rb +53 -0
- data/test/cases/migration/references_foreign_key_test.rb +214 -0
- data/test/cases/migration/references_index_test.rb +101 -0
- data/test/cases/migration/references_statements_test.rb +116 -0
- data/test/cases/migration/rename_table_test.rb +93 -0
- data/test/cases/migration/table_and_index_test.rb +24 -0
- data/test/cases/migration_test.rb +959 -2408
- data/test/cases/migrator_test.rb +388 -0
- data/test/cases/mixin_test.rb +70 -0
- data/test/cases/modules_test.rb +173 -0
- data/test/cases/multiparameter_attributes_test.rb +350 -0
- data/test/cases/multiple_db_test.rb +115 -0
- data/test/cases/nested_attributes_test.rb +1057 -0
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
- data/test/cases/persistence_test.rb +909 -642
- data/test/cases/pooled_connections_test.rb +81 -0
- data/test/cases/primary_keys_test.rb +237 -0
- data/test/cases/query_cache_test.rb +326 -257
- data/test/cases/quoting_test.rb +156 -0
- data/test/cases/readonly_test.rb +118 -0
- data/test/cases/reaper_test.rb +85 -0
- data/test/cases/reflection_test.rb +454 -0
- data/test/cases/relation/delegation_test.rb +68 -0
- data/test/cases/relation/merging_test.rb +161 -0
- data/test/cases/relation/mutation_test.rb +165 -0
- data/test/cases/relation/predicate_builder_test.rb +14 -0
- data/test/cases/relation/where_chain_test.rb +181 -0
- data/test/cases/relation/where_test.rb +300 -0
- data/test/cases/relation/where_test2.rb +36 -0
- data/test/cases/relation_test.rb +297 -0
- data/test/cases/relations_test.rb +1815 -1182
- data/test/cases/reload_models_test.rb +22 -0
- data/test/cases/result_test.rb +80 -0
- data/test/cases/sanitize_test.rb +83 -0
- data/test/cases/schema_dumper_test.rb +463 -256
- data/test/cases/scoping/default_scoping_test.rb +454 -0
- data/test/cases/scoping/named_scoping_test.rb +524 -0
- data/test/cases/scoping/relation_scoping_test.rb +357 -0
- data/test/cases/serialization_test.rb +104 -0
- data/test/cases/serialized_attribute_test.rb +277 -0
- data/test/cases/statement_cache_test.rb +98 -0
- data/test/cases/store_test.rb +194 -0
- data/test/cases/tasks/database_tasks_test.rb +396 -0
- data/test/cases/tasks/mysql_rake_test.rb +311 -0
- data/test/cases/tasks/postgresql_rake_test.rb +245 -0
- data/test/cases/tasks/sqlite_rake_test.rb +193 -0
- data/test/cases/test_case.rb +123 -0
- data/test/cases/timestamp_test.rb +468 -0
- data/test/cases/transaction_callbacks_test.rb +452 -300
- data/test/cases/transaction_isolation_test.rb +106 -0
- data/test/cases/transactions_test.rb +817 -0
- data/test/cases/type/decimal_test.rb +51 -0
- data/test/cases/type/integer_test.rb +121 -0
- data/test/cases/type/string_test.rb +36 -0
- data/test/cases/type/type_map_test.rb +177 -0
- data/test/cases/type/unsigned_integer_test.rb +18 -0
- data/test/cases/types_test.rb +141 -0
- data/test/cases/unconnected_test.rb +33 -0
- data/test/cases/validations/association_validation_test.rb +86 -0
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
- data/test/cases/validations/i18n_validation_test.rb +90 -0
- data/test/cases/validations/length_validation_test.rb +47 -0
- data/test/cases/validations/presence_validation_test.rb +68 -0
- data/test/cases/validations/uniqueness_validation_test.rb +434 -299
- data/test/cases/validations_repair_helper.rb +23 -0
- data/test/cases/validations_test.rb +165 -0
- data/test/cases/view_test.rb +113 -0
- data/test/cases/xml_serialization_test.rb +457 -408
- data/test/cases/yaml_serialization_test.rb +86 -0
- data/test/config.rb +5 -0
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +43 -43
- data/test/fixtures/accounts.yml +29 -0
- data/test/fixtures/admin/accounts.yml +2 -0
- data/test/fixtures/admin/randomly_named_a9.yml +7 -0
- data/test/fixtures/admin/randomly_named_b0.yml +7 -0
- data/test/fixtures/admin/users.yml +10 -0
- data/test/fixtures/all/admin +1 -0
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.yml +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +18 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +23 -0
- data/test/fixtures/binaries.yml +133 -0
- data/test/fixtures/books.yml +11 -0
- data/test/fixtures/bulbs.yml +5 -0
- data/test/fixtures/cars.yml +9 -0
- data/test/fixtures/categories.yml +19 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +31 -0
- data/test/fixtures/categorizations.yml +23 -0
- data/test/fixtures/clubs.yml +8 -0
- data/test/fixtures/collections.yml +3 -0
- data/test/fixtures/colleges.yml +3 -0
- data/test/fixtures/comments.yml +65 -0
- data/test/fixtures/companies.yml +67 -0
- data/test/fixtures/computers.yml +10 -0
- data/test/fixtures/courses.yml +8 -0
- data/test/fixtures/customers.yml +26 -0
- data/test/fixtures/dashboards.yml +6 -0
- data/test/fixtures/developers.yml +22 -0
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/dog_lovers.yml +7 -0
- data/test/fixtures/dogs.yml +4 -0
- data/test/fixtures/doubloons.yml +3 -0
- data/test/fixtures/edges.yml +5 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/essays.yml +6 -0
- data/test/fixtures/faces.yml +11 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/friendships.yml +4 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/interests.yml +33 -0
- data/test/fixtures/items.yml +3 -0
- data/test/fixtures/jobs.yml +7 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/mateys.yml +4 -0
- data/test/fixtures/member_details.yml +8 -0
- data/test/fixtures/member_types.yml +6 -0
- data/test/fixtures/members.yml +11 -0
- data/test/fixtures/memberships.yml +34 -0
- data/test/fixtures/men.yml +5 -0
- data/test/fixtures/minimalistics.yml +2 -0
- data/test/fixtures/minivans.yml +5 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixins.yml +29 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/csv/accounts.csv +1 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/organizations.yml +5 -0
- data/test/fixtures/other_topics.yml +42 -0
- data/test/fixtures/owners.yml +9 -0
- data/test/fixtures/parrots.yml +27 -0
- data/test/fixtures/parrots_pirates.yml +7 -0
- data/test/fixtures/people.yml +24 -0
- data/test/fixtures/peoples_treasures.yml +3 -0
- data/test/fixtures/pets.yml +19 -0
- data/test/fixtures/pirates.yml +12 -0
- data/test/fixtures/posts.yml +80 -0
- data/test/fixtures/price_estimates.yml +7 -0
- data/test/fixtures/products.yml +4 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/randomly_named_a9.yml +7 -0
- data/test/fixtures/ratings.yml +14 -0
- data/test/fixtures/readers.yml +11 -0
- data/test/fixtures/references.yml +17 -0
- data/test/fixtures/reserved_words/distinct.yml +5 -0
- data/test/fixtures/reserved_words/distinct_select.yml +11 -0
- data/test/fixtures/reserved_words/group.yml +14 -0
- data/test/fixtures/reserved_words/select.yml +8 -0
- data/test/fixtures/reserved_words/values.yml +7 -0
- data/test/fixtures/ships.yml +6 -0
- data/test/fixtures/speedometers.yml +8 -0
- data/test/fixtures/sponsors.yml +12 -0
- data/test/fixtures/string_key_objects.yml +7 -0
- data/test/fixtures/subscribers.yml +11 -0
- data/test/fixtures/subscriptions.yml +12 -0
- data/test/fixtures/taggings.yml +78 -0
- data/test/fixtures/tags.yml +11 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/teapots.yml +3 -0
- data/test/fixtures/to_be_linked/accounts.yml +2 -0
- data/test/fixtures/to_be_linked/users.yml +10 -0
- data/test/fixtures/topics.yml +49 -0
- data/test/fixtures/toys.yml +14 -0
- data/test/fixtures/traffic_lights.yml +10 -0
- data/test/fixtures/treasures.yml +10 -0
- data/test/fixtures/uuid_children.yml +3 -0
- data/test/fixtures/uuid_parents.yml +2 -0
- data/test/fixtures/variants.yml +4 -0
- data/test/fixtures/vegetables.yml +20 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures/warehouse_things.yml +3 -0
- data/test/fixtures/zines.yml +5 -0
- data/test/ibm_db_test.rb +24 -24
- data/test/migrations/10_urban/9_add_expressions.rb +11 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
- data/test/migrations/missing/1_people_have_last_names.rb +9 -0
- data/test/migrations/missing/3_we_need_reminders.rb +12 -0
- data/test/migrations/missing/4_innocent_jointable.rb +12 -0
- data/test/migrations/rename/1_we_need_things.rb +11 -0
- data/test/migrations/rename/2_rename_things.rb +9 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
- data/test/migrations/to_copy2/1_create_articles.rb +7 -0
- data/test/migrations/to_copy2/2_create_comments.rb +7 -0
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
- data/test/migrations/valid/2_we_need_reminders.rb +12 -0
- data/test/migrations/valid/3_innocent_jointable.rb +12 -0
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
- data/test/models/admin.rb +5 -0
- data/test/models/admin/account.rb +3 -0
- data/test/models/admin/randomly_named_c1.rb +3 -0
- data/test/models/admin/user.rb +40 -0
- data/test/models/aircraft.rb +4 -0
- data/test/models/arunit2_model.rb +3 -0
- data/test/models/author.rb +212 -0
- data/test/models/auto_id.rb +4 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +2 -0
- data/test/models/bird.rb +12 -0
- data/test/models/book.rb +18 -0
- data/test/models/boolean.rb +2 -0
- data/test/models/bulb.rb +51 -0
- data/test/models/cake_designer.rb +3 -0
- data/test/models/car.rb +26 -0
- data/test/models/carrier.rb +2 -0
- data/test/models/categorization.rb +19 -0
- data/test/models/category.rb +35 -0
- data/test/models/chef.rb +3 -0
- data/test/models/citation.rb +3 -0
- data/test/models/club.rb +23 -0
- data/test/models/college.rb +10 -0
- data/test/models/column.rb +3 -0
- data/test/models/column_name.rb +3 -0
- data/test/models/comment.rb +64 -0
- data/test/models/company.rb +225 -0
- data/test/models/company_in_module.rb +98 -0
- data/test/models/computer.rb +3 -0
- data/test/models/contact.rb +41 -0
- data/test/models/contract.rb +20 -0
- data/test/models/country.rb +7 -0
- data/test/models/course.rb +6 -0
- data/test/models/customer.rb +77 -0
- data/test/models/customer_carrier.rb +14 -0
- data/test/models/dashboard.rb +3 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +4 -0
- data/test/models/developer.rb +252 -0
- data/test/models/dog.rb +5 -0
- data/test/models/dog_lover.rb +5 -0
- data/test/models/doubloon.rb +12 -0
- data/test/models/drink_designer.rb +3 -0
- data/test/models/edge.rb +5 -0
- data/test/models/electron.rb +5 -0
- data/test/models/engine.rb +4 -0
- data/test/models/entrant.rb +3 -0
- data/test/models/essay.rb +5 -0
- data/test/models/event.rb +3 -0
- data/test/models/eye.rb +37 -0
- data/test/models/face.rb +9 -0
- data/test/models/friendship.rb +6 -0
- data/test/models/guid.rb +2 -0
- data/test/models/hotel.rb +6 -0
- data/test/models/image.rb +3 -0
- data/test/models/interest.rb +5 -0
- data/test/models/invoice.rb +4 -0
- data/test/models/item.rb +7 -0
- data/test/models/job.rb +7 -0
- data/test/models/joke.rb +7 -0
- data/test/models/keyboard.rb +3 -0
- data/test/models/legacy_thing.rb +3 -0
- data/test/models/lesson.rb +11 -0
- data/test/models/line_item.rb +3 -0
- data/test/models/liquid.rb +4 -0
- data/test/models/man.rb +11 -0
- data/test/models/matey.rb +4 -0
- data/test/models/member.rb +41 -0
- data/test/models/member_detail.rb +7 -0
- data/test/models/member_type.rb +3 -0
- data/test/models/membership.rb +35 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +9 -0
- data/test/models/mixed_case_monkey.rb +3 -0
- data/test/models/molecule.rb +6 -0
- data/test/models/movie.rb +5 -0
- data/test/models/order.rb +4 -0
- data/test/models/organization.rb +14 -0
- data/test/models/owner.rb +34 -0
- data/test/models/parrot.rb +29 -0
- data/test/models/person.rb +143 -0
- data/test/models/personal_legacy_thing.rb +4 -0
- data/test/models/pet.rb +15 -0
- data/test/models/pirate.rb +92 -0
- data/test/models/possession.rb +3 -0
- data/test/models/post.rb +264 -0
- data/test/models/price_estimate.rb +4 -0
- data/test/models/professor.rb +5 -0
- data/test/models/project.rb +29 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/publisher/article.rb +4 -0
- data/test/models/publisher/magazine.rb +3 -0
- data/test/models/randomly_named_c1.rb +3 -0
- data/test/models/rating.rb +4 -0
- data/test/models/reader.rb +23 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +22 -0
- data/test/models/reply.rb +61 -0
- data/test/models/ship.rb +33 -0
- data/test/models/ship_part.rb +8 -0
- data/test/models/shop.rb +17 -0
- data/test/models/shop_account.rb +6 -0
- data/test/models/speedometer.rb +6 -0
- data/test/models/sponsor.rb +7 -0
- data/test/models/string_key_object.rb +3 -0
- data/test/models/student.rb +4 -0
- data/test/models/subject.rb +16 -0
- data/test/models/subscriber.rb +8 -0
- data/test/models/subscription.rb +4 -0
- data/test/models/tag.rb +7 -0
- data/test/models/tagging.rb +13 -0
- data/test/models/task.rb +5 -0
- data/test/models/topic.rb +124 -0
- data/test/models/toy.rb +6 -0
- data/test/models/traffic_light.rb +4 -0
- data/test/models/treasure.rb +14 -0
- data/test/models/treaty.rb +7 -0
- data/test/models/tyre.rb +11 -0
- data/test/models/uuid_child.rb +3 -0
- data/test/models/uuid_parent.rb +3 -0
- data/test/models/vegetables.rb +24 -0
- data/test/models/vehicle.rb +7 -0
- data/test/models/vertex.rb +9 -0
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -0
- data/test/models/without_table.rb +3 -0
- data/test/models/zine.rb +3 -0
- data/test/schema/mysql2_specific_schema.rb +58 -0
- data/test/schema/mysql_specific_schema.rb +70 -0
- data/test/schema/oracle_specific_schema.rb +43 -0
- data/test/schema/postgresql_specific_schema.rb +202 -0
- data/test/schema/schema.rb +938 -751
- data/test/schema/sqlite_specific_schema.rb +22 -0
- data/test/support/config.rb +43 -0
- data/test/support/connection.rb +22 -0
- data/test/support/connection_helper.rb +14 -0
- data/test/support/ddl_helper.rb +8 -0
- data/test/support/schema_dumping_helper.rb +20 -0
- metadata +444 -18
@@ -0,0 +1,300 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/author"
|
3
|
+
require "models/binary"
|
4
|
+
require "models/cake_designer"
|
5
|
+
require "models/category"
|
6
|
+
require "models/chef"
|
7
|
+
require "models/comment"
|
8
|
+
require "models/edge"
|
9
|
+
require "models/essay"
|
10
|
+
require "models/post"
|
11
|
+
require "models/price_estimate"
|
12
|
+
require "models/topic"
|
13
|
+
require "models/treasure"
|
14
|
+
require "models/vertex"
|
15
|
+
|
16
|
+
module ActiveRecord
|
17
|
+
class WhereTest < ActiveRecord::TestCase
|
18
|
+
fixtures :posts, :edges, :authors, :binaries, :essays, :author_addresses
|
19
|
+
|
20
|
+
def test_where_copies_bind_params
|
21
|
+
author = authors(:david)
|
22
|
+
posts = author.posts.where('posts.id != 1')
|
23
|
+
joined = Post.where(id: posts)
|
24
|
+
|
25
|
+
assert_operator joined.length, :>, 0
|
26
|
+
|
27
|
+
joined.each { |post|
|
28
|
+
assert_equal author, post.author
|
29
|
+
assert_not_equal 1, post.id
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_where_copies_arel_bind_params
|
34
|
+
chef = Chef.create!
|
35
|
+
CakeDesigner.create!(chef: chef)
|
36
|
+
|
37
|
+
cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
|
38
|
+
chefs = Chef.where(employable: cake_designers)
|
39
|
+
|
40
|
+
assert_equal [chef], chefs.to_a
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_rewhere_on_root
|
44
|
+
assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_belongs_to_shallow_where
|
48
|
+
author = Author.new
|
49
|
+
author.id = 1
|
50
|
+
|
51
|
+
assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_belongs_to_nil_where
|
55
|
+
assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_belongs_to_array_value_where
|
59
|
+
assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_belongs_to_nested_relation_where
|
63
|
+
expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
|
64
|
+
actual = Post.where(author: Author.where(id: [1,2])).to_sql
|
65
|
+
|
66
|
+
assert_equal expected, actual
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_belongs_to_nested_where
|
70
|
+
parent = Comment.new
|
71
|
+
parent.id = 1
|
72
|
+
|
73
|
+
expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
|
74
|
+
actual = Post.where(comments: { parent: parent }).joins(:comments)
|
75
|
+
|
76
|
+
assert_equal expected.to_sql, actual.to_sql
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_belongs_to_nested_where_with_relation
|
80
|
+
author = authors(:david)
|
81
|
+
|
82
|
+
expected = Author.where(id: author ).joins(:posts)
|
83
|
+
actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
|
84
|
+
|
85
|
+
assert_equal expected.to_a, actual.to_a
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_polymorphic_shallow_where
|
89
|
+
treasure = Treasure.new
|
90
|
+
treasure.id = 1
|
91
|
+
|
92
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
93
|
+
actual = PriceEstimate.where(estimate_of: treasure)
|
94
|
+
|
95
|
+
assert_equal expected.to_sql, actual.to_sql
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_polymorphic_nested_array_where
|
99
|
+
treasure = Treasure.new
|
100
|
+
treasure.id = 1
|
101
|
+
hidden = HiddenTreasure.new
|
102
|
+
hidden.id = 2
|
103
|
+
|
104
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
|
105
|
+
actual = PriceEstimate.where(estimate_of: [treasure, hidden])
|
106
|
+
|
107
|
+
assert_equal expected.to_sql, actual.to_sql
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_polymorphic_empty_array_where
|
111
|
+
treasure = Treasure.new
|
112
|
+
treasure.id = 1
|
113
|
+
hidden = HiddenTreasure.new
|
114
|
+
hidden.id = 2
|
115
|
+
|
116
|
+
expected = PriceEstimate.where("1=0")
|
117
|
+
actual = PriceEstimate.where(estimate_of: [])
|
118
|
+
|
119
|
+
assert_equal expected.to_a, actual.to_a
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_polymorphic_nested_relation_where
|
123
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
|
124
|
+
actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
|
125
|
+
|
126
|
+
assert_equal expected.to_sql, actual.to_sql
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_polymorphic_sti_shallow_where
|
130
|
+
treasure = HiddenTreasure.new
|
131
|
+
treasure.id = 1
|
132
|
+
|
133
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
134
|
+
actual = PriceEstimate.where(estimate_of: treasure)
|
135
|
+
|
136
|
+
assert_equal expected.to_sql, actual.to_sql
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_polymorphic_nested_where
|
140
|
+
thing = Post.new
|
141
|
+
thing.id = 1
|
142
|
+
|
143
|
+
expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
|
144
|
+
actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
|
145
|
+
|
146
|
+
assert_equal expected.to_sql, actual.to_sql
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_polymorphic_sti_nested_where
|
150
|
+
treasure = HiddenTreasure.new
|
151
|
+
treasure.id = 1
|
152
|
+
|
153
|
+
expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
|
154
|
+
actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
|
155
|
+
|
156
|
+
assert_equal expected.to_sql, actual.to_sql
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_decorated_polymorphic_where
|
160
|
+
treasure_decorator = Struct.new(:model) do
|
161
|
+
def self.method_missing(method, *args, &block)
|
162
|
+
Treasure.send(method, *args, &block)
|
163
|
+
end
|
164
|
+
|
165
|
+
def is_a?(klass)
|
166
|
+
model.is_a?(klass)
|
167
|
+
end
|
168
|
+
|
169
|
+
def method_missing(method, *args, &block)
|
170
|
+
model.send(method, *args, &block)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
treasure = Treasure.new
|
175
|
+
treasure.id = 1
|
176
|
+
decorated_treasure = treasure_decorator.new(treasure)
|
177
|
+
|
178
|
+
expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
|
179
|
+
actual = PriceEstimate.where(estimate_of: decorated_treasure)
|
180
|
+
|
181
|
+
assert_equal expected.to_sql, actual.to_sql
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_aliased_attribute
|
185
|
+
expected = Topic.where(heading: 'The First Topic')
|
186
|
+
actual = Topic.where(title: 'The First Topic')
|
187
|
+
|
188
|
+
assert_equal expected.to_sql, actual.to_sql
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_where_error
|
192
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
193
|
+
Post.where(:id => { 'posts.author_id' => 10 }).first
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_where_with_table_name
|
198
|
+
post = Post.first
|
199
|
+
assert_equal post, Post.where(:posts => { 'id' => post.id }).first
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_where_with_table_name_and_empty_hash
|
203
|
+
assert_equal 0, Post.where(:posts => {}).count
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_where_with_table_name_and_empty_array
|
207
|
+
assert_equal 0, Post.where(:id => []).count
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_where_with_table_name_and_nested_empty_array
|
211
|
+
assert_deprecated do
|
212
|
+
assert_equal [], Post.where(:id => [[]]).to_a
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_where_with_empty_hash_and_no_foreign_key
|
217
|
+
assert_equal 0, Edge.where(:sink => {}).count
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_where_with_blank_conditions
|
221
|
+
[[], {}, nil, ""].each do |blank|
|
222
|
+
assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_where_with_integer_for_string_column
|
227
|
+
count = Post.where(:title => 0).count
|
228
|
+
assert_equal 0, count
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_where_with_float_for_string_column
|
232
|
+
count = Post.where(:title => 0.0).count
|
233
|
+
assert_equal 0, count
|
234
|
+
end
|
235
|
+
|
236
|
+
unless current_adapter?(:IBM_DBAdapter)
|
237
|
+
def test_where_with_boolean_for_string_column
|
238
|
+
count = Post.where(:title => false).count
|
239
|
+
assert_equal 0, count
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_where_with_decimal_for_string_column
|
244
|
+
count = Post.where(:title => BigDecimal.new(0)).count
|
245
|
+
assert_equal 0, count
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_where_with_duration_for_string_column
|
249
|
+
count = Post.where(:title => 0.seconds).count
|
250
|
+
assert_equal 0, count
|
251
|
+
end
|
252
|
+
unless current_adapter?(:IBM_DBAdapter)
|
253
|
+
def test_where_with_integer_for_binary_column
|
254
|
+
count = Binary.where(:data => 0).count
|
255
|
+
assert_equal 0, count
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_where_on_association_with_custom_primary_key
|
260
|
+
author = authors(:david)
|
261
|
+
essay = Essay.where(writer: author).first
|
262
|
+
|
263
|
+
assert_equal essays(:david_modest_proposal), essay
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_where_on_association_with_custom_primary_key_with_relation
|
267
|
+
author = authors(:david)
|
268
|
+
essay = Essay.where(writer: Author.where(id: author.id)).first
|
269
|
+
|
270
|
+
assert_equal essays(:david_modest_proposal), essay
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_where_on_association_with_relation_performs_subselect_not_two_queries
|
274
|
+
author = authors(:david)
|
275
|
+
|
276
|
+
assert_queries(1) do
|
277
|
+
Essay.where(writer: Author.where(id: author.id)).to_a
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_where_on_association_with_custom_primary_key_with_array_of_base
|
282
|
+
author = authors(:david)
|
283
|
+
essay = Essay.where(writer: [author]).first
|
284
|
+
|
285
|
+
assert_equal essays(:david_modest_proposal), essay
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_where_on_association_with_custom_primary_key_with_array_of_ids
|
289
|
+
essay = Essay.where(writer: ["David"]).first
|
290
|
+
|
291
|
+
assert_equal essays(:david_modest_proposal), essay
|
292
|
+
end
|
293
|
+
|
294
|
+
def test_where_on_non_polymorphic_association_with_custom_primary_key
|
295
|
+
essay = Essay.where(category: [Category.new(name: "General")]).first
|
296
|
+
|
297
|
+
assert_equal essays(:david_modest_proposal), essay
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/author"
|
3
|
+
require "models/binary"
|
4
|
+
require "models/cake_designer"
|
5
|
+
require "models/category"
|
6
|
+
require "models/chef"
|
7
|
+
require "models/comment"
|
8
|
+
require "models/edge"
|
9
|
+
require "models/essay"
|
10
|
+
require "models/post"
|
11
|
+
require "models/price_estimate"
|
12
|
+
require "models/topic"
|
13
|
+
require "models/treasure"
|
14
|
+
require "models/vertex"
|
15
|
+
|
16
|
+
module ActiveRecord
|
17
|
+
class WhereTest < ActiveRecord::TestCase
|
18
|
+
fixtures :posts, :edges, :authors, :binaries, :essays, :author_addresses
|
19
|
+
|
20
|
+
unless current_adapter?(:IBM_DBAdapter)
|
21
|
+
def test_where_with_boolean_for_string_column
|
22
|
+
#count = Post.where(:title => false).count
|
23
|
+
count = Post.where(:title => 0.0).count
|
24
|
+
assert_equal 0, count
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
=begin
|
29
|
+
def test_where_with_integer_for_binary_column
|
30
|
+
count = Binary.where(:data => 0).count
|
31
|
+
assert_equal 0, count
|
32
|
+
end
|
33
|
+
=end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,297 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/comment'
|
4
|
+
require 'models/author'
|
5
|
+
require 'models/rating'
|
6
|
+
|
7
|
+
module ActiveRecord
|
8
|
+
class RelationTest < ActiveRecord::TestCase
|
9
|
+
fixtures :posts, :comments, :authors, :author_addresses
|
10
|
+
|
11
|
+
class FakeKlass < Struct.new(:table_name, :name)
|
12
|
+
extend ActiveRecord::Delegation::DelegateCache
|
13
|
+
|
14
|
+
inherited self
|
15
|
+
|
16
|
+
def self.connection
|
17
|
+
Post.connection
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.table_name
|
21
|
+
'fake_table'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_construction
|
26
|
+
relation = Relation.new FakeKlass, :b
|
27
|
+
assert_equal FakeKlass, relation.klass
|
28
|
+
assert_equal :b, relation.table
|
29
|
+
assert !relation.loaded, 'relation is not loaded'
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_responds_to_model_and_returns_klass
|
33
|
+
relation = Relation.new FakeKlass, :b
|
34
|
+
assert_equal FakeKlass, relation.model
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_initialize_single_values
|
38
|
+
relation = Relation.new FakeKlass, :b
|
39
|
+
(Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
|
40
|
+
assert_nil relation.send("#{method}_value"), method.to_s
|
41
|
+
end
|
42
|
+
assert_equal({}, relation.create_with_value)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_multi_value_initialize
|
46
|
+
relation = Relation.new FakeKlass, :b
|
47
|
+
Relation::MULTI_VALUE_METHODS.each do |method|
|
48
|
+
assert_equal [], relation.send("#{method}_values"), method.to_s
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_extensions
|
53
|
+
relation = Relation.new FakeKlass, :b
|
54
|
+
assert_equal [], relation.extensions
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_empty_where_values_hash
|
58
|
+
relation = Relation.new FakeKlass, :b
|
59
|
+
assert_equal({}, relation.where_values_hash)
|
60
|
+
|
61
|
+
relation.where! :hello
|
62
|
+
assert_equal({}, relation.where_values_hash)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_has_values
|
66
|
+
relation = Relation.new Post, Post.arel_table
|
67
|
+
relation.where! relation.table[:id].eq(10)
|
68
|
+
assert_equal({:id => 10}, relation.where_values_hash)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_values_wrong_table
|
72
|
+
relation = Relation.new Post, Post.arel_table
|
73
|
+
relation.where! Comment.arel_table[:id].eq(10)
|
74
|
+
assert_equal({}, relation.where_values_hash)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_tree_is_not_traversed
|
78
|
+
relation = Relation.new Post, Post.arel_table
|
79
|
+
left = relation.table[:id].eq(10)
|
80
|
+
right = relation.table[:id].eq(10)
|
81
|
+
combine = left.and right
|
82
|
+
relation.where! combine
|
83
|
+
assert_equal({}, relation.where_values_hash)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_table_name_delegates_to_klass
|
87
|
+
relation = Relation.new FakeKlass.new('posts'), :b
|
88
|
+
assert_equal 'posts', relation.table_name
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_scope_for_create
|
92
|
+
relation = Relation.new FakeKlass, :b
|
93
|
+
assert_equal({}, relation.scope_for_create)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_create_with_value
|
97
|
+
relation = Relation.new Post, Post.arel_table
|
98
|
+
hash = { :hello => 'world' }
|
99
|
+
relation.create_with_value = hash
|
100
|
+
assert_equal hash, relation.scope_for_create
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_create_with_value_with_wheres
|
104
|
+
relation = Relation.new Post, Post.arel_table
|
105
|
+
relation.where! relation.table[:id].eq(10)
|
106
|
+
relation.create_with_value = {:hello => 'world'}
|
107
|
+
assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
|
108
|
+
end
|
109
|
+
|
110
|
+
# FIXME: is this really wanted or expected behavior?
|
111
|
+
def test_scope_for_create_is_cached
|
112
|
+
relation = Relation.new Post, Post.arel_table
|
113
|
+
assert_equal({}, relation.scope_for_create)
|
114
|
+
|
115
|
+
relation.where! relation.table[:id].eq(10)
|
116
|
+
assert_equal({}, relation.scope_for_create)
|
117
|
+
|
118
|
+
relation.create_with_value = {:hello => 'world'}
|
119
|
+
assert_equal({}, relation.scope_for_create)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_bad_constants_raise_errors
|
123
|
+
assert_raises(NameError) do
|
124
|
+
ActiveRecord::Relation::HelloWorld
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_empty_eager_loading?
|
129
|
+
relation = Relation.new FakeKlass, :b
|
130
|
+
assert !relation.eager_loading?
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_eager_load_values
|
134
|
+
relation = Relation.new FakeKlass, :b
|
135
|
+
relation.eager_load! :b
|
136
|
+
assert relation.eager_loading?
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_references_values
|
140
|
+
relation = Relation.new FakeKlass, :b
|
141
|
+
assert_equal [], relation.references_values
|
142
|
+
relation = relation.references(:foo).references(:omg, :lol)
|
143
|
+
assert_equal ['foo', 'omg', 'lol'], relation.references_values
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_references_values_dont_duplicate
|
147
|
+
relation = Relation.new FakeKlass, :b
|
148
|
+
relation = relation.references(:foo).references(:foo)
|
149
|
+
assert_equal ['foo'], relation.references_values
|
150
|
+
end
|
151
|
+
|
152
|
+
test 'merging a hash into a relation' do
|
153
|
+
relation = Relation.new FakeKlass, :b
|
154
|
+
relation = relation.merge where: :lol, readonly: true
|
155
|
+
|
156
|
+
assert_equal [:lol], relation.where_values
|
157
|
+
assert_equal true, relation.readonly_value
|
158
|
+
end
|
159
|
+
|
160
|
+
test 'merging an empty hash into a relation' do
|
161
|
+
assert_equal [], Relation.new(FakeKlass, :b).merge({}).where_values
|
162
|
+
end
|
163
|
+
|
164
|
+
test 'merging a hash with unknown keys raises' do
|
165
|
+
assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: 'lol') }
|
166
|
+
end
|
167
|
+
|
168
|
+
test '#values returns a dup of the values' do
|
169
|
+
relation = Relation.new(FakeKlass, :b).where! :foo
|
170
|
+
values = relation.values
|
171
|
+
|
172
|
+
values[:where] = nil
|
173
|
+
assert_not_nil relation.where_values
|
174
|
+
end
|
175
|
+
|
176
|
+
test 'relations can be created with a values hash' do
|
177
|
+
relation = Relation.new(FakeKlass, :b, where: [:foo])
|
178
|
+
assert_equal [:foo], relation.where_values
|
179
|
+
end
|
180
|
+
|
181
|
+
test 'merging a single where value' do
|
182
|
+
relation = Relation.new(FakeKlass, :b)
|
183
|
+
relation.merge!(where: :foo)
|
184
|
+
assert_equal [:foo], relation.where_values
|
185
|
+
end
|
186
|
+
|
187
|
+
test 'merging a hash interpolates conditions' do
|
188
|
+
klass = Class.new(FakeKlass) do
|
189
|
+
def self.sanitize_sql(args)
|
190
|
+
raise unless args == ['foo = ?', 'bar']
|
191
|
+
'foo = bar'
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
relation = Relation.new(klass, :b)
|
196
|
+
relation.merge!(where: ['foo = ?', 'bar'])
|
197
|
+
assert_equal ['foo = bar'], relation.where_values
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_merging_readonly_false
|
201
|
+
relation = Relation.new FakeKlass, :b
|
202
|
+
readonly_false_relation = relation.readonly(false)
|
203
|
+
# test merging in both directions
|
204
|
+
assert_equal false, relation.merge(readonly_false_relation).readonly_value
|
205
|
+
assert_equal false, readonly_false_relation.merge(relation).readonly_value
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_relation_merging_with_merged_joins_as_symbols
|
209
|
+
special_comments_with_ratings = SpecialComment.joins(:ratings)
|
210
|
+
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
211
|
+
assert_equal 3, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count.length
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_conflicting_bind_values
|
215
|
+
assert_nothing_raised do
|
216
|
+
CommentWithConflictingDefaultScope.joins(:post_with_conflicting_default_scope).delete_all
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
|
221
|
+
post = Post.create!(title: "haha", body: "huhu")
|
222
|
+
comment = post.comments.create!(body: "hu")
|
223
|
+
3.times { comment.ratings.create! }
|
224
|
+
|
225
|
+
relation = Post.joins(:comments).merge Comment.joins(:ratings)
|
226
|
+
|
227
|
+
assert_equal 3, relation.where(id: post.id).pluck(:id).size
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_respond_to_for_non_selected_element
|
231
|
+
post = Post.select(:title).first
|
232
|
+
assert_equal false, post.respond_to?(:body), "post should not respond_to?(:body) since invoking it raises exception"
|
233
|
+
|
234
|
+
silence_warnings { post = Post.select("'title' as post_title").first }
|
235
|
+
assert_equal false, post.respond_to?(:title), "post should not respond_to?(:body) since invoking it raises exception"
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_select_quotes_when_using_from_clause
|
239
|
+
if sqlite3_version_includes_quoting_bug?
|
240
|
+
skip <<-ERROR.squish
|
241
|
+
You are using an outdated version of SQLite3 which has a bug in
|
242
|
+
quoted column names. Please update SQLite3 and rebuild the sqlite3
|
243
|
+
ruby gem
|
244
|
+
ERROR
|
245
|
+
end
|
246
|
+
quoted_join = ActiveRecord::Base.connection.quote_table_name("join")
|
247
|
+
selected = Post.select(:join).from(Post.select("id as #{quoted_join}")).map(&:join)
|
248
|
+
assert_equal Post.pluck(:id), selected
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_relation_merging_with_merged_joins_as_strings
|
252
|
+
join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
|
253
|
+
special_comments_with_ratings = SpecialComment.joins join_string
|
254
|
+
posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
|
255
|
+
assert_equal 3, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count.length
|
256
|
+
end
|
257
|
+
|
258
|
+
class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
|
259
|
+
def type
|
260
|
+
:string
|
261
|
+
end
|
262
|
+
|
263
|
+
def type_cast_from_database(value)
|
264
|
+
raise value unless value == "type cast for database"
|
265
|
+
"type cast from database"
|
266
|
+
end
|
267
|
+
|
268
|
+
def type_cast_for_database(value)
|
269
|
+
raise value unless value == "value from user"
|
270
|
+
"type cast for database"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
class UpdateAllTestModel < ActiveRecord::Base
|
275
|
+
self.table_name = 'posts'
|
276
|
+
|
277
|
+
attribute :body, EnsureRoundTripTypeCasting.new
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_update_all_goes_through_normal_type_casting
|
281
|
+
UpdateAllTestModel.update_all(body: "value from user", type: nil) # No STI
|
282
|
+
|
283
|
+
assert_equal "type cast from database", UpdateAllTestModel.first.body
|
284
|
+
end
|
285
|
+
|
286
|
+
private
|
287
|
+
|
288
|
+
def sqlite3_version_includes_quoting_bug?
|
289
|
+
if current_adapter?(:SQLite3Adapter)
|
290
|
+
selected_quoted_column_names = ActiveRecord::Base.connection.exec_query(
|
291
|
+
'SELECT "join" FROM (SELECT id AS "join" FROM posts) subquery'
|
292
|
+
).columns
|
293
|
+
["join"] != selected_quoted_column_names
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
end
|