activerecord 2.3.18 → 3.0.0.beta
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.
- data/CHANGELOG +105 -34
- data/examples/performance.rb +3 -39
- data/examples/simple.rb +14 -0
- data/lib/active_record.rb +81 -47
- data/lib/active_record/aggregations.rb +1 -3
- data/lib/active_record/association_preload.rb +39 -54
- data/lib/active_record/associations.rb +262 -419
- data/lib/active_record/associations/association_collection.rb +85 -100
- data/lib/active_record/associations/association_proxy.rb +20 -18
- data/lib/active_record/associations/belongs_to_association.rb +8 -8
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
- data/lib/active_record/associations/has_many_association.rb +11 -19
- data/lib/active_record/associations/has_many_through_association.rb +30 -183
- data/lib/active_record/associations/has_one_association.rb +10 -10
- data/lib/active_record/associations/has_one_through_association.rb +13 -11
- data/lib/active_record/associations/through_association_scope.rb +153 -0
- data/lib/active_record/attribute_methods.rb +17 -370
- data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
- data/lib/active_record/attribute_methods/dirty.rb +87 -0
- data/lib/active_record/attribute_methods/primary_key.rb +44 -0
- data/lib/active_record/attribute_methods/query.rb +37 -0
- data/lib/active_record/attribute_methods/read.rb +116 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
- data/lib/active_record/attribute_methods/write.rb +37 -0
- data/lib/active_record/autosave_association.rb +20 -41
- data/lib/active_record/base.rb +357 -1180
- data/lib/active_record/batches.rb +10 -16
- data/lib/active_record/callbacks.rb +66 -126
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
- data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
- data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
- data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
- data/lib/active_record/fixtures.rb +21 -25
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +16 -48
- data/lib/active_record/migration.rb +59 -46
- data/lib/active_record/named_scope.rb +85 -92
- data/lib/active_record/nested_attributes.rb +18 -24
- data/lib/active_record/observer.rb +18 -94
- data/lib/active_record/railtie.rb +83 -0
- data/lib/active_record/railties/controller_runtime.rb +38 -0
- data/lib/active_record/railties/databases.rake +477 -0
- data/lib/active_record/railties/subscriber.rb +27 -0
- data/lib/active_record/reflection.rb +2 -15
- data/lib/active_record/relation.rb +339 -0
- data/lib/active_record/relation/calculations.rb +259 -0
- data/lib/active_record/relation/finder_methods.rb +315 -0
- data/lib/active_record/relation/predicate_builder.rb +46 -0
- data/lib/active_record/relation/query_methods.rb +218 -0
- data/lib/active_record/relation/spawn_methods.rb +102 -0
- data/lib/active_record/schema_dumper.rb +10 -6
- data/lib/active_record/serialization.rb +31 -74
- data/lib/active_record/serializers/xml_serializer.rb +33 -121
- data/lib/active_record/session_store.rb +1 -9
- data/lib/active_record/test_case.rb +1 -3
- data/lib/active_record/timestamp.rb +7 -5
- data/lib/active_record/transactions.rb +9 -9
- data/lib/active_record/validations.rb +51 -1100
- data/lib/active_record/validations/associated.rb +47 -0
- data/lib/active_record/validations/uniqueness.rb +181 -0
- data/lib/active_record/version.rb +3 -3
- data/lib/generators/active_record.rb +30 -0
- data/lib/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/generators/active_record/migration/templates/migration.rb +11 -0
- data/lib/generators/active_record/model/model_generator.rb +33 -0
- data/lib/generators/active_record/model/templates/migration.rb +16 -0
- data/lib/generators/active_record/model/templates/model.rb +5 -0
- data/lib/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/generators/active_record/observer/templates/observer.rb +2 -0
- data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
- data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
- metadata +67 -325
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
- data/lib/active_record/dirty.rb +0 -183
- 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.yml +0 -14
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- 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
@@ -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
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/owner'
|
3
|
-
require 'models/pet'
|
4
|
-
|
5
|
-
class ReloadModelsTest < ActiveRecord::TestCase
|
6
|
-
fixtures :pets
|
7
|
-
|
8
|
-
def test_has_one_with_reload
|
9
|
-
pet = Pet.find_by_name('parrot')
|
10
|
-
pet.owner = Owner.find_by_name('ashley')
|
11
|
-
|
12
|
-
# Reload the class Owner, simulating auto-reloading of model classes in a
|
13
|
-
# development environment. Note that meanwhile the class Pet is not
|
14
|
-
# reloaded, simulating a class that is present in a plugin.
|
15
|
-
Object.class_eval { remove_const :Owner }
|
16
|
-
Kernel.load(File.expand_path(File.join(File.dirname(__FILE__), "../models/owner.rb")))
|
17
|
-
|
18
|
-
pet = Pet.find_by_name('parrot')
|
19
|
-
pet.owner = Owner.find_by_name('ashley')
|
20
|
-
assert_equal pet.owner, Owner.find_by_name('ashley')
|
21
|
-
end
|
22
|
-
end
|
data/test/cases/repair_helper.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Testing
|
3
|
-
module RepairHelper
|
4
|
-
def self.included(base)
|
5
|
-
base.class_eval do
|
6
|
-
extend ClassMethods
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
module Toolbox
|
11
|
-
def self.record_validations(*model_classes)
|
12
|
-
model_classes.inject({}) do |repair, klass|
|
13
|
-
repair[klass] ||= {}
|
14
|
-
[:validate, :validate_on_create, :validate_on_update].each do |callback|
|
15
|
-
the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks")
|
16
|
-
repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup)
|
17
|
-
end
|
18
|
-
repair
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.reset_validations(recorded)
|
23
|
-
recorded.each do |klass, repairs|
|
24
|
-
[:validate, :validate_on_create, :validate_on_update].each do |callback|
|
25
|
-
klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback])
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module ClassMethods
|
32
|
-
def repair_validations(*model_classes)
|
33
|
-
setup do
|
34
|
-
@validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
|
35
|
-
end
|
36
|
-
teardown do
|
37
|
-
ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(@validation_repairs)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def repair_validations(*model_classes, &block)
|
43
|
-
validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
|
44
|
-
return block.call
|
45
|
-
ensure
|
46
|
-
ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(validation_repairs)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,176 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class Group < ActiveRecord::Base
|
4
|
-
Group.table_name = 'group'
|
5
|
-
belongs_to :select, :class_name => 'Select'
|
6
|
-
has_one :values
|
7
|
-
end
|
8
|
-
|
9
|
-
class Select < ActiveRecord::Base
|
10
|
-
Select.table_name = 'select'
|
11
|
-
has_many :groups
|
12
|
-
end
|
13
|
-
|
14
|
-
class Values < ActiveRecord::Base
|
15
|
-
Values.table_name = 'values'
|
16
|
-
end
|
17
|
-
|
18
|
-
class Distinct < ActiveRecord::Base
|
19
|
-
Distinct.table_name = 'distinct'
|
20
|
-
has_and_belongs_to_many :selects
|
21
|
-
has_many :values, :through => :groups
|
22
|
-
end
|
23
|
-
|
24
|
-
# a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
|
25
|
-
# reserved word names (ie: group, order, values, etc...)
|
26
|
-
class MysqlReservedWordTest < ActiveRecord::TestCase
|
27
|
-
def setup
|
28
|
-
@connection = ActiveRecord::Base.connection
|
29
|
-
|
30
|
-
# we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
|
31
|
-
# will fail with these table names if these test cases fail
|
32
|
-
|
33
|
-
create_tables_directly 'group'=>'id int auto_increment primary key, `order` varchar(255), select_id int',
|
34
|
-
'select'=>'id int auto_increment primary key',
|
35
|
-
'values'=>'id int auto_increment primary key, group_id int',
|
36
|
-
'distinct'=>'id int auto_increment primary key',
|
37
|
-
'distincts_selects'=>'distinct_id int, select_id int'
|
38
|
-
end
|
39
|
-
|
40
|
-
def teardown
|
41
|
-
drop_tables_directly ['group', 'select', 'values', 'distinct', 'distincts_selects', 'order']
|
42
|
-
end
|
43
|
-
|
44
|
-
# create tables with reserved-word names and columns
|
45
|
-
def test_create_tables
|
46
|
-
assert_nothing_raised {
|
47
|
-
@connection.create_table :order do |t|
|
48
|
-
t.column :group, :string
|
49
|
-
end
|
50
|
-
}
|
51
|
-
end
|
52
|
-
|
53
|
-
# rename tables with reserved-word names
|
54
|
-
def test_rename_tables
|
55
|
-
assert_nothing_raised { @connection.rename_table(:group, :order) }
|
56
|
-
end
|
57
|
-
|
58
|
-
# alter column with a reserved-word name in a table with a reserved-word name
|
59
|
-
def test_change_columns
|
60
|
-
assert_nothing_raised { @connection.change_column_default(:group, :order, 'whatever') }
|
61
|
-
#the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
|
62
|
-
assert_nothing_raised { @connection.change_column('group', 'order', :Int, :default => 0) }
|
63
|
-
assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
|
64
|
-
end
|
65
|
-
|
66
|
-
# dump structure of table with reserved word name
|
67
|
-
def test_structure_dump
|
68
|
-
assert_nothing_raised { @connection.structure_dump }
|
69
|
-
end
|
70
|
-
|
71
|
-
# introspect table with reserved word name
|
72
|
-
def test_introspect
|
73
|
-
assert_nothing_raised { @connection.columns(:group) }
|
74
|
-
assert_nothing_raised { @connection.indexes(:group) }
|
75
|
-
end
|
76
|
-
|
77
|
-
#fixtures
|
78
|
-
self.use_instantiated_fixtures = true
|
79
|
-
self.use_transactional_fixtures = false
|
80
|
-
|
81
|
-
#fixtures :group
|
82
|
-
|
83
|
-
def test_fixtures
|
84
|
-
f = create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
|
85
|
-
|
86
|
-
assert_nothing_raised {
|
87
|
-
f.each do |x|
|
88
|
-
x.delete_existing_fixtures
|
89
|
-
end
|
90
|
-
}
|
91
|
-
|
92
|
-
assert_nothing_raised {
|
93
|
-
f.each do |x|
|
94
|
-
x.insert_fixtures
|
95
|
-
end
|
96
|
-
}
|
97
|
-
end
|
98
|
-
|
99
|
-
#activerecord model class with reserved-word table name
|
100
|
-
def test_activerecord_model
|
101
|
-
create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
|
102
|
-
x = nil
|
103
|
-
assert_nothing_raised { x = Group.new }
|
104
|
-
x.order = 'x'
|
105
|
-
assert_nothing_raised { x.save }
|
106
|
-
x.order = 'y'
|
107
|
-
assert_nothing_raised { x.save }
|
108
|
-
assert_nothing_raised { y = Group.find_by_order('y') }
|
109
|
-
assert_nothing_raised { y = Group.find(1) }
|
110
|
-
x = Group.find(1)
|
111
|
-
end
|
112
|
-
|
113
|
-
# has_one association with reserved-word table name
|
114
|
-
def test_has_one_associations
|
115
|
-
create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
|
116
|
-
v = nil
|
117
|
-
assert_nothing_raised { v = Group.find(1).values }
|
118
|
-
assert_equal v.id, 2
|
119
|
-
end
|
120
|
-
|
121
|
-
# belongs_to association with reserved-word table name
|
122
|
-
def test_belongs_to_associations
|
123
|
-
create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
|
124
|
-
gs = nil
|
125
|
-
assert_nothing_raised { gs = Select.find(2).groups }
|
126
|
-
assert_equal gs.length, 2
|
127
|
-
assert(gs.collect{|x| x.id}.sort == [2, 3])
|
128
|
-
end
|
129
|
-
|
130
|
-
# has_and_belongs_to_many with reserved-word table name
|
131
|
-
def test_has_and_belongs_to_many
|
132
|
-
create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
|
133
|
-
s = nil
|
134
|
-
assert_nothing_raised { s = Distinct.find(1).selects }
|
135
|
-
assert_equal s.length, 2
|
136
|
-
assert(s.collect{|x|x.id}.sort == [1, 2])
|
137
|
-
end
|
138
|
-
|
139
|
-
# activerecord model introspection with reserved-word table and column names
|
140
|
-
def test_activerecord_introspection
|
141
|
-
assert_nothing_raised { Group.table_exists? }
|
142
|
-
assert_nothing_raised { Group.columns }
|
143
|
-
end
|
144
|
-
|
145
|
-
# Calculations
|
146
|
-
def test_calculations_work_with_reserved_words
|
147
|
-
assert_nothing_raised { Group.count }
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_associations_work_with_reserved_words
|
151
|
-
assert_nothing_raised { Select.find(:all, :include => [:groups]) }
|
152
|
-
end
|
153
|
-
|
154
|
-
#the following functions were added to DRY test cases
|
155
|
-
|
156
|
-
private
|
157
|
-
# custom fixture loader, uses Fixtures#create_fixtures and appends base_path to the current file's path
|
158
|
-
def create_test_fixtures(*fixture_names)
|
159
|
-
Fixtures.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
|
160
|
-
end
|
161
|
-
|
162
|
-
# custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
|
163
|
-
def drop_tables_directly(table_names, connection = @connection)
|
164
|
-
table_names.each do |name|
|
165
|
-
connection.execute("DROP TABLE IF EXISTS `#{name}`")
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
# custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
|
170
|
-
def create_tables_directly (tables, connection = @connection)
|
171
|
-
tables.each do |table_name, column_properties|
|
172
|
-
connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
end
|