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,19 +1,19 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ValidationsRepairHelper
|
3
|
-
extend ActiveSupport::Concern
|
4
|
-
|
5
|
-
module ClassMethods
|
6
|
-
def repair_validations(*model_classes)
|
7
|
-
teardown do
|
8
|
-
model_classes.each(&:clear_validators!)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def repair_validations(*model_classes)
|
14
|
-
yield if block_given?
|
15
|
-
ensure
|
16
|
-
model_classes.each(&:clear_validators!)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module ValidationsRepairHelper
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def repair_validations(*model_classes)
|
7
|
+
teardown do
|
8
|
+
model_classes.each(&:clear_validators!)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def repair_validations(*model_classes)
|
14
|
+
yield if block_given?
|
15
|
+
ensure
|
16
|
+
model_classes.each(&:clear_validators!)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,194 +1,194 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/topic'
|
3
|
-
require 'models/reply'
|
4
|
-
require 'models/person'
|
5
|
-
require 'models/developer'
|
6
|
-
require 'models/computer'
|
7
|
-
require 'models/parrot'
|
8
|
-
require 'models/company'
|
9
|
-
|
10
|
-
class ValidationsTest < ActiveRecord::TestCase
|
11
|
-
fixtures :topics, :developers
|
12
|
-
|
13
|
-
# Most of the tests mess with the validations of Topic, so lets repair it all the time.
|
14
|
-
# Other classes we mess with will be dealt with in the specific tests
|
15
|
-
repair_validations(Topic)
|
16
|
-
|
17
|
-
def test_valid_uses_create_context_when_new
|
18
|
-
r = WrongReply.new
|
19
|
-
r.title = "Wrong Create"
|
20
|
-
assert_not r.valid?
|
21
|
-
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
22
|
-
assert_equal ["is Wrong Create"], r.errors[:title], "A reply with a bad content should contain an error"
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_valid_uses_update_context_when_persisted
|
26
|
-
r = WrongReply.new
|
27
|
-
r.title = "Bad"
|
28
|
-
r.content = "Good"
|
29
|
-
assert r.save, "First validation should be successful"
|
30
|
-
|
31
|
-
r.title = "Wrong Update"
|
32
|
-
assert_not r.valid?, "Second validation should fail"
|
33
|
-
|
34
|
-
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
35
|
-
assert_equal ["is Wrong Update"], r.errors[:title], "A reply with a bad content should contain an error"
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_valid_using_special_context
|
39
|
-
r = WrongReply.new(:title => "Valid title")
|
40
|
-
assert !r.valid?(:special_case)
|
41
|
-
assert_equal "Invalid", r.errors[:author_name].join
|
42
|
-
|
43
|
-
r.author_name = "secret"
|
44
|
-
r.content = "Good"
|
45
|
-
assert r.valid?(:special_case)
|
46
|
-
|
47
|
-
r.author_name = nil
|
48
|
-
assert_not r.valid?(:special_case)
|
49
|
-
assert_equal "Invalid", r.errors[:author_name].join
|
50
|
-
|
51
|
-
r.author_name = "secret"
|
52
|
-
assert r.valid?(:special_case)
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_invalid_using_multiple_contexts
|
56
|
-
r = WrongReply.new(:title => 'Wrong Create')
|
57
|
-
assert r.invalid?([:special_case, :create])
|
58
|
-
assert_equal "Invalid", r.errors[:author_name].join
|
59
|
-
assert_equal "is Wrong Create", r.errors[:title].join
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_validate
|
63
|
-
r = WrongReply.new
|
64
|
-
|
65
|
-
r.validate
|
66
|
-
assert_empty r.errors[:author_name]
|
67
|
-
|
68
|
-
r.validate(:special_case)
|
69
|
-
assert_not_empty r.errors[:author_name]
|
70
|
-
|
71
|
-
r.author_name = "secret"
|
72
|
-
|
73
|
-
r.validate(:special_case)
|
74
|
-
assert_empty r.errors[:author_name]
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_invalid_record_exception
|
78
|
-
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.create! }
|
79
|
-
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.new.save! }
|
80
|
-
|
81
|
-
r = WrongReply.new
|
82
|
-
invalid = assert_raise ActiveRecord::RecordInvalid do
|
83
|
-
r.save!
|
84
|
-
end
|
85
|
-
assert_equal r, invalid.record
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_validate_with_bang
|
89
|
-
assert_raise(ActiveRecord::RecordInvalid) do
|
90
|
-
WrongReply.new.validate!
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_validate_with_bang_and_context
|
95
|
-
assert_raise(ActiveRecord::RecordInvalid) do
|
96
|
-
WrongReply.new.validate!(:special_case)
|
97
|
-
end
|
98
|
-
r = WrongReply.new(:title => "Valid title", :author_name => "secret", :content => "Good")
|
99
|
-
assert r.validate!(:special_case)
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_exception_on_create_bang_many
|
103
|
-
assert_raise(ActiveRecord::RecordInvalid) do
|
104
|
-
WrongReply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_exception_on_create_bang_with_block
|
109
|
-
assert_raise(ActiveRecord::RecordInvalid) do
|
110
|
-
WrongReply.create!({ "title" => "OK" }) do |r|
|
111
|
-
r.content = nil
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_exception_on_create_bang_many_with_block
|
117
|
-
assert_raise(ActiveRecord::RecordInvalid) do
|
118
|
-
WrongReply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
|
119
|
-
r.content = nil
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_save_without_validation
|
125
|
-
reply = WrongReply.new
|
126
|
-
assert !reply.save
|
127
|
-
assert reply.save(:validate => false)
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_validates_acceptance_of_with_non_existent_table
|
131
|
-
Object.const_set :IncorporealModel, Class.new(ActiveRecord::Base)
|
132
|
-
|
133
|
-
assert_nothing_raised do
|
134
|
-
IncorporealModel.validates_acceptance_of(:incorporeal_column)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_throw_away_typing
|
139
|
-
d = Developer.new("name" => "David", "salary" => "100,000")
|
140
|
-
assert !d.valid?
|
141
|
-
assert_equal 100, d.salary
|
142
|
-
assert_equal "100,000", d.salary_before_type_cast
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_validates_acceptance_of_as_database_column
|
146
|
-
Topic.validates_acceptance_of(:approved)
|
147
|
-
topic = Topic.create("approved" => true)
|
148
|
-
assert topic["approved"]
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_validators
|
152
|
-
assert_equal 1, Parrot.validators.size
|
153
|
-
assert_equal 1, Company.validators.size
|
154
|
-
assert_equal 1, Parrot.validators_on(:name).size
|
155
|
-
assert_equal 1, Company.validators_on(:name).size
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_numericality_validation_with_mutation
|
159
|
-
klass = Class.new(Topic) do
|
160
|
-
attribute :wibble, :string
|
161
|
-
validates_numericality_of :wibble, only_integer: true
|
162
|
-
end
|
163
|
-
|
164
|
-
topic = klass.new(wibble: '123-4567')
|
165
|
-
topic.wibble.gsub!('-', '')
|
166
|
-
|
167
|
-
assert topic.valid?
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_numericality_validation_checks_against_raw_value
|
171
|
-
klass = Class.new(Topic) do
|
172
|
-
def self.model_name
|
173
|
-
ActiveModel::Name.new(self, nil, "Topic")
|
174
|
-
end
|
175
|
-
attribute :wibble, :decimal, scale: 2, precision: 9
|
176
|
-
validates_numericality_of :wibble, greater_than_or_equal_to: BigDecimal.new("97.18")
|
177
|
-
end
|
178
|
-
|
179
|
-
assert_not klass.new(wibble: "97.179").valid?
|
180
|
-
assert_not klass.new(wibble: 97.179).valid?
|
181
|
-
assert_not klass.new(wibble: BigDecimal.new("97.179")).valid?
|
182
|
-
end
|
183
|
-
|
184
|
-
def test_acceptance_validator_doesnt_require_db_connection
|
185
|
-
klass = Class.new(ActiveRecord::Base) do
|
186
|
-
self.table_name = 'posts'
|
187
|
-
end
|
188
|
-
klass.reset_column_information
|
189
|
-
|
190
|
-
assert_no_queries do
|
191
|
-
klass.validates_acceptance_of(:foo)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/topic'
|
3
|
+
require 'models/reply'
|
4
|
+
require 'models/person'
|
5
|
+
require 'models/developer'
|
6
|
+
require 'models/computer'
|
7
|
+
require 'models/parrot'
|
8
|
+
require 'models/company'
|
9
|
+
|
10
|
+
class ValidationsTest < ActiveRecord::TestCase
|
11
|
+
fixtures :topics, :developers
|
12
|
+
|
13
|
+
# Most of the tests mess with the validations of Topic, so lets repair it all the time.
|
14
|
+
# Other classes we mess with will be dealt with in the specific tests
|
15
|
+
repair_validations(Topic)
|
16
|
+
|
17
|
+
def test_valid_uses_create_context_when_new
|
18
|
+
r = WrongReply.new
|
19
|
+
r.title = "Wrong Create"
|
20
|
+
assert_not r.valid?
|
21
|
+
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
22
|
+
assert_equal ["is Wrong Create"], r.errors[:title], "A reply with a bad content should contain an error"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_valid_uses_update_context_when_persisted
|
26
|
+
r = WrongReply.new
|
27
|
+
r.title = "Bad"
|
28
|
+
r.content = "Good"
|
29
|
+
assert r.save, "First validation should be successful"
|
30
|
+
|
31
|
+
r.title = "Wrong Update"
|
32
|
+
assert_not r.valid?, "Second validation should fail"
|
33
|
+
|
34
|
+
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
35
|
+
assert_equal ["is Wrong Update"], r.errors[:title], "A reply with a bad content should contain an error"
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_valid_using_special_context
|
39
|
+
r = WrongReply.new(:title => "Valid title")
|
40
|
+
assert !r.valid?(:special_case)
|
41
|
+
assert_equal "Invalid", r.errors[:author_name].join
|
42
|
+
|
43
|
+
r.author_name = "secret"
|
44
|
+
r.content = "Good"
|
45
|
+
assert r.valid?(:special_case)
|
46
|
+
|
47
|
+
r.author_name = nil
|
48
|
+
assert_not r.valid?(:special_case)
|
49
|
+
assert_equal "Invalid", r.errors[:author_name].join
|
50
|
+
|
51
|
+
r.author_name = "secret"
|
52
|
+
assert r.valid?(:special_case)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_invalid_using_multiple_contexts
|
56
|
+
r = WrongReply.new(:title => 'Wrong Create')
|
57
|
+
assert r.invalid?([:special_case, :create])
|
58
|
+
assert_equal "Invalid", r.errors[:author_name].join
|
59
|
+
assert_equal "is Wrong Create", r.errors[:title].join
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_validate
|
63
|
+
r = WrongReply.new
|
64
|
+
|
65
|
+
r.validate
|
66
|
+
assert_empty r.errors[:author_name]
|
67
|
+
|
68
|
+
r.validate(:special_case)
|
69
|
+
assert_not_empty r.errors[:author_name]
|
70
|
+
|
71
|
+
r.author_name = "secret"
|
72
|
+
|
73
|
+
r.validate(:special_case)
|
74
|
+
assert_empty r.errors[:author_name]
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_invalid_record_exception
|
78
|
+
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.create! }
|
79
|
+
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.new.save! }
|
80
|
+
|
81
|
+
r = WrongReply.new
|
82
|
+
invalid = assert_raise ActiveRecord::RecordInvalid do
|
83
|
+
r.save!
|
84
|
+
end
|
85
|
+
assert_equal r, invalid.record
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_validate_with_bang
|
89
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
90
|
+
WrongReply.new.validate!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_validate_with_bang_and_context
|
95
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
96
|
+
WrongReply.new.validate!(:special_case)
|
97
|
+
end
|
98
|
+
r = WrongReply.new(:title => "Valid title", :author_name => "secret", :content => "Good")
|
99
|
+
assert r.validate!(:special_case)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_exception_on_create_bang_many
|
103
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
104
|
+
WrongReply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_exception_on_create_bang_with_block
|
109
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
110
|
+
WrongReply.create!({ "title" => "OK" }) do |r|
|
111
|
+
r.content = nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_exception_on_create_bang_many_with_block
|
117
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
118
|
+
WrongReply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
|
119
|
+
r.content = nil
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_save_without_validation
|
125
|
+
reply = WrongReply.new
|
126
|
+
assert !reply.save
|
127
|
+
assert reply.save(:validate => false)
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_validates_acceptance_of_with_non_existent_table
|
131
|
+
Object.const_set :IncorporealModel, Class.new(ActiveRecord::Base)
|
132
|
+
|
133
|
+
assert_nothing_raised do
|
134
|
+
IncorporealModel.validates_acceptance_of(:incorporeal_column)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_throw_away_typing
|
139
|
+
d = Developer.new("name" => "David", "salary" => "100,000")
|
140
|
+
assert !d.valid?
|
141
|
+
assert_equal 100, d.salary
|
142
|
+
assert_equal "100,000", d.salary_before_type_cast
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_validates_acceptance_of_as_database_column
|
146
|
+
Topic.validates_acceptance_of(:approved)
|
147
|
+
topic = Topic.create("approved" => true)
|
148
|
+
assert topic["approved"]
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_validators
|
152
|
+
assert_equal 1, Parrot.validators.size
|
153
|
+
assert_equal 1, Company.validators.size
|
154
|
+
assert_equal 1, Parrot.validators_on(:name).size
|
155
|
+
assert_equal 1, Company.validators_on(:name).size
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_numericality_validation_with_mutation
|
159
|
+
klass = Class.new(Topic) do
|
160
|
+
attribute :wibble, :string
|
161
|
+
validates_numericality_of :wibble, only_integer: true
|
162
|
+
end
|
163
|
+
|
164
|
+
topic = klass.new(wibble: '123-4567')
|
165
|
+
topic.wibble.gsub!('-', '')
|
166
|
+
|
167
|
+
assert topic.valid?
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_numericality_validation_checks_against_raw_value
|
171
|
+
klass = Class.new(Topic) do
|
172
|
+
def self.model_name
|
173
|
+
ActiveModel::Name.new(self, nil, "Topic")
|
174
|
+
end
|
175
|
+
attribute :wibble, :decimal, scale: 2, precision: 9
|
176
|
+
validates_numericality_of :wibble, greater_than_or_equal_to: BigDecimal.new("97.18")
|
177
|
+
end
|
178
|
+
|
179
|
+
assert_not klass.new(wibble: "97.179").valid?
|
180
|
+
assert_not klass.new(wibble: 97.179).valid?
|
181
|
+
assert_not klass.new(wibble: BigDecimal.new("97.179")).valid?
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_acceptance_validator_doesnt_require_db_connection
|
185
|
+
klass = Class.new(ActiveRecord::Base) do
|
186
|
+
self.table_name = 'posts'
|
187
|
+
end
|
188
|
+
klass.reset_column_information
|
189
|
+
|
190
|
+
assert_no_queries do
|
191
|
+
klass.validates_acceptance_of(:foo)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
data/test/cases/view_test.rb
CHANGED
@@ -1,216 +1,216 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require "models/book"
|
3
|
-
require "support/schema_dumping_helper"
|
4
|
-
|
5
|
-
module ViewBehavior
|
6
|
-
include SchemaDumpingHelper
|
7
|
-
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
included do
|
10
|
-
fixtures :books
|
11
|
-
end
|
12
|
-
|
13
|
-
class Ebook < ActiveRecord::Base
|
14
|
-
self.primary_key = "id"
|
15
|
-
end
|
16
|
-
|
17
|
-
def setup
|
18
|
-
super
|
19
|
-
@connection = ActiveRecord::Base.connection
|
20
|
-
create_view "ebooks", <<-SQL
|
21
|
-
SELECT id, name, status FROM books WHERE format = 'ebook'
|
22
|
-
SQL
|
23
|
-
end
|
24
|
-
|
25
|
-
def teardown
|
26
|
-
super
|
27
|
-
drop_view "ebooks"
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_reading
|
31
|
-
books = Ebook.all
|
32
|
-
assert_equal [books(:rfr).id], books.map(&:id)
|
33
|
-
assert_equal ["Ruby for Rails"], books.map(&:name)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_views
|
37
|
-
assert_equal [Ebook.table_name], @connection.views
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_view_exists
|
41
|
-
view_name = Ebook.table_name
|
42
|
-
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_table_exists
|
46
|
-
view_name = Ebook.table_name
|
47
|
-
# TODO: switch this assertion around once we changed #tables to not return views.
|
48
|
-
ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_views_ara_valid_data_sources
|
52
|
-
view_name = Ebook.table_name
|
53
|
-
assert @connection.data_source_exists?(view_name), "'#{view_name}' should be a data source"
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_column_definitions
|
57
|
-
assert_equal([["id", :integer],
|
58
|
-
["name", :string],
|
59
|
-
["status", :integer]], Ebook.columns.map { |c| [c.name, c.type] })
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_attributes
|
63
|
-
assert_equal({"id" => 2, "name" => "Ruby for Rails", "status" => 0},
|
64
|
-
Ebook.first.attributes)
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_does_not_assume_id_column_as_primary_key
|
68
|
-
model = Class.new(ActiveRecord::Base) do
|
69
|
-
self.table_name = "ebooks"
|
70
|
-
end
|
71
|
-
assert_nil model.primary_key
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_does_not_dump_view_as_table
|
75
|
-
schema = dump_table_schema "ebooks"
|
76
|
-
assert_no_match %r{create_table "ebooks"}, schema
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
if ActiveRecord::Base.connection.supports_views?
|
81
|
-
class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
|
82
|
-
include ViewBehavior
|
83
|
-
|
84
|
-
private
|
85
|
-
def create_view(name, query)
|
86
|
-
@connection.execute "CREATE VIEW #{name} AS #{query}"
|
87
|
-
end
|
88
|
-
|
89
|
-
def drop_view(name)
|
90
|
-
@connection.execute "DROP VIEW #{name}" if @connection.view_exists? name
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
|
95
|
-
include SchemaDumpingHelper
|
96
|
-
fixtures :books
|
97
|
-
|
98
|
-
class Paperback < ActiveRecord::Base; end
|
99
|
-
|
100
|
-
setup do
|
101
|
-
@connection = ActiveRecord::Base.connection
|
102
|
-
@connection.execute <<-SQL
|
103
|
-
CREATE VIEW paperbacks
|
104
|
-
AS SELECT name, status FROM books WHERE format = 'paperback'
|
105
|
-
SQL
|
106
|
-
end
|
107
|
-
|
108
|
-
teardown do
|
109
|
-
@connection.execute "DROP VIEW paperbacks" if @connection.view_exists? "paperbacks"
|
110
|
-
end
|
111
|
-
|
112
|
-
def test_reading
|
113
|
-
books = Paperback.all
|
114
|
-
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
|
115
|
-
end
|
116
|
-
|
117
|
-
def test_views
|
118
|
-
assert_equal [Paperback.table_name], @connection.views
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_view_exists
|
122
|
-
view_name = Paperback.table_name
|
123
|
-
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_table_exists
|
127
|
-
view_name = Paperback.table_name
|
128
|
-
# TODO: switch this assertion around once we changed #tables to not return views.
|
129
|
-
ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_column_definitions
|
133
|
-
assert_equal([["name", :string],
|
134
|
-
["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_attributes
|
138
|
-
assert_equal({"name" => "Agile Web Development with Rails", "status" => 2},
|
139
|
-
Paperback.first.attributes)
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_does_not_have_a_primary_key
|
143
|
-
assert_nil Paperback.primary_key
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_does_not_dump_view_as_table
|
147
|
-
schema = dump_table_schema "paperbacks"
|
148
|
-
assert_no_match %r{create_table "paperbacks"}, schema
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
# sqlite dose not support CREATE, INSERT, and DELETE for VIEW
|
153
|
-
if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)
|
154
|
-
class UpdateableViewTest < ActiveRecord::TestCase
|
155
|
-
self.use_transactional_tests = false
|
156
|
-
fixtures :books
|
157
|
-
|
158
|
-
class PrintedBook < ActiveRecord::Base
|
159
|
-
self.primary_key = "id"
|
160
|
-
end
|
161
|
-
|
162
|
-
setup do
|
163
|
-
@connection = ActiveRecord::Base.connection
|
164
|
-
@connection.execute <<-SQL
|
165
|
-
CREATE VIEW printed_books
|
166
|
-
AS SELECT id, name, status, format FROM books WHERE format = 'paperback'
|
167
|
-
SQL
|
168
|
-
end
|
169
|
-
|
170
|
-
teardown do
|
171
|
-
@connection.execute "DROP VIEW printed_books" if @connection.view_exists? "printed_books"
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_update_record
|
175
|
-
book = PrintedBook.first
|
176
|
-
book.name = "AWDwR"
|
177
|
-
book.save!
|
178
|
-
book.reload
|
179
|
-
assert_equal "AWDwR", book.name
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_insert_record
|
183
|
-
PrintedBook.create! name: "Rails in Action", status: 0, format: "paperback"
|
184
|
-
|
185
|
-
new_book = PrintedBook.last
|
186
|
-
assert_equal "Rails in Action", new_book.name
|
187
|
-
end
|
188
|
-
|
189
|
-
def test_update_record_to_fail_view_conditions
|
190
|
-
book = PrintedBook.first
|
191
|
-
book.format = "ebook"
|
192
|
-
book.save!
|
193
|
-
|
194
|
-
assert_raises ActiveRecord::RecordNotFound do
|
195
|
-
book.reload
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end # end fo `if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)`
|
200
|
-
end # end fo `if ActiveRecord::Base.connection.supports_views?`
|
201
|
-
|
202
|
-
if ActiveRecord::Base.connection.respond_to?(:supports_materialized_views?) &&
|
203
|
-
ActiveRecord::Base.connection.supports_materialized_views?
|
204
|
-
class MaterializedViewTest < ActiveRecord::PostgreSQLTestCase
|
205
|
-
include ViewBehavior
|
206
|
-
|
207
|
-
private
|
208
|
-
def create_view(name, query)
|
209
|
-
@connection.execute "CREATE MATERIALIZED VIEW #{name} AS #{query}"
|
210
|
-
end
|
211
|
-
|
212
|
-
def drop_view(name)
|
213
|
-
@connection.execute "DROP MATERIALIZED VIEW #{name}" if @connection.view_exists? name
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/book"
|
3
|
+
require "support/schema_dumping_helper"
|
4
|
+
|
5
|
+
module ViewBehavior
|
6
|
+
include SchemaDumpingHelper
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
fixtures :books
|
11
|
+
end
|
12
|
+
|
13
|
+
class Ebook < ActiveRecord::Base
|
14
|
+
self.primary_key = "id"
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup
|
18
|
+
super
|
19
|
+
@connection = ActiveRecord::Base.connection
|
20
|
+
create_view "ebooks", <<-SQL
|
21
|
+
SELECT id, name, status FROM books WHERE format = 'ebook'
|
22
|
+
SQL
|
23
|
+
end
|
24
|
+
|
25
|
+
def teardown
|
26
|
+
super
|
27
|
+
drop_view "ebooks"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_reading
|
31
|
+
books = Ebook.all
|
32
|
+
assert_equal [books(:rfr).id], books.map(&:id)
|
33
|
+
assert_equal ["Ruby for Rails"], books.map(&:name)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_views
|
37
|
+
assert_equal [Ebook.table_name], @connection.views
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_view_exists
|
41
|
+
view_name = Ebook.table_name
|
42
|
+
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_table_exists
|
46
|
+
view_name = Ebook.table_name
|
47
|
+
# TODO: switch this assertion around once we changed #tables to not return views.
|
48
|
+
ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_views_ara_valid_data_sources
|
52
|
+
view_name = Ebook.table_name
|
53
|
+
assert @connection.data_source_exists?(view_name), "'#{view_name}' should be a data source"
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_column_definitions
|
57
|
+
assert_equal([["id", :integer],
|
58
|
+
["name", :string],
|
59
|
+
["status", :integer]], Ebook.columns.map { |c| [c.name, c.type] })
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_attributes
|
63
|
+
assert_equal({"id" => 2, "name" => "Ruby for Rails", "status" => 0},
|
64
|
+
Ebook.first.attributes)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_does_not_assume_id_column_as_primary_key
|
68
|
+
model = Class.new(ActiveRecord::Base) do
|
69
|
+
self.table_name = "ebooks"
|
70
|
+
end
|
71
|
+
assert_nil model.primary_key
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_does_not_dump_view_as_table
|
75
|
+
schema = dump_table_schema "ebooks"
|
76
|
+
assert_no_match %r{create_table "ebooks"}, schema
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if ActiveRecord::Base.connection.supports_views?
|
81
|
+
class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
|
82
|
+
include ViewBehavior
|
83
|
+
|
84
|
+
private
|
85
|
+
def create_view(name, query)
|
86
|
+
@connection.execute "CREATE VIEW #{name} AS #{query}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def drop_view(name)
|
90
|
+
@connection.execute "DROP VIEW #{name}" if @connection.view_exists? name
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
|
95
|
+
include SchemaDumpingHelper
|
96
|
+
fixtures :books
|
97
|
+
|
98
|
+
class Paperback < ActiveRecord::Base; end
|
99
|
+
|
100
|
+
setup do
|
101
|
+
@connection = ActiveRecord::Base.connection
|
102
|
+
@connection.execute <<-SQL
|
103
|
+
CREATE VIEW paperbacks
|
104
|
+
AS SELECT name, status FROM books WHERE format = 'paperback'
|
105
|
+
SQL
|
106
|
+
end
|
107
|
+
|
108
|
+
teardown do
|
109
|
+
@connection.execute "DROP VIEW paperbacks" if @connection.view_exists? "paperbacks"
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_reading
|
113
|
+
books = Paperback.all
|
114
|
+
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_views
|
118
|
+
assert_equal [Paperback.table_name], @connection.views
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_view_exists
|
122
|
+
view_name = Paperback.table_name
|
123
|
+
assert @connection.view_exists?(view_name), "'#{view_name}' view should exist"
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_table_exists
|
127
|
+
view_name = Paperback.table_name
|
128
|
+
# TODO: switch this assertion around once we changed #tables to not return views.
|
129
|
+
ActiveSupport::Deprecation.silence { assert @connection.table_exists?(view_name), "'#{view_name}' table should exist" }
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_column_definitions
|
133
|
+
assert_equal([["name", :string],
|
134
|
+
["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_attributes
|
138
|
+
assert_equal({"name" => "Agile Web Development with Rails", "status" => 2},
|
139
|
+
Paperback.first.attributes)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_does_not_have_a_primary_key
|
143
|
+
assert_nil Paperback.primary_key
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_does_not_dump_view_as_table
|
147
|
+
schema = dump_table_schema "paperbacks"
|
148
|
+
assert_no_match %r{create_table "paperbacks"}, schema
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# sqlite dose not support CREATE, INSERT, and DELETE for VIEW
|
153
|
+
if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)
|
154
|
+
class UpdateableViewTest < ActiveRecord::TestCase
|
155
|
+
self.use_transactional_tests = false
|
156
|
+
fixtures :books
|
157
|
+
|
158
|
+
class PrintedBook < ActiveRecord::Base
|
159
|
+
self.primary_key = "id"
|
160
|
+
end
|
161
|
+
|
162
|
+
setup do
|
163
|
+
@connection = ActiveRecord::Base.connection
|
164
|
+
@connection.execute <<-SQL
|
165
|
+
CREATE VIEW printed_books
|
166
|
+
AS SELECT id, name, status, format FROM books WHERE format = 'paperback'
|
167
|
+
SQL
|
168
|
+
end
|
169
|
+
|
170
|
+
teardown do
|
171
|
+
@connection.execute "DROP VIEW printed_books" if @connection.view_exists? "printed_books"
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_update_record
|
175
|
+
book = PrintedBook.first
|
176
|
+
book.name = "AWDwR"
|
177
|
+
book.save!
|
178
|
+
book.reload
|
179
|
+
assert_equal "AWDwR", book.name
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_insert_record
|
183
|
+
PrintedBook.create! name: "Rails in Action", status: 0, format: "paperback"
|
184
|
+
|
185
|
+
new_book = PrintedBook.last
|
186
|
+
assert_equal "Rails in Action", new_book.name
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_update_record_to_fail_view_conditions
|
190
|
+
book = PrintedBook.first
|
191
|
+
book.format = "ebook"
|
192
|
+
book.save!
|
193
|
+
|
194
|
+
assert_raises ActiveRecord::RecordNotFound do
|
195
|
+
book.reload
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end # end fo `if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :SQLServerAdapter)`
|
200
|
+
end # end fo `if ActiveRecord::Base.connection.supports_views?`
|
201
|
+
|
202
|
+
if ActiveRecord::Base.connection.respond_to?(:supports_materialized_views?) &&
|
203
|
+
ActiveRecord::Base.connection.supports_materialized_views?
|
204
|
+
class MaterializedViewTest < ActiveRecord::PostgreSQLTestCase
|
205
|
+
include ViewBehavior
|
206
|
+
|
207
|
+
private
|
208
|
+
def create_view(name, query)
|
209
|
+
@connection.execute "CREATE MATERIALIZED VIEW #{name} AS #{query}"
|
210
|
+
end
|
211
|
+
|
212
|
+
def drop_view(name)
|
213
|
+
@connection.execute "DROP MATERIALIZED VIEW #{name}" if @connection.view_exists? name
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|