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,24 +0,0 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
|
3
|
-
class PostgresqlActiveSchemaTest < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
6
|
-
alias_method :real_execute, :execute
|
7
|
-
def execute(sql, name = nil) sql end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def teardown
|
12
|
-
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:alias_method, :execute, :real_execute)
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_create_database_with_encoding
|
16
|
-
assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
|
17
|
-
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
def method_missing(method_symbol, *arguments)
|
22
|
-
ActiveRecord::Base.connection.send(method_symbol, *arguments)
|
23
|
-
end
|
24
|
-
end
|
data/test/cases/adapter_test.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
class AdapterTest < ActiveRecord::TestCase
|
4
|
-
def setup
|
5
|
-
@connection = ActiveRecord::Base.connection
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_tables
|
9
|
-
tables = @connection.tables
|
10
|
-
assert tables.include?("accounts")
|
11
|
-
assert tables.include?("authors")
|
12
|
-
assert tables.include?("tasks")
|
13
|
-
assert tables.include?("topics")
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_table_exists?
|
17
|
-
assert @connection.table_exists?("accounts")
|
18
|
-
assert !@connection.table_exists?("nonexistingtable")
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_indexes
|
22
|
-
idx_name = "accounts_idx"
|
23
|
-
|
24
|
-
if @connection.respond_to?(:indexes)
|
25
|
-
indexes = @connection.indexes("accounts")
|
26
|
-
assert indexes.empty?
|
27
|
-
|
28
|
-
@connection.add_index :accounts, :firm_id, :name => idx_name
|
29
|
-
indexes = @connection.indexes("accounts")
|
30
|
-
assert_equal "accounts", indexes.first.table
|
31
|
-
# OpenBase does not have the concept of a named index
|
32
|
-
# Indexes are merely properties of columns.
|
33
|
-
assert_equal idx_name, indexes.first.name unless current_adapter?(:OpenBaseAdapter)
|
34
|
-
assert !indexes.first.unique
|
35
|
-
assert_equal ["firm_id"], indexes.first.columns
|
36
|
-
else
|
37
|
-
warn "#{@connection.class} does not respond to #indexes"
|
38
|
-
end
|
39
|
-
|
40
|
-
ensure
|
41
|
-
@connection.remove_index(:accounts, :name => idx_name) rescue nil
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_current_database
|
45
|
-
if @connection.respond_to?(:current_database)
|
46
|
-
assert_equal ENV['ARUNIT_DB_NAME'] || "activerecord_unittest", @connection.current_database
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
if current_adapter?(:MysqlAdapter)
|
51
|
-
def test_charset
|
52
|
-
assert_not_nil @connection.charset
|
53
|
-
assert_not_equal 'character_set_database', @connection.charset
|
54
|
-
assert_equal @connection.show_variable('character_set_database'), @connection.charset
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_collation
|
58
|
-
assert_not_nil @connection.collation
|
59
|
-
assert_not_equal 'collation_database', @connection.collation
|
60
|
-
assert_equal @connection.show_variable('collation_database'), @connection.collation
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_show_nonexistent_variable_returns_nil
|
64
|
-
assert_nil @connection.show_variable('foo_bar_baz')
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_not_specifying_database_name_for_cross_database_selects
|
68
|
-
begin
|
69
|
-
assert_nothing_raised do
|
70
|
-
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['arunit'].except(:database))
|
71
|
-
ActiveRecord::Base.connection.execute "SELECT activerecord_unittest.pirates.*, activerecord_unittest2.courses.* FROM activerecord_unittest.pirates, activerecord_unittest2.courses"
|
72
|
-
end
|
73
|
-
ensure
|
74
|
-
ActiveRecord::Base.establish_connection 'arunit'
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
if current_adapter?(:PostgreSQLAdapter)
|
80
|
-
def test_encoding
|
81
|
-
assert_not_nil @connection.encoding
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_table_alias
|
86
|
-
def @connection.test_table_alias_length() 10; end
|
87
|
-
class << @connection
|
88
|
-
alias_method :old_table_alias_length, :table_alias_length
|
89
|
-
alias_method :table_alias_length, :test_table_alias_length
|
90
|
-
end
|
91
|
-
|
92
|
-
assert_equal 'posts', @connection.table_alias_for('posts')
|
93
|
-
assert_equal 'posts_comm', @connection.table_alias_for('posts_comments')
|
94
|
-
assert_equal 'dbo_posts', @connection.table_alias_for('dbo.posts')
|
95
|
-
|
96
|
-
class << @connection
|
97
|
-
remove_method :table_alias_length
|
98
|
-
alias_method :table_alias_length, :old_table_alias_length
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# test resetting sequences in odd tables in postgreSQL
|
103
|
-
if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
|
104
|
-
require 'models/movie'
|
105
|
-
require 'models/subscriber'
|
106
|
-
|
107
|
-
def test_reset_empty_table_with_custom_pk
|
108
|
-
Movie.delete_all
|
109
|
-
Movie.connection.reset_pk_sequence! 'movies'
|
110
|
-
assert_equal 1, Movie.create(:name => 'fight club').id
|
111
|
-
end
|
112
|
-
|
113
|
-
if ActiveRecord::Base.connection.adapter_name != "FrontBase"
|
114
|
-
def test_reset_table_with_non_integer_pk
|
115
|
-
Subscriber.delete_all
|
116
|
-
Subscriber.connection.reset_pk_sequence! 'subscribers'
|
117
|
-
sub = Subscriber.new(:name => 'robert drake')
|
118
|
-
sub.id = 'bob drake'
|
119
|
-
assert_nothing_raised { sub.save! }
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def test_add_limit_offset_should_sanitize_sql_injection_for_limit_without_comas
|
125
|
-
sql_inject = "1 select * from schema"
|
126
|
-
assert_equal " LIMIT 1", @connection.add_limit_offset!("", :limit=>sql_inject)
|
127
|
-
if current_adapter?(:MysqlAdapter)
|
128
|
-
assert_equal " LIMIT 7, 1", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
|
129
|
-
else
|
130
|
-
assert_equal " LIMIT 1 OFFSET 7", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_add_limit_offset_should_sanitize_sql_injection_for_limit_with_comas
|
135
|
-
sql_inject = "1, 7 procedure help()"
|
136
|
-
if current_adapter?(:MysqlAdapter)
|
137
|
-
assert_equal " LIMIT 1,7", @connection.add_limit_offset!("", :limit=>sql_inject)
|
138
|
-
assert_equal " LIMIT 7, 1", @connection.add_limit_offset!("", :limit=> '1 ; DROP TABLE USERS', :offset=>7)
|
139
|
-
else
|
140
|
-
assert_equal " LIMIT 1,7", @connection.add_limit_offset!("", :limit=>sql_inject)
|
141
|
-
assert_equal " LIMIT 1,7 OFFSET 7", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
@@ -1,167 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/customer'
|
3
|
-
|
4
|
-
class AggregationsTest < ActiveRecord::TestCase
|
5
|
-
fixtures :customers
|
6
|
-
|
7
|
-
def test_find_single_value_object
|
8
|
-
assert_equal 50, customers(:david).balance.amount
|
9
|
-
assert_kind_of Money, customers(:david).balance
|
10
|
-
assert_equal 300, customers(:david).balance.exchange_to("DKK").amount
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_find_multiple_value_object
|
14
|
-
assert_equal customers(:david).address_street, customers(:david).address.street
|
15
|
-
assert(
|
16
|
-
customers(:david).address.close_to?(Address.new("Different Street", customers(:david).address_city, customers(:david).address_country))
|
17
|
-
)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_change_single_value_object
|
21
|
-
customers(:david).balance = Money.new(100)
|
22
|
-
customers(:david).save
|
23
|
-
assert_equal 100, customers(:david).reload.balance.amount
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_immutable_value_objects
|
27
|
-
customers(:david).balance = Money.new(100)
|
28
|
-
assert_raise(ActiveSupport::FrozenObjectError) { customers(:david).balance.instance_eval { @amount = 20 } }
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_inferred_mapping
|
32
|
-
assert_equal "35.544623640962634", customers(:david).gps_location.latitude
|
33
|
-
assert_equal "-105.9309951055148", customers(:david).gps_location.longitude
|
34
|
-
|
35
|
-
customers(:david).gps_location = GpsLocation.new("39x-110")
|
36
|
-
|
37
|
-
assert_equal "39", customers(:david).gps_location.latitude
|
38
|
-
assert_equal "-110", customers(:david).gps_location.longitude
|
39
|
-
|
40
|
-
customers(:david).save
|
41
|
-
|
42
|
-
customers(:david).reload
|
43
|
-
|
44
|
-
assert_equal "39", customers(:david).gps_location.latitude
|
45
|
-
assert_equal "-110", customers(:david).gps_location.longitude
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_reloaded_instance_refreshes_aggregations
|
49
|
-
assert_equal "35.544623640962634", customers(:david).gps_location.latitude
|
50
|
-
assert_equal "-105.9309951055148", customers(:david).gps_location.longitude
|
51
|
-
|
52
|
-
Customer.update_all("gps_location = '24x113'")
|
53
|
-
customers(:david).reload
|
54
|
-
assert_equal '24x113', customers(:david)['gps_location']
|
55
|
-
|
56
|
-
assert_equal GpsLocation.new('24x113'), customers(:david).gps_location
|
57
|
-
end
|
58
|
-
|
59
|
-
def test_gps_equality
|
60
|
-
assert GpsLocation.new('39x110') == GpsLocation.new('39x110')
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_gps_inequality
|
64
|
-
assert GpsLocation.new('39x110') != GpsLocation.new('39x111')
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_allow_nil_gps_is_nil
|
68
|
-
assert_equal nil, customers(:zaphod).gps_location
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_allow_nil_gps_set_to_nil
|
72
|
-
customers(:david).gps_location = nil
|
73
|
-
customers(:david).save
|
74
|
-
customers(:david).reload
|
75
|
-
assert_equal nil, customers(:david).gps_location
|
76
|
-
end
|
77
|
-
|
78
|
-
def test_allow_nil_set_address_attributes_to_nil
|
79
|
-
customers(:zaphod).address = nil
|
80
|
-
assert_equal nil, customers(:zaphod).attributes[:address_street]
|
81
|
-
assert_equal nil, customers(:zaphod).attributes[:address_city]
|
82
|
-
assert_equal nil, customers(:zaphod).attributes[:address_country]
|
83
|
-
end
|
84
|
-
|
85
|
-
def test_allow_nil_address_set_to_nil
|
86
|
-
customers(:zaphod).address = nil
|
87
|
-
customers(:zaphod).save
|
88
|
-
customers(:zaphod).reload
|
89
|
-
assert_equal nil, customers(:zaphod).address
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_nil_raises_error_when_allow_nil_is_false
|
93
|
-
assert_raise(NoMethodError) { customers(:david).balance = nil }
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_allow_nil_address_loaded_when_only_some_attributes_are_nil
|
97
|
-
customers(:zaphod).address_street = nil
|
98
|
-
customers(:zaphod).save
|
99
|
-
customers(:zaphod).reload
|
100
|
-
assert_kind_of Address, customers(:zaphod).address
|
101
|
-
assert customers(:zaphod).address.street.nil?
|
102
|
-
end
|
103
|
-
|
104
|
-
def test_nil_assignment_results_in_nil
|
105
|
-
customers(:david).gps_location = GpsLocation.new('39x111')
|
106
|
-
assert_not_equal nil, customers(:david).gps_location
|
107
|
-
customers(:david).gps_location = nil
|
108
|
-
assert_equal nil, customers(:david).gps_location
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_custom_constructor
|
112
|
-
assert_equal 'Barney GUMBLE', customers(:barney).fullname.to_s
|
113
|
-
assert_kind_of Fullname, customers(:barney).fullname
|
114
|
-
end
|
115
|
-
|
116
|
-
def test_custom_converter
|
117
|
-
customers(:barney).fullname = 'Barnoit Gumbleau'
|
118
|
-
assert_equal 'Barnoit GUMBLEAU', customers(:barney).fullname.to_s
|
119
|
-
assert_kind_of Fullname, customers(:barney).fullname
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
class DeprecatedAggregationsTest < ActiveRecord::TestCase
|
124
|
-
class Person < ActiveRecord::Base; end
|
125
|
-
|
126
|
-
def test_conversion_block_is_deprecated
|
127
|
-
assert_deprecated 'conversion block has been deprecated' do
|
128
|
-
Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount)) { |balance| balance.to_money }
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def test_conversion_block_used_when_converter_option_is_nil
|
133
|
-
assert_deprecated 'conversion block has been deprecated' do
|
134
|
-
Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount)) { |balance| balance.to_money }
|
135
|
-
end
|
136
|
-
assert_raise(NoMethodError) { Person.new.balance = 5 }
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_converter_option_overrides_conversion_block
|
140
|
-
assert_deprecated 'conversion block has been deprecated' do
|
141
|
-
Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount), :converter => Proc.new { |balance| Money.new(balance) }) { |balance| balance.to_money }
|
142
|
-
end
|
143
|
-
|
144
|
-
person = Person.new
|
145
|
-
assert_nothing_raised { person.balance = 5 }
|
146
|
-
assert_equal 5, person.balance.amount
|
147
|
-
assert_kind_of Money, person.balance
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
class OverridingAggregationsTest < ActiveRecord::TestCase
|
152
|
-
class Name; end
|
153
|
-
class DifferentName; end
|
154
|
-
|
155
|
-
class Person < ActiveRecord::Base
|
156
|
-
composed_of :composed_of, :mapping => %w(person_first_name first_name)
|
157
|
-
end
|
158
|
-
|
159
|
-
class DifferentPerson < Person
|
160
|
-
composed_of :composed_of, :class_name => 'DifferentName', :mapping => %w(different_person_first_name first_name)
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_composed_of_aggregation_redefinition_reflections_should_differ_and_not_inherited
|
164
|
-
assert_not_equal Person.reflect_on_aggregation(:composed_of),
|
165
|
-
DifferentPerson.reflect_on_aggregation(:composed_of)
|
166
|
-
end
|
167
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
|
3
|
-
if ActiveRecord::Base.connection.supports_migrations?
|
4
|
-
|
5
|
-
class ActiveRecordSchemaTest < ActiveRecord::TestCase
|
6
|
-
self.use_transactional_fixtures = false
|
7
|
-
|
8
|
-
def setup
|
9
|
-
@connection = ActiveRecord::Base.connection
|
10
|
-
end
|
11
|
-
|
12
|
-
def teardown
|
13
|
-
@connection.drop_table :fruits rescue nil
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_schema_define
|
17
|
-
ActiveRecord::Schema.define(:version => 7) do
|
18
|
-
create_table :fruits do |t|
|
19
|
-
t.column :color, :string
|
20
|
-
t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
|
21
|
-
t.column :texture, :string
|
22
|
-
t.column :flavor, :string
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
|
27
|
-
assert_nothing_raised { @connection.select_all "SELECT * FROM schema_migrations" }
|
28
|
-
assert_equal 7, ActiveRecord::Migrator::current_version
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
@@ -1,438 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/developer'
|
3
|
-
require 'models/project'
|
4
|
-
require 'models/company'
|
5
|
-
require 'models/topic'
|
6
|
-
require 'models/reply'
|
7
|
-
require 'models/computer'
|
8
|
-
require 'models/customer'
|
9
|
-
require 'models/order'
|
10
|
-
require 'models/post'
|
11
|
-
require 'models/author'
|
12
|
-
require 'models/tag'
|
13
|
-
require 'models/tagging'
|
14
|
-
require 'models/comment'
|
15
|
-
require 'models/sponsor'
|
16
|
-
require 'models/member'
|
17
|
-
require 'models/essay'
|
18
|
-
|
19
|
-
class BelongsToAssociationsTest < ActiveRecord::TestCase
|
20
|
-
fixtures :accounts, :companies, :developers, :projects, :topics,
|
21
|
-
:developers_projects, :computers, :authors, :posts, :tags, :taggings, :comments
|
22
|
-
|
23
|
-
def test_belongs_to
|
24
|
-
Client.find(3).firm.name
|
25
|
-
assert_equal companies(:first_firm).name, Client.find(3).firm.name
|
26
|
-
assert !Client.find(3).firm.nil?, "Microsoft should have a firm"
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_belongs_to_with_primary_key
|
30
|
-
client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
|
31
|
-
assert_equal companies(:first_firm).name, client.firm_with_primary_key.name
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_belongs_to_with_primary_key_joins_on_correct_column
|
35
|
-
sql = Client.send(:construct_finder_sql, :joins => :firm_with_primary_key)
|
36
|
-
assert sql !~ /\.id/
|
37
|
-
assert sql =~ /\.name/
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_proxy_assignment
|
41
|
-
account = Account.find(1)
|
42
|
-
assert_nothing_raised { account.firm = account.firm }
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_triple_equality
|
46
|
-
assert Client.find(3).firm === Firm
|
47
|
-
assert Firm === Client.find(3).firm
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_type_mismatch
|
51
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
|
52
|
-
assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_natural_assignment
|
56
|
-
apple = Firm.create("name" => "Apple")
|
57
|
-
citibank = Account.create("credit_limit" => 10)
|
58
|
-
citibank.firm = apple
|
59
|
-
assert_equal apple.id, citibank.firm_id
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_natural_assignment_with_primary_key
|
63
|
-
apple = Firm.create("name" => "Apple")
|
64
|
-
citibank = Client.create("name" => "Primary key client")
|
65
|
-
citibank.firm_with_primary_key = apple
|
66
|
-
assert_equal apple.name, citibank.firm_name
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_eager_loading_with_primary_key
|
70
|
-
apple = Firm.create("name" => "Apple")
|
71
|
-
citibank = Client.create("name" => "Citibank", :firm_name => "Apple")
|
72
|
-
citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
|
73
|
-
assert_not_nil citibank_result.instance_variable_get("@firm_with_primary_key")
|
74
|
-
end
|
75
|
-
|
76
|
-
def test_no_unexpected_aliasing
|
77
|
-
first_firm = companies(:first_firm)
|
78
|
-
another_firm = companies(:another_firm)
|
79
|
-
|
80
|
-
citibank = Account.create("credit_limit" => 10)
|
81
|
-
citibank.firm = first_firm
|
82
|
-
original_proxy = citibank.firm
|
83
|
-
citibank.firm = another_firm
|
84
|
-
|
85
|
-
assert_equal first_firm.object_id, original_proxy.target.object_id
|
86
|
-
assert_equal another_firm.object_id, citibank.firm.target.object_id
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_creating_the_belonging_object
|
90
|
-
citibank = Account.create("credit_limit" => 10)
|
91
|
-
apple = citibank.create_firm("name" => "Apple")
|
92
|
-
assert_equal apple, citibank.firm
|
93
|
-
citibank.save
|
94
|
-
citibank.reload
|
95
|
-
assert_equal apple, citibank.firm
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_creating_the_belonging_object_with_primary_key
|
99
|
-
client = Client.create(:name => "Primary key client")
|
100
|
-
apple = client.create_firm_with_primary_key("name" => "Apple")
|
101
|
-
assert_equal apple, client.firm_with_primary_key
|
102
|
-
client.save
|
103
|
-
client.reload
|
104
|
-
assert_equal apple, client.firm_with_primary_key
|
105
|
-
end
|
106
|
-
|
107
|
-
def test_building_the_belonging_object
|
108
|
-
citibank = Account.create("credit_limit" => 10)
|
109
|
-
apple = citibank.build_firm("name" => "Apple")
|
110
|
-
citibank.save
|
111
|
-
assert_equal apple.id, citibank.firm_id
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_building_the_belonging_object_with_primary_key
|
115
|
-
client = Client.create(:name => "Primary key client")
|
116
|
-
apple = client.build_firm_with_primary_key("name" => "Apple")
|
117
|
-
client.save
|
118
|
-
assert_equal apple.name, client.firm_name
|
119
|
-
end
|
120
|
-
|
121
|
-
def test_natural_assignment_to_nil
|
122
|
-
client = Client.find(3)
|
123
|
-
client.firm = nil
|
124
|
-
client.save
|
125
|
-
assert_nil client.firm(true)
|
126
|
-
assert_nil client.client_of
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_natural_assignment_to_nil_with_primary_key
|
130
|
-
client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
|
131
|
-
client.firm_with_primary_key = nil
|
132
|
-
client.save
|
133
|
-
assert_nil client.firm_with_primary_key(true)
|
134
|
-
assert_nil client.client_of
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_with_different_class_name
|
138
|
-
assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
|
139
|
-
assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_with_condition
|
143
|
-
assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
|
144
|
-
assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
|
145
|
-
end
|
146
|
-
|
147
|
-
def test_with_select
|
148
|
-
assert_equal Company.find(2).firm_with_select.attributes.size, 1
|
149
|
-
assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
|
150
|
-
end
|
151
|
-
|
152
|
-
def test_belongs_to_counter
|
153
|
-
debate = Topic.create("title" => "debate")
|
154
|
-
assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
|
155
|
-
|
156
|
-
trash = debate.replies.create("title" => "blah!", "content" => "world around!")
|
157
|
-
assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
|
158
|
-
|
159
|
-
trash.destroy
|
160
|
-
assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_belongs_to_with_primary_key_counter
|
164
|
-
debate = Topic.create("title" => "debate")
|
165
|
-
assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
|
166
|
-
|
167
|
-
trash = debate.replies_with_primary_key.create("title" => "blah!", "content" => "world around!")
|
168
|
-
assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
|
169
|
-
|
170
|
-
trash.destroy
|
171
|
-
assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
|
172
|
-
end
|
173
|
-
|
174
|
-
def test_belongs_to_counter_with_assigning_nil
|
175
|
-
p = Post.find(1)
|
176
|
-
c = Comment.find(1)
|
177
|
-
|
178
|
-
assert_equal p.id, c.post_id
|
179
|
-
assert_equal 2, Post.find(p.id).comments.size
|
180
|
-
|
181
|
-
c.post = nil
|
182
|
-
|
183
|
-
assert_equal 1, Post.find(p.id).comments.size
|
184
|
-
end
|
185
|
-
|
186
|
-
def test_belongs_to_with_primary_key_counter_with_assigning_nil
|
187
|
-
debate = Topic.create("title" => "debate")
|
188
|
-
reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
|
189
|
-
|
190
|
-
assert_equal debate.title, reply.parent_title
|
191
|
-
assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count")
|
192
|
-
|
193
|
-
reply.topic_with_primary_key = nil
|
194
|
-
|
195
|
-
assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count")
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_belongs_to_counter_with_reassigning
|
199
|
-
t1 = Topic.create("title" => "t1")
|
200
|
-
t2 = Topic.create("title" => "t2")
|
201
|
-
r1 = Reply.new("title" => "r1", "content" => "r1")
|
202
|
-
r1.topic = t1
|
203
|
-
|
204
|
-
assert r1.save
|
205
|
-
assert_equal 1, Topic.find(t1.id).replies.size
|
206
|
-
assert_equal 0, Topic.find(t2.id).replies.size
|
207
|
-
|
208
|
-
r1.topic = Topic.find(t2.id)
|
209
|
-
|
210
|
-
assert r1.save
|
211
|
-
assert_equal 0, Topic.find(t1.id).replies.size
|
212
|
-
assert_equal 1, Topic.find(t2.id).replies.size
|
213
|
-
|
214
|
-
r1.topic = nil
|
215
|
-
|
216
|
-
assert_equal 0, Topic.find(t1.id).replies.size
|
217
|
-
assert_equal 0, Topic.find(t2.id).replies.size
|
218
|
-
|
219
|
-
r1.topic = t1
|
220
|
-
|
221
|
-
assert_equal 1, Topic.find(t1.id).replies.size
|
222
|
-
assert_equal 0, Topic.find(t2.id).replies.size
|
223
|
-
|
224
|
-
r1.destroy
|
225
|
-
|
226
|
-
assert_equal 0, Topic.find(t1.id).replies.size
|
227
|
-
assert_equal 0, Topic.find(t2.id).replies.size
|
228
|
-
end
|
229
|
-
|
230
|
-
def test_belongs_to_reassign_with_namespaced_models_and_counters
|
231
|
-
t1 = Web::Topic.create("title" => "t1")
|
232
|
-
t2 = Web::Topic.create("title" => "t2")
|
233
|
-
r1 = Web::Reply.new("title" => "r1", "content" => "r1")
|
234
|
-
r1.topic = t1
|
235
|
-
|
236
|
-
assert r1.save
|
237
|
-
assert_equal 1, Web::Topic.find(t1.id).replies.size
|
238
|
-
assert_equal 0, Web::Topic.find(t2.id).replies.size
|
239
|
-
|
240
|
-
r1.topic = Web::Topic.find(t2.id)
|
241
|
-
|
242
|
-
assert r1.save
|
243
|
-
assert_equal 0, Web::Topic.find(t1.id).replies.size
|
244
|
-
assert_equal 1, Web::Topic.find(t2.id).replies.size
|
245
|
-
end
|
246
|
-
|
247
|
-
def test_belongs_to_counter_after_save
|
248
|
-
topic = Topic.create!(:title => "monday night")
|
249
|
-
topic.replies.create!(:title => "re: monday night", :content => "football")
|
250
|
-
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
251
|
-
|
252
|
-
topic.save!
|
253
|
-
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
254
|
-
end
|
255
|
-
|
256
|
-
def test_belongs_to_counter_after_update_attributes
|
257
|
-
topic = Topic.create!(:title => "37s")
|
258
|
-
topic.replies.create!(:title => "re: 37s", :content => "rails")
|
259
|
-
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
260
|
-
|
261
|
-
topic.update_attributes(:title => "37signals")
|
262
|
-
assert_equal 1, Topic.find(topic.id)[:replies_count]
|
263
|
-
end
|
264
|
-
|
265
|
-
def test_assignment_before_child_saved
|
266
|
-
final_cut = Client.new("name" => "Final Cut")
|
267
|
-
firm = Firm.find(1)
|
268
|
-
final_cut.firm = firm
|
269
|
-
assert final_cut.new_record?
|
270
|
-
assert final_cut.save
|
271
|
-
assert !final_cut.new_record?
|
272
|
-
assert !firm.new_record?
|
273
|
-
assert_equal firm, final_cut.firm
|
274
|
-
assert_equal firm, final_cut.firm(true)
|
275
|
-
end
|
276
|
-
|
277
|
-
def test_assignment_before_child_saved_with_primary_key
|
278
|
-
final_cut = Client.new("name" => "Final Cut")
|
279
|
-
firm = Firm.find(1)
|
280
|
-
final_cut.firm_with_primary_key = firm
|
281
|
-
assert final_cut.new_record?
|
282
|
-
assert final_cut.save
|
283
|
-
assert !final_cut.new_record?
|
284
|
-
assert !firm.new_record?
|
285
|
-
assert_equal firm, final_cut.firm_with_primary_key
|
286
|
-
assert_equal firm, final_cut.firm_with_primary_key(true)
|
287
|
-
end
|
288
|
-
|
289
|
-
def test_new_record_with_foreign_key_but_no_object
|
290
|
-
c = Client.new("firm_id" => 1)
|
291
|
-
assert_equal Firm.find(:first), c.firm_with_basic_id
|
292
|
-
end
|
293
|
-
|
294
|
-
def test_forgetting_the_load_when_foreign_key_enters_late
|
295
|
-
c = Client.new
|
296
|
-
assert_nil c.firm_with_basic_id
|
297
|
-
|
298
|
-
c.firm_id = 1
|
299
|
-
assert_equal Firm.find(:first), c.firm_with_basic_id
|
300
|
-
end
|
301
|
-
|
302
|
-
def test_field_name_same_as_foreign_key
|
303
|
-
computer = Computer.find(1)
|
304
|
-
assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
|
305
|
-
end
|
306
|
-
|
307
|
-
def test_counter_cache
|
308
|
-
topic = Topic.create :title => "Zoom-zoom-zoom"
|
309
|
-
assert_equal 0, topic[:replies_count]
|
310
|
-
|
311
|
-
reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
|
312
|
-
reply.topic = topic
|
313
|
-
|
314
|
-
assert_equal 1, topic.reload[:replies_count]
|
315
|
-
assert_equal 1, topic.replies.size
|
316
|
-
|
317
|
-
topic[:replies_count] = 15
|
318
|
-
assert_equal 15, topic.replies.size
|
319
|
-
end
|
320
|
-
|
321
|
-
def test_custom_counter_cache
|
322
|
-
reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
|
323
|
-
assert_equal 0, reply[:replies_count]
|
324
|
-
|
325
|
-
silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
|
326
|
-
silly.reply = reply
|
327
|
-
|
328
|
-
assert_equal 1, reply.reload[:replies_count]
|
329
|
-
assert_equal 1, reply.replies.size
|
330
|
-
|
331
|
-
reply[:replies_count] = 17
|
332
|
-
assert_equal 17, reply.replies.size
|
333
|
-
end
|
334
|
-
|
335
|
-
def test_association_assignment_sticks
|
336
|
-
post = Post.find(:first)
|
337
|
-
|
338
|
-
author1, author2 = Author.find(:all, :limit => 2)
|
339
|
-
assert_not_nil author1
|
340
|
-
assert_not_nil author2
|
341
|
-
|
342
|
-
# make sure the association is loaded
|
343
|
-
post.author
|
344
|
-
|
345
|
-
# set the association by id, directly
|
346
|
-
post.author_id = author2.id
|
347
|
-
|
348
|
-
# save and reload
|
349
|
-
post.save!
|
350
|
-
post.reload
|
351
|
-
|
352
|
-
# the author id of the post should be the id we set
|
353
|
-
assert_equal post.author_id, author2.id
|
354
|
-
end
|
355
|
-
|
356
|
-
def test_cant_save_readonly_association
|
357
|
-
assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
|
358
|
-
assert companies(:first_client).readonly_firm.readonly?
|
359
|
-
end
|
360
|
-
|
361
|
-
def test_polymorphic_assignment_foreign_type_field_updating
|
362
|
-
# should update when assigning a saved record
|
363
|
-
sponsor = Sponsor.new
|
364
|
-
member = Member.create
|
365
|
-
sponsor.sponsorable = member
|
366
|
-
assert_equal "Member", sponsor.sponsorable_type
|
367
|
-
|
368
|
-
# should update when assigning a new record
|
369
|
-
sponsor = Sponsor.new
|
370
|
-
member = Member.new
|
371
|
-
sponsor.sponsorable = member
|
372
|
-
assert_equal "Member", sponsor.sponsorable_type
|
373
|
-
end
|
374
|
-
|
375
|
-
def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
|
376
|
-
# should update when assigning a saved record
|
377
|
-
essay = Essay.new
|
378
|
-
writer = Author.create(:name => "David")
|
379
|
-
essay.writer = writer
|
380
|
-
assert_equal "Author", essay.writer_type
|
381
|
-
|
382
|
-
# should update when assigning a new record
|
383
|
-
essay = Essay.new
|
384
|
-
writer = Author.new
|
385
|
-
essay.writer = writer
|
386
|
-
assert_equal "Author", essay.writer_type
|
387
|
-
end
|
388
|
-
|
389
|
-
def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
|
390
|
-
sponsor = Sponsor.new
|
391
|
-
saved_member = Member.create
|
392
|
-
new_member = Member.new
|
393
|
-
|
394
|
-
sponsor.sponsorable = saved_member
|
395
|
-
assert_equal saved_member.id, sponsor.sponsorable_id
|
396
|
-
|
397
|
-
sponsor.sponsorable = new_member
|
398
|
-
assert_equal nil, sponsor.sponsorable_id
|
399
|
-
end
|
400
|
-
|
401
|
-
def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
|
402
|
-
essay = Essay.new
|
403
|
-
saved_writer = Author.create(:name => "David")
|
404
|
-
new_writer = Author.new
|
405
|
-
|
406
|
-
essay.writer = saved_writer
|
407
|
-
assert_equal saved_writer.name, essay.writer_id
|
408
|
-
|
409
|
-
essay.writer = new_writer
|
410
|
-
assert_equal nil, essay.writer_id
|
411
|
-
end
|
412
|
-
|
413
|
-
def test_belongs_to_proxy_should_not_respond_to_private_methods
|
414
|
-
assert_raise(NoMethodError) { companies(:first_firm).private_method }
|
415
|
-
assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
|
416
|
-
end
|
417
|
-
|
418
|
-
def test_belongs_to_proxy_should_respond_to_private_methods_via_send
|
419
|
-
companies(:first_firm).send(:private_method)
|
420
|
-
companies(:second_client).firm.send(:private_method)
|
421
|
-
end
|
422
|
-
|
423
|
-
def test_save_of_record_with_loaded_belongs_to
|
424
|
-
@account = companies(:first_firm).account
|
425
|
-
|
426
|
-
assert_nothing_raised do
|
427
|
-
Account.find(@account.id).save!
|
428
|
-
Account.find(@account.id, :include => :firm).save!
|
429
|
-
end
|
430
|
-
|
431
|
-
@account.firm.delete
|
432
|
-
|
433
|
-
assert_nothing_raised do
|
434
|
-
Account.find(@account.id).save!
|
435
|
-
Account.find(@account.id, :include => :firm).save!
|
436
|
-
end
|
437
|
-
end
|
438
|
-
end
|