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,23 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ValidationsRepairHelper
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def repair_validations(*model_classes)
|
7
|
+
teardown do
|
8
|
+
model_classes.each do |k|
|
9
|
+
k.clear_validators!
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def repair_validations(*model_classes)
|
16
|
+
yield if block_given?
|
17
|
+
ensure
|
18
|
+
model_classes.each do |k|
|
19
|
+
k.clear_validators!
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "cases/helper"
|
3
|
+
require 'models/topic'
|
4
|
+
require 'models/reply'
|
5
|
+
require 'models/person'
|
6
|
+
require 'models/developer'
|
7
|
+
require 'models/computer'
|
8
|
+
require 'models/parrot'
|
9
|
+
require 'models/company'
|
10
|
+
|
11
|
+
class ValidationsTest < ActiveRecord::TestCase
|
12
|
+
fixtures :topics, :developers
|
13
|
+
|
14
|
+
# Most of the tests mess with the validations of Topic, so lets repair it all the time.
|
15
|
+
# Other classes we mess with will be dealt with in the specific tests
|
16
|
+
repair_validations(Topic)
|
17
|
+
|
18
|
+
def test_valid_uses_create_context_when_new
|
19
|
+
r = WrongReply.new
|
20
|
+
r.title = "Wrong Create"
|
21
|
+
assert_not r.valid?
|
22
|
+
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
23
|
+
assert_equal ["is Wrong Create"], r.errors[:title], "A reply with a bad content should contain an error"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_valid_uses_update_context_when_persisted
|
27
|
+
r = WrongReply.new
|
28
|
+
r.title = "Bad"
|
29
|
+
r.content = "Good"
|
30
|
+
assert r.save, "First validation should be successful"
|
31
|
+
|
32
|
+
r.title = "Wrong Update"
|
33
|
+
assert_not r.valid?, "Second validation should fail"
|
34
|
+
|
35
|
+
assert r.errors[:title].any?, "A reply with a bad title should mark that attribute as invalid"
|
36
|
+
assert_equal ["is Wrong Update"], r.errors[:title], "A reply with a bad content should contain an error"
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_valid_using_special_context
|
40
|
+
r = WrongReply.new(:title => "Valid title")
|
41
|
+
assert !r.valid?(:special_case)
|
42
|
+
assert_equal "Invalid", r.errors[:author_name].join
|
43
|
+
|
44
|
+
r.author_name = "secret"
|
45
|
+
r.content = "Good"
|
46
|
+
assert r.valid?(:special_case)
|
47
|
+
|
48
|
+
r.author_name = nil
|
49
|
+
assert_not r.valid?(:special_case)
|
50
|
+
assert_equal "Invalid", r.errors[:author_name].join
|
51
|
+
|
52
|
+
r.author_name = "secret"
|
53
|
+
assert r.valid?(:special_case)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_validate
|
57
|
+
r = WrongReply.new
|
58
|
+
|
59
|
+
r.validate
|
60
|
+
assert_empty r.errors[:author_name]
|
61
|
+
|
62
|
+
r.validate(:special_case)
|
63
|
+
assert_not_empty r.errors[:author_name]
|
64
|
+
|
65
|
+
r.author_name = "secret"
|
66
|
+
|
67
|
+
r.validate(:special_case)
|
68
|
+
assert_empty r.errors[:author_name]
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_invalid_record_exception
|
72
|
+
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.create! }
|
73
|
+
assert_raise(ActiveRecord::RecordInvalid) { WrongReply.new.save! }
|
74
|
+
|
75
|
+
r = WrongReply.new
|
76
|
+
invalid = assert_raise ActiveRecord::RecordInvalid do
|
77
|
+
r.save!
|
78
|
+
end
|
79
|
+
assert_equal r, invalid.record
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_validate_with_bang
|
83
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
84
|
+
WrongReply.new.validate!
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_validate_with_bang_and_context
|
89
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
90
|
+
WrongReply.new.validate!(:special_case)
|
91
|
+
end
|
92
|
+
r = WrongReply.new(:title => "Valid title", :author_name => "secret", :content => "Good")
|
93
|
+
assert r.validate!(:special_case)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_exception_on_create_bang_many
|
97
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
98
|
+
WrongReply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_exception_on_create_bang_with_block
|
103
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
104
|
+
WrongReply.create!({ "title" => "OK" }) do |r|
|
105
|
+
r.content = nil
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_exception_on_create_bang_many_with_block
|
111
|
+
assert_raise(ActiveRecord::RecordInvalid) do
|
112
|
+
WrongReply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
|
113
|
+
r.content = nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_save_without_validation
|
119
|
+
reply = WrongReply.new
|
120
|
+
assert !reply.save
|
121
|
+
assert reply.save(:validate => false)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_validates_acceptance_of_with_non_existent_table
|
125
|
+
Object.const_set :IncorporealModel, Class.new(ActiveRecord::Base)
|
126
|
+
|
127
|
+
assert_nothing_raised ActiveRecord::StatementInvalid do
|
128
|
+
IncorporealModel.validates_acceptance_of(:incorporeal_column)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_throw_away_typing
|
133
|
+
d = Developer.new("name" => "David", "salary" => "100,000")
|
134
|
+
assert !d.valid?
|
135
|
+
assert_equal 100, d.salary
|
136
|
+
assert_equal "100,000", d.salary_before_type_cast
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_validates_acceptance_of_as_database_column
|
140
|
+
Topic.validates_acceptance_of(:approved)
|
141
|
+
topic = Topic.create("approved" => true)
|
142
|
+
assert topic["approved"]
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_validators
|
146
|
+
assert_equal 1, Parrot.validators.size
|
147
|
+
assert_equal 1, Company.validators.size
|
148
|
+
assert_equal 1, Parrot.validators_on(:name).size
|
149
|
+
assert_equal 1, Company.validators_on(:name).size
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_numericality_validation_with_mutation
|
153
|
+
Topic.class_eval do
|
154
|
+
attribute :wibble, ActiveRecord::Type::String.new
|
155
|
+
validates_numericality_of :wibble, only_integer: true
|
156
|
+
end
|
157
|
+
|
158
|
+
topic = Topic.new(wibble: '123-4567')
|
159
|
+
topic.wibble.gsub!('-', '')
|
160
|
+
|
161
|
+
assert topic.valid?
|
162
|
+
ensure
|
163
|
+
Topic.reset_column_information
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require "models/book"
|
3
|
+
|
4
|
+
module ViewBehavior
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
fixtures :books
|
9
|
+
end
|
10
|
+
|
11
|
+
class Ebook < ActiveRecord::Base
|
12
|
+
self.primary_key = "id"
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
@connection = ActiveRecord::Base.connection
|
18
|
+
create_view "ebooks", <<-SQL
|
19
|
+
SELECT id, name, status FROM books WHERE format = 'ebook'
|
20
|
+
SQL
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
super
|
25
|
+
drop_view "ebooks"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_reading
|
29
|
+
books = Ebook.all
|
30
|
+
assert_equal [books(:rfr).id], books.map(&:id)
|
31
|
+
assert_equal ["Ruby for Rails"], books.map(&:name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_table_exists
|
35
|
+
view_name = Ebook.table_name
|
36
|
+
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_column_definitions
|
40
|
+
assert_equal([["id", :integer],
|
41
|
+
["name", :string],
|
42
|
+
["status", :integer]], Ebook.columns.map { |c| [c.name, c.type] })
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_attributes
|
46
|
+
assert_equal({"id" => 2, "name" => "Ruby for Rails", "status" => 0},
|
47
|
+
Ebook.first.attributes)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_does_not_assume_id_column_as_primary_key
|
51
|
+
model = Class.new(ActiveRecord::Base) do
|
52
|
+
self.table_name = "ebooks"
|
53
|
+
end
|
54
|
+
assert_nil model.primary_key
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if ActiveRecord::Base.connection.supports_views?
|
59
|
+
class ViewWithPrimaryKeyTest < ActiveRecord::TestCase
|
60
|
+
include ViewBehavior
|
61
|
+
|
62
|
+
private
|
63
|
+
def create_view(name, query)
|
64
|
+
@connection.execute "CREATE VIEW #{name} AS #{query}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def drop_view(name)
|
68
|
+
@connection.execute "DROP VIEW #{name}" if @connection.table_exists? name
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class ViewWithoutPrimaryKeyTest < ActiveRecord::TestCase
|
73
|
+
fixtures :books
|
74
|
+
|
75
|
+
class Paperback < ActiveRecord::Base; end
|
76
|
+
|
77
|
+
setup do
|
78
|
+
@connection = ActiveRecord::Base.connection
|
79
|
+
@connection.execute <<-SQL
|
80
|
+
CREATE VIEW paperbacks
|
81
|
+
AS SELECT name, status FROM books WHERE format = 'paperback'
|
82
|
+
SQL
|
83
|
+
end
|
84
|
+
|
85
|
+
teardown do
|
86
|
+
@connection.execute "DROP VIEW paperbacks" if @connection.table_exists? "paperbacks"
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_reading
|
90
|
+
books = Paperback.all
|
91
|
+
assert_equal ["Agile Web Development with Rails"], books.map(&:name)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_table_exists
|
95
|
+
view_name = Paperback.table_name
|
96
|
+
assert @connection.table_exists?(view_name), "'#{view_name}' table should exist"
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_column_definitions
|
100
|
+
assert_equal([["name", :string],
|
101
|
+
["status", :integer]], Paperback.columns.map { |c| [c.name, c.type] })
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_attributes
|
105
|
+
assert_equal({"name" => "Agile Web Development with Rails", "status" => 0},
|
106
|
+
Paperback.first.attributes)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_does_not_have_a_primary_key
|
110
|
+
assert_nil Paperback.primary_key
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,408 +1,457 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require
|
3
|
-
require 'models/
|
4
|
-
require 'models/
|
5
|
-
require 'models/
|
6
|
-
require 'models/
|
7
|
-
require 'models/
|
8
|
-
require 'models/
|
9
|
-
require 'models/
|
10
|
-
require 'models/
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
assert_match %r{
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
assert_match %r{
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
assert_match %r{
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
assert_match %r{
|
35
|
-
assert_match %r{
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
assert_match %r{
|
42
|
-
assert_match %r{
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@contact
|
69
|
-
@
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
|
88
|
-
def
|
89
|
-
assert_match %r{
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
assert_match %r{<
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
assert_match %r{
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
assert_equal
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
xml
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
xml =
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
xml =
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
assert_match %r{
|
355
|
-
end
|
356
|
-
|
357
|
-
def
|
358
|
-
xml = authors(:david).to_xml :include=>:
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
xml = authors(:david).to_xml(:
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
xml =
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
1
|
+
require "cases/helper"
|
2
|
+
require "rexml/document"
|
3
|
+
require 'models/contact'
|
4
|
+
require 'models/post'
|
5
|
+
require 'models/author'
|
6
|
+
require 'models/comment'
|
7
|
+
require 'models/company_in_module'
|
8
|
+
require 'models/toy'
|
9
|
+
require 'models/topic'
|
10
|
+
require 'models/reply'
|
11
|
+
require 'models/company'
|
12
|
+
|
13
|
+
class XmlSerializationTest < ActiveRecord::TestCase
|
14
|
+
def test_should_serialize_default_root
|
15
|
+
@xml = Contact.new.to_xml
|
16
|
+
assert_match %r{^<contact>}, @xml
|
17
|
+
assert_match %r{</contact>$}, @xml
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_serialize_default_root_with_namespace
|
21
|
+
@xml = Contact.new.to_xml :namespace=>"http://xml.rubyonrails.org/contact"
|
22
|
+
assert_match %r{^<contact xmlns="http://xml.rubyonrails.org/contact">}, @xml
|
23
|
+
assert_match %r{</contact>$}, @xml
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_serialize_custom_root
|
27
|
+
@xml = Contact.new.to_xml :root => 'xml_contact'
|
28
|
+
assert_match %r{^<xml-contact>}, @xml
|
29
|
+
assert_match %r{</xml-contact>$}, @xml
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_allow_undasherized_tags
|
33
|
+
@xml = Contact.new.to_xml :root => 'xml_contact', :dasherize => false
|
34
|
+
assert_match %r{^<xml_contact>}, @xml
|
35
|
+
assert_match %r{</xml_contact>$}, @xml
|
36
|
+
assert_match %r{<created_at}, @xml
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_allow_camelized_tags
|
40
|
+
@xml = Contact.new.to_xml :root => 'xml_contact', :camelize => true
|
41
|
+
assert_match %r{^<XmlContact>}, @xml
|
42
|
+
assert_match %r{</XmlContact>$}, @xml
|
43
|
+
assert_match %r{<CreatedAt}, @xml
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_allow_skipped_types
|
47
|
+
@xml = Contact.new(:age => 25).to_xml :skip_types => true
|
48
|
+
assert %r{<age>25</age>}.match(@xml)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_should_include_yielded_additions
|
52
|
+
@xml = Contact.new.to_xml do |xml|
|
53
|
+
xml.creator "David"
|
54
|
+
end
|
55
|
+
assert_match %r{<creator>David</creator>}, @xml
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_to_xml_with_block
|
59
|
+
value = "Rockin' the block"
|
60
|
+
xml = Contact.new.to_xml(:skip_instruct => true) do |_xml|
|
61
|
+
_xml.tag! "arbitrary-element", value
|
62
|
+
end
|
63
|
+
assert_equal "<contact>", xml.first(9)
|
64
|
+
assert xml.include?(%(<arbitrary-element>#{value}</arbitrary-element>))
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_skip_instruct_for_included_records
|
68
|
+
@contact = Contact.new
|
69
|
+
@contact.alternative = Contact.new(:name => 'Copa Cabana')
|
70
|
+
@xml = @contact.to_xml(:include => [ :alternative ])
|
71
|
+
assert_equal @xml.index('<?xml '), 0
|
72
|
+
assert_nil @xml.index('<?xml ', 1)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class DefaultXmlSerializationTest < ActiveRecord::TestCase
|
77
|
+
def setup
|
78
|
+
@contact = Contact.new(
|
79
|
+
:name => 'aaron stack',
|
80
|
+
:age => 25,
|
81
|
+
:avatar => 'binarydata',
|
82
|
+
:created_at => Time.utc(2006, 8, 1),
|
83
|
+
:awesome => false,
|
84
|
+
:preferences => { :gem => 'ruby' }
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_should_serialize_string
|
89
|
+
assert_match %r{<name>aaron stack</name>}, @contact.to_xml
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_should_serialize_integer
|
93
|
+
assert_match %r{<age type="integer">25</age>}, @contact.to_xml
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_should_serialize_binary
|
97
|
+
xml = @contact.to_xml
|
98
|
+
assert_match %r{YmluYXJ5ZGF0YQ==\n</avatar>}, xml
|
99
|
+
assert_match %r{<avatar(.*)(type="binary")}, xml
|
100
|
+
assert_match %r{<avatar(.*)(encoding="base64")}, xml
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_should_serialize_datetime
|
104
|
+
assert_match %r{<created-at type=\"dateTime\">2006-08-01T00:00:00Z</created-at>}, @contact.to_xml
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_serialize_boolean
|
108
|
+
assert_match %r{<awesome type=\"boolean\">false</awesome>}, @contact.to_xml
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_should_serialize_hash
|
112
|
+
assert_match %r{<preferences>\s*<gem>ruby</gem>\s*</preferences>}m, @contact.to_xml
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_uses_serializable_hash_with_only_option
|
116
|
+
def @contact.serializable_hash(options=nil)
|
117
|
+
super(only: %w(name))
|
118
|
+
end
|
119
|
+
|
120
|
+
xml = @contact.to_xml
|
121
|
+
assert_match %r{<name>aaron stack</name>}, xml
|
122
|
+
assert_no_match %r{age}, xml
|
123
|
+
assert_no_match %r{awesome}, xml
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_uses_serializable_hash_with_except_option
|
127
|
+
def @contact.serializable_hash(options=nil)
|
128
|
+
super(except: %w(age))
|
129
|
+
end
|
130
|
+
|
131
|
+
xml = @contact.to_xml
|
132
|
+
assert_match %r{<name>aaron stack</name>}, xml
|
133
|
+
assert_match %r{<awesome type=\"boolean\">false</awesome>}, xml
|
134
|
+
assert_no_match %r{age}, xml
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_does_not_include_inheritance_column_from_sti
|
138
|
+
@contact = ContactSti.new(@contact.attributes)
|
139
|
+
assert_equal 'ContactSti', @contact.type
|
140
|
+
|
141
|
+
xml = @contact.to_xml
|
142
|
+
assert_match %r{<name>aaron stack</name>}, xml
|
143
|
+
assert_no_match %r{<type}, xml
|
144
|
+
assert_no_match %r{ContactSti}, xml
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_serializable_hash_with_default_except_option_and_excluding_inheritance_column_from_sti
|
148
|
+
@contact = ContactSti.new(@contact.attributes)
|
149
|
+
assert_equal 'ContactSti', @contact.type
|
150
|
+
|
151
|
+
def @contact.serializable_hash(options={})
|
152
|
+
super({ except: %w(age) }.merge!(options))
|
153
|
+
end
|
154
|
+
|
155
|
+
xml = @contact.to_xml
|
156
|
+
assert_match %r{<name>aaron stack</name>}, xml
|
157
|
+
assert_no_match %r{age}, xml
|
158
|
+
assert_no_match %r{<type}, xml
|
159
|
+
assert_no_match %r{ContactSti}, xml
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
class DefaultXmlSerializationTimezoneTest < ActiveRecord::TestCase
|
164
|
+
def test_should_serialize_datetime_with_timezone
|
165
|
+
with_timezone_config zone: "Pacific Time (US & Canada)" do
|
166
|
+
toy = Toy.create(:name => 'Mickey', :updated_at => Time.utc(2006, 8, 1))
|
167
|
+
unless current_adapter?(:IBM_DBAdapter)
|
168
|
+
assert_match %r{<updated-at type=\"datetime\">2006-07-31T17:00:00-07:00</updated-at>}, toy.to_xml
|
169
|
+
else
|
170
|
+
#assert_match %r{<updated-at type=\"timestamp\">2006-07-31 17:00:00 -0700</updated-at>}, toy.to_xml
|
171
|
+
assert_match %r{<updated-at type=\"dateTime\">2006-07-31T17:00:00-07:00</updated-at>}, toy.to_xml
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_should_serialize_datetime_with_timezone_reloaded
|
177
|
+
with_timezone_config zone: "Pacific Time (US & Canada)" do
|
178
|
+
toy = Toy.create(:name => 'Minnie', :updated_at => Time.utc(2006, 8, 1)).reload
|
179
|
+
unless current_adapter?(:IBM_DBAdapter)
|
180
|
+
assert_match %r{<updated-at type=\"datetime\">2006-07-31T17:00:00-07:00</updated-at>}, toy.to_xml
|
181
|
+
else
|
182
|
+
#assert_match %r{<updated-at type=\"timestamp\">2006-07-31 17:00:00 -0700</updated-at>}, toy.to_xml
|
183
|
+
assert_match %r{<updated-at type=\"dateTime\">2006-07-31T17:00:00-07:00</updated-at>}, toy.to_xml
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class NilXmlSerializationTest < ActiveRecord::TestCase
|
190
|
+
def setup
|
191
|
+
@xml = Contact.new.to_xml(:root => 'xml_contact')
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_should_serialize_string
|
195
|
+
assert_match %r{<name nil="true"/>}, @xml
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_should_serialize_integer
|
199
|
+
assert %r{<age (.*)/>}.match(@xml)
|
200
|
+
attributes = $1
|
201
|
+
assert_match %r{nil="true"}, attributes
|
202
|
+
assert_match %r{type="integer"}, attributes
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_should_serialize_binary
|
206
|
+
assert %r{<avatar (.*)/>}.match(@xml)
|
207
|
+
attributes = $1
|
208
|
+
assert_match %r{type="binary"}, attributes
|
209
|
+
assert_match %r{encoding="base64"}, attributes
|
210
|
+
assert_match %r{nil="true"}, attributes
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_should_serialize_datetime
|
214
|
+
assert %r{<created-at (.*)/>}.match(@xml)
|
215
|
+
attributes = $1
|
216
|
+
assert_match %r{nil="true"}, attributes
|
217
|
+
assert_match %r{type="dateTime"}, attributes
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_should_serialize_boolean
|
221
|
+
assert %r{<awesome (.*)/>}.match(@xml)
|
222
|
+
attributes = $1
|
223
|
+
assert_match %r{type="boolean"}, attributes
|
224
|
+
assert_match %r{nil="true"}, attributes
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_should_serialize_yaml
|
228
|
+
assert_match %r{<preferences nil=\"true\"/>}, @xml
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
class DatabaseConnectedXmlSerializationTest < ActiveRecord::TestCase
|
233
|
+
fixtures :topics, :companies, :accounts, :authors, :posts, :projects, :author_addresses
|
234
|
+
|
235
|
+
def test_to_xml
|
236
|
+
xml = REXML::Document.new(topics(:first).to_xml(:indent => 0))
|
237
|
+
bonus_time_in_current_timezone = topics(:first).bonus_time.xmlschema
|
238
|
+
written_on_in_current_timezone = topics(:first).written_on.xmlschema
|
239
|
+
|
240
|
+
assert_equal "topic", xml.root.name
|
241
|
+
assert_equal "The First Topic" , xml.elements["//title"].text
|
242
|
+
assert_equal "David" , xml.elements["//author-name"].text
|
243
|
+
assert_match "Have a nice day", xml.elements["//content"].text
|
244
|
+
|
245
|
+
assert_equal "1", xml.elements["//id"].text
|
246
|
+
assert_equal "integer" , xml.elements["//id"].attributes['type']
|
247
|
+
|
248
|
+
assert_equal "1", xml.elements["//replies-count"].text
|
249
|
+
assert_equal "integer" , xml.elements["//replies-count"].attributes['type']
|
250
|
+
|
251
|
+
assert_equal written_on_in_current_timezone, xml.elements["//written-on"].text
|
252
|
+
assert_equal "dateTime" , xml.elements["//written-on"].attributes['type']
|
253
|
+
|
254
|
+
assert_equal "david@loudthinking.com", xml.elements["//author-email-address"].text
|
255
|
+
|
256
|
+
assert_equal nil, xml.elements["//parent-id"].text
|
257
|
+
assert_equal "integer", xml.elements["//parent-id"].attributes['type']
|
258
|
+
assert_equal "true", xml.elements["//parent-id"].attributes['nil']
|
259
|
+
|
260
|
+
# Oracle enhanced adapter allows to define Date attributes in model class (see topic.rb)
|
261
|
+
assert_equal "2004-04-15", xml.elements["//last-read"].text
|
262
|
+
assert_equal "date" , xml.elements["//last-read"].attributes['type']
|
263
|
+
|
264
|
+
# Oracle and DB2 don't have true boolean or time-only fields
|
265
|
+
unless current_adapter?(:OracleAdapter, :DB2Adapter)
|
266
|
+
assert_equal "false", xml.elements["//approved"].text
|
267
|
+
assert_equal "boolean" , xml.elements["//approved"].attributes['type']
|
268
|
+
|
269
|
+
assert_equal bonus_time_in_current_timezone, xml.elements["//bonus-time"].text
|
270
|
+
assert_equal "dateTime" , xml.elements["//bonus-time"].attributes['type']
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_except_option
|
275
|
+
xml = topics(:first).to_xml(:indent => 0, :skip_instruct => true, :except => [:title, :replies_count])
|
276
|
+
assert_equal "<topic>", xml.first(7)
|
277
|
+
assert !xml.include?(%(<title>The First Topic</title>))
|
278
|
+
assert xml.include?(%(<author-name>David</author-name>))
|
279
|
+
|
280
|
+
xml = topics(:first).to_xml(:indent => 0, :skip_instruct => true, :except => [:title, :author_name, :replies_count])
|
281
|
+
assert !xml.include?(%(<title>The First Topic</title>))
|
282
|
+
assert !xml.include?(%(<author-name>David</author-name>))
|
283
|
+
end
|
284
|
+
|
285
|
+
# to_xml used to mess with the hash the user provided which
|
286
|
+
# caused the builder to be reused. This meant the document kept
|
287
|
+
# getting appended to.
|
288
|
+
|
289
|
+
def test_modules
|
290
|
+
projects = MyApplication::Business::Project.all
|
291
|
+
xml = projects.to_xml
|
292
|
+
root = projects.first.class.to_s.underscore.pluralize.tr('/','_').dasherize
|
293
|
+
assert_match "<#{root} type=\"array\">", xml
|
294
|
+
assert_match "</#{root}>", xml
|
295
|
+
end
|
296
|
+
|
297
|
+
def test_passing_hash_shouldnt_reuse_builder
|
298
|
+
options = {:include=>:posts}
|
299
|
+
david = authors(:david)
|
300
|
+
first_xml_size = david.to_xml(options).size
|
301
|
+
second_xml_size = david.to_xml(options).size
|
302
|
+
assert_equal first_xml_size, second_xml_size
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_include_uses_association_name
|
306
|
+
xml = authors(:david).to_xml :include=>:hello_posts, :indent => 0
|
307
|
+
assert_match %r{<hello-posts type="array">}, xml
|
308
|
+
assert_match %r{<hello-post type="Post">}, xml
|
309
|
+
assert_match %r{<hello-post type="StiPost">}, xml
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_included_associations_should_skip_types
|
313
|
+
xml = authors(:david).to_xml :include=>:hello_posts, :indent => 0, :skip_types => true
|
314
|
+
assert_match %r{<hello-posts>}, xml
|
315
|
+
assert_match %r{<hello-post>}, xml
|
316
|
+
assert_match %r{<hello-post>}, xml
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_including_has_many_association
|
320
|
+
xml = topics(:first).to_xml(:indent => 0, :skip_instruct => true, :include => :replies, :except => :replies_count)
|
321
|
+
assert_equal "<topic>", xml.first(7)
|
322
|
+
assert xml.include?(%(<replies type="array"><reply>))
|
323
|
+
assert xml.include?(%(<title>The Second Topic of the day</title>))
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_including_belongs_to_association
|
327
|
+
xml = companies(:first_client).to_xml(:indent => 0, :skip_instruct => true, :include => :firm)
|
328
|
+
assert !xml.include?("<firm>")
|
329
|
+
|
330
|
+
xml = companies(:second_client).to_xml(:indent => 0, :skip_instruct => true, :include => :firm)
|
331
|
+
assert xml.include?("<firm>")
|
332
|
+
end
|
333
|
+
|
334
|
+
def test_including_multiple_associations
|
335
|
+
xml = companies(:first_firm).to_xml(:indent => 0, :skip_instruct => true, :include => [ :clients, :account ])
|
336
|
+
assert_equal "<firm>", xml.first(6)
|
337
|
+
assert xml.include?(%(<account>))
|
338
|
+
assert xml.include?(%(<clients type="array"><client>))
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_including_association_with_options
|
342
|
+
xml = companies(:first_firm).to_xml(
|
343
|
+
:indent => 0, :skip_instruct => true,
|
344
|
+
:include => { :clients => { :only => :name } }
|
345
|
+
)
|
346
|
+
|
347
|
+
assert_equal "<firm>", xml.first(6)
|
348
|
+
assert xml.include?(%(<client><name>Summit</name></client>))
|
349
|
+
assert xml.include?(%(<clients type="array"><client>))
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_methods_are_called_on_object
|
353
|
+
xml = authors(:david).to_xml :methods => :label, :indent => 0
|
354
|
+
assert_match %r{<label>.*</label>}, xml
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_should_not_call_methods_on_associations_that_dont_respond
|
358
|
+
xml = authors(:david).to_xml :include=>:hello_posts, :methods => :label, :indent => 2
|
359
|
+
assert !authors(:david).hello_posts.first.respond_to?(:label)
|
360
|
+
assert_match %r{^ <label>.*</label>}, xml
|
361
|
+
assert_no_match %r{^ <label>}, xml
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_procs_are_called_on_object
|
365
|
+
proc = Proc.new { |options| options[:builder].tag!('nationality', 'Danish') }
|
366
|
+
xml = authors(:david).to_xml(:procs => [ proc ])
|
367
|
+
assert_match %r{<nationality>Danish</nationality>}, xml
|
368
|
+
end
|
369
|
+
|
370
|
+
def test_dual_arity_procs_are_called_on_object
|
371
|
+
proc = Proc.new { |options, record| options[:builder].tag!('name-reverse', record.name.reverse) }
|
372
|
+
xml = authors(:david).to_xml(:procs => [ proc ])
|
373
|
+
assert_match %r{<name-reverse>divaD</name-reverse>}, xml
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_top_level_procs_arent_applied_to_associations
|
377
|
+
author_proc = Proc.new { |options| options[:builder].tag!('nationality', 'Danish') }
|
378
|
+
xml = authors(:david).to_xml(:procs => [ author_proc ], :include => :posts, :indent => 2)
|
379
|
+
|
380
|
+
assert_match %r{^ <nationality>Danish</nationality>}, xml
|
381
|
+
assert_no_match %r{^ {6}<nationality>Danish</nationality>}, xml
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_procs_on_included_associations_are_called
|
385
|
+
posts_proc = Proc.new { |options| options[:builder].tag!('copyright', 'DHH') }
|
386
|
+
xml = authors(:david).to_xml(
|
387
|
+
:indent => 2,
|
388
|
+
:include => {
|
389
|
+
:posts => { :procs => [ posts_proc ] }
|
390
|
+
}
|
391
|
+
)
|
392
|
+
|
393
|
+
assert_no_match %r{^ <copyright>DHH</copyright>}, xml
|
394
|
+
assert_match %r{^ {6}<copyright>DHH</copyright>}, xml
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_should_include_empty_has_many_as_empty_array
|
398
|
+
authors(:david).posts.delete_all
|
399
|
+
xml = authors(:david).to_xml :include=>:posts, :indent => 2
|
400
|
+
|
401
|
+
assert_equal [], Hash.from_xml(xml)['author']['posts']
|
402
|
+
assert_match %r{^ <posts type="array"/>}, xml
|
403
|
+
end
|
404
|
+
|
405
|
+
def test_should_has_many_array_elements_should_include_type_when_different_from_guessed_value
|
406
|
+
xml = authors(:david).to_xml :include=>:posts_with_comments, :indent => 2
|
407
|
+
|
408
|
+
assert Hash.from_xml(xml)
|
409
|
+
assert_match %r{^ <posts-with-comments type="array">}, xml
|
410
|
+
assert_match %r{^ <posts-with-comment type="Post">}, xml
|
411
|
+
assert_match %r{^ <posts-with-comment type="StiPost">}, xml
|
412
|
+
|
413
|
+
types = Hash.from_xml(xml)['author']['posts_with_comments'].collect {|t| t['type'] }
|
414
|
+
assert types.include?('SpecialPost')
|
415
|
+
assert types.include?('Post')
|
416
|
+
assert types.include?('StiPost')
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_should_produce_xml_for_methods_returning_array
|
420
|
+
xml = authors(:david).to_xml(:methods => :social)
|
421
|
+
array = Hash.from_xml(xml)['author']['social']
|
422
|
+
assert_equal 2, array.size
|
423
|
+
assert array.include? 'twitter'
|
424
|
+
assert array.include? 'github'
|
425
|
+
end
|
426
|
+
|
427
|
+
def test_should_support_aliased_attributes
|
428
|
+
xml = Author.select("name as firstname").to_xml
|
429
|
+
Author.all.each do |author|
|
430
|
+
assert xml.include?(%(<firstname>#{author.name}</firstname>)), xml
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
def test_array_to_xml_including_has_many_association
|
435
|
+
xml = [ topics(:first), topics(:second) ].to_xml(:indent => 0, :skip_instruct => true, :include => :replies)
|
436
|
+
assert xml.include?(%(<replies type="array"><reply>))
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_array_to_xml_including_methods
|
440
|
+
xml = [ topics(:first), topics(:second) ].to_xml(:indent => 0, :skip_instruct => true, :methods => [ :topic_id ])
|
441
|
+
assert xml.include?(%(<topic-id type="integer">#{topics(:first).topic_id}</topic-id>)), xml
|
442
|
+
assert xml.include?(%(<topic-id type="integer">#{topics(:second).topic_id}</topic-id>)), xml
|
443
|
+
end
|
444
|
+
|
445
|
+
def test_array_to_xml_including_has_one_association
|
446
|
+
xml = [ companies(:first_firm), companies(:rails_core) ].to_xml(:indent => 0, :skip_instruct => true, :include => :account)
|
447
|
+
assert xml.include?(companies(:first_firm).account.to_xml(:indent => 0, :skip_instruct => true))
|
448
|
+
assert xml.include?(companies(:rails_core).account.to_xml(:indent => 0, :skip_instruct => true))
|
449
|
+
end
|
450
|
+
|
451
|
+
def test_array_to_xml_including_belongs_to_association
|
452
|
+
xml = [ companies(:first_client), companies(:second_client), companies(:another_client) ].to_xml(:indent => 0, :skip_instruct => true, :include => :firm)
|
453
|
+
assert xml.include?(companies(:first_client).to_xml(:indent => 0, :skip_instruct => true))
|
454
|
+
assert xml.include?(companies(:second_client).firm.to_xml(:indent => 0, :skip_instruct => true))
|
455
|
+
assert xml.include?(companies(:another_client).firm.to_xml(:indent => 0, :skip_instruct => true))
|
456
|
+
end
|
457
|
+
end
|