ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 +5 -5
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/ParameterizedQueries README +6 -6
- data/README +38 -55
- data/ext/Makefile +269 -0
- data/ext/extconf.rb +34 -3
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db-i386-mingw32.def +2 -0
- data/ext/ibm_db.c +100 -108
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/ext/unicode_support_version +3 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
- data/lib/mswin32/ibm_db.rb +7 -39
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
- data/test/cases/adapter_test.rb +133 -58
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +11 -1
- data/test/cases/ar_schema_test.rb +35 -50
- data/test/cases/associations/association_scope_test.rb +1 -6
- data/test/cases/associations/belongs_to_associations_test.rb +122 -10
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +5 -7
- data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
- data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
- data/test/cases/associations/eager_test.rb +158 -73
- data/test/cases/associations/extension_test.rb +7 -2
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
- data/test/cases/associations/has_many_associations_test.rb +362 -43
- data/test/cases/associations/has_many_through_associations_test.rb +108 -41
- data/test/cases/associations/has_one_associations_test.rb +105 -8
- data/test/cases/associations/has_one_through_associations_test.rb +6 -3
- data/test/cases/associations/inner_join_association_test.rb +3 -3
- data/test/cases/associations/inverse_associations_test.rb +38 -11
- data/test/cases/associations/join_model_test.rb +59 -36
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +2 -2
- data/test/cases/associations/required_test.rb +25 -5
- data/test/cases/associations_test.rb +39 -34
- data/test/cases/attribute_decorators_test.rb +9 -8
- data/test/cases/attribute_methods/read_test.rb +5 -5
- data/test/cases/attribute_methods_test.rb +97 -40
- data/test/cases/attribute_set_test.rb +64 -4
- data/test/cases/attribute_test.rb +84 -18
- data/test/cases/attributes_test.rb +151 -34
- data/test/cases/autosave_association_test.rb +149 -36
- data/test/cases/base_test.rb +290 -241
- data/test/cases/batches_test.rb +299 -22
- data/test/cases/binary_test.rb +2 -10
- data/test/cases/bind_parameter_test.rb +76 -66
- data/test/cases/cache_key_test.rb +26 -0
- data/test/cases/calculations_test.rb +167 -15
- data/test/cases/callbacks_test.rb +161 -68
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_definition_test.rb +26 -57
- data/test/cases/comment_test.rb +145 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
- data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
- data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
- data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
- data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
- data/test/cases/connection_management_test.rb +46 -56
- data/test/cases/connection_pool_test.rb +195 -20
- data/test/cases/connection_specification/resolver_test.rb +15 -0
- data/test/cases/counter_cache_test.rb +10 -5
- data/test/cases/custom_locking_test.rb +1 -1
- data/test/cases/database_statements_test.rb +18 -3
- data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
- data/test/cases/date_time_precision_test.rb +107 -0
- data/test/cases/defaults_test.rb +85 -89
- data/test/cases/dirty_test.rb +30 -52
- data/test/cases/disconnected_test.rb +4 -2
- data/test/cases/enum_test.rb +178 -24
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_test.rb +32 -21
- data/test/cases/finder_test.rb +273 -148
- data/test/cases/fixture_set/file_test.rb +18 -0
- data/test/cases/fixtures_test.rb +112 -32
- data/test/cases/forbidden_attributes_protection_test.rb +69 -3
- data/test/cases/helper.rb +10 -16
- data/test/cases/hot_compatibility_test.rb +89 -1
- data/test/cases/inheritance_test.rb +284 -53
- data/test/cases/integration_test.rb +23 -7
- data/test/cases/invalid_connection_test.rb +4 -2
- data/test/cases/invertible_migration_test.rb +124 -32
- data/test/cases/json_serialization_test.rb +11 -2
- data/test/cases/locking_test.rb +22 -6
- data/test/cases/log_subscriber_test.rb +106 -17
- data/test/cases/migration/change_schema_test.rb +60 -114
- data/test/cases/migration/change_table_test.rb +34 -2
- data/test/cases/migration/column_attributes_test.rb +7 -23
- data/test/cases/migration/column_positioning_test.rb +8 -8
- data/test/cases/migration/columns_test.rb +17 -11
- data/test/cases/migration/command_recorder_test.rb +47 -2
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +21 -12
- data/test/cases/migration/foreign_key_test.rb +52 -18
- data/test/cases/migration/index_test.rb +14 -12
- data/test/cases/migration/logger_test.rb +1 -1
- data/test/cases/migration/pending_migrations_test.rb +0 -1
- data/test/cases/migration/references_foreign_key_test.rb +59 -7
- data/test/cases/migration/references_index_test.rb +4 -4
- data/test/cases/migration/references_statements_test.rb +26 -6
- data/test/cases/migration/rename_table_test.rb +25 -25
- data/test/cases/migration_test.rb +279 -81
- data/test/cases/migrator_test.rb +91 -8
- data/test/cases/mixin_test.rb +0 -2
- data/test/cases/modules_test.rb +3 -4
- data/test/cases/multiparameter_attributes_test.rb +24 -2
- data/test/cases/multiple_db_test.rb +11 -4
- data/test/cases/nested_attributes_test.rb +61 -33
- data/test/cases/persistence_test.rb +102 -10
- data/test/cases/pooled_connections_test.rb +3 -3
- data/test/cases/primary_keys_test.rb +170 -31
- data/test/cases/query_cache_test.rb +216 -96
- data/test/cases/quoting_test.rb +65 -19
- data/test/cases/readonly_test.rb +2 -1
- data/test/cases/reflection_test.rb +68 -22
- data/test/cases/relation/delegation_test.rb +3 -8
- data/test/cases/relation/merging_test.rb +10 -14
- data/test/cases/relation/mutation_test.rb +42 -24
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +4 -2
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +23 -99
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +45 -23
- data/test/cases/relation_test.rb +67 -58
- data/test/cases/relations_test.rb +249 -38
- data/test/cases/result_test.rb +10 -0
- data/test/cases/sanitize_test.rb +108 -15
- data/test/cases/schema_dumper_test.rb +119 -125
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +113 -39
- data/test/cases/scoping/named_scoping_test.rb +46 -9
- data/test/cases/scoping/relation_scoping_test.rb +47 -4
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +1 -1
- data/test/cases/serialized_attribute_test.rb +93 -6
- data/test/cases/statement_cache_test.rb +38 -0
- data/test/cases/store_test.rb +2 -1
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +73 -9
- data/test/cases/tasks/mysql_rake_test.rb +139 -118
- data/test/cases/tasks/postgresql_rake_test.rb +60 -6
- data/test/cases/tasks/sqlite_rake_test.rb +30 -3
- data/test/cases/test_case.rb +28 -20
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +103 -0
- data/test/cases/timestamp_test.rb +44 -10
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +128 -62
- data/test/cases/transaction_isolation_test.rb +2 -2
- data/test/cases/transactions_test.rb +61 -43
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +2 -96
- data/test/cases/type/string_test.rb +0 -14
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +1 -118
- data/test/cases/unconnected_test.rb +1 -1
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +13 -2
- data/test/cases/validations/i18n_validation_test.rb +6 -10
- data/test/cases/validations/length_validation_test.rb +62 -30
- data/test/cases/validations/presence_validation_test.rb +36 -1
- data/test/cases/validations/uniqueness_validation_test.rb +128 -37
- data/test/cases/validations_repair_helper.rb +2 -6
- data/test/cases/validations_test.rb +36 -7
- data/test/cases/view_test.rb +102 -5
- data/test/cases/yaml_serialization_test.rb +21 -26
- data/test/config.example.yml +97 -0
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/books.yml +20 -0
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/price_estimates.yml +10 -1
- data/test/fixtures/trees.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +1 -1
- data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
- data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
- data/test/migrations/missing/1_people_have_last_names.rb +2 -2
- data/test/migrations/missing/3_we_need_reminders.rb +2 -2
- data/test/migrations/missing/4_innocent_jointable.rb +2 -2
- data/test/migrations/rename/1_we_need_things.rb +2 -2
- data/test/migrations/rename/2_rename_things.rb +2 -2
- data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy2/1_create_articles.rb +1 -1
- data/test/migrations/to_copy2/2_create_comments.rb +1 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
- data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/aircraft.rb +1 -0
- data/test/models/author.rb +4 -7
- data/test/models/bird.rb +1 -1
- data/test/models/book.rb +5 -0
- data/test/models/bulb.rb +2 -1
- data/test/models/car.rb +3 -0
- data/test/models/cat.rb +10 -0
- data/test/models/chef.rb +1 -0
- data/test/models/club.rb +2 -0
- data/test/models/comment.rb +17 -5
- data/test/models/company.rb +4 -2
- data/test/models/company_in_module.rb +1 -1
- data/test/models/contact.rb +1 -1
- data/test/models/content.rb +40 -0
- data/test/models/customer.rb +8 -2
- data/test/models/developer.rb +19 -0
- data/test/models/face.rb +1 -1
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +2 -0
- data/test/models/member.rb +1 -0
- data/test/models/member_detail.rb +4 -3
- data/test/models/mentor.rb +3 -0
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +4 -1
- data/test/models/parrot.rb +6 -7
- data/test/models/person.rb +0 -1
- data/test/models/pet.rb +3 -0
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +3 -3
- data/test/models/post.rb +18 -9
- data/test/models/project.rb +9 -0
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/recipe.rb +3 -0
- data/test/models/ship.rb +8 -2
- data/test/models/tag.rb +6 -0
- data/test/models/topic.rb +2 -8
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/user.rb +14 -0
- data/test/models/uuid_item.rb +6 -0
- data/test/schema/mysql2_specific_schema.rb +33 -23
- data/test/schema/oracle_specific_schema.rb +1 -4
- data/test/schema/postgresql_specific_schema.rb +36 -124
- data/test/schema/schema.rb +170 -65
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +1 -5
- data/test/support/connection.rb +1 -0
- data/test/support/schema_dumping_helper.rb +1 -1
- 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
- metadata +146 -30
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/mysql_specific_schema.rb +0 -70
@@ -0,0 +1,73 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/face'
|
3
|
+
require 'models/interest'
|
4
|
+
require 'models/man'
|
5
|
+
require 'models/topic'
|
6
|
+
|
7
|
+
class AbsenceValidationTest < ActiveRecord::TestCase
|
8
|
+
def test_non_association
|
9
|
+
boy_klass = Class.new(Man) do
|
10
|
+
def self.name; "Boy" end
|
11
|
+
validates_absence_of :name
|
12
|
+
end
|
13
|
+
|
14
|
+
assert boy_klass.new.valid?
|
15
|
+
assert_not boy_klass.new(name: "Alex").valid?
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_has_one_marked_for_destruction
|
19
|
+
boy_klass = Class.new(Man) do
|
20
|
+
def self.name; "Boy" end
|
21
|
+
validates_absence_of :face
|
22
|
+
end
|
23
|
+
|
24
|
+
boy = boy_klass.new(face: Face.new)
|
25
|
+
assert_not boy.valid?, "should not be valid if has_one association is present"
|
26
|
+
assert_equal 1, boy.errors[:face].size, "should only add one error"
|
27
|
+
|
28
|
+
boy.face.mark_for_destruction
|
29
|
+
assert boy.valid?, "should be valid if association is marked for destruction"
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_has_many_marked_for_destruction
|
33
|
+
boy_klass = Class.new(Man) do
|
34
|
+
def self.name; "Boy" end
|
35
|
+
validates_absence_of :interests
|
36
|
+
end
|
37
|
+
boy = boy_klass.new
|
38
|
+
boy.interests << [i1 = Interest.new, i2 = Interest.new]
|
39
|
+
assert_not boy.valid?, "should not be valid if has_many association is present"
|
40
|
+
|
41
|
+
i1.mark_for_destruction
|
42
|
+
assert_not boy.valid?, "should not be valid if has_many association is present"
|
43
|
+
|
44
|
+
i2.mark_for_destruction
|
45
|
+
assert boy.valid?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_does_not_call_to_a_on_associations
|
49
|
+
boy_klass = Class.new(Man) do
|
50
|
+
def self.name; "Boy" end
|
51
|
+
validates_absence_of :face
|
52
|
+
end
|
53
|
+
|
54
|
+
face_with_to_a = Face.new
|
55
|
+
def face_with_to_a.to_a; ['(/)', '(\)']; end
|
56
|
+
|
57
|
+
assert_nothing_raised { boy_klass.new(face: face_with_to_a).valid? }
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_validates_absence_of_virtual_attribute_on_model
|
61
|
+
repair_validations(Interest) do
|
62
|
+
Interest.send(:attr_accessor, :token)
|
63
|
+
Interest.validates_absence_of(:token)
|
64
|
+
|
65
|
+
interest = Interest.create!(topic: 'Thought Leadering')
|
66
|
+
assert interest.valid?
|
67
|
+
|
68
|
+
interest.token = 'tl'
|
69
|
+
|
70
|
+
assert interest.invalid?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -45,12 +45,24 @@ class AssociationValidationTest < ActiveRecord::TestCase
|
|
45
45
|
assert t.valid?
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_validates_associated_without_marked_for_destruction
|
49
|
+
reply = Class.new do
|
50
|
+
def valid?
|
51
|
+
true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
Topic.validates_associated(:replies)
|
55
|
+
t = Topic.new
|
56
|
+
t.define_singleton_method(:replies) { [reply.new] }
|
57
|
+
assert t.valid?
|
58
|
+
end
|
59
|
+
|
48
60
|
def test_validates_associated_with_custom_message_using_quotes
|
49
61
|
Reply.validates_associated :topic, :message=> "This string contains 'single' and \"double\" quotes"
|
50
62
|
Topic.validates_presence_of :content
|
51
63
|
r = Reply.create("title" => "A reply", "content" => "with content!")
|
52
64
|
r.topic = Topic.create("title" => "uhohuhoh")
|
53
|
-
|
65
|
+
assert_not_operator r, :valid?
|
54
66
|
assert_equal ["This string contains 'single' and \"double\" quotes"], r.errors[:topic]
|
55
67
|
end
|
56
68
|
|
@@ -82,5 +94,4 @@ class AssociationValidationTest < ActiveRecord::TestCase
|
|
82
94
|
assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a man object associated"
|
83
95
|
end
|
84
96
|
end
|
85
|
-
|
86
97
|
end
|
@@ -47,29 +47,25 @@ class I18nValidationTest < ActiveRecord::TestCase
|
|
47
47
|
# [ "given on condition", {on: :save}, {}]
|
48
48
|
]
|
49
49
|
|
50
|
-
# validates_uniqueness_of w/ mocha
|
51
|
-
|
52
50
|
COMMON_CASES.each do |name, validation_options, generate_message_options|
|
53
51
|
test "validates_uniqueness_of on generated message #{name}" do
|
54
52
|
Topic.validates_uniqueness_of :title, validation_options
|
55
53
|
@topic.title = unique_topic.title
|
56
|
-
@topic.errors
|
57
|
-
|
54
|
+
assert_called_with(@topic.errors, :generate_message, [:title, :taken, generate_message_options.merge(:value => 'unique!')]) do
|
55
|
+
@topic.valid?
|
56
|
+
end
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
61
|
-
# validates_associated w/ mocha
|
62
|
-
|
63
60
|
COMMON_CASES.each do |name, validation_options, generate_message_options|
|
64
61
|
test "validates_associated on generated message #{name}" do
|
65
62
|
Topic.validates_associated :replies, validation_options
|
66
|
-
replied_topic.errors
|
67
|
-
|
63
|
+
assert_called_with(replied_topic.errors, :generate_message, [:replies, :invalid, generate_message_options.merge(:value => replied_topic.replies)]) do
|
64
|
+
replied_topic.save
|
65
|
+
end
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
71
|
-
# validates_associated w/o mocha
|
72
|
-
|
73
69
|
def test_validates_associated_finds_custom_model_key_translation
|
74
70
|
I18n.backend.store_translations 'en', :activerecord => {:errors => {:models => {:topic => {:attributes => {:replies => {:invalid => 'custom message'}}}}}}
|
75
71
|
I18n.backend.store_translations 'en', :activerecord => {:errors => {:messages => {:invalid => 'global message'}}}
|
@@ -1,47 +1,79 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
require "cases/helper"
|
3
2
|
require 'models/owner'
|
4
3
|
require 'models/pet'
|
4
|
+
require 'models/person'
|
5
5
|
|
6
6
|
class LengthValidationTest < ActiveRecord::TestCase
|
7
7
|
fixtures :owners
|
8
|
-
repair_validations(Owner)
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
o = Owner.new('name' => 'nopets')
|
14
|
-
assert !o.save
|
15
|
-
assert o.errors[:pets].any?
|
16
|
-
o.pets.build('name' => 'apet')
|
17
|
-
assert o.valid?
|
9
|
+
setup do
|
10
|
+
@owner = Class.new(Owner) do
|
11
|
+
def self.name; 'Owner'; end
|
18
12
|
end
|
19
13
|
end
|
20
14
|
|
15
|
+
|
16
|
+
def test_validates_size_of_association
|
17
|
+
assert_nothing_raised { @owner.validates_size_of :pets, minimum: 1 }
|
18
|
+
o = @owner.new('name' => 'nopets')
|
19
|
+
assert !o.save
|
20
|
+
assert o.errors[:pets].any?
|
21
|
+
o.pets.build('name' => 'apet')
|
22
|
+
assert o.valid?
|
23
|
+
end
|
24
|
+
|
21
25
|
def test_validates_size_of_association_using_within
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
assert o.errors[:pets].any?
|
34
|
-
end
|
26
|
+
assert_nothing_raised { @owner.validates_size_of :pets, within: 1..2 }
|
27
|
+
o = @owner.new('name' => 'nopets')
|
28
|
+
assert !o.save
|
29
|
+
assert o.errors[:pets].any?
|
30
|
+
|
31
|
+
o.pets.build('name' => 'apet')
|
32
|
+
assert o.valid?
|
33
|
+
|
34
|
+
2.times { o.pets.build('name' => 'apet') }
|
35
|
+
assert !o.save
|
36
|
+
assert o.errors[:pets].any?
|
35
37
|
end
|
36
38
|
|
37
39
|
def test_validates_size_of_association_utf8
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
40
|
+
@owner.validates_size_of :pets, minimum: 1
|
41
|
+
o = @owner.new('name' => 'あいうえおかきくけこ')
|
42
|
+
assert !o.save
|
43
|
+
assert o.errors[:pets].any?
|
44
|
+
o.pets.build('name' => 'あいうえおかきくけこ')
|
45
|
+
assert o.valid?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_validates_size_of_respects_records_marked_for_destruction
|
49
|
+
@owner.validates_size_of :pets, minimum: 1
|
50
|
+
owner = @owner.new
|
51
|
+
assert_not owner.save
|
52
|
+
assert owner.errors[:pets].any?
|
53
|
+
pet = owner.pets.build
|
54
|
+
assert owner.valid?
|
55
|
+
assert owner.save
|
56
|
+
|
57
|
+
pet_count = Pet.count
|
58
|
+
assert_not owner.update_attributes pets_attributes: [ {_destroy: 1, id: pet.id} ]
|
59
|
+
assert_not owner.valid?
|
60
|
+
assert owner.errors[:pets].any?
|
61
|
+
assert_equal pet_count, Pet.count
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_validates_length_of_virtual_attribute_on_model
|
65
|
+
repair_validations(Pet) do
|
66
|
+
Pet.send(:attr_accessor, :nickname)
|
67
|
+
Pet.validates_length_of(:name, minimum: 1)
|
68
|
+
Pet.validates_length_of(:nickname, minimum: 1)
|
69
|
+
|
70
|
+
pet = Pet.create!(name: 'Fancy Pants', nickname: 'Fancy')
|
71
|
+
|
72
|
+
assert pet.valid?
|
73
|
+
|
74
|
+
pet.nickname = ''
|
75
|
+
|
76
|
+
assert pet.invalid?
|
45
77
|
end
|
46
78
|
end
|
47
79
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
require "cases/helper"
|
3
2
|
require 'models/man'
|
4
3
|
require 'models/face'
|
@@ -65,4 +64,40 @@ class PresenceValidationTest < ActiveRecord::TestCase
|
|
65
64
|
|
66
65
|
assert_nothing_raised { s.valid? }
|
67
66
|
end
|
67
|
+
|
68
|
+
def test_validates_presence_of_virtual_attribute_on_model
|
69
|
+
repair_validations(Interest) do
|
70
|
+
Interest.send(:attr_accessor, :abbreviation)
|
71
|
+
Interest.validates_presence_of(:topic)
|
72
|
+
Interest.validates_presence_of(:abbreviation)
|
73
|
+
|
74
|
+
interest = Interest.create!(topic: 'Thought Leadering', abbreviation: 'tl')
|
75
|
+
assert interest.valid?
|
76
|
+
|
77
|
+
interest.abbreviation = ''
|
78
|
+
|
79
|
+
assert interest.invalid?
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_validations_run_on_persisted_record
|
84
|
+
repair_validations(Interest) do
|
85
|
+
interest = Interest.new
|
86
|
+
interest.save!
|
87
|
+
assert_predicate interest, :valid?
|
88
|
+
|
89
|
+
Interest.validates_presence_of(:topic)
|
90
|
+
|
91
|
+
assert_not_predicate interest, :valid?
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_validates_presence_with_on_context
|
96
|
+
repair_validations(Interest) do
|
97
|
+
Interest.validates_presence_of(:topic, on: :required_name)
|
98
|
+
interest = Interest.new
|
99
|
+
interest.save!
|
100
|
+
assert_not interest.valid?(:required_name)
|
101
|
+
end
|
102
|
+
end
|
68
103
|
end
|
@@ -1,11 +1,14 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
require "cases/helper"
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
2
|
+
require "models/topic"
|
3
|
+
require "models/reply"
|
4
|
+
require "models/warehouse_thing"
|
5
|
+
require "models/guid"
|
6
|
+
require "models/event"
|
7
|
+
require "models/dashboard"
|
8
|
+
require "models/uuid_item"
|
9
|
+
require "models/author"
|
10
|
+
require "models/person"
|
11
|
+
require "models/essay"
|
9
12
|
|
10
13
|
class Wizard < ActiveRecord::Base
|
11
14
|
self.abstract_class = true
|
@@ -31,11 +34,6 @@ class ReplyWithTitleObject < Reply
|
|
31
34
|
def title; ReplyTitle.new; end
|
32
35
|
end
|
33
36
|
|
34
|
-
class Employee < ActiveRecord::Base
|
35
|
-
self.table_name = 'postgresql_arrays'
|
36
|
-
validates_uniqueness_of :nicknames
|
37
|
-
end
|
38
|
-
|
39
37
|
class TopicWithUniqEvent < Topic
|
40
38
|
belongs_to :event, foreign_key: :parent_id
|
41
39
|
validates :event, uniqueness: true
|
@@ -54,6 +52,18 @@ class BigIntReverseTest < ActiveRecord::Base
|
|
54
52
|
validates :engines_count, uniqueness: true
|
55
53
|
end
|
56
54
|
|
55
|
+
class CoolTopic < Topic
|
56
|
+
validates_uniqueness_of :id
|
57
|
+
end
|
58
|
+
|
59
|
+
class TopicWithAfterCreate < Topic
|
60
|
+
after_create :set_author
|
61
|
+
|
62
|
+
def set_author
|
63
|
+
update_attributes!(:author_name => "#{title} #{id}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
57
67
|
class UniquenessValidationTest < ActiveRecord::TestCase
|
58
68
|
INT_MAX_VALUE = 2147483647
|
59
69
|
|
@@ -156,6 +166,19 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
156
166
|
assert !r2.valid?, "Saving r2 first time"
|
157
167
|
end
|
158
168
|
|
169
|
+
def test_validate_uniqueness_with_polymorphic_object_scope
|
170
|
+
Essay.validates_uniqueness_of(:name, scope: :writer)
|
171
|
+
|
172
|
+
a = Author.create(name: "Sergey")
|
173
|
+
p = Person.create(first_name: "Sergey")
|
174
|
+
|
175
|
+
e1 = a.essays.create(name: "Essay")
|
176
|
+
assert e1.valid?, "Saving e1"
|
177
|
+
|
178
|
+
e2 = p.essays.create(name: "Essay")
|
179
|
+
assert e2.valid?, "Saving e2"
|
180
|
+
end
|
181
|
+
|
159
182
|
def test_validate_uniqueness_with_composed_attribute_scope
|
160
183
|
r1 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
|
161
184
|
assert r1.valid?, "Saving r1"
|
@@ -342,22 +365,41 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
342
365
|
end
|
343
366
|
|
344
367
|
def test_validate_uniqueness_with_limit
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
368
|
+
if current_adapter?(:SQLite3Adapter)
|
369
|
+
# Event.title has limit 5, but SQLite doesn't truncate.
|
370
|
+
e1 = Event.create(title: "abcdefgh")
|
371
|
+
assert e1.valid?, "Could not create an event with a unique 8 characters title"
|
372
|
+
|
373
|
+
e2 = Event.create(title: "abcdefgh")
|
374
|
+
assert_not e2.valid?, "Created an event whose title is not unique"
|
375
|
+
elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
|
376
|
+
assert_raise(ActiveRecord::ValueTooLong) do
|
377
|
+
Event.create(title: "abcdefgh")
|
378
|
+
end
|
379
|
+
else
|
380
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
381
|
+
Event.create(title: "abcdefgh")
|
382
|
+
end
|
383
|
+
end
|
350
384
|
end
|
351
385
|
|
352
386
|
def test_validate_uniqueness_with_limit_and_utf8
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
e1
|
357
|
-
|
358
|
-
e2 = Event.create(:
|
359
|
-
|
360
|
-
|
387
|
+
if current_adapter?(:SQLite3Adapter)
|
388
|
+
# Event.title has limit 5, but does SQLite doesn't truncate.
|
389
|
+
e1 = Event.create(title: "一二三四五六七八")
|
390
|
+
assert e1.valid?, "Could not create an event with a unique 8 characters title"
|
391
|
+
|
392
|
+
e2 = Event.create(title: "一二三四五六七八")
|
393
|
+
assert_not e2.valid?, "Created an event whose title is not unique"
|
394
|
+
elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
|
395
|
+
assert_raise(ActiveRecord::ValueTooLong) do
|
396
|
+
Event.create(title: "一二三四五六七八")
|
397
|
+
end
|
398
|
+
else
|
399
|
+
assert_raise(ActiveRecord::StatementInvalid) do
|
400
|
+
Event.create(title: "一二三四五六七八")
|
401
|
+
end
|
402
|
+
end
|
361
403
|
end
|
362
404
|
|
363
405
|
def test_validate_straight_inheritance_uniqueness
|
@@ -407,18 +449,6 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
407
449
|
}
|
408
450
|
end
|
409
451
|
|
410
|
-
if current_adapter? :PostgreSQLAdapter
|
411
|
-
def test_validate_uniqueness_with_array_column
|
412
|
-
e1 = Employee.create("nicknames" => ["john", "johnny"], "commission_by_quarter" => [1000, 1200])
|
413
|
-
assert e1.persisted?, "Saving e1"
|
414
|
-
|
415
|
-
e2 = Employee.create("nicknames" => ["john", "johnny"], "commission_by_quarter" => [2200])
|
416
|
-
assert !e2.persisted?, "e2 shouldn't be valid"
|
417
|
-
assert e2.errors[:nicknames].any?, "Should have errors for nicknames"
|
418
|
-
assert_equal ["has already been taken"], e2.errors[:nicknames], "Should have uniqueness message for nicknames"
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
452
|
def test_validate_uniqueness_on_existing_relation
|
423
453
|
event = Event.create
|
424
454
|
assert TopicWithUniqEvent.create(event: event).valid?
|
@@ -433,6 +463,25 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
433
463
|
assert topic.valid?
|
434
464
|
end
|
435
465
|
|
466
|
+
def test_validate_uniqueness_of_custom_primary_key
|
467
|
+
klass = Class.new(ActiveRecord::Base) do
|
468
|
+
self.table_name = "keyboards"
|
469
|
+
self.primary_key = :key_number
|
470
|
+
|
471
|
+
validates_uniqueness_of :key_number
|
472
|
+
|
473
|
+
def self.name
|
474
|
+
"Keyboard"
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
478
|
+
klass.create!(key_number: 10)
|
479
|
+
key2 = klass.create!(key_number: 11)
|
480
|
+
|
481
|
+
key2.key_number = 10
|
482
|
+
assert_not key2.valid?
|
483
|
+
end
|
484
|
+
|
436
485
|
def test_validate_uniqueness_without_primary_key
|
437
486
|
klass = Class.new(ActiveRecord::Base) do
|
438
487
|
self.table_name = "dashboards"
|
@@ -454,4 +503,46 @@ class UniquenessValidationTest < ActiveRecord::TestCase
|
|
454
503
|
assert_match(/\AUnknown primary key for table dashboards in model/, e.message)
|
455
504
|
assert_match(/Can not validate uniqueness for persisted record without primary key.\z/, e.message)
|
456
505
|
end
|
506
|
+
|
507
|
+
def test_validate_uniqueness_ignores_itself_when_primary_key_changed
|
508
|
+
Topic.validates_uniqueness_of(:title)
|
509
|
+
|
510
|
+
t = Topic.new("title" => "This is a unique title")
|
511
|
+
assert t.save, "Should save t as unique"
|
512
|
+
|
513
|
+
t.id += 1
|
514
|
+
assert t.valid?, "Should be valid"
|
515
|
+
assert t.save, "Should still save t as unique"
|
516
|
+
end
|
517
|
+
|
518
|
+
def test_validate_uniqueness_with_after_create_performing_save
|
519
|
+
TopicWithAfterCreate.validates_uniqueness_of(:title)
|
520
|
+
topic = TopicWithAfterCreate.create!(:title => "Title1")
|
521
|
+
assert topic.author_name.start_with?("Title1")
|
522
|
+
|
523
|
+
topic2 = TopicWithAfterCreate.new(:title => "Title1")
|
524
|
+
refute topic2.valid?
|
525
|
+
assert_equal(["has already been taken"], topic2.errors[:title])
|
526
|
+
end
|
527
|
+
|
528
|
+
def test_validate_uniqueness_uuid
|
529
|
+
skip unless current_adapter?(:PostgreSQLAdapter)
|
530
|
+
item = UuidItem.create!(uuid: SecureRandom.uuid, title: 'item1')
|
531
|
+
item.update(title: 'item1-title2')
|
532
|
+
assert_empty item.errors
|
533
|
+
|
534
|
+
item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: 'item2')
|
535
|
+
item2.update(title: 'item2-title2')
|
536
|
+
assert_empty item2.errors
|
537
|
+
end
|
538
|
+
|
539
|
+
def test_validate_uniqueness_regular_id
|
540
|
+
item = CoolTopic.create!(title: 'MyItem')
|
541
|
+
assert_empty item.errors
|
542
|
+
|
543
|
+
item2 = CoolTopic.new(id: item.id, title: 'MyItem2')
|
544
|
+
refute item2.valid?
|
545
|
+
|
546
|
+
assert_equal(["has already been taken"], item2.errors[:id])
|
547
|
+
end
|
457
548
|
end
|