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,704 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/post'
|
3
|
-
require 'models/author'
|
4
|
-
require 'models/developer'
|
5
|
-
require 'models/project'
|
6
|
-
require 'models/comment'
|
7
|
-
require 'models/category'
|
8
|
-
|
9
|
-
class MethodScopingTest < ActiveRecord::TestCase
|
10
|
-
fixtures :authors, :developers, :projects, :comments, :posts, :developers_projects
|
11
|
-
|
12
|
-
def test_set_conditions
|
13
|
-
Developer.with_scope(:find => { :conditions => 'just a test...' }) do
|
14
|
-
assert_equal 'just a test...', Developer.send(:current_scoped_methods)[:find][:conditions]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_scoped_find
|
19
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
20
|
-
assert_nothing_raised { Developer.find(1) }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_scoped_find_first
|
25
|
-
Developer.with_scope(:find => { :conditions => "salary = 100000" }) do
|
26
|
-
assert_equal Developer.find(10), Developer.find(:first, :order => 'name')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def test_scoped_find_last
|
31
|
-
highest_salary = Developer.find(:first, :order => "salary DESC")
|
32
|
-
|
33
|
-
Developer.with_scope(:find => { :order => "salary" }) do
|
34
|
-
assert_equal highest_salary, Developer.last
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_scoped_find_last_preserves_scope
|
39
|
-
lowest_salary = Developer.find(:first, :order => "salary ASC")
|
40
|
-
highest_salary = Developer.find(:first, :order => "salary DESC")
|
41
|
-
|
42
|
-
Developer.with_scope(:find => { :order => "salary" }) do
|
43
|
-
assert_equal highest_salary, Developer.last
|
44
|
-
assert_equal lowest_salary, Developer.first
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_scoped_find_combines_conditions
|
49
|
-
Developer.with_scope(:find => { :conditions => "salary = 9000" }) do
|
50
|
-
assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => "name = 'Jamis'")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_scoped_find_sanitizes_conditions
|
55
|
-
Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
|
56
|
-
assert_equal developers(:poor_jamis), Developer.find(:first)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_scoped_find_combines_and_sanitizes_conditions
|
61
|
-
Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
|
62
|
-
assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => ['name = ?', 'Jamis'])
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_scoped_find_all
|
67
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
68
|
-
assert_equal [developers(:david)], Developer.find(:all)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_scoped_find_select
|
73
|
-
Developer.with_scope(:find => { :select => "id, name" }) do
|
74
|
-
developer = Developer.find(:first, :conditions => "name = 'David'")
|
75
|
-
assert_equal "David", developer.name
|
76
|
-
assert !developer.has_attribute?(:salary)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_options_select_replaces_scope_select
|
81
|
-
Developer.with_scope(:find => { :select => "id, name" }) do
|
82
|
-
developer = Developer.find(:first, :select => 'id, salary', :conditions => "name = 'David'")
|
83
|
-
assert_equal 80000, developer.salary
|
84
|
-
assert !developer.has_attribute?(:name)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def test_scoped_count
|
89
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
90
|
-
assert_equal 1, Developer.count
|
91
|
-
end
|
92
|
-
|
93
|
-
Developer.with_scope(:find => { :conditions => 'salary = 100000' }) do
|
94
|
-
assert_equal 8, Developer.count
|
95
|
-
assert_equal 1, Developer.count(:conditions => "name LIKE 'fixture_1%'")
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_scoped_find_include
|
100
|
-
# with the include, will retrieve only developers for the given project
|
101
|
-
scoped_developers = Developer.with_scope(:find => { :include => :projects }) do
|
102
|
-
Developer.find(:all, :conditions => 'projects.id = 2')
|
103
|
-
end
|
104
|
-
assert scoped_developers.include?(developers(:david))
|
105
|
-
assert !scoped_developers.include?(developers(:jamis))
|
106
|
-
assert_equal 1, scoped_developers.size
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_scoped_find_joins
|
110
|
-
scoped_developers = Developer.with_scope(:find => { :joins => 'JOIN developers_projects ON id = developer_id' } ) do
|
111
|
-
Developer.find(:all, :conditions => 'developers_projects.project_id = 2')
|
112
|
-
end
|
113
|
-
assert scoped_developers.include?(developers(:david))
|
114
|
-
assert !scoped_developers.include?(developers(:jamis))
|
115
|
-
assert_equal 1, scoped_developers.size
|
116
|
-
assert_equal developers(:david).attributes, scoped_developers.first.attributes
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_scoped_find_using_new_style_joins
|
120
|
-
scoped_developers = Developer.with_scope(:find => { :joins => :projects }) do
|
121
|
-
Developer.find(:all, :conditions => 'projects.id = 2')
|
122
|
-
end
|
123
|
-
assert scoped_developers.include?(developers(:david))
|
124
|
-
assert !scoped_developers.include?(developers(:jamis))
|
125
|
-
assert_equal 1, scoped_developers.size
|
126
|
-
assert_equal developers(:david).attributes, scoped_developers.first.attributes
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_scoped_find_merges_old_style_joins
|
130
|
-
scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON authors.id = posts.author_id ' }) do
|
131
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'INNER JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
|
132
|
-
end
|
133
|
-
assert scoped_authors.include?(authors(:david))
|
134
|
-
assert !scoped_authors.include?(authors(:mary))
|
135
|
-
assert_equal 1, scoped_authors.size
|
136
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_scoped_find_merges_new_style_joins
|
140
|
-
scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
|
141
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => :comments, :conditions => 'comments.id = 1')
|
142
|
-
end
|
143
|
-
assert scoped_authors.include?(authors(:david))
|
144
|
-
assert !scoped_authors.include?(authors(:mary))
|
145
|
-
assert_equal 1, scoped_authors.size
|
146
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_scoped_find_merges_new_and_old_style_joins
|
150
|
-
scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
|
151
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
|
152
|
-
end
|
153
|
-
assert scoped_authors.include?(authors(:david))
|
154
|
-
assert !scoped_authors.include?(authors(:mary))
|
155
|
-
assert_equal 1, scoped_authors.size
|
156
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
157
|
-
end
|
158
|
-
|
159
|
-
def test_scoped_find_merges_string_array_style_and_string_style_joins
|
160
|
-
scoped_authors = Author.with_scope(:find => { :joins => ["INNER JOIN posts ON posts.author_id = authors.id"]}) do
|
161
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'INNER JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
|
162
|
-
end
|
163
|
-
assert scoped_authors.include?(authors(:david))
|
164
|
-
assert !scoped_authors.include?(authors(:mary))
|
165
|
-
assert_equal 1, scoped_authors.size
|
166
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
167
|
-
end
|
168
|
-
|
169
|
-
def test_scoped_find_merges_string_array_style_and_hash_style_joins
|
170
|
-
scoped_authors = Author.with_scope(:find => { :joins => :posts}) do
|
171
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => ['INNER JOIN comments ON posts.id = comments.post_id'], :conditions => 'comments.id = 1')
|
172
|
-
end
|
173
|
-
assert scoped_authors.include?(authors(:david))
|
174
|
-
assert !scoped_authors.include?(authors(:mary))
|
175
|
-
assert_equal 1, scoped_authors.size
|
176
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
177
|
-
end
|
178
|
-
|
179
|
-
def test_scoped_find_merges_joins_and_eliminates_duplicate_string_joins
|
180
|
-
scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON posts.author_id = authors.id'}) do
|
181
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => ["INNER JOIN posts ON posts.author_id = authors.id", "INNER JOIN comments ON posts.id = comments.post_id"], :conditions => 'comments.id = 1')
|
182
|
-
end
|
183
|
-
assert scoped_authors.include?(authors(:david))
|
184
|
-
assert !scoped_authors.include?(authors(:mary))
|
185
|
-
assert_equal 1, scoped_authors.size
|
186
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
187
|
-
end
|
188
|
-
|
189
|
-
def test_scoped_find_strips_spaces_from_string_joins_and_eliminates_duplicate_string_joins
|
190
|
-
scoped_authors = Author.with_scope(:find => { :joins => ' INNER JOIN posts ON posts.author_id = authors.id '}) do
|
191
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => ['INNER JOIN posts ON posts.author_id = authors.id'], :conditions => 'posts.id = 1')
|
192
|
-
end
|
193
|
-
assert scoped_authors.include?(authors(:david))
|
194
|
-
assert !scoped_authors.include?(authors(:mary))
|
195
|
-
assert_equal 1, scoped_authors.size
|
196
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_scoped_count_include
|
200
|
-
# with the include, will retrieve only developers for the given project
|
201
|
-
Developer.with_scope(:find => { :include => :projects }) do
|
202
|
-
assert_equal 1, Developer.count(:conditions => 'projects.id = 2')
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
def test_scoped_create
|
207
|
-
new_comment = nil
|
208
|
-
|
209
|
-
VerySpecialComment.with_scope(:create => { :post_id => 1 }) do
|
210
|
-
assert_equal({ :post_id => 1 }, VerySpecialComment.send(:current_scoped_methods)[:create])
|
211
|
-
new_comment = VerySpecialComment.create :body => "Wonderful world"
|
212
|
-
end
|
213
|
-
|
214
|
-
assert Post.find(1).comments.include?(new_comment)
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_immutable_scope
|
218
|
-
options = { :conditions => "name = 'David'" }
|
219
|
-
Developer.with_scope(:find => options) do
|
220
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
221
|
-
options[:conditions] = "name != 'David'"
|
222
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
223
|
-
end
|
224
|
-
|
225
|
-
scope = { :find => { :conditions => "name = 'David'" }}
|
226
|
-
Developer.with_scope(scope) do
|
227
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
228
|
-
scope[:find][:conditions] = "name != 'David'"
|
229
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
def test_scoped_with_duck_typing
|
234
|
-
scoping = Struct.new(:method_scoping).new(:find => { :conditions => ["name = ?", 'David'] })
|
235
|
-
Developer.with_scope(scoping) do
|
236
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
def test_ensure_that_method_scoping_is_correctly_restored
|
241
|
-
scoped_methods = Developer.instance_eval('current_scoped_methods')
|
242
|
-
|
243
|
-
begin
|
244
|
-
Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
|
245
|
-
raise "an exception"
|
246
|
-
end
|
247
|
-
rescue
|
248
|
-
end
|
249
|
-
assert_equal scoped_methods, Developer.instance_eval('current_scoped_methods')
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
class NestedScopingTest < ActiveRecord::TestCase
|
254
|
-
fixtures :authors, :developers, :projects, :comments, :posts
|
255
|
-
|
256
|
-
def test_merge_options
|
257
|
-
Developer.with_scope(:find => { :conditions => 'salary = 80000' }) do
|
258
|
-
Developer.with_scope(:find => { :limit => 10 }) do
|
259
|
-
merged_option = Developer.instance_eval('current_scoped_methods')[:find]
|
260
|
-
assert_equal({ :conditions => 'salary = 80000', :limit => 10 }, merged_option)
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
def test_merge_inner_scope_has_priority
|
266
|
-
Developer.with_scope(:find => { :limit => 5 }) do
|
267
|
-
Developer.with_scope(:find => { :limit => 10 }) do
|
268
|
-
merged_option = Developer.instance_eval('current_scoped_methods')[:find]
|
269
|
-
assert_equal({ :limit => 10 }, merged_option)
|
270
|
-
end
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
def test_replace_options
|
275
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
276
|
-
Developer.with_exclusive_scope(:find => { :conditions => "name = 'Jamis'" }) do
|
277
|
-
assert_equal({:find => { :conditions => "name = 'Jamis'" }}, Developer.instance_eval('current_scoped_methods'))
|
278
|
-
assert_equal({:find => { :conditions => "name = 'Jamis'" }}, Developer.send(:scoped_methods)[-1])
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
def test_append_conditions
|
284
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
285
|
-
Developer.with_scope(:find => { :conditions => 'salary = 80000' }) do
|
286
|
-
appended_condition = Developer.instance_eval('current_scoped_methods')[:find][:conditions]
|
287
|
-
assert_equal("(name = 'David') AND (salary = 80000)", appended_condition)
|
288
|
-
assert_equal(1, Developer.count)
|
289
|
-
end
|
290
|
-
Developer.with_scope(:find => { :conditions => "name = 'Maiha'" }) do
|
291
|
-
assert_equal(0, Developer.count)
|
292
|
-
end
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
def test_merge_and_append_options
|
297
|
-
Developer.with_scope(:find => { :conditions => 'salary = 80000', :limit => 10 }) do
|
298
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
299
|
-
merged_option = Developer.instance_eval('current_scoped_methods')[:find]
|
300
|
-
assert_equal({ :conditions => "(salary = 80000) AND (name = 'David')", :limit => 10 }, merged_option)
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
def test_nested_scoped_find
|
306
|
-
Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
|
307
|
-
Developer.with_exclusive_scope(:find => { :conditions => "name = 'David'" }) do
|
308
|
-
assert_nothing_raised { Developer.find(1) }
|
309
|
-
assert_equal('David', Developer.find(:first).name)
|
310
|
-
end
|
311
|
-
assert_equal('Jamis', Developer.find(:first).name)
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
def test_nested_scoped_find_include
|
316
|
-
Developer.with_scope(:find => { :include => :projects }) do
|
317
|
-
Developer.with_scope(:find => { :conditions => "projects.id = 2" }) do
|
318
|
-
assert_nothing_raised { Developer.find(1) }
|
319
|
-
assert_equal('David', Developer.find(:first).name)
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
323
|
-
|
324
|
-
def test_nested_scoped_find_merged_include
|
325
|
-
# :include's remain unique and don't "double up" when merging
|
326
|
-
Developer.with_scope(:find => { :include => :projects, :conditions => "projects.id = 2" }) do
|
327
|
-
Developer.with_scope(:find => { :include => :projects }) do
|
328
|
-
assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
|
329
|
-
assert_equal('David', Developer.find(:first).name)
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
# the nested scope doesn't remove the first :include
|
334
|
-
Developer.with_scope(:find => { :include => :projects, :conditions => "projects.id = 2" }) do
|
335
|
-
Developer.with_scope(:find => { :include => [] }) do
|
336
|
-
assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
|
337
|
-
assert_equal('David', Developer.find(:first).name)
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
# mixing array and symbol include's will merge correctly
|
342
|
-
Developer.with_scope(:find => { :include => [:projects], :conditions => "projects.id = 2" }) do
|
343
|
-
Developer.with_scope(:find => { :include => :projects }) do
|
344
|
-
assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
|
345
|
-
assert_equal('David', Developer.find(:first).name)
|
346
|
-
end
|
347
|
-
end
|
348
|
-
end
|
349
|
-
|
350
|
-
def test_nested_scoped_find_replace_include
|
351
|
-
Developer.with_scope(:find => { :include => :projects }) do
|
352
|
-
Developer.with_exclusive_scope(:find => { :include => [] }) do
|
353
|
-
assert_equal 0, Developer.instance_eval('current_scoped_methods')[:find][:include].length
|
354
|
-
end
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
def test_three_level_nested_exclusive_scoped_find
|
359
|
-
Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
|
360
|
-
assert_equal('Jamis', Developer.find(:first).name)
|
361
|
-
|
362
|
-
Developer.with_exclusive_scope(:find => { :conditions => "name = 'David'" }) do
|
363
|
-
assert_equal('David', Developer.find(:first).name)
|
364
|
-
|
365
|
-
Developer.with_exclusive_scope(:find => { :conditions => "name = 'Maiha'" }) do
|
366
|
-
assert_equal(nil, Developer.find(:first))
|
367
|
-
end
|
368
|
-
|
369
|
-
# ensure that scoping is restored
|
370
|
-
assert_equal('David', Developer.find(:first).name)
|
371
|
-
end
|
372
|
-
|
373
|
-
# ensure that scoping is restored
|
374
|
-
assert_equal('Jamis', Developer.find(:first).name)
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
def test_merged_scoped_find
|
379
|
-
poor_jamis = developers(:poor_jamis)
|
380
|
-
Developer.with_scope(:find => { :conditions => "salary < 100000" }) do
|
381
|
-
Developer.with_scope(:find => { :offset => 1, :order => 'id asc' }) do
|
382
|
-
assert_sql /ORDER BY id asc / do
|
383
|
-
assert_equal(poor_jamis, Developer.find(:first, :order => 'id asc'))
|
384
|
-
end
|
385
|
-
end
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
def test_merged_scoped_find_sanitizes_conditions
|
390
|
-
Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
|
391
|
-
Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
|
392
|
-
assert_raise(ActiveRecord::RecordNotFound) { developers(:poor_jamis) }
|
393
|
-
end
|
394
|
-
end
|
395
|
-
end
|
396
|
-
|
397
|
-
def test_nested_scoped_find_combines_and_sanitizes_conditions
|
398
|
-
Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
|
399
|
-
Developer.with_exclusive_scope(:find => { :conditions => ['salary = ?', 9000] }) do
|
400
|
-
assert_equal developers(:poor_jamis), Developer.find(:first)
|
401
|
-
assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => ['name = ?', 'Jamis'])
|
402
|
-
end
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
|
-
def test_merged_scoped_find_combines_and_sanitizes_conditions
|
407
|
-
Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
|
408
|
-
Developer.with_scope(:find => { :conditions => ['salary > ?', 9000] }) do
|
409
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
410
|
-
end
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
def test_nested_scoped_create
|
415
|
-
comment = nil
|
416
|
-
Comment.with_scope(:create => { :post_id => 1}) do
|
417
|
-
Comment.with_scope(:create => { :post_id => 2}) do
|
418
|
-
assert_equal({ :post_id => 2 }, Comment.send(:current_scoped_methods)[:create])
|
419
|
-
comment = Comment.create :body => "Hey guys, nested scopes are broken. Please fix!"
|
420
|
-
end
|
421
|
-
end
|
422
|
-
assert_equal 2, comment.post_id
|
423
|
-
end
|
424
|
-
|
425
|
-
def test_nested_exclusive_scope_for_create
|
426
|
-
comment = nil
|
427
|
-
Comment.with_scope(:create => { :body => "Hey guys, nested scopes are broken. Please fix!" }) do
|
428
|
-
Comment.with_exclusive_scope(:create => { :post_id => 1 }) do
|
429
|
-
assert_equal({ :post_id => 1 }, Comment.send(:current_scoped_methods)[:create])
|
430
|
-
comment = Comment.create :body => "Hey guys"
|
431
|
-
end
|
432
|
-
end
|
433
|
-
assert_equal 1, comment.post_id
|
434
|
-
assert_equal 'Hey guys', comment.body
|
435
|
-
end
|
436
|
-
|
437
|
-
def test_merged_scoped_find_on_blank_conditions
|
438
|
-
[nil, " ", [], {}].each do |blank|
|
439
|
-
Developer.with_scope(:find => {:conditions => blank}) do
|
440
|
-
Developer.with_scope(:find => {:conditions => blank}) do
|
441
|
-
assert_nothing_raised { Developer.find(:first) }
|
442
|
-
end
|
443
|
-
end
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
def test_merged_scoped_find_on_blank_bind_conditions
|
448
|
-
[ [""], ["",{}] ].each do |blank|
|
449
|
-
Developer.with_scope(:find => {:conditions => blank}) do
|
450
|
-
Developer.with_scope(:find => {:conditions => blank}) do
|
451
|
-
assert_nothing_raised { Developer.find(:first) }
|
452
|
-
end
|
453
|
-
end
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
|
-
def test_immutable_nested_scope
|
458
|
-
options1 = { :conditions => "name = 'Jamis'" }
|
459
|
-
options2 = { :conditions => "name = 'David'" }
|
460
|
-
Developer.with_scope(:find => options1) do
|
461
|
-
Developer.with_exclusive_scope(:find => options2) do
|
462
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
463
|
-
options1[:conditions] = options2[:conditions] = nil
|
464
|
-
assert_equal %w(David), Developer.find(:all).map { |d| d.name }
|
465
|
-
end
|
466
|
-
end
|
467
|
-
end
|
468
|
-
|
469
|
-
def test_immutable_merged_scope
|
470
|
-
options1 = { :conditions => "name = 'Jamis'" }
|
471
|
-
options2 = { :conditions => "salary > 10000" }
|
472
|
-
Developer.with_scope(:find => options1) do
|
473
|
-
Developer.with_scope(:find => options2) do
|
474
|
-
assert_equal %w(Jamis), Developer.find(:all).map { |d| d.name }
|
475
|
-
options1[:conditions] = options2[:conditions] = nil
|
476
|
-
assert_equal %w(Jamis), Developer.find(:all).map { |d| d.name }
|
477
|
-
end
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
|
-
def test_ensure_that_method_scoping_is_correctly_restored
|
482
|
-
Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
|
483
|
-
scoped_methods = Developer.instance_eval('current_scoped_methods')
|
484
|
-
begin
|
485
|
-
Developer.with_scope(:find => { :conditions => "name = 'Maiha'" }) do
|
486
|
-
raise "an exception"
|
487
|
-
end
|
488
|
-
rescue
|
489
|
-
end
|
490
|
-
assert_equal scoped_methods, Developer.instance_eval('current_scoped_methods')
|
491
|
-
end
|
492
|
-
end
|
493
|
-
|
494
|
-
def test_nested_scoped_find_merges_old_style_joins
|
495
|
-
scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON authors.id = posts.author_id' }) do
|
496
|
-
Author.with_scope(:find => { :joins => 'INNER JOIN comments ON posts.id = comments.post_id' }) do
|
497
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :conditions => 'comments.id = 1')
|
498
|
-
end
|
499
|
-
end
|
500
|
-
assert scoped_authors.include?(authors(:david))
|
501
|
-
assert !scoped_authors.include?(authors(:mary))
|
502
|
-
assert_equal 1, scoped_authors.size
|
503
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
504
|
-
end
|
505
|
-
|
506
|
-
def test_nested_scoped_find_merges_new_style_joins
|
507
|
-
scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
|
508
|
-
Author.with_scope(:find => { :joins => :comments }) do
|
509
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :conditions => 'comments.id = 1')
|
510
|
-
end
|
511
|
-
end
|
512
|
-
assert scoped_authors.include?(authors(:david))
|
513
|
-
assert !scoped_authors.include?(authors(:mary))
|
514
|
-
assert_equal 1, scoped_authors.size
|
515
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
516
|
-
end
|
517
|
-
|
518
|
-
def test_nested_scoped_find_merges_new_and_old_style_joins
|
519
|
-
scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
|
520
|
-
Author.with_scope(:find => { :joins => 'INNER JOIN comments ON posts.id = comments.post_id' }) do
|
521
|
-
Author.find(:all, :select => 'DISTINCT authors.*', :joins => '', :conditions => 'comments.id = 1')
|
522
|
-
end
|
523
|
-
end
|
524
|
-
assert scoped_authors.include?(authors(:david))
|
525
|
-
assert !scoped_authors.include?(authors(:mary))
|
526
|
-
assert_equal 1, scoped_authors.size
|
527
|
-
assert_equal authors(:david).attributes, scoped_authors.first.attributes
|
528
|
-
end
|
529
|
-
end
|
530
|
-
|
531
|
-
class HasManyScopingTest< ActiveRecord::TestCase
|
532
|
-
fixtures :comments, :posts
|
533
|
-
|
534
|
-
def setup
|
535
|
-
@welcome = Post.find(1)
|
536
|
-
end
|
537
|
-
|
538
|
-
def test_forwarding_of_static_methods
|
539
|
-
assert_equal 'a comment...', Comment.what_are_you
|
540
|
-
assert_equal 'a comment...', @welcome.comments.what_are_you
|
541
|
-
end
|
542
|
-
|
543
|
-
def test_forwarding_to_scoped
|
544
|
-
assert_equal 4, Comment.search_by_type('Comment').size
|
545
|
-
assert_equal 2, @welcome.comments.search_by_type('Comment').size
|
546
|
-
end
|
547
|
-
|
548
|
-
def test_forwarding_to_dynamic_finders
|
549
|
-
assert_equal 4, Comment.find_all_by_type('Comment').size
|
550
|
-
assert_equal 2, @welcome.comments.find_all_by_type('Comment').size
|
551
|
-
end
|
552
|
-
|
553
|
-
def test_nested_scope
|
554
|
-
Comment.with_scope(:find => { :conditions => '1=1' }) do
|
555
|
-
assert_equal 'a comment...', @welcome.comments.what_are_you
|
556
|
-
end
|
557
|
-
end
|
558
|
-
end
|
559
|
-
|
560
|
-
class HasAndBelongsToManyScopingTest< ActiveRecord::TestCase
|
561
|
-
fixtures :posts, :categories, :categories_posts
|
562
|
-
|
563
|
-
def setup
|
564
|
-
@welcome = Post.find(1)
|
565
|
-
end
|
566
|
-
|
567
|
-
def test_forwarding_of_static_methods
|
568
|
-
assert_equal 'a category...', Category.what_are_you
|
569
|
-
assert_equal 'a category...', @welcome.categories.what_are_you
|
570
|
-
end
|
571
|
-
|
572
|
-
def test_forwarding_to_dynamic_finders
|
573
|
-
assert_equal 4, Category.find_all_by_type('SpecialCategory').size
|
574
|
-
assert_equal 0, @welcome.categories.find_all_by_type('SpecialCategory').size
|
575
|
-
assert_equal 2, @welcome.categories.find_all_by_type('Category').size
|
576
|
-
end
|
577
|
-
|
578
|
-
def test_nested_scope
|
579
|
-
Category.with_scope(:find => { :conditions => '1=1' }) do
|
580
|
-
assert_equal 'a comment...', @welcome.comments.what_are_you
|
581
|
-
end
|
582
|
-
end
|
583
|
-
end
|
584
|
-
|
585
|
-
class DefaultScopingTest < ActiveRecord::TestCase
|
586
|
-
fixtures :developers
|
587
|
-
|
588
|
-
def test_default_scope
|
589
|
-
expected = Developer.find(:all, :order => 'salary DESC').collect { |dev| dev.salary }
|
590
|
-
received = DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
|
591
|
-
assert_equal expected, received
|
592
|
-
end
|
593
|
-
|
594
|
-
def test_default_scope_with_conditions_string
|
595
|
-
assert_equal Developer.find_all_by_name('David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
|
596
|
-
assert_equal nil, DeveloperCalledDavid.create!.name
|
597
|
-
end
|
598
|
-
|
599
|
-
def test_default_scope_with_conditions_hash
|
600
|
-
assert_equal Developer.find_all_by_name('Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
|
601
|
-
assert_equal 'Jamis', DeveloperCalledJamis.create!.name
|
602
|
-
end
|
603
|
-
|
604
|
-
def test_default_scoping_with_threads
|
605
|
-
scope = [{ :create => {}, :find => { :order => 'salary DESC' } }]
|
606
|
-
|
607
|
-
2.times do
|
608
|
-
Thread.new { assert_equal scope, DeveloperOrderedBySalary.send(:scoped_methods) }.join
|
609
|
-
end
|
610
|
-
end
|
611
|
-
|
612
|
-
def test_default_scoping_with_inheritance
|
613
|
-
scope = [{ :create => {}, :find => { :order => 'salary DESC' } }]
|
614
|
-
|
615
|
-
# Inherit a class having a default scope and define a new default scope
|
616
|
-
klass = Class.new(DeveloperOrderedBySalary)
|
617
|
-
klass.send :default_scope, {}
|
618
|
-
|
619
|
-
# Scopes added on children should append to parent scope
|
620
|
-
expected_klass_scope = [{ :create => {}, :find => { :order => 'salary DESC' }}, { :create => {}, :find => {} }]
|
621
|
-
assert_equal expected_klass_scope, klass.send(:scoped_methods)
|
622
|
-
|
623
|
-
# Parent should still have the original scope
|
624
|
-
assert_equal scope, DeveloperOrderedBySalary.send(:scoped_methods)
|
625
|
-
end
|
626
|
-
|
627
|
-
def test_method_scope
|
628
|
-
expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.salary }
|
629
|
-
received = DeveloperOrderedBySalary.all_ordered_by_name.collect { |dev| dev.salary }
|
630
|
-
assert_equal expected, received
|
631
|
-
end
|
632
|
-
|
633
|
-
def test_nested_scope
|
634
|
-
expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.salary }
|
635
|
-
received = DeveloperOrderedBySalary.with_scope(:find => { :order => 'name DESC'}) do
|
636
|
-
DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
|
637
|
-
end
|
638
|
-
assert_equal expected, received
|
639
|
-
end
|
640
|
-
|
641
|
-
def test_named_scope_overwrites_default
|
642
|
-
expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.name }
|
643
|
-
received = DeveloperOrderedBySalary.by_name.find(:all).collect { |dev| dev.name }
|
644
|
-
assert_equal expected, received
|
645
|
-
end
|
646
|
-
|
647
|
-
def test_nested_exclusive_scope
|
648
|
-
expected = Developer.find(:all, :limit => 100).collect { |dev| dev.salary }
|
649
|
-
received = DeveloperOrderedBySalary.with_exclusive_scope(:find => { :limit => 100 }) do
|
650
|
-
DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
|
651
|
-
end
|
652
|
-
assert_equal expected, received
|
653
|
-
end
|
654
|
-
|
655
|
-
def test_overwriting_default_scope
|
656
|
-
expected = Developer.find(:all, :order => 'salary').collect { |dev| dev.salary }
|
657
|
-
received = DeveloperOrderedBySalary.find(:all, :order => 'salary').collect { |dev| dev.salary }
|
658
|
-
assert_equal expected, received
|
659
|
-
end
|
660
|
-
end
|
661
|
-
|
662
|
-
=begin
|
663
|
-
# We disabled the scoping for has_one and belongs_to as we can't think of a proper use case
|
664
|
-
|
665
|
-
class BelongsToScopingTest< ActiveRecord::TestCase
|
666
|
-
fixtures :comments, :posts
|
667
|
-
|
668
|
-
def setup
|
669
|
-
@greetings = Comment.find(1)
|
670
|
-
end
|
671
|
-
|
672
|
-
def test_forwarding_of_static_method
|
673
|
-
assert_equal 'a post...', Post.what_are_you
|
674
|
-
assert_equal 'a post...', @greetings.post.what_are_you
|
675
|
-
end
|
676
|
-
|
677
|
-
def test_forwarding_to_dynamic_finders
|
678
|
-
assert_equal 4, Post.find_all_by_type('Post').size
|
679
|
-
assert_equal 1, @greetings.post.find_all_by_type('Post').size
|
680
|
-
end
|
681
|
-
|
682
|
-
end
|
683
|
-
|
684
|
-
class HasOneScopingTest< ActiveRecord::TestCase
|
685
|
-
fixtures :comments, :posts
|
686
|
-
|
687
|
-
def setup
|
688
|
-
@sti_comments = Post.find(4)
|
689
|
-
end
|
690
|
-
|
691
|
-
def test_forwarding_of_static_methods
|
692
|
-
assert_equal 'a comment...', Comment.what_are_you
|
693
|
-
assert_equal 'a very special comment...', @sti_comments.very_special_comment.what_are_you
|
694
|
-
end
|
695
|
-
|
696
|
-
def test_forwarding_to_dynamic_finders
|
697
|
-
assert_equal 1, Comment.find_all_by_type('VerySpecialComment').size
|
698
|
-
assert_equal 1, @sti_comments.very_special_comment.find_all_by_type('VerySpecialComment').size
|
699
|
-
assert_equal 0, @sti_comments.very_special_comment.find_all_by_type('Comment').size
|
700
|
-
end
|
701
|
-
|
702
|
-
end
|
703
|
-
|
704
|
-
=end
|