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,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
4
|
|
3
5
|
class RequiredAssociationsTest < ActiveRecord::TestCase
|
@@ -18,11 +20,14 @@ class RequiredAssociationsTest < ActiveRecord::TestCase
|
|
18
20
|
end
|
19
21
|
|
20
22
|
teardown do
|
21
|
-
@connection.drop_table
|
22
|
-
@connection.drop_table
|
23
|
+
@connection.drop_table "parents", if_exists: true
|
24
|
+
@connection.drop_table "children", if_exists: true
|
23
25
|
end
|
24
26
|
|
25
|
-
test "belongs_to associations
|
27
|
+
test "belongs_to associations can be optional by default" do
|
28
|
+
original_value = ActiveRecord::Base.belongs_to_required_by_default
|
29
|
+
ActiveRecord::Base.belongs_to_required_by_default = false
|
30
|
+
|
26
31
|
model = subclass_of(Child) do
|
27
32
|
belongs_to :parent, inverse_of: false,
|
28
33
|
class_name: "RequiredAssociationsTest::Parent"
|
@@ -30,6 +35,8 @@ class RequiredAssociationsTest < ActiveRecord::TestCase
|
|
30
35
|
|
31
36
|
assert model.new.save
|
32
37
|
assert model.new(parent: Parent.new).save
|
38
|
+
ensure
|
39
|
+
ActiveRecord::Base.belongs_to_required_by_default = original_value
|
33
40
|
end
|
34
41
|
|
35
42
|
test "required belongs_to associations have presence validated" do
|
@@ -46,6 +53,25 @@ class RequiredAssociationsTest < ActiveRecord::TestCase
|
|
46
53
|
assert record.save
|
47
54
|
end
|
48
55
|
|
56
|
+
test "belongs_to associations can be required by default" do
|
57
|
+
original_value = ActiveRecord::Base.belongs_to_required_by_default
|
58
|
+
ActiveRecord::Base.belongs_to_required_by_default = true
|
59
|
+
|
60
|
+
model = subclass_of(Child) do
|
61
|
+
belongs_to :parent, inverse_of: false,
|
62
|
+
class_name: "RequiredAssociationsTest::Parent"
|
63
|
+
end
|
64
|
+
|
65
|
+
record = model.new
|
66
|
+
assert_not record.save
|
67
|
+
assert_equal ["Parent must exist"], record.errors.full_messages
|
68
|
+
|
69
|
+
record.parent = Parent.new
|
70
|
+
assert record.save
|
71
|
+
ensure
|
72
|
+
ActiveRecord::Base.belongs_to_required_by_default = original_value
|
73
|
+
end
|
74
|
+
|
49
75
|
test "has_one associations are not required by default" do
|
50
76
|
model = subclass_of(Parent) do
|
51
77
|
has_one :child, inverse_of: false,
|
@@ -91,12 +117,11 @@ class RequiredAssociationsTest < ActiveRecord::TestCase
|
|
91
117
|
end
|
92
118
|
|
93
119
|
private
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
120
|
+
def subclass_of(klass, &block)
|
121
|
+
subclass = Class.new(klass, &block)
|
122
|
+
def subclass.name
|
123
|
+
superclass.name
|
124
|
+
end
|
125
|
+
subclass
|
99
126
|
end
|
100
|
-
subclass
|
101
|
-
end
|
102
127
|
end
|
@@ -1,87 +1,91 @@
|
|
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
|
4
|
+
require "models/computer"
|
5
|
+
require "models/developer"
|
6
|
+
require "models/project"
|
7
|
+
require "models/company"
|
8
|
+
require "models/categorization"
|
9
|
+
require "models/category"
|
10
|
+
require "models/post"
|
11
|
+
require "models/author"
|
12
|
+
require "models/comment"
|
13
|
+
require "models/tag"
|
14
|
+
require "models/tagging"
|
15
|
+
require "models/person"
|
16
|
+
require "models/reader"
|
17
|
+
require "models/ship_part"
|
18
|
+
require "models/ship"
|
19
|
+
require "models/liquid"
|
20
|
+
require "models/molecule"
|
21
|
+
require "models/electron"
|
22
|
+
require "models/human"
|
23
|
+
require "models/interest"
|
24
|
+
require "models/pirate"
|
25
|
+
require "models/parrot"
|
26
|
+
require "models/bird"
|
27
|
+
require "models/treasure"
|
28
|
+
require "models/price_estimate"
|
22
29
|
|
23
30
|
class AssociationsTest < ActiveRecord::TestCase
|
24
31
|
fixtures :accounts, :companies, :developers, :projects, :developers_projects,
|
25
|
-
:computers, :people, :readers, :authors, :author_favorites
|
32
|
+
:computers, :people, :readers, :authors, :author_addresses, :author_favorites
|
26
33
|
|
27
34
|
def test_eager_loading_should_not_change_count_of_children
|
28
|
-
liquid = Liquid.create(:
|
29
|
-
molecule = liquid.molecules.create(:
|
30
|
-
molecule.electrons.create(:
|
31
|
-
molecule.electrons.create(:
|
35
|
+
liquid = Liquid.create(name: "salty")
|
36
|
+
molecule = liquid.molecules.create(name: "molecule_1")
|
37
|
+
molecule.electrons.create(name: "electron_1")
|
38
|
+
molecule.electrons.create(name: "electron_2")
|
32
39
|
|
33
|
-
liquids = Liquid.includes(:
|
40
|
+
liquids = Liquid.includes(molecules: :electrons).references(:molecules).where("molecules.id is not null")
|
34
41
|
assert_equal 1, liquids[0].molecules.length
|
35
42
|
end
|
36
43
|
|
37
44
|
def test_subselect
|
38
45
|
author = authors :david
|
39
46
|
favs = author.author_favorites
|
40
|
-
fav2 = author.author_favorites.where(:
|
47
|
+
fav2 = author.author_favorites.where(author: Author.where(id: author.id)).to_a
|
41
48
|
assert_equal favs, fav2
|
42
49
|
end
|
43
50
|
|
44
51
|
def test_loading_the_association_target_should_keep_child_records_marked_for_destruction
|
45
|
-
ship = Ship.create!(:
|
46
|
-
part = ship.parts.create!(:
|
52
|
+
ship = Ship.create!(name: "The good ship Dollypop")
|
53
|
+
part = ship.parts.create!(name: "Mast")
|
47
54
|
part.mark_for_destruction
|
48
|
-
ship.parts
|
49
|
-
assert ship.parts[0].marked_for_destruction?
|
55
|
+
assert_predicate ship.parts[0], :marked_for_destruction?
|
50
56
|
end
|
51
57
|
|
52
58
|
def test_loading_the_association_target_should_load_most_recent_attributes_for_child_records_marked_for_destruction
|
53
|
-
ship = Ship.create!(:
|
54
|
-
part = ship.parts.create!(:
|
59
|
+
ship = Ship.create!(name: "The good ship Dollypop")
|
60
|
+
part = ship.parts.create!(name: "Mast")
|
55
61
|
part.mark_for_destruction
|
56
|
-
ShipPart.find(part.id).update_columns(name:
|
57
|
-
ship.parts.
|
58
|
-
assert_equal 'Deck', ship.parts[0].name
|
62
|
+
ShipPart.find(part.id).update_columns(name: "Deck")
|
63
|
+
assert_equal "Deck", ship.parts[0].name
|
59
64
|
end
|
60
65
|
|
61
|
-
|
62
66
|
def test_include_with_order_works
|
63
|
-
assert_nothing_raised {Account.all.merge!(:
|
64
|
-
assert_nothing_raised {Account.all.merge!(:
|
67
|
+
assert_nothing_raised { Account.all.merge!(order: "id", includes: :firm).first }
|
68
|
+
assert_nothing_raised { Account.all.merge!(order: :id, includes: :firm).first }
|
65
69
|
end
|
66
70
|
|
67
71
|
def test_bad_collection_keys
|
68
|
-
assert_raise(ArgumentError,
|
69
|
-
Class.new(ActiveRecord::Base).has_many(:wheels, :
|
72
|
+
assert_raise(ArgumentError, "ActiveRecord should have barked on bad collection keys") do
|
73
|
+
Class.new(ActiveRecord::Base).has_many(:wheels, name: "wheels")
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
77
|
def test_should_construct_new_finder_sql_after_create
|
74
|
-
person = Person.new :
|
78
|
+
person = Person.new first_name: "clark"
|
75
79
|
assert_equal [], person.readers.to_a
|
76
80
|
person.save!
|
77
|
-
reader = Reader.create! :
|
81
|
+
reader = Reader.create! person: person, post: Post.new(title: "foo", body: "bar")
|
78
82
|
assert person.readers.find(reader.id)
|
79
83
|
end
|
80
84
|
|
81
85
|
def test_force_reload
|
82
86
|
firm = Firm.new("name" => "A New Firm, Inc")
|
83
87
|
firm.save
|
84
|
-
firm.clients.each {} # forcing to load all clients
|
88
|
+
firm.clients.each { } # forcing to load all clients
|
85
89
|
assert firm.clients.empty?, "New firm shouldn't have client objects"
|
86
90
|
assert_equal 0, firm.clients.size, "New firm should have 0 clients"
|
87
91
|
|
@@ -91,10 +95,10 @@ class AssociationsTest < ActiveRecord::TestCase
|
|
91
95
|
assert firm.clients.empty?, "New firm should have cached no client objects"
|
92
96
|
assert_equal 0, firm.clients.size, "New firm should have cached 0 clients count"
|
93
97
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
+
firm.clients.reload
|
99
|
+
|
100
|
+
assert_not firm.clients.empty?, "New firm should have reloaded client objects"
|
101
|
+
assert_equal 1, firm.clients.size, "New firm should have reloaded clients count"
|
98
102
|
end
|
99
103
|
|
100
104
|
def test_using_limitable_reflections_helper
|
@@ -103,113 +107,100 @@ class AssociationsTest < ActiveRecord::TestCase
|
|
103
107
|
has_many_reflections = [Tag.reflect_on_association(:taggings), Developer.reflect_on_association(:projects)]
|
104
108
|
mixed_reflections = (belongs_to_reflections + has_many_reflections).uniq
|
105
109
|
assert using_limitable_reflections.call(belongs_to_reflections), "Belong to associations are limitable"
|
106
|
-
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_force_reload_is_uncached
|
111
|
-
firm = Firm.create!("name" => "A New Firm, Inc")
|
112
|
-
Client.create!("name" => "TheClient.com", :firm => firm)
|
113
|
-
|
114
|
-
ActiveSupport::Deprecation.silence do
|
115
|
-
ActiveRecord::Base.cache do
|
116
|
-
firm.clients.each {}
|
117
|
-
assert_queries(0) { assert_not_nil firm.clients.each {} }
|
118
|
-
assert_queries(1) { assert_not_nil firm.clients(true).each {} }
|
119
|
-
end
|
120
|
-
end
|
110
|
+
assert_not using_limitable_reflections.call(has_many_reflections), "All has many style associations are not limitable"
|
111
|
+
assert_not using_limitable_reflections.call(mixed_reflections), "No collection associations (has many style) should pass"
|
121
112
|
end
|
122
113
|
|
123
114
|
def test_association_with_references
|
124
115
|
firm = companies(:first_firm)
|
125
|
-
|
116
|
+
assert_equal [:foo], firm.association_with_references.references_values
|
126
117
|
end
|
127
|
-
|
128
118
|
end
|
129
119
|
|
130
120
|
class AssociationProxyTest < ActiveRecord::TestCase
|
131
|
-
fixtures :authors, :posts, :categorizations, :categories, :developers, :projects, :developers_projects
|
121
|
+
fixtures :authors, :author_addresses, :posts, :categorizations, :categories, :developers, :projects, :developers_projects
|
132
122
|
|
133
123
|
def test_push_does_not_load_target
|
134
124
|
david = authors(:david)
|
135
125
|
|
136
|
-
david.posts << (post = Post.new(:
|
137
|
-
|
138
|
-
|
126
|
+
david.posts << (post = Post.new(title: "New on Edge", body: "More cool stuff!"))
|
127
|
+
assert_not_predicate david.posts, :loaded?
|
128
|
+
assert_includes david.posts, post
|
139
129
|
end
|
140
130
|
|
141
131
|
def test_push_has_many_through_does_not_load_target
|
142
132
|
david = authors(:david)
|
143
133
|
|
144
134
|
david.categories << categories(:technology)
|
145
|
-
|
146
|
-
|
135
|
+
assert_not_predicate david.categories, :loaded?
|
136
|
+
assert_includes david.categories, categories(:technology)
|
147
137
|
end
|
148
138
|
|
149
139
|
def test_push_followed_by_save_does_not_load_target
|
150
140
|
david = authors(:david)
|
151
141
|
|
152
|
-
david.posts << (post = Post.new(:
|
153
|
-
|
142
|
+
david.posts << (post = Post.new(title: "New on Edge", body: "More cool stuff!"))
|
143
|
+
assert_not_predicate david.posts, :loaded?
|
154
144
|
david.save
|
155
|
-
|
156
|
-
|
145
|
+
assert_not_predicate david.posts, :loaded?
|
146
|
+
assert_includes david.posts, post
|
157
147
|
end
|
158
148
|
|
159
149
|
def test_push_does_not_lose_additions_to_new_record
|
160
|
-
josh = Author.new(:
|
161
|
-
josh.posts << Post.new(:
|
162
|
-
|
150
|
+
josh = Author.new(name: "Josh")
|
151
|
+
josh.posts << Post.new(title: "New on Edge", body: "More cool stuff!")
|
152
|
+
assert_predicate josh.posts, :loaded?
|
163
153
|
assert_equal 1, josh.posts.size
|
164
154
|
end
|
165
155
|
|
166
156
|
def test_append_behaves_like_push
|
167
|
-
josh = Author.new(:
|
168
|
-
josh.posts.append Post.new(:
|
169
|
-
|
157
|
+
josh = Author.new(name: "Josh")
|
158
|
+
josh.posts.append Post.new(title: "New on Edge", body: "More cool stuff!")
|
159
|
+
assert_predicate josh.posts, :loaded?
|
170
160
|
assert_equal 1, josh.posts.size
|
171
161
|
end
|
172
162
|
|
173
163
|
def test_prepend_is_not_defined
|
174
|
-
josh = Author.new(:
|
164
|
+
josh = Author.new(name: "Josh")
|
175
165
|
assert_raises(NoMethodError) { josh.posts.prepend Post.new }
|
176
166
|
end
|
177
167
|
|
178
168
|
def test_save_on_parent_does_not_load_target
|
179
169
|
david = developers(:david)
|
180
170
|
|
181
|
-
|
171
|
+
assert_not_predicate david.projects, :loaded?
|
182
172
|
david.update_columns(created_at: Time.now)
|
183
|
-
|
173
|
+
assert_not_predicate david.projects, :loaded?
|
184
174
|
end
|
185
175
|
|
186
176
|
def test_load_does_load_target
|
187
177
|
david = developers(:david)
|
188
178
|
|
189
|
-
|
179
|
+
assert_not_predicate david.projects, :loaded?
|
190
180
|
david.projects.load
|
191
|
-
|
181
|
+
assert_predicate david.projects, :loaded?
|
192
182
|
end
|
193
183
|
|
194
184
|
def test_inspect_does_not_reload_a_not_yet_loaded_target
|
195
|
-
andreas = Developer.new :
|
196
|
-
|
185
|
+
andreas = Developer.new name: "Andreas", log: "new developer added"
|
186
|
+
assert_not_predicate andreas.audit_logs, :loaded?
|
197
187
|
assert_match(/message: "new developer added"/, andreas.audit_logs.inspect)
|
188
|
+
assert_predicate andreas.audit_logs, :loaded?
|
198
189
|
end
|
199
190
|
|
200
191
|
def test_save_on_parent_saves_children
|
201
|
-
developer = Developer.create :
|
192
|
+
developer = Developer.create name: "Bryan", salary: 50_000
|
202
193
|
assert_equal 1, developer.reload.audit_logs.size
|
203
194
|
end
|
204
195
|
|
205
196
|
def test_create_via_association_with_block
|
206
|
-
post = authors(:david).posts.create(:
|
197
|
+
post = authors(:david).posts.create(title: "New on Edge") { |p| p.body = "More cool stuff!" }
|
207
198
|
assert_equal post.title, "New on Edge"
|
208
199
|
assert_equal post.body, "More cool stuff!"
|
209
200
|
end
|
210
201
|
|
211
202
|
def test_create_with_bang_via_association_with_block
|
212
|
-
post = authors(:david).posts.create!(:
|
203
|
+
post = authors(:david).posts.create!(title: "New on Edge") { |p| p.body = "More cool stuff!" }
|
213
204
|
assert_equal post.title, "New on Edge"
|
214
205
|
assert_equal post.body, "More cool stuff!"
|
215
206
|
end
|
@@ -227,7 +218,7 @@ class AssociationProxyTest < ActiveRecord::TestCase
|
|
227
218
|
end
|
228
219
|
|
229
220
|
def test_scoped_allows_conditions
|
230
|
-
assert developers(:david).projects.merge(where:
|
221
|
+
assert developers(:david).projects.merge(where: "foo").to_sql.include?("foo")
|
231
222
|
end
|
232
223
|
|
233
224
|
test "getting a scope from an association" do
|
@@ -250,37 +241,56 @@ class AssociationProxyTest < ActiveRecord::TestCase
|
|
250
241
|
end
|
251
242
|
|
252
243
|
test "inverses get set of subsets of the association" do
|
253
|
-
|
254
|
-
|
244
|
+
human = Human.create
|
245
|
+
human.interests.create
|
255
246
|
|
256
|
-
|
247
|
+
human = Human.find(human.id)
|
257
248
|
|
258
249
|
assert_queries(1) do
|
259
|
-
assert_equal
|
250
|
+
assert_equal human, human.interests.where("1=1").first.human
|
260
251
|
end
|
261
252
|
end
|
262
253
|
|
263
254
|
test "first! works on loaded associations" do
|
264
255
|
david = authors(:david)
|
265
|
-
assert_equal david.
|
266
|
-
|
267
|
-
assert_no_queries { david.
|
256
|
+
assert_equal david.first_posts.first, david.first_posts.reload.first!
|
257
|
+
assert_predicate david.first_posts, :loaded?
|
258
|
+
assert_no_queries { david.first_posts.first! }
|
268
259
|
end
|
269
260
|
|
270
261
|
def test_pluck_uses_loaded_target
|
271
262
|
david = authors(:david)
|
272
|
-
assert_equal david.
|
273
|
-
|
274
|
-
assert_no_queries { david.
|
263
|
+
assert_equal david.first_posts.pluck(:title), david.first_posts.load.pluck(:title)
|
264
|
+
assert_predicate david.first_posts, :loaded?
|
265
|
+
assert_no_queries { david.first_posts.pluck(:title) }
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_pick_uses_loaded_target
|
269
|
+
david = authors(:david)
|
270
|
+
assert_equal david.first_posts.pick(:title), david.first_posts.load.pick(:title)
|
271
|
+
assert_predicate david.first_posts, :loaded?
|
272
|
+
assert_no_queries { david.first_posts.pick(:title) }
|
275
273
|
end
|
276
274
|
|
277
275
|
def test_reset_unloads_target
|
278
276
|
david = authors(:david)
|
279
277
|
david.posts.reload
|
280
278
|
|
281
|
-
|
279
|
+
assert_predicate david.posts, :loaded?
|
280
|
+
assert_predicate david.posts, :loaded
|
282
281
|
david.posts.reset
|
283
|
-
|
282
|
+
assert_not_predicate david.posts, :loaded?
|
283
|
+
assert_not_predicate david.posts, :loaded
|
284
|
+
end
|
285
|
+
|
286
|
+
def test_target_merging_ignores_persisted_in_memory_records
|
287
|
+
david = authors(:david)
|
288
|
+
assert david.thinking_posts.include?(posts(:thinking))
|
289
|
+
|
290
|
+
david.thinking_posts.create!(title: "Something else entirely", body: "Does not matter.")
|
291
|
+
|
292
|
+
assert_equal 1, david.thinking_posts.size
|
293
|
+
assert_equal 1, david.thinking_posts.to_a.size
|
284
294
|
end
|
285
295
|
end
|
286
296
|
|
@@ -288,18 +298,18 @@ class OverridingAssociationsTest < ActiveRecord::TestCase
|
|
288
298
|
class DifferentPerson < ActiveRecord::Base; end
|
289
299
|
|
290
300
|
class PeopleList < ActiveRecord::Base
|
291
|
-
has_and_belongs_to_many :has_and_belongs_to_many, :
|
292
|
-
has_many :has_many, :
|
301
|
+
has_and_belongs_to_many :has_and_belongs_to_many, before_add: :enlist
|
302
|
+
has_many :has_many, before_add: :enlist
|
293
303
|
belongs_to :belongs_to
|
294
304
|
has_one :has_one
|
295
305
|
end
|
296
306
|
|
297
307
|
class DifferentPeopleList < PeopleList
|
298
308
|
# Different association with the same name, callbacks should be omitted here.
|
299
|
-
has_and_belongs_to_many :has_and_belongs_to_many, :
|
300
|
-
has_many :has_many, :
|
301
|
-
belongs_to :belongs_to, :
|
302
|
-
has_one :has_one, :
|
309
|
+
has_and_belongs_to_many :has_and_belongs_to_many, class_name: "DifferentPerson"
|
310
|
+
has_many :has_many, class_name: "DifferentPerson"
|
311
|
+
belongs_to :belongs_to, class_name: "DifferentPerson"
|
312
|
+
has_one :has_one, class_name: "DifferentPerson"
|
303
313
|
end
|
304
314
|
|
305
315
|
def test_habtm_association_redefinition_callbacks_should_differ_and_not_inherited
|
@@ -355,8 +365,35 @@ class OverridingAssociationsTest < ActiveRecord::TestCase
|
|
355
365
|
end
|
356
366
|
end
|
357
367
|
|
368
|
+
class PreloaderTest < ActiveRecord::TestCase
|
369
|
+
fixtures :posts, :comments
|
370
|
+
|
371
|
+
def test_preload_with_scope
|
372
|
+
post = posts(:welcome)
|
373
|
+
|
374
|
+
preloader = ActiveRecord::Associations::Preloader.new
|
375
|
+
preloader.preload([post], :comments, Comment.where(body: "Thank you for the welcome"))
|
376
|
+
|
377
|
+
assert_predicate post.comments, :loaded?
|
378
|
+
assert_equal [comments(:greetings)], post.comments
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_preload_for_hmt_with_conditions
|
382
|
+
post = posts(:welcome)
|
383
|
+
_normal_category = post.categories.create!(name: "Normal")
|
384
|
+
special_category = post.special_categories.create!(name: "Special")
|
385
|
+
|
386
|
+
preloader = ActiveRecord::Associations::Preloader.new
|
387
|
+
preloader.preload([post], :hmt_special_categories)
|
388
|
+
|
389
|
+
assert_equal 1, post.hmt_special_categories.length
|
390
|
+
assert_equal [special_category], post.hmt_special_categories
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
358
394
|
class GeneratedMethodsTest < ActiveRecord::TestCase
|
359
395
|
fixtures :developers, :computers, :posts, :comments
|
396
|
+
|
360
397
|
def test_association_methods_override_attribute_methods_of_same_name
|
361
398
|
assert_equal(developers(:david), computers(:workstation).developer)
|
362
399
|
# this next line will fail if the attribute methods module is generated lazily
|
@@ -383,3 +420,97 @@ class GeneratedMethodsTest < ActiveRecord::TestCase
|
|
383
420
|
assert_equal :none, MyArticle.new.comments
|
384
421
|
end
|
385
422
|
end
|
423
|
+
|
424
|
+
class WithAnnotationsTest < ActiveRecord::TestCase
|
425
|
+
fixtures :pirates, :parrots, :treasures
|
426
|
+
|
427
|
+
def test_belongs_to_with_annotation_includes_a_query_comment
|
428
|
+
pirate = SpacePirate.where.not(parrot_id: nil).first
|
429
|
+
assert pirate, "should have a Pirate record"
|
430
|
+
|
431
|
+
log = capture_sql do
|
432
|
+
pirate.parrot
|
433
|
+
end
|
434
|
+
assert_not_predicate log, :empty?
|
435
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
436
|
+
|
437
|
+
assert_sql(%r{/\* that tells jokes \*/}) do
|
438
|
+
pirate.parrot_with_annotation
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
def test_has_and_belongs_to_many_with_annotation_includes_a_query_comment
|
443
|
+
pirate = SpacePirate.first
|
444
|
+
assert pirate, "should have a Pirate record"
|
445
|
+
|
446
|
+
log = capture_sql do
|
447
|
+
pirate.parrots.first
|
448
|
+
end
|
449
|
+
assert_not_predicate log, :empty?
|
450
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
451
|
+
|
452
|
+
assert_sql(%r{/\* that are very colorful \*/}) do
|
453
|
+
pirate.parrots_with_annotation.first
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
def test_has_one_with_annotation_includes_a_query_comment
|
458
|
+
pirate = SpacePirate.first
|
459
|
+
assert pirate, "should have a Pirate record"
|
460
|
+
|
461
|
+
log = capture_sql do
|
462
|
+
pirate.ship
|
463
|
+
end
|
464
|
+
assert_not_predicate log, :empty?
|
465
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
466
|
+
|
467
|
+
assert_sql(%r{/\* that is a rocket \*/}) do
|
468
|
+
pirate.ship_with_annotation
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
def test_has_many_with_annotation_includes_a_query_comment
|
473
|
+
pirate = SpacePirate.first
|
474
|
+
assert pirate, "should have a Pirate record"
|
475
|
+
|
476
|
+
log = capture_sql do
|
477
|
+
pirate.birds.first
|
478
|
+
end
|
479
|
+
assert_not_predicate log, :empty?
|
480
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
481
|
+
|
482
|
+
assert_sql(%r{/\* that are also parrots \*/}) do
|
483
|
+
pirate.birds_with_annotation.first
|
484
|
+
end
|
485
|
+
end
|
486
|
+
|
487
|
+
def test_has_many_through_with_annotation_includes_a_query_comment
|
488
|
+
pirate = SpacePirate.first
|
489
|
+
assert pirate, "should have a Pirate record"
|
490
|
+
|
491
|
+
log = capture_sql do
|
492
|
+
pirate.treasure_estimates.first
|
493
|
+
end
|
494
|
+
assert_not_predicate log, :empty?
|
495
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
496
|
+
|
497
|
+
assert_sql(%r{/\* yarrr \*/}) do
|
498
|
+
pirate.treasure_estimates_with_annotation.first
|
499
|
+
end
|
500
|
+
end
|
501
|
+
|
502
|
+
def test_has_many_through_with_annotation_includes_a_query_comment_when_eager_loading
|
503
|
+
pirate = SpacePirate.first
|
504
|
+
assert pirate, "should have a Pirate record"
|
505
|
+
|
506
|
+
log = capture_sql do
|
507
|
+
pirate.treasure_estimates.first
|
508
|
+
end
|
509
|
+
assert_not_predicate log, :empty?
|
510
|
+
assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
|
511
|
+
|
512
|
+
assert_sql(%r{/\* yarrr \*/}) do
|
513
|
+
SpacePirate.includes(:treasure_estimates_with_annotation, :treasures).first
|
514
|
+
end
|
515
|
+
end
|
516
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
4
|
+
require "active_support/core_ext/enumerable"
|
3
5
|
|
4
6
|
module ActiveRecord
|
5
7
|
module AttributeMethods
|
6
8
|
class ReadTest < ActiveRecord::TestCase
|
7
|
-
|
9
|
+
FakeColumn = Struct.new(:name) do
|
8
10
|
def type; :integer; end
|
9
11
|
end
|
10
12
|
|
11
13
|
def setup
|
12
|
-
@klass = Class.new do
|
14
|
+
@klass = Class.new(Class.new { def self.initialize_generated_modules; end }) do
|
13
15
|
def self.superclass; Base; end
|
14
|
-
def self.base_class
|
15
|
-
def self.decorate_matching_attribute_types(*); end
|
16
|
-
def self.initialize_generated_modules; end
|
16
|
+
def self.base_class?; true; end
|
17
17
|
|
18
18
|
include ActiveRecord::AttributeMethods
|
19
19
|
|
@@ -29,9 +29,9 @@ module ActiveRecord
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.columns_hash
|
32
|
-
|
33
|
-
|
34
|
-
}
|
32
|
+
attribute_names.index_with { |name|
|
33
|
+
FakeColumn.new(name)
|
34
|
+
}
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -40,13 +40,13 @@ module ActiveRecord
|
|
40
40
|
instance = @klass.new
|
41
41
|
|
42
42
|
@klass.attribute_names.each do |name|
|
43
|
-
|
43
|
+
assert_not_includes instance.methods.map(&:to_s), name
|
44
44
|
end
|
45
45
|
|
46
46
|
@klass.define_attribute_methods
|
47
47
|
|
48
48
|
@klass.attribute_names.each do |name|
|
49
|
-
|
49
|
+
assert_includes instance.methods.map(&:to_s), name, "#{name} is not defined"
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|