ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 +5 -5
 - data/CHANGES +4 -0
 - data/LICENSE +1 -1
 - data/ParameterizedQueries README +6 -6
 - data/README +38 -55
 - data/ext/Makefile +269 -0
 - data/ext/extconf.rb +34 -3
 - data/ext/gil_release_version +3 -0
 - data/ext/ibm_db-i386-mingw32.def +2 -0
 - data/ext/ibm_db.c +100 -108
 - data/ext/ibm_db.o +0 -0
 - data/ext/ibm_db.so +0 -0
 - data/ext/mkmf.log +110 -0
 - data/ext/ruby_ibm_db_cli.o +0 -0
 - data/ext/unicode_support_version +3 -0
 - data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
 - data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
 - data/lib/mswin32/ibm_db.rb +7 -39
 - data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
 - data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
 - data/test/cases/adapter_test.rb +133 -58
 - data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
 - data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
 - data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
 - data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
 - data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
 - data/test/cases/adapters/mysql2/connection_test.rb +210 -0
 - data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
 - data/test/cases/adapters/mysql2/enum_test.rb +26 -0
 - data/test/cases/adapters/mysql2/explain_test.rb +21 -0
 - data/test/cases/adapters/mysql2/json_test.rb +195 -0
 - data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
 - data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
 - data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
 - data/test/cases/adapters/mysql2/schema_test.rb +126 -0
 - data/test/cases/adapters/mysql2/sp_test.rb +36 -0
 - data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
 - data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
 - data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
 - data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
 - data/test/cases/adapters/postgresql/array_test.rb +339 -0
 - data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
 - data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
 - data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
 - data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
 - data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
 - data/test/cases/adapters/postgresql/citext_test.rb +78 -0
 - data/test/cases/adapters/postgresql/collation_test.rb +53 -0
 - data/test/cases/adapters/postgresql/composite_test.rb +132 -0
 - data/test/cases/adapters/postgresql/connection_test.rb +257 -0
 - data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
 - data/test/cases/adapters/postgresql/domain_test.rb +47 -0
 - data/test/cases/adapters/postgresql/enum_test.rb +91 -0
 - data/test/cases/adapters/postgresql/explain_test.rb +20 -0
 - data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
 - data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
 - data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
 - data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
 - data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
 - data/test/cases/adapters/postgresql/integer_test.rb +25 -0
 - data/test/cases/adapters/postgresql/json_test.rb +237 -0
 - data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
 - data/test/cases/adapters/postgresql/money_test.rb +96 -0
 - data/test/cases/adapters/postgresql/network_test.rb +94 -0
 - data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
 - data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
 - data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
 - data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
 - data/test/cases/adapters/postgresql/range_test.rb +343 -0
 - data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
 - data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
 - data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
 - data/test/cases/adapters/postgresql/schema_test.rb +597 -0
 - data/test/cases/adapters/postgresql/serial_test.rb +154 -0
 - data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
 - data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
 - data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
 - data/test/cases/adapters/postgresql/utils_test.rb +62 -0
 - data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
 - data/test/cases/adapters/postgresql/xml_test.rb +54 -0
 - data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
 - data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
 - data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
 - data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
 - data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
 - data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
 - data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
 - data/test/cases/aggregations_test.rb +11 -1
 - data/test/cases/ar_schema_test.rb +35 -50
 - data/test/cases/associations/association_scope_test.rb +1 -6
 - data/test/cases/associations/belongs_to_associations_test.rb +122 -10
 - data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
 - data/test/cases/associations/callbacks_test.rb +5 -7
 - data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
 - data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
 - data/test/cases/associations/eager_test.rb +158 -73
 - data/test/cases/associations/extension_test.rb +7 -2
 - data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
 - data/test/cases/associations/has_many_associations_test.rb +362 -43
 - data/test/cases/associations/has_many_through_associations_test.rb +108 -41
 - data/test/cases/associations/has_one_associations_test.rb +105 -8
 - data/test/cases/associations/has_one_through_associations_test.rb +6 -3
 - data/test/cases/associations/inner_join_association_test.rb +3 -3
 - data/test/cases/associations/inverse_associations_test.rb +38 -11
 - data/test/cases/associations/join_model_test.rb +59 -36
 - data/test/cases/associations/left_outer_join_association_test.rb +88 -0
 - data/test/cases/associations/nested_through_associations_test.rb +2 -2
 - data/test/cases/associations/required_test.rb +25 -5
 - data/test/cases/associations_test.rb +39 -34
 - data/test/cases/attribute_decorators_test.rb +9 -8
 - data/test/cases/attribute_methods/read_test.rb +5 -5
 - data/test/cases/attribute_methods_test.rb +97 -40
 - data/test/cases/attribute_set_test.rb +64 -4
 - data/test/cases/attribute_test.rb +84 -18
 - data/test/cases/attributes_test.rb +151 -34
 - data/test/cases/autosave_association_test.rb +149 -36
 - data/test/cases/base_test.rb +290 -241
 - data/test/cases/batches_test.rb +299 -22
 - data/test/cases/binary_test.rb +2 -10
 - data/test/cases/bind_parameter_test.rb +76 -66
 - data/test/cases/cache_key_test.rb +26 -0
 - data/test/cases/calculations_test.rb +167 -15
 - data/test/cases/callbacks_test.rb +161 -68
 - data/test/cases/coders/json_test.rb +15 -0
 - data/test/cases/collection_cache_key_test.rb +115 -0
 - data/test/cases/column_definition_test.rb +26 -57
 - data/test/cases/comment_test.rb +145 -0
 - data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
 - data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
 - data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
 - data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
 - data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
 - data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
 - data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
 - data/test/cases/connection_management_test.rb +46 -56
 - data/test/cases/connection_pool_test.rb +195 -20
 - data/test/cases/connection_specification/resolver_test.rb +15 -0
 - data/test/cases/counter_cache_test.rb +10 -5
 - data/test/cases/custom_locking_test.rb +1 -1
 - data/test/cases/database_statements_test.rb +18 -3
 - data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
 - data/test/cases/date_time_precision_test.rb +107 -0
 - data/test/cases/defaults_test.rb +85 -89
 - data/test/cases/dirty_test.rb +30 -52
 - data/test/cases/disconnected_test.rb +4 -2
 - data/test/cases/enum_test.rb +178 -24
 - data/test/cases/errors_test.rb +16 -0
 - data/test/cases/explain_test.rb +32 -21
 - data/test/cases/finder_test.rb +273 -148
 - data/test/cases/fixture_set/file_test.rb +18 -0
 - data/test/cases/fixtures_test.rb +112 -32
 - data/test/cases/forbidden_attributes_protection_test.rb +69 -3
 - data/test/cases/helper.rb +10 -16
 - data/test/cases/hot_compatibility_test.rb +89 -1
 - data/test/cases/inheritance_test.rb +284 -53
 - data/test/cases/integration_test.rb +23 -7
 - data/test/cases/invalid_connection_test.rb +4 -2
 - data/test/cases/invertible_migration_test.rb +124 -32
 - data/test/cases/json_serialization_test.rb +11 -2
 - data/test/cases/locking_test.rb +22 -6
 - data/test/cases/log_subscriber_test.rb +106 -17
 - data/test/cases/migration/change_schema_test.rb +60 -114
 - data/test/cases/migration/change_table_test.rb +34 -2
 - data/test/cases/migration/column_attributes_test.rb +7 -23
 - data/test/cases/migration/column_positioning_test.rb +8 -8
 - data/test/cases/migration/columns_test.rb +17 -11
 - data/test/cases/migration/command_recorder_test.rb +47 -2
 - data/test/cases/migration/compatibility_test.rb +118 -0
 - data/test/cases/migration/create_join_table_test.rb +21 -12
 - data/test/cases/migration/foreign_key_test.rb +52 -18
 - data/test/cases/migration/index_test.rb +14 -12
 - data/test/cases/migration/logger_test.rb +1 -1
 - data/test/cases/migration/pending_migrations_test.rb +0 -1
 - data/test/cases/migration/references_foreign_key_test.rb +59 -7
 - data/test/cases/migration/references_index_test.rb +4 -4
 - data/test/cases/migration/references_statements_test.rb +26 -6
 - data/test/cases/migration/rename_table_test.rb +25 -25
 - data/test/cases/migration_test.rb +279 -81
 - data/test/cases/migrator_test.rb +91 -8
 - data/test/cases/mixin_test.rb +0 -2
 - data/test/cases/modules_test.rb +3 -4
 - data/test/cases/multiparameter_attributes_test.rb +24 -2
 - data/test/cases/multiple_db_test.rb +11 -4
 - data/test/cases/nested_attributes_test.rb +61 -33
 - data/test/cases/persistence_test.rb +102 -10
 - data/test/cases/pooled_connections_test.rb +3 -3
 - data/test/cases/primary_keys_test.rb +170 -31
 - data/test/cases/query_cache_test.rb +216 -96
 - data/test/cases/quoting_test.rb +65 -19
 - data/test/cases/readonly_test.rb +2 -1
 - data/test/cases/reflection_test.rb +68 -22
 - data/test/cases/relation/delegation_test.rb +3 -8
 - data/test/cases/relation/merging_test.rb +10 -14
 - data/test/cases/relation/mutation_test.rb +42 -24
 - data/test/cases/relation/or_test.rb +92 -0
 - data/test/cases/relation/predicate_builder_test.rb +4 -2
 - data/test/cases/relation/record_fetch_warning_test.rb +40 -0
 - data/test/cases/relation/where_chain_test.rb +23 -99
 - data/test/cases/relation/where_clause_test.rb +182 -0
 - data/test/cases/relation/where_test.rb +45 -23
 - data/test/cases/relation_test.rb +67 -58
 - data/test/cases/relations_test.rb +249 -38
 - data/test/cases/result_test.rb +10 -0
 - data/test/cases/sanitize_test.rb +108 -15
 - data/test/cases/schema_dumper_test.rb +119 -125
 - data/test/cases/schema_loading_test.rb +52 -0
 - data/test/cases/scoping/default_scoping_test.rb +113 -39
 - data/test/cases/scoping/named_scoping_test.rb +46 -9
 - data/test/cases/scoping/relation_scoping_test.rb +47 -4
 - data/test/cases/secure_token_test.rb +32 -0
 - data/test/cases/serialization_test.rb +1 -1
 - data/test/cases/serialized_attribute_test.rb +93 -6
 - data/test/cases/statement_cache_test.rb +38 -0
 - data/test/cases/store_test.rb +2 -1
 - data/test/cases/suppressor_test.rb +63 -0
 - data/test/cases/tasks/database_tasks_test.rb +73 -9
 - data/test/cases/tasks/mysql_rake_test.rb +139 -118
 - data/test/cases/tasks/postgresql_rake_test.rb +60 -6
 - data/test/cases/tasks/sqlite_rake_test.rb +30 -3
 - data/test/cases/test_case.rb +28 -20
 - data/test/cases/test_fixtures_test.rb +36 -0
 - data/test/cases/time_precision_test.rb +103 -0
 - data/test/cases/timestamp_test.rb +44 -10
 - data/test/cases/touch_later_test.rb +121 -0
 - data/test/cases/transaction_callbacks_test.rb +128 -62
 - data/test/cases/transaction_isolation_test.rb +2 -2
 - data/test/cases/transactions_test.rb +61 -43
 - data/test/cases/type/adapter_specific_registry_test.rb +133 -0
 - data/test/cases/type/date_time_test.rb +14 -0
 - data/test/cases/type/integer_test.rb +2 -96
 - data/test/cases/type/string_test.rb +0 -14
 - data/test/cases/type_test.rb +39 -0
 - data/test/cases/types_test.rb +1 -118
 - data/test/cases/unconnected_test.rb +1 -1
 - data/test/cases/validations/absence_validation_test.rb +73 -0
 - data/test/cases/validations/association_validation_test.rb +13 -2
 - data/test/cases/validations/i18n_validation_test.rb +6 -10
 - data/test/cases/validations/length_validation_test.rb +62 -30
 - data/test/cases/validations/presence_validation_test.rb +36 -1
 - data/test/cases/validations/uniqueness_validation_test.rb +128 -37
 - data/test/cases/validations_repair_helper.rb +2 -6
 - data/test/cases/validations_test.rb +36 -7
 - data/test/cases/view_test.rb +102 -5
 - data/test/cases/yaml_serialization_test.rb +21 -26
 - data/test/config.example.yml +97 -0
 - data/test/fixtures/bad_posts.yml +9 -0
 - data/test/fixtures/books.yml +20 -0
 - data/test/fixtures/content.yml +3 -0
 - data/test/fixtures/content_positions.yml +3 -0
 - data/test/fixtures/dead_parrots.yml +5 -0
 - data/test/fixtures/live_parrots.yml +4 -0
 - data/test/fixtures/naked/yml/parrots.yml +2 -0
 - data/test/fixtures/naked/yml/trees.yml +3 -0
 - data/test/fixtures/nodes.yml +29 -0
 - data/test/fixtures/other_comments.yml +6 -0
 - data/test/fixtures/other_dogs.yml +2 -0
 - data/test/fixtures/other_posts.yml +7 -0
 - data/test/fixtures/price_estimates.yml +10 -1
 - data/test/fixtures/trees.yml +3 -0
 - data/test/migrations/10_urban/9_add_expressions.rb +1 -1
 - data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
 - data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
 - data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
 - data/test/migrations/missing/1_people_have_last_names.rb +2 -2
 - data/test/migrations/missing/3_we_need_reminders.rb +2 -2
 - data/test/migrations/missing/4_innocent_jointable.rb +2 -2
 - data/test/migrations/rename/1_we_need_things.rb +2 -2
 - data/test/migrations/rename/2_rename_things.rb +2 -2
 - data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
 - data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
 - data/test/migrations/to_copy2/1_create_articles.rb +1 -1
 - data/test/migrations/to_copy2/2_create_comments.rb +1 -1
 - data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
 - data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
 - data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
 - data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
 - data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
 - data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
 - data/test/migrations/valid/2_we_need_reminders.rb +2 -2
 - data/test/migrations/valid/3_innocent_jointable.rb +2 -2
 - data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
 - data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
 - data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
 - data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
 - data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
 - data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
 - data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
 - data/test/models/admin/randomly_named_c1.rb +6 -2
 - data/test/models/aircraft.rb +1 -0
 - data/test/models/author.rb +4 -7
 - data/test/models/bird.rb +1 -1
 - data/test/models/book.rb +5 -0
 - data/test/models/bulb.rb +2 -1
 - data/test/models/car.rb +3 -0
 - data/test/models/cat.rb +10 -0
 - data/test/models/chef.rb +1 -0
 - data/test/models/club.rb +2 -0
 - data/test/models/comment.rb +17 -5
 - data/test/models/company.rb +4 -2
 - data/test/models/company_in_module.rb +1 -1
 - data/test/models/contact.rb +1 -1
 - data/test/models/content.rb +40 -0
 - data/test/models/customer.rb +8 -2
 - data/test/models/developer.rb +19 -0
 - data/test/models/face.rb +1 -1
 - data/test/models/guitar.rb +4 -0
 - data/test/models/hotel.rb +2 -0
 - data/test/models/member.rb +1 -0
 - data/test/models/member_detail.rb +4 -3
 - data/test/models/mentor.rb +3 -0
 - data/test/models/mocktail_designer.rb +2 -0
 - data/test/models/node.rb +5 -0
 - data/test/models/non_primary_key.rb +2 -0
 - data/test/models/notification.rb +3 -0
 - data/test/models/other_dog.rb +5 -0
 - data/test/models/owner.rb +4 -1
 - data/test/models/parrot.rb +6 -7
 - data/test/models/person.rb +0 -1
 - data/test/models/pet.rb +3 -0
 - data/test/models/pet_treasure.rb +6 -0
 - data/test/models/pirate.rb +3 -3
 - data/test/models/post.rb +18 -9
 - data/test/models/project.rb +9 -0
 - data/test/models/randomly_named_c1.rb +1 -1
 - data/test/models/recipe.rb +3 -0
 - data/test/models/ship.rb +8 -2
 - data/test/models/tag.rb +6 -0
 - data/test/models/topic.rb +2 -8
 - data/test/models/tree.rb +3 -0
 - data/test/models/tuning_peg.rb +4 -0
 - data/test/models/user.rb +14 -0
 - data/test/models/uuid_item.rb +6 -0
 - data/test/schema/mysql2_specific_schema.rb +33 -23
 - data/test/schema/oracle_specific_schema.rb +1 -4
 - data/test/schema/postgresql_specific_schema.rb +36 -124
 - data/test/schema/schema.rb +170 -65
 - data/test/schema/schema.rb.original +1057 -0
 - data/test/schema/sqlite_specific_schema.rb +1 -5
 - data/test/support/connection.rb +1 -0
 - data/test/support/schema_dumping_helper.rb +1 -1
 - data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
 - data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
 - metadata +146 -30
 - data/lib/mswin32/rb19x/ibm_db.so +0 -0
 - data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
 - data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
 - data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
 - data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
 - data/test/cases/attribute_methods/serialization_test.rb +0 -29
 - data/test/cases/migration/change_schema_test - Copy.rb +0 -448
 - data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
 - data/test/cases/migration/table_and_index_test.rb +0 -24
 - data/test/cases/relation/where_test2.rb +0 -36
 - data/test/cases/type/decimal_test.rb +0 -56
 - data/test/cases/type/unsigned_integer_test.rb +0 -18
 - data/test/cases/xml_serialization_test.rb +0 -457
 - data/test/fixtures/naked/csv/accounts.csv +0 -1
 - data/test/schema/mysql_specific_schema.rb +0 -70
 
| 
         @@ -15,6 +15,7 @@ require 'models/essay' 
     | 
|
| 
       15 
15 
     | 
    
         
             
            require 'models/owner'
         
     | 
| 
       16 
16 
     | 
    
         
             
            require 'models/post'
         
     | 
| 
       17 
17 
     | 
    
         
             
            require 'models/comment'
         
     | 
| 
      
 18 
     | 
    
         
            +
            require 'models/categorization'
         
     | 
| 
       18 
19 
     | 
    
         
             
            require 'models/customer'
         
     | 
| 
       19 
20 
     | 
    
         
             
            require 'models/carrier'
         
     | 
| 
       20 
21 
     | 
    
         
             
            require 'models/shop_account'
         
     | 
| 
         @@ -22,7 +23,7 @@ require 'models/customer_carrier' 
     | 
|
| 
       22 
23 
     | 
    
         | 
| 
       23 
24 
     | 
    
         
             
            class HasOneThroughAssociationsTest < ActiveRecord::TestCase
         
     | 
| 
       24 
25 
     | 
    
         
             
              fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
         
     | 
| 
       25 
     | 
    
         
            -
                       :dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners 
     | 
| 
      
 26 
     | 
    
         
            +
                       :dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
              def setup
         
     | 
| 
       28 
29 
     | 
    
         
             
                @member = members(:groucho)
         
     | 
| 
         @@ -248,12 +249,14 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase 
     | 
|
| 
       248 
249 
     | 
    
         
             
                assert_not_nil @member_detail.member_type
         
     | 
| 
       249 
250 
     | 
    
         
             
                @member_detail.destroy
         
     | 
| 
       250 
251 
     | 
    
         
             
                assert_queries(1) do
         
     | 
| 
       251 
     | 
    
         
            -
                   
     | 
| 
      
 252 
     | 
    
         
            +
                  @member_detail.association(:member_type).reload
         
     | 
| 
      
 253 
     | 
    
         
            +
                  assert_not_nil @member_detail.member_type
         
     | 
| 
       252 
254 
     | 
    
         
             
                end
         
     | 
| 
       253 
255 
     | 
    
         | 
| 
       254 
256 
     | 
    
         
             
                @member_detail.member.destroy
         
     | 
| 
       255 
257 
     | 
    
         
             
                assert_queries(1) do
         
     | 
| 
       256 
     | 
    
         
            -
                   
     | 
| 
      
 258 
     | 
    
         
            +
                  @member_detail.association(:member_type).reload
         
     | 
| 
      
 259 
     | 
    
         
            +
                  assert_nil @member_detail.member_type
         
     | 
| 
       257 
260 
     | 
    
         
             
                end
         
     | 
| 
       258 
261 
     | 
    
         
             
              end
         
     | 
| 
       259 
262 
     | 
    
         | 
| 
         @@ -11,7 +11,7 @@ require 'models/tag' 
     | 
|
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
            class InnerJoinAssociationTest < ActiveRecord::TestCase
         
     | 
| 
       13 
13 
     | 
    
         
             
              fixtures :authors, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
         
     | 
| 
       14 
     | 
    
         
            -
                       :taggings, :tags 
     | 
| 
      
 14 
     | 
    
         
            +
                       :taggings, :tags
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
              def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
         
     | 
| 
       17 
17 
     | 
    
         
             
                result = Author.joins(:thinking_posts, :welcome_posts).to_a
         
     | 
| 
         @@ -54,7 +54,7 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase 
     | 
|
| 
       54 
54 
     | 
    
         
             
              def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
         
     | 
| 
       55 
55 
     | 
    
         
             
                authors = Author.joins(:posts)
         
     | 
| 
       56 
56 
     | 
    
         
             
                assert_not authors.empty?, "expected authors to be non-empty"
         
     | 
| 
       57 
     | 
    
         
            -
                assert authors.none? 
     | 
| 
      
 57 
     | 
    
         
            +
                assert authors.none?(&:readonly?), "expected no authors to be readonly"
         
     | 
| 
       58 
58 
     | 
    
         
             
              end
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
60 
     | 
    
         
             
              def test_find_with_implicit_inner_joins_honors_readonly_with_select
         
     | 
| 
         @@ -102,7 +102,7 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase 
     | 
|
| 
       102 
102 
     | 
    
         | 
| 
       103 
103 
     | 
    
         
             
              def test_find_with_conditions_on_reflection
         
     | 
| 
       104 
104 
     | 
    
         
             
                assert !posts(:welcome).comments.empty?
         
     | 
| 
       105 
     | 
    
         
            -
                assert Post.joins(: 
     | 
| 
      
 105 
     | 
    
         
            +
                assert Post.joins(:nonexistent_comments).where(:id => posts(:welcome).id).empty? # [sic!]
         
     | 
| 
       106 
106 
     | 
    
         
             
              end
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
       108 
108 
     | 
    
         
             
              def test_find_with_conditions_on_through_reflection
         
     | 
| 
         @@ -83,10 +83,10 @@ class AutomaticInverseFindingTests < ActiveRecord::TestCase 
     | 
|
| 
       83 
83 
     | 
    
         | 
| 
       84 
84 
     | 
    
         
             
                assert_equal rating.comment, comment, "The Rating's comment should be the original Comment"
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                rating.comment.body = " 
     | 
| 
      
 86 
     | 
    
         
            +
                rating.comment.body = "Fennec foxes are the smallest of the foxes."
         
     | 
| 
       87 
87 
     | 
    
         
             
                assert_equal rating.comment.body, comment.body, "Changing the Comment's body on the association should change the original Comment's body"
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
                comment.body = " 
     | 
| 
      
 89 
     | 
    
         
            +
                comment.body = "Kittens are adorable."
         
     | 
| 
       90 
90 
     | 
    
         
             
                assert_equal comment.body, rating.comment.body, "Changing the original Comment's body should change the Comment's body on the association"
         
     | 
| 
       91 
91 
     | 
    
         
             
              end
         
     | 
| 
       92 
92 
     | 
    
         | 
| 
         @@ -97,10 +97,10 @@ class AutomaticInverseFindingTests < ActiveRecord::TestCase 
     | 
|
| 
       97 
97 
     | 
    
         | 
| 
       98 
98 
     | 
    
         
             
                assert_equal rating.comment, comment, "The Rating's comment should be the original Comment"
         
     | 
| 
       99 
99 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
                rating.comment.body = " 
     | 
| 
      
 100 
     | 
    
         
            +
                rating.comment.body = "Fennec foxes are the smallest of the foxes."
         
     | 
| 
       101 
101 
     | 
    
         
             
                assert_equal rating.comment.body, comment.body, "Changing the Comment's body on the association should change the original Comment's body"
         
     | 
| 
       102 
102 
     | 
    
         | 
| 
       103 
     | 
    
         
            -
                comment.body = " 
     | 
| 
      
 103 
     | 
    
         
            +
                comment.body = "Kittens are adorable."
         
     | 
| 
       104 
104 
     | 
    
         
             
                assert_equal comment.body, rating.comment.body, "Changing the original Comment's body should change the Comment's body on the association"
         
     | 
| 
       105 
105 
     | 
    
         
             
              end
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
         @@ -130,15 +130,15 @@ end 
     | 
|
| 
       130 
130 
     | 
    
         | 
| 
       131 
131 
     | 
    
         
             
            class InverseAssociationTests < ActiveRecord::TestCase
         
     | 
| 
       132 
132 
     | 
    
         
             
              def test_should_allow_for_inverse_of_options_in_associations
         
     | 
| 
       133 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 133 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
       134 
134 
     | 
    
         
             
                  Class.new(ActiveRecord::Base).has_many(:wheels, :inverse_of => :car)
         
     | 
| 
       135 
135 
     | 
    
         
             
                end
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 137 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
       138 
138 
     | 
    
         
             
                  Class.new(ActiveRecord::Base).has_one(:engine, :inverse_of => :car)
         
     | 
| 
       139 
139 
     | 
    
         
             
                end
         
     | 
| 
       140 
140 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 141 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
       142 
142 
     | 
    
         
             
                  Class.new(ActiveRecord::Base).belongs_to(:car, :inverse_of => :driver)
         
     | 
| 
       143 
143 
     | 
    
         
             
                end
         
     | 
| 
       144 
144 
     | 
    
         
             
              end
         
     | 
| 
         @@ -495,6 +495,33 @@ class InverseHasManyTests < ActiveRecord::TestCase 
     | 
|
| 
       495 
495 
     | 
    
         | 
| 
       496 
496 
     | 
    
         
             
                assert !man.persisted?
         
     | 
| 
       497 
497 
     | 
    
         
             
              end
         
     | 
| 
      
 498 
     | 
    
         
            +
             
     | 
| 
      
 499 
     | 
    
         
            +
              def test_inverse_instance_should_be_set_before_find_callbacks_are_run
         
     | 
| 
      
 500 
     | 
    
         
            +
                reset_callbacks(Interest, :find) do
         
     | 
| 
      
 501 
     | 
    
         
            +
                  Interest.after_find { raise unless association(:man).loaded? && man.present? }
         
     | 
| 
      
 502 
     | 
    
         
            +
             
     | 
| 
      
 503 
     | 
    
         
            +
                  assert Man.first.interests.reload.any?
         
     | 
| 
      
 504 
     | 
    
         
            +
                  assert Man.includes(:interests).first.interests.any?
         
     | 
| 
      
 505 
     | 
    
         
            +
                  assert Man.joins(:interests).includes(:interests).first.interests.any?
         
     | 
| 
      
 506 
     | 
    
         
            +
                end
         
     | 
| 
      
 507 
     | 
    
         
            +
              end
         
     | 
| 
      
 508 
     | 
    
         
            +
             
     | 
| 
      
 509 
     | 
    
         
            +
              def test_inverse_instance_should_be_set_before_initialize_callbacks_are_run
         
     | 
| 
      
 510 
     | 
    
         
            +
                reset_callbacks(Interest, :initialize) do
         
     | 
| 
      
 511 
     | 
    
         
            +
                  Interest.after_initialize { raise unless association(:man).loaded? && man.present? }
         
     | 
| 
      
 512 
     | 
    
         
            +
             
     | 
| 
      
 513 
     | 
    
         
            +
                  assert Man.first.interests.reload.any?
         
     | 
| 
      
 514 
     | 
    
         
            +
                  assert Man.includes(:interests).first.interests.any?
         
     | 
| 
      
 515 
     | 
    
         
            +
                  assert Man.joins(:interests).includes(:interests).first.interests.any?
         
     | 
| 
      
 516 
     | 
    
         
            +
                end
         
     | 
| 
      
 517 
     | 
    
         
            +
              end
         
     | 
| 
      
 518 
     | 
    
         
            +
             
     | 
| 
      
 519 
     | 
    
         
            +
              def reset_callbacks(target, type)
         
     | 
| 
      
 520 
     | 
    
         
            +
                old_callbacks = target.send(:get_callbacks, type).deep_dup
         
     | 
| 
      
 521 
     | 
    
         
            +
                yield
         
     | 
| 
      
 522 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 523 
     | 
    
         
            +
                target.send(:set_callbacks, type, old_callbacks) if old_callbacks
         
     | 
| 
      
 524 
     | 
    
         
            +
              end
         
     | 
| 
       498 
525 
     | 
    
         
             
            end
         
     | 
| 
       499 
526 
     | 
    
         | 
| 
       500 
527 
     | 
    
         
             
            class InverseBelongsToTests < ActiveRecord::TestCase
         
     | 
| 
         @@ -666,7 +693,7 @@ class InversePolymorphicBelongsToTests < ActiveRecord::TestCase 
     | 
|
| 
       666 
693 
     | 
    
         | 
| 
       667 
694 
     | 
    
         
             
              def test_trying_to_access_inverses_that_dont_exist_shouldnt_raise_an_error
         
     | 
| 
       668 
695 
     | 
    
         
             
                # Ideally this would, if only for symmetry's sake with other association types
         
     | 
| 
       669 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 696 
     | 
    
         
            +
                assert_nothing_raised { Face.first.horrible_polymorphic_man }
         
     | 
| 
       670 
697 
     | 
    
         
             
              end
         
     | 
| 
       671 
698 
     | 
    
         | 
| 
       672 
699 
     | 
    
         
             
              def test_trying_to_set_polymorphic_inverses_that_dont_exist_at_all_should_raise_an_error
         
     | 
| 
         @@ -676,7 +703,7 @@ class InversePolymorphicBelongsToTests < ActiveRecord::TestCase 
     | 
|
| 
       676 
703 
     | 
    
         | 
| 
       677 
704 
     | 
    
         
             
              def test_trying_to_set_polymorphic_inverses_that_dont_exist_on_the_instance_being_set_should_raise_an_error
         
     | 
| 
       678 
705 
     | 
    
         
             
                # passes because Man does have the correct inverse_of
         
     | 
| 
       679 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 706 
     | 
    
         
            +
                assert_nothing_raised { Face.first.polymorphic_man = Man.first }
         
     | 
| 
       680 
707 
     | 
    
         
             
                # fails because Interest does have the correct inverse_of
         
     | 
| 
       681 
708 
     | 
    
         
             
                assert_raise(ActiveRecord::InverseOfAssociationNotFoundError) { Face.first.polymorphic_man = Interest.first }
         
     | 
| 
       682 
709 
     | 
    
         
             
              end
         
     | 
| 
         @@ -688,7 +715,7 @@ class InverseMultipleHasManyInversesForSameModel < ActiveRecord::TestCase 
     | 
|
| 
       688 
715 
     | 
    
         
             
              fixtures :men, :interests, :zines
         
     | 
| 
       689 
716 
     | 
    
         | 
| 
       690 
717 
     | 
    
         
             
              def test_that_we_can_load_associations_that_have_the_same_reciprocal_name_from_different_models
         
     | 
| 
       691 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 718 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
       692 
719 
     | 
    
         
             
                  i = Interest.first
         
     | 
| 
       693 
720 
     | 
    
         
             
                  i.zine
         
     | 
| 
       694 
721 
     | 
    
         
             
                  i.man
         
     | 
| 
         @@ -696,7 +723,7 @@ class InverseMultipleHasManyInversesForSameModel < ActiveRecord::TestCase 
     | 
|
| 
       696 
723 
     | 
    
         
             
              end
         
     | 
| 
       697 
724 
     | 
    
         | 
| 
       698 
725 
     | 
    
         
             
              def test_that_we_can_create_associations_that_have_the_same_reciprocal_name_from_different_models
         
     | 
| 
       699 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 726 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
       700 
727 
     | 
    
         
             
                  i = Interest.first
         
     | 
| 
       701 
728 
     | 
    
         
             
                  i.build_zine(:title => 'Get Some in Winter! 2008')
         
     | 
| 
       702 
729 
     | 
    
         
             
                  i.build_man(:name => 'Gordon')
         
     | 
| 
         @@ -17,9 +17,9 @@ require 'models/engine' 
     | 
|
| 
       17 
17 
     | 
    
         
             
            require 'models/car'
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
            class AssociationsJoinModelTest < ActiveRecord::TestCase
         
     | 
| 
       20 
     | 
    
         
            -
              self. 
     | 
| 
      
 20 
     | 
    
         
            +
              self.use_transactional_tests = false unless supports_savepoints?
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
              fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books, 
     | 
| 
      
 22 
     | 
    
         
            +
              fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books,
         
     | 
| 
       23 
23 
     | 
    
         
             
                # Reload edges table from fixtures as otherwise repeated test was failing
         
     | 
| 
       24 
24 
     | 
    
         
             
                :edges
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
         @@ -35,12 +35,12 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       35 
35 
     | 
    
         
             
                assert categories(:sti_test).authors.include?(authors(:mary))
         
     | 
| 
       36 
36 
     | 
    
         
             
              end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
              def  
     | 
| 
      
 38 
     | 
    
         
            +
              def test_has_many_distinct_through_join_model
         
     | 
| 
       39 
39 
     | 
    
         
             
                assert_equal 2, authors(:mary).categorized_posts.size
         
     | 
| 
       40 
40 
     | 
    
         
             
                assert_equal 1, authors(:mary).unique_categorized_posts.size
         
     | 
| 
       41 
41 
     | 
    
         
             
              end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
              def  
     | 
| 
      
 43 
     | 
    
         
            +
              def test_has_many_distinct_through_count
         
     | 
| 
       44 
44 
     | 
    
         
             
                author = authors(:mary)
         
     | 
| 
       45 
45 
     | 
    
         
             
                assert !authors(:mary).unique_categorized_posts.loaded?
         
     | 
| 
       46 
46 
     | 
    
         
             
                assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count }
         
     | 
| 
         @@ -49,7 +49,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       49 
49 
     | 
    
         
             
                assert !authors(:mary).unique_categorized_posts.loaded?
         
     | 
| 
       50 
50 
     | 
    
         
             
              end
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
              def  
     | 
| 
      
 52 
     | 
    
         
            +
              def test_has_many_distinct_through_find
         
     | 
| 
       53 
53 
     | 
    
         
             
                assert_equal 1, authors(:mary).unique_categorized_posts.to_a.size
         
     | 
| 
       54 
54 
     | 
    
         
             
              end
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
         @@ -88,7 +88,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
              def test_polymorphic_has_many_going_through_join_model_with_custom_select_and_joins
         
     | 
| 
       90 
90 
     | 
    
         
             
                assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
         
     | 
| 
       91 
     | 
    
         
            -
                assert_nothing_raised 
     | 
| 
      
 91 
     | 
    
         
            +
                assert_nothing_raised { tag.author_id }
         
     | 
| 
       92 
92 
     | 
    
         
             
              end
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
94 
     | 
    
         
             
              def test_polymorphic_has_many_going_through_join_model_with_custom_foreign_key
         
     | 
| 
         @@ -213,7 +213,8 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       213 
213 
     | 
    
         
             
                old_count = Tagging.count
         
     | 
| 
       214 
214 
     | 
    
         
             
                post.destroy
         
     | 
| 
       215 
215 
     | 
    
         
             
                assert_equal old_count-1, Tagging.count
         
     | 
| 
       216 
     | 
    
         
            -
                 
     | 
| 
      
 216 
     | 
    
         
            +
                posts(:welcome).association(:tagging).reload
         
     | 
| 
      
 217 
     | 
    
         
            +
                assert_nil posts(:welcome).tagging
         
     | 
| 
       217 
218 
     | 
    
         
             
              end
         
     | 
| 
       218 
219 
     | 
    
         | 
| 
       219 
220 
     | 
    
         
             
              def test_delete_polymorphic_has_one_with_nullify
         
     | 
| 
         @@ -224,7 +225,8 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       224 
225 
     | 
    
         
             
                old_count = Tagging.count
         
     | 
| 
       225 
226 
     | 
    
         
             
                post.destroy
         
     | 
| 
       226 
227 
     | 
    
         
             
                assert_equal old_count, Tagging.count
         
     | 
| 
       227 
     | 
    
         
            -
                 
     | 
| 
      
 228 
     | 
    
         
            +
                posts(:welcome).association(:tagging).reload
         
     | 
| 
      
 229 
     | 
    
         
            +
                assert_nil posts(:welcome).tagging
         
     | 
| 
       228 
230 
     | 
    
         
             
              end
         
     | 
| 
       229 
231 
     | 
    
         | 
| 
       230 
232 
     | 
    
         
             
              def test_has_many_with_piggyback
         
     | 
| 
         @@ -361,6 +363,13 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       361 
363 
     | 
    
         
             
                assert_equal posts(:welcome, :thinking).sort_by(&:id), tags(:general).tagged_posts.sort_by(&:id)
         
     | 
| 
       362 
364 
     | 
    
         
             
              end
         
     | 
| 
       363 
365 
     | 
    
         | 
| 
      
 366 
     | 
    
         
            +
              def test_has_many_polymorphic_associations_merges_through_scope
         
     | 
| 
      
 367 
     | 
    
         
            +
                Tag.has_many :null_taggings, -> { none }, class_name: :Tagging
         
     | 
| 
      
 368 
     | 
    
         
            +
                Tag.has_many :null_tagged_posts, :through => :null_taggings, :source => 'taggable', :source_type => 'Post'
         
     | 
| 
      
 369 
     | 
    
         
            +
                assert_equal [], tags(:general).null_tagged_posts
         
     | 
| 
      
 370 
     | 
    
         
            +
                refute_equal [], tags(:general).tagged_posts
         
     | 
| 
      
 371 
     | 
    
         
            +
              end
         
     | 
| 
      
 372 
     | 
    
         
            +
             
     | 
| 
       364 
373 
     | 
    
         
             
              def test_eager_has_many_polymorphic_with_source_type
         
     | 
| 
       365 
374 
     | 
    
         
             
                tag_with_include = Tag.all.merge!(:includes => :tagged_posts).find(tags(:general).id)
         
     | 
| 
       366 
375 
     | 
    
         
             
                desired = posts(:welcome, :thinking)
         
     | 
| 
         @@ -393,32 +402,29 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       393 
402 
     | 
    
         
             
              end
         
     | 
| 
       394 
403 
     | 
    
         | 
| 
       395 
404 
     | 
    
         
             
              def test_has_many_through_polymorphic_has_one
         
     | 
| 
       396 
     | 
    
         
            -
                assert_equal Tagging.find(1,2).sort_by 
     | 
| 
      
 405 
     | 
    
         
            +
                assert_equal Tagging.find(1,2).sort_by(&:id), authors(:david).taggings_2
         
     | 
| 
       397 
406 
     | 
    
         
             
              end
         
     | 
| 
       398 
407 
     | 
    
         | 
| 
       399 
408 
     | 
    
         
             
              def test_has_many_through_polymorphic_has_many
         
     | 
| 
       400 
     | 
    
         
            -
                assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.distinct.sort_by 
     | 
| 
      
 409 
     | 
    
         
            +
                assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.distinct.sort_by(&:id)
         
     | 
| 
       401 
410 
     | 
    
         
             
              end
         
     | 
| 
       402 
411 
     | 
    
         | 
| 
       403 
412 
     | 
    
         
             
              def test_include_has_many_through_polymorphic_has_many
         
     | 
| 
       404 
413 
     | 
    
         
             
                author            = Author.includes(:taggings).find authors(:david).id
         
     | 
| 
       405 
414 
     | 
    
         
             
                expected_taggings = taggings(:welcome_general, :thinking_general)
         
     | 
| 
       406 
415 
     | 
    
         
             
                assert_no_queries do
         
     | 
| 
       407 
     | 
    
         
            -
                  assert_equal expected_taggings, author.taggings.distinct.sort_by 
     | 
| 
      
 416 
     | 
    
         
            +
                  assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
         
     | 
| 
       408 
417 
     | 
    
         
             
                end
         
     | 
| 
       409 
418 
     | 
    
         
             
              end
         
     | 
| 
       410 
419 
     | 
    
         | 
| 
       411 
     | 
    
         
            -
               
     | 
| 
       412 
     | 
    
         
            -
                 
     | 
| 
       413 
     | 
    
         
            -
                 
     | 
| 
       414 
     | 
    
         
            -
             
     | 
| 
       415 
     | 
    
         
            -
                   
     | 
| 
       416 
     | 
    
         
            -
                  assert_no_queries do
         
     | 
| 
       417 
     | 
    
         
            -
                    assert_equal [1,2,3,5,6,7,8,9,10,12], author.comments.collect(&:id)
         
     | 
| 
       418 
     | 
    
         
            -
                  end
         
     | 
| 
      
 420 
     | 
    
         
            +
              def test_eager_load_has_many_through_has_many
         
     | 
| 
      
 421 
     | 
    
         
            +
                author = Author.all.merge!(:where => ['name = ?', 'David'], :includes => :comments, :order => 'comments.id').first
         
     | 
| 
      
 422 
     | 
    
         
            +
                SpecialComment.new; VerySpecialComment.new
         
     | 
| 
      
 423 
     | 
    
         
            +
                assert_no_queries do
         
     | 
| 
      
 424 
     | 
    
         
            +
                  assert_equal [1,2,3,5,6,7,8,9,10,12], author.comments.collect(&:id)
         
     | 
| 
       419 
425 
     | 
    
         
             
                end
         
     | 
| 
       420 
426 
     | 
    
         
             
              end
         
     | 
| 
       421 
     | 
    
         
            -
             
     | 
| 
      
 427 
     | 
    
         
            +
             
     | 
| 
       422 
428 
     | 
    
         
             
              def test_eager_load_has_many_through_has_many_with_conditions
         
     | 
| 
       423 
429 
     | 
    
         
             
                post = Post.all.merge!(:includes => :invalid_tags).first
         
     | 
| 
       424 
430 
     | 
    
         
             
                assert_no_queries do
         
     | 
| 
         @@ -447,7 +453,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       447 
453 
     | 
    
         
             
              def test_has_many_through_uses_conditions_specified_on_the_has_many_association
         
     | 
| 
       448 
454 
     | 
    
         
             
                author = Author.first
         
     | 
| 
       449 
455 
     | 
    
         
             
                assert author.comments.present?
         
     | 
| 
       450 
     | 
    
         
            -
                assert author. 
     | 
| 
      
 456 
     | 
    
         
            +
                assert author.nonexistent_comments.blank?
         
     | 
| 
       451 
457 
     | 
    
         
             
              end
         
     | 
| 
       452 
458 
     | 
    
         | 
| 
       453 
459 
     | 
    
         
             
              def test_has_many_through_uses_correct_attributes
         
     | 
| 
         @@ -464,7 +470,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       464 
470 
     | 
    
         
             
                assert saved_post.tags.include?(new_tag)
         
     | 
| 
       465 
471 
     | 
    
         | 
| 
       466 
472 
     | 
    
         
             
                assert new_tag.persisted?
         
     | 
| 
       467 
     | 
    
         
            -
                assert saved_post.reload.tags 
     | 
| 
      
 473 
     | 
    
         
            +
                assert saved_post.reload.tags.reload.include?(new_tag)
         
     | 
| 
       468 
474 
     | 
    
         | 
| 
       469 
475 
     | 
    
         | 
| 
       470 
476 
     | 
    
         
             
                new_post = Post.new(:title => "Association replacement works!", :body => "You best believe it.")
         
     | 
| 
         @@ -477,7 +483,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       477 
483 
     | 
    
         | 
| 
       478 
484 
     | 
    
         
             
                new_post.save!
         
     | 
| 
       479 
485 
     | 
    
         
             
                assert new_post.persisted?
         
     | 
| 
       480 
     | 
    
         
            -
                assert new_post.reload.tags 
     | 
| 
      
 486 
     | 
    
         
            +
                assert new_post.reload.tags.reload.include?(saved_tag)
         
     | 
| 
       481 
487 
     | 
    
         | 
| 
       482 
488 
     | 
    
         
             
                assert !posts(:thinking).tags.build.persisted?
         
     | 
| 
       483 
489 
     | 
    
         
             
                assert !posts(:thinking).tags.new.persisted?
         
     | 
| 
         @@ -493,7 +499,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       493 
499 
     | 
    
         
             
                assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
         
     | 
| 
       494 
500 
     | 
    
         
             
                            message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
         
     | 
| 
       495 
501 
     | 
    
         
             
                assert_equal(count + 1, post_thinking.reload.tags.size)
         
     | 
| 
       496 
     | 
    
         
            -
                assert_equal(count + 1, post_thinking.tags 
     | 
| 
      
 502 
     | 
    
         
            +
                assert_equal(count + 1, post_thinking.tags.reload.size)
         
     | 
| 
       497 
503 
     | 
    
         | 
| 
       498 
504 
     | 
    
         
             
                assert_kind_of Tag, post_thinking.tags.create!(:name => 'foo')
         
     | 
| 
       499 
505 
     | 
    
         
             
                assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
         
     | 
| 
         @@ -501,7 +507,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       501 
507 
     | 
    
         
             
                assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
         
     | 
| 
       502 
508 
     | 
    
         
             
                            message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
         
     | 
| 
       503 
509 
     | 
    
         
             
                assert_equal(count + 2, post_thinking.reload.tags.size)
         
     | 
| 
       504 
     | 
    
         
            -
                assert_equal(count + 2, post_thinking.tags 
     | 
| 
      
 510 
     | 
    
         
            +
                assert_equal(count + 2, post_thinking.tags.reload.size)
         
     | 
| 
       505 
511 
     | 
    
         | 
| 
       506 
512 
     | 
    
         
             
                assert_nothing_raised { post_thinking.tags.concat(Tag.create!(:name => 'abc'), Tag.create!(:name => 'def')) }
         
     | 
| 
       507 
513 
     | 
    
         
             
                assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
         
     | 
| 
         @@ -509,7 +515,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       509 
515 
     | 
    
         
             
                assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
         
     | 
| 
       510 
516 
     | 
    
         
             
                            message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
         
     | 
| 
       511 
517 
     | 
    
         
             
                assert_equal(count + 4, post_thinking.reload.tags.size)
         
     | 
| 
       512 
     | 
    
         
            -
                assert_equal(count + 4, post_thinking.tags 
     | 
| 
      
 518 
     | 
    
         
            +
                assert_equal(count + 4, post_thinking.tags.reload.size)
         
     | 
| 
       513 
519 
     | 
    
         | 
| 
       514 
520 
     | 
    
         
             
                # Raises if the wrong reflection name is used to set the Edge belongs_to
         
     | 
| 
       515 
521 
     | 
    
         
             
                assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
         
     | 
| 
         @@ -547,11 +553,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       547 
553 
     | 
    
         
             
                book = Book.create!(:name => 'Getting Real')
         
     | 
| 
       548 
554 
     | 
    
         
             
                book_awdr = books(:awdr)
         
     | 
| 
       549 
555 
     | 
    
         
             
                book_awdr.references << book
         
     | 
| 
       550 
     | 
    
         
            -
                assert_equal(count + 1, book_awdr.references 
     | 
| 
      
 556 
     | 
    
         
            +
                assert_equal(count + 1, book_awdr.references.reload.size)
         
     | 
| 
       551 
557 
     | 
    
         | 
| 
       552 
558 
     | 
    
         
             
                assert_nothing_raised { book_awdr.references.delete(book) }
         
     | 
| 
       553 
559 
     | 
    
         
             
                assert_equal(count, book_awdr.references.size)
         
     | 
| 
       554 
     | 
    
         
            -
                assert_equal(count, book_awdr.references 
     | 
| 
      
 560 
     | 
    
         
            +
                assert_equal(count, book_awdr.references.reload.size)
         
     | 
| 
       555 
561 
     | 
    
         
             
                assert_equal(references_before.sort, book_awdr.references.sort)
         
     | 
| 
       556 
562 
     | 
    
         
             
              end
         
     | 
| 
       557 
563 
     | 
    
         | 
| 
         @@ -561,14 +567,14 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       561 
567 
     | 
    
         
             
                tag = Tag.create!(:name => 'doomed')
         
     | 
| 
       562 
568 
     | 
    
         
             
                post_thinking = posts(:thinking)
         
     | 
| 
       563 
569 
     | 
    
         
             
                post_thinking.tags << tag
         
     | 
| 
       564 
     | 
    
         
            -
                assert_equal(count + 1, post_thinking.taggings 
     | 
| 
       565 
     | 
    
         
            -
                assert_equal(count + 1, post_thinking.reload.tags 
     | 
| 
      
 570 
     | 
    
         
            +
                assert_equal(count + 1, post_thinking.taggings.reload.size)
         
     | 
| 
      
 571 
     | 
    
         
            +
                assert_equal(count + 1, post_thinking.reload.tags.reload.size)
         
     | 
| 
       566 
572 
     | 
    
         
             
                assert_not_equal(tags_before, post_thinking.tags.sort)
         
     | 
| 
       567 
573 
     | 
    
         | 
| 
       568 
574 
     | 
    
         
             
                assert_nothing_raised { post_thinking.tags.delete(tag) }
         
     | 
| 
       569 
575 
     | 
    
         
             
                assert_equal(count, post_thinking.tags.size)
         
     | 
| 
       570 
     | 
    
         
            -
                assert_equal(count, post_thinking.tags 
     | 
| 
       571 
     | 
    
         
            -
                assert_equal(count, post_thinking.taggings 
     | 
| 
      
 576 
     | 
    
         
            +
                assert_equal(count, post_thinking.tags.reload.size)
         
     | 
| 
      
 577 
     | 
    
         
            +
                assert_equal(count, post_thinking.taggings.reload.size)
         
     | 
| 
       572 
578 
     | 
    
         
             
                assert_equal(tags_before, post_thinking.tags.sort)
         
     | 
| 
       573 
579 
     | 
    
         
             
              end
         
     | 
| 
       574 
580 
     | 
    
         | 
| 
         @@ -580,11 +586,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       580 
586 
     | 
    
         
             
                quaked = Tag.create!(:name => 'quaked')
         
     | 
| 
       581 
587 
     | 
    
         
             
                post_thinking = posts(:thinking)
         
     | 
| 
       582 
588 
     | 
    
         
             
                post_thinking.tags << doomed << doomed2
         
     | 
| 
       583 
     | 
    
         
            -
                assert_equal(count + 2, post_thinking.reload.tags 
     | 
| 
      
 589 
     | 
    
         
            +
                assert_equal(count + 2, post_thinking.reload.tags.reload.size)
         
     | 
| 
       584 
590 
     | 
    
         | 
| 
       585 
591 
     | 
    
         
             
                assert_nothing_raised { post_thinking.tags.delete(doomed, doomed2, quaked) }
         
     | 
| 
       586 
592 
     | 
    
         
             
                assert_equal(count, post_thinking.tags.size)
         
     | 
| 
       587 
     | 
    
         
            -
                assert_equal(count, post_thinking.tags 
     | 
| 
      
 593 
     | 
    
         
            +
                assert_equal(count, post_thinking.tags.reload.size)
         
     | 
| 
       588 
594 
     | 
    
         
             
                assert_equal(tags_before, post_thinking.tags.sort)
         
     | 
| 
       589 
595 
     | 
    
         
             
              end
         
     | 
| 
       590 
596 
     | 
    
         | 
| 
         @@ -592,7 +598,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       592 
598 
     | 
    
         
             
                assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags.delete(Object.new) }
         
     | 
| 
       593 
599 
     | 
    
         
             
              end
         
     | 
| 
       594 
600 
     | 
    
         | 
| 
       595 
     | 
    
         
            -
              def  
     | 
| 
      
 601 
     | 
    
         
            +
              def test_deleting_by_integer_id_from_has_many_through
         
     | 
| 
       596 
602 
     | 
    
         
             
                post = posts(:thinking)
         
     | 
| 
       597 
603 
     | 
    
         | 
| 
       598 
604 
     | 
    
         
             
                assert_difference 'post.tags.count', -1 do
         
     | 
| 
         @@ -628,7 +634,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       628 
634 
     | 
    
         
             
                assert_equal [comments(:does_it_hurt)], authors(:david).special_post_comments
         
     | 
| 
       629 
635 
     | 
    
         
             
              end
         
     | 
| 
       630 
636 
     | 
    
         | 
| 
       631 
     | 
    
         
            -
              def  
     | 
| 
      
 637 
     | 
    
         
            +
              def test_distinct_has_many_through_should_retain_order
         
     | 
| 
       632 
638 
     | 
    
         
             
                comment_ids = authors(:david).comments.map(&:id)
         
     | 
| 
       633 
639 
     | 
    
         
             
                assert_equal comment_ids.sort, authors(:david).ordered_uniq_comments.map(&:id)
         
     | 
| 
       634 
640 
     | 
    
         
             
                assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
         
     | 
| 
         @@ -741,6 +747,23 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase 
     | 
|
| 
       741 
747 
     | 
    
         
             
                assert_equal aircraft.engines, [engine]
         
     | 
| 
       742 
748 
     | 
    
         
             
              end
         
     | 
| 
       743 
749 
     | 
    
         | 
| 
      
 750 
     | 
    
         
            +
              def test_proper_error_message_for_eager_load_and_includes_association_errors
         
     | 
| 
      
 751 
     | 
    
         
            +
                includes_error = assert_raises(ActiveRecord::ConfigurationError) {
         
     | 
| 
      
 752 
     | 
    
         
            +
                  Post.includes(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
         
     | 
| 
      
 753 
     | 
    
         
            +
                }
         
     | 
| 
      
 754 
     | 
    
         
            +
                assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_error.message)
         
     | 
| 
      
 755 
     | 
    
         
            +
             
     | 
| 
      
 756 
     | 
    
         
            +
                eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
         
     | 
| 
      
 757 
     | 
    
         
            +
                  Post.eager_load(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
         
     | 
| 
      
 758 
     | 
    
         
            +
                }
         
     | 
| 
      
 759 
     | 
    
         
            +
                assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", eager_load_error.message)
         
     | 
| 
      
 760 
     | 
    
         
            +
             
     | 
| 
      
 761 
     | 
    
         
            +
                includes_and_eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
         
     | 
| 
      
 762 
     | 
    
         
            +
                  Post.eager_load(:nonexistent_relation).includes(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
         
     | 
| 
      
 763 
     | 
    
         
            +
                }
         
     | 
| 
      
 764 
     | 
    
         
            +
                assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_and_eager_load_error.message)
         
     | 
| 
      
 765 
     | 
    
         
            +
              end
         
     | 
| 
      
 766 
     | 
    
         
            +
             
     | 
| 
       744 
767 
     | 
    
         
             
              private
         
     | 
| 
       745 
768 
     | 
    
         
             
                # create dynamic Post models to allow different dependency options
         
     | 
| 
       746 
769 
     | 
    
         
             
                def find_post_with_dependency(post_id, association, association_name, dependency)
         
     | 
| 
         @@ -0,0 +1,88 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "cases/helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'models/post'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'models/comment'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'models/author'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'models/essay'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'models/categorization'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'models/person'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            class LeftOuterJoinAssociationTest < ActiveRecord::TestCase
         
     | 
| 
      
 10 
     | 
    
         
            +
              fixtures :authors, :essays, :posts, :comments, :categorizations, :people
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
         
     | 
| 
      
 13 
     | 
    
         
            +
                result = Author.left_outer_joins(:thinking_posts, :welcome_posts).to_a
         
     | 
| 
      
 14 
     | 
    
         
            +
                assert_equal authors(:david), result.first
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
         
     | 
| 
      
 18 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  queries = capture_sql do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    Person.left_outer_joins(:agents => {:agents => :agents})
         
     | 
| 
      
 21 
     | 
    
         
            +
                          .left_outer_joins(:agents => {:agents => {:primary_contact => :agents}}).to_a
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert queries.any? { |sql| /agents_people_4/i =~ sql }
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              def test_left_outer_joins_count_is_same_as_size_of_loaded_results
         
     | 
| 
      
 28 
     | 
    
         
            +
                assert_equal 17, Post.left_outer_joins(:comments).to_a.size
         
     | 
| 
      
 29 
     | 
    
         
            +
                assert_equal 17, Post.left_outer_joins(:comments).count
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              def test_left_joins_aliases_left_outer_joins
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert_equal Post.left_outer_joins(:comments).to_sql, Post.left_joins(:comments).to_sql
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              def test_left_outer_joins_return_has_value_for_every_comment
         
     | 
| 
      
 37 
     | 
    
         
            +
                all_post_ids = Post.pluck(:id)
         
     | 
| 
      
 38 
     | 
    
         
            +
                assert_equal all_post_ids, all_post_ids & Post.left_outer_joins(:comments).pluck(:id)
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              def test_left_outer_joins_actually_does_a_left_outer_join
         
     | 
| 
      
 42 
     | 
    
         
            +
                queries = capture_sql { Author.left_outer_joins(:posts).to_a }
         
     | 
| 
      
 43 
     | 
    
         
            +
                assert queries.any? { |sql| /LEFT OUTER JOIN/i =~ sql }
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              def test_construct_finder_sql_ignores_empty_left_outer_joins_hash
         
     | 
| 
      
 47 
     | 
    
         
            +
                queries = capture_sql { Author.left_outer_joins({}).to_a }
         
     | 
| 
      
 48 
     | 
    
         
            +
                assert queries.none? { |sql| /LEFT OUTER JOIN/i =~ sql }
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              def test_construct_finder_sql_ignores_empty_left_outer_joins_array
         
     | 
| 
      
 52 
     | 
    
         
            +
                queries = capture_sql { Author.left_outer_joins([]).to_a }
         
     | 
| 
      
 53 
     | 
    
         
            +
                assert queries.none? { |sql| /LEFT OUTER JOIN/i =~ sql }
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              def test_left_outer_joins_forbids_to_use_string_as_argument
         
     | 
| 
      
 57 
     | 
    
         
            +
                assert_raise(ArgumentError){ Author.left_outer_joins('LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"').to_a }
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              def test_join_conditions_added_to_join_clause
         
     | 
| 
      
 61 
     | 
    
         
            +
                queries = capture_sql { Author.left_outer_joins(:essays).to_a }
         
     | 
| 
      
 62 
     | 
    
         
            +
                assert queries.any? { |sql| /writer_type.*?=.*?(Author|\?|\$1)/i =~ sql }
         
     | 
| 
      
 63 
     | 
    
         
            +
                assert queries.none? { |sql| /WHERE/i =~ sql }
         
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              def test_find_with_sti_join
         
     | 
| 
      
 67 
     | 
    
         
            +
                scope = Post.left_outer_joins(:special_comments).where(:id => posts(:sti_comments).id)
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                # The join should match SpecialComment and its subclasses only
         
     | 
| 
      
 70 
     | 
    
         
            +
                assert scope.where("comments.type" => "Comment").empty?
         
     | 
| 
      
 71 
     | 
    
         
            +
                assert !scope.where("comments.type" => "SpecialComment").empty?
         
     | 
| 
      
 72 
     | 
    
         
            +
                assert !scope.where("comments.type" => "SubSpecialComment").empty?
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
              def test_does_not_override_select
         
     | 
| 
      
 76 
     | 
    
         
            +
                authors = Author.select("authors.name, #{%{(authors.author_address_id || ' ' || authors.author_address_extra_id) as addr_id}}").left_outer_joins(:posts)
         
     | 
| 
      
 77 
     | 
    
         
            +
                assert authors.any?
         
     | 
| 
      
 78 
     | 
    
         
            +
                assert authors.first.respond_to?(:addr_id)
         
     | 
| 
      
 79 
     | 
    
         
            +
              end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
              test "the default scope of the target is applied when joining associations" do
         
     | 
| 
      
 82 
     | 
    
         
            +
                author = Author.create! name: "Jon"
         
     | 
| 
      
 83 
     | 
    
         
            +
                author.categorizations.create!
         
     | 
| 
      
 84 
     | 
    
         
            +
                author.categorizations.create! special: true
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                assert_equal [author], Author.where(id: author).left_outer_joins(:special_categorizations)
         
     | 
| 
      
 87 
     | 
    
         
            +
              end
         
     | 
| 
      
 88 
     | 
    
         
            +
            end
         
     |