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,380 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/club'
|
3
|
+
require 'models/member_type'
|
4
|
+
require 'models/member'
|
5
|
+
require 'models/membership'
|
6
|
+
require 'models/sponsor'
|
7
|
+
require 'models/organization'
|
8
|
+
require 'models/member_detail'
|
9
|
+
require 'models/minivan'
|
10
|
+
require 'models/dashboard'
|
11
|
+
require 'models/speedometer'
|
12
|
+
require 'models/category'
|
13
|
+
require 'models/author'
|
14
|
+
require 'models/essay'
|
15
|
+
require 'models/owner'
|
16
|
+
require 'models/post'
|
17
|
+
require 'models/comment'
|
18
|
+
require 'models/customer'
|
19
|
+
require 'models/carrier'
|
20
|
+
require 'models/shop_account'
|
21
|
+
require 'models/customer_carrier'
|
22
|
+
|
23
|
+
class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
24
|
+
fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
|
25
|
+
:dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners, :author_addresses
|
26
|
+
|
27
|
+
def setup
|
28
|
+
@member = members(:groucho)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_has_one_through_with_has_one
|
32
|
+
assert_equal clubs(:boring_club), @member.club
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_creating_association_creates_through_record
|
36
|
+
new_member = Member.create(:name => "Chris")
|
37
|
+
new_member.club = Club.create(:name => "LRUG")
|
38
|
+
assert_not_nil new_member.current_membership
|
39
|
+
assert_not_nil new_member.club
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_creating_association_builds_through_record_for_new
|
43
|
+
new_member = Member.new(:name => "Jane")
|
44
|
+
new_member.club = clubs(:moustache_club)
|
45
|
+
assert new_member.current_membership
|
46
|
+
assert_equal clubs(:moustache_club), new_member.current_membership.club
|
47
|
+
assert_equal clubs(:moustache_club), new_member.club
|
48
|
+
assert new_member.save
|
49
|
+
assert_equal clubs(:moustache_club), new_member.club
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_creating_association_sets_both_parent_ids_for_new
|
53
|
+
member = Member.new(name: 'Sean Griffin')
|
54
|
+
club = Club.new(name: 'Da Club')
|
55
|
+
|
56
|
+
member.club = club
|
57
|
+
|
58
|
+
member.save!
|
59
|
+
|
60
|
+
assert member.id
|
61
|
+
assert club.id
|
62
|
+
assert_equal member.id, member.current_membership.member_id
|
63
|
+
assert_equal club.id, member.current_membership.club_id
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_replace_target_record
|
67
|
+
new_club = Club.create(:name => "Marx Bros")
|
68
|
+
@member.club = new_club
|
69
|
+
@member.reload
|
70
|
+
assert_equal new_club, @member.club
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_replacing_target_record_deletes_old_association
|
74
|
+
assert_no_difference "Membership.count" do
|
75
|
+
new_club = Club.create(:name => "Bananarama")
|
76
|
+
@member.club = new_club
|
77
|
+
@member.reload
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_set_record_to_nil_should_delete_association
|
82
|
+
@member.club = nil
|
83
|
+
@member.reload
|
84
|
+
assert_equal nil, @member.current_membership
|
85
|
+
assert_nil @member.club
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_has_one_through_polymorphic
|
89
|
+
assert_equal clubs(:moustache_club), @member.sponsor_club
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_has_one_through_eager_loading
|
93
|
+
members = assert_queries(3) do #base table, through table, clubs table
|
94
|
+
Member.all.merge!(:includes => :club, :where => ["name = ?", "Groucho Marx"]).to_a
|
95
|
+
end
|
96
|
+
assert_equal 1, members.size
|
97
|
+
assert_not_nil assert_no_queries {members[0].club}
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_has_one_through_eager_loading_through_polymorphic
|
101
|
+
members = assert_queries(3) do #base table, through table, clubs table
|
102
|
+
Member.all.merge!(:includes => :sponsor_club, :where => ["name = ?", "Groucho Marx"]).to_a
|
103
|
+
end
|
104
|
+
assert_equal 1, members.size
|
105
|
+
assert_not_nil assert_no_queries {members[0].sponsor_club}
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_has_one_through_with_conditions_eager_loading
|
109
|
+
# conditions on the through table
|
110
|
+
assert_equal clubs(:moustache_club), Member.all.merge!(:includes => :favourite_club).find(@member.id).favourite_club
|
111
|
+
memberships(:membership_of_favourite_club).update_columns(favourite: false)
|
112
|
+
assert_equal nil, Member.all.merge!(:includes => :favourite_club).find(@member.id).reload.favourite_club
|
113
|
+
|
114
|
+
# conditions on the source table
|
115
|
+
assert_equal clubs(:moustache_club), Member.all.merge!(:includes => :hairy_club).find(@member.id).hairy_club
|
116
|
+
clubs(:moustache_club).update_columns(name: "Association of Clean-Shaven Persons")
|
117
|
+
assert_equal nil, Member.all.merge!(:includes => :hairy_club).find(@member.id).reload.hairy_club
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_has_one_through_polymorphic_with_source_type
|
121
|
+
assert_equal members(:groucho), clubs(:moustache_club).sponsored_member
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_eager_has_one_through_polymorphic_with_source_type
|
125
|
+
clubs = Club.all.merge!(:includes => :sponsored_member, :where => ["name = ?","Moustache and Eyebrow Fancier Club"]).to_a
|
126
|
+
# Only the eyebrow fanciers club has a sponsored_member
|
127
|
+
assert_not_nil assert_no_queries {clubs[0].sponsored_member}
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_has_one_through_nonpreload_eagerloading
|
131
|
+
members = assert_queries(1) do
|
132
|
+
Member.all.merge!(:includes => :club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name').to_a #force fallback
|
133
|
+
end
|
134
|
+
assert_equal 1, members.size
|
135
|
+
assert_not_nil assert_no_queries {members[0].club}
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_has_one_through_nonpreload_eager_loading_through_polymorphic
|
139
|
+
members = assert_queries(1) do
|
140
|
+
Member.all.merge!(:includes => :sponsor_club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name').to_a #force fallback
|
141
|
+
end
|
142
|
+
assert_equal 1, members.size
|
143
|
+
assert_not_nil assert_no_queries {members[0].sponsor_club}
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_has_one_through_nonpreload_eager_loading_through_polymorphic_with_more_than_one_through_record
|
147
|
+
Sponsor.new(:sponsor_club => clubs(:crazy_club), :sponsorable => members(:groucho)).save!
|
148
|
+
members = assert_queries(1) do
|
149
|
+
Member.all.merge!(:includes => :sponsor_club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name DESC').to_a #force fallback
|
150
|
+
end
|
151
|
+
assert_equal 1, members.size
|
152
|
+
assert_not_nil assert_no_queries { members[0].sponsor_club }
|
153
|
+
assert_equal clubs(:crazy_club), members[0].sponsor_club
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_uninitialized_has_one_through_should_return_nil_for_unsaved_record
|
157
|
+
assert_nil Member.new.club
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_assigning_association_correctly_assigns_target
|
161
|
+
new_member = Member.create(:name => "Chris")
|
162
|
+
new_member.club = new_club = Club.create(:name => "LRUG")
|
163
|
+
assert_equal new_club, new_member.association(:club).target
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_has_one_through_proxy_should_not_respond_to_private_methods
|
167
|
+
assert_raise(NoMethodError) { clubs(:moustache_club).private_method }
|
168
|
+
assert_raise(NoMethodError) { @member.club.private_method }
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_has_one_through_proxy_should_respond_to_private_methods_via_send
|
172
|
+
clubs(:moustache_club).send(:private_method)
|
173
|
+
@member.club.send(:private_method)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_assigning_to_has_one_through_preserves_decorated_join_record
|
177
|
+
@organization = organizations(:nsa)
|
178
|
+
assert_difference 'MemberDetail.count', 1 do
|
179
|
+
@member_detail = MemberDetail.new(:extra_data => 'Extra')
|
180
|
+
@member.member_detail = @member_detail
|
181
|
+
@member.organization = @organization
|
182
|
+
end
|
183
|
+
assert_equal @organization, @member.organization
|
184
|
+
assert @organization.members.include?(@member)
|
185
|
+
assert_equal 'Extra', @member.member_detail.extra_data
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_reassigning_has_one_through
|
189
|
+
@organization = organizations(:nsa)
|
190
|
+
@new_organization = organizations(:discordians)
|
191
|
+
|
192
|
+
assert_difference 'MemberDetail.count', 1 do
|
193
|
+
@member_detail = MemberDetail.new(:extra_data => 'Extra')
|
194
|
+
@member.member_detail = @member_detail
|
195
|
+
@member.organization = @organization
|
196
|
+
end
|
197
|
+
assert_equal @organization, @member.organization
|
198
|
+
assert_equal 'Extra', @member.member_detail.extra_data
|
199
|
+
assert @organization.members.include?(@member)
|
200
|
+
assert !@new_organization.members.include?(@member)
|
201
|
+
|
202
|
+
assert_no_difference 'MemberDetail.count' do
|
203
|
+
@member.organization = @new_organization
|
204
|
+
end
|
205
|
+
assert_equal @new_organization, @member.organization
|
206
|
+
assert_equal 'Extra', @member.member_detail.extra_data
|
207
|
+
assert !@organization.members.include?(@member)
|
208
|
+
assert @new_organization.members.include?(@member)
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_preloading_has_one_through_on_belongs_to
|
212
|
+
MemberDetail.delete_all
|
213
|
+
assert_not_nil @member.member_type
|
214
|
+
@organization = organizations(:nsa)
|
215
|
+
@member_detail = MemberDetail.new
|
216
|
+
@member.member_detail = @member_detail
|
217
|
+
@member.organization = @organization
|
218
|
+
@member_details = assert_queries(3) do
|
219
|
+
MemberDetail.all.merge!(:includes => :member_type).to_a
|
220
|
+
end
|
221
|
+
@new_detail = @member_details[0]
|
222
|
+
assert @new_detail.send(:association, :member_type).loaded?
|
223
|
+
assert_no_queries { @new_detail.member_type }
|
224
|
+
end
|
225
|
+
|
226
|
+
def test_save_of_record_with_loaded_has_one_through
|
227
|
+
@club = @member.club
|
228
|
+
assert_not_nil @club.sponsored_member
|
229
|
+
|
230
|
+
assert_nothing_raised do
|
231
|
+
Club.find(@club.id).save!
|
232
|
+
Club.all.merge!(:includes => :sponsored_member).find(@club.id).save!
|
233
|
+
end
|
234
|
+
|
235
|
+
@club.sponsor.destroy
|
236
|
+
|
237
|
+
assert_nothing_raised do
|
238
|
+
Club.find(@club.id).save!
|
239
|
+
Club.all.merge!(:includes => :sponsored_member).find(@club.id).save!
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_through_belongs_to_after_destroy
|
244
|
+
@member_detail = MemberDetail.new(:extra_data => 'Extra')
|
245
|
+
@member.member_detail = @member_detail
|
246
|
+
@member.save!
|
247
|
+
|
248
|
+
assert_not_nil @member_detail.member_type
|
249
|
+
@member_detail.destroy
|
250
|
+
assert_queries(1) do
|
251
|
+
assert_not_nil @member_detail.member_type(true)
|
252
|
+
end
|
253
|
+
|
254
|
+
@member_detail.member.destroy
|
255
|
+
assert_queries(1) do
|
256
|
+
assert_nil @member_detail.member_type(true)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_value_is_properly_quoted
|
261
|
+
minivan = Minivan.find('m1')
|
262
|
+
assert_nothing_raised do
|
263
|
+
minivan.dashboard
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_has_one_through_polymorphic_with_primary_key_option
|
268
|
+
assert_equal categories(:general), authors(:david).essay_category
|
269
|
+
|
270
|
+
authors = Author.joins(:essay_category).where('categories.id' => categories(:general).id)
|
271
|
+
assert_equal authors(:david), authors.first
|
272
|
+
|
273
|
+
assert_equal owners(:blackbeard), authors(:david).essay_owner
|
274
|
+
|
275
|
+
authors = Author.joins(:essay_owner).where("owners.name = 'blackbeard'")
|
276
|
+
assert_equal authors(:david), authors.first
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_has_one_through_with_primary_key_option
|
280
|
+
assert_equal categories(:general), authors(:david).essay_category_2
|
281
|
+
|
282
|
+
authors = Author.joins(:essay_category_2).where('categories.id' => categories(:general).id)
|
283
|
+
assert_equal authors(:david), authors.first
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_has_one_through_with_default_scope_on_join_model
|
287
|
+
assert_equal posts(:welcome).comments.order('id').first, authors(:david).comment_on_first_post
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_has_one_through_many_raises_exception
|
291
|
+
assert_raise(ActiveRecord::HasOneThroughCantAssociateThroughCollection) do
|
292
|
+
members(:groucho).club_through_many
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_has_one_through_polymorphic_association
|
297
|
+
assert_raise(ActiveRecord::HasOneAssociationPolymorphicThroughError) do
|
298
|
+
@member.premium_club
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_has_one_through_belongs_to_should_update_when_the_through_foreign_key_changes
|
303
|
+
minivan = minivans(:cool_first)
|
304
|
+
|
305
|
+
minivan.dashboard
|
306
|
+
proxy = minivan.send(:association_instance_get, :dashboard)
|
307
|
+
|
308
|
+
assert !proxy.stale_target?
|
309
|
+
assert_equal dashboards(:cool_first), minivan.dashboard
|
310
|
+
|
311
|
+
minivan.speedometer_id = speedometers(:second).id
|
312
|
+
|
313
|
+
assert proxy.stale_target?
|
314
|
+
assert_equal dashboards(:second), minivan.dashboard
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_has_one_through_belongs_to_setting_belongs_to_foreign_key_after_nil_target_loaded
|
318
|
+
minivan = Minivan.new
|
319
|
+
|
320
|
+
minivan.dashboard
|
321
|
+
proxy = minivan.send(:association_instance_get, :dashboard)
|
322
|
+
|
323
|
+
minivan.speedometer_id = speedometers(:second).id
|
324
|
+
|
325
|
+
assert proxy.stale_target?
|
326
|
+
assert_equal dashboards(:second), minivan.dashboard
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_assigning_has_one_through_belongs_to_with_new_record_owner
|
330
|
+
minivan = Minivan.new
|
331
|
+
dashboard = dashboards(:cool_first)
|
332
|
+
|
333
|
+
minivan.dashboard = dashboard
|
334
|
+
|
335
|
+
assert_equal dashboard, minivan.dashboard
|
336
|
+
assert_equal dashboard, minivan.speedometer.dashboard
|
337
|
+
end
|
338
|
+
|
339
|
+
def test_has_one_through_with_custom_select_on_join_model_default_scope
|
340
|
+
assert_equal clubs(:boring_club), members(:groucho).selected_club
|
341
|
+
end
|
342
|
+
|
343
|
+
def test_has_one_through_relationship_cannot_have_a_counter_cache
|
344
|
+
assert_raise(ArgumentError) do
|
345
|
+
Class.new(ActiveRecord::Base) do
|
346
|
+
has_one :thing, through: :other_thing, counter_cache: true
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_has_one_through_do_not_cache_association_reader_if_the_though_method_has_default_scopes
|
352
|
+
customer = Customer.create!
|
353
|
+
carrier = Carrier.create!
|
354
|
+
customer_carrier = CustomerCarrier.create!(
|
355
|
+
customer: customer,
|
356
|
+
carrier: carrier,
|
357
|
+
)
|
358
|
+
account = ShopAccount.create!(customer_carrier: customer_carrier)
|
359
|
+
|
360
|
+
CustomerCarrier.current_customer = customer
|
361
|
+
|
362
|
+
account_carrier = account.carrier
|
363
|
+
assert_equal carrier, account_carrier
|
364
|
+
|
365
|
+
CustomerCarrier.current_customer = nil
|
366
|
+
|
367
|
+
other_carrier = Carrier.create!
|
368
|
+
other_customer = Customer.create!
|
369
|
+
other_customer_carrier = CustomerCarrier.create!(
|
370
|
+
customer: other_customer,
|
371
|
+
carrier: other_carrier,
|
372
|
+
)
|
373
|
+
other_account = ShopAccount.create!(customer_carrier: other_customer_carrier)
|
374
|
+
|
375
|
+
account_carrier = other_account.carrier
|
376
|
+
assert_equal other_carrier, account_carrier
|
377
|
+
ensure
|
378
|
+
CustomerCarrier.current_customer = nil
|
379
|
+
end
|
380
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/comment'
|
4
|
+
require 'models/author'
|
5
|
+
require 'models/essay'
|
6
|
+
require 'models/category'
|
7
|
+
require 'models/categorization'
|
8
|
+
require 'models/person'
|
9
|
+
require 'models/tagging'
|
10
|
+
require 'models/tag'
|
11
|
+
|
12
|
+
class InnerJoinAssociationTest < ActiveRecord::TestCase
|
13
|
+
fixtures :authors, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
|
14
|
+
:taggings, :tags, :author_addresses
|
15
|
+
|
16
|
+
def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
|
17
|
+
result = Author.joins(:thinking_posts, :welcome_posts).to_a
|
18
|
+
assert_equal authors(:david), result.first
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
|
22
|
+
assert_nothing_raised do
|
23
|
+
sql = Person.joins(:agents => {:agents => :agents}).joins(:agents => {:agents => {:primary_contact => :agents}}).to_sql
|
24
|
+
assert_match(/agents_people_4/i, sql)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_construct_finder_sql_ignores_empty_joins_hash
|
29
|
+
sql = Author.joins({}).to_sql
|
30
|
+
assert_no_match(/JOIN/i, sql)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_construct_finder_sql_ignores_empty_joins_array
|
34
|
+
sql = Author.joins([]).to_sql
|
35
|
+
assert_no_match(/JOIN/i, sql)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_join_conditions_added_to_join_clause
|
39
|
+
sql = Author.joins(:essays).to_sql
|
40
|
+
assert_match(/writer_type.*?=.*?Author/i, sql)
|
41
|
+
assert_no_match(/WHERE/i, sql)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_join_association_conditions_support_string_and_arel_expressions
|
45
|
+
assert_equal 0, Author.joins(:welcome_posts_with_one_comment).count
|
46
|
+
assert_equal 1, Author.joins(:welcome_posts_with_comments).count
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_join_conditions_allow_nil_associations
|
50
|
+
authors = Author.includes(:essays).where(:essays => {:id => nil})
|
51
|
+
assert_equal 2, authors.count
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
|
55
|
+
authors = Author.joins(:posts)
|
56
|
+
assert_not authors.empty?, "expected authors to be non-empty"
|
57
|
+
assert authors.none? {|a| a.readonly? }, "expected no authors to be readonly"
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_find_with_implicit_inner_joins_honors_readonly_with_select
|
61
|
+
authors = Author.joins(:posts).select('authors.*').to_a
|
62
|
+
assert !authors.empty?, "expected authors to be non-empty"
|
63
|
+
assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_find_with_implicit_inner_joins_honors_readonly_false
|
67
|
+
authors = Author.joins(:posts).readonly(false).to_a
|
68
|
+
assert !authors.empty?, "expected authors to be non-empty"
|
69
|
+
assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_find_with_implicit_inner_joins_does_not_set_associations
|
73
|
+
authors = Author.joins(:posts).select('authors.*').to_a
|
74
|
+
assert !authors.empty?, "expected authors to be non-empty"
|
75
|
+
assert authors.all? { |a| !a.instance_variable_defined?(:@posts) }, "expected no authors to have the @posts association loaded"
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_count_honors_implicit_inner_joins
|
79
|
+
real_count = Author.all.to_a.sum{|a| a.posts.count }
|
80
|
+
assert_equal real_count, Author.joins(:posts).count, "plain inner join count should match the number of referenced posts records"
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_calculate_honors_implicit_inner_joins
|
84
|
+
real_count = Author.all.to_a.sum{|a| a.posts.count }
|
85
|
+
assert_equal real_count, Author.joins(:posts).calculate(:count, 'authors.id'), "plain inner join count should match the number of referenced posts records"
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_calculate_honors_implicit_inner_joins_and_distinct_and_conditions
|
89
|
+
real_count = Author.all.to_a.select {|a| a.posts.any? {|p| p.title =~ /^Welcome/} }.length
|
90
|
+
authors_with_welcoming_post_titles = Author.all.merge!(joins: :posts, where: "posts.title like 'Welcome%'").distinct.calculate(:count, 'authors.id')
|
91
|
+
assert_equal real_count, authors_with_welcoming_post_titles, "inner join and conditions should have only returned authors posting titles starting with 'Welcome'"
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_find_with_sti_join
|
95
|
+
scope = Post.joins(:special_comments).where(:id => posts(:sti_comments).id)
|
96
|
+
|
97
|
+
# The join should match SpecialComment and its subclasses only
|
98
|
+
assert scope.where("comments.type" => "Comment").empty?
|
99
|
+
assert !scope.where("comments.type" => "SpecialComment").empty?
|
100
|
+
assert !scope.where("comments.type" => "SubSpecialComment").empty?
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_find_with_conditions_on_reflection
|
104
|
+
assert !posts(:welcome).comments.empty?
|
105
|
+
assert Post.joins(:nonexistant_comments).where(:id => posts(:welcome).id).empty? # [sic!]
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_find_with_conditions_on_through_reflection
|
109
|
+
assert !posts(:welcome).tags.empty?
|
110
|
+
assert Post.joins(:misc_tags).where(:id => posts(:welcome).id).empty?
|
111
|
+
end
|
112
|
+
|
113
|
+
test "the default scope of the target is applied when joining associations" do
|
114
|
+
author = Author.create! name: "Jon"
|
115
|
+
author.categorizations.create!
|
116
|
+
author.categorizations.create! special: true
|
117
|
+
|
118
|
+
assert_equal [author], Author.where(id: author).joins(:special_categorizations)
|
119
|
+
end
|
120
|
+
|
121
|
+
test "the default scope of the target is correctly aliased when joining associations" do
|
122
|
+
author = Author.create! name: "Jon"
|
123
|
+
author.categories.create! name: 'Not Special'
|
124
|
+
author.special_categories.create! name: 'Special'
|
125
|
+
|
126
|
+
categories = author.categories.includes(:special_categorizations).references(:special_categorizations).to_a
|
127
|
+
assert_equal 2, categories.size
|
128
|
+
end
|
129
|
+
|
130
|
+
test "the correct records are loaded when including an aliased association" do
|
131
|
+
author = Author.create! name: "Jon"
|
132
|
+
author.categories.create! name: 'Not Special'
|
133
|
+
author.special_categories.create! name: 'Special'
|
134
|
+
|
135
|
+
categories = author.categories.eager_load(:special_categorizations).order(:name).to_a
|
136
|
+
assert_equal 0, categories.first.special_categorizations.size
|
137
|
+
assert_equal 1, categories.second.special_categorizations.size
|
138
|
+
end
|
139
|
+
end
|