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
data/test/cases/dirty_test.rb
CHANGED
@@ -37,8 +37,8 @@ class DirtyTest < ActiveRecord::TestCase
|
|
37
37
|
def test_attribute_changes
|
38
38
|
# New record - no changes.
|
39
39
|
pirate = Pirate.new
|
40
|
-
|
41
|
-
|
40
|
+
assert_equal false, pirate.catchphrase_changed?
|
41
|
+
assert_equal false, pirate.non_validated_parrot_id_changed?
|
42
42
|
|
43
43
|
# Change catchphrase.
|
44
44
|
pirate.catchphrase = 'arrr'
|
@@ -89,7 +89,7 @@ class DirtyTest < ActiveRecord::TestCase
|
|
89
89
|
target = Class.new(ActiveRecord::Base)
|
90
90
|
target.table_name = 'pirates'
|
91
91
|
|
92
|
-
pirate = target.create
|
92
|
+
pirate = target.create!
|
93
93
|
pirate.created_on = pirate.created_on
|
94
94
|
assert !pirate.created_on_changed?
|
95
95
|
end
|
@@ -165,18 +165,6 @@ class DirtyTest < ActiveRecord::TestCase
|
|
165
165
|
assert_equal parrot.name_change, parrot.title_change
|
166
166
|
end
|
167
167
|
|
168
|
-
def test_reset_attribute!
|
169
|
-
pirate = Pirate.create!(:catchphrase => 'Yar!')
|
170
|
-
pirate.catchphrase = 'Ahoy!'
|
171
|
-
|
172
|
-
assert_deprecated do
|
173
|
-
pirate.reset_catchphrase!
|
174
|
-
end
|
175
|
-
assert_equal "Yar!", pirate.catchphrase
|
176
|
-
assert_equal Hash.new, pirate.changes
|
177
|
-
assert !pirate.catchphrase_changed?
|
178
|
-
end
|
179
|
-
|
180
168
|
def test_restore_attribute!
|
181
169
|
pirate = Pirate.create!(:catchphrase => 'Yar!')
|
182
170
|
pirate.catchphrase = 'Ahoy!'
|
@@ -479,8 +467,10 @@ class DirtyTest < ActiveRecord::TestCase
|
|
479
467
|
topic.save!
|
480
468
|
|
481
469
|
updated_at = topic.updated_at
|
482
|
-
|
483
|
-
|
470
|
+
travel(1.second) do
|
471
|
+
topic.content[:hello] = 'world'
|
472
|
+
topic.save!
|
473
|
+
end
|
484
474
|
|
485
475
|
assert_not_equal updated_at, topic.updated_at
|
486
476
|
assert_equal 'world', topic.content[:hello]
|
@@ -533,6 +523,9 @@ class DirtyTest < ActiveRecord::TestCase
|
|
533
523
|
assert_equal Hash.new, pirate.previous_changes
|
534
524
|
|
535
525
|
pirate = Pirate.find_by_catchphrase("arrr")
|
526
|
+
|
527
|
+
travel(1.second)
|
528
|
+
|
536
529
|
pirate.catchphrase = "Me Maties!"
|
537
530
|
pirate.save!
|
538
531
|
|
@@ -544,6 +537,9 @@ class DirtyTest < ActiveRecord::TestCase
|
|
544
537
|
assert !pirate.previous_changes.key?('created_on')
|
545
538
|
|
546
539
|
pirate = Pirate.find_by_catchphrase("Me Maties!")
|
540
|
+
|
541
|
+
travel(1.second)
|
542
|
+
|
547
543
|
pirate.catchphrase = "Thar She Blows!"
|
548
544
|
pirate.save
|
549
545
|
|
@@ -554,6 +550,8 @@ class DirtyTest < ActiveRecord::TestCase
|
|
554
550
|
assert !pirate.previous_changes.key?('parrot_id')
|
555
551
|
assert !pirate.previous_changes.key?('created_on')
|
556
552
|
|
553
|
+
travel(1.second)
|
554
|
+
|
557
555
|
pirate = Pirate.find_by_catchphrase("Thar She Blows!")
|
558
556
|
pirate.update(catchphrase: "Ahoy!")
|
559
557
|
|
@@ -564,6 +562,8 @@ class DirtyTest < ActiveRecord::TestCase
|
|
564
562
|
assert !pirate.previous_changes.key?('parrot_id')
|
565
563
|
assert !pirate.previous_changes.key?('created_on')
|
566
564
|
|
565
|
+
travel(1.second)
|
566
|
+
|
567
567
|
pirate = Pirate.find_by_catchphrase("Ahoy!")
|
568
568
|
pirate.update_attribute(:catchphrase, "Ninjas suck!")
|
569
569
|
|
@@ -573,6 +573,8 @@ class DirtyTest < ActiveRecord::TestCase
|
|
573
573
|
assert_not_nil pirate.previous_changes['updated_on'][1]
|
574
574
|
assert !pirate.previous_changes.key?('parrot_id')
|
575
575
|
assert !pirate.previous_changes.key?('created_on')
|
576
|
+
ensure
|
577
|
+
travel_back
|
576
578
|
end
|
577
579
|
|
578
580
|
if ActiveRecord::Base.connection.supports_migrations?
|
@@ -590,6 +592,7 @@ class DirtyTest < ActiveRecord::TestCase
|
|
590
592
|
end
|
591
593
|
|
592
594
|
def test_datetime_attribute_can_be_updated_with_fractional_seconds
|
595
|
+
skip "Fractional seconds are not supported" unless subsecond_precision_supported?
|
593
596
|
in_time_zone 'Paris' do
|
594
597
|
target = Class.new(ActiveRecord::Base)
|
595
598
|
target.table_name = 'topics'
|
@@ -635,32 +638,6 @@ class DirtyTest < ActiveRecord::TestCase
|
|
635
638
|
end
|
636
639
|
end
|
637
640
|
|
638
|
-
test "defaults with type that implements `type_cast_for_database`" do
|
639
|
-
type = Class.new(ActiveRecord::Type::Value) do
|
640
|
-
def type_cast(value)
|
641
|
-
value.to_i
|
642
|
-
end
|
643
|
-
|
644
|
-
def type_cast_for_database(value)
|
645
|
-
value.to_s
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
model_class = Class.new(ActiveRecord::Base) do
|
650
|
-
self.table_name = 'numeric_data'
|
651
|
-
attribute :foo, type.new, default: 1
|
652
|
-
end
|
653
|
-
|
654
|
-
model = model_class.new
|
655
|
-
assert_not model.foo_changed?
|
656
|
-
|
657
|
-
model = model_class.new(foo: 1)
|
658
|
-
assert_not model.foo_changed?
|
659
|
-
|
660
|
-
model = model_class.new(foo: '1')
|
661
|
-
assert_not model.foo_changed?
|
662
|
-
end
|
663
|
-
|
664
641
|
test "in place mutation detection" do
|
665
642
|
pirate = Pirate.create!(catchphrase: "arrrr")
|
666
643
|
pirate.catchphrase << " matey!"
|
@@ -723,7 +700,7 @@ class DirtyTest < ActiveRecord::TestCase
|
|
723
700
|
test "attribute_will_change! doesn't try to save non-persistable attributes" do
|
724
701
|
klass = Class.new(ActiveRecord::Base) do
|
725
702
|
self.table_name = 'people'
|
726
|
-
attribute :non_persisted_attribute,
|
703
|
+
attribute :non_persisted_attribute, :string
|
727
704
|
end
|
728
705
|
|
729
706
|
record = klass.new(first_name: "Sean")
|
@@ -757,14 +734,15 @@ class DirtyTest < ActiveRecord::TestCase
|
|
757
734
|
assert_equal "arr", pirate.catchphrase
|
758
735
|
end
|
759
736
|
|
760
|
-
test "
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
737
|
+
test "attributes assigned but not selected are dirty" do
|
738
|
+
person = Person.select(:id).first
|
739
|
+
refute person.changed?
|
740
|
+
|
741
|
+
person.first_name = "Sean"
|
742
|
+
assert person.changed?
|
743
|
+
|
744
|
+
person.first_name = nil
|
745
|
+
assert person.changed?
|
768
746
|
end
|
769
747
|
|
770
748
|
private
|
@@ -4,7 +4,7 @@ class TestRecord < ActiveRecord::Base
|
|
4
4
|
end
|
5
5
|
|
6
6
|
class TestDisconnectedAdapter < ActiveRecord::TestCase
|
7
|
-
self.
|
7
|
+
self.use_transactional_tests = false
|
8
8
|
|
9
9
|
def setup
|
10
10
|
@connection = ActiveRecord::Base.connection
|
@@ -21,7 +21,9 @@ class TestDisconnectedAdapter < ActiveRecord::TestCase
|
|
21
21
|
@connection.execute "SELECT count(*) from products"
|
22
22
|
@connection.disconnect!
|
23
23
|
assert_raises(ActiveRecord::StatementInvalid) do
|
24
|
-
|
24
|
+
silence_warnings do
|
25
|
+
@connection.execute "SELECT count(*) from products"
|
26
|
+
end
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
data/test/cases/enum_test.rb
CHANGED
@@ -9,26 +9,83 @@ class EnumTest < ActiveRecord::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
test "query state by predicate" do
|
12
|
-
assert @book.
|
12
|
+
assert @book.published?
|
13
13
|
assert_not @book.written?
|
14
|
-
assert_not @book.
|
14
|
+
assert_not @book.proposed?
|
15
15
|
|
16
|
-
assert @book.
|
16
|
+
assert @book.read?
|
17
|
+
assert @book.in_english?
|
18
|
+
assert @book.author_visibility_visible?
|
19
|
+
assert @book.illustrator_visibility_visible?
|
20
|
+
assert @book.with_medium_font_size?
|
17
21
|
end
|
18
22
|
|
19
23
|
test "query state with strings" do
|
20
|
-
assert_equal "
|
21
|
-
assert_equal "
|
24
|
+
assert_equal "published", @book.status
|
25
|
+
assert_equal "read", @book.read_status
|
26
|
+
assert_equal "english", @book.language
|
27
|
+
assert_equal "visible", @book.author_visibility
|
28
|
+
assert_equal "visible", @book.illustrator_visibility
|
22
29
|
end
|
23
30
|
|
24
31
|
test "find via scope" do
|
25
|
-
assert_equal @book, Book.
|
26
|
-
assert_equal @book, Book.
|
32
|
+
assert_equal @book, Book.published.first
|
33
|
+
assert_equal @book, Book.read.first
|
34
|
+
assert_equal @book, Book.in_english.first
|
35
|
+
assert_equal @book, Book.author_visibility_visible.first
|
36
|
+
assert_equal @book, Book.illustrator_visibility_visible.first
|
37
|
+
end
|
38
|
+
|
39
|
+
test "find via where with values" do
|
40
|
+
published, written = Book.statuses[:published], Book.statuses[:written]
|
41
|
+
|
42
|
+
assert_equal @book, Book.where(status: published).first
|
43
|
+
assert_not_equal @book, Book.where(status: written).first
|
44
|
+
assert_equal @book, Book.where(status: [published]).first
|
45
|
+
assert_not_equal @book, Book.where(status: [written]).first
|
46
|
+
assert_not_equal @book, Book.where("status <> ?", published).first
|
47
|
+
assert_equal @book, Book.where("status <> ?", written).first
|
48
|
+
end
|
49
|
+
|
50
|
+
test "find via where with symbols" do
|
51
|
+
assert_equal @book, Book.where(status: :published).first
|
52
|
+
assert_not_equal @book, Book.where(status: :written).first
|
53
|
+
assert_equal @book, Book.where(status: [:published]).first
|
54
|
+
assert_not_equal @book, Book.where(status: [:written]).first
|
55
|
+
assert_not_equal @book, Book.where.not(status: :published).first
|
56
|
+
assert_equal @book, Book.where.not(status: :written).first
|
57
|
+
end
|
58
|
+
|
59
|
+
test "find via where with strings" do
|
60
|
+
assert_equal @book, Book.where(status: "published").first
|
61
|
+
assert_not_equal @book, Book.where(status: "written").first
|
62
|
+
assert_equal @book, Book.where(status: ["published"]).first
|
63
|
+
assert_not_equal @book, Book.where(status: ["written"]).first
|
64
|
+
assert_not_equal @book, Book.where.not(status: "published").first
|
65
|
+
assert_equal @book, Book.where.not(status: "written").first
|
66
|
+
end
|
67
|
+
|
68
|
+
test "build from scope" do
|
69
|
+
assert Book.written.build.written?
|
70
|
+
assert_not Book.written.build.proposed?
|
71
|
+
end
|
72
|
+
|
73
|
+
test "build from where" do
|
74
|
+
assert Book.where(status: Book.statuses[:written]).build.written?
|
75
|
+
assert_not Book.where(status: Book.statuses[:written]).build.proposed?
|
76
|
+
assert Book.where(status: :written).build.written?
|
77
|
+
assert_not Book.where(status: :written).build.proposed?
|
78
|
+
assert Book.where(status: "written").build.written?
|
79
|
+
assert_not Book.where(status: "written").build.proposed?
|
27
80
|
end
|
28
81
|
|
29
82
|
test "update by declaration" do
|
30
83
|
@book.written!
|
31
84
|
assert @book.written?
|
85
|
+
@book.in_english!
|
86
|
+
assert @book.in_english?
|
87
|
+
@book.author_visibility_visible!
|
88
|
+
assert @book.author_visibility_visible?
|
32
89
|
end
|
33
90
|
|
34
91
|
test "update by setter" do
|
@@ -53,42 +110,61 @@ class EnumTest < ActiveRecord::TestCase
|
|
53
110
|
|
54
111
|
test "enum changed attributes" do
|
55
112
|
old_status = @book.status
|
56
|
-
@book.
|
113
|
+
old_language = @book.language
|
114
|
+
@book.status = :proposed
|
115
|
+
@book.language = :spanish
|
57
116
|
assert_equal old_status, @book.changed_attributes[:status]
|
117
|
+
assert_equal old_language, @book.changed_attributes[:language]
|
58
118
|
end
|
59
119
|
|
60
120
|
test "enum changes" do
|
61
121
|
old_status = @book.status
|
62
|
-
@book.
|
63
|
-
|
122
|
+
old_language = @book.language
|
123
|
+
@book.status = :proposed
|
124
|
+
@book.language = :spanish
|
125
|
+
assert_equal [old_status, 'proposed'], @book.changes[:status]
|
126
|
+
assert_equal [old_language, 'spanish'], @book.changes[:language]
|
64
127
|
end
|
65
128
|
|
66
129
|
test "enum attribute was" do
|
67
130
|
old_status = @book.status
|
131
|
+
old_language = @book.language
|
68
132
|
@book.status = :published
|
133
|
+
@book.language = :spanish
|
69
134
|
assert_equal old_status, @book.attribute_was(:status)
|
135
|
+
assert_equal old_language, @book.attribute_was(:language)
|
70
136
|
end
|
71
137
|
|
72
138
|
test "enum attribute changed" do
|
73
|
-
@book.status = :
|
139
|
+
@book.status = :proposed
|
140
|
+
@book.language = :french
|
74
141
|
assert @book.attribute_changed?(:status)
|
142
|
+
assert @book.attribute_changed?(:language)
|
75
143
|
end
|
76
144
|
|
77
145
|
test "enum attribute changed to" do
|
78
|
-
@book.status = :
|
79
|
-
|
146
|
+
@book.status = :proposed
|
147
|
+
@book.language = :french
|
148
|
+
assert @book.attribute_changed?(:status, to: 'proposed')
|
149
|
+
assert @book.attribute_changed?(:language, to: 'french')
|
80
150
|
end
|
81
151
|
|
82
152
|
test "enum attribute changed from" do
|
83
153
|
old_status = @book.status
|
84
|
-
@book.
|
154
|
+
old_language = @book.language
|
155
|
+
@book.status = :proposed
|
156
|
+
@book.language = :french
|
85
157
|
assert @book.attribute_changed?(:status, from: old_status)
|
158
|
+
assert @book.attribute_changed?(:language, from: old_language)
|
86
159
|
end
|
87
160
|
|
88
161
|
test "enum attribute changed from old status to new status" do
|
89
162
|
old_status = @book.status
|
90
|
-
@book.
|
91
|
-
|
163
|
+
old_language = @book.language
|
164
|
+
@book.status = :proposed
|
165
|
+
@book.language = :french
|
166
|
+
assert @book.attribute_changed?(:status, from: old_status, to: 'proposed')
|
167
|
+
assert @book.attribute_changed?(:language, from: old_language, to: 'french')
|
92
168
|
end
|
93
169
|
|
94
170
|
test "enum didn't change" do
|
@@ -98,7 +174,7 @@ class EnumTest < ActiveRecord::TestCase
|
|
98
174
|
end
|
99
175
|
|
100
176
|
test "persist changes that are dirty" do
|
101
|
-
@book.status = :
|
177
|
+
@book.status = :proposed
|
102
178
|
assert @book.attribute_changed?(:status)
|
103
179
|
@book.status = :written
|
104
180
|
assert @book.attribute_changed?(:status)
|
@@ -106,7 +182,7 @@ class EnumTest < ActiveRecord::TestCase
|
|
106
182
|
|
107
183
|
test "reverted changes that are not dirty" do
|
108
184
|
old_status = @book.status
|
109
|
-
@book.status = :
|
185
|
+
@book.status = :proposed
|
110
186
|
assert @book.attribute_changed?(:status)
|
111
187
|
@book.status = old_status
|
112
188
|
assert_not @book.attribute_changed?(:status)
|
@@ -129,19 +205,24 @@ class EnumTest < ActiveRecord::TestCase
|
|
129
205
|
assert_equal "'unknown' is not a valid status", e.message
|
130
206
|
end
|
131
207
|
|
208
|
+
test "NULL values from database should be casted to nil" do
|
209
|
+
Book.where(id: @book.id).update_all("status = NULL")
|
210
|
+
assert_nil @book.reload.status
|
211
|
+
end
|
212
|
+
|
132
213
|
test "assign nil value" do
|
133
214
|
@book.status = nil
|
134
|
-
|
215
|
+
assert_nil @book.status
|
135
216
|
end
|
136
217
|
|
137
218
|
test "assign empty string value" do
|
138
219
|
@book.status = ''
|
139
|
-
|
220
|
+
assert_nil @book.status
|
140
221
|
end
|
141
222
|
|
142
223
|
test "assign long empty string value" do
|
143
224
|
@book.status = ' '
|
144
|
-
|
225
|
+
assert_nil @book.status
|
145
226
|
end
|
146
227
|
|
147
228
|
test "constant to access the mapping" do
|
@@ -153,15 +234,23 @@ class EnumTest < ActiveRecord::TestCase
|
|
153
234
|
test "building new objects with enum scopes" do
|
154
235
|
assert Book.written.build.written?
|
155
236
|
assert Book.read.build.read?
|
237
|
+
assert Book.in_spanish.build.in_spanish?
|
238
|
+
assert Book.illustrator_visibility_invisible.build.illustrator_visibility_invisible?
|
156
239
|
end
|
157
240
|
|
158
241
|
test "creating new objects with enum scopes" do
|
159
242
|
assert Book.written.create.written?
|
160
243
|
assert Book.read.create.read?
|
244
|
+
assert Book.in_spanish.create.in_spanish?
|
245
|
+
assert Book.illustrator_visibility_invisible.create.illustrator_visibility_invisible?
|
161
246
|
end
|
162
247
|
|
163
248
|
test "_before_type_cast returns the enum label (required for form fields)" do
|
164
|
-
|
249
|
+
if @book.status_came_from_user?
|
250
|
+
assert_equal "published", @book.status_before_type_cast
|
251
|
+
else
|
252
|
+
assert_equal "published", @book.status
|
253
|
+
end
|
165
254
|
end
|
166
255
|
|
167
256
|
test "reserved enum names" do
|
@@ -177,9 +266,10 @@ class EnumTest < ActiveRecord::TestCase
|
|
177
266
|
]
|
178
267
|
|
179
268
|
conflicts.each_with_index do |name, i|
|
180
|
-
assert_raises(ArgumentError
|
269
|
+
e = assert_raises(ArgumentError) do
|
181
270
|
klass.class_eval { enum name => ["value_#{i}"] }
|
182
271
|
end
|
272
|
+
assert_match(/You tried to define an enum named \"#{name}\" on the model/, e.message)
|
183
273
|
end
|
184
274
|
end
|
185
275
|
|
@@ -199,9 +289,10 @@ class EnumTest < ActiveRecord::TestCase
|
|
199
289
|
]
|
200
290
|
|
201
291
|
conflicts.each_with_index do |value, i|
|
202
|
-
assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
|
292
|
+
e = assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
|
203
293
|
klass.class_eval { enum "status_#{i}" => [value] }
|
204
294
|
end
|
295
|
+
assert_match(/You tried to define an enum named .* on the model/, e.message)
|
205
296
|
end
|
206
297
|
end
|
207
298
|
|
@@ -287,4 +378,67 @@ class EnumTest < ActiveRecord::TestCase
|
|
287
378
|
book2.status = :uploaded
|
288
379
|
assert_equal ['drafted', 'uploaded'], book2.status_change
|
289
380
|
end
|
381
|
+
|
382
|
+
test "declare multiple enums at a time" do
|
383
|
+
klass = Class.new(ActiveRecord::Base) do
|
384
|
+
self.table_name = "books"
|
385
|
+
enum status: [:proposed, :written, :published],
|
386
|
+
nullable_status: [:single, :married]
|
387
|
+
end
|
388
|
+
|
389
|
+
book1 = klass.proposed.create!
|
390
|
+
assert book1.proposed?
|
391
|
+
|
392
|
+
book2 = klass.single.create!
|
393
|
+
assert book2.single?
|
394
|
+
end
|
395
|
+
|
396
|
+
test "enum with alias_attribute" do
|
397
|
+
klass = Class.new(ActiveRecord::Base) do
|
398
|
+
self.table_name = "books"
|
399
|
+
alias_attribute :aliased_status, :status
|
400
|
+
enum aliased_status: [:proposed, :written, :published]
|
401
|
+
end
|
402
|
+
|
403
|
+
book = klass.proposed.create!
|
404
|
+
assert book.proposed?
|
405
|
+
assert_equal 'proposed', book.aliased_status
|
406
|
+
|
407
|
+
book = klass.find(book.id)
|
408
|
+
assert book.proposed?
|
409
|
+
assert_equal 'proposed', book.aliased_status
|
410
|
+
end
|
411
|
+
|
412
|
+
test "query state by predicate with prefix" do
|
413
|
+
assert @book.author_visibility_visible?
|
414
|
+
assert_not @book.author_visibility_invisible?
|
415
|
+
assert @book.illustrator_visibility_visible?
|
416
|
+
assert_not @book.illustrator_visibility_invisible?
|
417
|
+
end
|
418
|
+
|
419
|
+
test "query state by predicate with custom prefix" do
|
420
|
+
assert @book.in_english?
|
421
|
+
assert_not @book.in_spanish?
|
422
|
+
assert_not @book.in_french?
|
423
|
+
end
|
424
|
+
|
425
|
+
test "uses default status when no status is provided in fixtures" do
|
426
|
+
book = books(:tlg)
|
427
|
+
assert book.proposed?, "expected fixture to default to proposed status"
|
428
|
+
assert book.in_english?, "expected fixture to default to english language"
|
429
|
+
end
|
430
|
+
|
431
|
+
test "uses default value from database on initialization" do
|
432
|
+
book = Book.new
|
433
|
+
assert book.proposed?
|
434
|
+
end
|
435
|
+
|
436
|
+
test "uses default value from database on initialization when using custom mapping" do
|
437
|
+
book = Book.new
|
438
|
+
assert book.hard?
|
439
|
+
end
|
440
|
+
|
441
|
+
test "data type of Enum type" do
|
442
|
+
assert_equal :integer, Book.type_for_attribute('status').type
|
443
|
+
end
|
290
444
|
end
|