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
|
require "models/topic"
|
3
5
|
require "models/reply"
|
@@ -29,7 +31,7 @@ end
|
|
29
31
|
class ReplyTitle; end
|
30
32
|
|
31
33
|
class ReplyWithTitleObject < Reply
|
32
|
-
validates_uniqueness_of :content, :
|
34
|
+
validates_uniqueness_of :content, scope: :title
|
33
35
|
|
34
36
|
def title; ReplyTitle.new; end
|
35
37
|
end
|
@@ -41,13 +43,13 @@ end
|
|
41
43
|
|
42
44
|
class BigIntTest < ActiveRecord::Base
|
43
45
|
INT_MAX_VALUE = 2147483647
|
44
|
-
self.table_name =
|
46
|
+
self.table_name = "cars"
|
45
47
|
validates :engines_count, uniqueness: true, inclusion: { in: 0..INT_MAX_VALUE }
|
46
48
|
end
|
47
49
|
|
48
50
|
class BigIntReverseTest < ActiveRecord::Base
|
49
51
|
INT_MAX_VALUE = 2147483647
|
50
|
-
self.table_name =
|
52
|
+
self.table_name = "cars"
|
51
53
|
validates :engines_count, inclusion: { in: 0..INT_MAX_VALUE }
|
52
54
|
validates :engines_count, uniqueness: true
|
53
55
|
end
|
@@ -60,14 +62,14 @@ class TopicWithAfterCreate < Topic
|
|
60
62
|
after_create :set_author
|
61
63
|
|
62
64
|
def set_author
|
63
|
-
|
65
|
+
update!(author_name: "#{title} #{id}")
|
64
66
|
end
|
65
67
|
end
|
66
68
|
|
67
69
|
class UniquenessValidationTest < ActiveRecord::TestCase
|
68
70
|
INT_MAX_VALUE = 2147483647
|
69
71
|
|
70
|
-
fixtures :topics,
|
72
|
+
fixtures :topics, "warehouse_things"
|
71
73
|
|
72
74
|
repair_validations(Topic, Reply)
|
73
75
|
|
@@ -81,8 +83,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
81
83
|
assert t.save, "Should still save t as unique"
|
82
84
|
|
83
85
|
t2 = Topic.new("title" => "I'm uniqué!")
|
84
|
-
|
85
|
-
|
86
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
87
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
86
88
|
assert_equal ["has already been taken"], t2.errors[:title]
|
87
89
|
|
88
90
|
t2.title = "Now I am really also unique"
|
@@ -93,8 +95,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
93
95
|
Topic.alias_attribute :new_title, :title
|
94
96
|
Topic.validates_uniqueness_of(:new_title)
|
95
97
|
|
96
|
-
topic = Topic.new(new_title:
|
97
|
-
|
98
|
+
topic = Topic.new(new_title: "abc")
|
99
|
+
assert_predicate topic, :valid?
|
98
100
|
end
|
99
101
|
|
100
102
|
def test_validates_uniqueness_with_nil_value
|
@@ -104,39 +106,39 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
104
106
|
assert t.save, "Should save t as unique"
|
105
107
|
|
106
108
|
t2 = Topic.new("title" => nil)
|
107
|
-
|
108
|
-
|
109
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
110
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
109
111
|
assert_equal ["has already been taken"], t2.errors[:title]
|
110
112
|
end
|
111
113
|
|
112
114
|
def test_validates_uniqueness_with_validates
|
113
|
-
Topic.validates :title, :
|
114
|
-
Topic.create!(
|
115
|
+
Topic.validates :title, uniqueness: true
|
116
|
+
Topic.create!("title" => "abc")
|
115
117
|
|
116
|
-
t2 = Topic.new(
|
117
|
-
|
118
|
+
t2 = Topic.new("title" => "abc")
|
119
|
+
assert_not_predicate t2, :valid?
|
118
120
|
assert t2.errors[:title]
|
119
121
|
end
|
120
122
|
|
121
123
|
def test_validate_uniqueness_when_integer_out_of_range
|
122
124
|
entry = BigIntTest.create(engines_count: INT_MAX_VALUE + 1)
|
123
|
-
assert_equal entry.errors[:engines_count], [
|
125
|
+
assert_equal entry.errors[:engines_count], ["is not included in the list"]
|
124
126
|
end
|
125
127
|
|
126
128
|
def test_validate_uniqueness_when_integer_out_of_range_show_order_does_not_matter
|
127
129
|
entry = BigIntReverseTest.create(engines_count: INT_MAX_VALUE + 1)
|
128
|
-
assert_equal entry.errors[:engines_count], [
|
130
|
+
assert_equal entry.errors[:engines_count], ["is not included in the list"]
|
129
131
|
end
|
130
132
|
|
131
133
|
def test_validates_uniqueness_with_newline_chars
|
132
|
-
Topic.validates_uniqueness_of(:title, :
|
134
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: false)
|
133
135
|
|
134
136
|
t = Topic.new("title" => "new\nline")
|
135
137
|
assert t.save, "Should save t as unique"
|
136
138
|
end
|
137
139
|
|
138
140
|
def test_validate_uniqueness_with_scope
|
139
|
-
Reply.validates_uniqueness_of(:content, :
|
141
|
+
Reply.validates_uniqueness_of(:content, scope: "parent_id")
|
140
142
|
|
141
143
|
t = Topic.create("title" => "I'm unique!")
|
142
144
|
|
@@ -144,7 +146,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
144
146
|
assert r1.valid?, "Saving r1"
|
145
147
|
|
146
148
|
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
147
|
-
|
149
|
+
assert_not r2.valid?, "Saving r2 first time"
|
148
150
|
|
149
151
|
r2.content = "something else"
|
150
152
|
assert r2.save, "Saving r2 second time"
|
@@ -154,8 +156,34 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
154
156
|
assert r3.valid?, "Saving r3"
|
155
157
|
end
|
156
158
|
|
159
|
+
def test_validate_uniqueness_with_aliases
|
160
|
+
Reply.validates_uniqueness_of(:new_content, scope: :new_parent_id)
|
161
|
+
|
162
|
+
t = Topic.create(title: "I'm unique!")
|
163
|
+
|
164
|
+
r1 = t.replies.create(title: "r1", content: "hello world")
|
165
|
+
assert_predicate r1, :valid?, "Saving r1"
|
166
|
+
|
167
|
+
r2 = t.replies.create(title: "r2", content: "hello world")
|
168
|
+
assert_not_predicate r2, :valid?, "Saving r2 first time"
|
169
|
+
|
170
|
+
r2.content = "something else"
|
171
|
+
assert r2.save, "Saving r2 second time"
|
172
|
+
|
173
|
+
t2 = Topic.create("title" => "I'm unique too!")
|
174
|
+
r3 = t2.replies.create(title: "r3", content: "hello world")
|
175
|
+
assert_predicate r3, :valid?, "Saving r3"
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_validate_uniqueness_with_scope_invalid_syntax
|
179
|
+
error = assert_raises(ArgumentError) do
|
180
|
+
Reply.validates_uniqueness_of(:content, scope: { parent_id: false })
|
181
|
+
end
|
182
|
+
assert_match(/Pass a symbol or an array of symbols instead/, error.to_s)
|
183
|
+
end
|
184
|
+
|
157
185
|
def test_validate_uniqueness_with_object_scope
|
158
|
-
Reply.validates_uniqueness_of(:content, :
|
186
|
+
Reply.validates_uniqueness_of(:content, scope: :topic)
|
159
187
|
|
160
188
|
t = Topic.create("title" => "I'm unique!")
|
161
189
|
|
@@ -163,7 +191,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
163
191
|
assert r1.valid?, "Saving r1"
|
164
192
|
|
165
193
|
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
166
|
-
|
194
|
+
assert_not r2.valid?, "Saving r2 first time"
|
167
195
|
end
|
168
196
|
|
169
197
|
def test_validate_uniqueness_with_polymorphic_object_scope
|
@@ -184,7 +212,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
184
212
|
assert r1.valid?, "Saving r1"
|
185
213
|
|
186
214
|
r2 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
|
187
|
-
|
215
|
+
assert_not r2.valid?, "Saving r2 first time"
|
188
216
|
end
|
189
217
|
|
190
218
|
def test_validate_uniqueness_with_object_arg
|
@@ -196,7 +224,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
196
224
|
assert r1.valid?, "Saving r1"
|
197
225
|
|
198
226
|
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
199
|
-
|
227
|
+
assert_not r2.valid?, "Saving r2 first time"
|
200
228
|
end
|
201
229
|
|
202
230
|
def test_validate_uniqueness_scoped_to_defining_class
|
@@ -206,7 +234,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
206
234
|
assert r1.valid?, "Saving r1"
|
207
235
|
|
208
236
|
r2 = t.silly_unique_replies.create "title" => "r2", "content" => "a barrel of fun"
|
209
|
-
|
237
|
+
assert_not r2.valid?, "Saving r2"
|
210
238
|
|
211
239
|
# Should succeed as validates_uniqueness_of only applies to
|
212
240
|
# UniqueReply and its subclasses
|
@@ -215,7 +243,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
215
243
|
end
|
216
244
|
|
217
245
|
def test_validate_uniqueness_with_scope_array
|
218
|
-
Reply.validates_uniqueness_of(:author_name, :
|
246
|
+
Reply.validates_uniqueness_of(:author_name, scope: [:author_email_address, :parent_id])
|
219
247
|
|
220
248
|
t = Topic.create("title" => "The earth is actually flat!")
|
221
249
|
|
@@ -223,23 +251,23 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
223
251
|
assert r1.valid?, "Saving r1"
|
224
252
|
|
225
253
|
r2 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply again..."
|
226
|
-
|
254
|
+
assert_not r2.valid?, "Saving r2. Double reply by same author."
|
227
255
|
|
228
256
|
r2.author_email_address = "jeremy_alt_email@rubyonrails.com"
|
229
257
|
assert r2.save, "Saving r2 the second time."
|
230
258
|
|
231
259
|
r3 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy_alt_email@rubyonrails.com", "title" => "You're wrong", "content" => "It's cubic"
|
232
|
-
|
260
|
+
assert_not r3.valid?, "Saving r3"
|
233
261
|
|
234
262
|
r3.author_name = "jj"
|
235
263
|
assert r3.save, "Saving r3 the second time."
|
236
264
|
|
237
265
|
r3.author_name = "jeremy"
|
238
|
-
|
266
|
+
assert_not r3.save, "Saving r3 the third time."
|
239
267
|
end
|
240
268
|
|
241
269
|
def test_validate_case_insensitive_uniqueness
|
242
|
-
Topic.validates_uniqueness_of(:title, :parent_id, :
|
270
|
+
Topic.validates_uniqueness_of(:title, :parent_id, case_sensitive: false, allow_nil: true)
|
243
271
|
|
244
272
|
t = Topic.new("title" => "I'm unique!", :parent_id => 2)
|
245
273
|
assert t.save, "Should save t as unique"
|
@@ -248,17 +276,17 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
248
276
|
assert t.save, "Should still save t as unique"
|
249
277
|
|
250
278
|
t2 = Topic.new("title" => "I'm UNIQUE!", :parent_id => 1)
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
279
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
280
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
281
|
+
assert_predicate t2.errors[:title], :any?
|
282
|
+
assert_predicate t2.errors[:parent_id], :any?
|
255
283
|
assert_equal ["has already been taken"], t2.errors[:title]
|
256
284
|
|
257
285
|
t2.title = "I'm truly UNIQUE!"
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
286
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
287
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
288
|
+
assert_empty t2.errors[:title]
|
289
|
+
assert_predicate t2.errors[:parent_id], :any?
|
262
290
|
|
263
291
|
t2.parent_id = 4
|
264
292
|
assert t2.save, "Should now save t2 as unique"
|
@@ -272,15 +300,15 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
272
300
|
assert t_utf8.save, "Should save t_utf8 as unique"
|
273
301
|
|
274
302
|
# If database hasn't UTF-8 character set, this test fails
|
275
|
-
if Topic.all.merge!(:
|
303
|
+
if Topic.all.merge!(select: "LOWER(title) AS title").find(t_utf8.id).title == "я тоже уникальный!"
|
276
304
|
t2_utf8 = Topic.new("title" => "я тоже УНИКАЛЬНЫЙ!")
|
277
|
-
|
278
|
-
|
305
|
+
assert_not t2_utf8.valid?, "Shouldn't be valid"
|
306
|
+
assert_not t2_utf8.save, "Shouldn't save t2_utf8 as unique"
|
279
307
|
end
|
280
308
|
end
|
281
309
|
|
282
310
|
def test_validate_case_sensitive_uniqueness_with_special_sql_like_chars
|
283
|
-
Topic.validates_uniqueness_of(:title, :
|
311
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true)
|
284
312
|
|
285
313
|
t = Topic.new("title" => "I'm unique!")
|
286
314
|
assert t.save, "Should save t as unique"
|
@@ -293,7 +321,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
293
321
|
end
|
294
322
|
|
295
323
|
def test_validate_case_insensitive_uniqueness_with_special_sql_like_chars
|
296
|
-
Topic.validates_uniqueness_of(:title, :
|
324
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: false)
|
297
325
|
|
298
326
|
t = Topic.new("title" => "I'm unique!")
|
299
327
|
assert t.save, "Should save t as unique"
|
@@ -305,8 +333,33 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
305
333
|
assert t3.save, "Should save t3 as unique"
|
306
334
|
end
|
307
335
|
|
336
|
+
def test_validate_uniqueness_by_default_database_collation
|
337
|
+
Topic.validates_uniqueness_of(:author_email_address)
|
338
|
+
|
339
|
+
topic1 = Topic.new(author_email_address: "david@loudthinking.com")
|
340
|
+
topic2 = Topic.new(author_email_address: "David@loudthinking.com")
|
341
|
+
|
342
|
+
assert_equal 1, Topic.where(author_email_address: "david@loudthinking.com").count
|
343
|
+
|
344
|
+
assert_not topic1.valid?
|
345
|
+
assert_not topic1.save
|
346
|
+
|
347
|
+
if current_adapter?(:Mysql2Adapter)
|
348
|
+
# Case insensitive collation (utf8mb4_0900_ai_ci) by default.
|
349
|
+
# Should not allow "David" if "david" exists.
|
350
|
+
assert_not topic2.valid?
|
351
|
+
assert_not topic2.save
|
352
|
+
else
|
353
|
+
assert topic2.valid?
|
354
|
+
assert topic2.save
|
355
|
+
end
|
356
|
+
|
357
|
+
assert_equal 1, Topic.where(author_email_address: "david@loudthinking.com").count
|
358
|
+
assert_equal 1, Topic.where(author_email_address: "David@loudthinking.com").count
|
359
|
+
end
|
360
|
+
|
308
361
|
def test_validate_case_sensitive_uniqueness
|
309
|
-
Topic.validates_uniqueness_of(:title, :
|
362
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true, allow_nil: true)
|
310
363
|
|
311
364
|
t = Topic.new("title" => "I'm unique!")
|
312
365
|
assert t.save, "Should save t as unique"
|
@@ -317,41 +370,41 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
317
370
|
t2 = Topic.new("title" => "I'M UNIQUE!")
|
318
371
|
assert t2.valid?, "Should be valid"
|
319
372
|
assert t2.save, "Should save t2 as unique"
|
320
|
-
|
321
|
-
|
373
|
+
assert_empty t2.errors[:title]
|
374
|
+
assert_empty t2.errors[:parent_id]
|
322
375
|
assert_not_equal ["has already been taken"], t2.errors[:title]
|
323
376
|
|
324
377
|
t3 = Topic.new("title" => "I'M uNiQUe!")
|
325
378
|
assert t3.valid?, "Should be valid"
|
326
379
|
assert t3.save, "Should save t2 as unique"
|
327
|
-
|
328
|
-
|
380
|
+
assert_empty t3.errors[:title]
|
381
|
+
assert_empty t3.errors[:parent_id]
|
329
382
|
assert_not_equal ["has already been taken"], t3.errors[:title]
|
330
383
|
end
|
331
384
|
|
332
385
|
def test_validate_case_sensitive_uniqueness_with_attribute_passed_as_integer
|
333
|
-
Topic.validates_uniqueness_of(:title, :
|
334
|
-
Topic.create!(
|
386
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true)
|
387
|
+
Topic.create!("title" => 101)
|
335
388
|
|
336
|
-
t2 = Topic.new(
|
337
|
-
|
389
|
+
t2 = Topic.new("title" => 101)
|
390
|
+
assert_not_predicate t2, :valid?
|
338
391
|
assert t2.errors[:title]
|
339
392
|
end
|
340
393
|
|
341
394
|
def test_validate_uniqueness_with_non_standard_table_names
|
342
|
-
i1 = WarehouseThing.create(:
|
343
|
-
|
395
|
+
i1 = WarehouseThing.create(value: 1000)
|
396
|
+
assert_not i1.valid?, "i1 should not be valid"
|
344
397
|
assert i1.errors[:value].any?, "Should not be empty"
|
345
398
|
end
|
346
399
|
|
347
400
|
def test_validates_uniqueness_inside_scoping
|
348
401
|
Topic.validates_uniqueness_of(:title)
|
349
402
|
|
350
|
-
Topic.where(:
|
403
|
+
Topic.where(author_name: "David").scoping do
|
351
404
|
t1 = Topic.new("title" => "I'm unique!", "author_name" => "Mary")
|
352
405
|
assert t1.save
|
353
406
|
t2 = Topic.new("title" => "I'm unique!", "author_name" => "David")
|
354
|
-
|
407
|
+
assert_not_predicate t2, :valid?
|
355
408
|
end
|
356
409
|
end
|
357
410
|
|
@@ -385,7 +438,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
385
438
|
|
386
439
|
def test_validate_uniqueness_with_limit_and_utf8
|
387
440
|
if current_adapter?(:SQLite3Adapter)
|
388
|
-
# Event.title has limit 5, but
|
441
|
+
# Event.title has limit 5, but SQLite doesn't truncate.
|
389
442
|
e1 = Event.create(title: "一二三四五六七八")
|
390
443
|
assert e1.valid?, "Could not create an event with a unique 8 characters title"
|
391
444
|
|
@@ -403,30 +456,30 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
403
456
|
end
|
404
457
|
|
405
458
|
def test_validate_straight_inheritance_uniqueness
|
406
|
-
w1 = IneptWizard.create(:
|
459
|
+
w1 = IneptWizard.create(name: "Rincewind", city: "Ankh-Morpork")
|
407
460
|
assert w1.valid?, "Saving w1"
|
408
461
|
|
409
462
|
# Should use validation from base class (which is abstract)
|
410
|
-
w2 = IneptWizard.new(:
|
411
|
-
|
463
|
+
w2 = IneptWizard.new(name: "Rincewind", city: "Quirm")
|
464
|
+
assert_not w2.valid?, "w2 shouldn't be valid"
|
412
465
|
assert w2.errors[:name].any?, "Should have errors for name"
|
413
466
|
assert_equal ["has already been taken"], w2.errors[:name], "Should have uniqueness message for name"
|
414
467
|
|
415
|
-
w3 = Conjurer.new(:
|
416
|
-
|
468
|
+
w3 = Conjurer.new(name: "Rincewind", city: "Quirm")
|
469
|
+
assert_not w3.valid?, "w3 shouldn't be valid"
|
417
470
|
assert w3.errors[:name].any?, "Should have errors for name"
|
418
471
|
assert_equal ["has already been taken"], w3.errors[:name], "Should have uniqueness message for name"
|
419
472
|
|
420
|
-
w4 = Conjurer.create(:
|
473
|
+
w4 = Conjurer.create(name: "The Amazing Bonko", city: "Quirm")
|
421
474
|
assert w4.valid?, "Saving w4"
|
422
475
|
|
423
|
-
w5 = Thaumaturgist.new(:
|
424
|
-
|
476
|
+
w5 = Thaumaturgist.new(name: "The Amazing Bonko", city: "Lancre")
|
477
|
+
assert_not w5.valid?, "w5 shouldn't be valid"
|
425
478
|
assert w5.errors[:name].any?, "Should have errors for name"
|
426
479
|
assert_equal ["has already been taken"], w5.errors[:name], "Should have uniqueness message for name"
|
427
480
|
|
428
|
-
w6 = Thaumaturgist.new(:
|
429
|
-
|
481
|
+
w6 = Thaumaturgist.new(name: "Mustrum Ridcully", city: "Quirm")
|
482
|
+
assert_not w6.valid?, "w6 shouldn't be valid"
|
430
483
|
assert w6.errors[:city].any?, "Should have errors for city"
|
431
484
|
assert_equal ["has already been taken"], w6.errors[:city], "Should have uniqueness message for city"
|
432
485
|
end
|
@@ -437,7 +490,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
437
490
|
Topic.create("title" => "I'm an unapproved topic", "approved" => false)
|
438
491
|
|
439
492
|
t3 = Topic.new("title" => "I'm a topic", "approved" => true)
|
440
|
-
|
493
|
+
assert_not t3.valid?, "t3 shouldn't be valid"
|
441
494
|
|
442
495
|
t4 = Topic.new("title" => "I'm an unapproved topic", "approved" => false)
|
443
496
|
assert t4.valid?, "t4 should be valid"
|
@@ -449,18 +502,35 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
449
502
|
}
|
450
503
|
end
|
451
504
|
|
505
|
+
def test_validate_uniqueness_with_conditions_with_record_arg
|
506
|
+
Topic.validates_uniqueness_of :title, conditions: ->(record) {
|
507
|
+
where(written_on: record.written_on.beginning_of_day..record.written_on.end_of_day)
|
508
|
+
}
|
509
|
+
|
510
|
+
today_midday = Time.current.midday
|
511
|
+
|
512
|
+
todays_topic = Topic.new(title: "Highlights of the Day", written_on: today_midday)
|
513
|
+
assert todays_topic.save, "1st topic written today with this title should save"
|
514
|
+
|
515
|
+
todays_topic_duplicate = Topic.new(title: "Highlights of the Day", written_on: today_midday + 1.minute)
|
516
|
+
assert todays_topic_duplicate.invalid?, "2nd topic written today with this title should be invalid"
|
517
|
+
|
518
|
+
tomorrows_topic = Topic.new(title: "Highlights of the Day", written_on: today_midday + 1.day)
|
519
|
+
assert tomorrows_topic.valid?, "1st topic written tomorrow with this title should be valid"
|
520
|
+
end
|
521
|
+
|
452
522
|
def test_validate_uniqueness_on_existing_relation
|
453
523
|
event = Event.create
|
454
|
-
|
524
|
+
assert_predicate TopicWithUniqEvent.create(event: event), :valid?
|
455
525
|
|
456
526
|
topic = TopicWithUniqEvent.new(event: event)
|
457
|
-
|
458
|
-
assert_equal [
|
527
|
+
assert_not_predicate topic, :valid?
|
528
|
+
assert_equal ["has already been taken"], topic.errors[:event]
|
459
529
|
end
|
460
530
|
|
461
531
|
def test_validate_uniqueness_on_empty_relation
|
462
532
|
topic = TopicWithUniqEvent.new
|
463
|
-
|
533
|
+
assert_predicate topic, :valid?
|
464
534
|
end
|
465
535
|
|
466
536
|
def test_validate_uniqueness_of_custom_primary_key
|
@@ -479,7 +549,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
479
549
|
key2 = klass.create!(key_number: 11)
|
480
550
|
|
481
551
|
key2.key_number = 10
|
482
|
-
|
552
|
+
assert_not_predicate key2, :valid?
|
483
553
|
end
|
484
554
|
|
485
555
|
def test_validate_uniqueness_without_primary_key
|
@@ -492,8 +562,8 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
492
562
|
end
|
493
563
|
|
494
564
|
abc = klass.create!(dashboard_id: "abc")
|
495
|
-
|
496
|
-
|
565
|
+
assert_predicate klass.new(dashboard_id: "xyz"), :valid?
|
566
|
+
assert_not_predicate klass.new(dashboard_id: "abc"), :valid?
|
497
567
|
|
498
568
|
abc.dashboard_id = "def"
|
499
569
|
|
@@ -501,7 +571,7 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
501
571
|
abc.save!
|
502
572
|
end
|
503
573
|
assert_match(/\AUnknown primary key for table dashboards in model/, e.message)
|
504
|
-
assert_match(/
|
574
|
+
assert_match(/Cannot validate uniqueness for persisted record without primary key.\z/, e.message)
|
505
575
|
end
|
506
576
|
|
507
577
|
def test_validate_uniqueness_ignores_itself_when_primary_key_changed
|
@@ -517,31 +587,31 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
517
587
|
|
518
588
|
def test_validate_uniqueness_with_after_create_performing_save
|
519
589
|
TopicWithAfterCreate.validates_uniqueness_of(:title)
|
520
|
-
topic = TopicWithAfterCreate.create!(:
|
590
|
+
topic = TopicWithAfterCreate.create!(title: "Title1")
|
521
591
|
assert topic.author_name.start_with?("Title1")
|
522
592
|
|
523
|
-
topic2 = TopicWithAfterCreate.new(:
|
524
|
-
|
593
|
+
topic2 = TopicWithAfterCreate.new(title: "Title1")
|
594
|
+
assert_not_predicate topic2, :valid?
|
525
595
|
assert_equal(["has already been taken"], topic2.errors[:title])
|
526
596
|
end
|
527
597
|
|
528
598
|
def test_validate_uniqueness_uuid
|
529
599
|
skip unless current_adapter?(:PostgreSQLAdapter)
|
530
|
-
item = UuidItem.create!(uuid: SecureRandom.uuid, title:
|
531
|
-
item.update(title:
|
600
|
+
item = UuidItem.create!(uuid: SecureRandom.uuid, title: "item1")
|
601
|
+
item.update(title: "item1-title2")
|
532
602
|
assert_empty item.errors
|
533
603
|
|
534
|
-
item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title:
|
535
|
-
item2.update(title:
|
604
|
+
item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: "item2")
|
605
|
+
item2.update(title: "item2-title2")
|
536
606
|
assert_empty item2.errors
|
537
607
|
end
|
538
608
|
|
539
609
|
def test_validate_uniqueness_regular_id
|
540
|
-
item = CoolTopic.create!(title:
|
610
|
+
item = CoolTopic.create!(title: "MyItem")
|
541
611
|
assert_empty item.errors
|
542
612
|
|
543
|
-
item2 = CoolTopic.new(id: item.id, title:
|
544
|
-
|
613
|
+
item2 = CoolTopic.new(id: item.id, title: "MyItem2")
|
614
|
+
assert_not_predicate item2, :valid?
|
545
615
|
|
546
616
|
assert_equal(["has already been taken"], item2.errors[:id])
|
547
617
|
end
|