ibm_db 5.6.1-arm64-darwin-24
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 +7 -0
- data/CHANGES +299 -0
- data/LICENSE +55 -0
- data/MANIFEST +14 -0
- data/ParameterizedQueries README +39 -0
- data/README +210 -0
- data/ext/Makefile +270 -0
- data/ext/Makefile.nt32 +181 -0
- data/ext/Makefile.nt32.191 +212 -0
- data/ext/extconf.rb +320 -0
- data/ext/gil_release_version.h +3 -0
- data/ext/ibm_db.bundle +0 -0
- data/ext/ibm_db.c +11865 -0
- data/ext/ibm_db.o +0 -0
- data/ext/mkmf.log +98 -0
- data/ext/ruby_ibm_db.h +241 -0
- data/ext/ruby_ibm_db_cli.c +867 -0
- data/ext/ruby_ibm_db_cli.h +508 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version.h +3 -0
- data/init.rb +42 -0
- data/lib/IBM_DB.rb +27 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4407 -0
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1965 -0
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -0
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -0
- data/lib/ibm_db.bundle +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +52 -0
- 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/example.log +1 -0
- data/test/assets/flowers.jpg +0 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/assets/test.txt +1 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +565 -0
- data/test/cases/adapters/mysql2/active_schema_test.rb +203 -0
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +52 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +102 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +65 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +57 -0
- data/test/cases/adapters/mysql2/connection_test.rb +208 -0
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +49 -0
- data/test/cases/adapters/mysql2/enum_test.rb +47 -0
- data/test/cases/adapters/mysql2/explain_test.rb +23 -0
- data/test/cases/adapters/mysql2/json_test.rb +24 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +238 -0
- 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/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +64 -0
- data/test/cases/adapters/mysql2/schema_test.rb +128 -0
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +38 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +16 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +125 -0
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +68 -0
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +113 -0
- data/test/cases/adapters/postgresql/array_test.rb +394 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +84 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +135 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +27 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +40 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +27 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +55 -0
- data/test/cases/adapters/postgresql/composite_test.rb +134 -0
- data/test/cases/adapters/postgresql/connection_test.rb +245 -0
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +89 -0
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +49 -0
- data/test/cases/adapters/postgresql/enum_test.rb +93 -0
- data/test/cases/adapters/postgresql/explain_test.rb +22 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +64 -0
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +46 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +372 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +390 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +108 -0
- data/test/cases/adapters/postgresql/integer_test.rb +27 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +52 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +51 -0
- data/test/cases/adapters/postgresql/money_test.rb +127 -0
- data/test/cases/adapters/postgresql/network_test.rb +102 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +51 -0
- 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 +447 -0
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +50 -0
- data/test/cases/adapters/postgresql/range_test.rb +457 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +112 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +35 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +110 -0
- data/test/cases/adapters/postgresql/schema_test.rb +713 -0
- data/test/cases/adapters/postgresql/serial_test.rb +156 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +61 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +92 -0
- 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 +35 -0
- data/test/cases/adapters/postgresql/utils_test.rb +64 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +411 -0
- data/test/cases/adapters/postgresql/xml_test.rb +50 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +64 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +101 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +23 -0
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +79 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +628 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +21 -0
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +170 -0
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +213 -0
- 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/association_scope_test.rb +16 -0
- data/test/cases/associations/belongs_to_associations_test.rb +1493 -0
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +43 -0
- data/test/cases/associations/callbacks_test.rb +208 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +245 -0
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +156 -0
- data/test/cases/associations/eager_load_nested_include_test.rb +127 -0
- data/test/cases/associations/eager_singularization_test.rb +148 -0
- data/test/cases/associations/eager_test.rb +1658 -0
- data/test/cases/associations/extension_test.rb +93 -0
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1025 -0
- data/test/cases/associations/has_many_associations_test.rb +3074 -0
- data/test/cases/associations/has_many_through_associations_test.rb +1580 -0
- data/test/cases/associations/has_one_associations_test.rb +872 -0
- data/test/cases/associations/has_one_through_associations_test.rb +429 -0
- data/test/cases/associations/inner_join_association_test.rb +215 -0
- data/test/cases/associations/inverse_associations_test.rb +941 -0
- data/test/cases/associations/join_model_test.rb +787 -0
- data/test/cases/associations/left_outer_join_association_test.rb +123 -0
- data/test/cases/associations/nested_through_associations_test.rb +636 -0
- data/test/cases/associations/required_test.rb +127 -0
- data/test/cases/associations_test.rb +516 -0
- data/test/cases/attribute_decorators_test.rb +126 -0
- data/test/cases/attribute_methods/read_test.rb +60 -0
- data/test/cases/attribute_methods_test.rb +1124 -0
- data/test/cases/attribute_set_test.rb +270 -0
- data/test/cases/attribute_test.rb +246 -0
- data/test/cases/attributes_test.rb +371 -0
- data/test/cases/autosave_association_test.rb +1953 -0
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +1770 -0
- data/test/cases/batches_test.rb +695 -0
- data/test/cases/binary_test.rb +39 -0
- data/test/cases/bind_parameter_test.rb +283 -0
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +131 -0
- data/test/cases/calculations_test.rb +1361 -0
- data/test/cases/callbacks_test.rb +503 -0
- data/test/cases/clone_test.rb +45 -0
- data/test/cases/coders/json_test.rb +17 -0
- data/test/cases/coders/yaml_column_test.rb +66 -0
- data/test/cases/collection_cache_key_test.rb +272 -0
- data/test/cases/column_alias_test.rb +19 -0
- data/test/cases/column_definition_test.rb +34 -0
- data/test/cases/comment_test.rb +204 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +60 -0
- data/test/cases/connection_adapters/connection_handler_test.rb +467 -0
- 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_specification_test.rb +12 -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 +436 -0
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +81 -0
- data/test/cases/connection_adapters/quoting_test.rb +13 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +294 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +119 -0
- data/test/cases/connection_management_test.rb +114 -0
- data/test/cases/connection_pool_test.rb +754 -0
- data/test/cases/connection_specification/resolver_test.rb +131 -0
- data/test/cases/core_test.rb +136 -0
- data/test/cases/counter_cache_test.rb +368 -0
- data/test/cases/custom_locking_test.rb +19 -0
- 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 +36 -0
- data/test/cases/date_test.rb +36 -0
- data/test/cases/date_time_precision_test.rb +129 -0
- data/test/cases/date_time_test.rb +76 -0
- data/test/cases/defaults_test.rb +254 -0
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +959 -0
- data/test/cases/disconnected_test.rb +30 -0
- data/test/cases/dup_test.rb +184 -0
- data/test/cases/enum_test.rb +823 -0
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_subscriber_test.rb +66 -0
- data/test/cases/explain_test.rb +79 -0
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +60 -0
- data/test/cases/finder_test.rb +1676 -0
- data/test/cases/fixture_set/file_test.rb +152 -0
- data/test/cases/fixtures_test.rb +1645 -0
- data/test/cases/forbidden_attributes_protection_test.rb +130 -0
- data/test/cases/habtm_destroy_order_test.rb +61 -0
- data/test/cases/helper.rb +233 -0
- data/test/cases/hot_compatibility_test.rb +143 -0
- data/test/cases/i18n_test.rb +46 -0
- data/test/cases/inheritance_test.rb +671 -0
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +243 -0
- data/test/cases/invalid_connection_test.rb +26 -0
- data/test/cases/invertible_migration_test.rb +527 -0
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +310 -0
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +787 -0
- data/test/cases/log_subscriber_test.rb +267 -0
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +504 -0
- data/test/cases/migration/change_table_test.rb +364 -0
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +186 -0
- data/test/cases/migration/column_positioning_test.rb +68 -0
- data/test/cases/migration/columns_test.rb +326 -0
- data/test/cases/migration/command_recorder_test.rb +437 -0
- data/test/cases/migration/compatibility_test.rb +673 -0
- data/test/cases/migration/create_join_table_test.rb +167 -0
- data/test/cases/migration/foreign_key_test.rb +581 -0
- data/test/cases/migration/helper.rb +40 -0
- data/test/cases/migration/index_test.rb +267 -0
- data/test/cases/migration/logger_test.rb +39 -0
- data/test/cases/migration/pending_migrations_test.rb +106 -0
- data/test/cases/migration/references_foreign_key_test.rb +235 -0
- data/test/cases/migration/references_index_test.rb +120 -0
- data/test/cases/migration/references_statements_test.rb +137 -0
- data/test/cases/migration/rename_table_test.rb +116 -0
- data/test/cases/migration_test.rb +1525 -0
- data/test/cases/migrator_test.rb +527 -0
- data/test/cases/mixin_test.rb +64 -0
- data/test/cases/modules_test.rb +174 -0
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +399 -0
- data/test/cases/multiple_db_test.rb +116 -0
- data/test/cases/nested_attributes_test.rb +1119 -0
- data/test/cases/nested_attributes_with_callbacks_test.rb +146 -0
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +1093 -0
- data/test/cases/pooled_connections_test.rb +73 -0
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +482 -0
- data/test/cases/query_cache_test.rb +915 -0
- data/test/cases/quoting_test.rb +303 -0
- data/test/cases/readonly_test.rb +120 -0
- data/test/cases/reaper_test.rb +199 -0
- data/test/cases/reflection_test.rb +520 -0
- data/test/cases/relation/delegation_test.rb +76 -0
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +434 -0
- data/test/cases/relation/mutation_test.rb +145 -0
- data/test/cases/relation/or_test.rb +192 -0
- data/test/cases/relation/predicate_builder_test.rb +31 -0
- data/test/cases/relation/record_fetch_warning_test.rb +42 -0
- 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 +141 -0
- data/test/cases/relation/where_clause_test.rb +257 -0
- data/test/cases/relation/where_test.rb +429 -0
- data/test/cases/relation_test.rb +482 -0
- data/test/cases/relations_test.rb +2251 -0
- data/test/cases/reload_models_test.rb +26 -0
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +141 -0
- data/test/cases/sanitize_test.rb +192 -0
- data/test/cases/schema_dumper_test.rb +550 -0
- data/test/cases/schema_loading_test.rb +53 -0
- data/test/cases/scoping/default_scoping_test.rb +569 -0
- data/test/cases/scoping/named_scoping_test.rb +649 -0
- data/test/cases/scoping/relation_scoping_test.rb +522 -0
- data/test/cases/secure_token_test.rb +47 -0
- data/test/cases/serialization_test.rb +106 -0
- data/test/cases/serialized_attribute_test.rb +455 -0
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +153 -0
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +320 -0
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +77 -0
- data/test/cases/tasks/database_tasks_test.rb +1526 -0
- data/test/cases/tasks/mysql_rake_test.rb +417 -0
- data/test/cases/tasks/postgresql_rake_test.rb +534 -0
- data/test/cases/tasks/sqlite_rake_test.rb +267 -0
- data/test/cases/test_case.rb +142 -0
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +96 -0
- data/test/cases/time_precision_test.rb +125 -0
- data/test/cases/timestamp_test.rb +504 -0
- data/test/cases/touch_later_test.rb +123 -0
- data/test/cases/transaction_callbacks_test.rb +772 -0
- data/test/cases/transaction_isolation_test.rb +106 -0
- data/test/cases/transactions_test.rb +1285 -0
- data/test/cases/type/adapter_specific_registry_test.rb +145 -0
- data/test/cases/type/date_time_test.rb +16 -0
- data/test/cases/type/integer_test.rb +29 -0
- data/test/cases/type/string_test.rb +24 -0
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +178 -0
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +41 -0
- data/test/cases/types_test.rb +26 -0
- data/test/cases/unconnected_test.rb +46 -0
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +75 -0
- data/test/cases/validations/association_validation_test.rb +99 -0
- data/test/cases/validations/i18n_generate_message_validation_test.rb +102 -0
- data/test/cases/validations/i18n_validation_test.rb +87 -0
- data/test/cases/validations/length_validation_test.rb +80 -0
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +105 -0
- data/test/cases/validations/uniqueness_validation_test.rb +618 -0
- data/test/cases/validations_repair_helper.rb +21 -0
- data/test/cases/validations_test.rb +229 -0
- data/test/cases/view_test.rb +222 -0
- data/test/cases/yaml_serialization_test.rb +166 -0
- data/test/config.example.yml +97 -0
- data/test/config.rb +7 -0
- data/test/config.yml +220 -0
- data/test/connections/native_ibm_db/connection.rb +44 -0
- data/test/fixtures/accounts.yml +29 -0
- data/test/fixtures/admin/accounts.yml +2 -0
- data/test/fixtures/admin/randomly_named_a9.yml +7 -0
- data/test/fixtures/admin/randomly_named_b0.yml +7 -0
- data/test/fixtures/admin/users.yml +10 -0
- data/test/fixtures/all/admin +1 -0
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/all/people.yml +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +11 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +17 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/binaries.yml +137 -0
- data/test/fixtures/books.yml +38 -0
- data/test/fixtures/bulbs.yml +5 -0
- data/test/fixtures/cars.yml +9 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories.yml +19 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +34 -0
- data/test/fixtures/categorizations.yml +23 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/clubs.yml +8 -0
- data/test/fixtures/collections.yml +3 -0
- data/test/fixtures/colleges.yml +3 -0
- data/test/fixtures/comments.yml +72 -0
- data/test/fixtures/companies.yml +72 -0
- data/test/fixtures/computers.yml +12 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/courses.yml +8 -0
- data/test/fixtures/customers.yml +35 -0
- data/test/fixtures/dashboards.yml +6 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/developers.yml +22 -0
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/dog_lovers.yml +7 -0
- data/test/fixtures/dogs.yml +4 -0
- data/test/fixtures/doubloons.yml +3 -0
- data/test/fixtures/edges.yml +5 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/essays.yml +16 -0
- data/test/fixtures/faces.yml +11 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/friendships.yml +4 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +33 -0
- data/test/fixtures/items.yml +3 -0
- data/test/fixtures/jobs.yml +7 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/mateys.yml +4 -0
- data/test/fixtures/member_details.yml +8 -0
- data/test/fixtures/member_types.yml +6 -0
- data/test/fixtures/members.yml +11 -0
- data/test/fixtures/memberships.yml +41 -0
- data/test/fixtures/men.yml +5 -0
- data/test/fixtures/minimalistics.yml +5 -0
- data/test/fixtures/minivans.yml +5 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixins.yml +29 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +3 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/organizations.yml +5 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +8 -0
- data/test/fixtures/other_topics.yml +42 -0
- data/test/fixtures/owners.yml +9 -0
- data/test/fixtures/parrots.yml +33 -0
- data/test/fixtures/parrots_pirates.yml +7 -0
- data/test/fixtures/people.yml +24 -0
- data/test/fixtures/peoples_treasures.yml +3 -0
- data/test/fixtures/pets.yml +19 -0
- data/test/fixtures/pirates.yml +15 -0
- data/test/fixtures/posts.yml +88 -0
- data/test/fixtures/price_estimates.yml +16 -0
- data/test/fixtures/products.yml +4 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/randomly_named_a9.yml +7 -0
- data/test/fixtures/ratings.yml +14 -0
- data/test/fixtures/readers.yml +17 -0
- data/test/fixtures/references.yml +17 -0
- data/test/fixtures/reserved_words/distinct.yml +5 -0
- data/test/fixtures/reserved_words/distinct_select.yml +11 -0
- data/test/fixtures/reserved_words/group.yml +14 -0
- data/test/fixtures/reserved_words/select.yml +8 -0
- data/test/fixtures/reserved_words/values.yml +7 -0
- data/test/fixtures/ships.yml +6 -0
- data/test/fixtures/speedometers.yml +8 -0
- data/test/fixtures/sponsors.yml +15 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/string_key_objects.yml +7 -0
- data/test/fixtures/subscribers.yml +11 -0
- data/test/fixtures/subscriptions.yml +12 -0
- data/test/fixtures/taggings.yml +78 -0
- data/test/fixtures/tags.yml +11 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/teapots.yml +3 -0
- data/test/fixtures/to_be_linked/accounts.yml +2 -0
- data/test/fixtures/to_be_linked/users.yml +10 -0
- data/test/fixtures/topics.yml +49 -0
- data/test/fixtures/toys.yml +14 -0
- data/test/fixtures/traffic_lights.yml +10 -0
- data/test/fixtures/treasures.yml +10 -0
- data/test/fixtures/trees.yml +3 -0
- data/test/fixtures/uuid_children.yml +3 -0
- data/test/fixtures/uuid_parents.yml +2 -0
- data/test/fixtures/variants.yml +4 -0
- data/test/fixtures/vegetables.yml +20 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/fixtures/warehouse_things.yml +3 -0
- data/test/fixtures/zines.yml +5 -0
- data/test/ibm_db_test.rb +25 -0
- data/test/migrations/10_urban/9_add_expressions.rb +13 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +17 -0
- data/test/migrations/magic/1_currencies_have_symbols.rb +13 -0
- data/test/migrations/missing/1000_people_have_middle_names.rb +11 -0
- data/test/migrations/missing/1_people_have_last_names.rb +11 -0
- data/test/migrations/missing/3_we_need_reminders.rb +14 -0
- data/test/migrations/missing/4_innocent_jointable.rb +14 -0
- data/test/migrations/rename/1_we_need_things.rb +13 -0
- data/test/migrations/rename/2_rename_things.rb +11 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy/2_people_have_descriptions.rb +11 -0
- data/test/migrations/to_copy2/1_create_articles.rb +9 -0
- data/test/migrations/to_copy2/2_create_comments.rb +9 -0
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +11 -0
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +11 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +9 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +9 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +11 -0
- data/test/migrations/valid/2_we_need_reminders.rb +14 -0
- data/test/migrations/valid/3_innocent_jointable.rb +14 -0
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +11 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +14 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +14 -0
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +11 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +14 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +14 -0
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +10 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +5 -0
- data/test/models/admin/randomly_named_c1.rb +9 -0
- data/test/models/admin/user.rb +48 -0
- data/test/models/admin.rb +7 -0
- data/test/models/aircraft.rb +7 -0
- data/test/models/arunit2_model.rb +5 -0
- data/test/models/author.rb +260 -0
- data/test/models/auto_id.rb +6 -0
- data/test/models/autoloadable/extra_firm.rb +4 -0
- data/test/models/binary.rb +4 -0
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +24 -0
- data/test/models/book.rb +33 -0
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +7 -0
- data/test/models/bulb.rb +61 -0
- data/test/models/cake_designer.rb +5 -0
- data/test/models/car.rb +36 -0
- data/test/models/carrier.rb +4 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +12 -0
- data/test/models/categorization.rb +21 -0
- data/test/models/category.rb +47 -0
- data/test/models/chef.rb +10 -0
- data/test/models/citation.rb +7 -0
- data/test/models/club.rb +28 -0
- data/test/models/college.rb +12 -0
- data/test/models/column.rb +5 -0
- data/test/models/column_name.rb +5 -0
- data/test/models/comment.rb +98 -0
- data/test/models/company.rb +226 -0
- data/test/models/company_in_module.rb +99 -0
- data/test/models/computer.rb +5 -0
- data/test/models/contact.rb +43 -0
- data/test/models/content.rb +42 -0
- data/test/models/contract.rb +38 -0
- data/test/models/country.rb +5 -0
- data/test/models/course.rb +8 -0
- data/test/models/customer.rb +85 -0
- data/test/models/customer_carrier.rb +16 -0
- data/test/models/dashboard.rb +5 -0
- data/test/models/default.rb +4 -0
- data/test/models/department.rb +6 -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 +341 -0
- 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 +7 -0
- data/test/models/dog_lover.rb +7 -0
- data/test/models/doubloon.rb +14 -0
- data/test/models/drink_designer.rb +20 -0
- data/test/models/edge.rb +7 -0
- data/test/models/electron.rb +7 -0
- data/test/models/engine.rb +5 -0
- data/test/models/entrant.rb +5 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +8 -0
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +5 -0
- data/test/models/eye.rb +39 -0
- data/test/models/face.rb +17 -0
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +8 -0
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +4 -0
- data/test/models/guitar.rb +6 -0
- data/test/models/hotel.rb +13 -0
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +5 -0
- data/test/models/interest.rb +16 -0
- data/test/models/invoice.rb +6 -0
- data/test/models/item.rb +9 -0
- data/test/models/job.rb +9 -0
- data/test/models/joke.rb +9 -0
- data/test/models/keyboard.rb +5 -0
- data/test/models/legacy_thing.rb +5 -0
- data/test/models/lesson.rb +13 -0
- data/test/models/line_item.rb +5 -0
- data/test/models/liquid.rb +6 -0
- data/test/models/man.rb +11 -0
- data/test/models/matey.rb +6 -0
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +45 -0
- data/test/models/member_detail.rb +11 -0
- data/test/models/member_type.rb +5 -0
- data/test/models/membership.rb +38 -0
- data/test/models/mentor.rb +5 -0
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +4 -0
- data/test/models/minivan.rb +10 -0
- data/test/models/mixed_case_monkey.rb +5 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/molecule.rb +8 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +7 -0
- data/test/models/node.rb +7 -0
- data/test/models/non_primary_key.rb +4 -0
- data/test/models/notification.rb +5 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +6 -0
- data/test/models/organization.rb +16 -0
- data/test/models/other_dog.rb +7 -0
- data/test/models/owner.rb +39 -0
- data/test/models/parrot.rb +36 -0
- data/test/models/person.rb +147 -0
- data/test/models/personal_legacy_thing.rb +6 -0
- data/test/models/pet.rb +20 -0
- data/test/models/pet_treasure.rb +8 -0
- data/test/models/pirate.rb +116 -0
- data/test/models/possession.rb +5 -0
- data/test/models/post.rb +371 -0
- data/test/models/price_estimate.rb +14 -0
- data/test/models/professor.rb +7 -0
- data/test/models/project.rb +42 -0
- data/test/models/publisher/article.rb +6 -0
- data/test/models/publisher/magazine.rb +5 -0
- data/test/models/publisher.rb +4 -0
- data/test/models/randomly_named_c1.rb +5 -0
- data/test/models/rating.rb +8 -0
- data/test/models/reader.rb +25 -0
- data/test/models/recipe.rb +5 -0
- data/test/models/record.rb +4 -0
- data/test/models/reference.rb +25 -0
- data/test/models/reply.rb +79 -0
- 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 +42 -0
- data/test/models/ship_part.rb +10 -0
- data/test/models/shop.rb +19 -0
- data/test/models/shop_account.rb +8 -0
- data/test/models/speedometer.rb +8 -0
- data/test/models/sponsor.rb +10 -0
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +5 -0
- data/test/models/student.rb +6 -0
- data/test/models/subject.rb +16 -0
- data/test/models/subscriber.rb +10 -0
- data/test/models/subscription.rb +8 -0
- data/test/models/tag.rb +16 -0
- data/test/models/tagging.rb +20 -0
- data/test/models/task.rb +7 -0
- data/test/models/topic.rb +153 -0
- data/test/models/toy.rb +10 -0
- data/test/models/traffic_light.rb +6 -0
- data/test/models/treasure.rb +16 -0
- data/test/models/treaty.rb +5 -0
- data/test/models/tree.rb +5 -0
- data/test/models/tuning_peg.rb +6 -0
- data/test/models/tyre.rb +13 -0
- data/test/models/user.rb +22 -0
- data/test/models/uuid_child.rb +5 -0
- data/test/models/uuid_item.rb +8 -0
- data/test/models/uuid_parent.rb +5 -0
- data/test/models/vegetables.rb +33 -0
- data/test/models/vehicle.rb +7 -0
- data/test/models/vertex.rb +11 -0
- data/test/models/warehouse_thing.rb +7 -0
- data/test/models/wheel.rb +5 -0
- data/test/models/without_table.rb +5 -0
- data/test/models/zine.rb +5 -0
- data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
- data/test/schema/mysql2_specific_schema.rb +82 -0
- data/test/schema/oracle_specific_schema.rb +38 -0
- data/test/schema/postgresql_specific_schema.rb +125 -0
- data/test/schema/schema.rb +1237 -0
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +11 -0
- data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
- data/test/support/config.rb +43 -0
- data/test/support/connection.rb +29 -0
- data/test/support/connection_helper.rb +16 -0
- data/test/support/ddl_helper.rb +10 -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 +22 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +876 -0
@@ -0,0 +1,618 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper"
|
4
|
+
require "models/topic"
|
5
|
+
require "models/reply"
|
6
|
+
require "models/warehouse_thing"
|
7
|
+
require "models/guid"
|
8
|
+
require "models/event"
|
9
|
+
require "models/dashboard"
|
10
|
+
require "models/uuid_item"
|
11
|
+
require "models/author"
|
12
|
+
require "models/person"
|
13
|
+
require "models/essay"
|
14
|
+
|
15
|
+
class Wizard < ActiveRecord::Base
|
16
|
+
self.abstract_class = true
|
17
|
+
|
18
|
+
validates_uniqueness_of :name
|
19
|
+
end
|
20
|
+
|
21
|
+
class IneptWizard < Wizard
|
22
|
+
validates_uniqueness_of :city
|
23
|
+
end
|
24
|
+
|
25
|
+
class Conjurer < IneptWizard
|
26
|
+
end
|
27
|
+
|
28
|
+
class Thaumaturgist < IneptWizard
|
29
|
+
end
|
30
|
+
|
31
|
+
class ReplyTitle; end
|
32
|
+
|
33
|
+
class ReplyWithTitleObject < Reply
|
34
|
+
validates_uniqueness_of :content, scope: :title
|
35
|
+
|
36
|
+
def title; ReplyTitle.new; end
|
37
|
+
end
|
38
|
+
|
39
|
+
class TopicWithUniqEvent < Topic
|
40
|
+
belongs_to :event, foreign_key: :parent_id
|
41
|
+
validates :event, uniqueness: true
|
42
|
+
end
|
43
|
+
|
44
|
+
class BigIntTest < ActiveRecord::Base
|
45
|
+
INT_MAX_VALUE = 2147483647
|
46
|
+
self.table_name = "cars"
|
47
|
+
validates :engines_count, uniqueness: true, inclusion: { in: 0..INT_MAX_VALUE }
|
48
|
+
end
|
49
|
+
|
50
|
+
class BigIntReverseTest < ActiveRecord::Base
|
51
|
+
INT_MAX_VALUE = 2147483647
|
52
|
+
self.table_name = "cars"
|
53
|
+
validates :engines_count, inclusion: { in: 0..INT_MAX_VALUE }
|
54
|
+
validates :engines_count, uniqueness: true
|
55
|
+
end
|
56
|
+
|
57
|
+
class CoolTopic < Topic
|
58
|
+
validates_uniqueness_of :id
|
59
|
+
end
|
60
|
+
|
61
|
+
class TopicWithAfterCreate < Topic
|
62
|
+
after_create :set_author
|
63
|
+
|
64
|
+
def set_author
|
65
|
+
update!(author_name: "#{title} #{id}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class UniquenessValidationTest < ActiveRecord::TestCase
|
70
|
+
INT_MAX_VALUE = 2147483647
|
71
|
+
|
72
|
+
fixtures :topics, "warehouse_things"
|
73
|
+
|
74
|
+
repair_validations(Topic, Reply)
|
75
|
+
|
76
|
+
def test_validate_uniqueness
|
77
|
+
Topic.validates_uniqueness_of(:title)
|
78
|
+
|
79
|
+
t = Topic.new("title" => "I'm uniqué!")
|
80
|
+
assert t.save, "Should save t as unique"
|
81
|
+
|
82
|
+
t.content = "Remaining unique"
|
83
|
+
assert t.save, "Should still save t as unique"
|
84
|
+
|
85
|
+
t2 = Topic.new("title" => "I'm uniqué!")
|
86
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
87
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
88
|
+
assert_equal ["has already been taken"], t2.errors[:title]
|
89
|
+
|
90
|
+
t2.title = "Now I am really also unique"
|
91
|
+
assert t2.save, "Should now save t2 as unique"
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_validate_uniqueness_with_alias_attribute
|
95
|
+
Topic.alias_attribute :new_title, :title
|
96
|
+
Topic.validates_uniqueness_of(:new_title)
|
97
|
+
|
98
|
+
topic = Topic.new(new_title: "abc")
|
99
|
+
assert_predicate topic, :valid?
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_validates_uniqueness_with_nil_value
|
103
|
+
Topic.validates_uniqueness_of(:title)
|
104
|
+
|
105
|
+
t = Topic.new("title" => nil)
|
106
|
+
assert t.save, "Should save t as unique"
|
107
|
+
|
108
|
+
t2 = Topic.new("title" => nil)
|
109
|
+
assert_not t2.valid?, "Shouldn't be valid"
|
110
|
+
assert_not t2.save, "Shouldn't save t2 as unique"
|
111
|
+
assert_equal ["has already been taken"], t2.errors[:title]
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_validates_uniqueness_with_validates
|
115
|
+
Topic.validates :title, uniqueness: true
|
116
|
+
Topic.create!("title" => "abc")
|
117
|
+
|
118
|
+
t2 = Topic.new("title" => "abc")
|
119
|
+
assert_not_predicate t2, :valid?
|
120
|
+
assert t2.errors[:title]
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_validate_uniqueness_when_integer_out_of_range
|
124
|
+
entry = BigIntTest.create(engines_count: INT_MAX_VALUE + 1)
|
125
|
+
assert_equal entry.errors[:engines_count], ["is not included in the list"]
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_validate_uniqueness_when_integer_out_of_range_show_order_does_not_matter
|
129
|
+
entry = BigIntReverseTest.create(engines_count: INT_MAX_VALUE + 1)
|
130
|
+
assert_equal entry.errors[:engines_count], ["is not included in the list"]
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_validates_uniqueness_with_newline_chars
|
134
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: false)
|
135
|
+
|
136
|
+
t = Topic.new("title" => "new\nline")
|
137
|
+
assert t.save, "Should save t as unique"
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_validate_uniqueness_with_scope
|
141
|
+
Reply.validates_uniqueness_of(:content, scope: "parent_id")
|
142
|
+
|
143
|
+
t = Topic.create("title" => "I'm unique!")
|
144
|
+
|
145
|
+
r1 = t.replies.create "title" => "r1", "content" => "hello world"
|
146
|
+
assert r1.valid?, "Saving r1"
|
147
|
+
|
148
|
+
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
149
|
+
assert_not r2.valid?, "Saving r2 first time"
|
150
|
+
|
151
|
+
r2.content = "something else"
|
152
|
+
assert r2.save, "Saving r2 second time"
|
153
|
+
|
154
|
+
t2 = Topic.create("title" => "I'm unique too!")
|
155
|
+
r3 = t2.replies.create "title" => "r3", "content" => "hello world"
|
156
|
+
assert r3.valid?, "Saving r3"
|
157
|
+
end
|
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
|
+
|
185
|
+
def test_validate_uniqueness_with_object_scope
|
186
|
+
Reply.validates_uniqueness_of(:content, scope: :topic)
|
187
|
+
|
188
|
+
t = Topic.create("title" => "I'm unique!")
|
189
|
+
|
190
|
+
r1 = t.replies.create "title" => "r1", "content" => "hello world"
|
191
|
+
assert r1.valid?, "Saving r1"
|
192
|
+
|
193
|
+
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
194
|
+
assert_not r2.valid?, "Saving r2 first time"
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_validate_uniqueness_with_polymorphic_object_scope
|
198
|
+
Essay.validates_uniqueness_of(:name, scope: :writer)
|
199
|
+
|
200
|
+
a = Author.create(name: "Sergey")
|
201
|
+
p = Person.create(first_name: "Sergey")
|
202
|
+
|
203
|
+
e1 = a.essays.create(name: "Essay")
|
204
|
+
assert e1.valid?, "Saving e1"
|
205
|
+
|
206
|
+
e2 = p.essays.create(name: "Essay")
|
207
|
+
assert e2.valid?, "Saving e2"
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_validate_uniqueness_with_composed_attribute_scope
|
211
|
+
r1 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
|
212
|
+
assert r1.valid?, "Saving r1"
|
213
|
+
|
214
|
+
r2 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
|
215
|
+
assert_not r2.valid?, "Saving r2 first time"
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_validate_uniqueness_with_object_arg
|
219
|
+
Reply.validates_uniqueness_of(:topic)
|
220
|
+
|
221
|
+
t = Topic.create("title" => "I'm unique!")
|
222
|
+
|
223
|
+
r1 = t.replies.create "title" => "r1", "content" => "hello world"
|
224
|
+
assert r1.valid?, "Saving r1"
|
225
|
+
|
226
|
+
r2 = t.replies.create "title" => "r2", "content" => "hello world"
|
227
|
+
assert_not r2.valid?, "Saving r2 first time"
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_validate_uniqueness_scoped_to_defining_class
|
231
|
+
t = Topic.create("title" => "What, me worry?")
|
232
|
+
|
233
|
+
r1 = t.unique_replies.create "title" => "r1", "content" => "a barrel of fun"
|
234
|
+
assert r1.valid?, "Saving r1"
|
235
|
+
|
236
|
+
r2 = t.silly_unique_replies.create "title" => "r2", "content" => "a barrel of fun"
|
237
|
+
assert_not r2.valid?, "Saving r2"
|
238
|
+
|
239
|
+
# Should succeed as validates_uniqueness_of only applies to
|
240
|
+
# UniqueReply and its subclasses
|
241
|
+
r3 = t.replies.create "title" => "r2", "content" => "a barrel of fun"
|
242
|
+
assert r3.valid?, "Saving r3"
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_validate_uniqueness_with_scope_array
|
246
|
+
Reply.validates_uniqueness_of(:author_name, scope: [:author_email_address, :parent_id])
|
247
|
+
|
248
|
+
t = Topic.create("title" => "The earth is actually flat!")
|
249
|
+
|
250
|
+
r1 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply"
|
251
|
+
assert r1.valid?, "Saving r1"
|
252
|
+
|
253
|
+
r2 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy@rubyonrails.com", "title" => "You're crazy!", "content" => "Crazy reply again..."
|
254
|
+
assert_not r2.valid?, "Saving r2. Double reply by same author."
|
255
|
+
|
256
|
+
r2.author_email_address = "jeremy_alt_email@rubyonrails.com"
|
257
|
+
assert r2.save, "Saving r2 the second time."
|
258
|
+
|
259
|
+
r3 = t.replies.create "author_name" => "jeremy", "author_email_address" => "jeremy_alt_email@rubyonrails.com", "title" => "You're wrong", "content" => "It's cubic"
|
260
|
+
assert_not r3.valid?, "Saving r3"
|
261
|
+
|
262
|
+
r3.author_name = "jj"
|
263
|
+
assert r3.save, "Saving r3 the second time."
|
264
|
+
|
265
|
+
r3.author_name = "jeremy"
|
266
|
+
assert_not r3.save, "Saving r3 the third time."
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_validate_case_insensitive_uniqueness
|
270
|
+
Topic.validates_uniqueness_of(:title, :parent_id, case_sensitive: false, allow_nil: true)
|
271
|
+
|
272
|
+
t = Topic.new("title" => "I'm unique!", :parent_id => 2)
|
273
|
+
assert t.save, "Should save t as unique"
|
274
|
+
|
275
|
+
t.content = "Remaining unique"
|
276
|
+
assert t.save, "Should still save t as unique"
|
277
|
+
|
278
|
+
t2 = Topic.new("title" => "I'm UNIQUE!", :parent_id => 1)
|
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?
|
283
|
+
assert_equal ["has already been taken"], t2.errors[:title]
|
284
|
+
|
285
|
+
t2.title = "I'm truly UNIQUE!"
|
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?
|
290
|
+
|
291
|
+
t2.parent_id = 4
|
292
|
+
assert t2.save, "Should now save t2 as unique"
|
293
|
+
|
294
|
+
t2.parent_id = nil
|
295
|
+
t2.title = nil
|
296
|
+
assert t2.valid?, "should validate with nil"
|
297
|
+
assert t2.save, "should save with nil"
|
298
|
+
|
299
|
+
t_utf8 = Topic.new("title" => "Я тоже уникальный!")
|
300
|
+
assert t_utf8.save, "Should save t_utf8 as unique"
|
301
|
+
|
302
|
+
# If database hasn't UTF-8 character set, this test fails
|
303
|
+
if Topic.all.merge!(select: "LOWER(title) AS title").find(t_utf8.id).title == "я тоже уникальный!"
|
304
|
+
t2_utf8 = Topic.new("title" => "я тоже УНИКАЛЬНЫЙ!")
|
305
|
+
assert_not t2_utf8.valid?, "Shouldn't be valid"
|
306
|
+
assert_not t2_utf8.save, "Shouldn't save t2_utf8 as unique"
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_validate_case_sensitive_uniqueness_with_special_sql_like_chars
|
311
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true)
|
312
|
+
|
313
|
+
t = Topic.new("title" => "I'm unique!")
|
314
|
+
assert t.save, "Should save t as unique"
|
315
|
+
|
316
|
+
t2 = Topic.new("title" => "I'm %")
|
317
|
+
assert t2.save, "Should save t2 as unique"
|
318
|
+
|
319
|
+
t3 = Topic.new("title" => "I'm uniqu_!")
|
320
|
+
assert t3.save, "Should save t3 as unique"
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_validate_case_insensitive_uniqueness_with_special_sql_like_chars
|
324
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: false)
|
325
|
+
|
326
|
+
t = Topic.new("title" => "I'm unique!")
|
327
|
+
assert t.save, "Should save t as unique"
|
328
|
+
|
329
|
+
t2 = Topic.new("title" => "I'm %")
|
330
|
+
assert t2.save, "Should save t2 as unique"
|
331
|
+
|
332
|
+
t3 = Topic.new("title" => "I'm uniqu_!")
|
333
|
+
assert t3.save, "Should save t3 as unique"
|
334
|
+
end
|
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
|
+
|
361
|
+
def test_validate_case_sensitive_uniqueness
|
362
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true, allow_nil: true)
|
363
|
+
|
364
|
+
t = Topic.new("title" => "I'm unique!")
|
365
|
+
assert t.save, "Should save t as unique"
|
366
|
+
|
367
|
+
t.content = "Remaining unique"
|
368
|
+
assert t.save, "Should still save t as unique"
|
369
|
+
|
370
|
+
t2 = Topic.new("title" => "I'M UNIQUE!")
|
371
|
+
assert t2.valid?, "Should be valid"
|
372
|
+
assert t2.save, "Should save t2 as unique"
|
373
|
+
assert_empty t2.errors[:title]
|
374
|
+
assert_empty t2.errors[:parent_id]
|
375
|
+
assert_not_equal ["has already been taken"], t2.errors[:title]
|
376
|
+
|
377
|
+
t3 = Topic.new("title" => "I'M uNiQUe!")
|
378
|
+
assert t3.valid?, "Should be valid"
|
379
|
+
assert t3.save, "Should save t2 as unique"
|
380
|
+
assert_empty t3.errors[:title]
|
381
|
+
assert_empty t3.errors[:parent_id]
|
382
|
+
assert_not_equal ["has already been taken"], t3.errors[:title]
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_validate_case_sensitive_uniqueness_with_attribute_passed_as_integer
|
386
|
+
Topic.validates_uniqueness_of(:title, case_sensitive: true)
|
387
|
+
Topic.create!("title" => 101)
|
388
|
+
|
389
|
+
t2 = Topic.new("title" => 101)
|
390
|
+
assert_not_predicate t2, :valid?
|
391
|
+
assert t2.errors[:title]
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_validate_uniqueness_with_non_standard_table_names
|
395
|
+
i1 = WarehouseThing.create(value: 1000)
|
396
|
+
assert_not i1.valid?, "i1 should not be valid"
|
397
|
+
assert i1.errors[:value].any?, "Should not be empty"
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_validates_uniqueness_inside_scoping
|
401
|
+
Topic.validates_uniqueness_of(:title)
|
402
|
+
|
403
|
+
Topic.where(author_name: "David").scoping do
|
404
|
+
t1 = Topic.new("title" => "I'm unique!", "author_name" => "Mary")
|
405
|
+
assert t1.save
|
406
|
+
t2 = Topic.new("title" => "I'm unique!", "author_name" => "David")
|
407
|
+
assert_not_predicate t2, :valid?
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
def test_validate_uniqueness_with_columns_which_are_sql_keywords
|
412
|
+
repair_validations(Guid) do
|
413
|
+
Guid.validates_uniqueness_of :key
|
414
|
+
g = Guid.new
|
415
|
+
g.key = "foo"
|
416
|
+
assert_nothing_raised { !g.valid? }
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
def test_validate_uniqueness_with_limit
|
421
|
+
if current_adapter?(:SQLite3Adapter)
|
422
|
+
# Event.title has limit 5, but SQLite doesn't truncate.
|
423
|
+
e1 = Event.create(title: "abcdefgh")
|
424
|
+
assert e1.valid?, "Could not create an event with a unique 8 characters title"
|
425
|
+
|
426
|
+
e2 = Event.create(title: "abcdefgh")
|
427
|
+
assert_not e2.valid?, "Created an event whose title is not unique"
|
428
|
+
elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
|
429
|
+
assert_raise(ActiveRecord::ValueTooLong) do
|
430
|
+
Event.create(title: "abcdefgh")
|
431
|
+
end
|
432
|
+
else
|
433
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
434
|
+
Event.create(title: "abcdefgh")
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_validate_uniqueness_with_limit_and_utf8
|
440
|
+
if current_adapter?(:SQLite3Adapter)
|
441
|
+
# Event.title has limit 5, but SQLite doesn't truncate.
|
442
|
+
e1 = Event.create(title: "一二三四五六七八")
|
443
|
+
assert e1.valid?, "Could not create an event with a unique 8 characters title"
|
444
|
+
|
445
|
+
e2 = Event.create(title: "一二三四五六七八")
|
446
|
+
assert_not e2.valid?, "Created an event whose title is not unique"
|
447
|
+
elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
|
448
|
+
assert_raise(ActiveRecord::ValueTooLong) do
|
449
|
+
Event.create(title: "一二三四五六七八")
|
450
|
+
end
|
451
|
+
else
|
452
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
453
|
+
Event.create(title: "一二三四五六七八")
|
454
|
+
end
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
def test_validate_straight_inheritance_uniqueness
|
459
|
+
w1 = IneptWizard.create(name: "Rincewind", city: "Ankh-Morpork")
|
460
|
+
assert w1.valid?, "Saving w1"
|
461
|
+
|
462
|
+
# Should use validation from base class (which is abstract)
|
463
|
+
w2 = IneptWizard.new(name: "Rincewind", city: "Quirm")
|
464
|
+
assert_not w2.valid?, "w2 shouldn't be valid"
|
465
|
+
assert w2.errors[:name].any?, "Should have errors for name"
|
466
|
+
assert_equal ["has already been taken"], w2.errors[:name], "Should have uniqueness message for name"
|
467
|
+
|
468
|
+
w3 = Conjurer.new(name: "Rincewind", city: "Quirm")
|
469
|
+
assert_not w3.valid?, "w3 shouldn't be valid"
|
470
|
+
assert w3.errors[:name].any?, "Should have errors for name"
|
471
|
+
assert_equal ["has already been taken"], w3.errors[:name], "Should have uniqueness message for name"
|
472
|
+
|
473
|
+
w4 = Conjurer.create(name: "The Amazing Bonko", city: "Quirm")
|
474
|
+
assert w4.valid?, "Saving w4"
|
475
|
+
|
476
|
+
w5 = Thaumaturgist.new(name: "The Amazing Bonko", city: "Lancre")
|
477
|
+
assert_not w5.valid?, "w5 shouldn't be valid"
|
478
|
+
assert w5.errors[:name].any?, "Should have errors for name"
|
479
|
+
assert_equal ["has already been taken"], w5.errors[:name], "Should have uniqueness message for name"
|
480
|
+
|
481
|
+
w6 = Thaumaturgist.new(name: "Mustrum Ridcully", city: "Quirm")
|
482
|
+
assert_not w6.valid?, "w6 shouldn't be valid"
|
483
|
+
assert w6.errors[:city].any?, "Should have errors for city"
|
484
|
+
assert_equal ["has already been taken"], w6.errors[:city], "Should have uniqueness message for city"
|
485
|
+
end
|
486
|
+
|
487
|
+
def test_validate_uniqueness_with_conditions
|
488
|
+
Topic.validates_uniqueness_of :title, conditions: -> { where(approved: true) }
|
489
|
+
Topic.create("title" => "I'm a topic", "approved" => true)
|
490
|
+
Topic.create("title" => "I'm an unapproved topic", "approved" => false)
|
491
|
+
|
492
|
+
t3 = Topic.new("title" => "I'm a topic", "approved" => true)
|
493
|
+
assert_not t3.valid?, "t3 shouldn't be valid"
|
494
|
+
|
495
|
+
t4 = Topic.new("title" => "I'm an unapproved topic", "approved" => false)
|
496
|
+
assert t4.valid?, "t4 should be valid"
|
497
|
+
end
|
498
|
+
|
499
|
+
def test_validate_uniqueness_with_non_callable_conditions_is_not_supported
|
500
|
+
assert_raises(ArgumentError) {
|
501
|
+
Topic.validates_uniqueness_of :title, conditions: Topic.where(approved: true)
|
502
|
+
}
|
503
|
+
end
|
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
|
+
|
522
|
+
def test_validate_uniqueness_on_existing_relation
|
523
|
+
event = Event.create
|
524
|
+
assert_predicate TopicWithUniqEvent.create(event: event), :valid?
|
525
|
+
|
526
|
+
topic = TopicWithUniqEvent.new(event: event)
|
527
|
+
assert_not_predicate topic, :valid?
|
528
|
+
assert_equal ["has already been taken"], topic.errors[:event]
|
529
|
+
end
|
530
|
+
|
531
|
+
def test_validate_uniqueness_on_empty_relation
|
532
|
+
topic = TopicWithUniqEvent.new
|
533
|
+
assert_predicate topic, :valid?
|
534
|
+
end
|
535
|
+
|
536
|
+
def test_validate_uniqueness_of_custom_primary_key
|
537
|
+
klass = Class.new(ActiveRecord::Base) do
|
538
|
+
self.table_name = "keyboards"
|
539
|
+
self.primary_key = :key_number
|
540
|
+
|
541
|
+
validates_uniqueness_of :key_number
|
542
|
+
|
543
|
+
def self.name
|
544
|
+
"Keyboard"
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
klass.create!(key_number: 10)
|
549
|
+
key2 = klass.create!(key_number: 11)
|
550
|
+
|
551
|
+
key2.key_number = 10
|
552
|
+
assert_not_predicate key2, :valid?
|
553
|
+
end
|
554
|
+
|
555
|
+
def test_validate_uniqueness_without_primary_key
|
556
|
+
klass = Class.new(ActiveRecord::Base) do
|
557
|
+
self.table_name = "dashboards"
|
558
|
+
|
559
|
+
validates_uniqueness_of :dashboard_id
|
560
|
+
|
561
|
+
def self.name; "Dashboard" end
|
562
|
+
end
|
563
|
+
|
564
|
+
abc = klass.create!(dashboard_id: "abc")
|
565
|
+
assert_predicate klass.new(dashboard_id: "xyz"), :valid?
|
566
|
+
assert_not_predicate klass.new(dashboard_id: "abc"), :valid?
|
567
|
+
|
568
|
+
abc.dashboard_id = "def"
|
569
|
+
|
570
|
+
e = assert_raises ActiveRecord::UnknownPrimaryKey do
|
571
|
+
abc.save!
|
572
|
+
end
|
573
|
+
assert_match(/\AUnknown primary key for table dashboards in model/, e.message)
|
574
|
+
assert_match(/Cannot validate uniqueness for persisted record without primary key.\z/, e.message)
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_validate_uniqueness_ignores_itself_when_primary_key_changed
|
578
|
+
Topic.validates_uniqueness_of(:title)
|
579
|
+
|
580
|
+
t = Topic.new("title" => "This is a unique title")
|
581
|
+
assert t.save, "Should save t as unique"
|
582
|
+
|
583
|
+
t.id += 1
|
584
|
+
assert t.valid?, "Should be valid"
|
585
|
+
assert t.save, "Should still save t as unique"
|
586
|
+
end
|
587
|
+
|
588
|
+
def test_validate_uniqueness_with_after_create_performing_save
|
589
|
+
TopicWithAfterCreate.validates_uniqueness_of(:title)
|
590
|
+
topic = TopicWithAfterCreate.create!(title: "Title1")
|
591
|
+
assert topic.author_name.start_with?("Title1")
|
592
|
+
|
593
|
+
topic2 = TopicWithAfterCreate.new(title: "Title1")
|
594
|
+
assert_not_predicate topic2, :valid?
|
595
|
+
assert_equal(["has already been taken"], topic2.errors[:title])
|
596
|
+
end
|
597
|
+
|
598
|
+
def test_validate_uniqueness_uuid
|
599
|
+
skip unless current_adapter?(:PostgreSQLAdapter)
|
600
|
+
item = UuidItem.create!(uuid: SecureRandom.uuid, title: "item1")
|
601
|
+
item.update(title: "item1-title2")
|
602
|
+
assert_empty item.errors
|
603
|
+
|
604
|
+
item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: "item2")
|
605
|
+
item2.update(title: "item2-title2")
|
606
|
+
assert_empty item2.errors
|
607
|
+
end
|
608
|
+
|
609
|
+
def test_validate_uniqueness_regular_id
|
610
|
+
item = CoolTopic.create!(title: "MyItem")
|
611
|
+
assert_empty item.errors
|
612
|
+
|
613
|
+
item2 = CoolTopic.new(id: item.id, title: "MyItem2")
|
614
|
+
assert_not_predicate item2, :valid?
|
615
|
+
|
616
|
+
assert_equal(["has already been taken"], item2.errors[:id])
|
617
|
+
end
|
618
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ValidationsRepairHelper
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def repair_validations(*model_classes)
|
9
|
+
teardown do
|
10
|
+
model_classes.each(&:clear_validators!)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def repair_validations(*model_classes)
|
16
|
+
yield if block_given?
|
17
|
+
ensure
|
18
|
+
model_classes.each(&:clear_validators!)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|