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,104 +1,104 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/contact'
|
3
|
-
require 'models/topic'
|
4
|
-
require 'models/book'
|
5
|
-
require 'models/author'
|
6
|
-
require 'models/post'
|
7
|
-
|
8
|
-
class SerializationTest < ActiveRecord::TestCase
|
9
|
-
fixtures :books
|
10
|
-
|
11
|
-
FORMATS = [ :xml, :json ]
|
12
|
-
|
13
|
-
def setup
|
14
|
-
@contact_attributes = {
|
15
|
-
:name => 'aaron stack',
|
16
|
-
:age => 25,
|
17
|
-
:avatar => 'binarydata',
|
18
|
-
:created_at => Time.utc(2006, 8, 1),
|
19
|
-
:awesome => false,
|
20
|
-
:preferences => { :gem => '<strong>ruby</strong>' },
|
21
|
-
:alternative_id => nil,
|
22
|
-
:id => nil
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_include_root_in_json_is_false_by_default
|
27
|
-
assert_equal false, ActiveRecord::Base.include_root_in_json, "include_root_in_json should be false by default but was not"
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_serialize_should_be_reversible
|
31
|
-
FORMATS.each do |format|
|
32
|
-
@serialized = Contact.new.send("to_#{format}")
|
33
|
-
contact = Contact.new.send("from_#{format}", @serialized)
|
34
|
-
|
35
|
-
assert_equal @contact_attributes.keys.collect(&:to_s).sort, contact.attributes.keys.collect(&:to_s).sort, "For #{format}"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_serialize_should_allow_attribute_only_filtering
|
40
|
-
FORMATS.each do |format|
|
41
|
-
@serialized = Contact.new(@contact_attributes).send("to_#{format}", :only => [ :age, :name ])
|
42
|
-
contact = Contact.new.send("from_#{format}", @serialized)
|
43
|
-
assert_equal @contact_attributes[:name], contact.name, "For #{format}"
|
44
|
-
assert_nil contact.avatar, "For #{format}"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_serialize_should_allow_attribute_except_filtering
|
49
|
-
FORMATS.each do |format|
|
50
|
-
@serialized = Contact.new(@contact_attributes).send("to_#{format}", :except => [ :age, :name ])
|
51
|
-
contact = Contact.new.send("from_#{format}", @serialized)
|
52
|
-
assert_nil contact.name, "For #{format}"
|
53
|
-
assert_nil contact.age, "For #{format}"
|
54
|
-
assert_equal @contact_attributes[:awesome], contact.awesome, "For #{format}"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_include_root_in_json_allows_inheritance
|
59
|
-
original_root_in_json = ActiveRecord::Base.include_root_in_json
|
60
|
-
ActiveRecord::Base.include_root_in_json = true
|
61
|
-
|
62
|
-
klazz = Class.new(ActiveRecord::Base)
|
63
|
-
klazz.table_name = 'topics'
|
64
|
-
assert klazz.include_root_in_json
|
65
|
-
|
66
|
-
klazz.include_root_in_json = false
|
67
|
-
assert ActiveRecord::Base.include_root_in_json
|
68
|
-
assert !klazz.include_root_in_json
|
69
|
-
assert !klazz.new.include_root_in_json
|
70
|
-
ensure
|
71
|
-
ActiveRecord::Base.include_root_in_json = original_root_in_json
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_read_attribute_for_serialization_with_format_without_method_missing
|
75
|
-
klazz = Class.new(ActiveRecord::Base)
|
76
|
-
klazz.table_name = 'books'
|
77
|
-
|
78
|
-
book = klazz.new
|
79
|
-
assert_nil book.read_attribute_for_serialization(:format)
|
80
|
-
end
|
81
|
-
|
82
|
-
def test_read_attribute_for_serialization_with_format_after_init
|
83
|
-
klazz = Class.new(ActiveRecord::Base)
|
84
|
-
klazz.table_name = 'books'
|
85
|
-
|
86
|
-
book = klazz.new(format: 'paperback')
|
87
|
-
assert_equal 'paperback', book.read_attribute_for_serialization(:format)
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_read_attribute_for_serialization_with_format_after_find
|
91
|
-
klazz = Class.new(ActiveRecord::Base)
|
92
|
-
klazz.table_name = 'books'
|
93
|
-
|
94
|
-
book = klazz.find(books(:awdr).id)
|
95
|
-
assert_equal 'paperback', book.read_attribute_for_serialization(:format)
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_find_records_by_serialized_attributes_through_join
|
99
|
-
author = Author.create!(name: "David")
|
100
|
-
author.serialized_posts.create!(title: "Hello")
|
101
|
-
|
102
|
-
assert_equal 1, Author.joins(:serialized_posts).where(name: "David", serialized_posts: { title: "Hello" }).length
|
103
|
-
end
|
104
|
-
end
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/contact'
|
3
|
+
require 'models/topic'
|
4
|
+
require 'models/book'
|
5
|
+
require 'models/author'
|
6
|
+
require 'models/post'
|
7
|
+
|
8
|
+
class SerializationTest < ActiveRecord::TestCase
|
9
|
+
fixtures :books
|
10
|
+
|
11
|
+
FORMATS = [ :xml, :json ]
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@contact_attributes = {
|
15
|
+
:name => 'aaron stack',
|
16
|
+
:age => 25,
|
17
|
+
:avatar => 'binarydata',
|
18
|
+
:created_at => Time.utc(2006, 8, 1),
|
19
|
+
:awesome => false,
|
20
|
+
:preferences => { :gem => '<strong>ruby</strong>' },
|
21
|
+
:alternative_id => nil,
|
22
|
+
:id => nil
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_include_root_in_json_is_false_by_default
|
27
|
+
assert_equal false, ActiveRecord::Base.include_root_in_json, "include_root_in_json should be false by default but was not"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_serialize_should_be_reversible
|
31
|
+
FORMATS.each do |format|
|
32
|
+
@serialized = Contact.new.send("to_#{format}")
|
33
|
+
contact = Contact.new.send("from_#{format}", @serialized)
|
34
|
+
|
35
|
+
assert_equal @contact_attributes.keys.collect(&:to_s).sort, contact.attributes.keys.collect(&:to_s).sort, "For #{format}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_serialize_should_allow_attribute_only_filtering
|
40
|
+
FORMATS.each do |format|
|
41
|
+
@serialized = Contact.new(@contact_attributes).send("to_#{format}", :only => [ :age, :name ])
|
42
|
+
contact = Contact.new.send("from_#{format}", @serialized)
|
43
|
+
assert_equal @contact_attributes[:name], contact.name, "For #{format}"
|
44
|
+
assert_nil contact.avatar, "For #{format}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_serialize_should_allow_attribute_except_filtering
|
49
|
+
FORMATS.each do |format|
|
50
|
+
@serialized = Contact.new(@contact_attributes).send("to_#{format}", :except => [ :age, :name ])
|
51
|
+
contact = Contact.new.send("from_#{format}", @serialized)
|
52
|
+
assert_nil contact.name, "For #{format}"
|
53
|
+
assert_nil contact.age, "For #{format}"
|
54
|
+
assert_equal @contact_attributes[:awesome], contact.awesome, "For #{format}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_include_root_in_json_allows_inheritance
|
59
|
+
original_root_in_json = ActiveRecord::Base.include_root_in_json
|
60
|
+
ActiveRecord::Base.include_root_in_json = true
|
61
|
+
|
62
|
+
klazz = Class.new(ActiveRecord::Base)
|
63
|
+
klazz.table_name = 'topics'
|
64
|
+
assert klazz.include_root_in_json
|
65
|
+
|
66
|
+
klazz.include_root_in_json = false
|
67
|
+
assert ActiveRecord::Base.include_root_in_json
|
68
|
+
assert !klazz.include_root_in_json
|
69
|
+
assert !klazz.new.include_root_in_json
|
70
|
+
ensure
|
71
|
+
ActiveRecord::Base.include_root_in_json = original_root_in_json
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_read_attribute_for_serialization_with_format_without_method_missing
|
75
|
+
klazz = Class.new(ActiveRecord::Base)
|
76
|
+
klazz.table_name = 'books'
|
77
|
+
|
78
|
+
book = klazz.new
|
79
|
+
assert_nil book.read_attribute_for_serialization(:format)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_read_attribute_for_serialization_with_format_after_init
|
83
|
+
klazz = Class.new(ActiveRecord::Base)
|
84
|
+
klazz.table_name = 'books'
|
85
|
+
|
86
|
+
book = klazz.new(format: 'paperback')
|
87
|
+
assert_equal 'paperback', book.read_attribute_for_serialization(:format)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_read_attribute_for_serialization_with_format_after_find
|
91
|
+
klazz = Class.new(ActiveRecord::Base)
|
92
|
+
klazz.table_name = 'books'
|
93
|
+
|
94
|
+
book = klazz.find(books(:awdr).id)
|
95
|
+
assert_equal 'paperback', book.read_attribute_for_serialization(:format)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_find_records_by_serialized_attributes_through_join
|
99
|
+
author = Author.create!(name: "David")
|
100
|
+
author.serialized_posts.create!(title: "Hello")
|
101
|
+
|
102
|
+
assert_equal 1, Author.joins(:serialized_posts).where(name: "David", serialized_posts: { title: "Hello" }).length
|
103
|
+
end
|
104
|
+
end
|
@@ -1,277 +1,277 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'models/topic'
|
3
|
-
require 'models/reply'
|
4
|
-
require 'models/person'
|
5
|
-
require 'models/traffic_light'
|
6
|
-
require 'models/post'
|
7
|
-
require 'bcrypt'
|
8
|
-
|
9
|
-
class SerializedAttributeTest < ActiveRecord::TestCase
|
10
|
-
fixtures :topics, :posts
|
11
|
-
|
12
|
-
MyObject = Struct.new :attribute1, :attribute2
|
13
|
-
|
14
|
-
teardown do
|
15
|
-
Topic.serialize("content")
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_serialize_does_not_eagerly_load_columns
|
19
|
-
Topic.reset_column_information
|
20
|
-
assert_no_queries do
|
21
|
-
Topic.serialize(:content)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_list_of_serialized_attributes
|
26
|
-
assert_deprecated do
|
27
|
-
assert_equal %w(content), Topic.serialized_attributes.keys
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_serialized_attribute
|
32
|
-
Topic.serialize("content", MyObject)
|
33
|
-
|
34
|
-
myobj = MyObject.new('value1', 'value2')
|
35
|
-
topic = Topic.create("content" => myobj)
|
36
|
-
assert_equal(myobj, topic.content)
|
37
|
-
|
38
|
-
topic.reload
|
39
|
-
assert_equal(myobj, topic.content)
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_serialized_attribute_in_base_class
|
43
|
-
Topic.serialize("content", Hash)
|
44
|
-
|
45
|
-
hash = { 'content1' => 'value1', 'content2' => 'value2' }
|
46
|
-
important_topic = ImportantTopic.create("content" => hash)
|
47
|
-
assert_equal(hash, important_topic.content)
|
48
|
-
|
49
|
-
important_topic.reload
|
50
|
-
assert_equal(hash, important_topic.content)
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_serialized_attributes_from_database_on_subclass
|
54
|
-
Topic.serialize :content, Hash
|
55
|
-
|
56
|
-
t = Reply.new(content: { foo: :bar })
|
57
|
-
assert_equal({ foo: :bar }, t.content)
|
58
|
-
t.save!
|
59
|
-
t = Reply.last
|
60
|
-
assert_equal({ foo: :bar }, t.content)
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_serialized_attribute_calling_dup_method
|
64
|
-
Topic.serialize :content, JSON
|
65
|
-
|
66
|
-
orig = Topic.new(content: { foo: :bar })
|
67
|
-
clone = orig.dup
|
68
|
-
assert_equal(orig.content, clone.content)
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_serialized_json_attribute_returns_unserialized_value
|
72
|
-
Topic.serialize :content, JSON
|
73
|
-
my_post = posts(:welcome)
|
74
|
-
|
75
|
-
t = Topic.new(content: my_post)
|
76
|
-
t.save!
|
77
|
-
t.reload
|
78
|
-
|
79
|
-
assert_instance_of(Hash, t.content)
|
80
|
-
assert_equal(my_post.id, t.content["id"])
|
81
|
-
assert_equal(my_post.title, t.content["title"])
|
82
|
-
end
|
83
|
-
|
84
|
-
def test_json_read_legacy_null
|
85
|
-
Topic.serialize :content, JSON
|
86
|
-
|
87
|
-
# Force a row to have a JSON "null" instead of a database NULL (this is how
|
88
|
-
# null values are saved on 4.1 and before)
|
89
|
-
id = Topic.connection.insert "INSERT INTO topics (content) VALUES('null')"
|
90
|
-
t = Topic.find(id)
|
91
|
-
|
92
|
-
assert_nil t.content
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_json_read_db_null
|
96
|
-
Topic.serialize :content, JSON
|
97
|
-
|
98
|
-
# Force a row to have a database NULL instead of a JSON "null"
|
99
|
-
id = Topic.connection.insert "INSERT INTO topics (content) VALUES(NULL)"
|
100
|
-
t = Topic.find(id)
|
101
|
-
|
102
|
-
assert_nil t.content
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_serialized_attribute_declared_in_subclass
|
106
|
-
hash = { 'important1' => 'value1', 'important2' => 'value2' }
|
107
|
-
important_topic = ImportantTopic.create("important" => hash)
|
108
|
-
assert_equal(hash, important_topic.important)
|
109
|
-
|
110
|
-
important_topic.reload
|
111
|
-
assert_equal(hash, important_topic.important)
|
112
|
-
assert_equal(hash, important_topic.read_attribute(:important))
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_serialized_time_attribute
|
116
|
-
myobj = Time.local(2008,1,1,1,0)
|
117
|
-
topic = Topic.create("content" => myobj).reload
|
118
|
-
assert_equal(myobj, topic.content)
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_serialized_string_attribute
|
122
|
-
myobj = "Yes"
|
123
|
-
topic = Topic.create("content" => myobj).reload
|
124
|
-
assert_equal(myobj, topic.content)
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_nil_serialized_attribute_without_class_constraint
|
128
|
-
topic = Topic.new
|
129
|
-
assert_nil topic.content
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_nil_not_serialized_without_class_constraint
|
133
|
-
assert Topic.new(:content => nil).save
|
134
|
-
assert_equal 1, Topic.where(:content => nil).count
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_nil_not_serialized_with_class_constraint
|
138
|
-
Topic.serialize :content, Hash
|
139
|
-
assert Topic.new(:content => nil).save
|
140
|
-
assert_equal 1, Topic.where(:content => nil).count
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
|
144
|
-
Topic.serialize(:content, Hash)
|
145
|
-
assert_raise(ActiveRecord::SerializationTypeMismatch) do
|
146
|
-
Topic.new(content: 'string')
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
|
151
|
-
myobj = MyObject.new('value1', 'value2')
|
152
|
-
topic = Topic.new(:content => myobj)
|
153
|
-
assert topic.save
|
154
|
-
Topic.serialize(:content, Hash)
|
155
|
-
assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_serialized_attribute_with_class_constraint
|
159
|
-
settings = { "color" => "blue" }
|
160
|
-
Topic.serialize(:content, Hash)
|
161
|
-
topic = Topic.new(:content => settings)
|
162
|
-
assert topic.save
|
163
|
-
assert_equal(settings, Topic.find(topic.id).content)
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_serialized_default_class
|
167
|
-
Topic.serialize(:content, Hash)
|
168
|
-
topic = Topic.new
|
169
|
-
assert_equal Hash, topic.content.class
|
170
|
-
assert_equal Hash, topic.read_attribute(:content).class
|
171
|
-
topic.content["beer"] = "MadridRb"
|
172
|
-
assert topic.save
|
173
|
-
topic.reload
|
174
|
-
assert_equal Hash, topic.content.class
|
175
|
-
assert_equal "MadridRb", topic.content["beer"]
|
176
|
-
end
|
177
|
-
|
178
|
-
def test_serialized_no_default_class_for_object
|
179
|
-
topic = Topic.new
|
180
|
-
assert_nil topic.content
|
181
|
-
end
|
182
|
-
|
183
|
-
def test_serialized_boolean_value_true
|
184
|
-
topic = Topic.new(:content => true)
|
185
|
-
assert topic.save
|
186
|
-
topic = topic.reload
|
187
|
-
assert_equal topic.content, true
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_serialized_boolean_value_false
|
191
|
-
topic = Topic.new(:content => false)
|
192
|
-
assert topic.save
|
193
|
-
topic = topic.reload
|
194
|
-
assert_equal topic.content, false
|
195
|
-
end
|
196
|
-
|
197
|
-
def test_serialize_with_coder
|
198
|
-
some_class = Struct.new(:foo) do
|
199
|
-
def self.dump(value)
|
200
|
-
value.foo
|
201
|
-
end
|
202
|
-
|
203
|
-
def self.load(value)
|
204
|
-
new(value)
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
Topic.serialize(:content, some_class)
|
209
|
-
topic = Topic.new(:content => some_class.new('my value'))
|
210
|
-
topic.save!
|
211
|
-
topic.reload
|
212
|
-
assert_kind_of some_class, topic.content
|
213
|
-
assert_equal topic.content, some_class.new('my value')
|
214
|
-
end
|
215
|
-
|
216
|
-
def test_serialize_attribute_via_select_method_when_time_zone_available
|
217
|
-
with_timezone_config aware_attributes: true do
|
218
|
-
Topic.serialize(:content, MyObject)
|
219
|
-
|
220
|
-
myobj = MyObject.new('value1', 'value2')
|
221
|
-
topic = Topic.create(content: myobj)
|
222
|
-
|
223
|
-
assert_equal(myobj, Topic.select(:content).find(topic.id).content)
|
224
|
-
assert_raise(ActiveModel::MissingAttributeError) { Topic.select(:id).find(topic.id).content }
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
def test_serialize_attribute_can_be_serialized_in_an_integer_column
|
229
|
-
insures = ['life']
|
230
|
-
person = SerializedPerson.new(first_name: 'David', insures: insures)
|
231
|
-
assert person.save
|
232
|
-
person = person.reload
|
233
|
-
assert_equal(insures, person.insures)
|
234
|
-
end
|
235
|
-
|
236
|
-
def test_regression_serialized_default_on_text_column_with_null_false
|
237
|
-
light = TrafficLight.new
|
238
|
-
assert_equal [], light.state
|
239
|
-
assert_equal [], light.long_state
|
240
|
-
end
|
241
|
-
|
242
|
-
def test_serialized_column_should_unserialize_after_update_column
|
243
|
-
t = Topic.create(content: "first")
|
244
|
-
assert_equal("first", t.content)
|
245
|
-
|
246
|
-
t.update_column(:content, ["second"])
|
247
|
-
assert_equal(["second"], t.content)
|
248
|
-
assert_equal(["second"], t.reload.content)
|
249
|
-
end
|
250
|
-
|
251
|
-
def test_serialized_column_should_unserialize_after_update_attribute
|
252
|
-
t = Topic.create(content: "first")
|
253
|
-
assert_equal("first", t.content)
|
254
|
-
|
255
|
-
t.update_attribute(:content, "second")
|
256
|
-
assert_equal("second", t.content)
|
257
|
-
assert_equal("second", t.reload.content)
|
258
|
-
end
|
259
|
-
|
260
|
-
def test_nil_is_not_changed_when_serialized_with_a_class
|
261
|
-
Topic.serialize(:content, Array)
|
262
|
-
|
263
|
-
topic = Topic.new(content: nil)
|
264
|
-
|
265
|
-
assert_not topic.content_changed?
|
266
|
-
end
|
267
|
-
|
268
|
-
def test_newly_emptied_serialized_hash_is_changed
|
269
|
-
Topic.serialize(:content, Hash)
|
270
|
-
topic = Topic.create(content: { "things" => "stuff" })
|
271
|
-
topic.content.delete("things")
|
272
|
-
topic.save!
|
273
|
-
topic.reload
|
274
|
-
|
275
|
-
assert_equal({}, topic.content)
|
276
|
-
end
|
277
|
-
end
|
1
|
+
require 'cases/helper'
|
2
|
+
require 'models/topic'
|
3
|
+
require 'models/reply'
|
4
|
+
require 'models/person'
|
5
|
+
require 'models/traffic_light'
|
6
|
+
require 'models/post'
|
7
|
+
require 'bcrypt'
|
8
|
+
|
9
|
+
class SerializedAttributeTest < ActiveRecord::TestCase
|
10
|
+
fixtures :topics, :posts
|
11
|
+
|
12
|
+
MyObject = Struct.new :attribute1, :attribute2
|
13
|
+
|
14
|
+
teardown do
|
15
|
+
Topic.serialize("content")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_serialize_does_not_eagerly_load_columns
|
19
|
+
Topic.reset_column_information
|
20
|
+
assert_no_queries do
|
21
|
+
Topic.serialize(:content)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_list_of_serialized_attributes
|
26
|
+
assert_deprecated do
|
27
|
+
assert_equal %w(content), Topic.serialized_attributes.keys
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_serialized_attribute
|
32
|
+
Topic.serialize("content", MyObject)
|
33
|
+
|
34
|
+
myobj = MyObject.new('value1', 'value2')
|
35
|
+
topic = Topic.create("content" => myobj)
|
36
|
+
assert_equal(myobj, topic.content)
|
37
|
+
|
38
|
+
topic.reload
|
39
|
+
assert_equal(myobj, topic.content)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_serialized_attribute_in_base_class
|
43
|
+
Topic.serialize("content", Hash)
|
44
|
+
|
45
|
+
hash = { 'content1' => 'value1', 'content2' => 'value2' }
|
46
|
+
important_topic = ImportantTopic.create("content" => hash)
|
47
|
+
assert_equal(hash, important_topic.content)
|
48
|
+
|
49
|
+
important_topic.reload
|
50
|
+
assert_equal(hash, important_topic.content)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_serialized_attributes_from_database_on_subclass
|
54
|
+
Topic.serialize :content, Hash
|
55
|
+
|
56
|
+
t = Reply.new(content: { foo: :bar })
|
57
|
+
assert_equal({ foo: :bar }, t.content)
|
58
|
+
t.save!
|
59
|
+
t = Reply.last
|
60
|
+
assert_equal({ foo: :bar }, t.content)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_serialized_attribute_calling_dup_method
|
64
|
+
Topic.serialize :content, JSON
|
65
|
+
|
66
|
+
orig = Topic.new(content: { foo: :bar })
|
67
|
+
clone = orig.dup
|
68
|
+
assert_equal(orig.content, clone.content)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_serialized_json_attribute_returns_unserialized_value
|
72
|
+
Topic.serialize :content, JSON
|
73
|
+
my_post = posts(:welcome)
|
74
|
+
|
75
|
+
t = Topic.new(content: my_post)
|
76
|
+
t.save!
|
77
|
+
t.reload
|
78
|
+
|
79
|
+
assert_instance_of(Hash, t.content)
|
80
|
+
assert_equal(my_post.id, t.content["id"])
|
81
|
+
assert_equal(my_post.title, t.content["title"])
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_json_read_legacy_null
|
85
|
+
Topic.serialize :content, JSON
|
86
|
+
|
87
|
+
# Force a row to have a JSON "null" instead of a database NULL (this is how
|
88
|
+
# null values are saved on 4.1 and before)
|
89
|
+
id = Topic.connection.insert "INSERT INTO topics (content) VALUES('null')"
|
90
|
+
t = Topic.find(id)
|
91
|
+
|
92
|
+
assert_nil t.content
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_json_read_db_null
|
96
|
+
Topic.serialize :content, JSON
|
97
|
+
|
98
|
+
# Force a row to have a database NULL instead of a JSON "null"
|
99
|
+
id = Topic.connection.insert "INSERT INTO topics (content) VALUES(NULL)"
|
100
|
+
t = Topic.find(id)
|
101
|
+
|
102
|
+
assert_nil t.content
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_serialized_attribute_declared_in_subclass
|
106
|
+
hash = { 'important1' => 'value1', 'important2' => 'value2' }
|
107
|
+
important_topic = ImportantTopic.create("important" => hash)
|
108
|
+
assert_equal(hash, important_topic.important)
|
109
|
+
|
110
|
+
important_topic.reload
|
111
|
+
assert_equal(hash, important_topic.important)
|
112
|
+
assert_equal(hash, important_topic.read_attribute(:important))
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_serialized_time_attribute
|
116
|
+
myobj = Time.local(2008,1,1,1,0)
|
117
|
+
topic = Topic.create("content" => myobj).reload
|
118
|
+
assert_equal(myobj, topic.content)
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_serialized_string_attribute
|
122
|
+
myobj = "Yes"
|
123
|
+
topic = Topic.create("content" => myobj).reload
|
124
|
+
assert_equal(myobj, topic.content)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_nil_serialized_attribute_without_class_constraint
|
128
|
+
topic = Topic.new
|
129
|
+
assert_nil topic.content
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_nil_not_serialized_without_class_constraint
|
133
|
+
assert Topic.new(:content => nil).save
|
134
|
+
assert_equal 1, Topic.where(:content => nil).count
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_nil_not_serialized_with_class_constraint
|
138
|
+
Topic.serialize :content, Hash
|
139
|
+
assert Topic.new(:content => nil).save
|
140
|
+
assert_equal 1, Topic.where(:content => nil).count
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
|
144
|
+
Topic.serialize(:content, Hash)
|
145
|
+
assert_raise(ActiveRecord::SerializationTypeMismatch) do
|
146
|
+
Topic.new(content: 'string')
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
|
151
|
+
myobj = MyObject.new('value1', 'value2')
|
152
|
+
topic = Topic.new(:content => myobj)
|
153
|
+
assert topic.save
|
154
|
+
Topic.serialize(:content, Hash)
|
155
|
+
assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_serialized_attribute_with_class_constraint
|
159
|
+
settings = { "color" => "blue" }
|
160
|
+
Topic.serialize(:content, Hash)
|
161
|
+
topic = Topic.new(:content => settings)
|
162
|
+
assert topic.save
|
163
|
+
assert_equal(settings, Topic.find(topic.id).content)
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_serialized_default_class
|
167
|
+
Topic.serialize(:content, Hash)
|
168
|
+
topic = Topic.new
|
169
|
+
assert_equal Hash, topic.content.class
|
170
|
+
assert_equal Hash, topic.read_attribute(:content).class
|
171
|
+
topic.content["beer"] = "MadridRb"
|
172
|
+
assert topic.save
|
173
|
+
topic.reload
|
174
|
+
assert_equal Hash, topic.content.class
|
175
|
+
assert_equal "MadridRb", topic.content["beer"]
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_serialized_no_default_class_for_object
|
179
|
+
topic = Topic.new
|
180
|
+
assert_nil topic.content
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_serialized_boolean_value_true
|
184
|
+
topic = Topic.new(:content => true)
|
185
|
+
assert topic.save
|
186
|
+
topic = topic.reload
|
187
|
+
assert_equal topic.content, true
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_serialized_boolean_value_false
|
191
|
+
topic = Topic.new(:content => false)
|
192
|
+
assert topic.save
|
193
|
+
topic = topic.reload
|
194
|
+
assert_equal topic.content, false
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_serialize_with_coder
|
198
|
+
some_class = Struct.new(:foo) do
|
199
|
+
def self.dump(value)
|
200
|
+
value.foo
|
201
|
+
end
|
202
|
+
|
203
|
+
def self.load(value)
|
204
|
+
new(value)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
Topic.serialize(:content, some_class)
|
209
|
+
topic = Topic.new(:content => some_class.new('my value'))
|
210
|
+
topic.save!
|
211
|
+
topic.reload
|
212
|
+
assert_kind_of some_class, topic.content
|
213
|
+
assert_equal topic.content, some_class.new('my value')
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_serialize_attribute_via_select_method_when_time_zone_available
|
217
|
+
with_timezone_config aware_attributes: true do
|
218
|
+
Topic.serialize(:content, MyObject)
|
219
|
+
|
220
|
+
myobj = MyObject.new('value1', 'value2')
|
221
|
+
topic = Topic.create(content: myobj)
|
222
|
+
|
223
|
+
assert_equal(myobj, Topic.select(:content).find(topic.id).content)
|
224
|
+
assert_raise(ActiveModel::MissingAttributeError) { Topic.select(:id).find(topic.id).content }
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_serialize_attribute_can_be_serialized_in_an_integer_column
|
229
|
+
insures = ['life']
|
230
|
+
person = SerializedPerson.new(first_name: 'David', insures: insures)
|
231
|
+
assert person.save
|
232
|
+
person = person.reload
|
233
|
+
assert_equal(insures, person.insures)
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_regression_serialized_default_on_text_column_with_null_false
|
237
|
+
light = TrafficLight.new
|
238
|
+
assert_equal [], light.state
|
239
|
+
assert_equal [], light.long_state
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_serialized_column_should_unserialize_after_update_column
|
243
|
+
t = Topic.create(content: "first")
|
244
|
+
assert_equal("first", t.content)
|
245
|
+
|
246
|
+
t.update_column(:content, ["second"])
|
247
|
+
assert_equal(["second"], t.content)
|
248
|
+
assert_equal(["second"], t.reload.content)
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_serialized_column_should_unserialize_after_update_attribute
|
252
|
+
t = Topic.create(content: "first")
|
253
|
+
assert_equal("first", t.content)
|
254
|
+
|
255
|
+
t.update_attribute(:content, "second")
|
256
|
+
assert_equal("second", t.content)
|
257
|
+
assert_equal("second", t.reload.content)
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_nil_is_not_changed_when_serialized_with_a_class
|
261
|
+
Topic.serialize(:content, Array)
|
262
|
+
|
263
|
+
topic = Topic.new(content: nil)
|
264
|
+
|
265
|
+
assert_not topic.content_changed?
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_newly_emptied_serialized_hash_is_changed
|
269
|
+
Topic.serialize(:content, Hash)
|
270
|
+
topic = Topic.create(content: { "things" => "stuff" })
|
271
|
+
topic.content.delete("things")
|
272
|
+
topic.save!
|
273
|
+
topic.reload
|
274
|
+
|
275
|
+
assert_equal({}, topic.content)
|
276
|
+
end
|
277
|
+
end
|