ibm_db 3.0.5-x86-mingw32 → 4.0.0-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +4 -0
- data/LICENSE +1 -1
- data/MANIFEST +14 -14
- data/ParameterizedQueries README +6 -6
- data/README +208 -225
- data/ext/Makefile.nt32 +181 -181
- data/ext/Makefile.nt32.191 +212 -212
- data/ext/extconf.rb +291 -291
- data/ext/ibm_db.c +11887 -11887
- data/ext/ruby_ibm_db.h +241 -241
- data/ext/ruby_ibm_db_cli.c +866 -866
- data/ext/ruby_ibm_db_cli.h +500 -500
- data/init.rb +41 -41
- data/lib/IBM_DB.rb +27 -27
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
- data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
- data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
- data/lib/mswin32/ibm_db.rb +91 -123
- data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
- data/test/assets/example.log +1 -1
- data/test/assets/test.txt +1 -1
- data/test/cases/adapter_test.rb +351 -276
- data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
- data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
- data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
- data/test/cases/adapters/mysql2/connection_test.rb +210 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
- data/test/cases/adapters/mysql2/enum_test.rb +26 -0
- data/test/cases/adapters/mysql2/explain_test.rb +21 -0
- data/test/cases/adapters/mysql2/json_test.rb +195 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
- data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
- data/test/cases/adapters/mysql2/schema_test.rb +126 -0
- data/test/cases/adapters/mysql2/sp_test.rb +36 -0
- data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
- data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
- data/test/cases/adapters/postgresql/array_test.rb +339 -0
- data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
- data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
- data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
- data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
- data/test/cases/adapters/postgresql/citext_test.rb +78 -0
- data/test/cases/adapters/postgresql/collation_test.rb +53 -0
- data/test/cases/adapters/postgresql/composite_test.rb +132 -0
- data/test/cases/adapters/postgresql/connection_test.rb +257 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
- data/test/cases/adapters/postgresql/domain_test.rb +47 -0
- data/test/cases/adapters/postgresql/enum_test.rb +91 -0
- data/test/cases/adapters/postgresql/explain_test.rb +20 -0
- data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
- data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
- data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
- data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
- data/test/cases/adapters/postgresql/integer_test.rb +25 -0
- data/test/cases/adapters/postgresql/json_test.rb +237 -0
- data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
- data/test/cases/adapters/postgresql/money_test.rb +96 -0
- data/test/cases/adapters/postgresql/network_test.rb +94 -0
- data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
- data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
- data/test/cases/adapters/postgresql/range_test.rb +343 -0
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
- data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
- data/test/cases/adapters/postgresql/schema_test.rb +597 -0
- data/test/cases/adapters/postgresql/serial_test.rb +154 -0
- data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
- data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
- data/test/cases/adapters/postgresql/utils_test.rb +62 -0
- data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
- data/test/cases/adapters/postgresql/xml_test.rb +54 -0
- data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
- data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
- data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
- data/test/cases/aggregations_test.rb +168 -158
- data/test/cases/ar_schema_test.rb +146 -161
- data/test/cases/associations/association_scope_test.rb +16 -21
- data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
- data/test/cases/associations/callbacks_test.rb +190 -192
- data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
- data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
- data/test/cases/associations/eager_singularization_test.rb +148 -148
- data/test/cases/associations/eager_test.rb +1514 -1429
- data/test/cases/associations/extension_test.rb +87 -82
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
- data/test/cases/associations/has_many_associations_test.rb +2501 -2182
- data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
- data/test/cases/associations/has_one_associations_test.rb +707 -610
- data/test/cases/associations/has_one_through_associations_test.rb +383 -380
- data/test/cases/associations/inner_join_association_test.rb +139 -139
- data/test/cases/associations/inverse_associations_test.rb +733 -706
- data/test/cases/associations/join_model_test.rb +777 -754
- data/test/cases/associations/left_outer_join_association_test.rb +88 -0
- data/test/cases/associations/nested_through_associations_test.rb +579 -579
- data/test/cases/associations/required_test.rb +102 -82
- data/test/cases/associations_test.rb +385 -380
- data/test/cases/attribute_decorators_test.rb +125 -125
- data/test/cases/attribute_methods/read_test.rb +60 -60
- data/test/cases/attribute_methods_test.rb +1009 -952
- data/test/cases/attribute_set_test.rb +270 -210
- data/test/cases/attribute_test.rb +246 -180
- data/test/cases/attributes_test.rb +253 -136
- data/test/cases/autosave_association_test.rb +1708 -1595
- data/test/cases/base_test.rb +1713 -1664
- data/test/cases/batches_test.rb +489 -212
- data/test/cases/binary_test.rb +44 -52
- data/test/cases/bind_parameter_test.rb +110 -100
- data/test/cases/cache_key_test.rb +25 -0
- data/test/cases/calculations_test.rb +798 -646
- data/test/cases/callbacks_test.rb +636 -543
- data/test/cases/clone_test.rb +40 -40
- data/test/cases/coders/json_test.rb +15 -0
- data/test/cases/coders/yaml_column_test.rb +63 -63
- data/test/cases/collection_cache_key_test.rb +115 -0
- data/test/cases/column_alias_test.rb +17 -17
- data/test/cases/column_definition_test.rb +92 -123
- data/test/cases/comment_test.rb +143 -0
- data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
- data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
- data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
- data/test/cases/connection_adapters/quoting_test.rb +13 -13
- data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
- data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
- data/test/cases/connection_management_test.rb +112 -122
- data/test/cases/connection_pool_test.rb +521 -346
- data/test/cases/connection_specification/resolver_test.rb +131 -116
- data/test/cases/core_test.rb +112 -112
- data/test/cases/counter_cache_test.rb +214 -209
- data/test/cases/custom_locking_test.rb +17 -17
- data/test/cases/database_statements_test.rb +34 -19
- data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
- data/test/cases/date_time_precision_test.rb +106 -0
- data/test/cases/date_time_test.rb +61 -61
- data/test/cases/defaults_test.rb +218 -223
- data/test/cases/dirty_test.rb +763 -785
- data/test/cases/disconnected_test.rb +30 -28
- data/test/cases/dup_test.rb +157 -157
- data/test/cases/enum_test.rb +444 -290
- data/test/cases/errors_test.rb +16 -0
- data/test/cases/explain_subscriber_test.rb +64 -64
- data/test/cases/explain_test.rb +87 -76
- data/test/cases/finder_respond_to_test.rb +60 -60
- data/test/cases/finder_test.rb +1294 -1169
- data/test/cases/fixture_set/file_test.rb +156 -138
- data/test/cases/fixtures_test.rb +988 -908
- data/test/cases/forbidden_attributes_protection_test.rb +165 -99
- data/test/cases/habtm_destroy_order_test.rb +61 -61
- data/test/cases/helper.rb +204 -210
- data/test/cases/hot_compatibility_test.rb +142 -54
- data/test/cases/i18n_test.rb +45 -45
- data/test/cases/inheritance_test.rb +606 -375
- data/test/cases/integration_test.rb +155 -139
- data/test/cases/invalid_connection_test.rb +24 -22
- data/test/cases/invertible_migration_test.rb +387 -295
- data/test/cases/json_serialization_test.rb +311 -302
- data/test/cases/locking_test.rb +493 -477
- data/test/cases/log_subscriber_test.rb +225 -136
- data/test/cases/migration/change_schema_test.rb +458 -512
- data/test/cases/migration/change_table_test.rb +256 -224
- data/test/cases/migration/column_attributes_test.rb +176 -192
- data/test/cases/migration/column_positioning_test.rb +56 -56
- data/test/cases/migration/columns_test.rb +310 -304
- data/test/cases/migration/command_recorder_test.rb +350 -305
- data/test/cases/migration/compatibility_test.rb +118 -0
- data/test/cases/migration/create_join_table_test.rb +157 -148
- data/test/cases/migration/foreign_key_test.rb +360 -328
- data/test/cases/migration/helper.rb +39 -39
- data/test/cases/migration/index_test.rb +218 -216
- data/test/cases/migration/logger_test.rb +36 -36
- data/test/cases/migration/pending_migrations_test.rb +52 -53
- data/test/cases/migration/references_foreign_key_test.rb +216 -169
- data/test/cases/migration/references_index_test.rb +101 -101
- data/test/cases/migration/references_statements_test.rb +136 -116
- data/test/cases/migration/rename_table_test.rb +93 -93
- data/test/cases/migration_test.rb +1157 -959
- data/test/cases/migrator_test.rb +470 -388
- data/test/cases/mixin_test.rb +68 -70
- data/test/cases/modules_test.rb +172 -173
- data/test/cases/multiparameter_attributes_test.rb +372 -350
- data/test/cases/multiple_db_test.rb +122 -115
- data/test/cases/nested_attributes_test.rb +1098 -1070
- data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
- data/test/cases/persistence_test.rb +1001 -909
- data/test/cases/pooled_connections_test.rb +81 -81
- data/test/cases/primary_keys_test.rb +376 -237
- data/test/cases/query_cache_test.rb +446 -326
- data/test/cases/quoting_test.rb +202 -156
- data/test/cases/readonly_test.rb +119 -118
- data/test/cases/reaper_test.rb +85 -85
- data/test/cases/reflection_test.rb +509 -463
- data/test/cases/relation/delegation_test.rb +63 -68
- data/test/cases/relation/merging_test.rb +157 -161
- data/test/cases/relation/mutation_test.rb +183 -165
- data/test/cases/relation/or_test.rb +92 -0
- data/test/cases/relation/predicate_builder_test.rb +16 -14
- data/test/cases/relation/record_fetch_warning_test.rb +40 -0
- data/test/cases/relation/where_chain_test.rb +105 -181
- data/test/cases/relation/where_clause_test.rb +182 -0
- data/test/cases/relation/where_test.rb +322 -300
- data/test/cases/relation_test.rb +328 -319
- data/test/cases/relations_test.rb +2026 -1815
- data/test/cases/reload_models_test.rb +22 -22
- data/test/cases/result_test.rb +90 -80
- data/test/cases/sanitize_test.rb +176 -83
- data/test/cases/schema_dumper_test.rb +457 -463
- data/test/cases/schema_loading_test.rb +52 -0
- data/test/cases/scoping/default_scoping_test.rb +528 -454
- data/test/cases/scoping/named_scoping_test.rb +561 -524
- data/test/cases/scoping/relation_scoping_test.rb +400 -357
- data/test/cases/secure_token_test.rb +32 -0
- data/test/cases/serialization_test.rb +104 -104
- data/test/cases/serialized_attribute_test.rb +364 -277
- data/test/cases/statement_cache_test.rb +136 -98
- data/test/cases/store_test.rb +195 -194
- data/test/cases/suppressor_test.rb +63 -0
- data/test/cases/tasks/database_tasks_test.rb +462 -398
- data/test/cases/tasks/mysql_rake_test.rb +345 -324
- data/test/cases/tasks/postgresql_rake_test.rb +304 -250
- data/test/cases/tasks/sqlite_rake_test.rb +220 -193
- data/test/cases/test_case.rb +131 -123
- data/test/cases/test_fixtures_test.rb +36 -0
- data/test/cases/time_precision_test.rb +102 -0
- data/test/cases/timestamp_test.rb +501 -467
- data/test/cases/touch_later_test.rb +121 -0
- data/test/cases/transaction_callbacks_test.rb +518 -452
- data/test/cases/transaction_isolation_test.rb +106 -106
- data/test/cases/transactions_test.rb +834 -817
- data/test/cases/type/adapter_specific_registry_test.rb +133 -0
- data/test/cases/type/date_time_test.rb +14 -0
- data/test/cases/type/integer_test.rb +27 -121
- data/test/cases/type/string_test.rb +22 -36
- data/test/cases/type/type_map_test.rb +177 -177
- data/test/cases/type_test.rb +39 -0
- data/test/cases/types_test.rb +24 -141
- data/test/cases/unconnected_test.rb +33 -33
- data/test/cases/validations/absence_validation_test.rb +73 -0
- data/test/cases/validations/association_validation_test.rb +97 -86
- data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
- data/test/cases/validations/i18n_validation_test.rb +86 -90
- data/test/cases/validations/length_validation_test.rb +79 -47
- data/test/cases/validations/presence_validation_test.rb +103 -68
- data/test/cases/validations/uniqueness_validation_test.rb +548 -457
- data/test/cases/validations_repair_helper.rb +19 -23
- data/test/cases/validations_test.rb +194 -165
- data/test/cases/view_test.rb +216 -119
- data/test/cases/yaml_serialization_test.rb +121 -126
- data/test/config.example.yml +97 -0
- data/test/config.rb +5 -5
- data/test/fixtures/accounts.yml +29 -29
- data/test/fixtures/admin/accounts.yml +2 -2
- data/test/fixtures/admin/users.yml +10 -10
- data/test/fixtures/author_addresses.original +11 -0
- data/test/fixtures/author_addresses.yml +17 -17
- data/test/fixtures/author_favorites.yml +3 -3
- data/test/fixtures/authors.original +17 -0
- data/test/fixtures/authors.yml +23 -23
- data/test/fixtures/bad_posts.yml +9 -0
- data/test/fixtures/binaries.yml +133 -133
- data/test/fixtures/books.yml +31 -11
- data/test/fixtures/bulbs.yml +5 -5
- data/test/fixtures/cars.yml +9 -9
- data/test/fixtures/categories.yml +19 -19
- data/test/fixtures/categories/special_categories.yml +9 -9
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
- data/test/fixtures/categories_ordered.yml +7 -7
- data/test/fixtures/categories_posts.yml +31 -31
- data/test/fixtures/categorizations.yml +23 -23
- data/test/fixtures/clubs.yml +8 -8
- data/test/fixtures/collections.yml +3 -3
- data/test/fixtures/colleges.yml +3 -3
- data/test/fixtures/comments.yml +65 -65
- data/test/fixtures/companies.yml +67 -67
- data/test/fixtures/computers.yml +10 -10
- data/test/fixtures/content.yml +3 -0
- data/test/fixtures/content_positions.yml +3 -0
- data/test/fixtures/courses.yml +8 -8
- data/test/fixtures/customers.yml +25 -25
- data/test/fixtures/dashboards.yml +6 -6
- data/test/fixtures/dead_parrots.yml +5 -0
- data/test/fixtures/developers.yml +22 -22
- data/test/fixtures/developers_projects.yml +16 -16
- data/test/fixtures/dog_lovers.yml +7 -7
- data/test/fixtures/dogs.yml +4 -4
- data/test/fixtures/doubloons.yml +3 -3
- data/test/fixtures/edges.yml +5 -5
- data/test/fixtures/entrants.yml +14 -14
- data/test/fixtures/essays.yml +6 -6
- data/test/fixtures/faces.yml +11 -11
- data/test/fixtures/fk_test_has_fk.yml +3 -3
- data/test/fixtures/fk_test_has_pk.yml +1 -1
- data/test/fixtures/friendships.yml +4 -4
- data/test/fixtures/funny_jokes.yml +10 -10
- data/test/fixtures/interests.yml +33 -33
- data/test/fixtures/items.yml +3 -3
- data/test/fixtures/jobs.yml +7 -7
- data/test/fixtures/legacy_things.yml +3 -3
- data/test/fixtures/live_parrots.yml +4 -0
- data/test/fixtures/mateys.yml +4 -4
- data/test/fixtures/member_details.yml +8 -8
- data/test/fixtures/member_types.yml +6 -6
- data/test/fixtures/members.yml +11 -11
- data/test/fixtures/memberships.yml +34 -34
- data/test/fixtures/men.yml +5 -5
- data/test/fixtures/minimalistics.yml +2 -2
- data/test/fixtures/minivans.yml +5 -5
- data/test/fixtures/mixed_case_monkeys.yml +6 -6
- data/test/fixtures/mixins.yml +29 -29
- data/test/fixtures/movies.yml +7 -7
- data/test/fixtures/naked/yml/accounts.yml +1 -1
- data/test/fixtures/naked/yml/companies.yml +1 -1
- data/test/fixtures/naked/yml/courses.yml +1 -1
- data/test/fixtures/naked/yml/parrots.yml +2 -0
- data/test/fixtures/naked/yml/trees.yml +3 -0
- data/test/fixtures/nodes.yml +29 -0
- data/test/fixtures/organizations.yml +5 -5
- data/test/fixtures/other_comments.yml +6 -0
- data/test/fixtures/other_dogs.yml +2 -0
- data/test/fixtures/other_posts.yml +7 -0
- data/test/fixtures/other_topics.yml +42 -42
- data/test/fixtures/owners.yml +9 -9
- data/test/fixtures/parrots.yml +27 -27
- data/test/fixtures/parrots_pirates.yml +7 -7
- data/test/fixtures/people.yml +24 -24
- data/test/fixtures/peoples_treasures.yml +3 -3
- data/test/fixtures/pets.yml +19 -19
- data/test/fixtures/pirates.yml +15 -12
- data/test/fixtures/posts.yml +80 -80
- data/test/fixtures/price_estimates.yml +16 -7
- data/test/fixtures/products.yml +4 -4
- data/test/fixtures/projects.yml +7 -7
- data/test/fixtures/ratings.yml +14 -14
- data/test/fixtures/readers.yml +11 -11
- data/test/fixtures/references.yml +17 -17
- data/test/fixtures/reserved_words/distinct.yml +5 -5
- data/test/fixtures/reserved_words/distinct_select.yml +11 -11
- data/test/fixtures/reserved_words/group.yml +14 -14
- data/test/fixtures/reserved_words/select.yml +8 -8
- data/test/fixtures/reserved_words/values.yml +7 -7
- data/test/fixtures/ships.yml +6 -6
- data/test/fixtures/speedometers.yml +8 -8
- data/test/fixtures/sponsors.yml +12 -12
- data/test/fixtures/string_key_objects.yml +7 -7
- data/test/fixtures/subscribers.yml +10 -10
- data/test/fixtures/subscriptions.yml +12 -12
- data/test/fixtures/taggings.yml +78 -78
- data/test/fixtures/tags.yml +11 -11
- data/test/fixtures/tasks.yml +7 -7
- data/test/fixtures/teapots.yml +3 -3
- data/test/fixtures/to_be_linked/accounts.yml +2 -2
- data/test/fixtures/to_be_linked/users.yml +10 -10
- data/test/fixtures/topics.yml +49 -49
- data/test/fixtures/toys.yml +14 -14
- data/test/fixtures/traffic_lights.yml +9 -9
- data/test/fixtures/treasures.yml +10 -10
- data/test/fixtures/trees.yml +3 -0
- data/test/fixtures/uuid_children.yml +3 -3
- data/test/fixtures/uuid_parents.yml +2 -2
- data/test/fixtures/variants.yml +4 -4
- data/test/fixtures/vegetables.yml +19 -19
- data/test/fixtures/vertices.yml +3 -3
- data/test/fixtures/warehouse_things.yml +2 -2
- data/test/fixtures/zines.yml +5 -5
- data/test/migrations/10_urban/9_add_expressions.rb +11 -11
- data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
- data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
- data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
- data/test/migrations/missing/1_people_have_last_names.rb +9 -9
- data/test/migrations/missing/3_we_need_reminders.rb +12 -12
- data/test/migrations/missing/4_innocent_jointable.rb +12 -12
- data/test/migrations/rename/1_we_need_things.rb +11 -11
- data/test/migrations/rename/2_rename_things.rb +9 -9
- data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy2/1_create_articles.rb +7 -7
- data/test/migrations/to_copy2/2_create_comments.rb +7 -7
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
- data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
- data/test/models/admin.rb +5 -5
- data/test/models/admin/account.rb +3 -3
- data/test/models/admin/randomly_named_c1.rb +6 -2
- data/test/models/admin/user.rb +40 -40
- data/test/models/aircraft.rb +5 -4
- data/test/models/arunit2_model.rb +3 -3
- data/test/models/author.rb +209 -212
- data/test/models/auto_id.rb +4 -4
- data/test/models/autoloadable/extra_firm.rb +2 -2
- data/test/models/binary.rb +2 -2
- data/test/models/bird.rb +12 -12
- data/test/models/book.rb +23 -18
- data/test/models/boolean.rb +2 -2
- data/test/models/bulb.rb +52 -51
- data/test/models/cake_designer.rb +3 -3
- data/test/models/car.rb +29 -26
- data/test/models/carrier.rb +2 -2
- data/test/models/cat.rb +10 -0
- data/test/models/categorization.rb +19 -19
- data/test/models/category.rb +35 -35
- data/test/models/chef.rb +8 -7
- data/test/models/citation.rb +3 -3
- data/test/models/club.rb +25 -23
- data/test/models/college.rb +10 -10
- data/test/models/column.rb +3 -3
- data/test/models/column_name.rb +3 -3
- data/test/models/comment.rb +76 -64
- data/test/models/company.rb +230 -228
- data/test/models/company_in_module.rb +98 -98
- data/test/models/computer.rb +3 -3
- data/test/models/contact.rb +41 -41
- data/test/models/content.rb +40 -0
- data/test/models/contract.rb +20 -20
- data/test/models/country.rb +7 -7
- data/test/models/course.rb +6 -6
- data/test/models/customer.rb +83 -77
- data/test/models/customer_carrier.rb +14 -14
- data/test/models/dashboard.rb +3 -3
- data/test/models/default.rb +2 -2
- data/test/models/department.rb +4 -4
- data/test/models/developer.rb +274 -255
- data/test/models/dog.rb +5 -5
- data/test/models/dog_lover.rb +5 -5
- data/test/models/doubloon.rb +12 -12
- data/test/models/drink_designer.rb +3 -3
- data/test/models/edge.rb +5 -5
- data/test/models/electron.rb +5 -5
- data/test/models/engine.rb +4 -4
- data/test/models/entrant.rb +3 -3
- data/test/models/essay.rb +5 -5
- data/test/models/event.rb +3 -3
- data/test/models/eye.rb +37 -37
- data/test/models/face.rb +9 -9
- data/test/models/friendship.rb +6 -6
- data/test/models/guid.rb +2 -2
- data/test/models/guitar.rb +4 -0
- data/test/models/hotel.rb +11 -9
- data/test/models/image.rb +3 -3
- data/test/models/interest.rb +5 -5
- data/test/models/invoice.rb +4 -4
- data/test/models/item.rb +7 -7
- data/test/models/job.rb +7 -7
- data/test/models/joke.rb +7 -7
- data/test/models/keyboard.rb +3 -3
- data/test/models/legacy_thing.rb +3 -3
- data/test/models/lesson.rb +11 -11
- data/test/models/line_item.rb +3 -3
- data/test/models/liquid.rb +4 -4
- data/test/models/man.rb +11 -11
- data/test/models/matey.rb +4 -4
- data/test/models/member.rb +42 -41
- data/test/models/member_detail.rb +8 -7
- data/test/models/member_type.rb +3 -3
- data/test/models/membership.rb +35 -35
- data/test/models/mentor.rb +3 -0
- data/test/models/minimalistic.rb +2 -2
- data/test/models/minivan.rb +9 -9
- data/test/models/mixed_case_monkey.rb +3 -3
- data/test/models/mocktail_designer.rb +2 -0
- data/test/models/molecule.rb +6 -6
- data/test/models/movie.rb +5 -5
- data/test/models/node.rb +5 -0
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +3 -0
- data/test/models/order.rb +4 -4
- data/test/models/organization.rb +14 -14
- data/test/models/other_dog.rb +5 -0
- data/test/models/owner.rb +37 -34
- data/test/models/parrot.rb +28 -29
- data/test/models/person.rb +142 -143
- data/test/models/personal_legacy_thing.rb +4 -4
- data/test/models/pet.rb +18 -15
- data/test/models/pet_treasure.rb +6 -0
- data/test/models/pirate.rb +92 -92
- data/test/models/possession.rb +3 -3
- data/test/models/post.rb +273 -264
- data/test/models/price_estimate.rb +4 -4
- data/test/models/professor.rb +5 -5
- data/test/models/project.rb +40 -31
- data/test/models/publisher.rb +2 -2
- data/test/models/publisher/article.rb +4 -4
- data/test/models/publisher/magazine.rb +3 -3
- data/test/models/randomly_named_c1.rb +1 -1
- data/test/models/rating.rb +4 -4
- data/test/models/reader.rb +23 -23
- data/test/models/recipe.rb +3 -0
- data/test/models/record.rb +2 -2
- data/test/models/reference.rb +22 -22
- data/test/models/reply.rb +61 -61
- data/test/models/ship.rb +39 -33
- data/test/models/ship_part.rb +8 -8
- data/test/models/shop.rb +17 -17
- data/test/models/shop_account.rb +6 -6
- data/test/models/speedometer.rb +6 -6
- data/test/models/sponsor.rb +7 -7
- data/test/models/string_key_object.rb +3 -3
- data/test/models/student.rb +4 -4
- data/test/models/subject.rb +16 -16
- data/test/models/subscriber.rb +8 -8
- data/test/models/subscription.rb +4 -4
- data/test/models/tag.rb +13 -7
- data/test/models/tagging.rb +13 -13
- data/test/models/task.rb +5 -5
- data/test/models/topic.rb +118 -124
- data/test/models/toy.rb +6 -6
- data/test/models/traffic_light.rb +4 -4
- data/test/models/treasure.rb +14 -14
- data/test/models/treaty.rb +7 -7
- data/test/models/tree.rb +3 -0
- data/test/models/tuning_peg.rb +4 -0
- data/test/models/tyre.rb +11 -11
- data/test/models/user.rb +14 -0
- data/test/models/uuid_child.rb +3 -3
- data/test/models/uuid_item.rb +6 -0
- data/test/models/uuid_parent.rb +3 -3
- data/test/models/vegetables.rb +24 -24
- data/test/models/vehicle.rb +6 -6
- data/test/models/vertex.rb +9 -9
- data/test/models/warehouse_thing.rb +5 -5
- data/test/models/wheel.rb +3 -3
- data/test/models/without_table.rb +3 -3
- data/test/models/zine.rb +3 -3
- data/test/schema/mysql2_specific_schema.rb +68 -58
- data/test/schema/oracle_specific_schema.rb +40 -43
- data/test/schema/postgresql_specific_schema.rb +114 -202
- data/test/schema/schema.rb +1057 -952
- data/test/schema/schema.rb.original +1057 -0
- data/test/schema/sqlite_specific_schema.rb +18 -22
- data/test/support/config.rb +43 -43
- data/test/support/connection.rb +23 -22
- data/test/support/connection_helper.rb +14 -14
- data/test/support/ddl_helper.rb +8 -8
- data/test/support/schema_dumping_helper.rb +20 -20
- data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
- data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
- metadata +129 -28
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
- data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
- data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
- data/test/cases/attribute_methods/serialization_test.rb +0 -29
- data/test/cases/migration/change_schema_test - Copy.rb +0 -448
- data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
- data/test/cases/migration/table_and_index_test.rb +0 -24
- data/test/cases/relation/where_test2.rb +0 -36
- data/test/cases/type/decimal_test.rb +0 -56
- data/test/cases/type/unsigned_integer_test.rb +0 -18
- data/test/cases/xml_serialization_test.rb +0 -457
- data/test/connections/native_ibm_db/connection.rb +0 -44
- data/test/fixtures/naked/csv/accounts.csv +0 -1
- data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
- data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
- data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
- data/test/schema/mysql_specific_schema.rb +0 -70
- data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,524 +1,561 @@
|
|
1
|
-
require "cases/helper"
|
2
|
-
require 'models/post'
|
3
|
-
require 'models/topic'
|
4
|
-
require 'models/comment'
|
5
|
-
require 'models/reply'
|
6
|
-
require 'models/author'
|
7
|
-
require 'models/developer'
|
8
|
-
require 'models/computer'
|
9
|
-
|
10
|
-
class NamedScopingTest < ActiveRecord::TestCase
|
11
|
-
fixtures :posts, :authors, :topics, :comments, :author_addresses
|
12
|
-
|
13
|
-
def test_implements_enumerable
|
14
|
-
assert !Topic.all.empty?
|
15
|
-
|
16
|
-
assert_equal Topic.all.to_a, Topic.base
|
17
|
-
assert_equal Topic.all.to_a, Topic.base.to_a
|
18
|
-
assert_equal Topic.first, Topic.base.first
|
19
|
-
assert_equal Topic.all.to_a, Topic.base.map { |i| i }
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_found_items_are_cached
|
23
|
-
all_posts = Topic.base
|
24
|
-
|
25
|
-
assert_queries(1) do
|
26
|
-
all_posts.collect
|
27
|
-
all_posts.collect
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_reload_expires_cache_of_found_items
|
32
|
-
all_posts = Topic.base
|
33
|
-
all_posts.to_a
|
34
|
-
|
35
|
-
new_post = Topic.create!
|
36
|
-
assert !all_posts.include?(new_post)
|
37
|
-
assert all_posts.reload.include?(new_post)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_delegates_finds_and_calculations_to_the_base_class
|
41
|
-
assert !Topic.all.empty?
|
42
|
-
|
43
|
-
assert_equal Topic.all.to_a, Topic.base.to_a
|
44
|
-
assert_equal Topic.first, Topic.base.first
|
45
|
-
assert_equal Topic.count, Topic.base.count
|
46
|
-
assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_method_missing_priority_when_delegating
|
50
|
-
klazz = Class.new(ActiveRecord::Base) do
|
51
|
-
self.table_name = "topics"
|
52
|
-
scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
|
53
|
-
scope :to, Proc.new { where('written_on <= ?', Time.now) }
|
54
|
-
end
|
55
|
-
assert_equal klazz.to.since.to_a, klazz.since.to.to_a
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
|
59
|
-
assert Topic.approved.respond_to?(:limit)
|
60
|
-
assert Topic.approved.respond_to?(:count)
|
61
|
-
assert Topic.approved.respond_to?(:length)
|
62
|
-
end
|
63
|
-
|
64
|
-
def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
|
65
|
-
assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
|
66
|
-
|
67
|
-
assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
|
68
|
-
assert_equal Topic.where(:approved => true).count, Topic.approved.count
|
69
|
-
end
|
70
|
-
|
71
|
-
def test_scopes_with_string_name_can_be_composed
|
72
|
-
# NOTE that scopes defined with a string as a name worked on their own
|
73
|
-
# but when called on another scope the other scope was completely replaced
|
74
|
-
assert_equal Topic.replied.approved, Topic.replied.approved_as_string
|
75
|
-
end
|
76
|
-
|
77
|
-
def test_scopes_are_composable
|
78
|
-
assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
|
79
|
-
assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
|
80
|
-
assert !(approved == replied)
|
81
|
-
assert !(approved & replied).empty?
|
82
|
-
|
83
|
-
assert_equal approved & replied, Topic.approved.replied
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_procedural_scopes
|
87
|
-
topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
|
88
|
-
topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
|
89
|
-
assert_not_equal topics_written_before_the_second, topics_written_before_the_third
|
90
|
-
|
91
|
-
assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
|
92
|
-
assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_procedural_scopes_returning_nil
|
96
|
-
all_topics = Topic.all
|
97
|
-
|
98
|
-
assert_equal all_topics, Topic.written_before(nil)
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_scope_with_object
|
102
|
-
objects = Topic.with_object
|
103
|
-
assert_operator objects.length, :>, 0
|
104
|
-
assert objects.all?(&:approved?), 'all objects should be approved'
|
105
|
-
end
|
106
|
-
|
107
|
-
def test_has_many_associations_have_access_to_scopes
|
108
|
-
assert_not_equal Post.containing_the_letter_a, authors(:david).posts
|
109
|
-
assert !Post.containing_the_letter_a.empty?
|
110
|
-
|
111
|
-
assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
|
112
|
-
end
|
113
|
-
|
114
|
-
def test_scope_with_STI
|
115
|
-
assert_equal 3,Post.containing_the_letter_a.count
|
116
|
-
assert_equal 1,SpecialPost.containing_the_letter_a.count
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_has_many_through_associations_have_access_to_scopes
|
120
|
-
assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
|
121
|
-
assert !Comment.containing_the_letter_e.empty?
|
122
|
-
|
123
|
-
assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_scopes_honor_current_scopes_from_when_defined
|
127
|
-
assert !Post.ranked_by_comments.limit_by(5).empty?
|
128
|
-
assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
|
129
|
-
assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
|
130
|
-
assert_not_equal Post.top(5), authors(:david).posts.top(5)
|
131
|
-
# Oracle sometimes sorts differently if WHERE condition is changed
|
132
|
-
assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
|
133
|
-
assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_scopes_body_is_a_callable
|
137
|
-
e = assert_raises ArgumentError do
|
138
|
-
Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
|
139
|
-
end
|
140
|
-
assert_equal "The scope body needs to be callable.", e.message
|
141
|
-
end
|
142
|
-
|
143
|
-
def test_active_records_have_scope_named__all__
|
144
|
-
assert !Topic.all.empty?
|
145
|
-
|
146
|
-
assert_equal Topic.all.to_a, Topic.base
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_active_records_have_scope_named__scoped__
|
150
|
-
scope = Topic.where("content LIKE '%Have%'")
|
151
|
-
assert !scope.empty?
|
152
|
-
|
153
|
-
assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_first_and_last_should_allow_integers_for_limit
|
157
|
-
assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
|
158
|
-
assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
|
159
|
-
end
|
160
|
-
|
161
|
-
def test_first_and_last_should_not_use_query_when_results_are_loaded
|
162
|
-
topics = Topic.base
|
163
|
-
topics.reload # force load
|
164
|
-
assert_no_queries do
|
165
|
-
topics.first
|
166
|
-
topics.last
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_empty_should_not_load_results
|
171
|
-
topics = Topic.base
|
172
|
-
assert_queries(2) do
|
173
|
-
topics.empty? # use count query
|
174
|
-
topics.collect # force load
|
175
|
-
topics.empty? # use loaded (no query)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def test_any_should_not_load_results
|
180
|
-
topics = Topic.base
|
181
|
-
assert_queries(2) do
|
182
|
-
topics.any? # use count query
|
183
|
-
topics.collect # force load
|
184
|
-
topics.any? # use loaded (no query)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def test_any_should_call_proxy_found_if_using_a_block
|
189
|
-
topics = Topic.base
|
190
|
-
assert_queries(1) do
|
191
|
-
topics
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
topics
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
Topic.
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
topics.
|
213
|
-
topics.
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
topics
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
topics = Topic.base.where(:id =>
|
235
|
-
assert !topics.many?
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
Topic.
|
246
|
-
assert !Topic.many?
|
247
|
-
Topic.create!
|
248
|
-
assert Topic.many?
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
:
|
301
|
-
:
|
302
|
-
:
|
303
|
-
:
|
304
|
-
:
|
305
|
-
:
|
306
|
-
:
|
307
|
-
:
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
:
|
314
|
-
:
|
315
|
-
:
|
316
|
-
:
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
end
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
assert_equal
|
357
|
-
end
|
358
|
-
|
359
|
-
def
|
360
|
-
|
361
|
-
end
|
362
|
-
|
363
|
-
def
|
364
|
-
|
365
|
-
end
|
366
|
-
|
367
|
-
def
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
post =
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
#
|
413
|
-
assert_equal
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
assert_equal
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
assert_queries(
|
427
|
-
Topic.approved.
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
Topic.
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
end
|
494
|
-
|
495
|
-
def
|
496
|
-
post = posts(:welcome)
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/topic'
|
4
|
+
require 'models/comment'
|
5
|
+
require 'models/reply'
|
6
|
+
require 'models/author'
|
7
|
+
require 'models/developer'
|
8
|
+
require 'models/computer'
|
9
|
+
|
10
|
+
class NamedScopingTest < ActiveRecord::TestCase
|
11
|
+
fixtures :posts, :authors, :topics, :comments, :author_addresses
|
12
|
+
|
13
|
+
def test_implements_enumerable
|
14
|
+
assert !Topic.all.empty?
|
15
|
+
|
16
|
+
assert_equal Topic.all.to_a, Topic.base
|
17
|
+
assert_equal Topic.all.to_a, Topic.base.to_a
|
18
|
+
assert_equal Topic.first, Topic.base.first
|
19
|
+
assert_equal Topic.all.to_a, Topic.base.map { |i| i }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_found_items_are_cached
|
23
|
+
all_posts = Topic.base
|
24
|
+
|
25
|
+
assert_queries(1) do
|
26
|
+
all_posts.collect
|
27
|
+
all_posts.collect
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_reload_expires_cache_of_found_items
|
32
|
+
all_posts = Topic.base
|
33
|
+
all_posts.to_a
|
34
|
+
|
35
|
+
new_post = Topic.create!
|
36
|
+
assert !all_posts.include?(new_post)
|
37
|
+
assert all_posts.reload.include?(new_post)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_delegates_finds_and_calculations_to_the_base_class
|
41
|
+
assert !Topic.all.empty?
|
42
|
+
|
43
|
+
assert_equal Topic.all.to_a, Topic.base.to_a
|
44
|
+
assert_equal Topic.first, Topic.base.first
|
45
|
+
assert_equal Topic.count, Topic.base.count
|
46
|
+
assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_method_missing_priority_when_delegating
|
50
|
+
klazz = Class.new(ActiveRecord::Base) do
|
51
|
+
self.table_name = "topics"
|
52
|
+
scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
|
53
|
+
scope :to, Proc.new { where('written_on <= ?', Time.now) }
|
54
|
+
end
|
55
|
+
assert_equal klazz.to.since.to_a, klazz.since.to.to_a
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
|
59
|
+
assert Topic.approved.respond_to?(:limit)
|
60
|
+
assert Topic.approved.respond_to?(:count)
|
61
|
+
assert Topic.approved.respond_to?(:length)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
|
65
|
+
assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
|
66
|
+
|
67
|
+
assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
|
68
|
+
assert_equal Topic.where(:approved => true).count, Topic.approved.count
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_scopes_with_string_name_can_be_composed
|
72
|
+
# NOTE that scopes defined with a string as a name worked on their own
|
73
|
+
# but when called on another scope the other scope was completely replaced
|
74
|
+
assert_equal Topic.replied.approved, Topic.replied.approved_as_string
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_scopes_are_composable
|
78
|
+
assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
|
79
|
+
assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
|
80
|
+
assert !(approved == replied)
|
81
|
+
assert !(approved & replied).empty?
|
82
|
+
|
83
|
+
assert_equal approved & replied, Topic.approved.replied
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_procedural_scopes
|
87
|
+
topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
|
88
|
+
topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
|
89
|
+
assert_not_equal topics_written_before_the_second, topics_written_before_the_third
|
90
|
+
|
91
|
+
assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
|
92
|
+
assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_procedural_scopes_returning_nil
|
96
|
+
all_topics = Topic.all
|
97
|
+
|
98
|
+
assert_equal all_topics, Topic.written_before(nil)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_scope_with_object
|
102
|
+
objects = Topic.with_object
|
103
|
+
assert_operator objects.length, :>, 0
|
104
|
+
assert objects.all?(&:approved?), 'all objects should be approved'
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_has_many_associations_have_access_to_scopes
|
108
|
+
assert_not_equal Post.containing_the_letter_a, authors(:david).posts
|
109
|
+
assert !Post.containing_the_letter_a.empty?
|
110
|
+
|
111
|
+
assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_scope_with_STI
|
115
|
+
assert_equal 3,Post.containing_the_letter_a.count
|
116
|
+
assert_equal 1,SpecialPost.containing_the_letter_a.count
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_has_many_through_associations_have_access_to_scopes
|
120
|
+
assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
|
121
|
+
assert !Comment.containing_the_letter_e.empty?
|
122
|
+
|
123
|
+
assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_scopes_honor_current_scopes_from_when_defined
|
127
|
+
assert !Post.ranked_by_comments.limit_by(5).empty?
|
128
|
+
assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
|
129
|
+
assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
|
130
|
+
assert_not_equal Post.top(5), authors(:david).posts.top(5)
|
131
|
+
# Oracle sometimes sorts differently if WHERE condition is changed
|
132
|
+
assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
|
133
|
+
assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_scopes_body_is_a_callable
|
137
|
+
e = assert_raises ArgumentError do
|
138
|
+
Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
|
139
|
+
end
|
140
|
+
assert_equal "The scope body needs to be callable.", e.message
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_active_records_have_scope_named__all__
|
144
|
+
assert !Topic.all.empty?
|
145
|
+
|
146
|
+
assert_equal Topic.all.to_a, Topic.base
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_active_records_have_scope_named__scoped__
|
150
|
+
scope = Topic.where("content LIKE '%Have%'")
|
151
|
+
assert !scope.empty?
|
152
|
+
|
153
|
+
assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_first_and_last_should_allow_integers_for_limit
|
157
|
+
assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
|
158
|
+
assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_first_and_last_should_not_use_query_when_results_are_loaded
|
162
|
+
topics = Topic.base
|
163
|
+
topics.reload # force load
|
164
|
+
assert_no_queries do
|
165
|
+
topics.first
|
166
|
+
topics.last
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_empty_should_not_load_results
|
171
|
+
topics = Topic.base
|
172
|
+
assert_queries(2) do
|
173
|
+
topics.empty? # use count query
|
174
|
+
topics.collect # force load
|
175
|
+
topics.empty? # use loaded (no query)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_any_should_not_load_results
|
180
|
+
topics = Topic.base
|
181
|
+
assert_queries(2) do
|
182
|
+
topics.any? # use count query
|
183
|
+
topics.collect # force load
|
184
|
+
topics.any? # use loaded (no query)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_any_should_call_proxy_found_if_using_a_block
|
189
|
+
topics = Topic.base
|
190
|
+
assert_queries(1) do
|
191
|
+
assert_not_called(topics, :empty?) do
|
192
|
+
topics.any? { true }
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_any_should_not_fire_query_if_scope_loaded
|
198
|
+
topics = Topic.base
|
199
|
+
topics.collect # force load
|
200
|
+
assert_no_queries { assert topics.any? }
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_model_class_should_respond_to_any
|
204
|
+
assert Topic.any?
|
205
|
+
Topic.delete_all
|
206
|
+
assert !Topic.any?
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_many_should_not_load_results
|
210
|
+
topics = Topic.base
|
211
|
+
assert_queries(2) do
|
212
|
+
topics.many? # use count query
|
213
|
+
topics.collect # force load
|
214
|
+
topics.many? # use loaded (no query)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_many_should_call_proxy_found_if_using_a_block
|
219
|
+
topics = Topic.base
|
220
|
+
assert_queries(1) do
|
221
|
+
assert_not_called(topics, :size) do
|
222
|
+
topics.many? { true }
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_many_should_not_fire_query_if_scope_loaded
|
228
|
+
topics = Topic.base
|
229
|
+
topics.collect # force load
|
230
|
+
assert_no_queries { assert topics.many? }
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_many_should_return_false_if_none_or_one
|
234
|
+
topics = Topic.base.where(:id => 0)
|
235
|
+
assert !topics.many?
|
236
|
+
topics = Topic.base.where(:id => 1)
|
237
|
+
assert !topics.many?
|
238
|
+
end
|
239
|
+
|
240
|
+
def test_many_should_return_true_if_more_than_one
|
241
|
+
assert Topic.base.many?
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_model_class_should_respond_to_many
|
245
|
+
Topic.delete_all
|
246
|
+
assert !Topic.many?
|
247
|
+
Topic.create!
|
248
|
+
assert !Topic.many?
|
249
|
+
Topic.create!
|
250
|
+
assert Topic.many?
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_should_build_on_top_of_scope
|
254
|
+
topic = Topic.approved.build({})
|
255
|
+
assert topic.approved
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_should_build_new_on_top_of_scope
|
259
|
+
topic = Topic.approved.new
|
260
|
+
assert topic.approved
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_should_create_on_top_of_scope
|
264
|
+
topic = Topic.approved.create({})
|
265
|
+
assert topic.approved
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_should_create_with_bang_on_top_of_scope
|
269
|
+
topic = Topic.approved.create!({})
|
270
|
+
assert topic.approved
|
271
|
+
end
|
272
|
+
|
273
|
+
def test_should_build_on_top_of_chained_scopes
|
274
|
+
topic = Topic.approved.by_lifo.build({})
|
275
|
+
assert topic.approved
|
276
|
+
assert_equal 'lifo', topic.author_name
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_reserved_scope_names
|
280
|
+
klass = Class.new(ActiveRecord::Base) do
|
281
|
+
self.table_name = "topics"
|
282
|
+
|
283
|
+
scope :approved, -> { where(approved: true) }
|
284
|
+
|
285
|
+
class << self
|
286
|
+
public
|
287
|
+
def pub; end
|
288
|
+
|
289
|
+
private
|
290
|
+
def pri; end
|
291
|
+
|
292
|
+
protected
|
293
|
+
def pro; end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
subklass = Class.new(klass)
|
298
|
+
|
299
|
+
conflicts = [
|
300
|
+
:create, # public class method on AR::Base
|
301
|
+
:relation, # private class method on AR::Base
|
302
|
+
:new, # redefined class method on AR::Base
|
303
|
+
:all, # a default scope
|
304
|
+
:public, # some important methods on Module and Class
|
305
|
+
:protected,
|
306
|
+
:private,
|
307
|
+
:name,
|
308
|
+
:parent,
|
309
|
+
:superclass
|
310
|
+
]
|
311
|
+
|
312
|
+
non_conflicts = [
|
313
|
+
:find_by_title, # dynamic finder method
|
314
|
+
:approved, # existing scope
|
315
|
+
:pub, # existing public class method
|
316
|
+
:pri, # existing private class method
|
317
|
+
:pro, # existing protected class method
|
318
|
+
:open, # a ::Kernel method
|
319
|
+
]
|
320
|
+
|
321
|
+
conflicts.each do |name|
|
322
|
+
e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
|
323
|
+
klass.class_eval { scope name, ->{ where(approved: true) } }
|
324
|
+
end
|
325
|
+
assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
|
326
|
+
|
327
|
+
e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
|
328
|
+
subklass.class_eval { scope name, ->{ where(approved: true) } }
|
329
|
+
end
|
330
|
+
assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
|
331
|
+
end
|
332
|
+
|
333
|
+
non_conflicts.each do |name|
|
334
|
+
assert_nothing_raised do
|
335
|
+
silence_warnings do
|
336
|
+
klass.class_eval { scope name, ->{ where(approved: true) } }
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
assert_nothing_raised do
|
341
|
+
subklass.class_eval { scope name, ->{ where(approved: true) } }
|
342
|
+
end
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
# Method delegation for scope names which look like /\A[a-zA-Z_]\w*[!?]?\z/
|
347
|
+
# has been done by evaluating a string with a plain def statement. For scope
|
348
|
+
# names which contain spaces this approach doesn't work.
|
349
|
+
def test_spaces_in_scope_names
|
350
|
+
klass = Class.new(ActiveRecord::Base) do
|
351
|
+
self.table_name = "topics"
|
352
|
+
scope :"title containing space", -> { where("title LIKE '% %'") }
|
353
|
+
scope :approved, -> { where(:approved => true) }
|
354
|
+
end
|
355
|
+
assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
|
356
|
+
assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
|
357
|
+
end
|
358
|
+
|
359
|
+
def test_find_all_should_behave_like_select
|
360
|
+
assert_equal Topic.base.to_a.select(&:approved), Topic.base.to_a.find_all(&:approved)
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_rand_should_select_a_random_object_from_proxy
|
364
|
+
assert_kind_of Topic, Topic.approved.sample
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_should_use_where_in_query_for_scope
|
368
|
+
assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_size_should_use_count_when_results_are_not_loaded
|
372
|
+
topics = Topic.base
|
373
|
+
assert_queries(1) do
|
374
|
+
assert_sql(/COUNT/i) { topics.size }
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_size_should_use_length_when_results_are_loaded
|
379
|
+
topics = Topic.base
|
380
|
+
topics.reload # force load
|
381
|
+
assert_no_queries do
|
382
|
+
topics.size # use loaded (no query)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_should_not_duplicates_where_values
|
387
|
+
relation = Topic.where("1=1")
|
388
|
+
assert_equal relation.where_clause, relation.scope_with_lambda.where_clause
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_chaining_with_duplicate_joins
|
392
|
+
join = "INNER JOIN comments ON comments.post_id = posts.id"
|
393
|
+
post = Post.find(1)
|
394
|
+
assert_equal post.comments.size, Post.joins(join).joins(join).where("posts.id = #{post.id}").size
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_chaining_applies_last_conditions_when_creating
|
398
|
+
post = Topic.rejected.new
|
399
|
+
assert !post.approved?
|
400
|
+
|
401
|
+
post = Topic.rejected.approved.new
|
402
|
+
assert post.approved?
|
403
|
+
|
404
|
+
post = Topic.approved.rejected.new
|
405
|
+
assert !post.approved?
|
406
|
+
|
407
|
+
post = Topic.approved.rejected.approved.new
|
408
|
+
assert post.approved?
|
409
|
+
end
|
410
|
+
|
411
|
+
def test_chaining_combines_conditions_when_searching
|
412
|
+
# Normal hash conditions
|
413
|
+
assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
|
414
|
+
assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
|
415
|
+
|
416
|
+
# Nested hash conditions with same keys
|
417
|
+
assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
|
418
|
+
|
419
|
+
# Nested hash conditions with different keys
|
420
|
+
assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
|
421
|
+
end
|
422
|
+
|
423
|
+
def test_scopes_batch_finders
|
424
|
+
assert_equal 4, Topic.approved.count
|
425
|
+
|
426
|
+
assert_queries(5) do
|
427
|
+
Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
|
428
|
+
end
|
429
|
+
|
430
|
+
assert_queries(3) do
|
431
|
+
Topic.approved.find_in_batches(:batch_size => 2) do |group|
|
432
|
+
group.each {|t| assert t.approved? }
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
def test_table_names_for_chaining_scopes_with_and_without_table_name_included
|
438
|
+
assert_nothing_raised do
|
439
|
+
Comment.for_first_post.for_first_author.to_a
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
def test_scopes_with_reserved_names
|
444
|
+
class << Topic
|
445
|
+
def public_method; end
|
446
|
+
public :public_method
|
447
|
+
|
448
|
+
def protected_method; end
|
449
|
+
protected :protected_method
|
450
|
+
|
451
|
+
def private_method; end
|
452
|
+
private :private_method
|
453
|
+
end
|
454
|
+
|
455
|
+
[:public_method, :protected_method, :private_method].each do |reserved_method|
|
456
|
+
assert Topic.respond_to?(reserved_method, true)
|
457
|
+
ActiveRecord::Base.logger.expects(:warn)
|
458
|
+
silence_warnings { Topic.scope(reserved_method, -> { }) }
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
def test_scopes_on_relations
|
463
|
+
# Topic.replied
|
464
|
+
approved_topics = Topic.all.approved.order('id DESC')
|
465
|
+
assert_equal topics(:fifth), approved_topics.first
|
466
|
+
|
467
|
+
replied_approved_topics = approved_topics.replied
|
468
|
+
assert_equal topics(:third), replied_approved_topics.first
|
469
|
+
end
|
470
|
+
|
471
|
+
def test_index_on_scope
|
472
|
+
approved = Topic.approved.order('id ASC')
|
473
|
+
assert_equal topics(:second), approved[0]
|
474
|
+
assert approved.loaded?
|
475
|
+
end
|
476
|
+
|
477
|
+
def test_nested_scopes_queries_size
|
478
|
+
assert_queries(1) do
|
479
|
+
Topic.approved.by_lifo.replied.written_before(Time.now).to_a
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
# Note: these next two are kinda odd because they are essentially just testing that the
|
484
|
+
# query cache works as it should, but they are here for legacy reasons as they was previously
|
485
|
+
# a separate cache on association proxies, and these show that that is not necessary.
|
486
|
+
def test_scopes_are_cached_on_associations
|
487
|
+
post = posts(:welcome)
|
488
|
+
|
489
|
+
Post.cache do
|
490
|
+
assert_queries(1) { post.comments.containing_the_letter_e.to_a }
|
491
|
+
assert_no_queries { post.comments.containing_the_letter_e.to_a }
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_scopes_with_arguments_are_cached_on_associations
|
496
|
+
post = posts(:welcome)
|
497
|
+
|
498
|
+
Post.cache do
|
499
|
+
one = assert_queries(1) { post.comments.limit_by(1).to_a }
|
500
|
+
assert_equal 1, one.size
|
501
|
+
|
502
|
+
two = assert_queries(1) { post.comments.limit_by(2).to_a }
|
503
|
+
assert_equal 2, two.size
|
504
|
+
|
505
|
+
assert_no_queries { post.comments.limit_by(1).to_a }
|
506
|
+
assert_no_queries { post.comments.limit_by(2).to_a }
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
def test_scopes_to_get_newest
|
511
|
+
post = posts(:welcome)
|
512
|
+
old_last_comment = post.comments.newest
|
513
|
+
new_comment = post.comments.create(:body => "My new comment")
|
514
|
+
assert_equal new_comment, post.comments.newest
|
515
|
+
assert_not_equal old_last_comment, post.comments.newest
|
516
|
+
end
|
517
|
+
|
518
|
+
def test_scopes_are_reset_on_association_reload
|
519
|
+
post = posts(:welcome)
|
520
|
+
|
521
|
+
[:destroy_all, :reset, :delete_all].each do |method|
|
522
|
+
before = post.comments.containing_the_letter_e
|
523
|
+
post.association(:comments).send(method)
|
524
|
+
assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
def test_scoped_are_lazy_loaded_if_table_still_does_not_exist
|
529
|
+
assert_nothing_raised do
|
530
|
+
require "models/without_table"
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
def test_eager_default_scope_relations_are_remove
|
535
|
+
klass = Class.new(ActiveRecord::Base)
|
536
|
+
klass.table_name = 'posts'
|
537
|
+
|
538
|
+
assert_raises(ArgumentError) do
|
539
|
+
klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
def test_subclass_merges_scopes_properly
|
544
|
+
assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
|
545
|
+
end
|
546
|
+
|
547
|
+
def test_model_class_should_respond_to_none
|
548
|
+
assert !Topic.none?
|
549
|
+
Topic.delete_all
|
550
|
+
assert Topic.none?
|
551
|
+
end
|
552
|
+
|
553
|
+
def test_model_class_should_respond_to_one
|
554
|
+
assert !Topic.one?
|
555
|
+
Topic.delete_all
|
556
|
+
assert !Topic.one?
|
557
|
+
Topic.create!
|
558
|
+
assert Topic.one?
|
559
|
+
end
|
560
|
+
|
561
|
+
end
|