activerecord 2.3.18 → 3.2.22
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1014 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +222 -0
- data/examples/performance.rb +100 -126
- data/examples/simple.rb +14 -0
- data/lib/active_record/aggregations.rb +93 -99
- data/lib/active_record/associations/alias_tracker.rb +76 -0
- data/lib/active_record/associations/association.rb +247 -0
- data/lib/active_record/associations/association_scope.rb +134 -0
- data/lib/active_record/associations/belongs_to_association.rb +54 -61
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
- data/lib/active_record/associations/builder/association.rb +55 -0
- data/lib/active_record/associations/builder/belongs_to.rb +88 -0
- data/lib/active_record/associations/builder/collection_association.rb +75 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
- data/lib/active_record/associations/builder/has_many.rb +71 -0
- data/lib/active_record/associations/builder/has_one.rb +62 -0
- data/lib/active_record/associations/builder/singular_association.rb +32 -0
- data/lib/active_record/associations/collection_association.rb +580 -0
- data/lib/active_record/associations/collection_proxy.rb +133 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
- data/lib/active_record/associations/has_many_association.rb +60 -79
- data/lib/active_record/associations/has_many_through_association.rb +127 -206
- data/lib/active_record/associations/has_one_association.rb +55 -114
- data/lib/active_record/associations/has_one_through_association.rb +25 -26
- data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
- data/lib/active_record/associations/join_dependency.rb +214 -0
- data/lib/active_record/associations/join_helper.rb +55 -0
- data/lib/active_record/associations/preloader/association.rb +125 -0
- data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
- data/lib/active_record/associations/preloader/collection_association.rb +24 -0
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
- data/lib/active_record/associations/preloader/has_many.rb +17 -0
- data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
- data/lib/active_record/associations/preloader/has_one.rb +23 -0
- data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
- data/lib/active_record/associations/preloader/singular_association.rb +21 -0
- data/lib/active_record/associations/preloader/through_association.rb +67 -0
- data/lib/active_record/associations/preloader.rb +181 -0
- data/lib/active_record/associations/singular_association.rb +64 -0
- data/lib/active_record/associations/through_association.rb +87 -0
- data/lib/active_record/associations.rb +693 -1337
- data/lib/active_record/attribute_assignment.rb +221 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
- data/lib/active_record/attribute_methods/dirty.rb +111 -0
- data/lib/active_record/attribute_methods/primary_key.rb +114 -0
- data/lib/active_record/attribute_methods/query.rb +39 -0
- data/lib/active_record/attribute_methods/read.rb +136 -0
- data/lib/active_record/attribute_methods/serialization.rb +120 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
- data/lib/active_record/attribute_methods/write.rb +70 -0
- data/lib/active_record/attribute_methods.rb +211 -339
- data/lib/active_record/autosave_association.rb +179 -149
- data/lib/active_record/base.rb +401 -2907
- data/lib/active_record/callbacks.rb +91 -176
- data/lib/active_record/coders/yaml_column.rb +41 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
- data/lib/active_record/connection_adapters/column.rb +296 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
- data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
- data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
- data/lib/active_record/counter_cache.rb +123 -0
- data/lib/active_record/dynamic_finder_match.rb +41 -14
- data/lib/active_record/dynamic_matchers.rb +84 -0
- data/lib/active_record/dynamic_scope_match.rb +13 -15
- data/lib/active_record/errors.rb +195 -0
- data/lib/active_record/explain.rb +86 -0
- data/lib/active_record/explain_subscriber.rb +25 -0
- data/lib/active_record/fixtures/file.rb +65 -0
- data/lib/active_record/fixtures.rb +695 -770
- data/lib/active_record/identity_map.rb +162 -0
- data/lib/active_record/inheritance.rb +174 -0
- data/lib/active_record/integration.rb +60 -0
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +76 -73
- data/lib/active_record/locking/pessimistic.rb +32 -10
- data/lib/active_record/log_subscriber.rb +72 -0
- data/lib/active_record/migration/command_recorder.rb +105 -0
- data/lib/active_record/migration.rb +415 -205
- data/lib/active_record/model_schema.rb +368 -0
- data/lib/active_record/nested_attributes.rb +153 -63
- data/lib/active_record/observer.rb +27 -103
- data/lib/active_record/persistence.rb +376 -0
- data/lib/active_record/query_cache.rb +49 -8
- data/lib/active_record/querying.rb +58 -0
- data/lib/active_record/railtie.rb +131 -0
- data/lib/active_record/railties/console_sandbox.rb +6 -0
- data/lib/active_record/railties/controller_runtime.rb +49 -0
- data/lib/active_record/railties/databases.rake +659 -0
- data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
- data/lib/active_record/readonly_attributes.rb +26 -0
- data/lib/active_record/reflection.rb +269 -120
- data/lib/active_record/relation/batches.rb +90 -0
- data/lib/active_record/relation/calculations.rb +372 -0
- data/lib/active_record/relation/delegation.rb +49 -0
- data/lib/active_record/relation/finder_methods.rb +402 -0
- data/lib/active_record/relation/predicate_builder.rb +63 -0
- data/lib/active_record/relation/query_methods.rb +417 -0
- data/lib/active_record/relation/spawn_methods.rb +180 -0
- data/lib/active_record/relation.rb +537 -0
- data/lib/active_record/result.rb +40 -0
- data/lib/active_record/sanitization.rb +194 -0
- data/lib/active_record/schema.rb +9 -6
- data/lib/active_record/schema_dumper.rb +55 -32
- data/lib/active_record/scoping/default.rb +142 -0
- data/lib/active_record/scoping/named.rb +200 -0
- data/lib/active_record/scoping.rb +152 -0
- data/lib/active_record/serialization.rb +8 -91
- data/lib/active_record/serializers/xml_serializer.rb +43 -197
- data/lib/active_record/session_store.rb +129 -103
- data/lib/active_record/store.rb +52 -0
- data/lib/active_record/test_case.rb +30 -23
- data/lib/active_record/timestamp.rb +95 -52
- data/lib/active_record/transactions.rb +212 -66
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/validations/associated.rb +43 -0
- data/lib/active_record/validations/uniqueness.rb +180 -0
- data/lib/active_record/validations.rb +43 -1106
- data/lib/active_record/version.rb +5 -4
- data/lib/active_record.rb +121 -48
- data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
- data/lib/rails/generators/active_record/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
- data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
- data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
- data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
- data/lib/rails/generators/active_record.rb +25 -0
- metadata +187 -363
- data/CHANGELOG +0 -5904
- data/README +0 -351
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/association_preload.rb +0 -406
- data/lib/active_record/associations/association_collection.rb +0 -533
- data/lib/active_record/associations/association_proxy.rb +0 -288
- data/lib/active_record/batches.rb +0 -85
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/dirty.rb +0 -183
- data/lib/active_record/named_scope.rb +0 -197
- data/lib/active_record/serializers/json_serializer.rb +0 -91
- data/lib/activerecord.rb +0 -2
- data/test/assets/example.log +0 -1
- data/test/assets/flowers.jpg +0 -0
- data/test/cases/aaa_create_tables_test.rb +0 -24
- data/test/cases/active_schema_test_mysql.rb +0 -122
- data/test/cases/active_schema_test_postgresql.rb +0 -24
- data/test/cases/adapter_test.rb +0 -144
- data/test/cases/aggregations_test.rb +0 -167
- data/test/cases/ar_schema_test.rb +0 -32
- data/test/cases/associations/belongs_to_associations_test.rb +0 -438
- data/test/cases/associations/callbacks_test.rb +0 -161
- data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
- data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
- data/test/cases/associations/eager_singularization_test.rb +0 -145
- data/test/cases/associations/eager_test.rb +0 -852
- data/test/cases/associations/extension_test.rb +0 -62
- data/test/cases/associations/habtm_join_table_test.rb +0 -56
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
- data/test/cases/associations/has_many_associations_test.rb +0 -1273
- data/test/cases/associations/has_many_through_associations_test.rb +0 -360
- data/test/cases/associations/has_one_associations_test.rb +0 -330
- data/test/cases/associations/has_one_through_associations_test.rb +0 -209
- data/test/cases/associations/inner_join_association_test.rb +0 -93
- data/test/cases/associations/inverse_associations_test.rb +0 -566
- data/test/cases/associations/join_model_test.rb +0 -712
- data/test/cases/associations_test.rb +0 -282
- data/test/cases/attribute_methods_test.rb +0 -305
- data/test/cases/autosave_association_test.rb +0 -1218
- data/test/cases/base_test.rb +0 -2166
- data/test/cases/batches_test.rb +0 -81
- data/test/cases/binary_test.rb +0 -30
- data/test/cases/calculations_test.rb +0 -360
- data/test/cases/callbacks_observers_test.rb +0 -38
- data/test/cases/callbacks_test.rb +0 -438
- data/test/cases/class_inheritable_attributes_test.rb +0 -32
- data/test/cases/column_alias_test.rb +0 -17
- data/test/cases/column_definition_test.rb +0 -70
- data/test/cases/connection_pool_test.rb +0 -25
- data/test/cases/connection_test_firebird.rb +0 -8
- data/test/cases/connection_test_mysql.rb +0 -65
- data/test/cases/copy_table_test_sqlite.rb +0 -80
- data/test/cases/counter_cache_test.rb +0 -84
- data/test/cases/database_statements_test.rb +0 -12
- data/test/cases/datatype_test_postgresql.rb +0 -204
- data/test/cases/date_time_test.rb +0 -37
- data/test/cases/default_test_firebird.rb +0 -16
- data/test/cases/defaults_test.rb +0 -111
- data/test/cases/deprecated_finder_test.rb +0 -30
- data/test/cases/dirty_test.rb +0 -316
- data/test/cases/finder_respond_to_test.rb +0 -76
- data/test/cases/finder_test.rb +0 -1098
- data/test/cases/fixtures_test.rb +0 -661
- data/test/cases/helper.rb +0 -68
- data/test/cases/i18n_test.rb +0 -46
- data/test/cases/inheritance_test.rb +0 -262
- data/test/cases/invalid_date_test.rb +0 -24
- data/test/cases/json_serialization_test.rb +0 -219
- data/test/cases/lifecycle_test.rb +0 -193
- data/test/cases/locking_test.rb +0 -350
- data/test/cases/method_scoping_test.rb +0 -704
- data/test/cases/migration_test.rb +0 -1649
- data/test/cases/migration_test_firebird.rb +0 -124
- data/test/cases/mixin_test.rb +0 -96
- data/test/cases/modules_test.rb +0 -109
- data/test/cases/multiple_db_test.rb +0 -85
- data/test/cases/named_scope_test.rb +0 -372
- data/test/cases/nested_attributes_test.rb +0 -840
- data/test/cases/pk_test.rb +0 -119
- data/test/cases/pooled_connections_test.rb +0 -103
- data/test/cases/query_cache_test.rb +0 -129
- data/test/cases/readonly_test.rb +0 -107
- data/test/cases/reflection_test.rb +0 -234
- data/test/cases/reload_models_test.rb +0 -22
- data/test/cases/repair_helper.rb +0 -50
- data/test/cases/reserved_word_test_mysql.rb +0 -176
- data/test/cases/sanitize_test.rb +0 -25
- data/test/cases/schema_authorization_test_postgresql.rb +0 -75
- data/test/cases/schema_dumper_test.rb +0 -211
- data/test/cases/schema_test_postgresql.rb +0 -178
- data/test/cases/serialization_test.rb +0 -47
- data/test/cases/sp_test_mysql.rb +0 -16
- data/test/cases/synonym_test_oracle.rb +0 -17
- data/test/cases/timestamp_test.rb +0 -75
- data/test/cases/transactions_test.rb +0 -543
- data/test/cases/unconnected_test.rb +0 -32
- data/test/cases/validations_i18n_test.rb +0 -925
- data/test/cases/validations_test.rb +0 -1684
- data/test/cases/xml_serialization_test.rb +0 -240
- data/test/cases/yaml_serialization_test.rb +0 -11
- data/test/config.rb +0 -5
- data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
- data/test/connections/jdbc_jdbch2/connection.rb +0 -18
- data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
- data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
- data/test/connections/native_db2/connection.rb +0 -25
- data/test/connections/native_firebird/connection.rb +0 -26
- data/test/connections/native_frontbase/connection.rb +0 -27
- data/test/connections/native_mysql/connection.rb +0 -25
- data/test/connections/native_openbase/connection.rb +0 -21
- data/test/connections/native_oracle/connection.rb +0 -27
- data/test/connections/native_postgresql/connection.rb +0 -21
- data/test/connections/native_sqlite/connection.rb +0 -25
- data/test/connections/native_sqlite3/connection.rb +0 -25
- data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
- data/test/connections/native_sybase/connection.rb +0 -23
- data/test/fixtures/accounts.yml +0 -29
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.csv +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +0 -5
- data/test/fixtures/author_favorites.yml +0 -4
- data/test/fixtures/authors.yml +0 -9
- data/test/fixtures/binaries.yml +0 -132
- data/test/fixtures/books.yml +0 -7
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- data/test/fixtures/categories.yml +0 -14
- data/test/fixtures/categories_ordered.yml +0 -7
- data/test/fixtures/categories_posts.yml +0 -23
- data/test/fixtures/categorizations.yml +0 -17
- data/test/fixtures/clubs.yml +0 -6
- data/test/fixtures/comments.yml +0 -59
- data/test/fixtures/companies.yml +0 -56
- data/test/fixtures/computers.yml +0 -4
- data/test/fixtures/courses.yml +0 -7
- data/test/fixtures/customers.yml +0 -26
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers_projects.yml +0 -17
- data/test/fixtures/edges.yml +0 -6
- data/test/fixtures/entrants.yml +0 -14
- data/test/fixtures/faces.yml +0 -11
- data/test/fixtures/fk_test_has_fk.yml +0 -3
- data/test/fixtures/fk_test_has_pk.yml +0 -2
- data/test/fixtures/funny_jokes.yml +0 -10
- data/test/fixtures/interests.yml +0 -33
- data/test/fixtures/items.yml +0 -4
- data/test/fixtures/jobs.yml +0 -7
- data/test/fixtures/legacy_things.yml +0 -3
- data/test/fixtures/mateys.yml +0 -4
- data/test/fixtures/member_types.yml +0 -6
- data/test/fixtures/members.yml +0 -6
- data/test/fixtures/memberships.yml +0 -20
- data/test/fixtures/men.yml +0 -5
- data/test/fixtures/minimalistics.yml +0 -2
- data/test/fixtures/mixed_case_monkeys.yml +0 -6
- data/test/fixtures/mixins.yml +0 -29
- data/test/fixtures/movies.yml +0 -7
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/fixtures/naked/yml/accounts.yml +0 -1
- data/test/fixtures/naked/yml/companies.yml +0 -1
- data/test/fixtures/naked/yml/courses.yml +0 -1
- data/test/fixtures/organizations.yml +0 -5
- data/test/fixtures/owners.yml +0 -7
- data/test/fixtures/parrots.yml +0 -27
- data/test/fixtures/parrots_pirates.yml +0 -7
- data/test/fixtures/people.yml +0 -15
- data/test/fixtures/pets.yml +0 -14
- data/test/fixtures/pirates.yml +0 -9
- data/test/fixtures/polymorphic_designs.yml +0 -19
- data/test/fixtures/polymorphic_prices.yml +0 -19
- data/test/fixtures/posts.yml +0 -52
- data/test/fixtures/price_estimates.yml +0 -7
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/readers.yml +0 -9
- data/test/fixtures/references.yml +0 -17
- data/test/fixtures/reserved_words/distinct.yml +0 -5
- data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
- data/test/fixtures/reserved_words/group.yml +0 -14
- data/test/fixtures/reserved_words/select.yml +0 -8
- data/test/fixtures/reserved_words/values.yml +0 -7
- data/test/fixtures/ships.yml +0 -5
- data/test/fixtures/sponsors.yml +0 -9
- data/test/fixtures/subscribers.yml +0 -7
- data/test/fixtures/subscriptions.yml +0 -12
- data/test/fixtures/taggings.yml +0 -28
- data/test/fixtures/tags.yml +0 -7
- data/test/fixtures/tasks.yml +0 -7
- data/test/fixtures/tees.yml +0 -4
- data/test/fixtures/ties.yml +0 -4
- data/test/fixtures/topics.yml +0 -42
- data/test/fixtures/toys.yml +0 -4
- data/test/fixtures/treasures.yml +0 -10
- data/test/fixtures/vertices.yml +0 -4
- data/test/fixtures/warehouse-things.yml +0 -3
- data/test/fixtures/zines.yml +0 -5
- data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
- data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
- data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
- data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
- data/test/migrations/duplicate/3_foo.rb +0 -7
- data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
- data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
- data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
- data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
- data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
- data/test/migrations/missing/1_people_have_last_names.rb +0 -9
- data/test/migrations/missing/3_we_need_reminders.rb +0 -12
- data/test/migrations/missing/4_innocent_jointable.rb +0 -12
- data/test/migrations/valid/1_people_have_last_names.rb +0 -9
- data/test/migrations/valid/2_we_need_reminders.rb +0 -12
- data/test/migrations/valid/3_innocent_jointable.rb +0 -12
- data/test/models/author.rb +0 -151
- data/test/models/auto_id.rb +0 -4
- data/test/models/binary.rb +0 -2
- data/test/models/bird.rb +0 -9
- data/test/models/book.rb +0 -4
- data/test/models/categorization.rb +0 -5
- data/test/models/category.rb +0 -34
- data/test/models/citation.rb +0 -6
- data/test/models/club.rb +0 -13
- data/test/models/column_name.rb +0 -3
- data/test/models/comment.rb +0 -29
- data/test/models/company.rb +0 -173
- data/test/models/company_in_module.rb +0 -78
- data/test/models/computer.rb +0 -3
- data/test/models/contact.rb +0 -16
- data/test/models/contract.rb +0 -5
- data/test/models/course.rb +0 -3
- data/test/models/customer.rb +0 -73
- data/test/models/default.rb +0 -2
- data/test/models/developer.rb +0 -101
- data/test/models/edge.rb +0 -5
- data/test/models/entrant.rb +0 -3
- data/test/models/essay.rb +0 -3
- data/test/models/event.rb +0 -3
- data/test/models/event_author.rb +0 -8
- data/test/models/face.rb +0 -7
- data/test/models/guid.rb +0 -2
- data/test/models/interest.rb +0 -5
- data/test/models/invoice.rb +0 -4
- data/test/models/item.rb +0 -7
- data/test/models/job.rb +0 -5
- data/test/models/joke.rb +0 -3
- data/test/models/keyboard.rb +0 -3
- data/test/models/legacy_thing.rb +0 -3
- data/test/models/line_item.rb +0 -3
- data/test/models/man.rb +0 -9
- data/test/models/matey.rb +0 -4
- data/test/models/member.rb +0 -12
- data/test/models/member_detail.rb +0 -5
- data/test/models/member_type.rb +0 -3
- data/test/models/membership.rb +0 -9
- data/test/models/minimalistic.rb +0 -2
- data/test/models/mixed_case_monkey.rb +0 -3
- data/test/models/movie.rb +0 -5
- data/test/models/order.rb +0 -4
- data/test/models/organization.rb +0 -6
- data/test/models/owner.rb +0 -5
- data/test/models/parrot.rb +0 -22
- data/test/models/person.rb +0 -16
- data/test/models/pet.rb +0 -5
- data/test/models/pirate.rb +0 -80
- data/test/models/polymorphic_design.rb +0 -3
- data/test/models/polymorphic_price.rb +0 -3
- data/test/models/post.rb +0 -102
- data/test/models/price_estimate.rb +0 -3
- data/test/models/project.rb +0 -30
- data/test/models/reader.rb +0 -4
- data/test/models/reference.rb +0 -4
- data/test/models/reply.rb +0 -46
- data/test/models/ship.rb +0 -19
- data/test/models/ship_part.rb +0 -7
- data/test/models/sponsor.rb +0 -4
- data/test/models/subject.rb +0 -4
- data/test/models/subscriber.rb +0 -8
- data/test/models/subscription.rb +0 -4
- data/test/models/tag.rb +0 -7
- data/test/models/tagging.rb +0 -10
- data/test/models/task.rb +0 -3
- data/test/models/tee.rb +0 -4
- data/test/models/tie.rb +0 -4
- data/test/models/topic.rb +0 -80
- data/test/models/toy.rb +0 -6
- data/test/models/treasure.rb +0 -8
- data/test/models/vertex.rb +0 -9
- data/test/models/warehouse_thing.rb +0 -5
- data/test/models/zine.rb +0 -3
- data/test/schema/mysql_specific_schema.rb +0 -31
- data/test/schema/postgresql_specific_schema.rb +0 -114
- data/test/schema/schema.rb +0 -550
- data/test/schema/schema2.rb +0 -6
- data/test/schema/sqlite_specific_schema.rb +0 -25
data/test/cases/pk_test.rb
DELETED
@@ -1,119 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/topic'
|
3
|
-
require 'models/reply'
|
4
|
-
require 'models/subscriber'
|
5
|
-
require 'models/movie'
|
6
|
-
require 'models/keyboard'
|
7
|
-
require 'models/mixed_case_monkey'
|
8
|
-
|
9
|
-
class PrimaryKeysTest < ActiveRecord::TestCase
|
10
|
-
fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
|
11
|
-
|
12
|
-
def test_integer_key
|
13
|
-
topic = Topic.find(1)
|
14
|
-
assert_equal(topics(:first).author_name, topic.author_name)
|
15
|
-
topic = Topic.find(2)
|
16
|
-
assert_equal(topics(:second).author_name, topic.author_name)
|
17
|
-
|
18
|
-
topic = Topic.new
|
19
|
-
topic.title = "New Topic"
|
20
|
-
assert_equal(nil, topic.id)
|
21
|
-
assert_nothing_raised { topic.save! }
|
22
|
-
id = topic.id
|
23
|
-
|
24
|
-
topicReloaded = Topic.find(id)
|
25
|
-
assert_equal("New Topic", topicReloaded.title)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_customized_primary_key_auto_assigns_on_save
|
29
|
-
Keyboard.delete_all
|
30
|
-
keyboard = Keyboard.new(:name => 'HHKB')
|
31
|
-
assert_nothing_raised { keyboard.save! }
|
32
|
-
assert_equal keyboard.id, Keyboard.find_by_name('HHKB').id
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_customized_primary_key_can_be_get_before_saving
|
36
|
-
keyboard = Keyboard.new
|
37
|
-
assert_nil keyboard.id
|
38
|
-
assert_nothing_raised { assert_nil keyboard.key_number }
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_customized_string_primary_key_settable_before_save
|
42
|
-
subscriber = Subscriber.new
|
43
|
-
assert_nothing_raised { subscriber.id = 'webster123' }
|
44
|
-
assert_equal 'webster123', subscriber.id
|
45
|
-
assert_equal 'webster123', subscriber.nick
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_string_key
|
49
|
-
subscriber = Subscriber.find(subscribers(:first).nick)
|
50
|
-
assert_equal(subscribers(:first).name, subscriber.name)
|
51
|
-
subscriber = Subscriber.find(subscribers(:second).nick)
|
52
|
-
assert_equal(subscribers(:second).name, subscriber.name)
|
53
|
-
|
54
|
-
subscriber = Subscriber.new
|
55
|
-
subscriber.id = "jdoe"
|
56
|
-
assert_equal("jdoe", subscriber.id)
|
57
|
-
subscriber.name = "John Doe"
|
58
|
-
assert_nothing_raised { subscriber.save! }
|
59
|
-
assert_equal("jdoe", subscriber.id)
|
60
|
-
|
61
|
-
subscriberReloaded = Subscriber.find("jdoe")
|
62
|
-
assert_equal("John Doe", subscriberReloaded.name)
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_find_with_more_than_one_string_key
|
66
|
-
assert_equal 2, Subscriber.find(subscribers(:first).nick, subscribers(:second).nick).length
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_primary_key_prefix
|
70
|
-
ActiveRecord::Base.primary_key_prefix_type = :table_name
|
71
|
-
Topic.reset_primary_key
|
72
|
-
assert_equal "topicid", Topic.primary_key
|
73
|
-
|
74
|
-
ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
|
75
|
-
Topic.reset_primary_key
|
76
|
-
assert_equal "topic_id", Topic.primary_key
|
77
|
-
|
78
|
-
ActiveRecord::Base.primary_key_prefix_type = nil
|
79
|
-
Topic.reset_primary_key
|
80
|
-
assert_equal "id", Topic.primary_key
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_delete_should_quote_pkey
|
84
|
-
assert_nothing_raised { MixedCaseMonkey.delete(1) }
|
85
|
-
end
|
86
|
-
def test_update_counters_should_quote_pkey_and_quote_counter_columns
|
87
|
-
assert_nothing_raised { MixedCaseMonkey.update_counters(1, :fleaCount => 99) }
|
88
|
-
end
|
89
|
-
def test_find_with_one_id_should_quote_pkey
|
90
|
-
assert_nothing_raised { MixedCaseMonkey.find(1) }
|
91
|
-
end
|
92
|
-
def test_find_with_multiple_ids_should_quote_pkey
|
93
|
-
assert_nothing_raised { MixedCaseMonkey.find([1,2]) }
|
94
|
-
end
|
95
|
-
def test_instance_update_should_quote_pkey
|
96
|
-
assert_nothing_raised { MixedCaseMonkey.find(1).save }
|
97
|
-
end
|
98
|
-
def test_instance_destroy_should_quote_pkey
|
99
|
-
assert_nothing_raised { MixedCaseMonkey.find(1).destroy }
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_supports_primary_key
|
103
|
-
assert_nothing_raised NoMethodError do
|
104
|
-
ActiveRecord::Base.connection.supports_primary_key?
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_primary_key_returns_value_if_it_exists
|
109
|
-
if ActiveRecord::Base.connection.supports_primary_key?
|
110
|
-
assert_equal 'id', ActiveRecord::Base.connection.primary_key('developers')
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_primary_key_returns_nil_if_it_does_not_exist
|
115
|
-
if ActiveRecord::Base.connection.supports_primary_key?
|
116
|
-
assert_nil ActiveRecord::Base.connection.primary_key('developers_projects')
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class PooledConnectionsTest < ActiveRecord::TestCase
|
4
|
-
def setup
|
5
|
-
super
|
6
|
-
@connection = ActiveRecord::Base.remove_connection
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
ActiveRecord::Base.clear_all_connections!
|
11
|
-
ActiveRecord::Base.establish_connection(@connection)
|
12
|
-
super
|
13
|
-
end
|
14
|
-
|
15
|
-
def checkout_connections
|
16
|
-
ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :wait_timeout => 0.3}))
|
17
|
-
@connections = []
|
18
|
-
@timed_out = 0
|
19
|
-
|
20
|
-
4.times do
|
21
|
-
Thread.new do
|
22
|
-
begin
|
23
|
-
@connections << ActiveRecord::Base.connection_pool.checkout
|
24
|
-
rescue ActiveRecord::ConnectionTimeoutError
|
25
|
-
@timed_out += 1
|
26
|
-
end
|
27
|
-
end.join
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Will deadlock due to lack of Monitor timeouts in 1.9
|
32
|
-
if RUBY_VERSION < '1.9'
|
33
|
-
def test_pooled_connection_checkout
|
34
|
-
checkout_connections
|
35
|
-
assert_equal @connections.length, 2
|
36
|
-
assert_equal @timed_out, 2
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def checkout_checkin_connections(pool_size, threads)
|
41
|
-
ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :wait_timeout => 0.5}))
|
42
|
-
@connection_count = 0
|
43
|
-
@timed_out = 0
|
44
|
-
threads.times do
|
45
|
-
Thread.new do
|
46
|
-
begin
|
47
|
-
conn = ActiveRecord::Base.connection_pool.checkout
|
48
|
-
sleep 0.1
|
49
|
-
ActiveRecord::Base.connection_pool.checkin conn
|
50
|
-
@connection_count += 1
|
51
|
-
rescue ActiveRecord::ConnectionTimeoutError
|
52
|
-
@timed_out += 1
|
53
|
-
end
|
54
|
-
end.join
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_pooled_connection_checkin_one
|
59
|
-
checkout_checkin_connections 1, 2
|
60
|
-
assert_equal 2, @connection_count
|
61
|
-
assert_equal 0, @timed_out
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_pooled_connection_checkin_two
|
65
|
-
checkout_checkin_connections 2, 3
|
66
|
-
assert_equal 3, @connection_count
|
67
|
-
assert_equal 0, @timed_out
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_pooled_connection_checkout_existing_first
|
71
|
-
ActiveRecord::Base.establish_connection(@connection.merge({:pool => 1}))
|
72
|
-
conn_pool = ActiveRecord::Base.connection_pool
|
73
|
-
conn = conn_pool.checkout
|
74
|
-
conn_pool.checkin(conn)
|
75
|
-
conn = conn_pool.checkout
|
76
|
-
assert ActiveRecord::ConnectionAdapters::AbstractAdapter === conn
|
77
|
-
conn_pool.checkin(conn)
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_not_connected_defined_connection_returns_false
|
81
|
-
ActiveRecord::Base.establish_connection(@connection)
|
82
|
-
assert ! ActiveRecord::Base.connected?
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_undefined_connection_returns_false
|
86
|
-
old_handler = ActiveRecord::Base.connection_handler
|
87
|
-
ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
88
|
-
assert_equal false, ActiveRecord::Base.connected?
|
89
|
-
ensure
|
90
|
-
ActiveRecord::Base.connection_handler = old_handler
|
91
|
-
end
|
92
|
-
end unless %w(FrontBase).include? ActiveRecord::Base.connection.adapter_name
|
93
|
-
|
94
|
-
class AllowConcurrencyDeprecatedTest < ActiveRecord::TestCase
|
95
|
-
def test_allow_concurrency_is_deprecated
|
96
|
-
assert_deprecated('ActiveRecord::Base.allow_concurrency') do
|
97
|
-
ActiveRecord::Base.allow_concurrency
|
98
|
-
end
|
99
|
-
assert_deprecated('ActiveRecord::Base.allow_concurrency=') do
|
100
|
-
ActiveRecord::Base.allow_concurrency = true
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,129 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/topic'
|
3
|
-
require 'models/reply'
|
4
|
-
require 'models/task'
|
5
|
-
require 'models/course'
|
6
|
-
require 'models/category'
|
7
|
-
require 'models/post'
|
8
|
-
|
9
|
-
|
10
|
-
class QueryCacheTest < ActiveRecord::TestCase
|
11
|
-
fixtures :tasks, :topics, :categories, :posts, :categories_posts
|
12
|
-
|
13
|
-
def test_find_queries
|
14
|
-
assert_queries(2) { Task.find(1); Task.find(1) }
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_find_queries_with_cache
|
18
|
-
Task.cache do
|
19
|
-
assert_queries(1) { Task.find(1); Task.find(1) }
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_count_queries_with_cache
|
24
|
-
Task.cache do
|
25
|
-
assert_queries(1) { Task.count; Task.count }
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_query_cache_dups_results_correctly
|
30
|
-
Task.cache do
|
31
|
-
now = Time.now.utc
|
32
|
-
task = Task.find 1
|
33
|
-
assert_not_equal now, task.starting
|
34
|
-
task.starting = now
|
35
|
-
task.reload
|
36
|
-
assert_not_equal now, task.starting
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_cache_is_flat
|
41
|
-
Task.cache do
|
42
|
-
Topic.columns # don't count this query
|
43
|
-
assert_queries(1) { Topic.find(1); Topic.find(1); }
|
44
|
-
end
|
45
|
-
|
46
|
-
ActiveRecord::Base.cache do
|
47
|
-
assert_queries(1) { Task.find(1); Task.find(1) }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_cache_does_not_wrap_string_results_in_arrays
|
52
|
-
require 'sqlite3/version' if current_adapter?(:SQLite3Adapter)
|
53
|
-
|
54
|
-
Task.cache do
|
55
|
-
if current_adapter?(:SQLite3Adapter) && SQLite3::Version::VERSION > '1.2.5'
|
56
|
-
assert_instance_of Fixnum, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
57
|
-
else
|
58
|
-
assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class QueryCacheExpiryTest < ActiveRecord::TestCase
|
65
|
-
fixtures :tasks, :posts, :categories, :categories_posts
|
66
|
-
|
67
|
-
def test_find
|
68
|
-
Task.connection.expects(:clear_query_cache).times(1)
|
69
|
-
|
70
|
-
assert !Task.connection.query_cache_enabled
|
71
|
-
Task.cache do
|
72
|
-
assert Task.connection.query_cache_enabled
|
73
|
-
Task.find(1)
|
74
|
-
|
75
|
-
Task.uncached do
|
76
|
-
assert !Task.connection.query_cache_enabled
|
77
|
-
Task.find(1)
|
78
|
-
end
|
79
|
-
|
80
|
-
assert Task.connection.query_cache_enabled
|
81
|
-
end
|
82
|
-
assert !Task.connection.query_cache_enabled
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_update
|
86
|
-
Task.connection.expects(:clear_query_cache).times(2)
|
87
|
-
|
88
|
-
Task.cache do
|
89
|
-
task = Task.find(1)
|
90
|
-
task.starting = Time.now.utc
|
91
|
-
task.save!
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_destroy
|
96
|
-
Task.connection.expects(:clear_query_cache).times(2)
|
97
|
-
|
98
|
-
Task.cache do
|
99
|
-
Task.find(1).destroy
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_insert
|
104
|
-
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
105
|
-
|
106
|
-
Task.cache do
|
107
|
-
Task.create!
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_cache_is_expired_by_habtm_update
|
112
|
-
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
113
|
-
ActiveRecord::Base.cache do
|
114
|
-
c = Category.find(:first)
|
115
|
-
p = Post.find(:first)
|
116
|
-
p.categories << c
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_cache_is_expired_by_habtm_delete
|
121
|
-
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
122
|
-
ActiveRecord::Base.cache do
|
123
|
-
c = Category.find(1)
|
124
|
-
p = Post.find(1)
|
125
|
-
assert p.categories.any?
|
126
|
-
p.categories.delete_all
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
data/test/cases/readonly_test.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/post'
|
3
|
-
require 'models/comment'
|
4
|
-
require 'models/developer'
|
5
|
-
require 'models/project'
|
6
|
-
require 'models/reader'
|
7
|
-
require 'models/person'
|
8
|
-
|
9
|
-
# Dummy class methods to test implicit association scoping.
|
10
|
-
def Comment.foo() find :first end
|
11
|
-
def Project.foo() find :first end
|
12
|
-
|
13
|
-
|
14
|
-
class ReadOnlyTest < ActiveRecord::TestCase
|
15
|
-
fixtures :posts, :comments, :developers, :projects, :developers_projects
|
16
|
-
|
17
|
-
def test_cant_save_readonly_record
|
18
|
-
dev = Developer.find(1)
|
19
|
-
assert !dev.readonly?
|
20
|
-
|
21
|
-
dev.readonly!
|
22
|
-
assert dev.readonly?
|
23
|
-
|
24
|
-
assert_nothing_raised do
|
25
|
-
dev.name = 'Luscious forbidden fruit.'
|
26
|
-
assert !dev.save
|
27
|
-
dev.name = 'Forbidden.'
|
28
|
-
end
|
29
|
-
assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save }
|
30
|
-
assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save! }
|
31
|
-
end
|
32
|
-
|
33
|
-
|
34
|
-
def test_find_with_readonly_option
|
35
|
-
Developer.find(:all).each { |d| assert !d.readonly? }
|
36
|
-
Developer.find(:all, :readonly => false).each { |d| assert !d.readonly? }
|
37
|
-
Developer.find(:all, :readonly => true).each { |d| assert d.readonly? }
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
def test_find_with_joins_option_implies_readonly
|
42
|
-
# Blank joins don't count.
|
43
|
-
Developer.find(:all, :joins => ' ').each { |d| assert !d.readonly? }
|
44
|
-
Developer.find(:all, :joins => ' ', :readonly => false).each { |d| assert !d.readonly? }
|
45
|
-
|
46
|
-
# Others do.
|
47
|
-
Developer.find(:all, :joins => ', projects').each { |d| assert d.readonly? }
|
48
|
-
Developer.find(:all, :joins => ', projects', :readonly => false).each { |d| assert !d.readonly? }
|
49
|
-
end
|
50
|
-
|
51
|
-
|
52
|
-
def test_habtm_find_readonly
|
53
|
-
dev = Developer.find(1)
|
54
|
-
assert !dev.projects.empty?
|
55
|
-
assert dev.projects.all?(&:readonly?)
|
56
|
-
assert dev.projects.find(:all).all?(&:readonly?)
|
57
|
-
assert dev.projects.find(:all, :readonly => true).all?(&:readonly?)
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_has_many_find_readonly
|
61
|
-
post = Post.find(1)
|
62
|
-
assert !post.comments.empty?
|
63
|
-
assert !post.comments.any?(&:readonly?)
|
64
|
-
assert !post.comments.find(:all).any?(&:readonly?)
|
65
|
-
assert post.comments.find(:all, :readonly => true).all?(&:readonly?)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_has_many_with_through_is_not_implicitly_marked_readonly
|
69
|
-
assert people = Post.find(1).people
|
70
|
-
assert !people.any?(&:readonly?)
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_readonly_scoping
|
74
|
-
Post.with_scope(:find => { :conditions => '1=1' }) do
|
75
|
-
assert !Post.find(1).readonly?
|
76
|
-
assert Post.find(1, :readonly => true).readonly?
|
77
|
-
assert !Post.find(1, :readonly => false).readonly?
|
78
|
-
end
|
79
|
-
|
80
|
-
Post.with_scope(:find => { :joins => ' ' }) do
|
81
|
-
assert !Post.find(1).readonly?
|
82
|
-
assert Post.find(1, :readonly => true).readonly?
|
83
|
-
assert !Post.find(1, :readonly => false).readonly?
|
84
|
-
end
|
85
|
-
|
86
|
-
# Oracle barfs on this because the join includes unqualified and
|
87
|
-
# conflicting column names
|
88
|
-
unless current_adapter?(:OracleAdapter)
|
89
|
-
Post.with_scope(:find => { :joins => ', developers' }) do
|
90
|
-
assert Post.find(1).readonly?
|
91
|
-
assert Post.find(1, :readonly => true).readonly?
|
92
|
-
assert !Post.find(1, :readonly => false).readonly?
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
Post.with_scope(:find => { :readonly => true }) do
|
97
|
-
assert Post.find(1).readonly?
|
98
|
-
assert Post.find(1, :readonly => true).readonly?
|
99
|
-
assert !Post.find(1, :readonly => false).readonly?
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_association_collection_method_missing_scoping_not_readonly
|
104
|
-
assert !Developer.find(1).projects.foo.readonly?
|
105
|
-
assert !Post.find(1).comments.foo.readonly?
|
106
|
-
end
|
107
|
-
end
|
@@ -1,234 +0,0 @@
|
|
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/subscriber'
|
7
|
-
require 'models/ship'
|
8
|
-
require 'models/pirate'
|
9
|
-
|
10
|
-
class ReflectionTest < ActiveRecord::TestCase
|
11
|
-
include ActiveRecord::Reflection
|
12
|
-
|
13
|
-
fixtures :topics, :customers, :companies, :subscribers
|
14
|
-
|
15
|
-
def setup
|
16
|
-
@first = Topic.find(1)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_column_null_not_null
|
20
|
-
subscriber = Subscriber.find(:first)
|
21
|
-
assert subscriber.column_for_attribute("name").null
|
22
|
-
assert !subscriber.column_for_attribute("nick").null
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_read_attribute_names
|
26
|
-
assert_equal(
|
27
|
-
%w( id title author_name author_email_address bonus_time written_on last_read content group approved replies_count parent_id parent_title type ).sort,
|
28
|
-
@first.attribute_names
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_columns
|
33
|
-
assert_equal 14, Topic.columns.length
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_columns_are_returned_in_the_order_they_were_declared
|
37
|
-
column_names = Topic.columns.map { |column| column.name }
|
38
|
-
assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content approved replies_count parent_id parent_title type group), column_names
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_content_columns
|
42
|
-
content_columns = Topic.content_columns
|
43
|
-
content_column_names = content_columns.map {|column| column.name}
|
44
|
-
assert_equal 10, content_columns.length
|
45
|
-
assert_equal %w(title author_name author_email_address written_on bonus_time last_read content group approved parent_title).sort, content_column_names.sort
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_column_string_type_and_limit
|
49
|
-
assert_equal :string, @first.column_for_attribute("title").type
|
50
|
-
assert_equal 255, @first.column_for_attribute("title").limit
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_column_null_not_null
|
54
|
-
subscriber = Subscriber.find(:first)
|
55
|
-
assert subscriber.column_for_attribute("name").null
|
56
|
-
assert !subscriber.column_for_attribute("nick").null
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_human_name_for_column
|
60
|
-
assert_equal "Author name", @first.column_for_attribute("author_name").human_name
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_integer_columns
|
64
|
-
assert_equal :integer, @first.column_for_attribute("id").type
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_reflection_klass_for_nested_class_name
|
68
|
-
reflection = MacroReflection.new(nil, nil, { :class_name => 'MyApplication::Business::Company' }, nil)
|
69
|
-
assert_nothing_raised do
|
70
|
-
assert_equal MyApplication::Business::Company, reflection.klass
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_aggregation_reflection
|
75
|
-
reflection_for_address = AggregateReflection.new(
|
76
|
-
:composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
|
77
|
-
)
|
78
|
-
|
79
|
-
reflection_for_balance = AggregateReflection.new(
|
80
|
-
:composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
|
81
|
-
)
|
82
|
-
|
83
|
-
reflection_for_gps_location = AggregateReflection.new(
|
84
|
-
:composed_of, :gps_location, { }, Customer
|
85
|
-
)
|
86
|
-
|
87
|
-
assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
|
88
|
-
assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
|
89
|
-
assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
|
90
|
-
|
91
|
-
assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
|
92
|
-
|
93
|
-
assert_equal Address, Customer.reflect_on_aggregation(:address).klass
|
94
|
-
|
95
|
-
assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_reflect_on_all_autosave_associations
|
99
|
-
expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
|
100
|
-
received = Pirate.reflect_on_all_autosave_associations
|
101
|
-
|
102
|
-
assert !received.empty?
|
103
|
-
assert_not_equal Pirate.reflect_on_all_associations.length, received.length
|
104
|
-
assert_equal expected, received
|
105
|
-
end
|
106
|
-
|
107
|
-
def test_has_many_reflection
|
108
|
-
reflection_for_clients = AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
|
109
|
-
|
110
|
-
assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
|
111
|
-
|
112
|
-
assert_equal Client, Firm.reflect_on_association(:clients).klass
|
113
|
-
assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
|
114
|
-
|
115
|
-
assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
|
116
|
-
assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_has_one_reflection
|
120
|
-
reflection_for_account = AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
|
121
|
-
assert_equal reflection_for_account, Firm.reflect_on_association(:account)
|
122
|
-
|
123
|
-
assert_equal Account, Firm.reflect_on_association(:account).klass
|
124
|
-
assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_belongs_to_inferred_foreign_key_from_assoc_name
|
128
|
-
Company.belongs_to :foo
|
129
|
-
assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name
|
130
|
-
Company.belongs_to :bar, :class_name => "Xyzzy"
|
131
|
-
assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name
|
132
|
-
Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
|
133
|
-
assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_association_reflection_in_modules
|
137
|
-
assert_reflection MyApplication::Business::Firm,
|
138
|
-
:clients_of_firm,
|
139
|
-
:klass => MyApplication::Business::Client,
|
140
|
-
:class_name => 'Client',
|
141
|
-
:table_name => 'companies'
|
142
|
-
|
143
|
-
assert_reflection MyApplication::Billing::Account,
|
144
|
-
:firm,
|
145
|
-
:klass => MyApplication::Business::Firm,
|
146
|
-
:class_name => 'MyApplication::Business::Firm',
|
147
|
-
:table_name => 'companies'
|
148
|
-
|
149
|
-
assert_reflection MyApplication::Billing::Account,
|
150
|
-
:qualified_billing_firm,
|
151
|
-
:klass => MyApplication::Billing::Firm,
|
152
|
-
:class_name => 'MyApplication::Billing::Firm',
|
153
|
-
:table_name => 'companies'
|
154
|
-
|
155
|
-
assert_reflection MyApplication::Billing::Account,
|
156
|
-
:unqualified_billing_firm,
|
157
|
-
:klass => MyApplication::Billing::Firm,
|
158
|
-
:class_name => 'Firm',
|
159
|
-
:table_name => 'companies'
|
160
|
-
|
161
|
-
assert_reflection MyApplication::Billing::Account,
|
162
|
-
:nested_qualified_billing_firm,
|
163
|
-
:klass => MyApplication::Billing::Nested::Firm,
|
164
|
-
:class_name => 'MyApplication::Billing::Nested::Firm',
|
165
|
-
:table_name => 'companies'
|
166
|
-
|
167
|
-
assert_reflection MyApplication::Billing::Account,
|
168
|
-
:nested_unqualified_billing_firm,
|
169
|
-
:klass => MyApplication::Billing::Nested::Firm,
|
170
|
-
:class_name => 'Nested::Firm',
|
171
|
-
:table_name => 'companies'
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_reflection_of_all_associations
|
175
|
-
# FIXME these assertions bust a lot
|
176
|
-
assert_equal 36, Firm.reflect_on_all_associations.size
|
177
|
-
assert_equal 26, Firm.reflect_on_all_associations(:has_many).size
|
178
|
-
assert_equal 10, Firm.reflect_on_all_associations(:has_one).size
|
179
|
-
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_reflection_should_not_raise_error_when_compared_to_other_object
|
183
|
-
assert_nothing_raised { Firm.reflections[:clients] == Object.new }
|
184
|
-
end
|
185
|
-
|
186
|
-
def test_has_many_through_reflection
|
187
|
-
assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_collection_association
|
191
|
-
assert Pirate.reflect_on_association(:birds).collection?
|
192
|
-
assert Pirate.reflect_on_association(:parrots).collection?
|
193
|
-
|
194
|
-
assert !Pirate.reflect_on_association(:ship).collection?
|
195
|
-
assert !Ship.reflect_on_association(:pirate).collection?
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_default_association_validation
|
199
|
-
assert AssociationReflection.new(:has_many, :clients, {}, Firm).validate?
|
200
|
-
|
201
|
-
assert !AssociationReflection.new(:has_one, :client, {}, Firm).validate?
|
202
|
-
assert !AssociationReflection.new(:belongs_to, :client, {}, Firm).validate?
|
203
|
-
assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, {}, Firm).validate?
|
204
|
-
end
|
205
|
-
|
206
|
-
def test_always_validate_association_if_explicit
|
207
|
-
assert AssociationReflection.new(:has_one, :client, { :validate => true }, Firm).validate?
|
208
|
-
assert AssociationReflection.new(:belongs_to, :client, { :validate => true }, Firm).validate?
|
209
|
-
assert AssociationReflection.new(:has_many, :clients, { :validate => true }, Firm).validate?
|
210
|
-
assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :validate => true }, Firm).validate?
|
211
|
-
end
|
212
|
-
|
213
|
-
def test_validate_association_if_autosave
|
214
|
-
assert AssociationReflection.new(:has_one, :client, { :autosave => true }, Firm).validate?
|
215
|
-
assert AssociationReflection.new(:belongs_to, :client, { :autosave => true }, Firm).validate?
|
216
|
-
assert AssociationReflection.new(:has_many, :clients, { :autosave => true }, Firm).validate?
|
217
|
-
assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true }, Firm).validate?
|
218
|
-
end
|
219
|
-
|
220
|
-
def test_never_validate_association_if_explicit
|
221
|
-
assert !AssociationReflection.new(:has_one, :client, { :autosave => true, :validate => false }, Firm).validate?
|
222
|
-
assert !AssociationReflection.new(:belongs_to, :client, { :autosave => true, :validate => false }, Firm).validate?
|
223
|
-
assert !AssociationReflection.new(:has_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
|
224
|
-
assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
|
225
|
-
end
|
226
|
-
|
227
|
-
private
|
228
|
-
def assert_reflection(klass, association, options)
|
229
|
-
assert reflection = klass.reflect_on_association(association)
|
230
|
-
options.each do |method, value|
|
231
|
-
assert_equal(value, reflection.send(method))
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|