ibm_db 3.0.0-x86-mingw32 → 3.0.1-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 -0
- data/MANIFEST +14 -14
- data/README +225 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/OLD/extconf.rb +264 -0
- data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
- data/ext/extconf.rb +291 -264
- data/ext/ibm_db.c +2 -2
- data/ext/ruby_ibm_db.h +241 -241
- 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 +4 -4
- 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 +115 -115
- data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
- data/test/assets/example.log +1 -0
- data/test/assets/flowers.jpg +0 -0
- data/test/assets/test.txt +1 -0
- data/test/cases/adapter_test.rb +261 -207
- data/test/cases/aggregations_test.rb +158 -0
- data/test/cases/ar_schema_test.rb +161 -0
- data/test/cases/associations/association_scope_test.rb +21 -0
- data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
- data/test/cases/associations/callbacks_test.rb +192 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
- data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
- data/test/cases/associations/eager_singularization_test.rb +148 -0
- data/test/cases/associations/eager_test.rb +1411 -0
- data/test/cases/associations/extension_test.rb +82 -0
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
- data/test/cases/associations/has_many_associations_test.rb +2162 -0
- data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
- data/test/cases/associations/has_one_associations_test.rb +610 -0
- data/test/cases/associations/has_one_through_associations_test.rb +380 -0
- data/test/cases/associations/inner_join_association_test.rb +139 -0
- data/test/cases/associations/inverse_associations_test.rb +693 -0
- data/test/cases/associations/join_model_test.rb +754 -743
- data/test/cases/associations/nested_through_associations_test.rb +579 -0
- data/test/cases/associations/required_test.rb +82 -0
- data/test/cases/associations_test.rb +380 -0
- data/test/cases/attribute_decorators_test.rb +125 -0
- data/test/cases/attribute_methods/read_test.rb +60 -0
- data/test/cases/attribute_methods/serialization_test.rb +29 -0
- data/test/cases/attribute_methods_test.rb +952 -822
- data/test/cases/attribute_set_test.rb +200 -0
- data/test/cases/attribute_test.rb +180 -0
- data/test/cases/attributes_test.rb +136 -0
- data/test/cases/autosave_association_test.rb +1595 -0
- data/test/cases/base_test.rb +1638 -2133
- data/test/cases/batches_test.rb +212 -0
- data/test/cases/binary_test.rb +52 -0
- data/test/cases/bind_parameter_test.rb +100 -0
- data/test/cases/calculations_test.rb +646 -482
- data/test/cases/callbacks_test.rb +543 -0
- data/test/cases/clone_test.rb +40 -0
- data/test/cases/coders/yaml_column_test.rb +63 -0
- data/test/cases/column_alias_test.rb +17 -0
- data/test/cases/column_definition_test.rb +123 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
- data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
- data/test/cases/connection_adapters/quoting_test.rb +13 -0
- data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
- data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
- data/test/cases/connection_management_test.rb +122 -0
- data/test/cases/connection_pool_test.rb +346 -0
- data/test/cases/connection_specification/resolver_test.rb +116 -0
- data/test/cases/core_test.rb +112 -0
- data/test/cases/counter_cache_test.rb +209 -0
- data/test/cases/custom_locking_test.rb +17 -0
- data/test/cases/database_statements_test.rb +19 -0
- data/test/cases/date_time_test.rb +61 -0
- data/test/cases/defaults_test.rb +223 -0
- data/test/cases/dirty_test.rb +775 -0
- data/test/cases/disconnected_test.rb +28 -0
- data/test/cases/dup_test.rb +157 -0
- data/test/cases/enum_test.rb +290 -0
- data/test/cases/explain_subscriber_test.rb +64 -0
- data/test/cases/explain_test.rb +76 -0
- data/test/cases/finder_respond_to_test.rb +60 -0
- data/test/cases/finder_test.rb +1166 -0
- data/test/cases/fixture_set/file_test.rb +138 -0
- data/test/cases/fixtures_test.rb +897 -0
- data/test/cases/forbidden_attributes_protection_test.rb +99 -0
- data/test/cases/habtm_destroy_order_test.rb +61 -0
- data/test/cases/helper.rb +210 -0
- data/test/cases/hot_compatibility_test.rb +54 -0
- data/test/cases/i18n_test.rb +45 -0
- data/test/cases/inheritance_test.rb +375 -0
- data/test/cases/integration_test.rb +139 -0
- data/test/cases/invalid_connection_test.rb +22 -0
- data/test/cases/invalid_date_test.rb +32 -0
- data/test/cases/invertible_migration_test.rb +295 -0
- data/test/cases/json_serialization_test.rb +302 -0
- data/test/cases/locking_test.rb +477 -0
- data/test/cases/log_subscriber_test.rb +136 -0
- data/test/cases/migration/change_schema_test - Copy.rb +448 -0
- data/test/cases/migration/change_schema_test.rb +472 -0
- data/test/cases/migration/change_table_test.rb +224 -0
- data/test/cases/migration/column_attributes_test.rb +192 -0
- data/test/cases/migration/column_positioning_test.rb +56 -0
- data/test/cases/migration/columns_test.rb +304 -0
- data/test/cases/migration/command_recorder_test.rb +305 -0
- data/test/cases/migration/create_join_table_test.rb +148 -0
- data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
- data/test/cases/migration/foreign_key_test.rb +360 -0
- data/test/cases/migration/helper.rb +39 -0
- data/test/cases/migration/index_test.rb +216 -0
- data/test/cases/migration/logger_test.rb +36 -0
- data/test/cases/migration/pending_migrations_test.rb +53 -0
- data/test/cases/migration/references_foreign_key_test.rb +214 -0
- data/test/cases/migration/references_index_test.rb +101 -0
- data/test/cases/migration/references_statements_test.rb +116 -0
- data/test/cases/migration/rename_table_test.rb +93 -0
- data/test/cases/migration/table_and_index_test.rb +24 -0
- data/test/cases/migration_test.rb +959 -2408
- data/test/cases/migrator_test.rb +388 -0
- data/test/cases/mixin_test.rb +70 -0
- data/test/cases/modules_test.rb +173 -0
- data/test/cases/multiparameter_attributes_test.rb +350 -0
- data/test/cases/multiple_db_test.rb +115 -0
- data/test/cases/nested_attributes_test.rb +1057 -0
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
- data/test/cases/persistence_test.rb +909 -642
- data/test/cases/pooled_connections_test.rb +81 -0
- data/test/cases/primary_keys_test.rb +237 -0
- data/test/cases/query_cache_test.rb +326 -257
- data/test/cases/quoting_test.rb +156 -0
- data/test/cases/readonly_test.rb +118 -0
- data/test/cases/reaper_test.rb +85 -0
- data/test/cases/reflection_test.rb +454 -0
- data/test/cases/relation/delegation_test.rb +68 -0
- data/test/cases/relation/merging_test.rb +161 -0
- data/test/cases/relation/mutation_test.rb +165 -0
- data/test/cases/relation/predicate_builder_test.rb +14 -0
- data/test/cases/relation/where_chain_test.rb +181 -0
- data/test/cases/relation/where_test.rb +300 -0
- data/test/cases/relation/where_test2.rb +36 -0
- data/test/cases/relation_test.rb +297 -0
- data/test/cases/relations_test.rb +1815 -1182
- data/test/cases/reload_models_test.rb +22 -0
- data/test/cases/result_test.rb +80 -0
- data/test/cases/sanitize_test.rb +83 -0
- data/test/cases/schema_dumper_test.rb +463 -256
- data/test/cases/scoping/default_scoping_test.rb +454 -0
- data/test/cases/scoping/named_scoping_test.rb +524 -0
- data/test/cases/scoping/relation_scoping_test.rb +357 -0
- data/test/cases/serialization_test.rb +104 -0
- data/test/cases/serialized_attribute_test.rb +277 -0
- data/test/cases/statement_cache_test.rb +98 -0
- data/test/cases/store_test.rb +194 -0
- data/test/cases/tasks/database_tasks_test.rb +396 -0
- data/test/cases/tasks/mysql_rake_test.rb +311 -0
- data/test/cases/tasks/postgresql_rake_test.rb +245 -0
- data/test/cases/tasks/sqlite_rake_test.rb +193 -0
- data/test/cases/test_case.rb +123 -0
- data/test/cases/timestamp_test.rb +468 -0
- data/test/cases/transaction_callbacks_test.rb +452 -300
- data/test/cases/transaction_isolation_test.rb +106 -0
- data/test/cases/transactions_test.rb +817 -0
- data/test/cases/type/decimal_test.rb +51 -0
- data/test/cases/type/integer_test.rb +121 -0
- data/test/cases/type/string_test.rb +36 -0
- data/test/cases/type/type_map_test.rb +177 -0
- data/test/cases/type/unsigned_integer_test.rb +18 -0
- data/test/cases/types_test.rb +141 -0
- data/test/cases/unconnected_test.rb +33 -0
- data/test/cases/validations/association_validation_test.rb +86 -0
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
- data/test/cases/validations/i18n_validation_test.rb +90 -0
- data/test/cases/validations/length_validation_test.rb +47 -0
- data/test/cases/validations/presence_validation_test.rb +68 -0
- data/test/cases/validations/uniqueness_validation_test.rb +434 -299
- data/test/cases/validations_repair_helper.rb +23 -0
- data/test/cases/validations_test.rb +165 -0
- data/test/cases/view_test.rb +113 -0
- data/test/cases/xml_serialization_test.rb +457 -408
- data/test/cases/yaml_serialization_test.rb +86 -0
- data/test/config.rb +5 -0
- data/test/config.yml +154 -154
- data/test/connections/native_ibm_db/connection.rb +43 -43
- data/test/fixtures/accounts.yml +29 -0
- data/test/fixtures/admin/accounts.yml +2 -0
- data/test/fixtures/admin/randomly_named_a9.yml +7 -0
- data/test/fixtures/admin/randomly_named_b0.yml +7 -0
- data/test/fixtures/admin/users.yml +10 -0
- data/test/fixtures/all/admin +1 -0
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.yml +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +18 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +23 -0
- data/test/fixtures/binaries.yml +133 -0
- data/test/fixtures/books.yml +11 -0
- data/test/fixtures/bulbs.yml +5 -0
- data/test/fixtures/cars.yml +9 -0
- data/test/fixtures/categories.yml +19 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +31 -0
- data/test/fixtures/categorizations.yml +23 -0
- data/test/fixtures/clubs.yml +8 -0
- data/test/fixtures/collections.yml +3 -0
- data/test/fixtures/colleges.yml +3 -0
- data/test/fixtures/comments.yml +65 -0
- data/test/fixtures/companies.yml +67 -0
- data/test/fixtures/computers.yml +10 -0
- data/test/fixtures/courses.yml +8 -0
- data/test/fixtures/customers.yml +26 -0
- data/test/fixtures/dashboards.yml +6 -0
- data/test/fixtures/developers.yml +22 -0
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/dog_lovers.yml +7 -0
- data/test/fixtures/dogs.yml +4 -0
- data/test/fixtures/doubloons.yml +3 -0
- data/test/fixtures/edges.yml +5 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/essays.yml +6 -0
- data/test/fixtures/faces.yml +11 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/friendships.yml +4 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/interests.yml +33 -0
- data/test/fixtures/items.yml +3 -0
- data/test/fixtures/jobs.yml +7 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/mateys.yml +4 -0
- data/test/fixtures/member_details.yml +8 -0
- data/test/fixtures/member_types.yml +6 -0
- data/test/fixtures/members.yml +11 -0
- data/test/fixtures/memberships.yml +34 -0
- data/test/fixtures/men.yml +5 -0
- data/test/fixtures/minimalistics.yml +2 -0
- data/test/fixtures/minivans.yml +5 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixins.yml +29 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/csv/accounts.csv +1 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/organizations.yml +5 -0
- data/test/fixtures/other_topics.yml +42 -0
- data/test/fixtures/owners.yml +9 -0
- data/test/fixtures/parrots.yml +27 -0
- data/test/fixtures/parrots_pirates.yml +7 -0
- data/test/fixtures/people.yml +24 -0
- data/test/fixtures/peoples_treasures.yml +3 -0
- data/test/fixtures/pets.yml +19 -0
- data/test/fixtures/pirates.yml +12 -0
- data/test/fixtures/posts.yml +80 -0
- data/test/fixtures/price_estimates.yml +7 -0
- data/test/fixtures/products.yml +4 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/randomly_named_a9.yml +7 -0
- data/test/fixtures/ratings.yml +14 -0
- data/test/fixtures/readers.yml +11 -0
- data/test/fixtures/references.yml +17 -0
- data/test/fixtures/reserved_words/distinct.yml +5 -0
- data/test/fixtures/reserved_words/distinct_select.yml +11 -0
- data/test/fixtures/reserved_words/group.yml +14 -0
- data/test/fixtures/reserved_words/select.yml +8 -0
- data/test/fixtures/reserved_words/values.yml +7 -0
- data/test/fixtures/ships.yml +6 -0
- data/test/fixtures/speedometers.yml +8 -0
- data/test/fixtures/sponsors.yml +12 -0
- data/test/fixtures/string_key_objects.yml +7 -0
- data/test/fixtures/subscribers.yml +11 -0
- data/test/fixtures/subscriptions.yml +12 -0
- data/test/fixtures/taggings.yml +78 -0
- data/test/fixtures/tags.yml +11 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/teapots.yml +3 -0
- data/test/fixtures/to_be_linked/accounts.yml +2 -0
- data/test/fixtures/to_be_linked/users.yml +10 -0
- data/test/fixtures/topics.yml +49 -0
- data/test/fixtures/toys.yml +14 -0
- data/test/fixtures/traffic_lights.yml +10 -0
- data/test/fixtures/treasures.yml +10 -0
- data/test/fixtures/uuid_children.yml +3 -0
- data/test/fixtures/uuid_parents.yml +2 -0
- data/test/fixtures/variants.yml +4 -0
- data/test/fixtures/vegetables.yml +20 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures/warehouse_things.yml +3 -0
- data/test/fixtures/zines.yml +5 -0
- data/test/ibm_db_test.rb +24 -24
- data/test/migrations/10_urban/9_add_expressions.rb +11 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
- data/test/migrations/missing/1_people_have_last_names.rb +9 -0
- data/test/migrations/missing/3_we_need_reminders.rb +12 -0
- data/test/migrations/missing/4_innocent_jointable.rb +12 -0
- data/test/migrations/rename/1_we_need_things.rb +11 -0
- data/test/migrations/rename/2_rename_things.rb +9 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
- data/test/migrations/to_copy2/1_create_articles.rb +7 -0
- data/test/migrations/to_copy2/2_create_comments.rb +7 -0
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
- data/test/migrations/valid/2_we_need_reminders.rb +12 -0
- data/test/migrations/valid/3_innocent_jointable.rb +12 -0
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
- data/test/models/admin.rb +5 -0
- data/test/models/admin/account.rb +3 -0
- data/test/models/admin/randomly_named_c1.rb +3 -0
- data/test/models/admin/user.rb +40 -0
- data/test/models/aircraft.rb +4 -0
- data/test/models/arunit2_model.rb +3 -0
- data/test/models/author.rb +212 -0
- data/test/models/auto_id.rb +4 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +2 -0
- data/test/models/bird.rb +12 -0
- data/test/models/book.rb +18 -0
- data/test/models/boolean.rb +2 -0
- data/test/models/bulb.rb +51 -0
- data/test/models/cake_designer.rb +3 -0
- data/test/models/car.rb +26 -0
- data/test/models/carrier.rb +2 -0
- data/test/models/categorization.rb +19 -0
- data/test/models/category.rb +35 -0
- data/test/models/chef.rb +3 -0
- data/test/models/citation.rb +3 -0
- data/test/models/club.rb +23 -0
- data/test/models/college.rb +10 -0
- data/test/models/column.rb +3 -0
- data/test/models/column_name.rb +3 -0
- data/test/models/comment.rb +64 -0
- data/test/models/company.rb +225 -0
- data/test/models/company_in_module.rb +98 -0
- data/test/models/computer.rb +3 -0
- data/test/models/contact.rb +41 -0
- data/test/models/contract.rb +20 -0
- data/test/models/country.rb +7 -0
- data/test/models/course.rb +6 -0
- data/test/models/customer.rb +77 -0
- data/test/models/customer_carrier.rb +14 -0
- data/test/models/dashboard.rb +3 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +4 -0
- data/test/models/developer.rb +252 -0
- data/test/models/dog.rb +5 -0
- data/test/models/dog_lover.rb +5 -0
- data/test/models/doubloon.rb +12 -0
- data/test/models/drink_designer.rb +3 -0
- data/test/models/edge.rb +5 -0
- data/test/models/electron.rb +5 -0
- data/test/models/engine.rb +4 -0
- data/test/models/entrant.rb +3 -0
- data/test/models/essay.rb +5 -0
- data/test/models/event.rb +3 -0
- data/test/models/eye.rb +37 -0
- data/test/models/face.rb +9 -0
- data/test/models/friendship.rb +6 -0
- data/test/models/guid.rb +2 -0
- data/test/models/hotel.rb +6 -0
- data/test/models/image.rb +3 -0
- data/test/models/interest.rb +5 -0
- data/test/models/invoice.rb +4 -0
- data/test/models/item.rb +7 -0
- data/test/models/job.rb +7 -0
- data/test/models/joke.rb +7 -0
- data/test/models/keyboard.rb +3 -0
- data/test/models/legacy_thing.rb +3 -0
- data/test/models/lesson.rb +11 -0
- data/test/models/line_item.rb +3 -0
- data/test/models/liquid.rb +4 -0
- data/test/models/man.rb +11 -0
- data/test/models/matey.rb +4 -0
- data/test/models/member.rb +41 -0
- data/test/models/member_detail.rb +7 -0
- data/test/models/member_type.rb +3 -0
- data/test/models/membership.rb +35 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +9 -0
- data/test/models/mixed_case_monkey.rb +3 -0
- data/test/models/molecule.rb +6 -0
- data/test/models/movie.rb +5 -0
- data/test/models/order.rb +4 -0
- data/test/models/organization.rb +14 -0
- data/test/models/owner.rb +34 -0
- data/test/models/parrot.rb +29 -0
- data/test/models/person.rb +143 -0
- data/test/models/personal_legacy_thing.rb +4 -0
- data/test/models/pet.rb +15 -0
- data/test/models/pirate.rb +92 -0
- data/test/models/possession.rb +3 -0
- data/test/models/post.rb +264 -0
- data/test/models/price_estimate.rb +4 -0
- data/test/models/professor.rb +5 -0
- data/test/models/project.rb +29 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/publisher/article.rb +4 -0
- data/test/models/publisher/magazine.rb +3 -0
- data/test/models/randomly_named_c1.rb +3 -0
- data/test/models/rating.rb +4 -0
- data/test/models/reader.rb +23 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +22 -0
- data/test/models/reply.rb +61 -0
- data/test/models/ship.rb +33 -0
- data/test/models/ship_part.rb +8 -0
- data/test/models/shop.rb +17 -0
- data/test/models/shop_account.rb +6 -0
- data/test/models/speedometer.rb +6 -0
- data/test/models/sponsor.rb +7 -0
- data/test/models/string_key_object.rb +3 -0
- data/test/models/student.rb +4 -0
- data/test/models/subject.rb +16 -0
- data/test/models/subscriber.rb +8 -0
- data/test/models/subscription.rb +4 -0
- data/test/models/tag.rb +7 -0
- data/test/models/tagging.rb +13 -0
- data/test/models/task.rb +5 -0
- data/test/models/topic.rb +124 -0
- data/test/models/toy.rb +6 -0
- data/test/models/traffic_light.rb +4 -0
- data/test/models/treasure.rb +14 -0
- data/test/models/treaty.rb +7 -0
- data/test/models/tyre.rb +11 -0
- data/test/models/uuid_child.rb +3 -0
- data/test/models/uuid_parent.rb +3 -0
- data/test/models/vegetables.rb +24 -0
- data/test/models/vehicle.rb +7 -0
- data/test/models/vertex.rb +9 -0
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -0
- data/test/models/without_table.rb +3 -0
- data/test/models/zine.rb +3 -0
- data/test/schema/mysql2_specific_schema.rb +58 -0
- data/test/schema/mysql_specific_schema.rb +70 -0
- data/test/schema/oracle_specific_schema.rb +43 -0
- data/test/schema/postgresql_specific_schema.rb +202 -0
- data/test/schema/schema.rb +938 -751
- data/test/schema/sqlite_specific_schema.rb +22 -0
- data/test/support/config.rb +43 -0
- data/test/support/connection.rb +22 -0
- data/test/support/connection_helper.rb +14 -0
- data/test/support/ddl_helper.rb +8 -0
- data/test/support/schema_dumping_helper.rb +20 -0
- metadata +444 -18
@@ -0,0 +1,156 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
class QuotingTest < ActiveRecord::TestCase
|
6
|
+
def setup
|
7
|
+
@quoter = Class.new { include Quoting }.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_quoted_true
|
11
|
+
assert_equal "'t'", @quoter.quoted_true
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_quoted_false
|
15
|
+
assert_equal "'f'", @quoter.quoted_false
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_quote_column_name
|
19
|
+
assert_equal "foo", @quoter.quote_column_name('foo')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_quote_table_name
|
23
|
+
assert_equal "foo", @quoter.quote_table_name('foo')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_quote_table_name_calls_quote_column_name
|
27
|
+
@quoter.extend(Module.new {
|
28
|
+
def quote_column_name(string)
|
29
|
+
'lol'
|
30
|
+
end
|
31
|
+
})
|
32
|
+
assert_equal 'lol', @quoter.quote_table_name('foo')
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_quote_string
|
36
|
+
assert_equal "''", @quoter.quote_string("'")
|
37
|
+
assert_equal "\\\\", @quoter.quote_string("\\")
|
38
|
+
assert_equal "hi''i", @quoter.quote_string("hi'i")
|
39
|
+
assert_equal "hi\\\\i", @quoter.quote_string("hi\\i")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_quoted_date
|
43
|
+
t = Date.today
|
44
|
+
assert_equal t.to_s(:db), @quoter.quoted_date(t)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_quoted_time_utc
|
48
|
+
with_timezone_config default: :utc do
|
49
|
+
t = Time.now
|
50
|
+
assert_equal t.getutc.to_s(:db), @quoter.quoted_date(t)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_quoted_time_local
|
55
|
+
with_timezone_config default: :local do
|
56
|
+
t = Time.now
|
57
|
+
assert_equal t.getlocal.to_s(:db), @quoter.quoted_date(t)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_quoted_time_crazy
|
62
|
+
with_timezone_config default: :asdfasdf do
|
63
|
+
t = Time.now
|
64
|
+
assert_equal t.getlocal.to_s(:db), @quoter.quoted_date(t)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_quoted_datetime_utc
|
69
|
+
with_timezone_config default: :utc do
|
70
|
+
t = DateTime.now
|
71
|
+
assert_equal t.getutc.to_s(:db), @quoter.quoted_date(t)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
###
|
76
|
+
# DateTime doesn't define getlocal, so make sure it does nothing
|
77
|
+
def test_quoted_datetime_local
|
78
|
+
with_timezone_config default: :local do
|
79
|
+
t = DateTime.now
|
80
|
+
assert_equal t.to_s(:db), @quoter.quoted_date(t)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_quote_with_quoted_id
|
85
|
+
assert_equal 1, @quoter.quote(Struct.new(:quoted_id).new(1), nil)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_quote_nil
|
89
|
+
assert_equal 'NULL', @quoter.quote(nil, nil)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_quote_true
|
93
|
+
assert_equal @quoter.quoted_true, @quoter.quote(true, nil)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_quote_false
|
97
|
+
assert_equal @quoter.quoted_false, @quoter.quote(false, nil)
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_quote_float
|
101
|
+
float = 1.2
|
102
|
+
assert_equal float.to_s, @quoter.quote(float, nil)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_quote_fixnum
|
106
|
+
fixnum = 1
|
107
|
+
assert_equal fixnum.to_s, @quoter.quote(fixnum, nil)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_quote_bignum
|
111
|
+
bignum = 1 << 100
|
112
|
+
assert_equal bignum.to_s, @quoter.quote(bignum, nil)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_quote_bigdecimal
|
116
|
+
bigdec = BigDecimal.new((1 << 100).to_s)
|
117
|
+
assert_equal bigdec.to_s('F'), @quoter.quote(bigdec, nil)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_dates_and_times
|
121
|
+
@quoter.extend(Module.new { def quoted_date(value) 'lol' end })
|
122
|
+
assert_equal "'lol'", @quoter.quote(Date.today, nil)
|
123
|
+
assert_equal "'lol'", @quoter.quote(Time.now, nil)
|
124
|
+
assert_equal "'lol'", @quoter.quote(DateTime.now, nil)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_crazy_object
|
128
|
+
crazy = Class.new.new
|
129
|
+
expected = "'#{YAML.dump(crazy)}'"
|
130
|
+
assert_equal expected, @quoter.quote(crazy, nil)
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_crazy_object_calls_quote_string
|
134
|
+
crazy = Class.new { def initialize; @lol = 'lo\l' end }.new
|
135
|
+
assert_match "lo\\\\l", @quoter.quote(crazy, nil)
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_quote_string_no_column
|
139
|
+
assert_equal "'lo\\\\l'", @quoter.quote('lo\l', nil)
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_quote_as_mb_chars_no_column
|
143
|
+
string = ActiveSupport::Multibyte::Chars.new('lo\l')
|
144
|
+
assert_equal "'lo\\\\l'", @quoter.quote(string, nil)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_string_with_crazy_column
|
148
|
+
assert_equal "'lo\\\\l'", @quoter.quote('lo\l')
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_quote_duration
|
152
|
+
assert_equal "1800", @quoter.quote(30.minutes)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/author'
|
3
|
+
require 'models/post'
|
4
|
+
require 'models/comment'
|
5
|
+
require 'models/developer'
|
6
|
+
require 'models/computer'
|
7
|
+
require 'models/project'
|
8
|
+
require 'models/reader'
|
9
|
+
require 'models/person'
|
10
|
+
|
11
|
+
class ReadOnlyTest < ActiveRecord::TestCase
|
12
|
+
fixtures :authors, :posts, :comments, :developers, :projects, :developers_projects, :people, :readers, :author_addresses
|
13
|
+
|
14
|
+
def test_cant_save_readonly_record
|
15
|
+
dev = Developer.find(1)
|
16
|
+
assert !dev.readonly?
|
17
|
+
|
18
|
+
dev.readonly!
|
19
|
+
assert dev.readonly?
|
20
|
+
|
21
|
+
assert_nothing_raised do
|
22
|
+
dev.name = 'Luscious forbidden fruit.'
|
23
|
+
assert !dev.save
|
24
|
+
dev.name = 'Forbidden.'
|
25
|
+
end
|
26
|
+
|
27
|
+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save }
|
28
|
+
assert_equal "Developer is marked as readonly", e.message
|
29
|
+
|
30
|
+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save! }
|
31
|
+
assert_equal "Developer is marked as readonly", e.message
|
32
|
+
|
33
|
+
e = assert_raise(ActiveRecord::ReadOnlyRecord) { dev.destroy }
|
34
|
+
assert_equal "Developer is marked as readonly", e.message
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def test_find_with_readonly_option
|
39
|
+
Developer.all.each { |d| assert !d.readonly? }
|
40
|
+
Developer.readonly(false).each { |d| assert !d.readonly? }
|
41
|
+
Developer.readonly(true).each { |d| assert d.readonly? }
|
42
|
+
Developer.readonly.each { |d| assert d.readonly? }
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_find_with_joins_option_does_not_imply_readonly
|
46
|
+
Developer.joins(' ').each { |d| assert_not d.readonly? }
|
47
|
+
Developer.joins(' ').readonly(true).each { |d| assert d.readonly? }
|
48
|
+
|
49
|
+
Developer.joins(', projects').each { |d| assert_not d.readonly? }
|
50
|
+
Developer.joins(', projects').readonly(true).each { |d| assert d.readonly? }
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_has_many_find_readonly
|
54
|
+
post = Post.find(1)
|
55
|
+
assert !post.comments.empty?
|
56
|
+
assert !post.comments.any?(&:readonly?)
|
57
|
+
assert !post.comments.to_a.any?(&:readonly?)
|
58
|
+
assert post.comments.readonly(true).all?(&:readonly?)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_has_many_with_through_is_not_implicitly_marked_readonly
|
62
|
+
assert people = Post.find(1).people
|
63
|
+
assert !people.any?(&:readonly?)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_has_many_with_through_is_not_implicitly_marked_readonly_while_finding_by_id
|
67
|
+
assert !posts(:welcome).people.find(1).readonly?
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_has_many_with_through_is_not_implicitly_marked_readonly_while_finding_first
|
71
|
+
assert !posts(:welcome).people.first.readonly?
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_has_many_with_through_is_not_implicitly_marked_readonly_while_finding_last
|
75
|
+
assert !posts(:welcome).people.last.readonly?
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_readonly_scoping
|
79
|
+
Post.where('1=1').scoping do
|
80
|
+
assert !Post.find(1).readonly?
|
81
|
+
assert Post.readonly(true).find(1).readonly?
|
82
|
+
assert !Post.readonly(false).find(1).readonly?
|
83
|
+
end
|
84
|
+
|
85
|
+
Post.joins(' ').scoping do
|
86
|
+
assert !Post.find(1).readonly?
|
87
|
+
assert Post.readonly.find(1).readonly?
|
88
|
+
assert !Post.readonly(false).find(1).readonly?
|
89
|
+
end
|
90
|
+
|
91
|
+
# Oracle barfs on this because the join includes unqualified and
|
92
|
+
# conflicting column names
|
93
|
+
unless current_adapter?(:OracleAdapter)
|
94
|
+
Post.joins(', developers').scoping do
|
95
|
+
assert_not Post.find(1).readonly?
|
96
|
+
assert Post.readonly.find(1).readonly?
|
97
|
+
assert !Post.readonly(false).find(1).readonly?
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
Post.readonly(true).scoping do
|
102
|
+
assert Post.find(1).readonly?
|
103
|
+
assert Post.readonly.find(1).readonly?
|
104
|
+
assert !Post.readonly(false).find(1).readonly?
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_association_collection_method_missing_scoping_not_readonly
|
109
|
+
developer = Developer.find(1)
|
110
|
+
project = Post.find(1)
|
111
|
+
|
112
|
+
assert !developer.projects.all_as_method.first.readonly?
|
113
|
+
assert !developer.projects.all_as_scope.first.readonly?
|
114
|
+
|
115
|
+
assert !project.comments.all_as_method.first.readonly?
|
116
|
+
assert !project.comments.all_as_scope.first.readonly?
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
class ReaperTest < ActiveRecord::TestCase
|
6
|
+
attr_reader :pool
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
@pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
|
11
|
+
end
|
12
|
+
|
13
|
+
teardown do
|
14
|
+
@pool.connections.each(&:close)
|
15
|
+
end
|
16
|
+
|
17
|
+
class FakePool
|
18
|
+
attr_reader :reaped
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@reaped = false
|
22
|
+
end
|
23
|
+
|
24
|
+
def reap
|
25
|
+
@reaped = true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# A reaper with nil time should never reap connections
|
30
|
+
def test_nil_time
|
31
|
+
fp = FakePool.new
|
32
|
+
assert !fp.reaped
|
33
|
+
reaper = ConnectionPool::Reaper.new(fp, nil)
|
34
|
+
reaper.run
|
35
|
+
assert !fp.reaped
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_some_time
|
39
|
+
fp = FakePool.new
|
40
|
+
assert !fp.reaped
|
41
|
+
|
42
|
+
reaper = ConnectionPool::Reaper.new(fp, 0.0001)
|
43
|
+
reaper.run
|
44
|
+
until fp.reaped
|
45
|
+
Thread.pass
|
46
|
+
end
|
47
|
+
assert fp.reaped
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_pool_has_reaper
|
51
|
+
assert pool.reaper
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_reaping_frequency_configuration
|
55
|
+
spec = ActiveRecord::Base.connection_pool.spec.dup
|
56
|
+
spec.config[:reaping_frequency] = 100
|
57
|
+
pool = ConnectionPool.new spec
|
58
|
+
assert_equal 100, pool.reaper.frequency
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_connection_pool_starts_reaper
|
62
|
+
spec = ActiveRecord::Base.connection_pool.spec.dup
|
63
|
+
spec.config[:reaping_frequency] = '0.0001'
|
64
|
+
|
65
|
+
pool = ConnectionPool.new spec
|
66
|
+
|
67
|
+
conn = nil
|
68
|
+
child = Thread.new do
|
69
|
+
conn = pool.checkout
|
70
|
+
Thread.stop
|
71
|
+
end
|
72
|
+
Thread.pass while conn.nil?
|
73
|
+
|
74
|
+
assert conn.in_use?
|
75
|
+
|
76
|
+
child.terminate
|
77
|
+
|
78
|
+
while conn.in_use?
|
79
|
+
Thread.pass
|
80
|
+
end
|
81
|
+
assert !conn.in_use?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,454 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/topic'
|
3
|
+
require 'models/customer'
|
4
|
+
require 'models/company'
|
5
|
+
require 'models/company_in_module'
|
6
|
+
require 'models/ship'
|
7
|
+
require 'models/pirate'
|
8
|
+
require 'models/price_estimate'
|
9
|
+
require 'models/essay'
|
10
|
+
require 'models/author'
|
11
|
+
require 'models/organization'
|
12
|
+
require 'models/post'
|
13
|
+
require 'models/tagging'
|
14
|
+
require 'models/category'
|
15
|
+
require 'models/book'
|
16
|
+
require 'models/subscriber'
|
17
|
+
require 'models/subscription'
|
18
|
+
require 'models/tag'
|
19
|
+
require 'models/sponsor'
|
20
|
+
require 'models/edge'
|
21
|
+
require 'models/hotel'
|
22
|
+
require 'models/chef'
|
23
|
+
require 'models/department'
|
24
|
+
require 'models/cake_designer'
|
25
|
+
require 'models/drink_designer'
|
26
|
+
|
27
|
+
class ReflectionTest < ActiveRecord::TestCase
|
28
|
+
include ActiveRecord::Reflection
|
29
|
+
|
30
|
+
fixtures :topics, :customers, :companies, :subscribers, :price_estimates
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@first = Topic.find(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_human_name
|
37
|
+
assert_equal "Price estimate", PriceEstimate.model_name.human
|
38
|
+
assert_equal "Subscriber", Subscriber.model_name.human
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_read_attribute_names
|
42
|
+
assert_equal(
|
43
|
+
%w( id title author_name author_email_address bonus_time written_on last_read content important group approved replies_count unique_replies_count parent_id parent_title type created_at updated_at ).sort,
|
44
|
+
@first.attribute_names.sort
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_columns
|
49
|
+
assert_equal 18, Topic.columns.length
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_columns_are_returned_in_the_order_they_were_declared
|
53
|
+
column_names = Topic.columns.map { |column| column.name }
|
54
|
+
assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content important approved replies_count unique_replies_count parent_id parent_title type group created_at updated_at), column_names
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_content_columns
|
58
|
+
content_columns = Topic.content_columns
|
59
|
+
content_column_names = content_columns.map {|column| column.name}
|
60
|
+
assert_equal 13, content_columns.length
|
61
|
+
assert_equal %w(title author_name author_email_address written_on bonus_time last_read content important group approved parent_title created_at updated_at).sort, content_column_names.sort
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_column_string_type_and_limit
|
65
|
+
assert_equal :string, @first.column_for_attribute("title").type
|
66
|
+
assert_equal 250, @first.column_for_attribute("title").limit
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_column_null_not_null
|
70
|
+
subscriber = Subscriber.first
|
71
|
+
assert subscriber.column_for_attribute("name").null
|
72
|
+
assert !subscriber.column_for_attribute("nick").null
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_human_name_for_column
|
76
|
+
assert_equal "Author name", @first.column_for_attribute("author_name").human_name
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_integer_columns
|
80
|
+
assert_equal :integer, @first.column_for_attribute("id").type
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_non_existent_columns_return_nil
|
84
|
+
assert_deprecated do
|
85
|
+
assert_nil @first.column_for_attribute("attribute_that_doesnt_exist")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_reflection_klass_for_nested_class_name
|
90
|
+
reflection = ActiveRecord::Reflection.create(:has_many, nil, nil, { :class_name => 'MyApplication::Business::Company' }, ActiveRecord::Base)
|
91
|
+
assert_nothing_raised do
|
92
|
+
assert_equal MyApplication::Business::Company, reflection.klass
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_irregular_reflection_class_name
|
97
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
98
|
+
inflect.irregular 'plural_irregular', 'plurales_irregulares'
|
99
|
+
end
|
100
|
+
reflection = ActiveRecord::Reflection.create(:has_many, 'plurales_irregulares', nil, {}, ActiveRecord::Base)
|
101
|
+
assert_equal 'PluralIrregular', reflection.class_name
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_aggregation_reflection
|
105
|
+
reflection_for_address = AggregateReflection.new(
|
106
|
+
:address, nil, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
|
107
|
+
)
|
108
|
+
|
109
|
+
reflection_for_balance = AggregateReflection.new(
|
110
|
+
:balance, nil, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
|
111
|
+
)
|
112
|
+
|
113
|
+
reflection_for_gps_location = AggregateReflection.new(
|
114
|
+
:gps_location, nil, { }, Customer
|
115
|
+
)
|
116
|
+
|
117
|
+
assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
|
118
|
+
assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
|
119
|
+
assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
|
120
|
+
|
121
|
+
assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
|
122
|
+
|
123
|
+
assert_equal Address, Customer.reflect_on_aggregation(:address).klass
|
124
|
+
|
125
|
+
assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_reflect_on_all_autosave_associations
|
129
|
+
expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
|
130
|
+
received = Pirate.reflect_on_all_autosave_associations
|
131
|
+
|
132
|
+
assert !received.empty?
|
133
|
+
assert_not_equal Pirate.reflect_on_all_associations.length, received.length
|
134
|
+
assert_equal expected, received
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_has_many_reflection
|
138
|
+
reflection_for_clients = ActiveRecord::Reflection.create(:has_many, :clients, nil, { :order => "id", :dependent => :destroy }, Firm)
|
139
|
+
|
140
|
+
assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
|
141
|
+
|
142
|
+
assert_equal Client, Firm.reflect_on_association(:clients).klass
|
143
|
+
assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
|
144
|
+
|
145
|
+
assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
|
146
|
+
assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_has_one_reflection
|
150
|
+
reflection_for_account = ActiveRecord::Reflection.create(:has_one, :account, nil, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
|
151
|
+
assert_equal reflection_for_account, Firm.reflect_on_association(:account)
|
152
|
+
|
153
|
+
assert_equal Account, Firm.reflect_on_association(:account).klass
|
154
|
+
assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_belongs_to_inferred_foreign_key_from_assoc_name
|
158
|
+
Company.belongs_to :foo
|
159
|
+
assert_equal "foo_id", Company.reflect_on_association(:foo).foreign_key
|
160
|
+
Company.belongs_to :bar, :class_name => "Xyzzy"
|
161
|
+
assert_equal "bar_id", Company.reflect_on_association(:bar).foreign_key
|
162
|
+
Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
|
163
|
+
assert_equal "xyzzy_id", Company.reflect_on_association(:baz).foreign_key
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_association_reflection_in_modules
|
167
|
+
ActiveRecord::Base.store_full_sti_class = false
|
168
|
+
|
169
|
+
assert_reflection MyApplication::Business::Firm,
|
170
|
+
:clients_of_firm,
|
171
|
+
:klass => MyApplication::Business::Client,
|
172
|
+
:class_name => 'Client',
|
173
|
+
:table_name => 'companies'
|
174
|
+
|
175
|
+
assert_reflection MyApplication::Billing::Account,
|
176
|
+
:firm,
|
177
|
+
:klass => MyApplication::Business::Firm,
|
178
|
+
:class_name => 'MyApplication::Business::Firm',
|
179
|
+
:table_name => 'companies'
|
180
|
+
|
181
|
+
assert_reflection MyApplication::Billing::Account,
|
182
|
+
:qualified_billing_firm,
|
183
|
+
:klass => MyApplication::Billing::Firm,
|
184
|
+
:class_name => 'MyApplication::Billing::Firm',
|
185
|
+
:table_name => 'companies'
|
186
|
+
|
187
|
+
assert_reflection MyApplication::Billing::Account,
|
188
|
+
:unqualified_billing_firm,
|
189
|
+
:klass => MyApplication::Billing::Firm,
|
190
|
+
:class_name => 'Firm',
|
191
|
+
:table_name => 'companies'
|
192
|
+
|
193
|
+
assert_reflection MyApplication::Billing::Account,
|
194
|
+
:nested_qualified_billing_firm,
|
195
|
+
:klass => MyApplication::Billing::Nested::Firm,
|
196
|
+
:class_name => 'MyApplication::Billing::Nested::Firm',
|
197
|
+
:table_name => 'companies'
|
198
|
+
|
199
|
+
assert_reflection MyApplication::Billing::Account,
|
200
|
+
:nested_unqualified_billing_firm,
|
201
|
+
:klass => MyApplication::Billing::Nested::Firm,
|
202
|
+
:class_name => 'Nested::Firm',
|
203
|
+
:table_name => 'companies'
|
204
|
+
ensure
|
205
|
+
ActiveRecord::Base.store_full_sti_class = true
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_reflection_should_not_raise_error_when_compared_to_other_object
|
209
|
+
assert_not_equal Object.new, Firm._reflections['clients']
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_reflections_should_return_keys_as_strings
|
213
|
+
assert Category.reflections.keys.all? { |key| key.is_a? String }, "Model.reflections is expected to return string for keys"
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_has_and_belongs_to_many_reflection
|
217
|
+
assert_equal :has_and_belongs_to_many, Category.reflections['posts'].macro
|
218
|
+
assert_equal :posts, Category.reflect_on_all_associations(:has_and_belongs_to_many).first.name
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_has_many_through_reflection
|
222
|
+
assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_chain
|
226
|
+
expected = [
|
227
|
+
Organization.reflect_on_association(:author_essay_categories),
|
228
|
+
Author.reflect_on_association(:essays),
|
229
|
+
Organization.reflect_on_association(:authors)
|
230
|
+
]
|
231
|
+
actual = Organization.reflect_on_association(:author_essay_categories).chain
|
232
|
+
|
233
|
+
assert_equal expected, actual
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_scope_chain
|
237
|
+
expected = [
|
238
|
+
[Tagging.reflect_on_association(:tag).scope, Post.reflect_on_association(:first_blue_tags).scope],
|
239
|
+
[Post.reflect_on_association(:first_taggings).scope],
|
240
|
+
[Author.reflect_on_association(:misc_posts).scope]
|
241
|
+
]
|
242
|
+
actual = Author.reflect_on_association(:misc_post_first_blue_tags).scope_chain
|
243
|
+
assert_equal expected, actual
|
244
|
+
|
245
|
+
expected = [
|
246
|
+
[
|
247
|
+
Tagging.reflect_on_association(:blue_tag).scope,
|
248
|
+
Post.reflect_on_association(:first_blue_tags_2).scope,
|
249
|
+
Author.reflect_on_association(:misc_post_first_blue_tags_2).scope
|
250
|
+
],
|
251
|
+
[],
|
252
|
+
[]
|
253
|
+
]
|
254
|
+
actual = Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
|
255
|
+
assert_equal expected, actual
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case
|
259
|
+
@hotel = Hotel.create!
|
260
|
+
@department = @hotel.departments.create!
|
261
|
+
@department.chefs.create!(employable: CakeDesigner.create!)
|
262
|
+
@department.chefs.create!(employable: DrinkDesigner.create!)
|
263
|
+
|
264
|
+
assert_equal 1, @hotel.cake_designers.size
|
265
|
+
assert_equal 1, @hotel.drink_designers.size
|
266
|
+
assert_equal 2, @hotel.chefs.size
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_nested?
|
270
|
+
assert !Author.reflect_on_association(:comments).nested?
|
271
|
+
assert Author.reflect_on_association(:tags).nested?
|
272
|
+
|
273
|
+
# Only goes :through once, but the through_reflection is a has_and_belongs_to_many, so this is
|
274
|
+
# a nested through association
|
275
|
+
assert Category.reflect_on_association(:post_comments).nested?
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_association_primary_key
|
279
|
+
# Normal association
|
280
|
+
assert_equal "id", Author.reflect_on_association(:posts).association_primary_key.to_s
|
281
|
+
assert_equal "name", Author.reflect_on_association(:essay).association_primary_key.to_s
|
282
|
+
assert_equal "name", Essay.reflect_on_association(:writer).association_primary_key.to_s
|
283
|
+
|
284
|
+
# Through association (uses the :primary_key option from the source reflection)
|
285
|
+
assert_equal "nick", Author.reflect_on_association(:subscribers).association_primary_key.to_s
|
286
|
+
assert_equal "name", Author.reflect_on_association(:essay_category).association_primary_key.to_s
|
287
|
+
assert_equal "custom_primary_key", Author.reflect_on_association(:tags_with_primary_key).association_primary_key.to_s # nested
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_association_primary_key_raises_when_missing_primary_key
|
291
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :edge, nil, {}, Author)
|
292
|
+
assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.association_primary_key }
|
293
|
+
|
294
|
+
through = Class.new(ActiveRecord::Reflection::ThroughReflection) {
|
295
|
+
define_method(:source_reflection) { reflection }
|
296
|
+
}.new(reflection)
|
297
|
+
assert_raises(ActiveRecord::UnknownPrimaryKey) { through.association_primary_key }
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_active_record_primary_key
|
301
|
+
assert_equal "nick", Subscriber.reflect_on_association(:subscriptions).active_record_primary_key.to_s
|
302
|
+
assert_equal "name", Author.reflect_on_association(:essay).active_record_primary_key.to_s
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_active_record_primary_key_raises_when_missing_primary_key
|
306
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :author, nil, {}, Edge)
|
307
|
+
assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.active_record_primary_key }
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_foreign_type
|
311
|
+
assert_equal "sponsorable_type", Sponsor.reflect_on_association(:sponsorable).foreign_type.to_s
|
312
|
+
assert_equal "sponsorable_type", Sponsor.reflect_on_association(:thing).foreign_type.to_s
|
313
|
+
end
|
314
|
+
|
315
|
+
def test_collection_association
|
316
|
+
assert Pirate.reflect_on_association(:birds).collection?
|
317
|
+
assert Pirate.reflect_on_association(:parrots).collection?
|
318
|
+
|
319
|
+
assert !Pirate.reflect_on_association(:ship).collection?
|
320
|
+
assert !Ship.reflect_on_association(:pirate).collection?
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_default_association_validation
|
324
|
+
assert ActiveRecord::Reflection.create(:has_many, :clients, nil, {}, Firm).validate?
|
325
|
+
|
326
|
+
assert !ActiveRecord::Reflection.create(:has_one, :client, nil, {}, Firm).validate?
|
327
|
+
assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, {}, Firm).validate?
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_always_validate_association_if_explicit
|
331
|
+
assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :validate => true }, Firm).validate?
|
332
|
+
assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :validate => true }, Firm).validate?
|
333
|
+
assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :validate => true }, Firm).validate?
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_validate_association_if_autosave
|
337
|
+
assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true }, Firm).validate?
|
338
|
+
assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true }, Firm).validate?
|
339
|
+
assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true }, Firm).validate?
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_never_validate_association_if_explicit
|
343
|
+
assert !ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
|
344
|
+
assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
|
345
|
+
assert !ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true, :validate => false }, Firm).validate?
|
346
|
+
end
|
347
|
+
|
348
|
+
def test_foreign_key
|
349
|
+
assert_equal "author_id", Author.reflect_on_association(:posts).foreign_key.to_s
|
350
|
+
assert_equal "category_id", Post.reflect_on_association(:categorizations).foreign_key.to_s
|
351
|
+
end
|
352
|
+
|
353
|
+
def test_through_reflection_scope_chain_does_not_modify_other_reflections
|
354
|
+
orig_conds = Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
|
355
|
+
Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
|
356
|
+
assert_equal orig_conds, Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_symbol_for_class_name
|
360
|
+
assert_equal Client, Firm.reflect_on_association(:unsorted_clients_with_symbol).klass
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_join_table
|
364
|
+
category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
|
365
|
+
product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
|
366
|
+
|
367
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
|
368
|
+
reflection.stubs(:klass).returns(category)
|
369
|
+
assert_equal 'categories_products', reflection.join_table
|
370
|
+
|
371
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
|
372
|
+
reflection.stubs(:klass).returns(product)
|
373
|
+
assert_equal 'categories_products', reflection.join_table
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_join_table_with_common_prefix
|
377
|
+
category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
|
378
|
+
product = Struct.new(:table_name, :pluralize_table_names).new('catalog_products', true)
|
379
|
+
|
380
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
|
381
|
+
reflection.stubs(:klass).returns(category)
|
382
|
+
assert_equal 'catalog_categories_products', reflection.join_table
|
383
|
+
|
384
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
|
385
|
+
reflection.stubs(:klass).returns(product)
|
386
|
+
assert_equal 'catalog_categories_products', reflection.join_table
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_join_table_with_different_prefix
|
390
|
+
category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
|
391
|
+
page = Struct.new(:table_name, :pluralize_table_names).new('content_pages', true)
|
392
|
+
|
393
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, page)
|
394
|
+
reflection.stubs(:klass).returns(category)
|
395
|
+
assert_equal 'catalog_categories_content_pages', reflection.join_table
|
396
|
+
|
397
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :pages, nil, {}, category)
|
398
|
+
reflection.stubs(:klass).returns(page)
|
399
|
+
assert_equal 'catalog_categories_content_pages', reflection.join_table
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_join_table_can_be_overridden
|
403
|
+
category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
|
404
|
+
product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
|
405
|
+
|
406
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, { :join_table => 'product_categories' }, product)
|
407
|
+
reflection.stubs(:klass).returns(category)
|
408
|
+
assert_equal 'product_categories', reflection.join_table
|
409
|
+
|
410
|
+
reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, { :join_table => 'product_categories' }, category)
|
411
|
+
reflection.stubs(:klass).returns(product)
|
412
|
+
assert_equal 'product_categories', reflection.join_table
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_includes_accepts_symbols
|
416
|
+
hotel = Hotel.create!
|
417
|
+
department = hotel.departments.create!
|
418
|
+
department.chefs.create!
|
419
|
+
|
420
|
+
assert_nothing_raised do
|
421
|
+
assert_equal department.chefs, Hotel.includes([departments: :chefs]).first.chefs
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
def test_includes_accepts_strings
|
426
|
+
hotel = Hotel.create!
|
427
|
+
department = hotel.departments.create!
|
428
|
+
department.chefs.create!
|
429
|
+
|
430
|
+
assert_nothing_raised do
|
431
|
+
assert_equal department.chefs, Hotel.includes(['departments' => 'chefs']).first.chefs
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
def test_reflect_on_association_accepts_symbols
|
436
|
+
assert_nothing_raised do
|
437
|
+
assert_equal Hotel.reflect_on_association(:departments).name, :departments
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_reflect_on_association_accepts_strings
|
442
|
+
assert_nothing_raised do
|
443
|
+
assert_equal Hotel.reflect_on_association("departments").name, :departments
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
private
|
448
|
+
def assert_reflection(klass, association, options)
|
449
|
+
assert reflection = klass.reflect_on_association(association)
|
450
|
+
options.each do |method, value|
|
451
|
+
assert_equal(value, reflection.send(method))
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|