activerecord 2.3.18 → 3.2.22
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +1014 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +222 -0
- data/examples/performance.rb +100 -126
- data/examples/simple.rb +14 -0
- data/lib/active_record/aggregations.rb +93 -99
- data/lib/active_record/associations/alias_tracker.rb +76 -0
- data/lib/active_record/associations/association.rb +247 -0
- data/lib/active_record/associations/association_scope.rb +134 -0
- data/lib/active_record/associations/belongs_to_association.rb +54 -61
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
- data/lib/active_record/associations/builder/association.rb +55 -0
- data/lib/active_record/associations/builder/belongs_to.rb +88 -0
- data/lib/active_record/associations/builder/collection_association.rb +75 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
- data/lib/active_record/associations/builder/has_many.rb +71 -0
- data/lib/active_record/associations/builder/has_one.rb +62 -0
- data/lib/active_record/associations/builder/singular_association.rb +32 -0
- data/lib/active_record/associations/collection_association.rb +580 -0
- data/lib/active_record/associations/collection_proxy.rb +133 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
- data/lib/active_record/associations/has_many_association.rb +60 -79
- data/lib/active_record/associations/has_many_through_association.rb +127 -206
- data/lib/active_record/associations/has_one_association.rb +55 -114
- data/lib/active_record/associations/has_one_through_association.rb +25 -26
- data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
- data/lib/active_record/associations/join_dependency.rb +214 -0
- data/lib/active_record/associations/join_helper.rb +55 -0
- data/lib/active_record/associations/preloader/association.rb +125 -0
- data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
- data/lib/active_record/associations/preloader/collection_association.rb +24 -0
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
- data/lib/active_record/associations/preloader/has_many.rb +17 -0
- data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
- data/lib/active_record/associations/preloader/has_one.rb +23 -0
- data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
- data/lib/active_record/associations/preloader/singular_association.rb +21 -0
- data/lib/active_record/associations/preloader/through_association.rb +67 -0
- data/lib/active_record/associations/preloader.rb +181 -0
- data/lib/active_record/associations/singular_association.rb +64 -0
- data/lib/active_record/associations/through_association.rb +87 -0
- data/lib/active_record/associations.rb +693 -1337
- data/lib/active_record/attribute_assignment.rb +221 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
- data/lib/active_record/attribute_methods/dirty.rb +111 -0
- data/lib/active_record/attribute_methods/primary_key.rb +114 -0
- data/lib/active_record/attribute_methods/query.rb +39 -0
- data/lib/active_record/attribute_methods/read.rb +136 -0
- data/lib/active_record/attribute_methods/serialization.rb +120 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
- data/lib/active_record/attribute_methods/write.rb +70 -0
- data/lib/active_record/attribute_methods.rb +211 -339
- data/lib/active_record/autosave_association.rb +179 -149
- data/lib/active_record/base.rb +401 -2907
- data/lib/active_record/callbacks.rb +91 -176
- data/lib/active_record/coders/yaml_column.rb +41 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
- data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
- data/lib/active_record/connection_adapters/column.rb +296 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
- data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
- data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
- data/lib/active_record/counter_cache.rb +123 -0
- data/lib/active_record/dynamic_finder_match.rb +41 -14
- data/lib/active_record/dynamic_matchers.rb +84 -0
- data/lib/active_record/dynamic_scope_match.rb +13 -15
- data/lib/active_record/errors.rb +195 -0
- data/lib/active_record/explain.rb +86 -0
- data/lib/active_record/explain_subscriber.rb +25 -0
- data/lib/active_record/fixtures/file.rb +65 -0
- data/lib/active_record/fixtures.rb +695 -770
- data/lib/active_record/identity_map.rb +162 -0
- data/lib/active_record/inheritance.rb +174 -0
- data/lib/active_record/integration.rb +60 -0
- data/lib/active_record/locale/en.yml +9 -27
- data/lib/active_record/locking/optimistic.rb +76 -73
- data/lib/active_record/locking/pessimistic.rb +32 -10
- data/lib/active_record/log_subscriber.rb +72 -0
- data/lib/active_record/migration/command_recorder.rb +105 -0
- data/lib/active_record/migration.rb +415 -205
- data/lib/active_record/model_schema.rb +368 -0
- data/lib/active_record/nested_attributes.rb +153 -63
- data/lib/active_record/observer.rb +27 -103
- data/lib/active_record/persistence.rb +376 -0
- data/lib/active_record/query_cache.rb +49 -8
- data/lib/active_record/querying.rb +58 -0
- data/lib/active_record/railtie.rb +131 -0
- data/lib/active_record/railties/console_sandbox.rb +6 -0
- data/lib/active_record/railties/controller_runtime.rb +49 -0
- data/lib/active_record/railties/databases.rake +659 -0
- data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
- data/lib/active_record/readonly_attributes.rb +26 -0
- data/lib/active_record/reflection.rb +269 -120
- data/lib/active_record/relation/batches.rb +90 -0
- data/lib/active_record/relation/calculations.rb +372 -0
- data/lib/active_record/relation/delegation.rb +49 -0
- data/lib/active_record/relation/finder_methods.rb +402 -0
- data/lib/active_record/relation/predicate_builder.rb +63 -0
- data/lib/active_record/relation/query_methods.rb +417 -0
- data/lib/active_record/relation/spawn_methods.rb +180 -0
- data/lib/active_record/relation.rb +537 -0
- data/lib/active_record/result.rb +40 -0
- data/lib/active_record/sanitization.rb +194 -0
- data/lib/active_record/schema.rb +9 -6
- data/lib/active_record/schema_dumper.rb +55 -32
- data/lib/active_record/scoping/default.rb +142 -0
- data/lib/active_record/scoping/named.rb +200 -0
- data/lib/active_record/scoping.rb +152 -0
- data/lib/active_record/serialization.rb +8 -91
- data/lib/active_record/serializers/xml_serializer.rb +43 -197
- data/lib/active_record/session_store.rb +129 -103
- data/lib/active_record/store.rb +52 -0
- data/lib/active_record/test_case.rb +30 -23
- data/lib/active_record/timestamp.rb +95 -52
- data/lib/active_record/transactions.rb +212 -66
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/validations/associated.rb +43 -0
- data/lib/active_record/validations/uniqueness.rb +180 -0
- data/lib/active_record/validations.rb +43 -1106
- data/lib/active_record/version.rb +5 -4
- data/lib/active_record.rb +121 -48
- data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
- data/lib/rails/generators/active_record/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
- data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
- data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
- data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
- data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
- data/lib/rails/generators/active_record.rb +25 -0
- metadata +187 -363
- data/CHANGELOG +0 -5904
- data/README +0 -351
- data/RUNNING_UNIT_TESTS +0 -36
- data/Rakefile +0 -268
- data/install.rb +0 -30
- data/lib/active_record/association_preload.rb +0 -406
- data/lib/active_record/associations/association_collection.rb +0 -533
- data/lib/active_record/associations/association_proxy.rb +0 -288
- data/lib/active_record/batches.rb +0 -85
- data/lib/active_record/calculations.rb +0 -321
- data/lib/active_record/dirty.rb +0 -183
- data/lib/active_record/named_scope.rb +0 -197
- data/lib/active_record/serializers/json_serializer.rb +0 -91
- data/lib/activerecord.rb +0 -2
- data/test/assets/example.log +0 -1
- data/test/assets/flowers.jpg +0 -0
- data/test/cases/aaa_create_tables_test.rb +0 -24
- data/test/cases/active_schema_test_mysql.rb +0 -122
- data/test/cases/active_schema_test_postgresql.rb +0 -24
- data/test/cases/adapter_test.rb +0 -144
- data/test/cases/aggregations_test.rb +0 -167
- data/test/cases/ar_schema_test.rb +0 -32
- data/test/cases/associations/belongs_to_associations_test.rb +0 -438
- data/test/cases/associations/callbacks_test.rb +0 -161
- data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
- data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
- data/test/cases/associations/eager_singularization_test.rb +0 -145
- data/test/cases/associations/eager_test.rb +0 -852
- data/test/cases/associations/extension_test.rb +0 -62
- data/test/cases/associations/habtm_join_table_test.rb +0 -56
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
- data/test/cases/associations/has_many_associations_test.rb +0 -1273
- data/test/cases/associations/has_many_through_associations_test.rb +0 -360
- data/test/cases/associations/has_one_associations_test.rb +0 -330
- data/test/cases/associations/has_one_through_associations_test.rb +0 -209
- data/test/cases/associations/inner_join_association_test.rb +0 -93
- data/test/cases/associations/inverse_associations_test.rb +0 -566
- data/test/cases/associations/join_model_test.rb +0 -712
- data/test/cases/associations_test.rb +0 -282
- data/test/cases/attribute_methods_test.rb +0 -305
- data/test/cases/autosave_association_test.rb +0 -1218
- data/test/cases/base_test.rb +0 -2166
- data/test/cases/batches_test.rb +0 -81
- data/test/cases/binary_test.rb +0 -30
- data/test/cases/calculations_test.rb +0 -360
- data/test/cases/callbacks_observers_test.rb +0 -38
- data/test/cases/callbacks_test.rb +0 -438
- data/test/cases/class_inheritable_attributes_test.rb +0 -32
- data/test/cases/column_alias_test.rb +0 -17
- data/test/cases/column_definition_test.rb +0 -70
- data/test/cases/connection_pool_test.rb +0 -25
- data/test/cases/connection_test_firebird.rb +0 -8
- data/test/cases/connection_test_mysql.rb +0 -65
- data/test/cases/copy_table_test_sqlite.rb +0 -80
- data/test/cases/counter_cache_test.rb +0 -84
- data/test/cases/database_statements_test.rb +0 -12
- data/test/cases/datatype_test_postgresql.rb +0 -204
- data/test/cases/date_time_test.rb +0 -37
- data/test/cases/default_test_firebird.rb +0 -16
- data/test/cases/defaults_test.rb +0 -111
- data/test/cases/deprecated_finder_test.rb +0 -30
- data/test/cases/dirty_test.rb +0 -316
- data/test/cases/finder_respond_to_test.rb +0 -76
- data/test/cases/finder_test.rb +0 -1098
- data/test/cases/fixtures_test.rb +0 -661
- data/test/cases/helper.rb +0 -68
- data/test/cases/i18n_test.rb +0 -46
- data/test/cases/inheritance_test.rb +0 -262
- data/test/cases/invalid_date_test.rb +0 -24
- data/test/cases/json_serialization_test.rb +0 -219
- data/test/cases/lifecycle_test.rb +0 -193
- data/test/cases/locking_test.rb +0 -350
- data/test/cases/method_scoping_test.rb +0 -704
- data/test/cases/migration_test.rb +0 -1649
- data/test/cases/migration_test_firebird.rb +0 -124
- data/test/cases/mixin_test.rb +0 -96
- data/test/cases/modules_test.rb +0 -109
- data/test/cases/multiple_db_test.rb +0 -85
- data/test/cases/named_scope_test.rb +0 -372
- data/test/cases/nested_attributes_test.rb +0 -840
- data/test/cases/pk_test.rb +0 -119
- data/test/cases/pooled_connections_test.rb +0 -103
- data/test/cases/query_cache_test.rb +0 -129
- data/test/cases/readonly_test.rb +0 -107
- data/test/cases/reflection_test.rb +0 -234
- data/test/cases/reload_models_test.rb +0 -22
- data/test/cases/repair_helper.rb +0 -50
- data/test/cases/reserved_word_test_mysql.rb +0 -176
- data/test/cases/sanitize_test.rb +0 -25
- data/test/cases/schema_authorization_test_postgresql.rb +0 -75
- data/test/cases/schema_dumper_test.rb +0 -211
- data/test/cases/schema_test_postgresql.rb +0 -178
- data/test/cases/serialization_test.rb +0 -47
- data/test/cases/sp_test_mysql.rb +0 -16
- data/test/cases/synonym_test_oracle.rb +0 -17
- data/test/cases/timestamp_test.rb +0 -75
- data/test/cases/transactions_test.rb +0 -543
- data/test/cases/unconnected_test.rb +0 -32
- data/test/cases/validations_i18n_test.rb +0 -925
- data/test/cases/validations_test.rb +0 -1684
- data/test/cases/xml_serialization_test.rb +0 -240
- data/test/cases/yaml_serialization_test.rb +0 -11
- data/test/config.rb +0 -5
- data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
- data/test/connections/jdbc_jdbch2/connection.rb +0 -18
- data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
- data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
- data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
- data/test/connections/native_db2/connection.rb +0 -25
- data/test/connections/native_firebird/connection.rb +0 -26
- data/test/connections/native_frontbase/connection.rb +0 -27
- data/test/connections/native_mysql/connection.rb +0 -25
- data/test/connections/native_openbase/connection.rb +0 -21
- data/test/connections/native_oracle/connection.rb +0 -27
- data/test/connections/native_postgresql/connection.rb +0 -21
- data/test/connections/native_sqlite/connection.rb +0 -25
- data/test/connections/native_sqlite3/connection.rb +0 -25
- data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
- data/test/connections/native_sybase/connection.rb +0 -23
- data/test/fixtures/accounts.yml +0 -29
- data/test/fixtures/all/developers.yml +0 -0
- data/test/fixtures/all/people.csv +0 -0
- data/test/fixtures/all/tasks.yml +0 -0
- data/test/fixtures/author_addresses.yml +0 -5
- data/test/fixtures/author_favorites.yml +0 -4
- data/test/fixtures/authors.yml +0 -9
- data/test/fixtures/binaries.yml +0 -132
- data/test/fixtures/books.yml +0 -7
- data/test/fixtures/categories/special_categories.yml +0 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
- data/test/fixtures/categories.yml +0 -14
- data/test/fixtures/categories_ordered.yml +0 -7
- data/test/fixtures/categories_posts.yml +0 -23
- data/test/fixtures/categorizations.yml +0 -17
- data/test/fixtures/clubs.yml +0 -6
- data/test/fixtures/comments.yml +0 -59
- data/test/fixtures/companies.yml +0 -56
- data/test/fixtures/computers.yml +0 -4
- data/test/fixtures/courses.yml +0 -7
- data/test/fixtures/customers.yml +0 -26
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers_projects.yml +0 -17
- data/test/fixtures/edges.yml +0 -6
- data/test/fixtures/entrants.yml +0 -14
- data/test/fixtures/faces.yml +0 -11
- data/test/fixtures/fk_test_has_fk.yml +0 -3
- data/test/fixtures/fk_test_has_pk.yml +0 -2
- data/test/fixtures/funny_jokes.yml +0 -10
- data/test/fixtures/interests.yml +0 -33
- data/test/fixtures/items.yml +0 -4
- data/test/fixtures/jobs.yml +0 -7
- data/test/fixtures/legacy_things.yml +0 -3
- data/test/fixtures/mateys.yml +0 -4
- data/test/fixtures/member_types.yml +0 -6
- data/test/fixtures/members.yml +0 -6
- data/test/fixtures/memberships.yml +0 -20
- data/test/fixtures/men.yml +0 -5
- data/test/fixtures/minimalistics.yml +0 -2
- data/test/fixtures/mixed_case_monkeys.yml +0 -6
- data/test/fixtures/mixins.yml +0 -29
- data/test/fixtures/movies.yml +0 -7
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/fixtures/naked/yml/accounts.yml +0 -1
- data/test/fixtures/naked/yml/companies.yml +0 -1
- data/test/fixtures/naked/yml/courses.yml +0 -1
- data/test/fixtures/organizations.yml +0 -5
- data/test/fixtures/owners.yml +0 -7
- data/test/fixtures/parrots.yml +0 -27
- data/test/fixtures/parrots_pirates.yml +0 -7
- data/test/fixtures/people.yml +0 -15
- data/test/fixtures/pets.yml +0 -14
- data/test/fixtures/pirates.yml +0 -9
- data/test/fixtures/polymorphic_designs.yml +0 -19
- data/test/fixtures/polymorphic_prices.yml +0 -19
- data/test/fixtures/posts.yml +0 -52
- data/test/fixtures/price_estimates.yml +0 -7
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/readers.yml +0 -9
- data/test/fixtures/references.yml +0 -17
- data/test/fixtures/reserved_words/distinct.yml +0 -5
- data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
- data/test/fixtures/reserved_words/group.yml +0 -14
- data/test/fixtures/reserved_words/select.yml +0 -8
- data/test/fixtures/reserved_words/values.yml +0 -7
- data/test/fixtures/ships.yml +0 -5
- data/test/fixtures/sponsors.yml +0 -9
- data/test/fixtures/subscribers.yml +0 -7
- data/test/fixtures/subscriptions.yml +0 -12
- data/test/fixtures/taggings.yml +0 -28
- data/test/fixtures/tags.yml +0 -7
- data/test/fixtures/tasks.yml +0 -7
- data/test/fixtures/tees.yml +0 -4
- data/test/fixtures/ties.yml +0 -4
- data/test/fixtures/topics.yml +0 -42
- data/test/fixtures/toys.yml +0 -4
- data/test/fixtures/treasures.yml +0 -10
- data/test/fixtures/vertices.yml +0 -4
- data/test/fixtures/warehouse-things.yml +0 -3
- data/test/fixtures/zines.yml +0 -5
- data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
- data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
- data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
- data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
- data/test/migrations/duplicate/3_foo.rb +0 -7
- data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
- data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
- data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
- data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
- data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
- data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
- data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
- data/test/migrations/missing/1_people_have_last_names.rb +0 -9
- data/test/migrations/missing/3_we_need_reminders.rb +0 -12
- data/test/migrations/missing/4_innocent_jointable.rb +0 -12
- data/test/migrations/valid/1_people_have_last_names.rb +0 -9
- data/test/migrations/valid/2_we_need_reminders.rb +0 -12
- data/test/migrations/valid/3_innocent_jointable.rb +0 -12
- data/test/models/author.rb +0 -151
- data/test/models/auto_id.rb +0 -4
- data/test/models/binary.rb +0 -2
- data/test/models/bird.rb +0 -9
- data/test/models/book.rb +0 -4
- data/test/models/categorization.rb +0 -5
- data/test/models/category.rb +0 -34
- data/test/models/citation.rb +0 -6
- data/test/models/club.rb +0 -13
- data/test/models/column_name.rb +0 -3
- data/test/models/comment.rb +0 -29
- data/test/models/company.rb +0 -173
- data/test/models/company_in_module.rb +0 -78
- data/test/models/computer.rb +0 -3
- data/test/models/contact.rb +0 -16
- data/test/models/contract.rb +0 -5
- data/test/models/course.rb +0 -3
- data/test/models/customer.rb +0 -73
- data/test/models/default.rb +0 -2
- data/test/models/developer.rb +0 -101
- data/test/models/edge.rb +0 -5
- data/test/models/entrant.rb +0 -3
- data/test/models/essay.rb +0 -3
- data/test/models/event.rb +0 -3
- data/test/models/event_author.rb +0 -8
- data/test/models/face.rb +0 -7
- data/test/models/guid.rb +0 -2
- data/test/models/interest.rb +0 -5
- data/test/models/invoice.rb +0 -4
- data/test/models/item.rb +0 -7
- data/test/models/job.rb +0 -5
- data/test/models/joke.rb +0 -3
- data/test/models/keyboard.rb +0 -3
- data/test/models/legacy_thing.rb +0 -3
- data/test/models/line_item.rb +0 -3
- data/test/models/man.rb +0 -9
- data/test/models/matey.rb +0 -4
- data/test/models/member.rb +0 -12
- data/test/models/member_detail.rb +0 -5
- data/test/models/member_type.rb +0 -3
- data/test/models/membership.rb +0 -9
- data/test/models/minimalistic.rb +0 -2
- data/test/models/mixed_case_monkey.rb +0 -3
- data/test/models/movie.rb +0 -5
- data/test/models/order.rb +0 -4
- data/test/models/organization.rb +0 -6
- data/test/models/owner.rb +0 -5
- data/test/models/parrot.rb +0 -22
- data/test/models/person.rb +0 -16
- data/test/models/pet.rb +0 -5
- data/test/models/pirate.rb +0 -80
- data/test/models/polymorphic_design.rb +0 -3
- data/test/models/polymorphic_price.rb +0 -3
- data/test/models/post.rb +0 -102
- data/test/models/price_estimate.rb +0 -3
- data/test/models/project.rb +0 -30
- data/test/models/reader.rb +0 -4
- data/test/models/reference.rb +0 -4
- data/test/models/reply.rb +0 -46
- data/test/models/ship.rb +0 -19
- data/test/models/ship_part.rb +0 -7
- data/test/models/sponsor.rb +0 -4
- data/test/models/subject.rb +0 -4
- data/test/models/subscriber.rb +0 -8
- data/test/models/subscription.rb +0 -4
- data/test/models/tag.rb +0 -7
- data/test/models/tagging.rb +0 -10
- data/test/models/task.rb +0 -3
- data/test/models/tee.rb +0 -4
- data/test/models/tie.rb +0 -4
- data/test/models/topic.rb +0 -80
- data/test/models/toy.rb +0 -6
- data/test/models/treasure.rb +0 -8
- data/test/models/vertex.rb +0 -9
- data/test/models/warehouse_thing.rb +0 -5
- data/test/models/zine.rb +0 -3
- data/test/schema/mysql_specific_schema.rb +0 -31
- data/test/schema/postgresql_specific_schema.rb +0 -114
- data/test/schema/schema.rb +0 -550
- data/test/schema/schema2.rb +0 -6
- data/test/schema/sqlite_specific_schema.rb +0 -25
data/test/cases/helper.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
-
$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
|
3
|
-
|
4
|
-
require 'config'
|
5
|
-
|
6
|
-
require 'rubygems'
|
7
|
-
require 'test/unit'
|
8
|
-
require 'stringio'
|
9
|
-
|
10
|
-
require 'active_record'
|
11
|
-
require 'active_record/test_case'
|
12
|
-
require 'active_record/fixtures'
|
13
|
-
require 'connection'
|
14
|
-
|
15
|
-
require 'cases/repair_helper'
|
16
|
-
|
17
|
-
# Show backtraces for deprecated behavior for quicker cleanup.
|
18
|
-
ActiveSupport::Deprecation.debug = true
|
19
|
-
|
20
|
-
# Quote "type" if it's a reserved word for the current connection.
|
21
|
-
QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name('type')
|
22
|
-
|
23
|
-
def current_adapter?(*types)
|
24
|
-
types.any? do |type|
|
25
|
-
ActiveRecord::ConnectionAdapters.const_defined?(type) &&
|
26
|
-
ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
ActiveRecord::Base.connection.class.class_eval do
|
31
|
-
IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /SHOW FIELDS/]
|
32
|
-
|
33
|
-
def execute_with_query_record(sql, name = nil, &block)
|
34
|
-
$queries_executed ||= []
|
35
|
-
$queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
|
36
|
-
execute_without_query_record(sql, name, &block)
|
37
|
-
end
|
38
|
-
|
39
|
-
alias_method_chain :execute, :query_record
|
40
|
-
end
|
41
|
-
|
42
|
-
# Make with_scope public for tests
|
43
|
-
class << ActiveRecord::Base
|
44
|
-
public :with_scope, :with_exclusive_scope
|
45
|
-
end
|
46
|
-
|
47
|
-
unless ENV['FIXTURE_DEBUG']
|
48
|
-
module ActiveRecord::TestFixtures::ClassMethods
|
49
|
-
def try_to_load_dependency_with_silence(*args)
|
50
|
-
ActiveRecord::Base.logger.silence { try_to_load_dependency_without_silence(*args)}
|
51
|
-
end
|
52
|
-
|
53
|
-
alias_method_chain :try_to_load_dependency, :silence
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class ActiveSupport::TestCase
|
58
|
-
include ActiveRecord::TestFixtures
|
59
|
-
include ActiveRecord::Testing::RepairHelper
|
60
|
-
|
61
|
-
self.fixture_path = FIXTURES_ROOT
|
62
|
-
self.use_instantiated_fixtures = false
|
63
|
-
self.use_transactional_fixtures = true
|
64
|
-
|
65
|
-
def create_fixtures(*table_names, &block)
|
66
|
-
Fixtures.create_fixtures(ActiveSupport::TestCase.fixture_path, table_names, {}, &block)
|
67
|
-
end
|
68
|
-
end
|
data/test/cases/i18n_test.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/topic'
|
3
|
-
require 'models/reply'
|
4
|
-
|
5
|
-
class ActiveRecordI18nTests < Test::Unit::TestCase
|
6
|
-
|
7
|
-
def setup
|
8
|
-
I18n.backend = I18n::Backend::Simple.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_translated_model_attributes
|
12
|
-
I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
|
13
|
-
assert_equal 'topic title attribute', Topic.human_attribute_name('title')
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_translated_model_attributes_with_symbols
|
17
|
-
I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
|
18
|
-
assert_equal 'topic title attribute', Topic.human_attribute_name(:title)
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_translated_model_attributes_with_sti
|
22
|
-
I18n.backend.store_translations 'en', :activerecord => {:attributes => {:reply => {:title => 'reply title attribute'} } }
|
23
|
-
assert_equal 'reply title attribute', Reply.human_attribute_name('title')
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_translated_model_attributes_with_sti_fallback
|
27
|
-
I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
|
28
|
-
assert_equal 'topic title attribute', Reply.human_attribute_name('title')
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_translated_model_names
|
32
|
-
I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
|
33
|
-
assert_equal 'topic model', Topic.human_name
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_translated_model_names_with_sti
|
37
|
-
I18n.backend.store_translations 'en', :activerecord => {:models => {:reply => 'reply model'} }
|
38
|
-
assert_equal 'reply model', Reply.human_name
|
39
|
-
end
|
40
|
-
|
41
|
-
def test_translated_model_names_with_sti_fallback
|
42
|
-
I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
|
43
|
-
assert_equal 'topic model', Reply.human_name
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
@@ -1,262 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/company'
|
3
|
-
require 'models/project'
|
4
|
-
require 'models/subscriber'
|
5
|
-
|
6
|
-
class InheritanceTest < ActiveRecord::TestCase
|
7
|
-
fixtures :companies, :projects, :subscribers, :accounts
|
8
|
-
|
9
|
-
def test_class_with_store_full_sti_class_returns_full_name
|
10
|
-
old = ActiveRecord::Base.store_full_sti_class
|
11
|
-
ActiveRecord::Base.store_full_sti_class = true
|
12
|
-
assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
|
13
|
-
ensure
|
14
|
-
ActiveRecord::Base.store_full_sti_class = old
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_class_without_store_full_sti_class_returns_demodulized_name
|
18
|
-
old = ActiveRecord::Base.store_full_sti_class
|
19
|
-
ActiveRecord::Base.store_full_sti_class = false
|
20
|
-
assert_equal 'Company', Namespaced::Company.sti_name
|
21
|
-
ensure
|
22
|
-
ActiveRecord::Base.store_full_sti_class = old
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
|
26
|
-
old = ActiveRecord::Base.store_full_sti_class
|
27
|
-
ActiveRecord::Base.store_full_sti_class = false
|
28
|
-
item = Namespaced::Company.new
|
29
|
-
assert_equal 'Company', item[:type]
|
30
|
-
ensure
|
31
|
-
ActiveRecord::Base.store_full_sti_class = old
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
|
35
|
-
old = ActiveRecord::Base.store_full_sti_class
|
36
|
-
ActiveRecord::Base.store_full_sti_class = true
|
37
|
-
item = Namespaced::Company.new
|
38
|
-
assert_equal 'Namespaced::Company', item[:type]
|
39
|
-
ensure
|
40
|
-
ActiveRecord::Base.store_full_sti_class = old
|
41
|
-
end
|
42
|
-
|
43
|
-
def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
|
44
|
-
old = ActiveRecord::Base.store_full_sti_class
|
45
|
-
ActiveRecord::Base.store_full_sti_class = true
|
46
|
-
item = Namespaced::Company.create :name => "Wolverine 2"
|
47
|
-
assert_not_nil Company.find(item.id)
|
48
|
-
assert_not_nil Namespaced::Company.find(item.id)
|
49
|
-
ensure
|
50
|
-
ActiveRecord::Base.store_full_sti_class = old
|
51
|
-
end
|
52
|
-
|
53
|
-
def test_company_descends_from_active_record
|
54
|
-
assert_raise(NoMethodError) { ActiveRecord::Base.descends_from_active_record? }
|
55
|
-
assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
|
56
|
-
assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
|
57
|
-
assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_a_bad_type_column
|
61
|
-
#SQLServer need to turn Identity Insert On before manually inserting into the Identity column
|
62
|
-
if current_adapter?(:SybaseAdapter)
|
63
|
-
Company.connection.execute "SET IDENTITY_INSERT companies ON"
|
64
|
-
end
|
65
|
-
Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
|
66
|
-
|
67
|
-
#We then need to turn it back Off before continuing.
|
68
|
-
if current_adapter?(:SybaseAdapter)
|
69
|
-
Company.connection.execute "SET IDENTITY_INSERT companies OFF"
|
70
|
-
end
|
71
|
-
assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_inheritance_find
|
75
|
-
assert Company.find(1).kind_of?(Firm), "37signals should be a firm"
|
76
|
-
assert Firm.find(1).kind_of?(Firm), "37signals should be a firm"
|
77
|
-
assert Company.find(2).kind_of?(Client), "Summit should be a client"
|
78
|
-
assert Client.find(2).kind_of?(Client), "Summit should be a client"
|
79
|
-
end
|
80
|
-
|
81
|
-
def test_alt_inheritance_find
|
82
|
-
switch_to_alt_inheritance_column
|
83
|
-
test_inheritance_find
|
84
|
-
switch_to_default_inheritance_column
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_inheritance_find_all
|
88
|
-
companies = Company.find(:all, :order => 'id')
|
89
|
-
assert companies[0].kind_of?(Firm), "37signals should be a firm"
|
90
|
-
assert companies[1].kind_of?(Client), "Summit should be a client"
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_alt_inheritance_find_all
|
94
|
-
switch_to_alt_inheritance_column
|
95
|
-
test_inheritance_find_all
|
96
|
-
switch_to_default_inheritance_column
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_inheritance_save
|
100
|
-
firm = Firm.new
|
101
|
-
firm.name = "Next Angle"
|
102
|
-
firm.save
|
103
|
-
|
104
|
-
next_angle = Company.find(firm.id)
|
105
|
-
assert next_angle.kind_of?(Firm), "Next Angle should be a firm"
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_alt_inheritance_save
|
109
|
-
switch_to_alt_inheritance_column
|
110
|
-
test_inheritance_save
|
111
|
-
switch_to_default_inheritance_column
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_inheritance_condition
|
115
|
-
assert_equal 9, Company.count
|
116
|
-
assert_equal 2, Firm.count
|
117
|
-
assert_equal 3, Client.count
|
118
|
-
end
|
119
|
-
|
120
|
-
def test_alt_inheritance_condition
|
121
|
-
switch_to_alt_inheritance_column
|
122
|
-
test_inheritance_condition
|
123
|
-
switch_to_default_inheritance_column
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_finding_incorrect_type_data
|
127
|
-
assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
|
128
|
-
assert_nothing_raised { Firm.find(1) }
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_alt_finding_incorrect_type_data
|
132
|
-
switch_to_alt_inheritance_column
|
133
|
-
test_finding_incorrect_type_data
|
134
|
-
switch_to_default_inheritance_column
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_update_all_within_inheritance
|
138
|
-
Client.update_all "name = 'I am a client'"
|
139
|
-
assert_equal "I am a client", Client.find(:all).first.name
|
140
|
-
assert_equal "37signals", Firm.find(:all).first.name
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_alt_update_all_within_inheritance
|
144
|
-
switch_to_alt_inheritance_column
|
145
|
-
test_update_all_within_inheritance
|
146
|
-
switch_to_default_inheritance_column
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_destroy_all_within_inheritance
|
150
|
-
Client.destroy_all
|
151
|
-
assert_equal 0, Client.count
|
152
|
-
assert_equal 2, Firm.count
|
153
|
-
end
|
154
|
-
|
155
|
-
def test_alt_destroy_all_within_inheritance
|
156
|
-
switch_to_alt_inheritance_column
|
157
|
-
test_destroy_all_within_inheritance
|
158
|
-
switch_to_default_inheritance_column
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_find_first_within_inheritance
|
162
|
-
assert_kind_of Firm, Company.find(:first, :conditions => "name = '37signals'")
|
163
|
-
assert_kind_of Firm, Firm.find(:first, :conditions => "name = '37signals'")
|
164
|
-
assert_nil Client.find(:first, :conditions => "name = '37signals'")
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_alt_find_first_within_inheritance
|
168
|
-
switch_to_alt_inheritance_column
|
169
|
-
test_find_first_within_inheritance
|
170
|
-
switch_to_default_inheritance_column
|
171
|
-
end
|
172
|
-
|
173
|
-
def test_complex_inheritance
|
174
|
-
very_special_client = VerySpecialClient.create("name" => "veryspecial")
|
175
|
-
assert_equal very_special_client, VerySpecialClient.find(:first, :conditions => "name = 'veryspecial'")
|
176
|
-
assert_equal very_special_client, SpecialClient.find(:first, :conditions => "name = 'veryspecial'")
|
177
|
-
assert_equal very_special_client, Company.find(:first, :conditions => "name = 'veryspecial'")
|
178
|
-
assert_equal very_special_client, Client.find(:first, :conditions => "name = 'veryspecial'")
|
179
|
-
assert_equal 1, Client.find(:all, :conditions => "name = 'Summit'").size
|
180
|
-
assert_equal very_special_client, Client.find(very_special_client.id)
|
181
|
-
end
|
182
|
-
|
183
|
-
def test_alt_complex_inheritance
|
184
|
-
switch_to_alt_inheritance_column
|
185
|
-
test_complex_inheritance
|
186
|
-
switch_to_default_inheritance_column
|
187
|
-
end
|
188
|
-
|
189
|
-
def test_eager_load_belongs_to_something_inherited
|
190
|
-
account = Account.find(1, :include => :firm)
|
191
|
-
assert_not_nil account.instance_variable_get("@firm"), "nil proves eager load failed"
|
192
|
-
end
|
193
|
-
|
194
|
-
def test_eager_load_belongs_to_primary_key_quoting
|
195
|
-
con = Account.connection
|
196
|
-
assert_sql(/\(#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} = 1\)/) do
|
197
|
-
Account.find(1, :include => :firm)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_alt_eager_loading
|
202
|
-
switch_to_alt_inheritance_column
|
203
|
-
test_eager_load_belongs_to_something_inherited
|
204
|
-
switch_to_default_inheritance_column
|
205
|
-
end
|
206
|
-
|
207
|
-
def test_inheritance_without_mapping
|
208
|
-
assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
|
209
|
-
assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
|
210
|
-
end
|
211
|
-
|
212
|
-
private
|
213
|
-
def switch_to_alt_inheritance_column
|
214
|
-
# we don't want misleading test results, so get rid of the values in the type column
|
215
|
-
Company.find(:all, :order => 'id').each do |c|
|
216
|
-
c['type'] = nil
|
217
|
-
c.save
|
218
|
-
end
|
219
|
-
[ Company, Firm, Client].each { |klass| klass.reset_column_information }
|
220
|
-
Company.set_inheritance_column('ruby_type')
|
221
|
-
end
|
222
|
-
def switch_to_default_inheritance_column
|
223
|
-
[ Company, Firm, Client].each { |klass| klass.reset_column_information }
|
224
|
-
Company.set_inheritance_column('type')
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
|
229
|
-
class InheritanceComputeTypeTest < ActiveRecord::TestCase
|
230
|
-
fixtures :companies
|
231
|
-
|
232
|
-
def setup
|
233
|
-
ActiveSupport::Dependencies.log_activity = true
|
234
|
-
end
|
235
|
-
|
236
|
-
def teardown
|
237
|
-
ActiveSupport::Dependencies.log_activity = false
|
238
|
-
self.class.const_remove :FirmOnTheFly rescue nil
|
239
|
-
Firm.const_remove :FirmOnTheFly rescue nil
|
240
|
-
end
|
241
|
-
|
242
|
-
def test_instantiation_doesnt_try_to_require_corresponding_file
|
243
|
-
foo = Firm.find(:first).clone
|
244
|
-
foo.ruby_type = foo.type = 'FirmOnTheFly'
|
245
|
-
foo.save!
|
246
|
-
|
247
|
-
# Should fail without FirmOnTheFly in the type condition.
|
248
|
-
assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
|
249
|
-
|
250
|
-
# Nest FirmOnTheFly in the test case where Dependencies won't see it.
|
251
|
-
self.class.const_set :FirmOnTheFly, Class.new(Firm)
|
252
|
-
assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
|
253
|
-
|
254
|
-
# Nest FirmOnTheFly in Firm where Dependencies will see it.
|
255
|
-
# This is analogous to nesting models in a migration.
|
256
|
-
Firm.const_set :FirmOnTheFly, Class.new(Firm)
|
257
|
-
|
258
|
-
# And instantiate will find the existing constant rather than trying
|
259
|
-
# to require firm_on_the_fly.
|
260
|
-
assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
|
261
|
-
end
|
262
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'cases/helper'
|
2
|
-
require 'models/topic'
|
3
|
-
|
4
|
-
class InvalidDateTest < Test::Unit::TestCase
|
5
|
-
def test_assign_valid_dates
|
6
|
-
valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
|
7
|
-
|
8
|
-
invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
|
9
|
-
|
10
|
-
topic = Topic.new
|
11
|
-
|
12
|
-
valid_dates.each do |date_src|
|
13
|
-
topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
|
14
|
-
assert_equal(topic.last_read, Date.new(*date_src))
|
15
|
-
end
|
16
|
-
|
17
|
-
invalid_dates.each do |date_src|
|
18
|
-
assert_nothing_raised do
|
19
|
-
topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
|
20
|
-
assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behaviour of the Time object")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,219 +0,0 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/contact'
|
3
|
-
require 'models/post'
|
4
|
-
require 'models/author'
|
5
|
-
require 'models/tagging'
|
6
|
-
require 'models/tag'
|
7
|
-
require 'models/comment'
|
8
|
-
|
9
|
-
class JsonSerializationTest < ActiveRecord::TestCase
|
10
|
-
class NamespacedContact < Contact
|
11
|
-
column :name, :string
|
12
|
-
end
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@contact = Contact.new(
|
16
|
-
:name => 'Konata Izumi',
|
17
|
-
:age => 16,
|
18
|
-
:avatar => 'binarydata',
|
19
|
-
:created_at => Time.utc(2006, 8, 1),
|
20
|
-
:awesome => true,
|
21
|
-
:preferences => { :shows => 'anime' }
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_should_demodulize_root_in_json
|
26
|
-
NamespacedContact.include_root_in_json = true
|
27
|
-
@contact = NamespacedContact.new :name => 'whatever'
|
28
|
-
json = @contact.to_json
|
29
|
-
assert_match %r{^\{"namespaced_contact":\{}, json
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_should_include_root_in_json
|
33
|
-
Contact.include_root_in_json = true
|
34
|
-
json = @contact.to_json
|
35
|
-
|
36
|
-
assert_match %r{^\{"contact":\{}, json
|
37
|
-
assert_match %r{"name":"Konata Izumi"}, json
|
38
|
-
assert_match %r{"age":16}, json
|
39
|
-
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
40
|
-
assert_match %r{"awesome":true}, json
|
41
|
-
assert_match %r{"preferences":\{"shows":"anime"\}}, json
|
42
|
-
ensure
|
43
|
-
Contact.include_root_in_json = false
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_should_include_root_in_json
|
47
|
-
Contact.include_root_in_json = true
|
48
|
-
json = @contact.to_json(:root => 'json_contact')
|
49
|
-
|
50
|
-
assert_match %r{^\{"json_contact":\{}, json
|
51
|
-
assert_match %r{"name":"Konata Izumi"}, json
|
52
|
-
assert_match %r{"age":16}, json
|
53
|
-
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
54
|
-
assert_match %r{"awesome":true}, json
|
55
|
-
assert_match %r{"preferences":\{"shows":"anime"\}}, json
|
56
|
-
ensure
|
57
|
-
Contact.include_root_in_json = false
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_should_encode_all_encodable_attributes
|
61
|
-
json = @contact.to_json
|
62
|
-
|
63
|
-
assert_match %r{"name":"Konata Izumi"}, json
|
64
|
-
assert_match %r{"age":16}, json
|
65
|
-
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
66
|
-
assert_match %r{"awesome":true}, json
|
67
|
-
assert_match %r{"preferences":\{"shows":"anime"\}}, json
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_should_allow_attribute_filtering_with_only
|
71
|
-
json = @contact.to_json(:only => [:name, :age])
|
72
|
-
|
73
|
-
assert_match %r{"name":"Konata Izumi"}, json
|
74
|
-
assert_match %r{"age":16}, json
|
75
|
-
assert_no_match %r{"awesome":true}, json
|
76
|
-
assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
77
|
-
assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
|
78
|
-
end
|
79
|
-
|
80
|
-
def test_should_allow_attribute_filtering_with_except
|
81
|
-
json = @contact.to_json(:except => [:name, :age])
|
82
|
-
|
83
|
-
assert_no_match %r{"name":"Konata Izumi"}, json
|
84
|
-
assert_no_match %r{"age":16}, json
|
85
|
-
assert_match %r{"awesome":true}, json
|
86
|
-
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
87
|
-
assert_match %r{"preferences":\{"shows":"anime"\}}, json
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_methods_are_called_on_object
|
91
|
-
# Define methods on fixture.
|
92
|
-
def @contact.label; "Has cheezburger"; end
|
93
|
-
def @contact.favorite_quote; "Constraints are liberating"; end
|
94
|
-
|
95
|
-
# Single method.
|
96
|
-
assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
|
97
|
-
|
98
|
-
# Both methods.
|
99
|
-
methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
|
100
|
-
assert_match %r{"label":"Has cheezburger"}, methods_json
|
101
|
-
assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
|
106
|
-
fixtures :authors, :posts, :comments, :tags, :taggings
|
107
|
-
|
108
|
-
def setup
|
109
|
-
@david = authors(:david)
|
110
|
-
@mary = authors(:mary)
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_includes_uses_association_name
|
114
|
-
json = @david.to_json(:include => :posts)
|
115
|
-
|
116
|
-
assert_match %r{"posts":\[}, json
|
117
|
-
|
118
|
-
assert_match %r{"id":1}, json
|
119
|
-
assert_match %r{"name":"David"}, json
|
120
|
-
|
121
|
-
assert_match %r{"author_id":1}, json
|
122
|
-
assert_match %r{"title":"Welcome to the weblog"}, json
|
123
|
-
assert_match %r{"body":"Such a lovely day"}, json
|
124
|
-
|
125
|
-
assert_match %r{"title":"So I was thinking"}, json
|
126
|
-
assert_match %r{"body":"Like I hopefully always am"}, json
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_includes_uses_association_name_and_applies_attribute_filters
|
130
|
-
json = @david.to_json(:include => { :posts => { :only => :title } })
|
131
|
-
|
132
|
-
assert_match %r{"name":"David"}, json
|
133
|
-
assert_match %r{"posts":\[}, json
|
134
|
-
|
135
|
-
assert_match %r{"title":"Welcome to the weblog"}, json
|
136
|
-
assert_no_match %r{"body":"Such a lovely day"}, json
|
137
|
-
|
138
|
-
assert_match %r{"title":"So I was thinking"}, json
|
139
|
-
assert_no_match %r{"body":"Like I hopefully always am"}, json
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_includes_fetches_second_level_associations
|
143
|
-
json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
|
144
|
-
|
145
|
-
assert_match %r{"name":"David"}, json
|
146
|
-
assert_match %r{"posts":\[}, json
|
147
|
-
|
148
|
-
assert_match %r{"comments":\[}, json
|
149
|
-
assert_match %r{\{"body":"Thank you again for the welcome"\}}, json
|
150
|
-
assert_match %r{\{"body":"Don't think too hard"\}}, json
|
151
|
-
assert_no_match %r{"post_id":}, json
|
152
|
-
end
|
153
|
-
|
154
|
-
def test_includes_fetches_nth_level_associations
|
155
|
-
json = @david.to_json(
|
156
|
-
:include => {
|
157
|
-
:posts => {
|
158
|
-
:include => {
|
159
|
-
:taggings => {
|
160
|
-
:include => {
|
161
|
-
:tag => { :only => :name }
|
162
|
-
}
|
163
|
-
}
|
164
|
-
}
|
165
|
-
}
|
166
|
-
})
|
167
|
-
|
168
|
-
assert_match %r{"name":"David"}, json
|
169
|
-
assert_match %r{"posts":\[}, json
|
170
|
-
|
171
|
-
assert_match %r{"taggings":\[}, json
|
172
|
-
assert_match %r{"tag":\{"name":"General"\}}, json
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_should_not_call_methods_on_associations_that_dont_respond
|
176
|
-
def @david.favorite_quote; "Constraints are liberating"; end
|
177
|
-
json = @david.to_json(:include => :posts, :methods => :favorite_quote)
|
178
|
-
|
179
|
-
assert !@david.posts.first.respond_to?(:favorite_quote)
|
180
|
-
assert_match %r{"favorite_quote":"Constraints are liberating"}, json
|
181
|
-
assert_equal %r{"favorite_quote":}.match(json).size, 1
|
182
|
-
end
|
183
|
-
|
184
|
-
def test_should_allow_only_option_for_list_of_authors
|
185
|
-
authors = [@david, @mary]
|
186
|
-
|
187
|
-
assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, :only => :name)
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_should_allow_except_option_for_list_of_authors
|
191
|
-
authors = [@david, @mary]
|
192
|
-
|
193
|
-
assert_equal %([{"id":1},{"id":2}]), ActiveSupport::JSON.encode(authors, :except => [:name, :author_address_id, :author_address_extra_id])
|
194
|
-
end
|
195
|
-
|
196
|
-
def test_should_allow_includes_for_list_of_authors
|
197
|
-
authors = [@david, @mary]
|
198
|
-
json = ActiveSupport::JSON.encode(authors,
|
199
|
-
:only => :name,
|
200
|
-
:include => {
|
201
|
-
:posts => { :only => :id }
|
202
|
-
}
|
203
|
-
)
|
204
|
-
|
205
|
-
['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
|
206
|
-
'{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[{"id":7}]'].each do |fragment|
|
207
|
-
assert json.include?(fragment), json
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
def test_should_allow_options_for_hash_of_authors
|
212
|
-
authors_hash = {
|
213
|
-
1 => @david,
|
214
|
-
2 => @mary
|
215
|
-
}
|
216
|
-
|
217
|
-
assert_equal %({"1":{"name":"David"}}), ActiveSupport::JSON.encode(authors_hash, :only => [1, :name])
|
218
|
-
end
|
219
|
-
end
|