ibm_db 4.0.0-x86-mingw32 → 5.0.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/MANIFEST +14 -14
- data/README +208 -208
- data/ext/Makefile +269 -0
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +322 -291
- data/ext/gil_release_version +3 -0
- data/ext/ibm_db.c +11879 -11887
- data/ext/mkmf.log +110 -0
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.c +866 -866
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/ext/unicode_support_version +3 -0
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3533 -3452
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +90 -90
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +351 -351
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
- data/test/cases/adapters/mysql2/connection_test.rb +210 -210
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
- data/test/cases/adapters/mysql2/enum_test.rb +26 -26
- data/test/cases/adapters/mysql2/explain_test.rb +21 -21
- data/test/cases/adapters/mysql2/json_test.rb +195 -195
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
- data/test/cases/adapters/mysql2/schema_test.rb +126 -126
- data/test/cases/adapters/mysql2/sp_test.rb +36 -36
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
- data/test/cases/adapters/postgresql/array_test.rb +339 -339
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
- data/test/cases/adapters/postgresql/citext_test.rb +78 -78
- data/test/cases/adapters/postgresql/collation_test.rb +53 -53
- data/test/cases/adapters/postgresql/composite_test.rb +132 -132
- data/test/cases/adapters/postgresql/connection_test.rb +257 -257
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
- data/test/cases/adapters/postgresql/domain_test.rb +47 -47
- data/test/cases/adapters/postgresql/enum_test.rb +91 -91
- data/test/cases/adapters/postgresql/explain_test.rb +20 -20
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
- data/test/cases/adapters/postgresql/integer_test.rb +25 -25
- data/test/cases/adapters/postgresql/json_test.rb +237 -237
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
- data/test/cases/adapters/postgresql/money_test.rb +96 -96
- data/test/cases/adapters/postgresql/network_test.rb +94 -94
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
- data/test/cases/adapters/postgresql/range_test.rb +343 -343
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
- data/test/cases/adapters/postgresql/schema_test.rb +597 -597
- data/test/cases/adapters/postgresql/serial_test.rb +154 -154
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
- data/test/cases/adapters/postgresql/utils_test.rb +62 -62
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
- data/test/cases/adapters/postgresql/xml_test.rb +54 -54
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
- data/test/cases/aggregations_test.rb +168 -168
- data/test/cases/ar_schema_test.rb +146 -146
- data/test/cases/associations/association_scope_test.rb +16 -16
- data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
- data/test/cases/associations/callbacks_test.rb +190 -190
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1514 -1514
- data/test/cases/associations/extension_test.rb +87 -87
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
- data/test/cases/associations/has_many_associations_test.rb +2501 -2501
- data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
- data/test/cases/associations/has_one_associations_test.rb +707 -707
- data/test/cases/associations/has_one_through_associations_test.rb +383 -383
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +733 -733
- data/test/cases/associations/join_model_test.rb +777 -777
- data/test/cases/associations/left_outer_join_association_test.rb +88 -88
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +102 -102
- data/test/cases/associations_test.rb +385 -385
- data/test/cases/attribute_decorators_test.rb +126 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods_test.rb +1009 -1009
- data/test/cases/attribute_set_test.rb +270 -270
- data/test/cases/attribute_test.rb +246 -246
- data/test/cases/attributes_test.rb +253 -253
- data/test/cases/autosave_association_test.rb +1708 -1708
- data/test/cases/base_test.rb +1713 -1713
- data/test/cases/batches_test.rb +489 -489
- data/test/cases/binary_test.rb +44 -44
- data/test/cases/bind_parameter_test.rb +110 -110
- data/test/cases/cache_key_test.rb +26 -25
- data/test/cases/calculations_test.rb +798 -798
- data/test/cases/callbacks_test.rb +636 -636
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/json_test.rb +15 -15
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/collection_cache_key_test.rb +115 -115
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +92 -92
- data/test/cases/comment_test.rb +145 -143
- data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
- data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
- data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
- data/test/cases/connection_management_test.rb +112 -112
- data/test/cases/connection_pool_test.rb +521 -521
- data/test/cases/connection_specification/resolver_test.rb +131 -131
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +214 -214
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +34 -34
- data/test/cases/date_test.rb +44 -44
- data/test/cases/date_time_precision_test.rb +107 -106
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +219 -218
- data/test/cases/dirty_test.rb +763 -763
- data/test/cases/disconnected_test.rb +30 -30
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +444 -444
- data/test/cases/errors_test.rb +16 -16
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +87 -87
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1294 -1294
- data/test/cases/fixture_set/file_test.rb +156 -156
- data/test/cases/fixtures_test.rb +988 -988
- data/test/cases/forbidden_attributes_protection_test.rb +165 -165
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +204 -204
- data/test/cases/hot_compatibility_test.rb +142 -142
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +606 -606
- data/test/cases/integration_test.rb +155 -155
- data/test/cases/invalid_connection_test.rb +24 -24
- data/test/cases/invertible_migration_test.rb +387 -387
- data/test/cases/json_serialization_test.rb +311 -311
- data/test/cases/locking_test.rb +493 -493
- data/test/cases/log_subscriber_test.rb +225 -225
- data/test/cases/migration/change_schema_test.rb +458 -458
- data/test/cases/migration/change_table_test.rb +256 -256
- data/test/cases/migration/column_attributes_test.rb +176 -176
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +310 -310
- data/test/cases/migration/command_recorder_test.rb +350 -350
- data/test/cases/migration/compatibility_test.rb +118 -118
- data/test/cases/migration/create_join_table_test.rb +157 -157
- data/test/cases/migration/foreign_key_test.rb +362 -360
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +218 -218
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +52 -52
- data/test/cases/migration/references_foreign_key_test.rb +221 -216
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +136 -136
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration_test.rb +1157 -1157
- data/test/cases/migrator_test.rb +471 -470
- data/test/cases/mixin_test.rb +68 -68
- data/test/cases/modules_test.rb +172 -172
- data/test/cases/multiparameter_attributes_test.rb +372 -372
- data/test/cases/multiple_db_test.rb +122 -122
- data/test/cases/nested_attributes_test.rb +1098 -1098
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +1001 -1001
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +376 -376
- data/test/cases/query_cache_test.rb +446 -446
- data/test/cases/quoting_test.rb +202 -202
- data/test/cases/readonly_test.rb +119 -119
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +509 -509
- data/test/cases/relation/delegation_test.rb +63 -63
- data/test/cases/relation/merging_test.rb +157 -157
- data/test/cases/relation/mutation_test.rb +183 -183
- data/test/cases/relation/or_test.rb +92 -92
- data/test/cases/relation/predicate_builder_test.rb +16 -16
- data/test/cases/relation/record_fetch_warning_test.rb +40 -40
- data/test/cases/relation/where_chain_test.rb +105 -105
- data/test/cases/relation/where_clause_test.rb +182 -182
- data/test/cases/relation/where_test.rb +322 -322
- data/test/cases/relation_test.rb +328 -328
- data/test/cases/relations_test.rb +2026 -2026
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +90 -90
- data/test/cases/sanitize_test.rb +176 -176
- data/test/cases/schema_dumper_test.rb +457 -457
- data/test/cases/schema_loading_test.rb +52 -52
- data/test/cases/scoping/default_scoping_test.rb +528 -528
- data/test/cases/scoping/named_scoping_test.rb +561 -561
- data/test/cases/scoping/relation_scoping_test.rb +400 -400
- data/test/cases/secure_token_test.rb +32 -32
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +364 -364
- data/test/cases/statement_cache_test.rb +136 -136
- data/test/cases/store_test.rb +195 -195
- data/test/cases/suppressor_test.rb +63 -63
- data/test/cases/tasks/database_tasks_test.rb +462 -462
- data/test/cases/tasks/mysql_rake_test.rb +345 -345
- data/test/cases/tasks/postgresql_rake_test.rb +304 -304
- data/test/cases/tasks/sqlite_rake_test.rb +220 -220
- data/test/cases/test_case.rb +131 -131
- data/test/cases/test_fixtures_test.rb +36 -36
- data/test/cases/time_precision_test.rb +103 -102
- data/test/cases/timestamp_test.rb +501 -501
- data/test/cases/touch_later_test.rb +121 -121
- data/test/cases/transaction_callbacks_test.rb +518 -518
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +835 -834
- data/test/cases/type/adapter_specific_registry_test.rb +133 -133
- data/test/cases/type/date_time_test.rb +14 -14
- data/test/cases/type/integer_test.rb +27 -27
- data/test/cases/type/string_test.rb +22 -22
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type_test.rb +39 -39
- data/test/cases/types_test.rb +24 -24
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/absence_validation_test.rb +73 -73
- data/test/cases/validations/association_validation_test.rb +97 -97
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +86 -86
- data/test/cases/validations/length_validation_test.rb +79 -79
- data/test/cases/validations/presence_validation_test.rb +103 -103
- data/test/cases/validations/uniqueness_validation_test.rb +548 -548
- data/test/cases/validations_repair_helper.rb +19 -19
- data/test/cases/validations_test.rb +194 -194
- data/test/cases/view_test.rb +216 -216
- data/test/cases/yaml_serialization_test.rb +121 -121
- data/test/config.example.yml +97 -97
- data/test/config.rb +5 -5
- data/test/connections/native_ibm_db/connection.rb +44 -0
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/bad_posts.yml +9 -9
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +31 -31
- data/test/fixtures/bulbs.yml +5 -5
- data/test/fixtures/cars.yml +9 -9
- data/test/fixtures/categories.yml +19 -19
- data/test/fixtures/categories/special_categories.yml +9 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
- data/test/fixtures/categories_ordered.yml +7 -7
- data/test/fixtures/categories_posts.yml +31 -31
- data/test/fixtures/categorizations.yml +23 -23
- data/test/fixtures/clubs.yml +8 -8
- data/test/fixtures/collections.yml +3 -3
- data/test/fixtures/colleges.yml +3 -3
- data/test/fixtures/comments.yml +65 -65
- data/test/fixtures/companies.yml +67 -67
- data/test/fixtures/computers.yml +10 -10
- data/test/fixtures/content.yml +3 -3
- data/test/fixtures/content_positions.yml +3 -3
- data/test/fixtures/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/dead_parrots.yml +5 -5
- data/test/fixtures/developers.yml +22 -22
- data/test/fixtures/developers_projects.yml +16 -16
- data/test/fixtures/dog_lovers.yml +7 -7
- data/test/fixtures/dogs.yml +4 -4
- data/test/fixtures/doubloons.yml +3 -3
- data/test/fixtures/edges.yml +5 -5
- data/test/fixtures/entrants.yml +14 -14
- data/test/fixtures/essays.yml +6 -6
- data/test/fixtures/faces.yml +11 -11
- data/test/fixtures/fk_test_has_fk.yml +3 -3
- data/test/fixtures/fk_test_has_pk.yml +1 -1
- data/test/fixtures/friendships.yml +4 -4
- data/test/fixtures/funny_jokes.yml +10 -10
- data/test/fixtures/interests.yml +33 -33
- data/test/fixtures/items.yml +3 -3
- data/test/fixtures/jobs.yml +7 -7
- data/test/fixtures/legacy_things.yml +3 -3
- data/test/fixtures/live_parrots.yml +4 -4
- data/test/fixtures/mateys.yml +4 -4
- data/test/fixtures/member_details.yml +8 -8
- data/test/fixtures/member_types.yml +6 -6
- data/test/fixtures/members.yml +11 -11
- data/test/fixtures/memberships.yml +34 -34
- data/test/fixtures/men.yml +5 -5
- data/test/fixtures/minimalistics.yml +2 -2
- data/test/fixtures/minivans.yml +5 -5
- data/test/fixtures/mixed_case_monkeys.yml +6 -6
- data/test/fixtures/mixins.yml +29 -29
- data/test/fixtures/movies.yml +7 -7
- data/test/fixtures/naked/yml/accounts.yml +1 -1
- data/test/fixtures/naked/yml/companies.yml +1 -1
- data/test/fixtures/naked/yml/courses.yml +1 -1
- data/test/fixtures/naked/yml/parrots.yml +2 -2
- data/test/fixtures/naked/yml/trees.yml +3 -3
- data/test/fixtures/nodes.yml +29 -29
- data/test/fixtures/organizations.yml +5 -5
- data/test/fixtures/other_comments.yml +6 -6
- data/test/fixtures/other_dogs.yml +2 -2
- data/test/fixtures/other_posts.yml +7 -7
- data/test/fixtures/other_topics.yml +42 -42
- data/test/fixtures/owners.yml +9 -9
- data/test/fixtures/parrots.yml +27 -27
- data/test/fixtures/parrots_pirates.yml +7 -7
- data/test/fixtures/people.yml +24 -24
- data/test/fixtures/peoples_treasures.yml +3 -3
- data/test/fixtures/pets.yml +19 -19
- data/test/fixtures/pirates.yml +12 -15
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +16 -16
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/ratings.yml +14 -14
- data/test/fixtures/readers.yml +11 -11
- data/test/fixtures/references.yml +17 -17
- data/test/fixtures/reserved_words/distinct.yml +5 -5
- data/test/fixtures/reserved_words/distinct_select.yml +11 -11
- data/test/fixtures/reserved_words/group.yml +14 -14
- data/test/fixtures/reserved_words/select.yml +8 -8
- data/test/fixtures/reserved_words/values.yml +7 -7
- data/test/fixtures/ships.yml +6 -6
- data/test/fixtures/speedometers.yml +8 -8
- data/test/fixtures/sponsors.yml +12 -12
- data/test/fixtures/string_key_objects.yml +7 -7
- data/test/fixtures/subscribers.yml +10 -10
- data/test/fixtures/subscriptions.yml +12 -12
- data/test/fixtures/taggings.yml +78 -78
- data/test/fixtures/tags.yml +11 -11
- data/test/fixtures/tasks.yml +7 -7
- data/test/fixtures/teapots.yml +3 -3
- data/test/fixtures/to_be_linked/accounts.yml +2 -2
- data/test/fixtures/to_be_linked/users.yml +10 -10
- data/test/fixtures/topics.yml +49 -49
- data/test/fixtures/toys.yml +14 -14
- data/test/fixtures/traffic_lights.yml +9 -9
- data/test/fixtures/treasures.yml +10 -10
- data/test/fixtures/trees.yml +3 -3
- data/test/fixtures/uuid_children.yml +3 -3
- data/test/fixtures/uuid_parents.yml +2 -2
- data/test/fixtures/variants.yml +4 -4
- data/test/fixtures/vegetables.yml +19 -19
- data/test/fixtures/vertices.yml +3 -3
- data/test/fixtures/warehouse_things.yml +2 -2
- data/test/fixtures/zines.yml +5 -5
- data/test/migrations/10_urban/9_add_expressions.rb +11 -11
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
- data/test/migrations/missing/1_people_have_last_names.rb +9 -9
- data/test/migrations/missing/3_we_need_reminders.rb +12 -12
- data/test/migrations/missing/4_innocent_jointable.rb +12 -12
- data/test/migrations/rename/1_we_need_things.rb +11 -11
- data/test/migrations/rename/2_rename_things.rb +9 -9
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy2/1_create_articles.rb +7 -7
- data/test/migrations/to_copy2/2_create_comments.rb +7 -7
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
- data/test/models/admin.rb +5 -5
- data/test/models/admin/account.rb +3 -3
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +5 -5
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +209 -209
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +2 -2
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +23 -23
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +52 -52
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +29 -29
- data/test/models/carrier.rb +2 -2
- data/test/models/cat.rb +10 -10
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +8 -8
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +25 -25
- data/test/models/college.rb +10 -10
- data/test/models/column.rb +3 -3
- data/test/models/column_name.rb +3 -3
- data/test/models/comment.rb +76 -76
- data/test/models/company.rb +230 -230
- data/test/models/company_in_module.rb +98 -98
- data/test/models/computer.rb +3 -3
- data/test/models/contact.rb +41 -41
- data/test/models/content.rb +40 -40
- data/test/models/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +83 -83
- data/test/models/customer_carrier.rb +14 -14
- data/test/models/dashboard.rb +3 -3
- data/test/models/default.rb +2 -2
- data/test/models/department.rb +4 -4
- data/test/models/developer.rb +274 -274
- data/test/models/dog.rb +5 -5
- data/test/models/dog_lover.rb +5 -5
- data/test/models/doubloon.rb +12 -12
- data/test/models/drink_designer.rb +3 -3
- data/test/models/edge.rb +5 -5
- data/test/models/electron.rb +5 -5
- data/test/models/engine.rb +4 -4
- data/test/models/entrant.rb +3 -3
- data/test/models/essay.rb +5 -5
- data/test/models/event.rb +3 -3
- data/test/models/eye.rb +37 -37
- data/test/models/face.rb +9 -9
- data/test/models/friendship.rb +6 -6
- data/test/models/guid.rb +2 -2
- data/test/models/guitar.rb +4 -4
- data/test/models/hotel.rb +11 -11
- data/test/models/image.rb +3 -3
- data/test/models/interest.rb +5 -5
- data/test/models/invoice.rb +4 -4
- data/test/models/item.rb +7 -7
- data/test/models/job.rb +7 -7
- data/test/models/joke.rb +7 -7
- data/test/models/keyboard.rb +3 -3
- data/test/models/legacy_thing.rb +3 -3
- data/test/models/lesson.rb +11 -11
- data/test/models/line_item.rb +3 -3
- data/test/models/liquid.rb +4 -4
- data/test/models/man.rb +11 -11
- data/test/models/matey.rb +4 -4
- data/test/models/member.rb +42 -42
- data/test/models/member_detail.rb +8 -8
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- data/test/models/mentor.rb +2 -2
- data/test/models/minimalistic.rb +2 -2
- data/test/models/minivan.rb +9 -9
- data/test/models/mixed_case_monkey.rb +3 -3
- data/test/models/mocktail_designer.rb +2 -2
- data/test/models/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/node.rb +5 -5
- data/test/models/non_primary_key.rb +2 -2
- data/test/models/notification.rb +3 -3
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/other_dog.rb +5 -5
- data/test/models/owner.rb +37 -37
- data/test/models/parrot.rb +28 -28
- data/test/models/person.rb +142 -142
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +18 -18
- data/test/models/pet_treasure.rb +6 -6
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +273 -273
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +40 -40
- data/test/models/publisher.rb +2 -2
- data/test/models/publisher/article.rb +4 -4
- data/test/models/publisher/magazine.rb +3 -3
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- data/test/models/recipe.rb +3 -3
- data/test/models/record.rb +2 -2
- data/test/models/reference.rb +22 -22
- data/test/models/reply.rb +61 -61
- data/test/models/ship.rb +39 -39
- data/test/models/ship_part.rb +8 -8
- data/test/models/shop.rb +17 -17
- data/test/models/shop_account.rb +6 -6
- data/test/models/speedometer.rb +6 -6
- data/test/models/sponsor.rb +7 -7
- data/test/models/string_key_object.rb +3 -3
- data/test/models/student.rb +4 -4
- data/test/models/subject.rb +16 -16
- data/test/models/subscriber.rb +8 -8
- data/test/models/subscription.rb +4 -4
- data/test/models/tag.rb +13 -13
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +118 -118
- data/test/models/toy.rb +6 -6
- data/test/models/traffic_light.rb +4 -4
- data/test/models/treasure.rb +14 -14
- data/test/models/treaty.rb +7 -7
- data/test/models/tree.rb +3 -3
- data/test/models/tuning_peg.rb +4 -4
- data/test/models/tyre.rb +11 -11
- data/test/models/user.rb +14 -14
- data/test/models/uuid_child.rb +3 -3
- data/test/models/uuid_item.rb +6 -6
- data/test/models/uuid_parent.rb +3 -3
- data/test/models/vegetables.rb +24 -24
- data/test/models/vehicle.rb +6 -6
- data/test/models/vertex.rb +9 -9
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -3
- data/test/models/without_table.rb +3 -3
- data/test/models/zine.rb +3 -3
- 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 +68 -68
- data/test/schema/oracle_specific_schema.rb +40 -40
- data/test/schema/postgresql_specific_schema.rb +114 -114
- data/test/schema/schema.rb +1057 -1057
- data/test/schema/schema.rb.original +1057 -1057
- data/test/schema/sqlite_specific_schema.rb +18 -18
- data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +23 -23
- data/test/support/connection_helper.rb +14 -14
- data/test/support/ddl_helper.rb +8 -8
- data/test/support/schema_dumping_helper.rb +20 -20
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
- metadata +24 -13
- data/test/fixtures/author_addresses.original +0 -11
- data/test/fixtures/authors.original +0 -17
@@ -1,30 +1,30 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class TestRecord < ActiveRecord::Base
|
4
|
-
end
|
5
|
-
|
6
|
-
class TestDisconnectedAdapter < ActiveRecord::TestCase
|
7
|
-
self.use_transactional_tests = false
|
8
|
-
|
9
|
-
def setup
|
10
|
-
@connection = ActiveRecord::Base.connection
|
11
|
-
end
|
12
|
-
|
13
|
-
teardown do
|
14
|
-
return if in_memory_db?
|
15
|
-
spec = ActiveRecord::Base.connection_config
|
16
|
-
ActiveRecord::Base.establish_connection(spec)
|
17
|
-
end
|
18
|
-
|
19
|
-
unless in_memory_db?
|
20
|
-
test "can't execute statements while disconnected" do
|
21
|
-
@connection.execute "SELECT count(*) from products"
|
22
|
-
@connection.disconnect!
|
23
|
-
assert_raises(ActiveRecord::StatementInvalid) do
|
24
|
-
silence_warnings do
|
25
|
-
@connection.execute "SELECT count(*) from products"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class TestRecord < ActiveRecord::Base
|
4
|
+
end
|
5
|
+
|
6
|
+
class TestDisconnectedAdapter < ActiveRecord::TestCase
|
7
|
+
self.use_transactional_tests = false
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@connection = ActiveRecord::Base.connection
|
11
|
+
end
|
12
|
+
|
13
|
+
teardown do
|
14
|
+
return if in_memory_db?
|
15
|
+
spec = ActiveRecord::Base.connection_config
|
16
|
+
ActiveRecord::Base.establish_connection(spec)
|
17
|
+
end
|
18
|
+
|
19
|
+
unless in_memory_db?
|
20
|
+
test "can't execute statements while disconnected" do
|
21
|
+
@connection.execute "SELECT count(*) from products"
|
22
|
+
@connection.disconnect!
|
23
|
+
assert_raises(ActiveRecord::StatementInvalid) do
|
24
|
+
silence_warnings do
|
25
|
+
@connection.execute "SELECT count(*) from products"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/test/cases/dup_test.rb
CHANGED
@@ -1,157 +1,157 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/reply'
|
3
|
-
require 'models/topic'
|
4
|
-
|
5
|
-
module ActiveRecord
|
6
|
-
class DupTest < ActiveRecord::TestCase
|
7
|
-
fixtures :topics
|
8
|
-
|
9
|
-
def test_dup
|
10
|
-
assert !Topic.new.freeze.dup.frozen?
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_not_readonly
|
14
|
-
topic = Topic.first
|
15
|
-
|
16
|
-
duped = topic.dup
|
17
|
-
assert !duped.readonly?, 'should not be readonly'
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_is_readonly
|
21
|
-
topic = Topic.first
|
22
|
-
topic.readonly!
|
23
|
-
|
24
|
-
duped = topic.dup
|
25
|
-
assert duped.readonly?, 'should be readonly'
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_dup_not_persisted
|
29
|
-
topic = Topic.first
|
30
|
-
duped = topic.dup
|
31
|
-
|
32
|
-
assert !duped.persisted?, 'topic not persisted'
|
33
|
-
assert duped.new_record?, 'topic is new'
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_dup_not_destroyed
|
37
|
-
topic = Topic.first
|
38
|
-
topic.destroy
|
39
|
-
|
40
|
-
duped = topic.dup
|
41
|
-
assert_not duped.destroyed?
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_dup_has_no_id
|
45
|
-
topic = Topic.first
|
46
|
-
duped = topic.dup
|
47
|
-
assert_nil duped.id
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_dup_with_modified_attributes
|
51
|
-
topic = Topic.first
|
52
|
-
topic.author_name = 'Aaron'
|
53
|
-
duped = topic.dup
|
54
|
-
assert_equal 'Aaron', duped.author_name
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_dup_with_changes
|
58
|
-
dbtopic = Topic.first
|
59
|
-
topic = Topic.new
|
60
|
-
|
61
|
-
topic.attributes = dbtopic.attributes.except("id")
|
62
|
-
|
63
|
-
#duped has no timestamp values
|
64
|
-
duped = dbtopic.dup
|
65
|
-
|
66
|
-
#clear topic timestamp values
|
67
|
-
topic.send(:clear_timestamp_attributes)
|
68
|
-
|
69
|
-
assert_equal topic.changes, duped.changes
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_dup_topics_are_independent
|
73
|
-
topic = Topic.first
|
74
|
-
topic.author_name = 'Aaron'
|
75
|
-
duped = topic.dup
|
76
|
-
|
77
|
-
duped.author_name = 'meow'
|
78
|
-
|
79
|
-
assert_not_equal topic.changes, duped.changes
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_dup_attributes_are_independent
|
83
|
-
topic = Topic.first
|
84
|
-
duped = topic.dup
|
85
|
-
|
86
|
-
duped.author_name = 'meow'
|
87
|
-
topic.author_name = 'Aaron'
|
88
|
-
|
89
|
-
assert_equal 'Aaron', topic.author_name
|
90
|
-
assert_equal 'meow', duped.author_name
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_dup_timestamps_are_cleared
|
94
|
-
topic = Topic.first
|
95
|
-
assert_not_nil topic.updated_at
|
96
|
-
assert_not_nil topic.created_at
|
97
|
-
|
98
|
-
# temporary change to the topic object
|
99
|
-
topic.updated_at -= 3.days
|
100
|
-
|
101
|
-
#dup should not preserve the timestamps if present
|
102
|
-
new_topic = topic.dup
|
103
|
-
assert_nil new_topic.updated_at
|
104
|
-
assert_nil new_topic.created_at
|
105
|
-
|
106
|
-
new_topic.save
|
107
|
-
assert_not_nil new_topic.updated_at
|
108
|
-
assert_not_nil new_topic.created_at
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_dup_after_initialize_callbacks
|
112
|
-
topic = Topic.new
|
113
|
-
assert Topic.after_initialize_called
|
114
|
-
Topic.after_initialize_called = false
|
115
|
-
topic.dup
|
116
|
-
assert Topic.after_initialize_called
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_dup_validity_is_independent
|
120
|
-
repair_validations(Topic) do
|
121
|
-
Topic.validates_presence_of :title
|
122
|
-
topic = Topic.new("title" => "Literature")
|
123
|
-
topic.valid?
|
124
|
-
|
125
|
-
duped = topic.dup
|
126
|
-
duped.title = nil
|
127
|
-
assert duped.invalid?
|
128
|
-
|
129
|
-
topic.title = nil
|
130
|
-
duped.title = 'Mathematics'
|
131
|
-
assert topic.invalid?
|
132
|
-
assert duped.valid?
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_dup_with_default_scope
|
137
|
-
prev_default_scopes = Topic.default_scopes
|
138
|
-
Topic.default_scopes = [proc { Topic.where(:approved => true) }]
|
139
|
-
topic = Topic.new(:approved => false)
|
140
|
-
assert !topic.dup.approved?, "should not be overridden by default scopes"
|
141
|
-
ensure
|
142
|
-
Topic.default_scopes = prev_default_scopes
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_dup_without_primary_key
|
146
|
-
klass = Class.new(ActiveRecord::Base) do
|
147
|
-
self.table_name = 'parrots_pirates'
|
148
|
-
end
|
149
|
-
|
150
|
-
record = klass.create!
|
151
|
-
|
152
|
-
assert_nothing_raised do
|
153
|
-
record.dup
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/reply'
|
3
|
+
require 'models/topic'
|
4
|
+
|
5
|
+
module ActiveRecord
|
6
|
+
class DupTest < ActiveRecord::TestCase
|
7
|
+
fixtures :topics
|
8
|
+
|
9
|
+
def test_dup
|
10
|
+
assert !Topic.new.freeze.dup.frozen?
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_not_readonly
|
14
|
+
topic = Topic.first
|
15
|
+
|
16
|
+
duped = topic.dup
|
17
|
+
assert !duped.readonly?, 'should not be readonly'
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_is_readonly
|
21
|
+
topic = Topic.first
|
22
|
+
topic.readonly!
|
23
|
+
|
24
|
+
duped = topic.dup
|
25
|
+
assert duped.readonly?, 'should be readonly'
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_dup_not_persisted
|
29
|
+
topic = Topic.first
|
30
|
+
duped = topic.dup
|
31
|
+
|
32
|
+
assert !duped.persisted?, 'topic not persisted'
|
33
|
+
assert duped.new_record?, 'topic is new'
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_dup_not_destroyed
|
37
|
+
topic = Topic.first
|
38
|
+
topic.destroy
|
39
|
+
|
40
|
+
duped = topic.dup
|
41
|
+
assert_not duped.destroyed?
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_dup_has_no_id
|
45
|
+
topic = Topic.first
|
46
|
+
duped = topic.dup
|
47
|
+
assert_nil duped.id
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_dup_with_modified_attributes
|
51
|
+
topic = Topic.first
|
52
|
+
topic.author_name = 'Aaron'
|
53
|
+
duped = topic.dup
|
54
|
+
assert_equal 'Aaron', duped.author_name
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_dup_with_changes
|
58
|
+
dbtopic = Topic.first
|
59
|
+
topic = Topic.new
|
60
|
+
|
61
|
+
topic.attributes = dbtopic.attributes.except("id")
|
62
|
+
|
63
|
+
#duped has no timestamp values
|
64
|
+
duped = dbtopic.dup
|
65
|
+
|
66
|
+
#clear topic timestamp values
|
67
|
+
topic.send(:clear_timestamp_attributes)
|
68
|
+
|
69
|
+
assert_equal topic.changes, duped.changes
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_dup_topics_are_independent
|
73
|
+
topic = Topic.first
|
74
|
+
topic.author_name = 'Aaron'
|
75
|
+
duped = topic.dup
|
76
|
+
|
77
|
+
duped.author_name = 'meow'
|
78
|
+
|
79
|
+
assert_not_equal topic.changes, duped.changes
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_dup_attributes_are_independent
|
83
|
+
topic = Topic.first
|
84
|
+
duped = topic.dup
|
85
|
+
|
86
|
+
duped.author_name = 'meow'
|
87
|
+
topic.author_name = 'Aaron'
|
88
|
+
|
89
|
+
assert_equal 'Aaron', topic.author_name
|
90
|
+
assert_equal 'meow', duped.author_name
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_dup_timestamps_are_cleared
|
94
|
+
topic = Topic.first
|
95
|
+
assert_not_nil topic.updated_at
|
96
|
+
assert_not_nil topic.created_at
|
97
|
+
|
98
|
+
# temporary change to the topic object
|
99
|
+
topic.updated_at -= 3.days
|
100
|
+
|
101
|
+
#dup should not preserve the timestamps if present
|
102
|
+
new_topic = topic.dup
|
103
|
+
assert_nil new_topic.updated_at
|
104
|
+
assert_nil new_topic.created_at
|
105
|
+
|
106
|
+
new_topic.save
|
107
|
+
assert_not_nil new_topic.updated_at
|
108
|
+
assert_not_nil new_topic.created_at
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_dup_after_initialize_callbacks
|
112
|
+
topic = Topic.new
|
113
|
+
assert Topic.after_initialize_called
|
114
|
+
Topic.after_initialize_called = false
|
115
|
+
topic.dup
|
116
|
+
assert Topic.after_initialize_called
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_dup_validity_is_independent
|
120
|
+
repair_validations(Topic) do
|
121
|
+
Topic.validates_presence_of :title
|
122
|
+
topic = Topic.new("title" => "Literature")
|
123
|
+
topic.valid?
|
124
|
+
|
125
|
+
duped = topic.dup
|
126
|
+
duped.title = nil
|
127
|
+
assert duped.invalid?
|
128
|
+
|
129
|
+
topic.title = nil
|
130
|
+
duped.title = 'Mathematics'
|
131
|
+
assert topic.invalid?
|
132
|
+
assert duped.valid?
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_dup_with_default_scope
|
137
|
+
prev_default_scopes = Topic.default_scopes
|
138
|
+
Topic.default_scopes = [proc { Topic.where(:approved => true) }]
|
139
|
+
topic = Topic.new(:approved => false)
|
140
|
+
assert !topic.dup.approved?, "should not be overridden by default scopes"
|
141
|
+
ensure
|
142
|
+
Topic.default_scopes = prev_default_scopes
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_dup_without_primary_key
|
146
|
+
klass = Class.new(ActiveRecord::Base) do
|
147
|
+
self.table_name = 'parrots_pirates'
|
148
|
+
end
|
149
|
+
|
150
|
+
record = klass.create!
|
151
|
+
|
152
|
+
assert_nothing_raised do
|
153
|
+
record.dup
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
data/test/cases/enum_test.rb
CHANGED
@@ -1,444 +1,444 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'models/book'
|
3
|
-
|
4
|
-
class EnumTest < ActiveRecord::TestCase
|
5
|
-
fixtures :books
|
6
|
-
|
7
|
-
setup do
|
8
|
-
@book = books(:awdr)
|
9
|
-
end
|
10
|
-
|
11
|
-
test "query state by predicate" do
|
12
|
-
assert @book.published?
|
13
|
-
assert_not @book.written?
|
14
|
-
assert_not @book.proposed?
|
15
|
-
|
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?
|
21
|
-
end
|
22
|
-
|
23
|
-
test "query state with strings" do
|
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
|
29
|
-
end
|
30
|
-
|
31
|
-
test "find via scope" do
|
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?
|
80
|
-
end
|
81
|
-
|
82
|
-
test "update by declaration" do
|
83
|
-
@book.written!
|
84
|
-
assert @book.written?
|
85
|
-
@book.in_english!
|
86
|
-
assert @book.in_english?
|
87
|
-
@book.author_visibility_visible!
|
88
|
-
assert @book.author_visibility_visible?
|
89
|
-
end
|
90
|
-
|
91
|
-
test "update by setter" do
|
92
|
-
@book.update! status: :written
|
93
|
-
assert @book.written?
|
94
|
-
end
|
95
|
-
|
96
|
-
test "enum methods are overwritable" do
|
97
|
-
assert_equal "do publish work...", @book.published!
|
98
|
-
assert @book.published?
|
99
|
-
end
|
100
|
-
|
101
|
-
test "direct assignment" do
|
102
|
-
@book.status = :written
|
103
|
-
assert @book.written?
|
104
|
-
end
|
105
|
-
|
106
|
-
test "assign string value" do
|
107
|
-
@book.status = "written"
|
108
|
-
assert @book.written?
|
109
|
-
end
|
110
|
-
|
111
|
-
test "enum changed attributes" do
|
112
|
-
old_status = @book.status
|
113
|
-
old_language = @book.language
|
114
|
-
@book.status = :proposed
|
115
|
-
@book.language = :spanish
|
116
|
-
assert_equal old_status, @book.changed_attributes[:status]
|
117
|
-
assert_equal old_language, @book.changed_attributes[:language]
|
118
|
-
end
|
119
|
-
|
120
|
-
test "enum changes" do
|
121
|
-
old_status = @book.status
|
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]
|
127
|
-
end
|
128
|
-
|
129
|
-
test "enum attribute was" do
|
130
|
-
old_status = @book.status
|
131
|
-
old_language = @book.language
|
132
|
-
@book.status = :published
|
133
|
-
@book.language = :spanish
|
134
|
-
assert_equal old_status, @book.attribute_was(:status)
|
135
|
-
assert_equal old_language, @book.attribute_was(:language)
|
136
|
-
end
|
137
|
-
|
138
|
-
test "enum attribute changed" do
|
139
|
-
@book.status = :proposed
|
140
|
-
@book.language = :french
|
141
|
-
assert @book.attribute_changed?(:status)
|
142
|
-
assert @book.attribute_changed?(:language)
|
143
|
-
end
|
144
|
-
|
145
|
-
test "enum attribute changed to" do
|
146
|
-
@book.status = :proposed
|
147
|
-
@book.language = :french
|
148
|
-
assert @book.attribute_changed?(:status, to: 'proposed')
|
149
|
-
assert @book.attribute_changed?(:language, to: 'french')
|
150
|
-
end
|
151
|
-
|
152
|
-
test "enum attribute changed from" do
|
153
|
-
old_status = @book.status
|
154
|
-
old_language = @book.language
|
155
|
-
@book.status = :proposed
|
156
|
-
@book.language = :french
|
157
|
-
assert @book.attribute_changed?(:status, from: old_status)
|
158
|
-
assert @book.attribute_changed?(:language, from: old_language)
|
159
|
-
end
|
160
|
-
|
161
|
-
test "enum attribute changed from old status to new status" do
|
162
|
-
old_status = @book.status
|
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')
|
168
|
-
end
|
169
|
-
|
170
|
-
test "enum didn't change" do
|
171
|
-
old_status = @book.status
|
172
|
-
@book.status = old_status
|
173
|
-
assert_not @book.attribute_changed?(:status)
|
174
|
-
end
|
175
|
-
|
176
|
-
test "persist changes that are dirty" do
|
177
|
-
@book.status = :proposed
|
178
|
-
assert @book.attribute_changed?(:status)
|
179
|
-
@book.status = :written
|
180
|
-
assert @book.attribute_changed?(:status)
|
181
|
-
end
|
182
|
-
|
183
|
-
test "reverted changes that are not dirty" do
|
184
|
-
old_status = @book.status
|
185
|
-
@book.status = :proposed
|
186
|
-
assert @book.attribute_changed?(:status)
|
187
|
-
@book.status = old_status
|
188
|
-
assert_not @book.attribute_changed?(:status)
|
189
|
-
end
|
190
|
-
|
191
|
-
test "reverted changes are not dirty going from nil to value and back" do
|
192
|
-
book = Book.create!(nullable_status: nil)
|
193
|
-
|
194
|
-
book.nullable_status = :married
|
195
|
-
assert book.attribute_changed?(:nullable_status)
|
196
|
-
|
197
|
-
book.nullable_status = nil
|
198
|
-
assert_not book.attribute_changed?(:nullable_status)
|
199
|
-
end
|
200
|
-
|
201
|
-
test "assign non existing value raises an error" do
|
202
|
-
e = assert_raises(ArgumentError) do
|
203
|
-
@book.status = :unknown
|
204
|
-
end
|
205
|
-
assert_equal "'unknown' is not a valid status", e.message
|
206
|
-
end
|
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
|
-
|
213
|
-
test "assign nil value" do
|
214
|
-
@book.status = nil
|
215
|
-
assert_nil @book.status
|
216
|
-
end
|
217
|
-
|
218
|
-
test "assign empty string value" do
|
219
|
-
@book.status = ''
|
220
|
-
assert_nil @book.status
|
221
|
-
end
|
222
|
-
|
223
|
-
test "assign long empty string value" do
|
224
|
-
@book.status = ' '
|
225
|
-
assert_nil @book.status
|
226
|
-
end
|
227
|
-
|
228
|
-
test "constant to access the mapping" do
|
229
|
-
assert_equal 0, Book.statuses[:proposed]
|
230
|
-
assert_equal 1, Book.statuses["written"]
|
231
|
-
assert_equal 2, Book.statuses[:published]
|
232
|
-
end
|
233
|
-
|
234
|
-
test "building new objects with enum scopes" do
|
235
|
-
assert Book.written.build.written?
|
236
|
-
assert Book.read.build.read?
|
237
|
-
assert Book.in_spanish.build.in_spanish?
|
238
|
-
assert Book.illustrator_visibility_invisible.build.illustrator_visibility_invisible?
|
239
|
-
end
|
240
|
-
|
241
|
-
test "creating new objects with enum scopes" do
|
242
|
-
assert Book.written.create.written?
|
243
|
-
assert Book.read.create.read?
|
244
|
-
assert Book.in_spanish.create.in_spanish?
|
245
|
-
assert Book.illustrator_visibility_invisible.create.illustrator_visibility_invisible?
|
246
|
-
end
|
247
|
-
|
248
|
-
test "_before_type_cast returns the enum label (required for form fields)" do
|
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
|
254
|
-
end
|
255
|
-
|
256
|
-
test "reserved enum names" do
|
257
|
-
klass = Class.new(ActiveRecord::Base) do
|
258
|
-
self.table_name = "books"
|
259
|
-
enum status: [:proposed, :written, :published]
|
260
|
-
end
|
261
|
-
|
262
|
-
conflicts = [
|
263
|
-
:column, # generates class method .columns, which conflicts with an AR method
|
264
|
-
:logger, # generates #logger, which conflicts with an AR method
|
265
|
-
:attributes, # generates #attributes=, which conflicts with an AR method
|
266
|
-
]
|
267
|
-
|
268
|
-
conflicts.each_with_index do |name, i|
|
269
|
-
e = assert_raises(ArgumentError) do
|
270
|
-
klass.class_eval { enum name => ["value_#{i}"] }
|
271
|
-
end
|
272
|
-
assert_match(/You tried to define an enum named \"#{name}\" on the model/, e.message)
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
test "reserved enum values" do
|
277
|
-
klass = Class.new(ActiveRecord::Base) do
|
278
|
-
self.table_name = "books"
|
279
|
-
enum status: [:proposed, :written, :published]
|
280
|
-
end
|
281
|
-
|
282
|
-
conflicts = [
|
283
|
-
:new, # generates a scope that conflicts with an AR class method
|
284
|
-
:valid, # generates #valid?, which conflicts with an AR method
|
285
|
-
:save, # generates #save!, which conflicts with an AR method
|
286
|
-
:proposed, # same value as an existing enum
|
287
|
-
:public, :private, :protected, # some important methods on Module and Class
|
288
|
-
:name, :parent, :superclass
|
289
|
-
]
|
290
|
-
|
291
|
-
conflicts.each_with_index do |value, i|
|
292
|
-
e = assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
|
293
|
-
klass.class_eval { enum "status_#{i}" => [value] }
|
294
|
-
end
|
295
|
-
assert_match(/You tried to define an enum named .* on the model/, e.message)
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
test "overriding enum method should not raise" do
|
300
|
-
assert_nothing_raised do
|
301
|
-
Class.new(ActiveRecord::Base) do
|
302
|
-
self.table_name = "books"
|
303
|
-
|
304
|
-
def published!
|
305
|
-
super
|
306
|
-
"do publish work..."
|
307
|
-
end
|
308
|
-
|
309
|
-
enum status: [:proposed, :written, :published]
|
310
|
-
|
311
|
-
def written!
|
312
|
-
super
|
313
|
-
"do written work..."
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
test "validate uniqueness" do
|
320
|
-
klass = Class.new(ActiveRecord::Base) do
|
321
|
-
def self.name; 'Book'; end
|
322
|
-
enum status: [:proposed, :written]
|
323
|
-
validates_uniqueness_of :status
|
324
|
-
end
|
325
|
-
klass.delete_all
|
326
|
-
klass.create!(status: "proposed")
|
327
|
-
book = klass.new(status: "written")
|
328
|
-
assert book.valid?
|
329
|
-
book.status = "proposed"
|
330
|
-
assert_not book.valid?
|
331
|
-
end
|
332
|
-
|
333
|
-
test "validate inclusion of value in array" do
|
334
|
-
klass = Class.new(ActiveRecord::Base) do
|
335
|
-
def self.name; 'Book'; end
|
336
|
-
enum status: [:proposed, :written]
|
337
|
-
validates_inclusion_of :status, in: ["written"]
|
338
|
-
end
|
339
|
-
klass.delete_all
|
340
|
-
invalid_book = klass.new(status: "proposed")
|
341
|
-
assert_not invalid_book.valid?
|
342
|
-
valid_book = klass.new(status: "written")
|
343
|
-
assert valid_book.valid?
|
344
|
-
end
|
345
|
-
|
346
|
-
test "enums are distinct per class" do
|
347
|
-
klass1 = Class.new(ActiveRecord::Base) do
|
348
|
-
self.table_name = "books"
|
349
|
-
enum status: [:proposed, :written]
|
350
|
-
end
|
351
|
-
|
352
|
-
klass2 = Class.new(ActiveRecord::Base) do
|
353
|
-
self.table_name = "books"
|
354
|
-
enum status: [:drafted, :uploaded]
|
355
|
-
end
|
356
|
-
|
357
|
-
book1 = klass1.proposed.create!
|
358
|
-
book1.status = :written
|
359
|
-
assert_equal ['proposed', 'written'], book1.status_change
|
360
|
-
|
361
|
-
book2 = klass2.drafted.create!
|
362
|
-
book2.status = :uploaded
|
363
|
-
assert_equal ['drafted', 'uploaded'], book2.status_change
|
364
|
-
end
|
365
|
-
|
366
|
-
test "enums are inheritable" do
|
367
|
-
subklass1 = Class.new(Book)
|
368
|
-
|
369
|
-
subklass2 = Class.new(Book) do
|
370
|
-
enum status: [:drafted, :uploaded]
|
371
|
-
end
|
372
|
-
|
373
|
-
book1 = subklass1.proposed.create!
|
374
|
-
book1.status = :written
|
375
|
-
assert_equal ['proposed', 'written'], book1.status_change
|
376
|
-
|
377
|
-
book2 = subklass2.drafted.create!
|
378
|
-
book2.status = :uploaded
|
379
|
-
assert_equal ['drafted', 'uploaded'], book2.status_change
|
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
|
444
|
-
end
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'models/book'
|
3
|
+
|
4
|
+
class EnumTest < ActiveRecord::TestCase
|
5
|
+
fixtures :books
|
6
|
+
|
7
|
+
setup do
|
8
|
+
@book = books(:awdr)
|
9
|
+
end
|
10
|
+
|
11
|
+
test "query state by predicate" do
|
12
|
+
assert @book.published?
|
13
|
+
assert_not @book.written?
|
14
|
+
assert_not @book.proposed?
|
15
|
+
|
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?
|
21
|
+
end
|
22
|
+
|
23
|
+
test "query state with strings" do
|
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
|
29
|
+
end
|
30
|
+
|
31
|
+
test "find via scope" do
|
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?
|
80
|
+
end
|
81
|
+
|
82
|
+
test "update by declaration" do
|
83
|
+
@book.written!
|
84
|
+
assert @book.written?
|
85
|
+
@book.in_english!
|
86
|
+
assert @book.in_english?
|
87
|
+
@book.author_visibility_visible!
|
88
|
+
assert @book.author_visibility_visible?
|
89
|
+
end
|
90
|
+
|
91
|
+
test "update by setter" do
|
92
|
+
@book.update! status: :written
|
93
|
+
assert @book.written?
|
94
|
+
end
|
95
|
+
|
96
|
+
test "enum methods are overwritable" do
|
97
|
+
assert_equal "do publish work...", @book.published!
|
98
|
+
assert @book.published?
|
99
|
+
end
|
100
|
+
|
101
|
+
test "direct assignment" do
|
102
|
+
@book.status = :written
|
103
|
+
assert @book.written?
|
104
|
+
end
|
105
|
+
|
106
|
+
test "assign string value" do
|
107
|
+
@book.status = "written"
|
108
|
+
assert @book.written?
|
109
|
+
end
|
110
|
+
|
111
|
+
test "enum changed attributes" do
|
112
|
+
old_status = @book.status
|
113
|
+
old_language = @book.language
|
114
|
+
@book.status = :proposed
|
115
|
+
@book.language = :spanish
|
116
|
+
assert_equal old_status, @book.changed_attributes[:status]
|
117
|
+
assert_equal old_language, @book.changed_attributes[:language]
|
118
|
+
end
|
119
|
+
|
120
|
+
test "enum changes" do
|
121
|
+
old_status = @book.status
|
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]
|
127
|
+
end
|
128
|
+
|
129
|
+
test "enum attribute was" do
|
130
|
+
old_status = @book.status
|
131
|
+
old_language = @book.language
|
132
|
+
@book.status = :published
|
133
|
+
@book.language = :spanish
|
134
|
+
assert_equal old_status, @book.attribute_was(:status)
|
135
|
+
assert_equal old_language, @book.attribute_was(:language)
|
136
|
+
end
|
137
|
+
|
138
|
+
test "enum attribute changed" do
|
139
|
+
@book.status = :proposed
|
140
|
+
@book.language = :french
|
141
|
+
assert @book.attribute_changed?(:status)
|
142
|
+
assert @book.attribute_changed?(:language)
|
143
|
+
end
|
144
|
+
|
145
|
+
test "enum attribute changed to" do
|
146
|
+
@book.status = :proposed
|
147
|
+
@book.language = :french
|
148
|
+
assert @book.attribute_changed?(:status, to: 'proposed')
|
149
|
+
assert @book.attribute_changed?(:language, to: 'french')
|
150
|
+
end
|
151
|
+
|
152
|
+
test "enum attribute changed from" do
|
153
|
+
old_status = @book.status
|
154
|
+
old_language = @book.language
|
155
|
+
@book.status = :proposed
|
156
|
+
@book.language = :french
|
157
|
+
assert @book.attribute_changed?(:status, from: old_status)
|
158
|
+
assert @book.attribute_changed?(:language, from: old_language)
|
159
|
+
end
|
160
|
+
|
161
|
+
test "enum attribute changed from old status to new status" do
|
162
|
+
old_status = @book.status
|
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')
|
168
|
+
end
|
169
|
+
|
170
|
+
test "enum didn't change" do
|
171
|
+
old_status = @book.status
|
172
|
+
@book.status = old_status
|
173
|
+
assert_not @book.attribute_changed?(:status)
|
174
|
+
end
|
175
|
+
|
176
|
+
test "persist changes that are dirty" do
|
177
|
+
@book.status = :proposed
|
178
|
+
assert @book.attribute_changed?(:status)
|
179
|
+
@book.status = :written
|
180
|
+
assert @book.attribute_changed?(:status)
|
181
|
+
end
|
182
|
+
|
183
|
+
test "reverted changes that are not dirty" do
|
184
|
+
old_status = @book.status
|
185
|
+
@book.status = :proposed
|
186
|
+
assert @book.attribute_changed?(:status)
|
187
|
+
@book.status = old_status
|
188
|
+
assert_not @book.attribute_changed?(:status)
|
189
|
+
end
|
190
|
+
|
191
|
+
test "reverted changes are not dirty going from nil to value and back" do
|
192
|
+
book = Book.create!(nullable_status: nil)
|
193
|
+
|
194
|
+
book.nullable_status = :married
|
195
|
+
assert book.attribute_changed?(:nullable_status)
|
196
|
+
|
197
|
+
book.nullable_status = nil
|
198
|
+
assert_not book.attribute_changed?(:nullable_status)
|
199
|
+
end
|
200
|
+
|
201
|
+
test "assign non existing value raises an error" do
|
202
|
+
e = assert_raises(ArgumentError) do
|
203
|
+
@book.status = :unknown
|
204
|
+
end
|
205
|
+
assert_equal "'unknown' is not a valid status", e.message
|
206
|
+
end
|
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
|
+
|
213
|
+
test "assign nil value" do
|
214
|
+
@book.status = nil
|
215
|
+
assert_nil @book.status
|
216
|
+
end
|
217
|
+
|
218
|
+
test "assign empty string value" do
|
219
|
+
@book.status = ''
|
220
|
+
assert_nil @book.status
|
221
|
+
end
|
222
|
+
|
223
|
+
test "assign long empty string value" do
|
224
|
+
@book.status = ' '
|
225
|
+
assert_nil @book.status
|
226
|
+
end
|
227
|
+
|
228
|
+
test "constant to access the mapping" do
|
229
|
+
assert_equal 0, Book.statuses[:proposed]
|
230
|
+
assert_equal 1, Book.statuses["written"]
|
231
|
+
assert_equal 2, Book.statuses[:published]
|
232
|
+
end
|
233
|
+
|
234
|
+
test "building new objects with enum scopes" do
|
235
|
+
assert Book.written.build.written?
|
236
|
+
assert Book.read.build.read?
|
237
|
+
assert Book.in_spanish.build.in_spanish?
|
238
|
+
assert Book.illustrator_visibility_invisible.build.illustrator_visibility_invisible?
|
239
|
+
end
|
240
|
+
|
241
|
+
test "creating new objects with enum scopes" do
|
242
|
+
assert Book.written.create.written?
|
243
|
+
assert Book.read.create.read?
|
244
|
+
assert Book.in_spanish.create.in_spanish?
|
245
|
+
assert Book.illustrator_visibility_invisible.create.illustrator_visibility_invisible?
|
246
|
+
end
|
247
|
+
|
248
|
+
test "_before_type_cast returns the enum label (required for form fields)" do
|
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
|
254
|
+
end
|
255
|
+
|
256
|
+
test "reserved enum names" do
|
257
|
+
klass = Class.new(ActiveRecord::Base) do
|
258
|
+
self.table_name = "books"
|
259
|
+
enum status: [:proposed, :written, :published]
|
260
|
+
end
|
261
|
+
|
262
|
+
conflicts = [
|
263
|
+
:column, # generates class method .columns, which conflicts with an AR method
|
264
|
+
:logger, # generates #logger, which conflicts with an AR method
|
265
|
+
:attributes, # generates #attributes=, which conflicts with an AR method
|
266
|
+
]
|
267
|
+
|
268
|
+
conflicts.each_with_index do |name, i|
|
269
|
+
e = assert_raises(ArgumentError) do
|
270
|
+
klass.class_eval { enum name => ["value_#{i}"] }
|
271
|
+
end
|
272
|
+
assert_match(/You tried to define an enum named \"#{name}\" on the model/, e.message)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
test "reserved enum values" do
|
277
|
+
klass = Class.new(ActiveRecord::Base) do
|
278
|
+
self.table_name = "books"
|
279
|
+
enum status: [:proposed, :written, :published]
|
280
|
+
end
|
281
|
+
|
282
|
+
conflicts = [
|
283
|
+
:new, # generates a scope that conflicts with an AR class method
|
284
|
+
:valid, # generates #valid?, which conflicts with an AR method
|
285
|
+
:save, # generates #save!, which conflicts with an AR method
|
286
|
+
:proposed, # same value as an existing enum
|
287
|
+
:public, :private, :protected, # some important methods on Module and Class
|
288
|
+
:name, :parent, :superclass
|
289
|
+
]
|
290
|
+
|
291
|
+
conflicts.each_with_index do |value, i|
|
292
|
+
e = assert_raises(ArgumentError, "enum value `#{value}` should not be allowed") do
|
293
|
+
klass.class_eval { enum "status_#{i}" => [value] }
|
294
|
+
end
|
295
|
+
assert_match(/You tried to define an enum named .* on the model/, e.message)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
test "overriding enum method should not raise" do
|
300
|
+
assert_nothing_raised do
|
301
|
+
Class.new(ActiveRecord::Base) do
|
302
|
+
self.table_name = "books"
|
303
|
+
|
304
|
+
def published!
|
305
|
+
super
|
306
|
+
"do publish work..."
|
307
|
+
end
|
308
|
+
|
309
|
+
enum status: [:proposed, :written, :published]
|
310
|
+
|
311
|
+
def written!
|
312
|
+
super
|
313
|
+
"do written work..."
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
test "validate uniqueness" do
|
320
|
+
klass = Class.new(ActiveRecord::Base) do
|
321
|
+
def self.name; 'Book'; end
|
322
|
+
enum status: [:proposed, :written]
|
323
|
+
validates_uniqueness_of :status
|
324
|
+
end
|
325
|
+
klass.delete_all
|
326
|
+
klass.create!(status: "proposed")
|
327
|
+
book = klass.new(status: "written")
|
328
|
+
assert book.valid?
|
329
|
+
book.status = "proposed"
|
330
|
+
assert_not book.valid?
|
331
|
+
end
|
332
|
+
|
333
|
+
test "validate inclusion of value in array" do
|
334
|
+
klass = Class.new(ActiveRecord::Base) do
|
335
|
+
def self.name; 'Book'; end
|
336
|
+
enum status: [:proposed, :written]
|
337
|
+
validates_inclusion_of :status, in: ["written"]
|
338
|
+
end
|
339
|
+
klass.delete_all
|
340
|
+
invalid_book = klass.new(status: "proposed")
|
341
|
+
assert_not invalid_book.valid?
|
342
|
+
valid_book = klass.new(status: "written")
|
343
|
+
assert valid_book.valid?
|
344
|
+
end
|
345
|
+
|
346
|
+
test "enums are distinct per class" do
|
347
|
+
klass1 = Class.new(ActiveRecord::Base) do
|
348
|
+
self.table_name = "books"
|
349
|
+
enum status: [:proposed, :written]
|
350
|
+
end
|
351
|
+
|
352
|
+
klass2 = Class.new(ActiveRecord::Base) do
|
353
|
+
self.table_name = "books"
|
354
|
+
enum status: [:drafted, :uploaded]
|
355
|
+
end
|
356
|
+
|
357
|
+
book1 = klass1.proposed.create!
|
358
|
+
book1.status = :written
|
359
|
+
assert_equal ['proposed', 'written'], book1.status_change
|
360
|
+
|
361
|
+
book2 = klass2.drafted.create!
|
362
|
+
book2.status = :uploaded
|
363
|
+
assert_equal ['drafted', 'uploaded'], book2.status_change
|
364
|
+
end
|
365
|
+
|
366
|
+
test "enums are inheritable" do
|
367
|
+
subklass1 = Class.new(Book)
|
368
|
+
|
369
|
+
subklass2 = Class.new(Book) do
|
370
|
+
enum status: [:drafted, :uploaded]
|
371
|
+
end
|
372
|
+
|
373
|
+
book1 = subklass1.proposed.create!
|
374
|
+
book1.status = :written
|
375
|
+
assert_equal ['proposed', 'written'], book1.status_change
|
376
|
+
|
377
|
+
book2 = subklass2.drafted.create!
|
378
|
+
book2.status = :uploaded
|
379
|
+
assert_equal ['drafted', 'uploaded'], book2.status_change
|
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
|
444
|
+
end
|