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
|