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,468 +1,467 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'support/ddl_helper'
|
3
|
-
require 'models/developer'
|
4
|
-
require 'models/computer'
|
5
|
-
require 'models/owner'
|
6
|
-
require 'models/pet'
|
7
|
-
require 'models/toy'
|
8
|
-
require 'models/car'
|
9
|
-
require 'models/task'
|
10
|
-
|
11
|
-
class TimestampTest < ActiveRecord::TestCase
|
12
|
-
fixtures :developers, :owners, :pets, :toys, :cars, :tasks
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@developer = Developer.first
|
16
|
-
@owner = Owner.first
|
17
|
-
@developer.update_columns(updated_at: Time.now.prev_month)
|
18
|
-
@previously_updated_at = @developer.updated_at
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_saving_a_changed_record_updates_its_timestamp
|
22
|
-
@developer.name = "Jack Bauer"
|
23
|
-
@developer.save!
|
24
|
-
|
25
|
-
assert_not_equal @previously_updated_at, @developer.updated_at
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_saving_a_unchanged_record_doesnt_update_its_timestamp
|
29
|
-
@developer.save!
|
30
|
-
|
31
|
-
assert_equal @previously_updated_at, @developer.updated_at
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_touching_a_record_updates_its_timestamp
|
35
|
-
previous_salary = @developer.salary
|
36
|
-
@developer.salary = previous_salary + 10000
|
37
|
-
@developer.touch
|
38
|
-
|
39
|
-
assert_not_equal @previously_updated_at, @developer.updated_at
|
40
|
-
assert_equal previous_salary + 10000, @developer.salary
|
41
|
-
assert @developer.salary_changed?, 'developer salary should have changed'
|
42
|
-
assert @developer.changed?, 'developer should be marked as changed'
|
43
|
-
@developer.reload
|
44
|
-
assert_equal previous_salary, @developer.salary
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_touching_a_record_with_default_scope_that_excludes_it_updates_its_timestamp
|
48
|
-
developer = @developer.becomes(DeveloperCalledJamis)
|
49
|
-
|
50
|
-
developer.touch
|
51
|
-
assert_not_equal @previously_updated_at, developer.updated_at
|
52
|
-
developer.reload
|
53
|
-
assert_not_equal @previously_updated_at, developer.updated_at
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_saving_when_record_timestamps_is_false_doesnt_update_its_timestamp
|
57
|
-
Developer.record_timestamps = false
|
58
|
-
@developer.name = "John Smith"
|
59
|
-
@developer.save!
|
60
|
-
|
61
|
-
assert_equal @previously_updated_at, @developer.updated_at
|
62
|
-
ensure
|
63
|
-
Developer.record_timestamps = true
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_saving_when_instance_record_timestamps_is_false_doesnt_update_its_timestamp
|
67
|
-
@developer.record_timestamps = false
|
68
|
-
assert Developer.record_timestamps
|
69
|
-
|
70
|
-
@developer.name = "John Smith"
|
71
|
-
@developer.save!
|
72
|
-
|
73
|
-
assert_equal @previously_updated_at, @developer.updated_at
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_touching_an_attribute_updates_timestamp
|
77
|
-
previously_created_at = @developer.created_at
|
78
|
-
@developer.touch(:created_at)
|
79
|
-
|
80
|
-
assert !@developer.created_at_changed? , 'created_at should not be changed'
|
81
|
-
assert !@developer.changed?, 'record should not be changed'
|
82
|
-
assert_not_equal previously_created_at, @developer.created_at
|
83
|
-
assert_not_equal @previously_updated_at, @developer.updated_at
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_touching_an_attribute_updates_it
|
87
|
-
task = Task.first
|
88
|
-
previous_value = task.ending
|
89
|
-
task.touch(:ending)
|
90
|
-
assert_not_equal previous_value, task.ending
|
91
|
-
assert_in_delta Time.now, task.ending, 1
|
92
|
-
end
|
93
|
-
|
94
|
-
def test_touching_many_attributes_updates_them
|
95
|
-
task = Task.first
|
96
|
-
previous_starting = task.starting
|
97
|
-
previous_ending = task.ending
|
98
|
-
task.touch(:starting, :ending)
|
99
|
-
|
100
|
-
assert_not_equal previous_starting, task.starting
|
101
|
-
assert_not_equal previous_ending, task.ending
|
102
|
-
assert_in_delta Time.now, task.starting, 1
|
103
|
-
assert_in_delta Time.now, task.ending, 1
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_touching_a_record_without_timestamps_is_unexceptional
|
107
|
-
assert_nothing_raised { Car.first.touch }
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_touching_a_no_touching_object
|
111
|
-
Developer.no_touching do
|
112
|
-
assert @developer.no_touching?
|
113
|
-
assert !@owner.no_touching?
|
114
|
-
@developer.touch
|
115
|
-
end
|
116
|
-
|
117
|
-
assert !@developer.no_touching?
|
118
|
-
assert !@owner.no_touching?
|
119
|
-
assert_equal @previously_updated_at, @developer.updated_at
|
120
|
-
end
|
121
|
-
|
122
|
-
def test_touching_related_objects
|
123
|
-
@owner = Owner.first
|
124
|
-
@previously_updated_at = @owner.updated_at
|
125
|
-
|
126
|
-
Owner.no_touching do
|
127
|
-
@owner.pets.first.touch
|
128
|
-
end
|
129
|
-
|
130
|
-
assert_equal @previously_updated_at, @owner.updated_at
|
131
|
-
end
|
132
|
-
|
133
|
-
def test_global_no_touching
|
134
|
-
ActiveRecord::Base.no_touching do
|
135
|
-
assert @developer.no_touching?
|
136
|
-
assert @owner.no_touching?
|
137
|
-
@developer.touch
|
138
|
-
end
|
139
|
-
|
140
|
-
assert !@developer.no_touching?
|
141
|
-
assert !@owner.no_touching?
|
142
|
-
assert_equal @previously_updated_at, @developer.updated_at
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_no_touching_threadsafe
|
146
|
-
Thread.new do
|
147
|
-
Developer.no_touching do
|
148
|
-
assert @developer.no_touching?
|
149
|
-
|
150
|
-
sleep(1)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
assert !@developer.no_touching?
|
155
|
-
end
|
156
|
-
|
157
|
-
def test_no_touching_with_callbacks
|
158
|
-
klass = Class.new(ActiveRecord::Base) do
|
159
|
-
self.table_name = "developers"
|
160
|
-
|
161
|
-
attr_accessor :after_touch_called
|
162
|
-
|
163
|
-
after_touch do |user|
|
164
|
-
user.after_touch_called = true
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
developer = klass.first
|
169
|
-
|
170
|
-
klass.no_touching do
|
171
|
-
developer.touch
|
172
|
-
assert_not developer.after_touch_called
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
|
177
|
-
pet = Pet.first
|
178
|
-
owner = pet.owner
|
179
|
-
previously_owner_updated_at = owner.updated_at
|
180
|
-
|
181
|
-
pet.name = "Fluffy the Third"
|
182
|
-
pet.save
|
183
|
-
|
184
|
-
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
185
|
-
end
|
186
|
-
|
187
|
-
def test_destroying_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
|
188
|
-
pet = Pet.first
|
189
|
-
owner = pet.owner
|
190
|
-
previously_owner_updated_at = owner.updated_at
|
191
|
-
|
192
|
-
pet.destroy
|
193
|
-
|
194
|
-
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
195
|
-
end
|
196
|
-
|
197
|
-
def test_saving_a_new_record_belonging_to_invalid_parent_with_touch_should_not_raise_exception
|
198
|
-
klass = Class.new(Owner) do
|
199
|
-
def self.name; 'Owner'; end
|
200
|
-
validate { errors.add(:base, :invalid) }
|
201
|
-
end
|
202
|
-
|
203
|
-
pet = Pet.new(owner: klass.new)
|
204
|
-
pet.save!
|
205
|
-
|
206
|
-
assert pet.owner.new_record?
|
207
|
-
end
|
208
|
-
|
209
|
-
def test_saving_a_record_with_a_belongs_to_that_specifies_touching_a_specific_attribute_the_parent_should_update_that_attribute
|
210
|
-
klass = Class.new(ActiveRecord::Base) do
|
211
|
-
def self.name; 'Pet'; end
|
212
|
-
belongs_to :owner, :touch => :happy_at
|
213
|
-
end
|
214
|
-
|
215
|
-
pet = klass.first
|
216
|
-
owner = pet.owner
|
217
|
-
previously_owner_happy_at = owner.happy_at
|
218
|
-
|
219
|
-
pet.name = "Fluffy the Third"
|
220
|
-
pet.save
|
221
|
-
|
222
|
-
assert_not_equal previously_owner_happy_at, pet.owner.happy_at
|
223
|
-
end
|
224
|
-
|
225
|
-
def test_touching_a_record_with_a_belongs_to_that_uses_a_counter_cache_should_update_the_parent
|
226
|
-
klass = Class.new(ActiveRecord::Base) do
|
227
|
-
def self.name; 'Pet'; end
|
228
|
-
belongs_to :owner, :counter_cache => :use_count, :touch => true
|
229
|
-
end
|
230
|
-
|
231
|
-
pet = klass.first
|
232
|
-
owner = pet.owner
|
233
|
-
owner.update_columns(happy_at: 3.days.ago)
|
234
|
-
previously_owner_updated_at = owner.updated_at
|
235
|
-
|
236
|
-
pet.name = "I'm a parrot"
|
237
|
-
pet.save
|
238
|
-
|
239
|
-
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
240
|
-
end
|
241
|
-
|
242
|
-
def test_touching_a_record_touches_parent_record_and_grandparent_record
|
243
|
-
klass = Class.new(ActiveRecord::Base) do
|
244
|
-
def self.name; 'Toy'; end
|
245
|
-
belongs_to :pet, :touch => true
|
246
|
-
end
|
247
|
-
|
248
|
-
toy = klass.first
|
249
|
-
pet = toy.pet
|
250
|
-
owner = pet.owner
|
251
|
-
time = 3.days.ago
|
252
|
-
|
253
|
-
owner.update_columns(updated_at: time)
|
254
|
-
toy.touch
|
255
|
-
owner.reload
|
256
|
-
|
257
|
-
assert_not_equal time, owner.updated_at
|
258
|
-
end
|
259
|
-
|
260
|
-
def test_touching_a_record_touches_polymorphic_record
|
261
|
-
klass = Class.new(ActiveRecord::Base) do
|
262
|
-
def self.name; 'Toy'; end
|
263
|
-
end
|
264
|
-
|
265
|
-
wheel_klass = Class.new(ActiveRecord::Base) do
|
266
|
-
def self.name; 'Wheel'; end
|
267
|
-
belongs_to :wheelable, :polymorphic => true, :touch => true
|
268
|
-
end
|
269
|
-
|
270
|
-
toy = klass.first
|
271
|
-
time = 3.days.ago
|
272
|
-
toy.update_columns(updated_at: time)
|
273
|
-
|
274
|
-
wheel = wheel_klass.new
|
275
|
-
wheel.wheelable = toy
|
276
|
-
wheel.save
|
277
|
-
wheel.touch
|
278
|
-
|
279
|
-
assert_not_equal time, toy.updated_at
|
280
|
-
end
|
281
|
-
|
282
|
-
def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record
|
283
|
-
klass = Class.new(ActiveRecord::Base) do
|
284
|
-
def self.name; 'Toy'; end
|
285
|
-
belongs_to :pet, touch: true
|
286
|
-
end
|
287
|
-
|
288
|
-
toy1 = klass.find(1)
|
289
|
-
old_pet = toy1.pet
|
290
|
-
|
291
|
-
toy2 = klass.find(2)
|
292
|
-
new_pet = toy2.pet
|
293
|
-
time = 3.days.ago.at_beginning_of_hour
|
294
|
-
|
295
|
-
old_pet.update_columns(updated_at: time)
|
296
|
-
new_pet.update_columns(updated_at: time)
|
297
|
-
|
298
|
-
toy1.pet = new_pet
|
299
|
-
toy1.save!
|
300
|
-
|
301
|
-
old_pet.reload
|
302
|
-
new_pet.reload
|
303
|
-
|
304
|
-
assert_not_equal time, new_pet.updated_at
|
305
|
-
assert_not_equal time, old_pet.updated_at
|
306
|
-
end
|
307
|
-
|
308
|
-
def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_within_same_class
|
309
|
-
car_class = Class.new(ActiveRecord::Base) do
|
310
|
-
def self.name; 'Car'; end
|
311
|
-
end
|
312
|
-
|
313
|
-
wheel_class = Class.new(ActiveRecord::Base) do
|
314
|
-
def self.name; 'Wheel'; end
|
315
|
-
belongs_to :wheelable, :polymorphic => true, :touch => true
|
316
|
-
end
|
317
|
-
|
318
|
-
car1 = car_class.find(1)
|
319
|
-
car2 = car_class.find(2)
|
320
|
-
|
321
|
-
wheel = wheel_class.create!(wheelable: car1)
|
322
|
-
|
323
|
-
time = 3.days.ago.at_beginning_of_hour
|
324
|
-
|
325
|
-
car1.update_columns(updated_at: time)
|
326
|
-
car2.update_columns(updated_at: time)
|
327
|
-
|
328
|
-
wheel.wheelable = car2
|
329
|
-
wheel.save!
|
330
|
-
|
331
|
-
assert_not_equal time, car1.reload.updated_at
|
332
|
-
assert_not_equal time, car2.reload.updated_at
|
333
|
-
end
|
334
|
-
|
335
|
-
def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_with_other_class
|
336
|
-
car_class = Class.new(ActiveRecord::Base) do
|
337
|
-
def self.name; 'Car'; end
|
338
|
-
end
|
339
|
-
|
340
|
-
toy_class = Class.new(ActiveRecord::Base) do
|
341
|
-
def self.name; 'Toy'; end
|
342
|
-
end
|
343
|
-
|
344
|
-
wheel_class = Class.new(ActiveRecord::Base) do
|
345
|
-
def self.name; 'Wheel'; end
|
346
|
-
belongs_to :wheelable, :polymorphic => true, :touch => true
|
347
|
-
end
|
348
|
-
|
349
|
-
car = car_class.find(1)
|
350
|
-
toy = toy_class.find(3)
|
351
|
-
|
352
|
-
wheel = wheel_class.create!(wheelable: car)
|
353
|
-
|
354
|
-
time = 3.days.ago.at_beginning_of_hour
|
355
|
-
|
356
|
-
car.update_columns(updated_at: time)
|
357
|
-
toy.update_columns(updated_at: time)
|
358
|
-
|
359
|
-
wheel.wheelable = toy
|
360
|
-
wheel.save!
|
361
|
-
|
362
|
-
assert_not_equal time, car.reload.updated_at
|
363
|
-
assert_not_equal time, toy.reload.updated_at
|
364
|
-
end
|
365
|
-
|
366
|
-
def test_clearing_association_touches_the_old_record
|
367
|
-
klass = Class.new(ActiveRecord::Base) do
|
368
|
-
def self.name; 'Toy'; end
|
369
|
-
belongs_to :pet, touch: true
|
370
|
-
end
|
371
|
-
|
372
|
-
toy = klass.find(1)
|
373
|
-
pet = toy.pet
|
374
|
-
time = 3.days.ago.at_beginning_of_hour
|
375
|
-
|
376
|
-
pet.update_columns(updated_at: time)
|
377
|
-
|
378
|
-
toy.pet = nil
|
379
|
-
toy.save!
|
380
|
-
|
381
|
-
pet.reload
|
382
|
-
|
383
|
-
assert_not_equal time, pet.updated_at
|
384
|
-
end
|
385
|
-
|
386
|
-
def test_timestamp_column_values_are_present_in_the_callbacks
|
387
|
-
klass = Class.new(ActiveRecord::Base) do
|
388
|
-
self.table_name = 'people'
|
389
|
-
|
390
|
-
before_create do
|
391
|
-
self.born_at = self.created_at
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
person = klass.create first_name: 'David'
|
396
|
-
assert_not_equal person.born_at, nil
|
397
|
-
end
|
398
|
-
|
399
|
-
def test_timestamp_attributes_for_create
|
400
|
-
toy = Toy.first
|
401
|
-
assert_equal [:created_at, :created_on], toy.send(:timestamp_attributes_for_create)
|
402
|
-
end
|
403
|
-
|
404
|
-
def test_timestamp_attributes_for_update
|
405
|
-
toy = Toy.first
|
406
|
-
assert_equal [:updated_at, :updated_on], toy.send(:timestamp_attributes_for_update)
|
407
|
-
end
|
408
|
-
|
409
|
-
def test_all_timestamp_attributes
|
410
|
-
toy = Toy.first
|
411
|
-
assert_equal [:created_at, :created_on, :updated_at, :updated_on], toy.send(:all_timestamp_attributes)
|
412
|
-
end
|
413
|
-
|
414
|
-
def test_timestamp_attributes_for_create_in_model
|
415
|
-
toy = Toy.first
|
416
|
-
assert_equal [:created_at], toy.send(:timestamp_attributes_for_create_in_model)
|
417
|
-
end
|
418
|
-
|
419
|
-
def test_timestamp_attributes_for_update_in_model
|
420
|
-
toy = Toy.first
|
421
|
-
assert_equal [:updated_at], toy.send(:timestamp_attributes_for_update_in_model)
|
422
|
-
end
|
423
|
-
|
424
|
-
def test_all_timestamp_attributes_in_model
|
425
|
-
toy = Toy.first
|
426
|
-
assert_equal [:created_at, :updated_at], toy.send(:all_timestamp_attributes_in_model)
|
427
|
-
end
|
428
|
-
|
429
|
-
def test_index_is_created_for_both_timestamps
|
430
|
-
ActiveRecord::Base.connection.create_table(:foos, force: true) do |t|
|
431
|
-
t.timestamps(:foos, null: true, index: true)
|
432
|
-
end
|
433
|
-
|
434
|
-
indexes = ActiveRecord::Base.connection.indexes('foos')
|
435
|
-
assert_equal ['created_at', 'updated_at'], indexes.flat_map(&:columns).sort
|
436
|
-
|
437
|
-
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
post
|
456
|
-
post.
|
457
|
-
assert_nil post.
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
post
|
462
|
-
post.
|
463
|
-
assert_nil post.
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
end
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'support/ddl_helper'
|
3
|
+
require 'models/developer'
|
4
|
+
require 'models/computer'
|
5
|
+
require 'models/owner'
|
6
|
+
require 'models/pet'
|
7
|
+
require 'models/toy'
|
8
|
+
require 'models/car'
|
9
|
+
require 'models/task'
|
10
|
+
|
11
|
+
class TimestampTest < ActiveRecord::TestCase
|
12
|
+
fixtures :developers, :owners, :pets, :toys, :cars, :tasks
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@developer = Developer.first
|
16
|
+
@owner = Owner.first
|
17
|
+
@developer.update_columns(updated_at: Time.now.prev_month)
|
18
|
+
@previously_updated_at = @developer.updated_at
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_saving_a_changed_record_updates_its_timestamp
|
22
|
+
@developer.name = "Jack Bauer"
|
23
|
+
@developer.save!
|
24
|
+
|
25
|
+
assert_not_equal @previously_updated_at, @developer.updated_at
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_saving_a_unchanged_record_doesnt_update_its_timestamp
|
29
|
+
@developer.save!
|
30
|
+
|
31
|
+
assert_equal @previously_updated_at, @developer.updated_at
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_touching_a_record_updates_its_timestamp
|
35
|
+
previous_salary = @developer.salary
|
36
|
+
@developer.salary = previous_salary + 10000
|
37
|
+
@developer.touch
|
38
|
+
|
39
|
+
assert_not_equal @previously_updated_at, @developer.updated_at
|
40
|
+
assert_equal previous_salary + 10000, @developer.salary
|
41
|
+
assert @developer.salary_changed?, 'developer salary should have changed'
|
42
|
+
assert @developer.changed?, 'developer should be marked as changed'
|
43
|
+
@developer.reload
|
44
|
+
assert_equal previous_salary, @developer.salary
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_touching_a_record_with_default_scope_that_excludes_it_updates_its_timestamp
|
48
|
+
developer = @developer.becomes(DeveloperCalledJamis)
|
49
|
+
|
50
|
+
developer.touch
|
51
|
+
assert_not_equal @previously_updated_at, developer.updated_at
|
52
|
+
developer.reload
|
53
|
+
assert_not_equal @previously_updated_at, developer.updated_at
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_saving_when_record_timestamps_is_false_doesnt_update_its_timestamp
|
57
|
+
Developer.record_timestamps = false
|
58
|
+
@developer.name = "John Smith"
|
59
|
+
@developer.save!
|
60
|
+
|
61
|
+
assert_equal @previously_updated_at, @developer.updated_at
|
62
|
+
ensure
|
63
|
+
Developer.record_timestamps = true
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_saving_when_instance_record_timestamps_is_false_doesnt_update_its_timestamp
|
67
|
+
@developer.record_timestamps = false
|
68
|
+
assert Developer.record_timestamps
|
69
|
+
|
70
|
+
@developer.name = "John Smith"
|
71
|
+
@developer.save!
|
72
|
+
|
73
|
+
assert_equal @previously_updated_at, @developer.updated_at
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_touching_an_attribute_updates_timestamp
|
77
|
+
previously_created_at = @developer.created_at
|
78
|
+
@developer.touch(:created_at)
|
79
|
+
|
80
|
+
assert !@developer.created_at_changed? , 'created_at should not be changed'
|
81
|
+
assert !@developer.changed?, 'record should not be changed'
|
82
|
+
assert_not_equal previously_created_at, @developer.created_at
|
83
|
+
assert_not_equal @previously_updated_at, @developer.updated_at
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_touching_an_attribute_updates_it
|
87
|
+
task = Task.first
|
88
|
+
previous_value = task.ending
|
89
|
+
task.touch(:ending)
|
90
|
+
assert_not_equal previous_value, task.ending
|
91
|
+
assert_in_delta Time.now, task.ending, 1
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_touching_many_attributes_updates_them
|
95
|
+
task = Task.first
|
96
|
+
previous_starting = task.starting
|
97
|
+
previous_ending = task.ending
|
98
|
+
task.touch(:starting, :ending)
|
99
|
+
|
100
|
+
assert_not_equal previous_starting, task.starting
|
101
|
+
assert_not_equal previous_ending, task.ending
|
102
|
+
assert_in_delta Time.now, task.starting, 1
|
103
|
+
assert_in_delta Time.now, task.ending, 1
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_touching_a_record_without_timestamps_is_unexceptional
|
107
|
+
assert_nothing_raised { Car.first.touch }
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_touching_a_no_touching_object
|
111
|
+
Developer.no_touching do
|
112
|
+
assert @developer.no_touching?
|
113
|
+
assert !@owner.no_touching?
|
114
|
+
@developer.touch
|
115
|
+
end
|
116
|
+
|
117
|
+
assert !@developer.no_touching?
|
118
|
+
assert !@owner.no_touching?
|
119
|
+
assert_equal @previously_updated_at, @developer.updated_at
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_touching_related_objects
|
123
|
+
@owner = Owner.first
|
124
|
+
@previously_updated_at = @owner.updated_at
|
125
|
+
|
126
|
+
Owner.no_touching do
|
127
|
+
@owner.pets.first.touch
|
128
|
+
end
|
129
|
+
|
130
|
+
assert_equal @previously_updated_at, @owner.updated_at
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_global_no_touching
|
134
|
+
ActiveRecord::Base.no_touching do
|
135
|
+
assert @developer.no_touching?
|
136
|
+
assert @owner.no_touching?
|
137
|
+
@developer.touch
|
138
|
+
end
|
139
|
+
|
140
|
+
assert !@developer.no_touching?
|
141
|
+
assert !@owner.no_touching?
|
142
|
+
assert_equal @previously_updated_at, @developer.updated_at
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_no_touching_threadsafe
|
146
|
+
Thread.new do
|
147
|
+
Developer.no_touching do
|
148
|
+
assert @developer.no_touching?
|
149
|
+
|
150
|
+
sleep(1)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
assert !@developer.no_touching?
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_no_touching_with_callbacks
|
158
|
+
klass = Class.new(ActiveRecord::Base) do
|
159
|
+
self.table_name = "developers"
|
160
|
+
|
161
|
+
attr_accessor :after_touch_called
|
162
|
+
|
163
|
+
after_touch do |user|
|
164
|
+
user.after_touch_called = true
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
developer = klass.first
|
169
|
+
|
170
|
+
klass.no_touching do
|
171
|
+
developer.touch
|
172
|
+
assert_not developer.after_touch_called
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
|
177
|
+
pet = Pet.first
|
178
|
+
owner = pet.owner
|
179
|
+
previously_owner_updated_at = owner.updated_at
|
180
|
+
|
181
|
+
pet.name = "Fluffy the Third"
|
182
|
+
pet.save
|
183
|
+
|
184
|
+
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_destroying_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
|
188
|
+
pet = Pet.first
|
189
|
+
owner = pet.owner
|
190
|
+
previously_owner_updated_at = owner.updated_at
|
191
|
+
|
192
|
+
pet.destroy
|
193
|
+
|
194
|
+
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_saving_a_new_record_belonging_to_invalid_parent_with_touch_should_not_raise_exception
|
198
|
+
klass = Class.new(Owner) do
|
199
|
+
def self.name; 'Owner'; end
|
200
|
+
validate { errors.add(:base, :invalid) }
|
201
|
+
end
|
202
|
+
|
203
|
+
pet = Pet.new(owner: klass.new)
|
204
|
+
pet.save!
|
205
|
+
|
206
|
+
assert pet.owner.new_record?
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_saving_a_record_with_a_belongs_to_that_specifies_touching_a_specific_attribute_the_parent_should_update_that_attribute
|
210
|
+
klass = Class.new(ActiveRecord::Base) do
|
211
|
+
def self.name; 'Pet'; end
|
212
|
+
belongs_to :owner, :touch => :happy_at
|
213
|
+
end
|
214
|
+
|
215
|
+
pet = klass.first
|
216
|
+
owner = pet.owner
|
217
|
+
previously_owner_happy_at = owner.happy_at
|
218
|
+
|
219
|
+
pet.name = "Fluffy the Third"
|
220
|
+
pet.save
|
221
|
+
|
222
|
+
assert_not_equal previously_owner_happy_at, pet.owner.happy_at
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_touching_a_record_with_a_belongs_to_that_uses_a_counter_cache_should_update_the_parent
|
226
|
+
klass = Class.new(ActiveRecord::Base) do
|
227
|
+
def self.name; 'Pet'; end
|
228
|
+
belongs_to :owner, :counter_cache => :use_count, :touch => true
|
229
|
+
end
|
230
|
+
|
231
|
+
pet = klass.first
|
232
|
+
owner = pet.owner
|
233
|
+
owner.update_columns(happy_at: 3.days.ago)
|
234
|
+
previously_owner_updated_at = owner.updated_at
|
235
|
+
|
236
|
+
pet.name = "I'm a parrot"
|
237
|
+
pet.save
|
238
|
+
|
239
|
+
assert_not_equal previously_owner_updated_at, pet.owner.updated_at
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_touching_a_record_touches_parent_record_and_grandparent_record
|
243
|
+
klass = Class.new(ActiveRecord::Base) do
|
244
|
+
def self.name; 'Toy'; end
|
245
|
+
belongs_to :pet, :touch => true
|
246
|
+
end
|
247
|
+
|
248
|
+
toy = klass.first
|
249
|
+
pet = toy.pet
|
250
|
+
owner = pet.owner
|
251
|
+
time = 3.days.ago
|
252
|
+
|
253
|
+
owner.update_columns(updated_at: time)
|
254
|
+
toy.touch
|
255
|
+
owner.reload
|
256
|
+
|
257
|
+
assert_not_equal time, owner.updated_at
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_touching_a_record_touches_polymorphic_record
|
261
|
+
klass = Class.new(ActiveRecord::Base) do
|
262
|
+
def self.name; 'Toy'; end
|
263
|
+
end
|
264
|
+
|
265
|
+
wheel_klass = Class.new(ActiveRecord::Base) do
|
266
|
+
def self.name; 'Wheel'; end
|
267
|
+
belongs_to :wheelable, :polymorphic => true, :touch => true
|
268
|
+
end
|
269
|
+
|
270
|
+
toy = klass.first
|
271
|
+
time = 3.days.ago
|
272
|
+
toy.update_columns(updated_at: time)
|
273
|
+
|
274
|
+
wheel = wheel_klass.new
|
275
|
+
wheel.wheelable = toy
|
276
|
+
wheel.save
|
277
|
+
wheel.touch
|
278
|
+
|
279
|
+
assert_not_equal time, toy.updated_at
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record
|
283
|
+
klass = Class.new(ActiveRecord::Base) do
|
284
|
+
def self.name; 'Toy'; end
|
285
|
+
belongs_to :pet, touch: true
|
286
|
+
end
|
287
|
+
|
288
|
+
toy1 = klass.find(1)
|
289
|
+
old_pet = toy1.pet
|
290
|
+
|
291
|
+
toy2 = klass.find(2)
|
292
|
+
new_pet = toy2.pet
|
293
|
+
time = 3.days.ago.at_beginning_of_hour
|
294
|
+
|
295
|
+
old_pet.update_columns(updated_at: time)
|
296
|
+
new_pet.update_columns(updated_at: time)
|
297
|
+
|
298
|
+
toy1.pet = new_pet
|
299
|
+
toy1.save!
|
300
|
+
|
301
|
+
old_pet.reload
|
302
|
+
new_pet.reload
|
303
|
+
|
304
|
+
assert_not_equal time, new_pet.updated_at
|
305
|
+
assert_not_equal time, old_pet.updated_at
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_within_same_class
|
309
|
+
car_class = Class.new(ActiveRecord::Base) do
|
310
|
+
def self.name; 'Car'; end
|
311
|
+
end
|
312
|
+
|
313
|
+
wheel_class = Class.new(ActiveRecord::Base) do
|
314
|
+
def self.name; 'Wheel'; end
|
315
|
+
belongs_to :wheelable, :polymorphic => true, :touch => true
|
316
|
+
end
|
317
|
+
|
318
|
+
car1 = car_class.find(1)
|
319
|
+
car2 = car_class.find(2)
|
320
|
+
|
321
|
+
wheel = wheel_class.create!(wheelable: car1)
|
322
|
+
|
323
|
+
time = 3.days.ago.at_beginning_of_hour
|
324
|
+
|
325
|
+
car1.update_columns(updated_at: time)
|
326
|
+
car2.update_columns(updated_at: time)
|
327
|
+
|
328
|
+
wheel.wheelable = car2
|
329
|
+
wheel.save!
|
330
|
+
|
331
|
+
assert_not_equal time, car1.reload.updated_at
|
332
|
+
assert_not_equal time, car2.reload.updated_at
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_with_other_class
|
336
|
+
car_class = Class.new(ActiveRecord::Base) do
|
337
|
+
def self.name; 'Car'; end
|
338
|
+
end
|
339
|
+
|
340
|
+
toy_class = Class.new(ActiveRecord::Base) do
|
341
|
+
def self.name; 'Toy'; end
|
342
|
+
end
|
343
|
+
|
344
|
+
wheel_class = Class.new(ActiveRecord::Base) do
|
345
|
+
def self.name; 'Wheel'; end
|
346
|
+
belongs_to :wheelable, :polymorphic => true, :touch => true
|
347
|
+
end
|
348
|
+
|
349
|
+
car = car_class.find(1)
|
350
|
+
toy = toy_class.find(3)
|
351
|
+
|
352
|
+
wheel = wheel_class.create!(wheelable: car)
|
353
|
+
|
354
|
+
time = 3.days.ago.at_beginning_of_hour
|
355
|
+
|
356
|
+
car.update_columns(updated_at: time)
|
357
|
+
toy.update_columns(updated_at: time)
|
358
|
+
|
359
|
+
wheel.wheelable = toy
|
360
|
+
wheel.save!
|
361
|
+
|
362
|
+
assert_not_equal time, car.reload.updated_at
|
363
|
+
assert_not_equal time, toy.reload.updated_at
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_clearing_association_touches_the_old_record
|
367
|
+
klass = Class.new(ActiveRecord::Base) do
|
368
|
+
def self.name; 'Toy'; end
|
369
|
+
belongs_to :pet, touch: true
|
370
|
+
end
|
371
|
+
|
372
|
+
toy = klass.find(1)
|
373
|
+
pet = toy.pet
|
374
|
+
time = 3.days.ago.at_beginning_of_hour
|
375
|
+
|
376
|
+
pet.update_columns(updated_at: time)
|
377
|
+
|
378
|
+
toy.pet = nil
|
379
|
+
toy.save!
|
380
|
+
|
381
|
+
pet.reload
|
382
|
+
|
383
|
+
assert_not_equal time, pet.updated_at
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_timestamp_column_values_are_present_in_the_callbacks
|
387
|
+
klass = Class.new(ActiveRecord::Base) do
|
388
|
+
self.table_name = 'people'
|
389
|
+
|
390
|
+
before_create do
|
391
|
+
self.born_at = self.created_at
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
person = klass.create first_name: 'David'
|
396
|
+
assert_not_equal person.born_at, nil
|
397
|
+
end
|
398
|
+
|
399
|
+
def test_timestamp_attributes_for_create
|
400
|
+
toy = Toy.first
|
401
|
+
assert_equal [:created_at, :created_on], toy.send(:timestamp_attributes_for_create)
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_timestamp_attributes_for_update
|
405
|
+
toy = Toy.first
|
406
|
+
assert_equal [:updated_at, :updated_on], toy.send(:timestamp_attributes_for_update)
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_all_timestamp_attributes
|
410
|
+
toy = Toy.first
|
411
|
+
assert_equal [:created_at, :created_on, :updated_at, :updated_on], toy.send(:all_timestamp_attributes)
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_timestamp_attributes_for_create_in_model
|
415
|
+
toy = Toy.first
|
416
|
+
assert_equal [:created_at], toy.send(:timestamp_attributes_for_create_in_model)
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_timestamp_attributes_for_update_in_model
|
420
|
+
toy = Toy.first
|
421
|
+
assert_equal [:updated_at], toy.send(:timestamp_attributes_for_update_in_model)
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_all_timestamp_attributes_in_model
|
425
|
+
toy = Toy.first
|
426
|
+
assert_equal [:created_at, :updated_at], toy.send(:all_timestamp_attributes_in_model)
|
427
|
+
end
|
428
|
+
|
429
|
+
def test_index_is_created_for_both_timestamps
|
430
|
+
ActiveRecord::Base.connection.create_table(:foos, force: true) do |t|
|
431
|
+
t.timestamps(:foos, null: true, index: true)
|
432
|
+
end
|
433
|
+
|
434
|
+
indexes = ActiveRecord::Base.connection.indexes('foos')
|
435
|
+
assert_equal ['created_at', 'updated_at'], indexes.flat_map(&:columns).sort
|
436
|
+
ensure
|
437
|
+
ActiveRecord::Base.connection.drop_table(:foos)
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
class TimestampsWithoutTransactionTest < ActiveRecord::TestCase
|
442
|
+
include DdlHelper
|
443
|
+
self.use_transactional_fixtures = false
|
444
|
+
|
445
|
+
class TimestampAttributePost < ActiveRecord::Base
|
446
|
+
attr_accessor :created_at, :updated_at
|
447
|
+
end
|
448
|
+
|
449
|
+
def test_do_not_write_timestamps_on_save_if_they_are_not_attributes
|
450
|
+
if current_adapter?(:IBM_DBAdapter)
|
451
|
+
ActiveRecord::Base.connection.create_table :timestamp_attribute_posts, force: true, id: false do |t|
|
452
|
+
t.primary_key :id
|
453
|
+
end
|
454
|
+
post = TimestampAttributePost.new(id: 1)
|
455
|
+
post.save! # should not try to assign and persist created_at, updated_at
|
456
|
+
assert_nil post.created_at
|
457
|
+
assert_nil post.updated_at
|
458
|
+
else
|
459
|
+
with_example_table ActiveRecord::Base.connection, "timestamp_attribute_posts", "id integer primary key" do
|
460
|
+
post = TimestampAttributePost.new(id: 1)
|
461
|
+
post.save! # should not try to assign and persist created_at, updated_at
|
462
|
+
assert_nil post.created_at
|
463
|
+
assert_nil post.updated_at
|
464
|
+
end
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|