ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/ext/Makefile +15 -13
- data/ext/ibm_db.c +62 -57
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +190 -14
@@ -1,29 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
4
|
+
require "models/club"
|
5
|
+
require "models/member_type"
|
6
|
+
require "models/member"
|
7
|
+
require "models/membership"
|
8
|
+
require "models/sponsor"
|
9
|
+
require "models/organization"
|
10
|
+
require "models/member_detail"
|
11
|
+
require "models/minivan"
|
12
|
+
require "models/dashboard"
|
13
|
+
require "models/speedometer"
|
14
|
+
require "models/category"
|
15
|
+
require "models/author"
|
16
|
+
require "models/essay"
|
17
|
+
require "models/owner"
|
18
|
+
require "models/post"
|
19
|
+
require "models/comment"
|
20
|
+
require "models/categorization"
|
21
|
+
require "models/customer"
|
22
|
+
require "models/carrier"
|
23
|
+
require "models/shop_account"
|
24
|
+
require "models/customer_carrier"
|
23
25
|
|
24
26
|
class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
25
27
|
fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
|
26
|
-
:dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners
|
28
|
+
:dashboards, :speedometers, :authors, :author_addresses, :posts, :comments, :categories, :essays, :owners
|
27
29
|
|
28
30
|
def setup
|
29
31
|
@member = members(:groucho)
|
@@ -33,15 +35,34 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
33
35
|
assert_equal clubs(:boring_club), @member.club
|
34
36
|
end
|
35
37
|
|
38
|
+
def test_has_one_through_executes_limited_query
|
39
|
+
boring_club = clubs(:boring_club)
|
40
|
+
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) do
|
41
|
+
assert_equal boring_club, @member.general_club
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
36
45
|
def test_creating_association_creates_through_record
|
37
|
-
new_member = Member.create(:
|
38
|
-
new_member.club = Club.create(:
|
46
|
+
new_member = Member.create(name: "Chris")
|
47
|
+
new_member.club = Club.create(name: "LRUG")
|
39
48
|
assert_not_nil new_member.current_membership
|
40
49
|
assert_not_nil new_member.club
|
41
50
|
end
|
42
51
|
|
52
|
+
def test_creating_association_builds_through_record
|
53
|
+
new_member = Member.create(name: "Chris")
|
54
|
+
new_club = new_member.association(:club).build
|
55
|
+
assert new_member.current_membership
|
56
|
+
assert_equal new_club, new_member.club
|
57
|
+
assert_predicate new_club, :new_record?
|
58
|
+
assert_predicate new_member.current_membership, :new_record?
|
59
|
+
assert new_member.save
|
60
|
+
assert_predicate new_club, :persisted?
|
61
|
+
assert_predicate new_member.current_membership, :persisted?
|
62
|
+
end
|
63
|
+
|
43
64
|
def test_creating_association_builds_through_record_for_new
|
44
|
-
new_member = Member.new(:
|
65
|
+
new_member = Member.new(name: "Jane")
|
45
66
|
new_member.club = clubs(:moustache_club)
|
46
67
|
assert new_member.current_membership
|
47
68
|
assert_equal clubs(:moustache_club), new_member.current_membership.club
|
@@ -50,9 +71,27 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
50
71
|
assert_equal clubs(:moustache_club), new_member.club
|
51
72
|
end
|
52
73
|
|
74
|
+
def test_building_multiple_associations_builds_through_record
|
75
|
+
member_type = MemberType.create!
|
76
|
+
member = Member.create!
|
77
|
+
member_detail_with_one_association = MemberDetail.new(member_type: member_type)
|
78
|
+
assert_predicate member_detail_with_one_association.member, :new_record?
|
79
|
+
member_detail_with_two_associations = MemberDetail.new(member_type: member_type, admittable: member)
|
80
|
+
assert_predicate member_detail_with_two_associations.member, :new_record?
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_creating_multiple_associations_creates_through_record
|
84
|
+
member_type = MemberType.create!
|
85
|
+
member = Member.create!
|
86
|
+
member_detail_with_one_association = MemberDetail.create!(member_type: member_type)
|
87
|
+
assert_not_predicate member_detail_with_one_association.member, :new_record?
|
88
|
+
member_detail_with_two_associations = MemberDetail.create!(member_type: member_type, admittable: member)
|
89
|
+
assert_not_predicate member_detail_with_two_associations.member, :new_record?
|
90
|
+
end
|
91
|
+
|
53
92
|
def test_creating_association_sets_both_parent_ids_for_new
|
54
|
-
member = Member.new(name:
|
55
|
-
club = Club.new(name:
|
93
|
+
member = Member.new(name: "Sean Griffin")
|
94
|
+
club = Club.new(name: "Da Club")
|
56
95
|
|
57
96
|
member.club = club
|
58
97
|
|
@@ -65,7 +104,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
65
104
|
end
|
66
105
|
|
67
106
|
def test_replace_target_record
|
68
|
-
new_club = Club.create(:
|
107
|
+
new_club = Club.create(name: "Marx Bros")
|
69
108
|
@member.club = new_club
|
70
109
|
@member.reload
|
71
110
|
assert_equal new_club, @member.club
|
@@ -73,7 +112,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
73
112
|
|
74
113
|
def test_replacing_target_record_deletes_old_association
|
75
114
|
assert_no_difference "Membership.count" do
|
76
|
-
new_club = Club.create(:
|
115
|
+
new_club = Club.create(name: "Bananarama")
|
77
116
|
@member.club = new_club
|
78
117
|
@member.reload
|
79
118
|
end
|
@@ -82,40 +121,47 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
82
121
|
def test_set_record_to_nil_should_delete_association
|
83
122
|
@member.club = nil
|
84
123
|
@member.reload
|
85
|
-
|
124
|
+
assert_nil @member.current_membership
|
86
125
|
assert_nil @member.club
|
87
126
|
end
|
88
127
|
|
128
|
+
def test_set_record_after_delete_association
|
129
|
+
@member.club = nil
|
130
|
+
@member.club = clubs(:moustache_club)
|
131
|
+
@member.reload
|
132
|
+
assert_equal clubs(:moustache_club), @member.club
|
133
|
+
end
|
134
|
+
|
89
135
|
def test_has_one_through_polymorphic
|
90
136
|
assert_equal clubs(:moustache_club), @member.sponsor_club
|
91
137
|
end
|
92
138
|
|
93
139
|
def test_has_one_through_eager_loading
|
94
|
-
members = assert_queries(3) do #base table, through table, clubs table
|
95
|
-
Member.all.merge!(:
|
140
|
+
members = assert_queries(3) do # base table, through table, clubs table
|
141
|
+
Member.all.merge!(includes: :club, where: ["name = ?", "Groucho Marx"]).to_a
|
96
142
|
end
|
97
143
|
assert_equal 1, members.size
|
98
|
-
assert_not_nil assert_no_queries {members[0].club}
|
144
|
+
assert_not_nil assert_no_queries { members[0].club }
|
99
145
|
end
|
100
146
|
|
101
147
|
def test_has_one_through_eager_loading_through_polymorphic
|
102
|
-
members = assert_queries(3) do #base table, through table, clubs table
|
103
|
-
Member.all.merge!(:
|
148
|
+
members = assert_queries(3) do # base table, through table, clubs table
|
149
|
+
Member.all.merge!(includes: :sponsor_club, where: ["name = ?", "Groucho Marx"]).to_a
|
104
150
|
end
|
105
151
|
assert_equal 1, members.size
|
106
|
-
assert_not_nil assert_no_queries {members[0].sponsor_club}
|
152
|
+
assert_not_nil assert_no_queries { members[0].sponsor_club }
|
107
153
|
end
|
108
154
|
|
109
155
|
def test_has_one_through_with_conditions_eager_loading
|
110
156
|
# conditions on the through table
|
111
|
-
assert_equal clubs(:moustache_club), Member.all.merge!(:
|
157
|
+
assert_equal clubs(:moustache_club), Member.all.merge!(includes: :favourite_club).find(@member.id).favourite_club
|
112
158
|
memberships(:membership_of_favourite_club).update_columns(favourite: false)
|
113
|
-
|
159
|
+
assert_nil Member.all.merge!(includes: :favourite_club).find(@member.id).reload.favourite_club
|
114
160
|
|
115
161
|
# conditions on the source table
|
116
|
-
assert_equal clubs(:moustache_club), Member.all.merge!(:
|
162
|
+
assert_equal clubs(:moustache_club), Member.all.merge!(includes: :hairy_club).find(@member.id).hairy_club
|
117
163
|
clubs(:moustache_club).update_columns(name: "Association of Clean-Shaven Persons")
|
118
|
-
|
164
|
+
assert_nil Member.all.merge!(includes: :hairy_club).find(@member.id).reload.hairy_club
|
119
165
|
end
|
120
166
|
|
121
167
|
def test_has_one_through_polymorphic_with_source_type
|
@@ -123,31 +169,31 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
123
169
|
end
|
124
170
|
|
125
171
|
def test_eager_has_one_through_polymorphic_with_source_type
|
126
|
-
clubs = Club.all.merge!(:
|
172
|
+
clubs = Club.all.merge!(includes: :sponsored_member, where: ["name = ?", "Moustache and Eyebrow Fancier Club"]).to_a
|
127
173
|
# Only the eyebrow fanciers club has a sponsored_member
|
128
|
-
assert_not_nil assert_no_queries {clubs[0].sponsored_member}
|
174
|
+
assert_not_nil assert_no_queries { clubs[0].sponsored_member }
|
129
175
|
end
|
130
176
|
|
131
177
|
def test_has_one_through_nonpreload_eagerloading
|
132
178
|
members = assert_queries(1) do
|
133
|
-
Member.all.merge!(:
|
179
|
+
Member.all.merge!(includes: :club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
|
134
180
|
end
|
135
181
|
assert_equal 1, members.size
|
136
|
-
assert_not_nil assert_no_queries {members[0].club}
|
182
|
+
assert_not_nil assert_no_queries { members[0].club }
|
137
183
|
end
|
138
184
|
|
139
185
|
def test_has_one_through_nonpreload_eager_loading_through_polymorphic
|
140
186
|
members = assert_queries(1) do
|
141
|
-
Member.all.merge!(:
|
187
|
+
Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
|
142
188
|
end
|
143
189
|
assert_equal 1, members.size
|
144
|
-
assert_not_nil assert_no_queries {members[0].sponsor_club}
|
190
|
+
assert_not_nil assert_no_queries { members[0].sponsor_club }
|
145
191
|
end
|
146
192
|
|
147
193
|
def test_has_one_through_nonpreload_eager_loading_through_polymorphic_with_more_than_one_through_record
|
148
|
-
Sponsor.new(:
|
194
|
+
Sponsor.new(sponsor_club: clubs(:crazy_club), sponsorable: members(:groucho)).save!
|
149
195
|
members = assert_queries(1) do
|
150
|
-
Member.all.merge!(:
|
196
|
+
Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name DESC").to_a # force fallback
|
151
197
|
end
|
152
198
|
assert_equal 1, members.size
|
153
199
|
assert_not_nil assert_no_queries { members[0].sponsor_club }
|
@@ -159,8 +205,8 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
159
205
|
end
|
160
206
|
|
161
207
|
def test_assigning_association_correctly_assigns_target
|
162
|
-
new_member = Member.create(:
|
163
|
-
new_member.club = new_club = Club.create(:
|
208
|
+
new_member = Member.create(name: "Chris")
|
209
|
+
new_member.club = new_club = Club.create(name: "LRUG")
|
164
210
|
assert_equal new_club, new_member.association(:club).target
|
165
211
|
end
|
166
212
|
|
@@ -176,37 +222,37 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
176
222
|
|
177
223
|
def test_assigning_to_has_one_through_preserves_decorated_join_record
|
178
224
|
@organization = organizations(:nsa)
|
179
|
-
assert_difference
|
180
|
-
@member_detail = MemberDetail.new(:
|
225
|
+
assert_difference "MemberDetail.count", 1 do
|
226
|
+
@member_detail = MemberDetail.new(extra_data: "Extra")
|
181
227
|
@member.member_detail = @member_detail
|
182
228
|
@member.organization = @organization
|
183
229
|
end
|
184
230
|
assert_equal @organization, @member.organization
|
185
|
-
|
186
|
-
assert_equal
|
231
|
+
assert_includes @organization.members, @member
|
232
|
+
assert_equal "Extra", @member.member_detail.extra_data
|
187
233
|
end
|
188
234
|
|
189
235
|
def test_reassigning_has_one_through
|
190
236
|
@organization = organizations(:nsa)
|
191
237
|
@new_organization = organizations(:discordians)
|
192
238
|
|
193
|
-
assert_difference
|
194
|
-
@member_detail = MemberDetail.new(:
|
239
|
+
assert_difference "MemberDetail.count", 1 do
|
240
|
+
@member_detail = MemberDetail.new(extra_data: "Extra")
|
195
241
|
@member.member_detail = @member_detail
|
196
242
|
@member.organization = @organization
|
197
243
|
end
|
198
244
|
assert_equal @organization, @member.organization
|
199
|
-
assert_equal
|
200
|
-
|
201
|
-
|
245
|
+
assert_equal "Extra", @member.member_detail.extra_data
|
246
|
+
assert_includes @organization.members, @member
|
247
|
+
assert_not_includes @new_organization.members, @member
|
202
248
|
|
203
|
-
assert_no_difference
|
249
|
+
assert_no_difference "MemberDetail.count" do
|
204
250
|
@member.organization = @new_organization
|
205
251
|
end
|
206
252
|
assert_equal @new_organization, @member.organization
|
207
|
-
assert_equal
|
208
|
-
|
209
|
-
|
253
|
+
assert_equal "Extra", @member.member_detail.extra_data
|
254
|
+
assert_not_includes @organization.members, @member
|
255
|
+
assert_includes @new_organization.members, @member
|
210
256
|
end
|
211
257
|
|
212
258
|
def test_preloading_has_one_through_on_belongs_to
|
@@ -217,10 +263,10 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
217
263
|
@member.member_detail = @member_detail
|
218
264
|
@member.organization = @organization
|
219
265
|
@member_details = assert_queries(3) do
|
220
|
-
MemberDetail.all.merge!(:
|
266
|
+
MemberDetail.all.merge!(includes: :member_type).to_a
|
221
267
|
end
|
222
268
|
@new_detail = @member_details[0]
|
223
|
-
|
269
|
+
assert_predicate @new_detail.send(:association, :member_type), :loaded?
|
224
270
|
assert_no_queries { @new_detail.member_type }
|
225
271
|
end
|
226
272
|
|
@@ -230,19 +276,19 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
230
276
|
|
231
277
|
assert_nothing_raised do
|
232
278
|
Club.find(@club.id).save!
|
233
|
-
Club.all.merge!(:
|
279
|
+
Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
|
234
280
|
end
|
235
281
|
|
236
282
|
@club.sponsor.destroy
|
237
283
|
|
238
284
|
assert_nothing_raised do
|
239
285
|
Club.find(@club.id).save!
|
240
|
-
Club.all.merge!(:
|
286
|
+
Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
|
241
287
|
end
|
242
288
|
end
|
243
289
|
|
244
290
|
def test_through_belongs_to_after_destroy
|
245
|
-
@member_detail = MemberDetail.new(:
|
291
|
+
@member_detail = MemberDetail.new(extra_data: "Extra")
|
246
292
|
@member.member_detail = @member_detail
|
247
293
|
@member.save!
|
248
294
|
|
@@ -261,7 +307,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
261
307
|
end
|
262
308
|
|
263
309
|
def test_value_is_properly_quoted
|
264
|
-
minivan = Minivan.find(
|
310
|
+
minivan = Minivan.find("m1")
|
265
311
|
assert_nothing_raised do
|
266
312
|
minivan.dashboard
|
267
313
|
end
|
@@ -270,7 +316,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
270
316
|
def test_has_one_through_polymorphic_with_primary_key_option
|
271
317
|
assert_equal categories(:general), authors(:david).essay_category
|
272
318
|
|
273
|
-
authors = Author.joins(:essay_category).where(
|
319
|
+
authors = Author.joins(:essay_category).where("categories.id" => categories(:general).id)
|
274
320
|
assert_equal authors(:david), authors.first
|
275
321
|
|
276
322
|
assert_equal owners(:blackbeard), authors(:david).essay_owner
|
@@ -282,12 +328,12 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
282
328
|
def test_has_one_through_with_primary_key_option
|
283
329
|
assert_equal categories(:general), authors(:david).essay_category_2
|
284
330
|
|
285
|
-
authors = Author.joins(:essay_category_2).where(
|
331
|
+
authors = Author.joins(:essay_category_2).where("categories.id" => categories(:general).id)
|
286
332
|
assert_equal authors(:david), authors.first
|
287
333
|
end
|
288
334
|
|
289
335
|
def test_has_one_through_with_default_scope_on_join_model
|
290
|
-
assert_equal posts(:welcome).comments.order(
|
336
|
+
assert_equal posts(:welcome).comments.order("id").first, authors(:david).comment_on_first_post
|
291
337
|
end
|
292
338
|
|
293
339
|
def test_has_one_through_many_raises_exception
|
@@ -308,12 +354,12 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
308
354
|
minivan.dashboard
|
309
355
|
proxy = minivan.send(:association_instance_get, :dashboard)
|
310
356
|
|
311
|
-
|
357
|
+
assert_not_predicate proxy, :stale_target?
|
312
358
|
assert_equal dashboards(:cool_first), minivan.dashboard
|
313
359
|
|
314
360
|
minivan.speedometer_id = speedometers(:second).id
|
315
361
|
|
316
|
-
|
362
|
+
assert_predicate proxy, :stale_target?
|
317
363
|
assert_equal dashboards(:second), minivan.dashboard
|
318
364
|
end
|
319
365
|
|
@@ -325,7 +371,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|
325
371
|
|
326
372
|
minivan.speedometer_id = speedometers(:second).id
|
327
373
|
|
328
|
-
|
374
|
+
assert_predicate proxy, :stale_target?
|
329
375
|
assert_equal dashboards(:second), minivan.dashboard
|
330
376
|
end
|
331
377
|
|
@@ -1,17 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
4
|
+
require "models/post"
|
5
|
+
require "models/comment"
|
6
|
+
require "models/author"
|
7
|
+
require "models/essay"
|
8
|
+
require "models/category"
|
9
|
+
require "models/categorization"
|
10
|
+
require "models/person"
|
11
|
+
require "models/tagging"
|
12
|
+
require "models/tag"
|
11
13
|
|
12
14
|
class InnerJoinAssociationTest < ActiveRecord::TestCase
|
13
|
-
fixtures :authors, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
|
14
|
-
:taggings, :tags
|
15
|
+
fixtures :authors, :author_addresses, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
|
16
|
+
:taggings, :tags, :people
|
15
17
|
|
16
18
|
def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
|
17
19
|
result = Author.joins(:thinking_posts, :welcome_posts).to_a
|
@@ -20,11 +22,80 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|
20
22
|
|
21
23
|
def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
|
22
24
|
assert_nothing_raised do
|
23
|
-
sql = Person.joins(:
|
25
|
+
sql = Person.joins(agents: { agents: :agents }).joins(agents: { agents: { primary_contact: :agents } }).to_sql
|
24
26
|
assert_match(/agents_people_4/i, sql)
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
30
|
+
def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations_with_left_outer_joins
|
31
|
+
sql = Person.joins(agents: :agents).left_outer_joins(agents: :agents).to_sql
|
32
|
+
assert_match(/agents_people_2/i, sql)
|
33
|
+
assert_match(/INNER JOIN/i, sql)
|
34
|
+
assert_no_match(/agents_people_4/i, sql)
|
35
|
+
assert_no_match(/LEFT OUTER JOIN/i, sql)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_construct_finder_sql_does_not_table_name_collide_with_string_joins
|
39
|
+
string_join = <<~SQL
|
40
|
+
JOIN people agents_people ON agents_people.primary_contact_id = agents_people_2.id AND agents_people.id > agents_people_2.id
|
41
|
+
SQL
|
42
|
+
|
43
|
+
expected = people(:susan)
|
44
|
+
assert_sql(/agents_people_2/i) do
|
45
|
+
assert_equal [expected], Person.joins(:agents).joins(string_join)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_construct_finder_sql_does_not_table_name_collide_with_aliased_joins
|
50
|
+
agents = Person.arel_table.alias("agents_people")
|
51
|
+
agents_2 = Person.arel_table.alias("agents_people_2")
|
52
|
+
constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
|
53
|
+
|
54
|
+
expected = people(:susan)
|
55
|
+
assert_sql(/agents_people_2/i) do
|
56
|
+
assert_equal [expected], Person.joins(:agents).joins(agents.create_join(agents, agents.create_on(constraint)))
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_user_supplied_joins_order_should_be_preserved
|
61
|
+
string_join = <<~SQL
|
62
|
+
JOIN people agents_people_2 ON agents_people_2.primary_contact_id = people.id
|
63
|
+
SQL
|
64
|
+
agents = Person.arel_table.alias("agents_people")
|
65
|
+
agents_2 = Person.arel_table.alias("agents_people_2")
|
66
|
+
constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
|
67
|
+
|
68
|
+
expected = people(:susan)
|
69
|
+
assert_equal [expected], Person.joins(string_join).joins(agents.create_join(agents, agents.create_on(constraint)))
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_deduplicate_joins
|
73
|
+
posts = Post.arel_table
|
74
|
+
constraint = posts[:author_id].eq(Author.arel_table[:id])
|
75
|
+
|
76
|
+
authors = Author.joins(posts.create_join(posts, posts.create_on(constraint)))
|
77
|
+
authors = authors.joins(:author_address).merge(authors.where("posts.type": "SpecialPost"))
|
78
|
+
|
79
|
+
assert_equal [authors(:david)], authors
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_eager_load_with_string_joins
|
83
|
+
string_join = <<~SQL
|
84
|
+
LEFT JOIN people agents_people ON agents_people.primary_contact_id = agents_people_2.id AND agents_people.id > agents_people_2.id
|
85
|
+
SQL
|
86
|
+
|
87
|
+
assert_equal 3, Person.eager_load(:agents).joins(string_join).count
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_eager_load_with_arel_joins
|
91
|
+
agents = Person.arel_table.alias("agents_people")
|
92
|
+
agents_2 = Person.arel_table.alias("agents_people_2")
|
93
|
+
constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
|
94
|
+
arel_join = agents.create_join(agents, agents.create_on(constraint), Arel::Nodes::OuterJoin)
|
95
|
+
|
96
|
+
assert_equal 3, Person.eager_load(:agents).joins(arel_join).count
|
97
|
+
end
|
98
|
+
|
28
99
|
def test_construct_finder_sql_ignores_empty_joins_hash
|
29
100
|
sql = Author.joins({}).to_sql
|
30
101
|
assert_no_match(/JOIN/i, sql)
|
@@ -47,8 +118,13 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|
47
118
|
end
|
48
119
|
|
49
120
|
def test_join_conditions_allow_nil_associations
|
50
|
-
authors = Author.includes(:essays).where(:
|
51
|
-
assert_equal
|
121
|
+
authors = Author.includes(:essays).where(essays: { id: nil })
|
122
|
+
assert_equal 1, authors.count
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_join_with_reserved_word
|
126
|
+
assert_equal [categories_posts(:technology_welcome)],
|
127
|
+
Post::CategoryPost.joins(:group).where("group.id": categories(:technology))
|
52
128
|
end
|
53
129
|
|
54
130
|
def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
|
@@ -58,56 +134,56 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|
58
134
|
end
|
59
135
|
|
60
136
|
def test_find_with_implicit_inner_joins_honors_readonly_with_select
|
61
|
-
authors = Author.joins(:posts).select(
|
62
|
-
|
63
|
-
assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
|
137
|
+
authors = Author.joins(:posts).select("authors.*").to_a
|
138
|
+
assert_not authors.empty?, "expected authors to be non-empty"
|
139
|
+
assert authors.all? { |a| !a.readonly? }, "expected no authors to be readonly"
|
64
140
|
end
|
65
141
|
|
66
142
|
def test_find_with_implicit_inner_joins_honors_readonly_false
|
67
143
|
authors = Author.joins(:posts).readonly(false).to_a
|
68
|
-
|
69
|
-
assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
|
144
|
+
assert_not authors.empty?, "expected authors to be non-empty"
|
145
|
+
assert authors.all? { |a| !a.readonly? }, "expected no authors to be readonly"
|
70
146
|
end
|
71
147
|
|
72
148
|
def test_find_with_implicit_inner_joins_does_not_set_associations
|
73
|
-
authors = Author.joins(:posts).select(
|
74
|
-
|
149
|
+
authors = Author.joins(:posts).select("authors.*").to_a
|
150
|
+
assert_not authors.empty?, "expected authors to be non-empty"
|
75
151
|
assert authors.all? { |a| !a.instance_variable_defined?(:@posts) }, "expected no authors to have the @posts association loaded"
|
76
152
|
end
|
77
153
|
|
78
154
|
def test_count_honors_implicit_inner_joins
|
79
|
-
real_count = Author.all.to_a.sum{|a| a.posts.count }
|
155
|
+
real_count = Author.all.to_a.sum { |a| a.posts.count }
|
80
156
|
assert_equal real_count, Author.joins(:posts).count, "plain inner join count should match the number of referenced posts records"
|
81
157
|
end
|
82
158
|
|
83
159
|
def test_calculate_honors_implicit_inner_joins
|
84
|
-
real_count = Author.all.to_a.sum{|a| a.posts.count }
|
85
|
-
assert_equal real_count, Author.joins(:posts).calculate(:count,
|
160
|
+
real_count = Author.all.to_a.sum { |a| a.posts.count }
|
161
|
+
assert_equal real_count, Author.joins(:posts).calculate(:count, "authors.id"), "plain inner join count should match the number of referenced posts records"
|
86
162
|
end
|
87
163
|
|
88
164
|
def test_calculate_honors_implicit_inner_joins_and_distinct_and_conditions
|
89
|
-
real_count = Author.all.to_a.select {|a| a.posts.any? {|p| p.title
|
90
|
-
authors_with_welcoming_post_titles = Author.all.merge!(joins: :posts, where: "posts.title like 'Welcome%'").distinct.calculate(:count,
|
165
|
+
real_count = Author.all.to_a.select { |a| a.posts.any? { |p| p.title.start_with?("Welcome") } }.length
|
166
|
+
authors_with_welcoming_post_titles = Author.all.merge!(joins: :posts, where: "posts.title like 'Welcome%'").distinct.calculate(:count, "authors.id")
|
91
167
|
assert_equal real_count, authors_with_welcoming_post_titles, "inner join and conditions should have only returned authors posting titles starting with 'Welcome'"
|
92
168
|
end
|
93
169
|
|
94
170
|
def test_find_with_sti_join
|
95
|
-
scope = Post.joins(:special_comments).where(:
|
171
|
+
scope = Post.joins(:special_comments).where(id: posts(:sti_comments).id)
|
96
172
|
|
97
173
|
# The join should match SpecialComment and its subclasses only
|
98
|
-
|
99
|
-
|
100
|
-
|
174
|
+
assert_empty scope.where("comments.type" => "Comment")
|
175
|
+
assert_not_empty scope.where("comments.type" => "SpecialComment")
|
176
|
+
assert_not_empty scope.where("comments.type" => "SubSpecialComment")
|
101
177
|
end
|
102
178
|
|
103
179
|
def test_find_with_conditions_on_reflection
|
104
|
-
|
105
|
-
assert Post.joins(:nonexistent_comments).where(:
|
180
|
+
assert_not_empty posts(:welcome).comments
|
181
|
+
assert Post.joins(:nonexistent_comments).where(id: posts(:welcome).id).empty? # [sic!]
|
106
182
|
end
|
107
183
|
|
108
184
|
def test_find_with_conditions_on_through_reflection
|
109
|
-
|
110
|
-
|
185
|
+
assert_not_empty posts(:welcome).tags
|
186
|
+
assert_empty Post.joins(:misc_tags).where(id: posts(:welcome).id)
|
111
187
|
end
|
112
188
|
|
113
189
|
test "the default scope of the target is applied when joining associations" do
|
@@ -120,8 +196,8 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|
120
196
|
|
121
197
|
test "the default scope of the target is correctly aliased when joining associations" do
|
122
198
|
author = Author.create! name: "Jon"
|
123
|
-
author.categories.create! name:
|
124
|
-
author.special_categories.create! name:
|
199
|
+
author.categories.create! name: "Not Special"
|
200
|
+
author.special_categories.create! name: "Special"
|
125
201
|
|
126
202
|
categories = author.categories.includes(:special_categorizations).references(:special_categorizations).to_a
|
127
203
|
assert_equal 2, categories.size
|
@@ -129,8 +205,8 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|
129
205
|
|
130
206
|
test "the correct records are loaded when including an aliased association" do
|
131
207
|
author = Author.create! name: "Jon"
|
132
|
-
author.categories.create! name:
|
133
|
-
author.special_categories.create! name:
|
208
|
+
author.categories.create! name: "Not Special"
|
209
|
+
author.special_categories.create! name: "Special"
|
134
210
|
|
135
211
|
categories = author.categories.eager_load(:special_categorizations).order(:name).to_a
|
136
212
|
assert_equal 0, categories.first.special_categorizations.size
|