ibm_db 3.0.4-x86-mingw32 → 3.0.5-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +4 -1
- data/LICENSE +1 -1
- data/MANIFEST +14 -14
- data/README +225 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +291 -291
- data/ext/ibm_db.c +11887 -11884
- 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/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +122 -122
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +276 -261
- data/test/cases/aggregations_test.rb +158 -158
- data/test/cases/ar_schema_test.rb +161 -161
- data/test/cases/associations/association_scope_test.rb +21 -21
- data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
- data/test/cases/associations/callbacks_test.rb +192 -192
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1429 -1411
- data/test/cases/associations/extension_test.rb +82 -82
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
- data/test/cases/associations/has_many_associations_test.rb +2182 -2162
- data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
- data/test/cases/associations/has_one_associations_test.rb +610 -610
- data/test/cases/associations/has_one_through_associations_test.rb +380 -380
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +706 -693
- data/test/cases/associations/join_model_test.rb +754 -754
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +82 -82
- data/test/cases/associations_test.rb +380 -380
- data/test/cases/attribute_decorators_test.rb +125 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods/serialization_test.rb +29 -29
- data/test/cases/attribute_methods_test.rb +952 -952
- data/test/cases/attribute_set_test.rb +210 -200
- data/test/cases/attribute_test.rb +180 -180
- data/test/cases/attributes_test.rb +136 -136
- data/test/cases/autosave_association_test.rb +1595 -1595
- data/test/cases/base_test.rb +1664 -1638
- data/test/cases/batches_test.rb +212 -212
- data/test/cases/binary_test.rb +52 -52
- data/test/cases/bind_parameter_test.rb +100 -100
- data/test/cases/calculations_test.rb +646 -646
- data/test/cases/callbacks_test.rb +543 -543
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +123 -123
- data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
- data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
- data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
- data/test/cases/connection_management_test.rb +122 -122
- data/test/cases/connection_pool_test.rb +346 -346
- data/test/cases/connection_specification/resolver_test.rb +116 -116
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +209 -209
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +19 -19
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +223 -223
- data/test/cases/dirty_test.rb +785 -775
- data/test/cases/disconnected_test.rb +28 -28
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +290 -290
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +76 -76
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1169 -1166
- data/test/cases/fixture_set/file_test.rb +138 -138
- data/test/cases/fixtures_test.rb +908 -897
- data/test/cases/forbidden_attributes_protection_test.rb +99 -99
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +210 -210
- data/test/cases/hot_compatibility_test.rb +54 -54
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +375 -375
- data/test/cases/integration_test.rb +139 -139
- data/test/cases/invalid_connection_test.rb +22 -22
- data/test/cases/invalid_date_test.rb +32 -32
- data/test/cases/invertible_migration_test.rb +295 -295
- data/test/cases/json_serialization_test.rb +302 -302
- data/test/cases/locking_test.rb +477 -477
- data/test/cases/log_subscriber_test.rb +136 -136
- data/test/cases/migration/change_schema_test - Copy.rb +448 -448
- data/test/cases/migration/change_schema_test.rb +512 -472
- data/test/cases/migration/change_table_test.rb +224 -224
- data/test/cases/migration/column_attributes_test.rb +192 -192
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +304 -304
- data/test/cases/migration/command_recorder_test.rb +305 -305
- data/test/cases/migration/create_join_table_test.rb +148 -148
- data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
- data/test/cases/migration/foreign_key_test.rb +328 -360
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +216 -216
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +53 -53
- data/test/cases/migration/references_foreign_key_test.rb +169 -214
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +116 -116
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration/table_and_index_test.rb +24 -24
- data/test/cases/migration_test.rb +959 -959
- data/test/cases/migrator_test.rb +388 -388
- data/test/cases/mixin_test.rb +70 -70
- data/test/cases/modules_test.rb +173 -173
- data/test/cases/multiparameter_attributes_test.rb +350 -350
- data/test/cases/multiple_db_test.rb +115 -115
- data/test/cases/nested_attributes_test.rb +1070 -1057
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +909 -909
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +237 -237
- data/test/cases/query_cache_test.rb +326 -326
- data/test/cases/quoting_test.rb +156 -156
- data/test/cases/readonly_test.rb +118 -118
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +463 -454
- data/test/cases/relation/delegation_test.rb +68 -68
- data/test/cases/relation/merging_test.rb +161 -161
- data/test/cases/relation/mutation_test.rb +165 -165
- data/test/cases/relation/predicate_builder_test.rb +14 -14
- data/test/cases/relation/where_chain_test.rb +181 -181
- data/test/cases/relation/where_test.rb +300 -300
- data/test/cases/relation/where_test2.rb +36 -36
- data/test/cases/relation_test.rb +319 -297
- data/test/cases/relations_test.rb +1815 -1815
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +80 -80
- data/test/cases/sanitize_test.rb +83 -83
- data/test/cases/schema_dumper_test.rb +463 -463
- data/test/cases/scoping/default_scoping_test.rb +454 -454
- data/test/cases/scoping/named_scoping_test.rb +524 -524
- data/test/cases/scoping/relation_scoping_test.rb +357 -357
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +277 -277
- data/test/cases/statement_cache_test.rb +98 -98
- data/test/cases/store_test.rb +194 -194
- data/test/cases/tasks/database_tasks_test.rb +398 -396
- data/test/cases/tasks/mysql_rake_test.rb +324 -311
- data/test/cases/tasks/postgresql_rake_test.rb +250 -245
- data/test/cases/tasks/sqlite_rake_test.rb +193 -193
- data/test/cases/test_case.rb +123 -123
- data/test/cases/timestamp_test.rb +467 -468
- data/test/cases/transaction_callbacks_test.rb +452 -452
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +817 -817
- data/test/cases/type/decimal_test.rb +56 -51
- data/test/cases/type/integer_test.rb +121 -121
- data/test/cases/type/string_test.rb +36 -36
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type/unsigned_integer_test.rb +18 -18
- data/test/cases/types_test.rb +141 -141
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/association_validation_test.rb +86 -86
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +90 -90
- data/test/cases/validations/length_validation_test.rb +47 -47
- data/test/cases/validations/presence_validation_test.rb +68 -68
- data/test/cases/validations/uniqueness_validation_test.rb +457 -434
- data/test/cases/validations_repair_helper.rb +23 -23
- data/test/cases/validations_test.rb +165 -165
- data/test/cases/view_test.rb +119 -113
- data/test/cases/xml_serialization_test.rb +457 -457
- data/test/cases/yaml_serialization_test.rb +126 -86
- data/test/config.rb +5 -5
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +43 -43
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/randomly_named_a9.yml +7 -7
- data/test/fixtures/admin/randomly_named_b0.yml +7 -7
- 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/binaries.yml +133 -133
- data/test/fixtures/books.yml +11 -11
- 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/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/developers.yml +21 -21
- 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/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/csv/accounts.csv +1 -1
- 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/organizations.yml +5 -5
- 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 -12
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +7 -7
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/randomly_named_a9.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/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/ibm_db_test.rb +24 -24
- 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 +8 -8
- data/test/migrations/missing/1_people_have_last_names.rb +8 -8
- data/test/migrations/missing/3_we_need_reminders.rb +11 -11
- data/test/migrations/missing/4_innocent_jointable.rb +11 -11
- data/test/migrations/rename/1_we_need_things.rb +10 -10
- data/test/migrations/rename/2_rename_things.rb +8 -8
- 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 +11 -11
- data/test/migrations/valid/3_innocent_jointable.rb +11 -11
- 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 +11 -11
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
- 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 +4 -4
- data/test/models/admin/account.rb +2 -2
- data/test/models/admin/randomly_named_c1.rb +3 -3
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +4 -4
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +212 -212
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +1 -1
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +18 -18
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +51 -51
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +26 -26
- data/test/models/carrier.rb +2 -2
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +7 -3
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +23 -23
- 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 +64 -64
- data/test/models/company.rb +228 -225
- 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/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +77 -77
- 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 +255 -252
- 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 +2 -2
- 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 +1 -1
- data/test/models/hotel.rb +9 -6
- 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 +41 -41
- data/test/models/member_detail.rb +7 -7
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- 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/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/owner.rb +34 -34
- data/test/models/parrot.rb +29 -29
- data/test/models/person.rb +143 -143
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +15 -15
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +264 -264
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +31 -29
- 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/randomly_named_c1.rb +3 -3
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- 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 +33 -33
- data/test/models/ship_part.rb +7 -7
- 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 +7 -7
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +124 -124
- 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/tyre.rb +11 -11
- data/test/models/uuid_child.rb +3 -3
- 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/mysql2_specific_schema.rb +58 -58
- data/test/schema/mysql_specific_schema.rb +70 -70
- data/test/schema/oracle_specific_schema.rb +43 -43
- data/test/schema/postgresql_specific_schema.rb +202 -202
- data/test/schema/schema.rb +952 -938
- data/test/schema/sqlite_specific_schema.rb +21 -21
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +22 -22
- 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
- metadata +2 -2
@@ -1,139 +1,139 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'cases/helper'
|
4
|
-
require 'models/company'
|
5
|
-
require 'models/developer'
|
6
|
-
require 'models/computer'
|
7
|
-
require 'models/owner'
|
8
|
-
require 'models/pet'
|
9
|
-
|
10
|
-
class IntegrationTest < ActiveRecord::TestCase
|
11
|
-
fixtures :companies, :developers, :owners, :pets
|
12
|
-
|
13
|
-
def test_to_param_should_return_string
|
14
|
-
assert_kind_of String, Client.first.to_param
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_to_param_returns_nil_if_not_persisted
|
18
|
-
client = Client.new
|
19
|
-
assert_equal nil, client.to_param
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_to_param_returns_id_if_not_persisted_but_id_is_set
|
23
|
-
client = Client.new
|
24
|
-
client.id = 1
|
25
|
-
assert_equal '1', client.to_param
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_to_param_class_method
|
29
|
-
firm = Firm.find(4)
|
30
|
-
assert_equal '4-flamboyant-software', firm.to_param
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_to_param_class_method_truncates
|
34
|
-
firm = Firm.find(4)
|
35
|
-
firm.name = 'a ' * 100
|
36
|
-
assert_equal '4-a-a-a-a-a-a-a-a-a', firm.to_param
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_to_param_class_method_truncates_edge_case
|
40
|
-
firm = Firm.find(4)
|
41
|
-
firm.name = 'David HeinemeierHansson'
|
42
|
-
assert_equal '4-david', firm.to_param
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_to_param_class_method_squishes
|
46
|
-
firm = Firm.find(4)
|
47
|
-
firm.name = "ab \n" * 100
|
48
|
-
assert_equal '4-ab-ab-ab-ab-ab-ab', firm.to_param
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_to_param_class_method_multibyte_character
|
52
|
-
firm = Firm.find(4)
|
53
|
-
firm.name = "戦場ヶ原 ひたぎ"
|
54
|
-
assert_equal '4', firm.to_param
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_to_param_class_method_uses_default_if_blank
|
58
|
-
firm = Firm.find(4)
|
59
|
-
firm.name = nil
|
60
|
-
assert_equal '4', firm.to_param
|
61
|
-
firm.name = ' '
|
62
|
-
assert_equal '4', firm.to_param
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_to_param_class_method_uses_default_if_not_persisted
|
66
|
-
firm = Firm.new(name: 'Fancy Shirts')
|
67
|
-
assert_equal nil, firm.to_param
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_to_param_with_no_arguments
|
71
|
-
assert_equal 'Firm', Firm.to_param
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_cache_key_for_existing_record_is_not_timezone_dependent
|
75
|
-
utc_key = Developer.first.cache_key
|
76
|
-
|
77
|
-
with_timezone_config zone: "EST" do
|
78
|
-
est_key = Developer.first.cache_key
|
79
|
-
assert_equal utc_key, est_key
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_cache_key_format_for_existing_record_with_updated_at
|
84
|
-
dev = Developer.first
|
85
|
-
assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:nsec)}", dev.cache_key
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_cache_key_format_for_existing_record_with_updated_at_and_custom_cache_timestamp_format
|
89
|
-
dev = CachedDeveloper.first
|
90
|
-
assert_equal "cached_developers/#{dev.id}-#{dev.updated_at.utc.to_s(:number)}", dev.cache_key
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_cache_key_changes_when_child_touched
|
94
|
-
owner = owners(:blackbeard)
|
95
|
-
pet = pets(:parrot)
|
96
|
-
|
97
|
-
owner.update_column :updated_at, Time.current
|
98
|
-
key = owner.cache_key
|
99
|
-
|
100
|
-
assert pet.touch
|
101
|
-
assert_not_equal key, owner.reload.cache_key
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_cache_key_format_for_existing_record_with_nil_updated_timestamps
|
105
|
-
dev = Developer.first
|
106
|
-
dev.update_columns(updated_at: nil, updated_on: nil)
|
107
|
-
assert_match(/\/#{dev.id}$/, dev.cache_key)
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_cache_key_for_updated_on
|
111
|
-
dev = Developer.first
|
112
|
-
dev.updated_at = nil
|
113
|
-
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_cache_key_for_newer_updated_at
|
117
|
-
dev = Developer.first
|
118
|
-
dev.updated_at += 3600
|
119
|
-
assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:nsec)}", dev.cache_key
|
120
|
-
end
|
121
|
-
|
122
|
-
def test_cache_key_for_newer_updated_on
|
123
|
-
dev = Developer.first
|
124
|
-
dev.updated_on += 3600
|
125
|
-
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_cache_key_format_is_precise_enough
|
129
|
-
dev = Developer.first
|
130
|
-
key = dev.cache_key
|
131
|
-
dev.touch
|
132
|
-
assert_not_equal key, dev.cache_key
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_named_timestamps_for_cache_key
|
136
|
-
owner = owners(:blackbeard)
|
137
|
-
assert_equal "owners/#{owner.id}-#{owner.happy_at.utc.to_s(:nsec)}", owner.cache_key(:updated_at, :happy_at)
|
138
|
-
end
|
139
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'cases/helper'
|
4
|
+
require 'models/company'
|
5
|
+
require 'models/developer'
|
6
|
+
require 'models/computer'
|
7
|
+
require 'models/owner'
|
8
|
+
require 'models/pet'
|
9
|
+
|
10
|
+
class IntegrationTest < ActiveRecord::TestCase
|
11
|
+
fixtures :companies, :developers, :owners, :pets
|
12
|
+
|
13
|
+
def test_to_param_should_return_string
|
14
|
+
assert_kind_of String, Client.first.to_param
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_to_param_returns_nil_if_not_persisted
|
18
|
+
client = Client.new
|
19
|
+
assert_equal nil, client.to_param
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_to_param_returns_id_if_not_persisted_but_id_is_set
|
23
|
+
client = Client.new
|
24
|
+
client.id = 1
|
25
|
+
assert_equal '1', client.to_param
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_to_param_class_method
|
29
|
+
firm = Firm.find(4)
|
30
|
+
assert_equal '4-flamboyant-software', firm.to_param
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_to_param_class_method_truncates
|
34
|
+
firm = Firm.find(4)
|
35
|
+
firm.name = 'a ' * 100
|
36
|
+
assert_equal '4-a-a-a-a-a-a-a-a-a', firm.to_param
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_to_param_class_method_truncates_edge_case
|
40
|
+
firm = Firm.find(4)
|
41
|
+
firm.name = 'David HeinemeierHansson'
|
42
|
+
assert_equal '4-david', firm.to_param
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_to_param_class_method_squishes
|
46
|
+
firm = Firm.find(4)
|
47
|
+
firm.name = "ab \n" * 100
|
48
|
+
assert_equal '4-ab-ab-ab-ab-ab-ab', firm.to_param
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_to_param_class_method_multibyte_character
|
52
|
+
firm = Firm.find(4)
|
53
|
+
firm.name = "戦場ヶ原 ひたぎ"
|
54
|
+
assert_equal '4', firm.to_param
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_to_param_class_method_uses_default_if_blank
|
58
|
+
firm = Firm.find(4)
|
59
|
+
firm.name = nil
|
60
|
+
assert_equal '4', firm.to_param
|
61
|
+
firm.name = ' '
|
62
|
+
assert_equal '4', firm.to_param
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_to_param_class_method_uses_default_if_not_persisted
|
66
|
+
firm = Firm.new(name: 'Fancy Shirts')
|
67
|
+
assert_equal nil, firm.to_param
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_to_param_with_no_arguments
|
71
|
+
assert_equal 'Firm', Firm.to_param
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_cache_key_for_existing_record_is_not_timezone_dependent
|
75
|
+
utc_key = Developer.first.cache_key
|
76
|
+
|
77
|
+
with_timezone_config zone: "EST" do
|
78
|
+
est_key = Developer.first.cache_key
|
79
|
+
assert_equal utc_key, est_key
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_cache_key_format_for_existing_record_with_updated_at
|
84
|
+
dev = Developer.first
|
85
|
+
assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:nsec)}", dev.cache_key
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_cache_key_format_for_existing_record_with_updated_at_and_custom_cache_timestamp_format
|
89
|
+
dev = CachedDeveloper.first
|
90
|
+
assert_equal "cached_developers/#{dev.id}-#{dev.updated_at.utc.to_s(:number)}", dev.cache_key
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_cache_key_changes_when_child_touched
|
94
|
+
owner = owners(:blackbeard)
|
95
|
+
pet = pets(:parrot)
|
96
|
+
|
97
|
+
owner.update_column :updated_at, Time.current
|
98
|
+
key = owner.cache_key
|
99
|
+
|
100
|
+
assert pet.touch
|
101
|
+
assert_not_equal key, owner.reload.cache_key
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_cache_key_format_for_existing_record_with_nil_updated_timestamps
|
105
|
+
dev = Developer.first
|
106
|
+
dev.update_columns(updated_at: nil, updated_on: nil)
|
107
|
+
assert_match(/\/#{dev.id}$/, dev.cache_key)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_cache_key_for_updated_on
|
111
|
+
dev = Developer.first
|
112
|
+
dev.updated_at = nil
|
113
|
+
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_cache_key_for_newer_updated_at
|
117
|
+
dev = Developer.first
|
118
|
+
dev.updated_at += 3600
|
119
|
+
assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:nsec)}", dev.cache_key
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_cache_key_for_newer_updated_on
|
123
|
+
dev = Developer.first
|
124
|
+
dev.updated_on += 3600
|
125
|
+
assert_equal "developers/#{dev.id}-#{dev.updated_on.utc.to_s(:nsec)}", dev.cache_key
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_cache_key_format_is_precise_enough
|
129
|
+
dev = Developer.first
|
130
|
+
key = dev.cache_key
|
131
|
+
dev.touch
|
132
|
+
assert_not_equal key, dev.cache_key
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_named_timestamps_for_cache_key
|
136
|
+
owner = owners(:blackbeard)
|
137
|
+
assert_equal "owners/#{owner.id}-#{owner.happy_at.utc.to_s(:nsec)}", owner.cache_key(:updated_at, :happy_at)
|
138
|
+
end
|
139
|
+
end
|
@@ -1,22 +1,22 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class TestAdapterWithInvalidConnection < ActiveRecord::TestCase
|
4
|
-
self.use_transactional_fixtures = false
|
5
|
-
|
6
|
-
class Bird < ActiveRecord::Base
|
7
|
-
end
|
8
|
-
|
9
|
-
def setup
|
10
|
-
# Can't just use current adapter; sqlite3 will create a database
|
11
|
-
# file on the fly.
|
12
|
-
Bird.establish_connection adapter: 'mysql', database: 'i_do_not_exist'
|
13
|
-
end
|
14
|
-
|
15
|
-
teardown do
|
16
|
-
Bird.remove_connection
|
17
|
-
end
|
18
|
-
|
19
|
-
test "inspect on Model class does not raise" do
|
20
|
-
assert_equal "#{Bird.name} (call '#{Bird.name}.connection' to establish a connection)", Bird.inspect
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
class TestAdapterWithInvalidConnection < ActiveRecord::TestCase
|
4
|
+
self.use_transactional_fixtures = false
|
5
|
+
|
6
|
+
class Bird < ActiveRecord::Base
|
7
|
+
end
|
8
|
+
|
9
|
+
def setup
|
10
|
+
# Can't just use current adapter; sqlite3 will create a database
|
11
|
+
# file on the fly.
|
12
|
+
Bird.establish_connection adapter: 'mysql', database: 'i_do_not_exist'
|
13
|
+
end
|
14
|
+
|
15
|
+
teardown do
|
16
|
+
Bird.remove_connection
|
17
|
+
end
|
18
|
+
|
19
|
+
test "inspect on Model class does not raise" do
|
20
|
+
assert_equal "#{Bird.name} (call '#{Bird.name}.connection' to establish a connection)", Bird.inspect
|
21
|
+
end
|
22
|
+
end
|
@@ -1,32 +1,32 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'models/topic'
|
3
|
-
|
4
|
-
class InvalidDateTest < ActiveRecord::TestCase
|
5
|
-
def test_assign_valid_dates
|
6
|
-
valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
|
7
|
-
|
8
|
-
invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
|
9
|
-
|
10
|
-
valid_dates.each do |date_src|
|
11
|
-
topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
|
12
|
-
# Oracle DATE columns are datetime columns and Oracle adapter returns Time value
|
13
|
-
if current_adapter?(:OracleAdapter)
|
14
|
-
assert_equal(topic.last_read.to_date, Date.new(*date_src))
|
15
|
-
else
|
16
|
-
assert_equal(topic.last_read, Date.new(*date_src))
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
invalid_dates.each do |date_src|
|
21
|
-
assert_nothing_raised do
|
22
|
-
topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
|
23
|
-
# Oracle DATE columns are datetime columns and Oracle adapter returns Time value
|
24
|
-
if current_adapter?(:OracleAdapter)
|
25
|
-
assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
|
26
|
-
else
|
27
|
-
assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'models/topic'
|
3
|
+
|
4
|
+
class InvalidDateTest < ActiveRecord::TestCase
|
5
|
+
def test_assign_valid_dates
|
6
|
+
valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
|
7
|
+
|
8
|
+
invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
|
9
|
+
|
10
|
+
valid_dates.each do |date_src|
|
11
|
+
topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
|
12
|
+
# Oracle DATE columns are datetime columns and Oracle adapter returns Time value
|
13
|
+
if current_adapter?(:OracleAdapter)
|
14
|
+
assert_equal(topic.last_read.to_date, Date.new(*date_src))
|
15
|
+
else
|
16
|
+
assert_equal(topic.last_read, Date.new(*date_src))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
invalid_dates.each do |date_src|
|
21
|
+
assert_nothing_raised do
|
22
|
+
topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
|
23
|
+
# Oracle DATE columns are datetime columns and Oracle adapter returns Time value
|
24
|
+
if current_adapter?(:OracleAdapter)
|
25
|
+
assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
|
26
|
+
else
|
27
|
+
assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,295 +1,295 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class InvertibleMigrationTest < ActiveRecord::TestCase
|
5
|
-
class SilentMigration < ActiveRecord::Migration
|
6
|
-
def write(text = '')
|
7
|
-
# sssshhhhh!!
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class InvertibleMigration < SilentMigration
|
12
|
-
def change
|
13
|
-
create_table("horses") do |t|
|
14
|
-
t.column :content, :text
|
15
|
-
t.column :remind_at, :datetime
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class InvertibleRevertMigration < SilentMigration
|
21
|
-
def change
|
22
|
-
revert do
|
23
|
-
create_table("horses") do |t|
|
24
|
-
t.column :content, :text
|
25
|
-
t.column :remind_at, :datetime
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class InvertibleByPartsMigration < SilentMigration
|
32
|
-
attr_writer :test
|
33
|
-
def change
|
34
|
-
create_table("new_horses") do |t|
|
35
|
-
t.column :breed, :string
|
36
|
-
end
|
37
|
-
reversible do |dir|
|
38
|
-
@test.yield :both
|
39
|
-
dir.up { @test.yield :up }
|
40
|
-
dir.down { @test.yield :down }
|
41
|
-
end
|
42
|
-
revert do
|
43
|
-
create_table("horses") do |t|
|
44
|
-
t.column :content, :text
|
45
|
-
t.column :remind_at, :datetime
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class NonInvertibleMigration < SilentMigration
|
52
|
-
def change
|
53
|
-
create_table("horses") do |t|
|
54
|
-
t.column :content, :text
|
55
|
-
t.column :remind_at, :datetime
|
56
|
-
end
|
57
|
-
remove_column "horses", :content
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
class RemoveIndexMigration1 < SilentMigration
|
62
|
-
def self.up
|
63
|
-
create_table("horses") do |t|
|
64
|
-
t.column :name, :string
|
65
|
-
t.column :color, :string
|
66
|
-
t.index [:name, :color]
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
class RemoveIndexMigration2 < SilentMigration
|
72
|
-
def change
|
73
|
-
change_table("horses") do |t|
|
74
|
-
t.remove_index [:name, :color]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
class LegacyMigration < ActiveRecord::Migration
|
80
|
-
def self.up
|
81
|
-
create_table("horses") do |t|
|
82
|
-
t.column :content, :text
|
83
|
-
t.column :remind_at, :datetime
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.down
|
88
|
-
drop_table("horses")
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
class RevertWholeMigration < SilentMigration
|
93
|
-
def initialize(name = self.class.name, version = nil, migration)
|
94
|
-
@migration = migration
|
95
|
-
super(name, version)
|
96
|
-
end
|
97
|
-
|
98
|
-
def change
|
99
|
-
revert @migration
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
class NestedRevertWholeMigration < RevertWholeMigration
|
104
|
-
def change
|
105
|
-
revert { super }
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
class RevertNamedIndexMigration1 < SilentMigration
|
110
|
-
def change
|
111
|
-
create_table("horses") do |t|
|
112
|
-
t.column :content, :string
|
113
|
-
t.column :remind_at, :datetime
|
114
|
-
end
|
115
|
-
add_index :horses, :content
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
class RevertNamedIndexMigration2 < SilentMigration
|
120
|
-
def change
|
121
|
-
add_index :horses, :content, name: "horses_index_named"
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
setup do
|
126
|
-
@verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
|
127
|
-
end
|
128
|
-
|
129
|
-
teardown do
|
130
|
-
%w[horses new_horses].each do |table|
|
131
|
-
if ActiveRecord::Base.connection.table_exists?(table)
|
132
|
-
ActiveRecord::Base.connection.drop_table(table)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
ActiveRecord::Migration.verbose = @verbose_was
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_no_reverse
|
139
|
-
migration = NonInvertibleMigration.new
|
140
|
-
migration.migrate(:up)
|
141
|
-
assert_raises(IrreversibleMigration) do
|
142
|
-
migration.migrate(:down)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_exception_on_removing_index_without_column_option
|
147
|
-
RemoveIndexMigration1.new.migrate(:up)
|
148
|
-
migration = RemoveIndexMigration2.new
|
149
|
-
migration.migrate(:up)
|
150
|
-
|
151
|
-
assert_raises(IrreversibleMigration) do
|
152
|
-
migration.migrate(:down)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_migrate_up
|
157
|
-
migration = InvertibleMigration.new
|
158
|
-
migration.migrate(:up)
|
159
|
-
assert migration.connection.table_exists?("horses"), "horses should exist"
|
160
|
-
end
|
161
|
-
|
162
|
-
def test_migrate_down
|
163
|
-
migration = InvertibleMigration.new
|
164
|
-
migration.migrate :up
|
165
|
-
migration.migrate :down
|
166
|
-
assert !migration.connection.table_exists?("horses")
|
167
|
-
end
|
168
|
-
|
169
|
-
def test_migrate_revert
|
170
|
-
migration = InvertibleMigration.new
|
171
|
-
revert = InvertibleRevertMigration.new
|
172
|
-
migration.migrate :up
|
173
|
-
revert.migrate :up
|
174
|
-
assert !migration.connection.table_exists?("horses")
|
175
|
-
revert.migrate :down
|
176
|
-
assert migration.connection.table_exists?("horses")
|
177
|
-
migration.migrate :down
|
178
|
-
assert !migration.connection.table_exists?("horses")
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_migrate_revert_by_part
|
182
|
-
InvertibleMigration.new.migrate :up
|
183
|
-
received = []
|
184
|
-
migration = InvertibleByPartsMigration.new
|
185
|
-
migration.test = ->(dir){
|
186
|
-
assert migration.connection.table_exists?("horses")
|
187
|
-
assert migration.connection.table_exists?("new_horses")
|
188
|
-
received << dir
|
189
|
-
}
|
190
|
-
migration.migrate :up
|
191
|
-
assert_equal [:both, :up], received
|
192
|
-
assert !migration.connection.table_exists?("horses")
|
193
|
-
assert migration.connection.table_exists?("new_horses")
|
194
|
-
migration.migrate :down
|
195
|
-
assert_equal [:both, :up, :both, :down], received
|
196
|
-
assert migration.connection.table_exists?("horses")
|
197
|
-
assert !migration.connection.table_exists?("new_horses")
|
198
|
-
end
|
199
|
-
|
200
|
-
def test_migrate_revert_whole_migration
|
201
|
-
migration = InvertibleMigration.new
|
202
|
-
[LegacyMigration, InvertibleMigration].each do |klass|
|
203
|
-
revert = RevertWholeMigration.new(klass)
|
204
|
-
migration.migrate :up
|
205
|
-
revert.migrate :up
|
206
|
-
assert !migration.connection.table_exists?("horses")
|
207
|
-
revert.migrate :down
|
208
|
-
assert migration.connection.table_exists?("horses")
|
209
|
-
migration.migrate :down
|
210
|
-
assert !migration.connection.table_exists?("horses")
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
def test_migrate_nested_revert_whole_migration
|
215
|
-
revert = NestedRevertWholeMigration.new(InvertibleRevertMigration)
|
216
|
-
revert.migrate :down
|
217
|
-
assert revert.connection.table_exists?("horses")
|
218
|
-
revert.migrate :up
|
219
|
-
assert !revert.connection.table_exists?("horses")
|
220
|
-
end
|
221
|
-
|
222
|
-
def test_revert_order
|
223
|
-
block = Proc.new{|t| t.string :name }
|
224
|
-
recorder = ActiveRecord::Migration::CommandRecorder.new(ActiveRecord::Base.connection)
|
225
|
-
recorder.instance_eval do
|
226
|
-
create_table("apples", &block)
|
227
|
-
revert do
|
228
|
-
create_table("bananas", &block)
|
229
|
-
revert do
|
230
|
-
create_table("clementines")
|
231
|
-
create_table("dates")
|
232
|
-
end
|
233
|
-
create_table("elderberries")
|
234
|
-
end
|
235
|
-
revert do
|
236
|
-
create_table("figs")
|
237
|
-
create_table("grapes")
|
238
|
-
end
|
239
|
-
end
|
240
|
-
assert_equal [[:create_table, ["apples"], block], [:drop_table, ["elderberries"], nil],
|
241
|
-
[:create_table, ["clementines"], nil], [:create_table, ["dates"], nil],
|
242
|
-
[:drop_table, ["bananas"], block], [:drop_table, ["grapes"], nil],
|
243
|
-
[:drop_table, ["figs"], nil]], recorder.commands
|
244
|
-
end
|
245
|
-
|
246
|
-
def test_legacy_up
|
247
|
-
LegacyMigration.migrate :up
|
248
|
-
assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
|
249
|
-
end
|
250
|
-
|
251
|
-
def test_legacy_down
|
252
|
-
LegacyMigration.migrate :up
|
253
|
-
LegacyMigration.migrate :down
|
254
|
-
assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
|
255
|
-
end
|
256
|
-
|
257
|
-
def test_up
|
258
|
-
LegacyMigration.up
|
259
|
-
assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
|
260
|
-
end
|
261
|
-
|
262
|
-
def test_down
|
263
|
-
LegacyMigration.up
|
264
|
-
LegacyMigration.down
|
265
|
-
assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
|
266
|
-
end
|
267
|
-
|
268
|
-
def test_migrate_down_with_table_name_prefix
|
269
|
-
ActiveRecord::Base.table_name_prefix = 'p_'
|
270
|
-
ActiveRecord::Base.table_name_suffix = '_s'
|
271
|
-
migration = InvertibleMigration.new
|
272
|
-
migration.migrate(:up)
|
273
|
-
assert_nothing_raised { migration.migrate(:down) }
|
274
|
-
assert !ActiveRecord::Base.connection.table_exists?("p_horses_s"), "p_horses_s should not exist"
|
275
|
-
ensure
|
276
|
-
ActiveRecord::Base.table_name_prefix = ActiveRecord::Base.table_name_suffix = ''
|
277
|
-
end
|
278
|
-
|
279
|
-
# MySQL 5.7 and Oracle do not allow to create duplicate indexes on the same columns
|
280
|
-
unless current_adapter?(:MysqlAdapter, :Mysql2Adapter, :OracleAdapter)
|
281
|
-
def test_migrate_revert_add_index_with_name
|
282
|
-
RevertNamedIndexMigration1.new.migrate(:up)
|
283
|
-
RevertNamedIndexMigration2.new.migrate(:up)
|
284
|
-
RevertNamedIndexMigration2.new.migrate(:down)
|
285
|
-
|
286
|
-
connection = ActiveRecord::Base.connection
|
287
|
-
assert connection.index_exists?(:horses, :content),
|
288
|
-
"index on content should exist"
|
289
|
-
assert !connection.index_exists?(:horses, :content, name: "horses_index_named"),
|
290
|
-
"horses_index_named index should not exist"
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
end
|
295
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
class InvertibleMigrationTest < ActiveRecord::TestCase
|
5
|
+
class SilentMigration < ActiveRecord::Migration
|
6
|
+
def write(text = '')
|
7
|
+
# sssshhhhh!!
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class InvertibleMigration < SilentMigration
|
12
|
+
def change
|
13
|
+
create_table("horses") do |t|
|
14
|
+
t.column :content, :text
|
15
|
+
t.column :remind_at, :datetime
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class InvertibleRevertMigration < SilentMigration
|
21
|
+
def change
|
22
|
+
revert do
|
23
|
+
create_table("horses") do |t|
|
24
|
+
t.column :content, :text
|
25
|
+
t.column :remind_at, :datetime
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class InvertibleByPartsMigration < SilentMigration
|
32
|
+
attr_writer :test
|
33
|
+
def change
|
34
|
+
create_table("new_horses") do |t|
|
35
|
+
t.column :breed, :string
|
36
|
+
end
|
37
|
+
reversible do |dir|
|
38
|
+
@test.yield :both
|
39
|
+
dir.up { @test.yield :up }
|
40
|
+
dir.down { @test.yield :down }
|
41
|
+
end
|
42
|
+
revert do
|
43
|
+
create_table("horses") do |t|
|
44
|
+
t.column :content, :text
|
45
|
+
t.column :remind_at, :datetime
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class NonInvertibleMigration < SilentMigration
|
52
|
+
def change
|
53
|
+
create_table("horses") do |t|
|
54
|
+
t.column :content, :text
|
55
|
+
t.column :remind_at, :datetime
|
56
|
+
end
|
57
|
+
remove_column "horses", :content
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class RemoveIndexMigration1 < SilentMigration
|
62
|
+
def self.up
|
63
|
+
create_table("horses") do |t|
|
64
|
+
t.column :name, :string
|
65
|
+
t.column :color, :string
|
66
|
+
t.index [:name, :color]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class RemoveIndexMigration2 < SilentMigration
|
72
|
+
def change
|
73
|
+
change_table("horses") do |t|
|
74
|
+
t.remove_index [:name, :color]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class LegacyMigration < ActiveRecord::Migration
|
80
|
+
def self.up
|
81
|
+
create_table("horses") do |t|
|
82
|
+
t.column :content, :text
|
83
|
+
t.column :remind_at, :datetime
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.down
|
88
|
+
drop_table("horses")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class RevertWholeMigration < SilentMigration
|
93
|
+
def initialize(name = self.class.name, version = nil, migration)
|
94
|
+
@migration = migration
|
95
|
+
super(name, version)
|
96
|
+
end
|
97
|
+
|
98
|
+
def change
|
99
|
+
revert @migration
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class NestedRevertWholeMigration < RevertWholeMigration
|
104
|
+
def change
|
105
|
+
revert { super }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class RevertNamedIndexMigration1 < SilentMigration
|
110
|
+
def change
|
111
|
+
create_table("horses") do |t|
|
112
|
+
t.column :content, :string
|
113
|
+
t.column :remind_at, :datetime
|
114
|
+
end
|
115
|
+
add_index :horses, :content
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class RevertNamedIndexMigration2 < SilentMigration
|
120
|
+
def change
|
121
|
+
add_index :horses, :content, name: "horses_index_named"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
setup do
|
126
|
+
@verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
|
127
|
+
end
|
128
|
+
|
129
|
+
teardown do
|
130
|
+
%w[horses new_horses].each do |table|
|
131
|
+
if ActiveRecord::Base.connection.table_exists?(table)
|
132
|
+
ActiveRecord::Base.connection.drop_table(table)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
ActiveRecord::Migration.verbose = @verbose_was
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_no_reverse
|
139
|
+
migration = NonInvertibleMigration.new
|
140
|
+
migration.migrate(:up)
|
141
|
+
assert_raises(IrreversibleMigration) do
|
142
|
+
migration.migrate(:down)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_exception_on_removing_index_without_column_option
|
147
|
+
RemoveIndexMigration1.new.migrate(:up)
|
148
|
+
migration = RemoveIndexMigration2.new
|
149
|
+
migration.migrate(:up)
|
150
|
+
|
151
|
+
assert_raises(IrreversibleMigration) do
|
152
|
+
migration.migrate(:down)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_migrate_up
|
157
|
+
migration = InvertibleMigration.new
|
158
|
+
migration.migrate(:up)
|
159
|
+
assert migration.connection.table_exists?("horses"), "horses should exist"
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_migrate_down
|
163
|
+
migration = InvertibleMigration.new
|
164
|
+
migration.migrate :up
|
165
|
+
migration.migrate :down
|
166
|
+
assert !migration.connection.table_exists?("horses")
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_migrate_revert
|
170
|
+
migration = InvertibleMigration.new
|
171
|
+
revert = InvertibleRevertMigration.new
|
172
|
+
migration.migrate :up
|
173
|
+
revert.migrate :up
|
174
|
+
assert !migration.connection.table_exists?("horses")
|
175
|
+
revert.migrate :down
|
176
|
+
assert migration.connection.table_exists?("horses")
|
177
|
+
migration.migrate :down
|
178
|
+
assert !migration.connection.table_exists?("horses")
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_migrate_revert_by_part
|
182
|
+
InvertibleMigration.new.migrate :up
|
183
|
+
received = []
|
184
|
+
migration = InvertibleByPartsMigration.new
|
185
|
+
migration.test = ->(dir){
|
186
|
+
assert migration.connection.table_exists?("horses")
|
187
|
+
assert migration.connection.table_exists?("new_horses")
|
188
|
+
received << dir
|
189
|
+
}
|
190
|
+
migration.migrate :up
|
191
|
+
assert_equal [:both, :up], received
|
192
|
+
assert !migration.connection.table_exists?("horses")
|
193
|
+
assert migration.connection.table_exists?("new_horses")
|
194
|
+
migration.migrate :down
|
195
|
+
assert_equal [:both, :up, :both, :down], received
|
196
|
+
assert migration.connection.table_exists?("horses")
|
197
|
+
assert !migration.connection.table_exists?("new_horses")
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_migrate_revert_whole_migration
|
201
|
+
migration = InvertibleMigration.new
|
202
|
+
[LegacyMigration, InvertibleMigration].each do |klass|
|
203
|
+
revert = RevertWholeMigration.new(klass)
|
204
|
+
migration.migrate :up
|
205
|
+
revert.migrate :up
|
206
|
+
assert !migration.connection.table_exists?("horses")
|
207
|
+
revert.migrate :down
|
208
|
+
assert migration.connection.table_exists?("horses")
|
209
|
+
migration.migrate :down
|
210
|
+
assert !migration.connection.table_exists?("horses")
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_migrate_nested_revert_whole_migration
|
215
|
+
revert = NestedRevertWholeMigration.new(InvertibleRevertMigration)
|
216
|
+
revert.migrate :down
|
217
|
+
assert revert.connection.table_exists?("horses")
|
218
|
+
revert.migrate :up
|
219
|
+
assert !revert.connection.table_exists?("horses")
|
220
|
+
end
|
221
|
+
|
222
|
+
def test_revert_order
|
223
|
+
block = Proc.new{|t| t.string :name }
|
224
|
+
recorder = ActiveRecord::Migration::CommandRecorder.new(ActiveRecord::Base.connection)
|
225
|
+
recorder.instance_eval do
|
226
|
+
create_table("apples", &block)
|
227
|
+
revert do
|
228
|
+
create_table("bananas", &block)
|
229
|
+
revert do
|
230
|
+
create_table("clementines")
|
231
|
+
create_table("dates")
|
232
|
+
end
|
233
|
+
create_table("elderberries")
|
234
|
+
end
|
235
|
+
revert do
|
236
|
+
create_table("figs")
|
237
|
+
create_table("grapes")
|
238
|
+
end
|
239
|
+
end
|
240
|
+
assert_equal [[:create_table, ["apples"], block], [:drop_table, ["elderberries"], nil],
|
241
|
+
[:create_table, ["clementines"], nil], [:create_table, ["dates"], nil],
|
242
|
+
[:drop_table, ["bananas"], block], [:drop_table, ["grapes"], nil],
|
243
|
+
[:drop_table, ["figs"], nil]], recorder.commands
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_legacy_up
|
247
|
+
LegacyMigration.migrate :up
|
248
|
+
assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_legacy_down
|
252
|
+
LegacyMigration.migrate :up
|
253
|
+
LegacyMigration.migrate :down
|
254
|
+
assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_up
|
258
|
+
LegacyMigration.up
|
259
|
+
assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
|
260
|
+
end
|
261
|
+
|
262
|
+
def test_down
|
263
|
+
LegacyMigration.up
|
264
|
+
LegacyMigration.down
|
265
|
+
assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_migrate_down_with_table_name_prefix
|
269
|
+
ActiveRecord::Base.table_name_prefix = 'p_'
|
270
|
+
ActiveRecord::Base.table_name_suffix = '_s'
|
271
|
+
migration = InvertibleMigration.new
|
272
|
+
migration.migrate(:up)
|
273
|
+
assert_nothing_raised { migration.migrate(:down) }
|
274
|
+
assert !ActiveRecord::Base.connection.table_exists?("p_horses_s"), "p_horses_s should not exist"
|
275
|
+
ensure
|
276
|
+
ActiveRecord::Base.table_name_prefix = ActiveRecord::Base.table_name_suffix = ''
|
277
|
+
end
|
278
|
+
|
279
|
+
# MySQL 5.7 and Oracle do not allow to create duplicate indexes on the same columns
|
280
|
+
unless current_adapter?(:MysqlAdapter, :Mysql2Adapter, :OracleAdapter)
|
281
|
+
def test_migrate_revert_add_index_with_name
|
282
|
+
RevertNamedIndexMigration1.new.migrate(:up)
|
283
|
+
RevertNamedIndexMigration2.new.migrate(:up)
|
284
|
+
RevertNamedIndexMigration2.new.migrate(:down)
|
285
|
+
|
286
|
+
connection = ActiveRecord::Base.connection
|
287
|
+
assert connection.index_exists?(:horses, :content),
|
288
|
+
"index on content should exist"
|
289
|
+
assert !connection.index_exists?(:horses, :content, name: "horses_index_named"),
|
290
|
+
"horses_index_named index should not exist"
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
end
|
295
|
+
end
|