ibm_db 5.1.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 +14 -14
- data/ext/extconf.rb +4 -4
- 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 +11 -11
- 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/ibm_db.rb +7 -3
- data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -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 +196 -11
@@ -1,85 +1,89 @@
|
|
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
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
4
|
+
require "models/developer"
|
5
|
+
require "models/computer"
|
6
|
+
require "models/project"
|
7
|
+
require "models/company"
|
8
|
+
require "models/course"
|
9
|
+
require "models/customer"
|
10
|
+
require "models/order"
|
11
|
+
require "models/categorization"
|
12
|
+
require "models/category"
|
13
|
+
require "models/post"
|
14
|
+
require "models/author"
|
15
|
+
require "models/tag"
|
16
|
+
require "models/tagging"
|
17
|
+
require "models/parrot"
|
18
|
+
require "models/person"
|
19
|
+
require "models/pirate"
|
20
|
+
require "models/professor"
|
21
|
+
require "models/treasure"
|
22
|
+
require "models/price_estimate"
|
23
|
+
require "models/club"
|
24
|
+
require "models/user"
|
25
|
+
require "models/member"
|
26
|
+
require "models/membership"
|
27
|
+
require "models/sponsor"
|
28
|
+
require "models/lesson"
|
29
|
+
require "models/student"
|
30
|
+
require "models/country"
|
31
|
+
require "models/treaty"
|
32
|
+
require "models/vertex"
|
33
|
+
require "models/publisher"
|
34
|
+
require "models/publisher/article"
|
35
|
+
require "models/publisher/magazine"
|
36
|
+
require "active_support/core_ext/string/conversions"
|
33
37
|
|
34
38
|
class ProjectWithAfterCreateHook < ActiveRecord::Base
|
35
|
-
self.table_name =
|
39
|
+
self.table_name = "projects"
|
36
40
|
has_and_belongs_to_many :developers,
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
+
class_name: "DeveloperForProjectWithAfterCreateHook",
|
42
|
+
join_table: "developers_projects",
|
43
|
+
foreign_key: "project_id",
|
44
|
+
association_foreign_key: "developer_id"
|
41
45
|
|
42
46
|
after_create :add_david
|
43
47
|
|
44
48
|
def add_david
|
45
|
-
david = DeveloperForProjectWithAfterCreateHook.find_by_name(
|
49
|
+
david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
|
46
50
|
david.projects << self
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
54
|
class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
|
51
|
-
self.table_name =
|
55
|
+
self.table_name = "developers"
|
52
56
|
has_and_belongs_to_many :projects,
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
57
|
+
class_name: "ProjectWithAfterCreateHook",
|
58
|
+
join_table: "developers_projects",
|
59
|
+
association_foreign_key: "project_id",
|
60
|
+
foreign_key: "developer_id"
|
57
61
|
end
|
58
62
|
|
59
63
|
class ProjectWithSymbolsForKeys < ActiveRecord::Base
|
60
|
-
self.table_name =
|
64
|
+
self.table_name = "projects"
|
61
65
|
has_and_belongs_to_many :developers,
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
+
class_name: "DeveloperWithSymbolsForKeys",
|
67
|
+
join_table: :developers_projects,
|
68
|
+
foreign_key: :project_id,
|
69
|
+
association_foreign_key: "developer_id"
|
66
70
|
end
|
67
71
|
|
68
72
|
class DeveloperWithSymbolsForKeys < ActiveRecord::Base
|
69
|
-
self.table_name =
|
73
|
+
self.table_name = "developers"
|
70
74
|
has_and_belongs_to_many :projects,
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
+
class_name: "ProjectWithSymbolsForKeys",
|
76
|
+
join_table: :developers_projects,
|
77
|
+
association_foreign_key: :project_id,
|
78
|
+
foreign_key: "developer_id"
|
75
79
|
end
|
76
80
|
|
77
81
|
class SubDeveloper < Developer
|
78
|
-
self.table_name =
|
82
|
+
self.table_name = "developers"
|
79
83
|
has_and_belongs_to_many :special_projects,
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
84
|
+
join_table: "developers_projects",
|
85
|
+
foreign_key: "project_id",
|
86
|
+
association_foreign_key: "developer_id"
|
83
87
|
end
|
84
88
|
|
85
89
|
class DeveloperWithSymbolClassName < Developer
|
@@ -89,7 +93,7 @@ end
|
|
89
93
|
class DeveloperWithExtendOption < Developer
|
90
94
|
module NamedExtension
|
91
95
|
def category
|
92
|
-
|
96
|
+
"sns"
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
@@ -97,27 +101,42 @@ class DeveloperWithExtendOption < Developer
|
|
97
101
|
end
|
98
102
|
|
99
103
|
class ProjectUnscopingDavidDefaultScope < ActiveRecord::Base
|
100
|
-
self.table_name =
|
101
|
-
has_and_belongs_to_many :developers, -> { unscope(where:
|
104
|
+
self.table_name = "projects"
|
105
|
+
has_and_belongs_to_many :developers, -> { unscope(where: "name") },
|
102
106
|
class_name: "LazyBlockDeveloperCalledDavid",
|
103
107
|
join_table: "developers_projects",
|
104
108
|
foreign_key: "project_id",
|
105
109
|
association_foreign_key: "developer_id"
|
106
110
|
end
|
107
111
|
|
112
|
+
class Kitchen < ActiveRecord::Base
|
113
|
+
has_one :sink
|
114
|
+
end
|
115
|
+
|
116
|
+
class Sink < ActiveRecord::Base
|
117
|
+
has_and_belongs_to_many :sources, join_table: :edges
|
118
|
+
belongs_to :kitchen
|
119
|
+
accepts_nested_attributes_for :kitchen
|
120
|
+
end
|
121
|
+
|
122
|
+
class Source < ActiveRecord::Base
|
123
|
+
self.table_name = "humans"
|
124
|
+
has_and_belongs_to_many :sinks, join_table: :edges
|
125
|
+
end
|
126
|
+
|
108
127
|
class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
109
128
|
fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
|
110
129
|
:parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings, :computers
|
111
130
|
|
112
131
|
def setup_data_for_habtm_case
|
113
|
-
ActiveRecord::Base.connection.execute(
|
132
|
+
ActiveRecord::Base.connection.execute("delete from countries_treaties")
|
114
133
|
|
115
|
-
country = Country.new(:
|
116
|
-
country.country_id =
|
134
|
+
country = Country.new(name: "India")
|
135
|
+
country.country_id = "c1"
|
117
136
|
country.save!
|
118
137
|
|
119
|
-
treaty = Treaty.new(:
|
120
|
-
treaty.treaty_id =
|
138
|
+
treaty = Treaty.new(name: "peace")
|
139
|
+
treaty.treaty_id = "t1"
|
121
140
|
country.treaties << treaty
|
122
141
|
end
|
123
142
|
|
@@ -131,29 +150,29 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
131
150
|
setup_data_for_habtm_case
|
132
151
|
|
133
152
|
con = ActiveRecord::Base.connection
|
134
|
-
sql =
|
153
|
+
sql = "select * from countries_treaties"
|
135
154
|
record = con.select_rows(sql).last
|
136
|
-
assert_equal
|
137
|
-
assert_equal
|
155
|
+
assert_equal "c1", record[0]
|
156
|
+
assert_equal "t1", record[1]
|
138
157
|
end
|
139
158
|
|
140
159
|
def test_proper_usage_of_primary_keys_and_join_table
|
141
160
|
setup_data_for_habtm_case
|
142
161
|
|
143
|
-
assert_equal
|
144
|
-
assert_equal
|
162
|
+
assert_equal "country_id", Country.primary_key
|
163
|
+
assert_equal "treaty_id", Treaty.primary_key
|
145
164
|
|
146
165
|
country = Country.first
|
147
166
|
assert_equal 1, country.treaties.count
|
148
167
|
end
|
149
168
|
|
150
169
|
def test_join_table_composite_primary_key_should_not_warn
|
151
|
-
country = Country.new(:
|
152
|
-
country.country_id =
|
170
|
+
country = Country.new(name: "India")
|
171
|
+
country.country_id = "c1"
|
153
172
|
country.save!
|
154
173
|
|
155
|
-
treaty = Treaty.new(:
|
156
|
-
treaty.treaty_id =
|
174
|
+
treaty = Treaty.new(name: "peace")
|
175
|
+
treaty.treaty_id = "t1"
|
157
176
|
warning = capture(:stderr) do
|
158
177
|
country.treaties << treaty
|
159
178
|
end
|
@@ -163,13 +182,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
163
182
|
def test_has_and_belongs_to_many
|
164
183
|
david = Developer.find(1)
|
165
184
|
|
166
|
-
|
185
|
+
assert_not_empty david.projects
|
167
186
|
assert_equal 2, david.projects.size
|
168
187
|
|
169
188
|
active_record = Project.find(1)
|
170
|
-
|
189
|
+
assert_not_empty active_record.developers
|
171
190
|
assert_equal 3, active_record.developers.size
|
172
|
-
|
191
|
+
assert_includes active_record.developers, david
|
173
192
|
end
|
174
193
|
|
175
194
|
def test_adding_single
|
@@ -245,12 +264,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
245
264
|
no_of_projects = Project.count
|
246
265
|
aredridel = Developer.new("name" => "Aredridel")
|
247
266
|
aredridel.projects.concat([Project.find(1), p = Project.new("name" => "Projekt")])
|
248
|
-
|
249
|
-
|
267
|
+
assert_not_predicate aredridel, :persisted?
|
268
|
+
assert_not_predicate p, :persisted?
|
250
269
|
assert aredridel.save
|
251
|
-
|
252
|
-
assert_equal no_of_devels+1, Developer.count
|
253
|
-
assert_equal no_of_projects+1, Project.count
|
270
|
+
assert_predicate aredridel, :persisted?
|
271
|
+
assert_equal no_of_devels + 1, Developer.count
|
272
|
+
assert_equal no_of_projects + 1, Project.count
|
254
273
|
assert_equal 2, aredridel.projects.size
|
255
274
|
assert_equal 2, aredridel.projects.reload.size
|
256
275
|
end
|
@@ -258,7 +277,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
258
277
|
def test_habtm_saving_multiple_relationships
|
259
278
|
new_project = Project.new("name" => "Grimetime")
|
260
279
|
amount_of_developers = 4
|
261
|
-
developers = (0...amount_of_developers).
|
280
|
+
developers = (0...amount_of_developers).reverse_each.map { |i| Developer.create(name: "JME #{i}") }
|
262
281
|
|
263
282
|
new_project.developer_ids = [developers[0].id, developers[1].id]
|
264
283
|
new_project.developers_with_callback_ids = [developers[2].id, developers[3].id]
|
@@ -283,54 +302,55 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
283
302
|
end
|
284
303
|
|
285
304
|
def test_habtm_collection_size_from_params
|
286
|
-
devel = Developer.new(
|
305
|
+
devel = Developer.new(
|
287
306
|
projects_attributes: {
|
288
|
-
|
289
|
-
}
|
290
|
-
})
|
307
|
+
"0" => {}
|
308
|
+
})
|
291
309
|
|
292
310
|
assert_equal 1, devel.projects.size
|
293
311
|
end
|
294
312
|
|
295
313
|
def test_build
|
296
314
|
devel = Developer.find(1)
|
297
|
-
|
298
|
-
|
315
|
+
|
316
|
+
proj = assert_queries(0) { devel.projects.build("name" => "Projekt") }
|
317
|
+
assert_not_predicate devel.projects, :loaded?
|
299
318
|
|
300
319
|
assert_equal devel.projects.last, proj
|
301
|
-
|
320
|
+
assert_predicate devel.projects, :loaded?
|
302
321
|
|
303
|
-
|
322
|
+
assert_not_predicate proj, :persisted?
|
304
323
|
devel.save
|
305
|
-
|
324
|
+
assert_predicate proj, :persisted?
|
306
325
|
assert_equal devel.projects.last, proj
|
307
326
|
assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
|
308
327
|
end
|
309
328
|
|
310
329
|
def test_new_aliased_to_build
|
311
330
|
devel = Developer.find(1)
|
312
|
-
|
313
|
-
|
331
|
+
|
332
|
+
proj = assert_queries(0) { devel.projects.new("name" => "Projekt") }
|
333
|
+
assert_not_predicate devel.projects, :loaded?
|
314
334
|
|
315
335
|
assert_equal devel.projects.last, proj
|
316
|
-
|
336
|
+
assert_predicate devel.projects, :loaded?
|
317
337
|
|
318
|
-
|
338
|
+
assert_not_predicate proj, :persisted?
|
319
339
|
devel.save
|
320
|
-
|
340
|
+
assert_predicate proj, :persisted?
|
321
341
|
assert_equal devel.projects.last, proj
|
322
342
|
assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
|
323
343
|
end
|
324
344
|
|
325
345
|
def test_build_by_new_record
|
326
|
-
devel = Developer.new(:
|
327
|
-
devel.projects.build(:
|
328
|
-
proj2 = devel.projects.build(:
|
346
|
+
devel = Developer.new(name: "Marcel", salary: 75000)
|
347
|
+
devel.projects.build(name: "Make bed")
|
348
|
+
proj2 = devel.projects.build(name: "Lie in it")
|
329
349
|
assert_equal devel.projects.last, proj2
|
330
|
-
|
350
|
+
assert_not_predicate proj2, :persisted?
|
331
351
|
devel.save
|
332
|
-
|
333
|
-
|
352
|
+
assert_predicate devel, :persisted?
|
353
|
+
assert_predicate proj2, :persisted?
|
334
354
|
assert_equal devel.projects.last, proj2
|
335
355
|
assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
|
336
356
|
end
|
@@ -338,40 +358,27 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
338
358
|
def test_create
|
339
359
|
devel = Developer.find(1)
|
340
360
|
proj = devel.projects.create("name" => "Projekt")
|
341
|
-
|
361
|
+
assert_not_predicate devel.projects, :loaded?
|
342
362
|
|
343
363
|
assert_equal devel.projects.last, proj
|
344
|
-
|
364
|
+
assert_not_predicate devel.projects, :loaded?
|
345
365
|
|
346
|
-
|
366
|
+
assert_predicate proj, :persisted?
|
347
367
|
assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
|
348
368
|
end
|
349
369
|
|
350
|
-
def test_create_by_new_record
|
351
|
-
devel = Developer.new(:name => "Marcel", :salary => 75000)
|
352
|
-
devel.projects.build(:name => "Make bed")
|
353
|
-
proj2 = devel.projects.build(:name => "Lie in it")
|
354
|
-
assert_equal devel.projects.last, proj2
|
355
|
-
assert !proj2.persisted?
|
356
|
-
devel.save
|
357
|
-
assert devel.persisted?
|
358
|
-
assert proj2.persisted?
|
359
|
-
assert_equal devel.projects.last, proj2
|
360
|
-
assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
|
361
|
-
end
|
362
|
-
|
363
370
|
def test_creation_respects_hash_condition
|
364
371
|
# in Oracle '' is saved as null therefore need to save ' ' in not null column
|
365
|
-
post = categories(:general).post_with_conditions.build(:
|
372
|
+
post = categories(:general).post_with_conditions.build(body: " ")
|
366
373
|
|
367
|
-
assert
|
368
|
-
assert_equal
|
374
|
+
assert post.save
|
375
|
+
assert_equal "Yet Another Testing Title", post.title
|
369
376
|
|
370
377
|
# in Oracle '' is saved as null therefore need to save ' ' in not null column
|
371
|
-
another_post = categories(:general).post_with_conditions.create(:
|
378
|
+
another_post = categories(:general).post_with_conditions.create(body: " ")
|
372
379
|
|
373
|
-
|
374
|
-
assert_equal
|
380
|
+
assert_predicate another_post, :persisted?
|
381
|
+
assert_equal "Yet Another Testing Title", another_post.title
|
375
382
|
end
|
376
383
|
|
377
384
|
def test_distinct_after_the_fact
|
@@ -380,7 +387,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
380
387
|
dev.projects << projects(:active_record)
|
381
388
|
|
382
389
|
assert_equal 3, dev.projects.size
|
383
|
-
assert_equal 1, dev.projects.
|
390
|
+
assert_equal 1, dev.projects.uniq.size
|
384
391
|
end
|
385
392
|
|
386
393
|
def test_distinct_before_the_fact
|
@@ -438,10 +445,10 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
438
445
|
|
439
446
|
def test_removing_associations_on_destroy
|
440
447
|
david = DeveloperWithBeforeDestroyRaise.find(1)
|
441
|
-
|
448
|
+
assert_not_empty david.projects
|
442
449
|
david.destroy
|
443
|
-
|
444
|
-
|
450
|
+
assert_empty david.projects
|
451
|
+
assert_empty DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1")
|
445
452
|
end
|
446
453
|
|
447
454
|
def test_destroying
|
@@ -456,7 +463,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
456
463
|
end
|
457
464
|
|
458
465
|
join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id} AND project_id = #{project.id}")
|
459
|
-
|
466
|
+
assert_empty join_records
|
460
467
|
|
461
468
|
assert_equal 1, david.reload.projects.size
|
462
469
|
assert_equal 1, david.projects.reload.size
|
@@ -472,7 +479,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
472
479
|
end
|
473
480
|
|
474
481
|
join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
|
475
|
-
|
482
|
+
assert_empty join_records
|
476
483
|
|
477
484
|
assert_equal 0, david.reload.projects.size
|
478
485
|
assert_equal 0, david.projects.reload.size
|
@@ -481,23 +488,23 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
481
488
|
def test_destroy_all
|
482
489
|
david = Developer.find(1)
|
483
490
|
david.projects.reload
|
484
|
-
|
491
|
+
assert_not_empty david.projects
|
485
492
|
|
486
493
|
assert_no_difference "Project.count" do
|
487
494
|
david.projects.destroy_all
|
488
495
|
end
|
489
496
|
|
490
497
|
join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
|
491
|
-
|
498
|
+
assert_empty join_records
|
492
499
|
|
493
|
-
|
494
|
-
|
500
|
+
assert_empty david.projects
|
501
|
+
assert_empty david.projects.reload
|
495
502
|
end
|
496
503
|
|
497
504
|
def test_destroy_associations_destroys_multiple_associations
|
498
505
|
george = parrots(:george)
|
499
|
-
|
500
|
-
|
506
|
+
assert_not_empty george.pirates
|
507
|
+
assert_not_empty george.treasures
|
501
508
|
|
502
509
|
assert_no_difference "Pirate.count" do
|
503
510
|
assert_no_difference "Treasure.count" do
|
@@ -506,12 +513,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
506
513
|
end
|
507
514
|
|
508
515
|
join_records = Parrot.connection.select_all("SELECT * FROM parrots_pirates WHERE parrot_id = #{george.id}")
|
509
|
-
|
510
|
-
|
516
|
+
assert_empty join_records
|
517
|
+
assert_empty george.pirates.reload
|
511
518
|
|
512
519
|
join_records = Parrot.connection.select_all("SELECT * FROM parrots_treasures WHERE parrot_id = #{george.id}")
|
513
|
-
|
514
|
-
|
520
|
+
assert_empty join_records
|
521
|
+
assert_empty george.treasures.reload
|
515
522
|
end
|
516
523
|
|
517
524
|
def test_associations_with_conditions
|
@@ -543,9 +550,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
543
550
|
|
544
551
|
developer = project.developers.first
|
545
552
|
|
546
|
-
|
547
|
-
|
548
|
-
|
553
|
+
assert_queries(0) do
|
554
|
+
assert_predicate project.developers, :loaded?
|
555
|
+
assert_includes project.developers, developer
|
549
556
|
end
|
550
557
|
end
|
551
558
|
|
@@ -554,19 +561,19 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
554
561
|
developer = project.developers.first
|
555
562
|
|
556
563
|
project.reload
|
557
|
-
|
564
|
+
assert_not_predicate project.developers, :loaded?
|
558
565
|
assert_queries(1) do
|
559
|
-
|
566
|
+
assert_includes project.developers, developer
|
560
567
|
end
|
561
|
-
|
568
|
+
assert_not_predicate project.developers, :loaded?
|
562
569
|
end
|
563
570
|
|
564
571
|
def test_include_returns_false_for_non_matching_record_to_verify_scoping
|
565
572
|
project = projects(:active_record)
|
566
|
-
developer = Developer.create :
|
573
|
+
developer = Developer.create name: "Bryan", salary: 50_000
|
567
574
|
|
568
|
-
|
569
|
-
|
575
|
+
assert_not_predicate project.developers, :loaded?
|
576
|
+
assert_not project.developers.include?(developer)
|
570
577
|
end
|
571
578
|
|
572
579
|
def test_find_with_merged_options
|
@@ -577,32 +584,32 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
577
584
|
|
578
585
|
def test_dynamic_find_should_respect_association_order
|
579
586
|
# Developers are ordered 'name DESC, id DESC'
|
580
|
-
high_id_jamis = projects(:active_record).developers.create(:
|
587
|
+
high_id_jamis = projects(:active_record).developers.create(name: "Jamis")
|
581
588
|
|
582
|
-
assert_equal high_id_jamis, projects(:active_record).developers.merge(:
|
583
|
-
assert_equal high_id_jamis, projects(:active_record).developers.find_by_name(
|
589
|
+
assert_equal high_id_jamis, projects(:active_record).developers.merge(where: "name = 'Jamis'").first
|
590
|
+
assert_equal high_id_jamis, projects(:active_record).developers.find_by_name("Jamis")
|
584
591
|
end
|
585
592
|
|
586
593
|
def test_find_should_append_to_association_order
|
587
|
-
ordered_developers = projects(:active_record).developers.order(
|
588
|
-
assert_equal [
|
594
|
+
ordered_developers = projects(:active_record).developers.order("projects.id")
|
595
|
+
assert_equal ["developers.name desc, developers.id desc", "projects.id"], ordered_developers.order_values
|
589
596
|
end
|
590
597
|
|
591
598
|
def test_dynamic_find_all_should_respect_readonly_access
|
592
|
-
projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid?}
|
599
|
+
projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid? }
|
593
600
|
projects(:active_record).readonly_developers.each(&:readonly?)
|
594
601
|
end
|
595
602
|
|
596
603
|
def test_new_with_values_in_collection
|
597
|
-
jamis = DeveloperForProjectWithAfterCreateHook.find_by_name(
|
598
|
-
david = DeveloperForProjectWithAfterCreateHook.find_by_name(
|
599
|
-
project = ProjectWithAfterCreateHook.new(:
|
604
|
+
jamis = DeveloperForProjectWithAfterCreateHook.find_by_name("Jamis")
|
605
|
+
david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
|
606
|
+
project = ProjectWithAfterCreateHook.new(name: "Cooking with Bertie")
|
600
607
|
project.developers << jamis
|
601
608
|
project.save!
|
602
609
|
project.reload
|
603
610
|
|
604
|
-
|
605
|
-
|
611
|
+
assert_includes project.developers, jamis
|
612
|
+
assert_includes project.developers, david
|
606
613
|
end
|
607
614
|
|
608
615
|
def test_find_in_association_with_options
|
@@ -613,8 +620,8 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
613
620
|
end
|
614
621
|
|
615
622
|
def test_association_with_extend_option
|
616
|
-
eponine = DeveloperWithExtendOption.create(name:
|
617
|
-
assert_equal
|
623
|
+
eponine = DeveloperWithExtendOption.create(name: "Eponine")
|
624
|
+
assert_equal "sns", eponine.projects.category
|
618
625
|
end
|
619
626
|
|
620
627
|
def test_replace_with_less
|
@@ -629,7 +636,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
629
636
|
david.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
|
630
637
|
david.save
|
631
638
|
assert_equal 2, david.projects.length
|
632
|
-
|
639
|
+
assert_not_includes david.projects, projects(:active_record)
|
633
640
|
end
|
634
641
|
|
635
642
|
def test_replace_on_new_object
|
@@ -647,9 +654,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
647
654
|
developer.special_projects << special_project
|
648
655
|
developer.reload
|
649
656
|
|
650
|
-
|
651
|
-
|
652
|
-
|
657
|
+
assert_includes developer.projects, special_project
|
658
|
+
assert_includes developer.special_projects, special_project
|
659
|
+
assert_not_includes developer.special_projects, other_project
|
653
660
|
end
|
654
661
|
|
655
662
|
def test_symbol_join_table
|
@@ -659,7 +666,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
659
666
|
assert_includes developer.sym_special_projects, sp
|
660
667
|
end
|
661
668
|
|
662
|
-
def
|
669
|
+
def test_update_columns_after_push_without_duplicate_join_table_rows
|
663
670
|
developer = Developer.new("name" => "Kano")
|
664
671
|
project = SpecialProject.create("name" => "Special Project")
|
665
672
|
assert developer.save
|
@@ -690,28 +697,24 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
690
697
|
end
|
691
698
|
|
692
699
|
def test_habtm_respects_select_query_method
|
693
|
-
assert_equal [
|
700
|
+
assert_equal ["id"], developers(:david).projects.select(:id).first.attributes.keys
|
701
|
+
end
|
702
|
+
|
703
|
+
def test_join_middle_table_alias
|
704
|
+
assert_equal(
|
705
|
+
2,
|
706
|
+
Project.includes(:developers_projects).where.not("developers_projects.joined_on": nil).to_a.size
|
707
|
+
)
|
694
708
|
end
|
695
709
|
|
696
710
|
def test_join_table_alias
|
697
|
-
# FIXME: `references` has no impact on the aliases generated for the join
|
698
|
-
# query. The fact that we pass `:developers_projects_join` to `references`
|
699
|
-
# and that the SQL string contains `developers_projects_join` is merely a
|
700
|
-
# coincidence.
|
701
711
|
assert_equal(
|
702
712
|
3,
|
703
|
-
Developer.
|
704
|
-
:includes => {:projects => :developers},
|
705
|
-
:where => 'projects_developers_projects_join.joined_on IS NOT NULL'
|
706
|
-
).to_a.size
|
713
|
+
Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).to_a.size
|
707
714
|
)
|
708
715
|
end
|
709
716
|
|
710
717
|
def test_join_with_group
|
711
|
-
# FIXME: `references` has no impact on the aliases generated for the join
|
712
|
-
# query. The fact that we pass `:developers_projects_join` to `references`
|
713
|
-
# and that the SQL string contains `developers_projects_join` is merely a
|
714
|
-
# coincidence.
|
715
718
|
group = Developer.columns.inject([]) do |g, c|
|
716
719
|
g << "developers.#{c.name}"
|
717
720
|
g << "developers_projects_2.#{c.name}"
|
@@ -720,16 +723,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
720
723
|
|
721
724
|
assert_equal(
|
722
725
|
3,
|
723
|
-
Developer.
|
724
|
-
:includes => {:projects => :developers}, :where => 'projects_developers_projects_join.joined_on IS NOT NULL',
|
725
|
-
:group => group.join(",")
|
726
|
-
).to_a.size
|
726
|
+
Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).group(group.join(",")).to_a.size
|
727
727
|
)
|
728
728
|
end
|
729
729
|
|
730
730
|
def test_find_grouped
|
731
|
-
all_posts_from_category1 = Post.all.merge!(:
|
732
|
-
grouped_posts_of_category1 = Post.all.merge!(:
|
731
|
+
all_posts_from_category1 = Post.all.merge!(where: "category_id = 1", joins: :categories).to_a
|
732
|
+
grouped_posts_of_category1 = Post.all.merge!(where: "category_id = 1", group: "author_id", select: "count(posts.id) as posts_count", joins: :categories).to_a
|
733
733
|
assert_equal 5, all_posts_from_category1.size
|
734
734
|
assert_equal 2, grouped_posts_of_category1.size
|
735
735
|
end
|
@@ -740,8 +740,8 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
740
740
|
end
|
741
741
|
|
742
742
|
def test_find_scoped_grouped_having
|
743
|
-
assert_equal 2, projects(:active_record).
|
744
|
-
assert projects(:active_record).
|
743
|
+
assert_equal 2, projects(:active_record).well_paid_salary_groups.to_a.size
|
744
|
+
assert projects(:active_record).well_paid_salary_groups.all? { |g| g.salary > 10000 }
|
745
745
|
end
|
746
746
|
|
747
747
|
def test_get_ids
|
@@ -760,9 +760,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
760
760
|
|
761
761
|
def test_get_ids_for_unloaded_associations_does_not_load_them
|
762
762
|
developer = developers(:david)
|
763
|
-
|
763
|
+
assert_not_predicate developer.projects, :loaded?
|
764
764
|
assert_equal projects(:active_record, :action_controller).map(&:id).sort, developer.project_ids.sort
|
765
|
-
|
765
|
+
assert_not_predicate developer.projects, :loaded?
|
766
766
|
end
|
767
767
|
|
768
768
|
def test_assign_ids
|
@@ -776,13 +776,23 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
776
776
|
|
777
777
|
def test_assign_ids_ignoring_blanks
|
778
778
|
developer = Developer.new("name" => "Joe")
|
779
|
-
developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id,
|
779
|
+
developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id, ""]
|
780
780
|
developer.save
|
781
781
|
developer.reload
|
782
782
|
assert_equal 2, developer.projects.length
|
783
783
|
assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
|
784
784
|
end
|
785
785
|
|
786
|
+
def test_singular_ids_are_reloaded_after_collection_concat
|
787
|
+
student = Student.create(name: "Alberto Almagro")
|
788
|
+
student.lesson_ids
|
789
|
+
|
790
|
+
lesson = Lesson.create(name: "DSI")
|
791
|
+
student.lessons << lesson
|
792
|
+
|
793
|
+
assert_includes student.lesson_ids, lesson.id
|
794
|
+
end
|
795
|
+
|
786
796
|
def test_scoped_find_on_through_association_doesnt_return_read_only_records
|
787
797
|
tag = Post.find(1).tags.find_by_name("General")
|
788
798
|
|
@@ -792,12 +802,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
792
802
|
end
|
793
803
|
|
794
804
|
def test_has_many_through_polymorphic_has_manys_works
|
795
|
-
assert_equal [10, 20].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
|
805
|
+
assert_equal ["$10.00", "$20.00"].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
|
796
806
|
end
|
797
807
|
|
798
808
|
def test_symbols_as_keys
|
799
|
-
developer = DeveloperWithSymbolsForKeys.new(:
|
800
|
-
project = ProjectWithSymbolsForKeys.new(:
|
809
|
+
developer = DeveloperWithSymbolsForKeys.new(name: "David")
|
810
|
+
project = ProjectWithSymbolsForKeys.new(name: "Rails Testing")
|
801
811
|
project.developers << developer
|
802
812
|
project.save!
|
803
813
|
|
@@ -810,7 +820,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
810
820
|
def test_dynamic_find_should_respect_association_include
|
811
821
|
# SQL error in sort clause if :include is not included
|
812
822
|
# due to Unknown column 'authors.id'
|
813
|
-
assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title(
|
823
|
+
assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title("Welcome to the weblog")
|
814
824
|
end
|
815
825
|
|
816
826
|
def test_count
|
@@ -842,12 +852,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
842
852
|
end
|
843
853
|
|
844
854
|
def test_attributes_are_being_set_when_initialized_from_habtm_association_with_where_clause
|
845
|
-
new_developer = projects(:action_controller).developers.where(:
|
855
|
+
new_developer = projects(:action_controller).developers.where(name: "Marcelo").build
|
846
856
|
assert_equal new_developer.name, "Marcelo"
|
847
857
|
end
|
848
858
|
|
849
859
|
def test_attributes_are_being_set_when_initialized_from_habtm_association_with_multiple_where_clauses
|
850
|
-
new_developer = projects(:action_controller).developers.where(:
|
860
|
+
new_developer = projects(:action_controller).developers.where(name: "Marcelo").where(salary: 90_000).build
|
851
861
|
assert_equal new_developer.name, "Marcelo"
|
852
862
|
assert_equal new_developer.salary, 90_000
|
853
863
|
end
|
@@ -855,7 +865,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
855
865
|
def test_include_method_in_has_and_belongs_to_many_association_should_return_true_for_instance_added_with_build
|
856
866
|
project = Project.new
|
857
867
|
developer = project.developers.build
|
858
|
-
|
868
|
+
assert_includes project.developers, developer
|
859
869
|
end
|
860
870
|
|
861
871
|
def test_destruction_does_not_error_without_primary_key
|
@@ -870,9 +880,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
870
880
|
|
871
881
|
def test_has_and_belongs_to_many_associations_on_new_records_use_null_relations
|
872
882
|
projects = Developer.new.projects
|
873
|
-
|
883
|
+
assert_queries(0) do
|
874
884
|
assert_equal [], projects
|
875
|
-
assert_equal [], projects.where(title:
|
885
|
+
assert_equal [], projects.where(title: "omg")
|
876
886
|
assert_equal [], projects.pluck(:title)
|
877
887
|
assert_equal 0, projects.count
|
878
888
|
end
|
@@ -886,7 +896,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
886
896
|
treasure.valid?
|
887
897
|
|
888
898
|
assert_equal 1, treasure.rich_people.size
|
889
|
-
assert_nil rich_person.first_name,
|
899
|
+
assert_nil rich_person.first_name, "should not run associated person validation on create when validate: false"
|
890
900
|
end
|
891
901
|
|
892
902
|
def test_association_with_validate_false_does_not_run_associated_validation_callbacks_on_update
|
@@ -899,11 +909,11 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
899
909
|
treasure.valid?
|
900
910
|
|
901
911
|
assert_equal 1, treasure.rich_people.size
|
902
|
-
assert_equal person_first_name, rich_person.first_name,
|
912
|
+
assert_equal person_first_name, rich_person.first_name, "should not run associated person validation on update when validate: false"
|
903
913
|
end
|
904
914
|
|
905
915
|
def test_custom_join_table
|
906
|
-
assert_equal
|
916
|
+
assert_equal "edges", Vertex.reflect_on_association(:sources).join_table
|
907
917
|
end
|
908
918
|
|
909
919
|
def test_has_and_belongs_to_many_in_a_namespaced_model_pointing_to_a_namespaced_model
|
@@ -927,29 +937,24 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
927
937
|
def test_redefine_habtm
|
928
938
|
child = SubDeveloper.new("name" => "Aredridel")
|
929
939
|
child.special_projects << SpecialProject.new("name" => "Special Project")
|
930
|
-
assert child.save,
|
940
|
+
assert child.save, "child object should be saved"
|
931
941
|
end
|
932
942
|
|
933
943
|
def test_habtm_with_reflection_using_class_name_and_fixtures
|
934
|
-
assert_not_nil Developer._reflections[
|
944
|
+
assert_not_nil Developer._reflections["shared_computers"]
|
935
945
|
# Checking the fixture for named association is important here, because it's the only way
|
936
946
|
# we've been able to reproduce this bug
|
937
|
-
assert_not_nil File.read(File.expand_path("
|
947
|
+
assert_not_nil File.read(File.expand_path("../../fixtures/developers.yml", __dir__)).index("shared_computers")
|
938
948
|
assert_equal developers(:david).shared_computers.first, computers(:laptop)
|
939
949
|
end
|
940
950
|
|
941
951
|
def test_with_symbol_class_name
|
942
952
|
assert_nothing_raised do
|
943
|
-
DeveloperWithSymbolClassName.new
|
953
|
+
developer = DeveloperWithSymbolClassName.new
|
954
|
+
developer.projects
|
944
955
|
end
|
945
956
|
end
|
946
957
|
|
947
|
-
def test_association_force_reload_with_only_true_is_deprecated
|
948
|
-
developer = Developer.find(1)
|
949
|
-
|
950
|
-
assert_deprecated { developer.projects(true) }
|
951
|
-
end
|
952
|
-
|
953
958
|
def test_alternate_database
|
954
959
|
professor = Professor.create(name: "Plum")
|
955
960
|
course = Course.create(name: "Forensics")
|
@@ -1001,4 +1006,20 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
1001
1006
|
user = User.create!
|
1002
1007
|
assert_nothing_raised { user.jobs_pool.clear }
|
1003
1008
|
end
|
1009
|
+
|
1010
|
+
def test_has_and_belongs_to_many_while_partial_writes_false
|
1011
|
+
original_partial_writes = ActiveRecord::Base.partial_writes
|
1012
|
+
ActiveRecord::Base.partial_writes = false
|
1013
|
+
developer = Developer.new(name: "Mehmet Emin İNAÇ")
|
1014
|
+
developer.projects << Project.new(name: "Bounty")
|
1015
|
+
|
1016
|
+
assert developer.save
|
1017
|
+
ensure
|
1018
|
+
ActiveRecord::Base.partial_writes = original_partial_writes
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
def test_has_and_belongs_to_many_with_belongs_to
|
1022
|
+
sink = Sink.create! kitchen: Kitchen.new, sources: [Source.new]
|
1023
|
+
assert_equal 1, sink.sources.count
|
1024
|
+
end
|
1004
1025
|
end
|