ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/README +1 -1
- data/debug.log +1 -0
- data/ext/Makefile +28 -24
- data/ext/ibm_db.c +66 -65
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +26 -24
- data/ext/ruby_ibm_db_cli.c +1 -0
- data/ext/ruby_ibm_db_cli.o +0 -0
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +3 -1
- data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
- data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
- data/test/activejob/destroy_association_async_test.rb +305 -0
- data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
- data/test/activejob/helper.rb +15 -0
- data/test/assets/schema_dump_5_1.yml +345 -0
- data/test/cases/adapter_prevent_writes_test.rb +334 -0
- data/test/cases/adapter_test.rb +432 -218
- data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
- data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
- data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
- data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
- data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
- data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
- data/test/cases/adapters/mysql2/connection_test.rb +48 -50
- data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
- data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
- data/test/cases/adapters/mysql2/enum_test.rb +32 -11
- data/test/cases/adapters/mysql2/explain_test.rb +13 -11
- data/test/cases/adapters/mysql2/json_test.rb +17 -188
- data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
- data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
- data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
- data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
- data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
- data/test/cases/adapters/mysql2/schema_test.rb +24 -22
- data/test/cases/adapters/mysql2/set_test.rb +32 -0
- data/test/cases/adapters/mysql2/sp_test.rb +10 -8
- data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
- data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
- data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
- data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
- data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
- data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
- data/test/cases/adapters/postgresql/array_test.rb +118 -63
- data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
- data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
- data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
- data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
- data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
- data/test/cases/adapters/postgresql/citext_test.rb +58 -58
- data/test/cases/adapters/postgresql/collation_test.rb +17 -15
- data/test/cases/adapters/postgresql/composite_test.rb +25 -23
- data/test/cases/adapters/postgresql/connection_test.rb +73 -85
- data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
- data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
- data/test/cases/adapters/postgresql/date_test.rb +42 -0
- data/test/cases/adapters/postgresql/domain_test.rb +9 -7
- data/test/cases/adapters/postgresql/enum_test.rb +12 -10
- data/test/cases/adapters/postgresql/explain_test.rb +10 -8
- data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
- data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
- data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
- data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
- data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
- data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
- data/test/cases/adapters/postgresql/integer_test.rb +2 -0
- data/test/cases/adapters/postgresql/interval_test.rb +99 -0
- data/test/cases/adapters/postgresql/json_test.rb +16 -201
- data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
- data/test/cases/adapters/postgresql/money_test.rb +47 -16
- data/test/cases/adapters/postgresql/network_test.rb +36 -28
- data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
- data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
- data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
- data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
- data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
- data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
- data/test/cases/adapters/postgresql/range_test.rb +406 -292
- data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
- data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
- data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
- data/test/cases/adapters/postgresql/schema_test.rb +207 -91
- data/test/cases/adapters/postgresql/serial_test.rb +9 -7
- data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
- data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
- data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
- data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
- data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
- data/test/cases/adapters/postgresql/utils_test.rb +11 -9
- data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
- data/test/cases/adapters/postgresql/xml_test.rb +10 -14
- data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
- data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
- data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
- data/test/cases/adapters/sqlite3/json_test.rb +29 -0
- data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
- data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
- data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
- data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
- data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
- data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
- data/test/cases/aggregations_test.rb +14 -12
- data/test/cases/annotate_test.rb +46 -0
- data/test/cases/ar_schema_test.rb +153 -86
- data/test/cases/arel/attributes/attribute_test.rb +1145 -0
- data/test/cases/arel/attributes/math_test.rb +83 -0
- data/test/cases/arel/attributes_test.rb +27 -0
- data/test/cases/arel/collectors/bind_test.rb +40 -0
- data/test/cases/arel/collectors/composite_test.rb +47 -0
- data/test/cases/arel/collectors/sql_string_test.rb +41 -0
- data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
- data/test/cases/arel/crud_test.rb +65 -0
- data/test/cases/arel/delete_manager_test.rb +53 -0
- data/test/cases/arel/factory_methods_test.rb +46 -0
- data/test/cases/arel/helper.rb +45 -0
- data/test/cases/arel/insert_manager_test.rb +241 -0
- data/test/cases/arel/nodes/and_test.rb +30 -0
- data/test/cases/arel/nodes/as_test.rb +36 -0
- data/test/cases/arel/nodes/ascending_test.rb +46 -0
- data/test/cases/arel/nodes/bin_test.rb +35 -0
- data/test/cases/arel/nodes/binary_test.rb +29 -0
- data/test/cases/arel/nodes/bind_param_test.rb +22 -0
- data/test/cases/arel/nodes/case_test.rb +96 -0
- data/test/cases/arel/nodes/casted_test.rb +18 -0
- data/test/cases/arel/nodes/comment_test.rb +22 -0
- data/test/cases/arel/nodes/count_test.rb +35 -0
- data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
- data/test/cases/arel/nodes/descending_test.rb +46 -0
- data/test/cases/arel/nodes/distinct_test.rb +21 -0
- data/test/cases/arel/nodes/equality_test.rb +62 -0
- data/test/cases/arel/nodes/extract_test.rb +43 -0
- data/test/cases/arel/nodes/false_test.rb +21 -0
- data/test/cases/arel/nodes/grouping_test.rb +26 -0
- data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
- data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
- data/test/cases/arel/nodes/named_function_test.rb +48 -0
- data/test/cases/arel/nodes/node_test.rb +22 -0
- data/test/cases/arel/nodes/not_test.rb +31 -0
- data/test/cases/arel/nodes/or_test.rb +36 -0
- data/test/cases/arel/nodes/over_test.rb +69 -0
- data/test/cases/arel/nodes/select_core_test.rb +79 -0
- data/test/cases/arel/nodes/select_statement_test.rb +51 -0
- data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
- data/test/cases/arel/nodes/sum_test.rb +35 -0
- data/test/cases/arel/nodes/table_alias_test.rb +29 -0
- data/test/cases/arel/nodes/true_test.rb +21 -0
- data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
- data/test/cases/arel/nodes/update_statement_test.rb +60 -0
- data/test/cases/arel/nodes/window_test.rb +81 -0
- data/test/cases/arel/nodes_test.rb +34 -0
- data/test/cases/arel/select_manager_test.rb +1238 -0
- data/test/cases/arel/support/fake_record.rb +135 -0
- data/test/cases/arel/table_test.rb +216 -0
- data/test/cases/arel/update_manager_test.rb +126 -0
- data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
- data/test/cases/arel/visitors/dot_test.rb +90 -0
- data/test/cases/arel/visitors/mysql_test.rb +157 -0
- data/test/cases/arel/visitors/postgres_test.rb +366 -0
- data/test/cases/arel/visitors/sqlite_test.rb +75 -0
- data/test/cases/arel/visitors/to_sql_test.rb +750 -0
- data/test/cases/associations/belongs_to_associations_test.rb +510 -158
- data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
- data/test/cases/associations/callbacks_test.rb +56 -38
- data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
- data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
- data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
- data/test/cases/associations/eager_singularization_test.rb +21 -21
- data/test/cases/associations/eager_test.rb +559 -415
- data/test/cases/associations/extension_test.rb +18 -12
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
- data/test/cases/associations/has_many_associations_test.rb +1038 -465
- data/test/cases/associations/has_many_through_associations_test.rb +558 -249
- data/test/cases/associations/has_one_associations_test.rb +294 -129
- data/test/cases/associations/has_one_through_associations_test.rb +121 -75
- data/test/cases/associations/inner_join_association_test.rb +114 -38
- data/test/cases/associations/inverse_associations_test.rb +606 -398
- data/test/cases/associations/join_model_test.rb +158 -148
- data/test/cases/associations/left_outer_join_association_test.rb +59 -24
- data/test/cases/associations/nested_through_associations_test.rb +166 -109
- data/test/cases/associations/required_test.rb +35 -10
- data/test/cases/associations_test.rb +241 -110
- data/test/cases/attribute_methods/read_test.rb +11 -11
- data/test/cases/attribute_methods_test.rb +413 -298
- data/test/cases/attributes_test.rb +145 -27
- data/test/cases/autosave_association_test.rb +681 -436
- data/test/cases/base_prevent_writes_test.rb +229 -0
- data/test/cases/base_test.rb +599 -542
- data/test/cases/batches_test.rb +288 -82
- data/test/cases/binary_test.rb +26 -31
- data/test/cases/bind_parameter_test.rb +194 -21
- data/test/cases/boolean_test.rb +52 -0
- data/test/cases/cache_key_test.rb +110 -5
- data/test/cases/calculations_test.rb +740 -177
- data/test/cases/callbacks_test.rb +74 -207
- data/test/cases/clone_test.rb +15 -10
- data/test/cases/coders/json_test.rb +2 -0
- data/test/cases/coders/yaml_column_test.rb +16 -13
- data/test/cases/collection_cache_key_test.rb +177 -20
- data/test/cases/column_alias_test.rb +9 -7
- data/test/cases/column_definition_test.rb +10 -68
- data/test/cases/comment_test.rb +166 -107
- data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
- data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
- data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
- data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
- data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
- data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
- data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
- data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
- data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
- data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
- data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
- data/test/cases/connection_management_test.rb +13 -11
- data/test/cases/connection_pool_test.rb +316 -83
- data/test/cases/core_test.rb +82 -58
- data/test/cases/counter_cache_test.rb +204 -50
- data/test/cases/custom_locking_test.rb +5 -3
- data/test/cases/database_configurations/hash_config_test.rb +74 -0
- data/test/cases/database_configurations/resolver_test.rb +150 -0
- data/test/cases/database_configurations_test.rb +145 -0
- data/test/cases/database_selector_test.rb +296 -0
- data/test/cases/database_statements_test.rb +18 -16
- data/test/cases/date_test.rb +8 -16
- data/test/cases/date_time_precision_test.rb +100 -78
- data/test/cases/date_time_test.rb +23 -8
- data/test/cases/defaults_test.rb +106 -71
- data/test/cases/delegated_type_test.rb +57 -0
- data/test/cases/dirty_test.rb +419 -223
- data/test/cases/disconnected_test.rb +6 -6
- data/test/cases/dup_test.rb +54 -27
- data/test/cases/enum_test.rb +461 -82
- data/test/cases/errors_test.rb +7 -7
- data/test/cases/explain_subscriber_test.rb +17 -15
- data/test/cases/explain_test.rb +11 -19
- data/test/cases/filter_attributes_test.rb +153 -0
- data/test/cases/finder_respond_to_test.rb +14 -14
- data/test/cases/finder_test.rb +669 -287
- data/test/cases/fixture_set/file_test.rb +34 -38
- data/test/cases/fixtures_test.rb +833 -176
- data/test/cases/forbidden_attributes_protection_test.rb +32 -67
- data/test/cases/habtm_destroy_order_test.rb +25 -25
- data/test/cases/helper.rb +78 -49
- data/test/cases/hot_compatibility_test.rb +33 -32
- data/test/cases/i18n_test.rb +18 -17
- data/test/cases/inheritance_test.rb +180 -115
- data/test/cases/insert_all_test.rb +489 -0
- data/test/cases/instrumentation_test.rb +101 -0
- data/test/cases/integration_test.rb +119 -31
- data/test/cases/invalid_connection_test.rb +18 -16
- data/test/cases/invertible_migration_test.rb +183 -43
- data/test/cases/json_attribute_test.rb +35 -0
- data/test/cases/json_serialization_test.rb +57 -58
- data/test/cases/json_shared_test_cases.rb +290 -0
- data/test/cases/locking_test.rb +413 -119
- data/test/cases/log_subscriber_test.rb +68 -26
- data/test/cases/marshal_serialization_test.rb +39 -0
- data/test/cases/migration/change_schema_test.rb +118 -72
- data/test/cases/migration/change_table_test.rb +138 -30
- data/test/cases/migration/check_constraint_test.rb +162 -0
- data/test/cases/migration/column_attributes_test.rb +45 -35
- data/test/cases/migration/column_positioning_test.rb +18 -6
- data/test/cases/migration/columns_test.rb +93 -77
- data/test/cases/migration/command_recorder_test.rb +121 -34
- data/test/cases/migration/compatibility_test.rb +578 -23
- data/test/cases/migration/create_join_table_test.rb +35 -25
- data/test/cases/migration/foreign_key_test.rb +503 -284
- data/test/cases/migration/helper.rb +4 -3
- data/test/cases/migration/index_test.rb +119 -70
- data/test/cases/migration/logger_test.rb +9 -6
- data/test/cases/migration/pending_migrations_test.rb +88 -34
- data/test/cases/migration/references_foreign_key_test.rb +164 -150
- data/test/cases/migration/references_index_test.rb +38 -19
- data/test/cases/migration/references_statements_test.rb +15 -14
- data/test/cases/migration/rename_table_test.rb +53 -30
- data/test/cases/migration_test.rb +637 -269
- data/test/cases/migrator_test.rb +191 -135
- data/test/cases/mixin_test.rb +7 -11
- data/test/cases/modules_test.rb +36 -34
- data/test/cases/multi_db_migrator_test.rb +223 -0
- data/test/cases/multiparameter_attributes_test.rb +60 -33
- data/test/cases/multiple_db_test.rb +16 -22
- data/test/cases/nested_attributes_test.rb +341 -320
- data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
- data/test/cases/null_relation_test.rb +84 -0
- data/test/cases/numeric_data_test.rb +93 -0
- data/test/cases/persistence_test.rb +361 -269
- data/test/cases/pooled_connections_test.rb +18 -26
- data/test/cases/prepared_statement_status_test.rb +48 -0
- data/test/cases/primary_keys_test.rb +210 -104
- data/test/cases/query_cache_test.rb +610 -141
- data/test/cases/quoting_test.rb +132 -31
- data/test/cases/readonly_test.rb +49 -48
- data/test/cases/reaper_test.rb +146 -32
- data/test/cases/reflection_test.rb +167 -156
- data/test/cases/relation/delegation_test.rb +49 -36
- data/test/cases/relation/delete_all_test.rb +117 -0
- data/test/cases/relation/merging_test.rb +319 -42
- data/test/cases/relation/mutation_test.rb +55 -93
- data/test/cases/relation/or_test.rb +129 -29
- data/test/cases/relation/predicate_builder_test.rb +21 -6
- data/test/cases/relation/record_fetch_warning_test.rb +5 -3
- data/test/cases/relation/select_test.rb +67 -0
- data/test/cases/relation/update_all_test.rb +317 -0
- data/test/cases/relation/where_chain_test.rb +68 -32
- data/test/cases/relation/where_clause_test.rb +136 -61
- data/test/cases/relation/where_test.rb +155 -48
- data/test/cases/relation_test.rb +266 -112
- data/test/cases/relations_test.rb +969 -744
- data/test/cases/reload_models_test.rb +13 -9
- data/test/cases/reserved_word_test.rb +141 -0
- data/test/cases/result_test.rb +68 -17
- data/test/cases/sanitize_test.rb +87 -71
- data/test/cases/schema_dumper_test.rb +221 -128
- data/test/cases/schema_loading_test.rb +3 -2
- data/test/cases/scoping/default_scoping_test.rb +185 -144
- data/test/cases/scoping/named_scoping_test.rb +177 -89
- data/test/cases/scoping/relation_scoping_test.rb +197 -75
- data/test/cases/secure_token_test.rb +18 -3
- data/test/cases/serialization_test.rb +30 -28
- data/test/cases/serialized_attribute_test.rb +133 -42
- data/test/cases/signed_id_test.rb +168 -0
- data/test/cases/statement_cache_test.rb +41 -24
- data/test/cases/statement_invalid_test.rb +42 -0
- data/test/cases/store_test.rb +180 -55
- data/test/cases/strict_loading_test.rb +473 -0
- data/test/cases/suppressor_test.rb +26 -12
- data/test/cases/tasks/database_tasks_test.rb +1258 -194
- data/test/cases/tasks/mysql_rake_test.rb +370 -298
- data/test/cases/tasks/postgresql_rake_test.rb +481 -251
- data/test/cases/tasks/sqlite_rake_test.rb +225 -178
- data/test/cases/test_case.rb +51 -40
- data/test/cases/test_databases_test.rb +79 -0
- data/test/cases/test_fixtures_test.rb +79 -19
- data/test/cases/time_precision_test.rb +98 -76
- data/test/cases/timestamp_test.rb +102 -99
- data/test/cases/touch_later_test.rb +12 -10
- data/test/cases/transaction_callbacks_test.rb +344 -90
- data/test/cases/transaction_isolation_test.rb +12 -12
- data/test/cases/transactions_test.rb +612 -162
- data/test/cases/type/adapter_specific_registry_test.rb +14 -2
- data/test/cases/type/date_time_test.rb +4 -2
- data/test/cases/type/integer_test.rb +4 -2
- data/test/cases/type/string_test.rb +10 -8
- data/test/cases/type/time_test.rb +28 -0
- data/test/cases/type/type_map_test.rb +29 -28
- data/test/cases/type/unsigned_integer_test.rb +19 -0
- data/test/cases/type_test.rb +2 -0
- data/test/cases/types_test.rb +3 -1
- data/test/cases/unconnected_test.rb +14 -1
- data/test/cases/unsafe_raw_sql_test.rb +274 -0
- data/test/cases/validations/absence_validation_test.rb +19 -17
- data/test/cases/validations/association_validation_test.rb +30 -28
- data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
- data/test/cases/validations/i18n_validation_test.rb +22 -21
- data/test/cases/validations/length_validation_test.rb +34 -33
- data/test/cases/validations/numericality_validation_test.rb +181 -0
- data/test/cases/validations/presence_validation_test.rb +21 -19
- data/test/cases/validations/uniqueness_validation_test.rb +156 -86
- data/test/cases/validations_repair_helper.rb +2 -0
- data/test/cases/validations_test.rb +61 -26
- data/test/cases/view_test.rb +122 -116
- data/test/cases/yaml_serialization_test.rb +79 -34
- data/test/config.example.yml +19 -19
- data/test/config.rb +3 -1
- data/test/config.yml +16 -6
- data/test/fixtures/all/namespaced/accounts.yml +2 -0
- data/test/fixtures/author_addresses.yml +1 -8
- data/test/fixtures/authors.yml +1 -7
- data/test/fixtures/binaries.yml +4 -0
- data/test/fixtures/books.yml +9 -2
- data/test/fixtures/categories_posts.yml +3 -0
- data/test/fixtures/citations.yml +5 -0
- data/test/fixtures/comments.yml +7 -0
- data/test/fixtures/companies.yml +5 -0
- data/test/fixtures/computers.yml +2 -0
- data/test/fixtures/customers.yml +10 -1
- data/test/fixtures/developers.yml +1 -1
- data/test/fixtures/essays.yml +10 -0
- data/test/fixtures/faces.yml +3 -3
- data/test/fixtures/humans.yml +5 -0
- data/test/fixtures/interests.yml +7 -7
- data/test/fixtures/memberships.yml +7 -0
- data/test/fixtures/minimalistics.yml +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +2 -2
- data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
- data/test/fixtures/naked/yml/parrots.yml +1 -0
- data/test/fixtures/other_books.yml +26 -0
- data/test/fixtures/other_posts.yml +1 -0
- data/test/fixtures/parrots.yml +7 -1
- data/test/fixtures/pirates.yml +3 -0
- data/test/fixtures/posts.yml +11 -3
- data/test/fixtures/readers.yml +6 -0
- data/test/fixtures/reserved_words/values.yml +2 -2
- data/test/fixtures/sponsors.yml +3 -0
- data/test/fixtures/strict_zines.yml +2 -0
- data/test/fixtures/subscribers.yml +1 -1
- data/test/fixtures/tasks.yml +1 -1
- data/test/fixtures/warehouse-things.yml +3 -0
- data/test/migrations/10_urban/9_add_expressions.rb +2 -0
- data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
- data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
- data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
- data/test/migrations/missing/1_people_have_last_names.rb +2 -0
- data/test/migrations/missing/3_we_need_reminders.rb +2 -0
- data/test/migrations/missing/4_innocent_jointable.rb +3 -1
- data/test/migrations/rename/1_we_need_things.rb +2 -0
- data/test/migrations/rename/2_rename_things.rb +2 -0
- data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy2/1_create_articles.rb +2 -0
- data/test/migrations/to_copy2/2_create_comments.rb +3 -1
- data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
- data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
- data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
- data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
- data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
- data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
- data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
- data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
- data/test/models/account.rb +46 -0
- data/test/models/admin/account.rb +3 -1
- data/test/models/admin/randomly_named_c1.rb +2 -0
- data/test/models/admin/user.rb +16 -8
- data/test/models/admin.rb +4 -2
- data/test/models/aircraft.rb +3 -1
- data/test/models/arunit2_model.rb +2 -0
- data/test/models/author.rb +153 -102
- data/test/models/auto_id.rb +2 -0
- data/test/models/autoloadable/extra_firm.rb +2 -0
- data/test/models/binary.rb +3 -1
- data/test/models/binary_field.rb +6 -0
- data/test/models/bird.rb +13 -1
- data/test/models/book.rb +14 -4
- data/test/models/book_destroy_async.rb +24 -0
- data/test/models/boolean.rb +5 -0
- data/test/models/bulb.rb +13 -4
- data/test/models/cake_designer.rb +2 -0
- data/test/models/car.rb +17 -10
- data/test/models/carrier.rb +2 -0
- data/test/models/cart.rb +5 -0
- data/test/models/cat.rb +2 -0
- data/test/models/categorization.rb +8 -6
- data/test/models/category.rb +28 -16
- data/test/models/chef.rb +2 -0
- data/test/models/citation.rb +5 -1
- data/test/models/club.rb +13 -10
- data/test/models/college.rb +4 -2
- data/test/models/column.rb +2 -0
- data/test/models/column_name.rb +2 -0
- data/test/models/comment.rb +32 -10
- data/test/models/company.rb +102 -106
- data/test/models/company_in_module.rb +27 -26
- data/test/models/computer.rb +3 -1
- data/test/models/contact.rb +15 -13
- data/test/models/content.rb +5 -3
- data/test/models/contract.rb +21 -3
- data/test/models/country.rb +2 -4
- data/test/models/course.rb +3 -1
- data/test/models/customer.rb +10 -8
- data/test/models/customer_carrier.rb +2 -0
- data/test/models/dashboard.rb +2 -0
- data/test/models/default.rb +2 -0
- data/test/models/department.rb +2 -0
- data/test/models/destroy_async_parent.rb +15 -0
- data/test/models/destroy_async_parent_soft_delete.rb +20 -0
- data/test/models/developer.rb +152 -85
- data/test/models/dl_keyed_belongs_to.rb +13 -0
- data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
- data/test/models/dl_keyed_has_many.rb +5 -0
- data/test/models/dl_keyed_has_many_through.rb +5 -0
- data/test/models/dl_keyed_has_one.rb +5 -0
- data/test/models/dl_keyed_join.rb +10 -0
- data/test/models/dog.rb +2 -0
- data/test/models/dog_lover.rb +2 -0
- data/test/models/doubloon.rb +3 -1
- data/test/models/drink_designer.rb +17 -0
- data/test/models/edge.rb +4 -2
- data/test/models/electron.rb +2 -0
- data/test/models/engine.rb +3 -2
- data/test/models/entrant.rb +2 -0
- data/test/models/entry.rb +5 -0
- data/test/models/essay.rb +6 -3
- data/test/models/essay_destroy_async.rb +12 -0
- data/test/models/event.rb +3 -1
- data/test/models/eye.rb +5 -3
- data/test/models/face.rb +14 -6
- data/test/models/family.rb +6 -0
- data/test/models/family_tree.rb +6 -0
- data/test/models/friendship.rb +5 -3
- data/test/models/frog.rb +8 -0
- data/test/models/guid.rb +3 -1
- data/test/models/guitar.rb +2 -0
- data/test/models/hotel.rb +5 -3
- data/test/models/human.rb +39 -0
- data/test/models/image.rb +3 -1
- data/test/models/interest.rb +14 -3
- data/test/models/invoice.rb +4 -2
- data/test/models/item.rb +3 -1
- data/test/models/job.rb +5 -3
- data/test/models/joke.rb +4 -2
- data/test/models/keyboard.rb +3 -1
- data/test/models/legacy_thing.rb +2 -0
- data/test/models/lesson.rb +2 -0
- data/test/models/line_item.rb +3 -1
- data/test/models/liquid.rb +2 -0
- data/test/models/matey.rb +3 -1
- data/test/models/measurement.rb +4 -0
- data/test/models/member.rb +23 -20
- data/test/models/member_detail.rb +3 -0
- data/test/models/member_type.rb +2 -0
- data/test/models/membership.rb +4 -1
- data/test/models/mentor.rb +3 -1
- data/test/models/message.rb +5 -0
- data/test/models/minimalistic.rb +2 -0
- data/test/models/minivan.rb +3 -2
- data/test/models/mixed_case_monkey.rb +3 -1
- data/test/models/molecule.rb +2 -0
- data/test/models/mouse.rb +6 -0
- data/test/models/movie.rb +2 -0
- data/test/models/node.rb +4 -2
- data/test/models/non_primary_key.rb +2 -0
- data/test/models/notification.rb +2 -0
- data/test/models/numeric_data.rb +12 -0
- data/test/models/order.rb +4 -2
- data/test/models/organization.rb +9 -7
- data/test/models/other_dog.rb +3 -1
- data/test/models/owner.rb +6 -4
- data/test/models/parrot.rb +12 -4
- data/test/models/person.rb +59 -54
- data/test/models/personal_legacy_thing.rb +3 -1
- data/test/models/pet.rb +4 -2
- data/test/models/pet_treasure.rb +2 -0
- data/test/models/pirate.rb +67 -43
- data/test/models/possession.rb +3 -1
- data/test/models/post.rb +184 -86
- data/test/models/price_estimate.rb +11 -1
- data/test/models/professor.rb +3 -1
- data/test/models/project.rb +14 -12
- data/test/models/publisher/article.rb +2 -0
- data/test/models/publisher/magazine.rb +2 -0
- data/test/models/publisher.rb +2 -0
- data/test/models/randomly_named_c1.rb +2 -0
- data/test/models/rating.rb +5 -1
- data/test/models/reader.rb +7 -5
- data/test/models/recipe.rb +2 -0
- data/test/models/record.rb +2 -0
- data/test/models/reference.rb +6 -3
- data/test/models/reply.rb +39 -21
- data/test/models/room.rb +6 -0
- data/test/models/section.rb +6 -0
- data/test/models/seminar.rb +6 -0
- data/test/models/session.rb +6 -0
- data/test/models/ship.rb +12 -9
- data/test/models/ship_part.rb +5 -3
- data/test/models/shop.rb +4 -2
- data/test/models/shop_account.rb +2 -0
- data/test/models/speedometer.rb +2 -0
- data/test/models/sponsor.rb +8 -5
- data/test/models/squeak.rb +6 -0
- data/test/models/strict_zine.rb +7 -0
- data/test/models/string_key_object.rb +2 -0
- data/test/models/student.rb +2 -0
- data/test/models/subscriber.rb +4 -2
- data/test/models/subscription.rb +5 -1
- data/test/models/tag.rb +6 -3
- data/test/models/tagging.rb +13 -6
- data/test/models/task.rb +2 -0
- data/test/models/topic.rb +54 -19
- data/test/models/toy.rb +4 -0
- data/test/models/traffic_light.rb +2 -0
- data/test/models/treasure.rb +5 -3
- data/test/models/treaty.rb +2 -4
- data/test/models/tree.rb +2 -0
- data/test/models/tuning_peg.rb +2 -0
- data/test/models/tyre.rb +2 -0
- data/test/models/user.rb +12 -4
- data/test/models/uuid_child.rb +2 -0
- data/test/models/uuid_item.rb +2 -0
- data/test/models/uuid_parent.rb +2 -0
- data/test/models/vegetables.rb +12 -3
- data/test/models/vertex.rb +6 -4
- data/test/models/warehouse_thing.rb +2 -0
- data/test/models/wheel.rb +3 -1
- data/test/models/without_table.rb +3 -1
- data/test/models/zine.rb +3 -1
- data/test/schema/mysql2_specific_schema.rb +49 -35
- data/test/schema/oracle_specific_schema.rb +13 -15
- data/test/schema/postgresql_specific_schema.rb +51 -40
- data/test/schema/schema.rb +334 -154
- data/test/schema/sqlite_specific_schema.rb +9 -16
- data/test/support/config.rb +26 -26
- data/test/support/connection.rb +14 -8
- data/test/support/connection_helper.rb +3 -1
- data/test/support/ddl_helper.rb +2 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
- data/test/support/schema_dumping_helper.rb +2 -0
- data/test/support/stubs/strong_parameters.rb +40 -0
- data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
- data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
- metadata +192 -14
@@ -1,45 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "cases/helper"
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
4
|
+
require "models/tag"
|
5
|
+
require "models/tagging"
|
6
|
+
require "models/post"
|
7
|
+
require "models/topic"
|
8
|
+
require "models/comment"
|
9
|
+
require "models/author"
|
10
|
+
require "models/entrant"
|
11
|
+
require "models/developer"
|
12
|
+
require "models/project"
|
13
|
+
require "models/person"
|
14
|
+
require "models/computer"
|
15
|
+
require "models/reply"
|
16
|
+
require "models/company"
|
17
|
+
require "models/contract"
|
18
|
+
require "models/bird"
|
19
|
+
require "models/car"
|
20
|
+
require "models/engine"
|
21
|
+
require "models/tyre"
|
22
|
+
require "models/minivan"
|
19
23
|
require "models/possession"
|
20
24
|
require "models/reader"
|
25
|
+
require "models/category"
|
21
26
|
require "models/categorization"
|
22
27
|
require "models/edge"
|
28
|
+
require "models/subscriber"
|
23
29
|
|
24
30
|
class RelationTest < ActiveRecord::TestCase
|
25
|
-
fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments,
|
26
|
-
:tags, :taggings, :cars, :minivans
|
27
|
-
|
28
|
-
class TopicWithCallbacks < ActiveRecord::Base
|
29
|
-
self.table_name = :topics
|
30
|
-
before_update { |topic| topic.author_name = 'David' if topic.author_name.blank? }
|
31
|
-
end
|
31
|
+
fixtures :authors, :author_addresses, :topics, :entrants, :developers, :people, :companies, :developers_projects, :accounts, :categories, :categorizations, :categories_posts, :posts, :comments, :tags, :taggings, :cars, :minivans
|
32
32
|
|
33
33
|
def test_do_not_double_quote_string_id
|
34
34
|
van = Minivan.last
|
35
35
|
assert van
|
36
|
-
assert_equal van.id, Minivan.where(:
|
36
|
+
assert_equal van.id, Minivan.where(minivan_id: van).to_a.first.minivan_id
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_do_not_double_quote_string_id_with_array
|
40
40
|
van = Minivan.last
|
41
41
|
assert van
|
42
|
-
assert_equal van, Minivan.where(:
|
42
|
+
assert_equal van, Minivan.where(minivan_id: [van]).to_a.first
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_two_scopes_with_includes_should_not_drop_any_include
|
@@ -54,12 +54,12 @@ class RelationTest < ActiveRecord::TestCase
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_dynamic_finder
|
57
|
-
x = Post.where(
|
58
|
-
|
57
|
+
x = Post.where("author_id = ?", 1)
|
58
|
+
assert_respond_to x.klass, :find_by_id
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_multivalue_where
|
62
|
-
posts = Post.where(
|
62
|
+
posts = Post.where("author_id = ? AND id = ?", 1, 1)
|
63
63
|
assert_equal 1, posts.to_a.size
|
64
64
|
end
|
65
65
|
|
@@ -93,50 +93,54 @@ class RelationTest < ActiveRecord::TestCase
|
|
93
93
|
def test_loaded_all
|
94
94
|
topics = Topic.all
|
95
95
|
|
96
|
+
assert_not_predicate topics, :loaded?
|
97
|
+
assert_not_predicate topics, :loaded
|
98
|
+
|
96
99
|
assert_queries(1) do
|
97
100
|
2.times { assert_equal 5, topics.to_a.size }
|
98
101
|
end
|
99
102
|
|
100
|
-
|
103
|
+
assert_predicate topics, :loaded?
|
104
|
+
assert_predicate topics, :loaded
|
101
105
|
end
|
102
106
|
|
103
107
|
def test_scoped_first
|
104
|
-
topics = Topic.all.order(
|
108
|
+
topics = Topic.all.order("id ASC")
|
105
109
|
|
106
110
|
assert_queries(1) do
|
107
111
|
2.times { assert_equal "The First Topic", topics.first.title }
|
108
112
|
end
|
109
113
|
|
110
|
-
|
114
|
+
assert_not_predicate topics, :loaded?
|
111
115
|
end
|
112
116
|
|
113
117
|
def test_loaded_first
|
114
|
-
topics = Topic.all.order(
|
115
|
-
topics.
|
118
|
+
topics = Topic.all.order("id ASC")
|
119
|
+
topics.load # force load
|
116
120
|
|
117
121
|
assert_no_queries do
|
118
122
|
assert_equal "The First Topic", topics.first.title
|
119
123
|
end
|
120
124
|
|
121
|
-
|
125
|
+
assert_predicate topics, :loaded?
|
122
126
|
end
|
123
127
|
|
124
128
|
def test_loaded_first_with_limit
|
125
|
-
topics = Topic.all.order(
|
126
|
-
topics.
|
129
|
+
topics = Topic.all.order("id ASC")
|
130
|
+
topics.load # force load
|
127
131
|
|
128
132
|
assert_no_queries do
|
129
133
|
assert_equal ["The First Topic",
|
130
134
|
"The Second Topic of the day"], topics.first(2).map(&:title)
|
131
135
|
end
|
132
136
|
|
133
|
-
|
137
|
+
assert_predicate topics, :loaded?
|
134
138
|
end
|
135
139
|
|
136
140
|
def test_first_get_more_than_available
|
137
|
-
topics = Topic.all.order(
|
141
|
+
topics = Topic.all.order("id ASC")
|
138
142
|
unloaded_first = topics.first(10)
|
139
|
-
topics.
|
143
|
+
topics.load # force load
|
140
144
|
|
141
145
|
assert_no_queries do
|
142
146
|
loaded_first = topics.first(10)
|
@@ -151,28 +155,28 @@ class RelationTest < ActiveRecord::TestCase
|
|
151
155
|
2.times { topics.to_a }
|
152
156
|
end
|
153
157
|
|
154
|
-
|
158
|
+
assert_predicate topics, :loaded?
|
155
159
|
|
156
160
|
original_size = topics.to_a.size
|
157
|
-
Topic.create! :
|
161
|
+
Topic.create! title: "fake"
|
158
162
|
|
159
163
|
assert_queries(1) { topics.reload }
|
160
164
|
assert_equal original_size + 1, topics.size
|
161
|
-
|
165
|
+
assert_predicate topics, :loaded?
|
162
166
|
end
|
163
167
|
|
164
168
|
def test_finding_with_subquery
|
165
|
-
relation = Topic.where(:
|
166
|
-
assert_equal relation.to_a, Topic.select(
|
167
|
-
assert_equal relation.to_a, Topic.select(
|
168
|
-
assert_equal relation.to_a, Topic.select(
|
169
|
+
relation = Topic.where(approved: true)
|
170
|
+
assert_equal relation.to_a, Topic.select("*").from(relation).to_a
|
171
|
+
assert_equal relation.to_a, Topic.select("subquery.*").from(relation).to_a
|
172
|
+
assert_equal relation.to_a, Topic.select("a.*").from(relation, :a).to_a
|
169
173
|
end
|
170
174
|
|
171
175
|
def test_finding_with_subquery_with_binds
|
172
176
|
relation = Post.first.comments
|
173
|
-
assert_equal relation.to_a, Comment.select(
|
174
|
-
assert_equal relation.to_a, Comment.select(
|
175
|
-
assert_equal relation.to_a, Comment.select(
|
177
|
+
assert_equal relation.to_a, Comment.select("*").from(relation).to_a
|
178
|
+
assert_equal relation.to_a, Comment.select("subquery.*").from(relation).to_a
|
179
|
+
assert_equal relation.to_a, Comment.select("a.*").from(relation, :a).to_a
|
176
180
|
end
|
177
181
|
|
178
182
|
def test_finding_with_subquery_without_select_does_not_change_the_select
|
@@ -182,26 +186,91 @@ class RelationTest < ActiveRecord::TestCase
|
|
182
186
|
end
|
183
187
|
end
|
184
188
|
|
189
|
+
def test_select_with_from_includes_original_table_name
|
190
|
+
relation = Comment.joins(:post).select(:id).order(:id)
|
191
|
+
subquery = Comment.from("#{Comment.table_name} /*! USE INDEX (PRIMARY) */").joins(:post).select(:id).order(:id)
|
192
|
+
assert_equal relation.map(&:id), subquery.map(&:id)
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_pluck_with_from_includes_original_table_name
|
196
|
+
relation = Comment.joins(:post).order(:id)
|
197
|
+
subquery = Comment.from("#{Comment.table_name} /*! USE INDEX (PRIMARY) */").joins(:post).order(:id)
|
198
|
+
assert_equal relation.pluck(:id), subquery.pluck(:id)
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_select_with_from_includes_quoted_original_table_name
|
202
|
+
relation = Comment.joins(:post).select(:id).order(:id)
|
203
|
+
subquery = Comment.from("#{Comment.quoted_table_name} /*! USE INDEX (PRIMARY) */").joins(:post).select(:id).order(:id)
|
204
|
+
assert_equal relation.map(&:id), subquery.map(&:id)
|
205
|
+
end
|
206
|
+
|
207
|
+
def test_pluck_with_from_includes_quoted_original_table_name
|
208
|
+
relation = Comment.joins(:post).order(:id)
|
209
|
+
subquery = Comment.from("#{Comment.quoted_table_name} /*! USE INDEX (PRIMARY) */").joins(:post).order(:id)
|
210
|
+
assert_equal relation.pluck(:id), subquery.pluck(:id)
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_select_with_subquery_in_from_uses_original_table_name
|
214
|
+
puts "test_select_with_subquery_in_from_uses_original_table_name"
|
215
|
+
relation = Comment.joins(:post).select(:id).order(:id)
|
216
|
+
puts "After relation"
|
217
|
+
# Avoid subquery flattening by adding distinct to work with SQLite < 3.20.0.
|
218
|
+
subquery = Comment.from(Comment.all.distinct, Comment.quoted_table_name).joins(:post).select(:id).order(:id)
|
219
|
+
puts "After subquery"
|
220
|
+
assert_equal relation.map(&:id), subquery.map(&:id)
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_pluck_with_subquery_in_from_uses_original_table_name
|
224
|
+
relation = Comment.joins(:post).order(:id)
|
225
|
+
subquery = Comment.from(Comment.all, Comment.quoted_table_name).joins(:post).order(:id)
|
226
|
+
assert_equal relation.pluck(:id), subquery.pluck(:id)
|
227
|
+
end
|
228
|
+
|
185
229
|
def test_select_with_subquery_in_from_does_not_use_original_table_name
|
186
|
-
relation = Comment.group(:type).select(
|
187
|
-
subquery = Comment.from(relation).select(
|
188
|
-
assert_equal(relation.map(&:post_count).sort,subquery.map(&:post_count).sort)
|
230
|
+
relation = Comment.group(:type).select("COUNT(post_id) AS post_count, type")
|
231
|
+
subquery = Comment.from(relation, "grouped_#{Comment.table_name}").select("type", "post_count")
|
232
|
+
assert_equal(relation.map(&:post_count).sort, subquery.map(&:post_count).sort)
|
189
233
|
end
|
190
234
|
|
191
235
|
def test_group_with_subquery_in_from_does_not_use_original_table_name
|
192
|
-
relation = Comment.group(:type).select(
|
193
|
-
subquery = Comment.from(relation).group(
|
194
|
-
assert_equal(relation.map(&:post_count).sort,subquery.values.sort)
|
236
|
+
relation = Comment.group(:type).select("COUNT(post_id) AS post_count,type")
|
237
|
+
subquery = Comment.from(relation, "grouped_#{Comment.table_name}").group("type").average("post_count")
|
238
|
+
assert_equal(relation.map(&:post_count).sort, subquery.values.sort)
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_select_with_subquery_string_in_from_does_not_use_original_table_name
|
242
|
+
relation = Comment.group(:type).select("COUNT(post_id) AS post_count, type")
|
243
|
+
subquery = Comment.from("(#{relation.to_sql}) #{Comment.table_name}_grouped").select("type", "post_count")
|
244
|
+
assert_equal(relation.map(&:post_count).sort, subquery.map(&:post_count).sort)
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_group_with_subquery_string_in_from_does_not_use_original_table_name
|
248
|
+
puts "test_group_with_subquery_string_in_from_does_not_use_original_table_name"
|
249
|
+
relation = Comment.group(:type).select("COUNT(post_id) AS post_count,type")
|
250
|
+
subquery = Comment.from("(#{relation.to_sql}) #{Comment.table_name}_grouped").group("type").average("post_count")
|
251
|
+
assert_equal(relation.map(&:post_count).sort, subquery.values.sort)
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_finding_with_subquery_with_eager_loading_in_from
|
255
|
+
relation = Comment.includes(:post).where("posts.type": "Post").order(:id)
|
256
|
+
assert_equal relation.to_a, Comment.select("*").from(relation).to_a
|
257
|
+
assert_equal relation.to_a, Comment.select("subquery.*").from(relation).to_a
|
258
|
+
assert_equal relation.to_a, Comment.select("a.*").from(relation, :a).to_a
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_finding_with_subquery_with_eager_loading_in_where
|
262
|
+
relation = Comment.includes(:post).where("posts.type": "Post")
|
263
|
+
assert_equal relation.sort_by(&:id), Comment.where(id: relation).sort_by(&:id)
|
195
264
|
end
|
196
265
|
|
197
266
|
def test_finding_with_conditions
|
198
|
-
assert_equal ["David"], Author.where(:
|
199
|
-
assert_equal [
|
200
|
-
assert_equal [
|
267
|
+
assert_equal ["David"], Author.where(name: "David").map(&:name)
|
268
|
+
assert_equal ["Mary"], Author.where(["name = ?", "Mary"]).map(&:name)
|
269
|
+
assert_equal ["Mary"], Author.where("name = ?", "Mary").map(&:name)
|
201
270
|
end
|
202
271
|
|
203
272
|
def test_finding_with_order
|
204
|
-
topics = Topic.order(
|
273
|
+
topics = Topic.order("id")
|
205
274
|
assert_equal 5, topics.to_a.size
|
206
275
|
assert_equal topics(:first).title, topics.first.title
|
207
276
|
end
|
@@ -213,20 +282,42 @@ class RelationTest < ActiveRecord::TestCase
|
|
213
282
|
end
|
214
283
|
|
215
284
|
def test_finding_with_assoc_order
|
216
|
-
topics = Topic.order(:
|
285
|
+
topics = Topic.order(id: :desc)
|
217
286
|
assert_equal 5, topics.to_a.size
|
218
287
|
assert_equal topics(:fifth).title, topics.first.title
|
219
288
|
end
|
220
289
|
|
221
|
-
def
|
222
|
-
topics = Topic.order(
|
290
|
+
def test_finding_with_arel_assoc_order
|
291
|
+
topics = Topic.order(Arel.sql("id") => :desc)
|
292
|
+
assert_equal 5, topics.to_a.size
|
293
|
+
assert_equal topics(:fifth).title, topics.first.title
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_finding_with_reversed_assoc_order
|
297
|
+
topics = Topic.order(id: :asc).reverse_order
|
298
|
+
assert_equal 5, topics.to_a.size
|
299
|
+
assert_equal topics(:fifth).title, topics.first.title
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_finding_with_reversed_arel_assoc_order
|
303
|
+
topics = Topic.order(Arel.sql("id") => :asc).reverse_order
|
223
304
|
assert_equal 5, topics.to_a.size
|
224
305
|
assert_equal topics(:fifth).title, topics.first.title
|
225
306
|
end
|
226
307
|
|
227
308
|
def test_reverse_order_with_function
|
228
|
-
topics = Topic.order("
|
229
|
-
assert_equal topics(:
|
309
|
+
topics = Topic.order("lower(title)").reverse_order
|
310
|
+
assert_equal topics(:third).title, topics.first.title
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_reverse_arel_order_with_function
|
314
|
+
topics = Topic.order(Topic.arel_table[:title].lower).reverse_order
|
315
|
+
assert_equal topics(:third).title, topics.first.title
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_reverse_arel_assoc_order_with_function
|
319
|
+
topics = Topic.order(Arel.sql("lower(title)") => :asc).reverse_order
|
320
|
+
assert_equal topics(:third).title, topics.first.title
|
230
321
|
end
|
231
322
|
|
232
323
|
def test_reverse_order_with_function_other_predicates
|
@@ -238,16 +329,22 @@ class RelationTest < ActiveRecord::TestCase
|
|
238
329
|
|
239
330
|
def test_reverse_order_with_multiargument_function
|
240
331
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
241
|
-
Topic.order("concat(author_name, title)").reverse_order
|
332
|
+
Topic.order(Arel.sql("concat(author_name, title)")).reverse_order
|
242
333
|
end
|
243
334
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
244
|
-
Topic.order("concat(lower(author_name), title)").reverse_order
|
335
|
+
Topic.order(Arel.sql("concat(lower(author_name), title)")).reverse_order
|
245
336
|
end
|
246
337
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
247
|
-
Topic.order("concat(author_name, lower(title))").reverse_order
|
338
|
+
Topic.order(Arel.sql("concat(author_name, lower(title))")).reverse_order
|
248
339
|
end
|
249
340
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
250
|
-
Topic.order("concat(lower(author_name), title, length(title)").reverse_order
|
341
|
+
Topic.order(Arel.sql("concat(lower(author_name), title, length(title)")).reverse_order
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
def test_reverse_arel_assoc_order_with_multiargument_function
|
346
|
+
assert_nothing_raised do
|
347
|
+
Topic.order(Arel.sql("REPLACE(title, '', '')") => :asc).reverse_order
|
251
348
|
end
|
252
349
|
end
|
253
350
|
|
@@ -255,10 +352,19 @@ class RelationTest < ActiveRecord::TestCase
|
|
255
352
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
256
353
|
Topic.order("title NULLS FIRST").reverse_order
|
257
354
|
end
|
355
|
+
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
356
|
+
Topic.order("title NULLS FIRST").reverse_order
|
357
|
+
end
|
258
358
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
259
359
|
Topic.order("title nulls last").reverse_order
|
260
360
|
end
|
261
|
-
|
361
|
+
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
362
|
+
Topic.order("title NULLS FIRST, author_name").reverse_order
|
363
|
+
end
|
364
|
+
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
365
|
+
Topic.order("author_name, title nulls last").reverse_order
|
366
|
+
end
|
367
|
+
end if current_adapter?(:PostgreSQLAdapter, :OracleAdapter)
|
262
368
|
|
263
369
|
def test_default_reverse_order_on_table_without_primary_key
|
264
370
|
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
@@ -267,7 +373,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
267
373
|
end
|
268
374
|
|
269
375
|
def test_order_with_hash_and_symbol_generates_the_same_sql
|
270
|
-
assert_equal Topic.order(:id).to_sql, Topic.order(:
|
376
|
+
assert_equal Topic.order(:id).to_sql, Topic.order(id: :asc).to_sql
|
271
377
|
end
|
272
378
|
|
273
379
|
def test_finding_with_desc_order_with_string
|
@@ -277,7 +383,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
277
383
|
end
|
278
384
|
|
279
385
|
def test_finding_with_asc_order_with_string
|
280
|
-
topics = Topic.order(id:
|
386
|
+
topics = Topic.order(id: "asc")
|
281
387
|
assert_equal 5, topics.to_a.size
|
282
388
|
assert_equal [topics(:first), topics(:second), topics(:third), topics(:fourth), topics(:fifth)], topics.to_a
|
283
389
|
end
|
@@ -291,7 +397,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
291
397
|
assert_includes Topic.order(id: "DESC").to_sql, "DESC"
|
292
398
|
assert_includes Topic.order(id: "desc").to_sql, "DESC"
|
293
399
|
assert_includes Topic.order(id: :DESC).to_sql, "DESC"
|
294
|
-
assert_includes Topic.order(id: :desc).to_sql,"DESC"
|
400
|
+
assert_includes Topic.order(id: :desc).to_sql, "DESC"
|
295
401
|
end
|
296
402
|
|
297
403
|
def test_raising_exception_on_invalid_hash_params
|
@@ -305,7 +411,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
305
411
|
end
|
306
412
|
|
307
413
|
def test_finding_with_order_concatenated
|
308
|
-
topics = Topic.order(
|
414
|
+
topics = Topic.order("author_name").order("title")
|
309
415
|
assert_equal 5, topics.to_a.size
|
310
416
|
assert_equal topics(:fourth).title, topics.first.title
|
311
417
|
end
|
@@ -323,19 +429,24 @@ class RelationTest < ActiveRecord::TestCase
|
|
323
429
|
end
|
324
430
|
|
325
431
|
def test_finding_with_reorder
|
326
|
-
topics = Topic.order(
|
432
|
+
topics = Topic.order("author_name").order("title").reorder("id").to_a
|
327
433
|
topics_titles = topics.map(&:title)
|
328
|
-
assert_equal [
|
434
|
+
assert_equal ["The First Topic", "The Second Topic of the day", "The Third Topic of the day", "The Fourth Topic of the day", "The Fifth Topic of the day"], topics_titles
|
435
|
+
end
|
436
|
+
|
437
|
+
def test_reorder_deduplication
|
438
|
+
topics = Topic.reorder("id desc", "id desc")
|
439
|
+
assert_equal ["id desc"], topics.order_values
|
329
440
|
end
|
330
441
|
|
331
442
|
def test_finding_with_reorder_by_aliased_attributes
|
332
|
-
topics = Topic.order(
|
443
|
+
topics = Topic.order("author_name").reorder(:heading)
|
333
444
|
assert_equal 5, topics.to_a.size
|
334
445
|
assert_equal topics(:fifth).title, topics.first.title
|
335
446
|
end
|
336
447
|
|
337
448
|
def test_finding_with_assoc_reorder_by_aliased_attributes
|
338
|
-
topics = Topic.order(
|
449
|
+
topics = Topic.order("author_name").reorder(heading: :desc)
|
339
450
|
assert_equal 5, topics.to_a.size
|
340
451
|
assert_equal topics(:third).title, topics.first.title
|
341
452
|
end
|
@@ -349,29 +460,29 @@ class RelationTest < ActiveRecord::TestCase
|
|
349
460
|
|
350
461
|
def test_finding_with_cross_table_order_and_limit
|
351
462
|
tags = Tag.includes(:taggings).
|
352
|
-
order("tags.name asc", "taggings.taggable_id asc", "REPLACE('abc', taggings.taggable_type, taggings.taggable_type)").
|
463
|
+
order("tags.name asc", "taggings.taggable_id asc", Arel.sql("REPLACE('abc', taggings.taggable_type, taggings.taggable_type)")).
|
353
464
|
limit(1).to_a
|
354
465
|
assert_equal 1, tags.length
|
355
466
|
end
|
356
467
|
|
357
468
|
def test_finding_with_complex_order_and_limit
|
358
|
-
tags = Tag.includes(:taggings).references(:taggings).order("REPLACE('abc', taggings.taggable_type, taggings.taggable_type)").limit(1).to_a
|
469
|
+
tags = Tag.includes(:taggings).references(:taggings).order(Arel.sql("REPLACE('abc', taggings.taggable_type, taggings.taggable_type)")).limit(1).to_a
|
359
470
|
assert_equal 1, tags.length
|
360
471
|
end
|
361
472
|
|
362
473
|
def test_finding_with_complex_order
|
363
|
-
tags = Tag.includes(:taggings).references(:taggings).order("REPLACE('abc', taggings.taggable_type, taggings.taggable_type)").to_a
|
474
|
+
tags = Tag.includes(:taggings).references(:taggings).order(Arel.sql("REPLACE('abc', taggings.taggable_type, taggings.taggable_type)")).to_a
|
364
475
|
assert_equal 3, tags.length
|
365
476
|
end
|
366
477
|
|
367
478
|
def test_finding_with_sanitized_order
|
368
|
-
query = Tag.order(["field(id, ?)", [1,3,2]]).to_sql
|
479
|
+
query = Tag.order([Arel.sql("field(id, ?)"), [1, 3, 2]]).to_sql
|
369
480
|
assert_match(/field\(id, 1,3,2\)/, query)
|
370
481
|
|
371
|
-
query = Tag.order(["field(id, ?)", []]).to_sql
|
482
|
+
query = Tag.order([Arel.sql("field(id, ?)"), []]).to_sql
|
372
483
|
assert_match(/field\(id, NULL\)/, query)
|
373
484
|
|
374
|
-
query = Tag.order(["field(id, ?)", nil]).to_sql
|
485
|
+
query = Tag.order([Arel.sql("field(id, ?)"), nil]).to_sql
|
375
486
|
assert_match(/field\(id, NULL\)/, query)
|
376
487
|
end
|
377
488
|
|
@@ -393,149 +504,32 @@ class RelationTest < ActiveRecord::TestCase
|
|
393
504
|
end
|
394
505
|
|
395
506
|
def test_select_with_block
|
396
|
-
even_ids = Developer.all.select {|d| d.id % 2 == 0 }.map(&:id)
|
507
|
+
even_ids = Developer.all.select { |d| d.id % 2 == 0 }.map(&:id)
|
397
508
|
assert_equal [2, 4, 6, 8, 10], even_ids.sort
|
398
509
|
end
|
399
510
|
|
400
|
-
def test_none
|
401
|
-
assert_no_queries(ignore_none: false) do
|
402
|
-
assert_equal [], Developer.none
|
403
|
-
assert_equal [], Developer.all.none
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
def test_none_chainable
|
408
|
-
assert_no_queries(ignore_none: false) do
|
409
|
-
assert_equal [], Developer.none.where(:name => 'David')
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
def test_none_chainable_to_existing_scope_extension_method
|
414
|
-
assert_no_queries(ignore_none: false) do
|
415
|
-
assert_equal 1, Topic.anonymous_extension.none.one
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
def test_none_chained_to_methods_firing_queries_straight_to_db
|
420
|
-
assert_no_queries(ignore_none: false) do
|
421
|
-
assert_equal [], Developer.none.pluck(:id, :name)
|
422
|
-
assert_equal 0, Developer.none.delete_all
|
423
|
-
assert_equal 0, Developer.none.update_all(:name => 'David')
|
424
|
-
assert_equal 0, Developer.none.delete(1)
|
425
|
-
assert_equal false, Developer.none.exists?(1)
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
def test_null_relation_content_size_methods
|
430
|
-
assert_no_queries(ignore_none: false) do
|
431
|
-
assert_equal 0, Developer.none.size
|
432
|
-
assert_equal 0, Developer.none.count
|
433
|
-
assert_equal true, Developer.none.empty?
|
434
|
-
assert_equal true, Developer.none.none?
|
435
|
-
assert_equal false, Developer.none.any?
|
436
|
-
assert_equal false, Developer.none.one?
|
437
|
-
assert_equal false, Developer.none.many?
|
438
|
-
end
|
439
|
-
end
|
440
|
-
|
441
|
-
def test_null_relation_calculations_methods
|
442
|
-
assert_no_queries(ignore_none: false) do
|
443
|
-
assert_equal 0, Developer.none.count
|
444
|
-
assert_equal 0, Developer.none.calculate(:count, nil)
|
445
|
-
assert_equal nil, Developer.none.calculate(:average, 'salary')
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
449
|
-
def test_null_relation_metadata_methods
|
450
|
-
assert_equal "", Developer.none.to_sql
|
451
|
-
assert_equal({}, Developer.none.where_values_hash)
|
452
|
-
end
|
453
|
-
|
454
|
-
def test_null_relation_where_values_hash
|
455
|
-
assert_equal({ 'salary' => 100_000 }, Developer.none.where(salary: 100_000).where_values_hash)
|
456
|
-
end
|
457
|
-
|
458
|
-
def test_null_relation_sum
|
459
|
-
ac = Aircraft.new
|
460
|
-
assert_equal Hash.new, ac.engines.group(:id).sum(:id)
|
461
|
-
assert_equal 0, ac.engines.count
|
462
|
-
ac.save
|
463
|
-
assert_equal Hash.new, ac.engines.group(:id).sum(:id)
|
464
|
-
assert_equal 0, ac.engines.count
|
465
|
-
end
|
466
|
-
|
467
|
-
def test_null_relation_count
|
468
|
-
ac = Aircraft.new
|
469
|
-
assert_equal Hash.new, ac.engines.group(:id).count
|
470
|
-
assert_equal 0, ac.engines.count
|
471
|
-
ac.save
|
472
|
-
assert_equal Hash.new, ac.engines.group(:id).count
|
473
|
-
assert_equal 0, ac.engines.count
|
474
|
-
end
|
475
|
-
|
476
|
-
def test_null_relation_size
|
477
|
-
ac = Aircraft.new
|
478
|
-
assert_equal Hash.new, ac.engines.group(:id).size
|
479
|
-
assert_equal 0, ac.engines.size
|
480
|
-
ac.save
|
481
|
-
assert_equal Hash.new, ac.engines.group(:id).size
|
482
|
-
assert_equal 0, ac.engines.size
|
483
|
-
end
|
484
|
-
|
485
|
-
def test_null_relation_average
|
486
|
-
ac = Aircraft.new
|
487
|
-
assert_equal Hash.new, ac.engines.group(:car_id).average(:id)
|
488
|
-
assert_equal nil, ac.engines.average(:id)
|
489
|
-
ac.save
|
490
|
-
assert_equal Hash.new, ac.engines.group(:car_id).average(:id)
|
491
|
-
assert_equal nil, ac.engines.average(:id)
|
492
|
-
end
|
493
|
-
|
494
|
-
def test_null_relation_minimum
|
495
|
-
ac = Aircraft.new
|
496
|
-
assert_equal Hash.new, ac.engines.group(:car_id).minimum(:id)
|
497
|
-
assert_equal nil, ac.engines.minimum(:id)
|
498
|
-
ac.save
|
499
|
-
assert_equal Hash.new, ac.engines.group(:car_id).minimum(:id)
|
500
|
-
assert_equal nil, ac.engines.minimum(:id)
|
501
|
-
end
|
502
|
-
|
503
|
-
def test_null_relation_maximum
|
504
|
-
ac = Aircraft.new
|
505
|
-
assert_equal Hash.new, ac.engines.group(:car_id).maximum(:id)
|
506
|
-
assert_equal nil, ac.engines.maximum(:id)
|
507
|
-
ac.save
|
508
|
-
assert_equal Hash.new, ac.engines.group(:car_id).maximum(:id)
|
509
|
-
assert_equal nil, ac.engines.maximum(:id)
|
510
|
-
end
|
511
|
-
|
512
|
-
def test_null_relation_in_where_condition
|
513
|
-
assert_operator Comment.count, :>, 0 # precondition, make sure there are comments.
|
514
|
-
assert_equal 0, Comment.where(post_id: Post.none).to_a.size
|
515
|
-
end
|
516
|
-
|
517
511
|
def test_joins_with_nil_argument
|
518
512
|
assert_nothing_raised { DependentFirm.joins(nil).first }
|
519
513
|
end
|
520
514
|
|
521
515
|
def test_finding_with_hash_conditions_on_joined_table
|
522
|
-
firms = DependentFirm.joins(:account).where(
|
516
|
+
firms = DependentFirm.joins(:account).where(name: "RailsCore", accounts: { credit_limit: 55..60 }).to_a
|
523
517
|
assert_equal 1, firms.size
|
524
518
|
assert_equal companies(:rails_core), firms.first
|
525
519
|
end
|
526
520
|
|
527
521
|
def test_find_all_with_join
|
528
|
-
developers_on_project_one = Developer.joins(
|
529
|
-
where(
|
522
|
+
developers_on_project_one = Developer.joins("LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id").
|
523
|
+
where("project_id=1").to_a
|
530
524
|
|
531
525
|
assert_equal 3, developers_on_project_one.length
|
532
526
|
developer_names = developers_on_project_one.map(&:name)
|
533
|
-
|
534
|
-
|
527
|
+
assert_includes developer_names, "David"
|
528
|
+
assert_includes developer_names, "Jamis"
|
535
529
|
end
|
536
530
|
|
537
531
|
def test_find_on_hash_conditions
|
538
|
-
assert_equal Topic.all.merge!(:
|
532
|
+
assert_equal Topic.all.merge!(where: { approved: false }).to_a, Topic.where(approved: false).to_a
|
539
533
|
end
|
540
534
|
|
541
535
|
def test_joins_with_string_array
|
@@ -553,6 +547,14 @@ class RelationTest < ActiveRecord::TestCase
|
|
553
547
|
assert_raises(ArgumentError) { Topic.preload() }
|
554
548
|
assert_raises(ArgumentError) { Topic.group() }
|
555
549
|
assert_raises(ArgumentError) { Topic.reorder() }
|
550
|
+
assert_raises(ArgumentError) { Topic.order() }
|
551
|
+
assert_raises(ArgumentError) { Topic.eager_load() }
|
552
|
+
assert_raises(ArgumentError) { Topic.reselect() }
|
553
|
+
assert_raises(ArgumentError) { Topic.unscope() }
|
554
|
+
assert_raises(ArgumentError) { Topic.joins() }
|
555
|
+
assert_raises(ArgumentError) { Topic.left_joins() }
|
556
|
+
assert_raises(ArgumentError) { Topic.optimizer_hints() }
|
557
|
+
assert_raises(ArgumentError) { Topic.annotate() }
|
556
558
|
end
|
557
559
|
|
558
560
|
def test_blank_like_arguments_to_query_methods_dont_raise_errors
|
@@ -561,55 +563,36 @@ class RelationTest < ActiveRecord::TestCase
|
|
561
563
|
assert_nothing_raised { Topic.preload([]) }
|
562
564
|
assert_nothing_raised { Topic.group([]) }
|
563
565
|
assert_nothing_raised { Topic.reorder([]) }
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
end
|
573
|
-
|
574
|
-
def test_respond_to_delegates_to_relation
|
575
|
-
relation = Topic.all
|
576
|
-
fake_arel = Struct.new(:responds) {
|
577
|
-
def respond_to? method, access = false
|
578
|
-
responds << [method, access]
|
579
|
-
end
|
580
|
-
}.new []
|
581
|
-
|
582
|
-
relation.extend(Module.new { attr_accessor :arel })
|
583
|
-
relation.arel = fake_arel
|
584
|
-
|
585
|
-
relation.respond_to?(:matching_attributes)
|
586
|
-
assert_equal [:matching_attributes, false], fake_arel.responds.first
|
587
|
-
|
588
|
-
fake_arel.responds = []
|
589
|
-
relation.respond_to?(:matching_attributes, true)
|
590
|
-
assert_equal [:matching_attributes, true], fake_arel.responds.first
|
566
|
+
assert_nothing_raised { Topic.order([]) }
|
567
|
+
assert_nothing_raised { Topic.eager_load([]) }
|
568
|
+
assert_nothing_raised { Topic.reselect([]) }
|
569
|
+
assert_nothing_raised { Topic.unscope([]) }
|
570
|
+
assert_nothing_raised { Topic.joins([]) }
|
571
|
+
assert_nothing_raised { Topic.left_joins([]) }
|
572
|
+
assert_nothing_raised { Topic.optimizer_hints([]) }
|
573
|
+
assert_nothing_raised { Topic.annotate([]) }
|
591
574
|
end
|
592
575
|
|
593
576
|
def test_respond_to_dynamic_finders
|
594
577
|
relation = Topic.all
|
595
578
|
|
596
579
|
["find_by_title", "find_by_title_and_author_name"].each do |method|
|
597
|
-
assert_respond_to relation, method
|
580
|
+
assert_respond_to relation, method
|
598
581
|
end
|
599
582
|
end
|
600
583
|
|
601
584
|
def test_respond_to_class_methods_and_scopes
|
602
|
-
|
585
|
+
assert_respond_to Topic.all, :by_lifo
|
603
586
|
end
|
604
587
|
|
605
588
|
def test_find_with_readonly_option
|
606
|
-
Developer.all.each { |d|
|
589
|
+
Developer.all.each { |d| assert_not d.readonly? }
|
607
590
|
Developer.all.readonly.each { |d| assert d.readonly? }
|
608
591
|
end
|
609
592
|
|
610
593
|
def test_eager_association_loading_of_stis_with_multiple_references
|
611
|
-
authors = Author.eager_load(:
|
612
|
-
order(
|
594
|
+
authors = Author.eager_load(posts: { special_comments: { post: [ :special_comments, :very_special_comment ] } }).
|
595
|
+
order("comments.body, very_special_comments_posts.body").where("posts.id = 4").to_a
|
613
596
|
|
614
597
|
assert_equal [authors(:david)], authors
|
615
598
|
assert_no_queries do
|
@@ -620,27 +603,27 @@ class RelationTest < ActiveRecord::TestCase
|
|
620
603
|
|
621
604
|
def test_find_with_preloaded_associations
|
622
605
|
assert_queries(2) do
|
623
|
-
posts = Post.preload(:comments).order(
|
606
|
+
posts = Post.preload(:comments).order("posts.id")
|
624
607
|
assert posts.first.comments.first
|
625
608
|
end
|
626
609
|
|
627
610
|
assert_queries(2) do
|
628
|
-
posts = Post.preload(:comments).order(
|
611
|
+
posts = Post.preload(:comments).order("posts.id")
|
629
612
|
assert posts.first.comments.first
|
630
613
|
end
|
631
614
|
|
632
615
|
assert_queries(2) do
|
633
|
-
posts = Post.preload(:author).order(
|
616
|
+
posts = Post.preload(:author).order("posts.id")
|
634
617
|
assert posts.first.author
|
635
618
|
end
|
636
619
|
|
637
620
|
assert_queries(2) do
|
638
|
-
posts = Post.preload(:author).order(
|
621
|
+
posts = Post.preload(:author).order("posts.id")
|
639
622
|
assert posts.first.author
|
640
623
|
end
|
641
624
|
|
642
625
|
assert_queries(3) do
|
643
|
-
posts = Post.preload(:author, :comments).order(
|
626
|
+
posts = Post.preload(:author, :comments).order("posts.id")
|
644
627
|
assert posts.first.author
|
645
628
|
assert posts.first.comments.first
|
646
629
|
end
|
@@ -653,60 +636,57 @@ class RelationTest < ActiveRecord::TestCase
|
|
653
636
|
end
|
654
637
|
end
|
655
638
|
|
639
|
+
def test_extracted_association
|
640
|
+
relation_authors = assert_queries(2) { Post.all.extract_associated(:author) }
|
641
|
+
root_authors = assert_queries(2) { Post.extract_associated(:author) }
|
642
|
+
assert_equal relation_authors, root_authors
|
643
|
+
assert_equal Post.all.collect(&:author), relation_authors
|
644
|
+
end
|
645
|
+
|
656
646
|
def test_find_with_included_associations
|
657
647
|
assert_queries(2) do
|
658
|
-
posts = Post.includes(:comments).order(
|
648
|
+
posts = Post.includes(:comments).order("posts.id")
|
659
649
|
assert posts.first.comments.first
|
660
650
|
end
|
661
651
|
|
662
652
|
assert_queries(2) do
|
663
|
-
posts = Post.all.includes(:comments).order(
|
653
|
+
posts = Post.all.includes(:comments).order("posts.id")
|
664
654
|
assert posts.first.comments.first
|
665
655
|
end
|
666
656
|
|
667
657
|
assert_queries(2) do
|
668
|
-
posts = Post.includes(:author).order(
|
658
|
+
posts = Post.includes(:author).order("posts.id")
|
669
659
|
assert posts.first.author
|
670
660
|
end
|
671
661
|
|
672
662
|
assert_queries(3) do
|
673
|
-
posts = Post.includes(:author, :comments).order(
|
663
|
+
posts = Post.includes(:author, :comments).order("posts.id")
|
674
664
|
assert posts.first.author
|
675
665
|
assert posts.first.comments.first
|
676
666
|
end
|
677
667
|
end
|
678
668
|
|
679
|
-
def test_default_scope_with_conditions_string
|
680
|
-
assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
|
681
|
-
assert_nil DeveloperCalledDavid.create!.name
|
682
|
-
end
|
683
|
-
|
684
|
-
def test_default_scope_with_conditions_hash
|
685
|
-
assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
|
686
|
-
assert_equal 'Jamis', DeveloperCalledJamis.create!.name
|
687
|
-
end
|
688
|
-
|
689
669
|
def test_default_scoping_finder_methods
|
690
|
-
developers = DeveloperCalledDavid.order(
|
691
|
-
assert_equal Developer.where(name:
|
670
|
+
developers = DeveloperCalledDavid.order("id").map(&:id).sort
|
671
|
+
assert_equal Developer.where(name: "David").map(&:id).sort, developers
|
692
672
|
end
|
693
673
|
|
694
674
|
def test_includes_with_select
|
695
|
-
query = Post.select(
|
675
|
+
query = Post.select("legacy_comments_count AS ranking").order("ranking").includes(:comments)
|
696
676
|
.where(comments: { id: 1 })
|
697
677
|
|
698
|
-
assert_equal [
|
678
|
+
assert_equal ["legacy_comments_count AS ranking"], query.select_values
|
699
679
|
assert_equal 1, query.to_a.size
|
700
680
|
end
|
701
681
|
|
702
682
|
def test_preloading_with_associations_and_merges
|
703
|
-
post = Post.create! title:
|
683
|
+
post = Post.create! title: "Uhuu", body: "body"
|
704
684
|
reader = Reader.create! post_id: post.id, person_id: 1
|
705
|
-
comment = Comment.create! post_id: post.id, body:
|
685
|
+
comment = Comment.create! post_id: post.id, body: "body"
|
706
686
|
|
707
|
-
|
687
|
+
assert_not_respond_to comment, :readers
|
708
688
|
|
709
|
-
post_rel = Post.preload(:readers).joins(:readers).where(title:
|
689
|
+
post_rel = Post.preload(:readers).joins(:readers).where(title: "Uhuu")
|
710
690
|
result_comment = Comment.joins(:post).merge(post_rel).to_a.first
|
711
691
|
assert_equal comment, result_comment
|
712
692
|
|
@@ -715,7 +695,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
715
695
|
assert_equal [reader], result_comment.post.readers.to_a
|
716
696
|
end
|
717
697
|
|
718
|
-
post_rel = Post.includes(:readers).where(title:
|
698
|
+
post_rel = Post.includes(:readers).where(title: "Uhuu")
|
719
699
|
result_comment = Comment.joins(:post).merge(post_rel).first
|
720
700
|
assert_equal comment, result_comment
|
721
701
|
|
@@ -726,17 +706,17 @@ class RelationTest < ActiveRecord::TestCase
|
|
726
706
|
end
|
727
707
|
|
728
708
|
def test_preloading_with_associations_default_scopes_and_merges
|
729
|
-
post = Post.create! title:
|
709
|
+
post = Post.create! title: "Uhuu", body: "body"
|
730
710
|
reader = Reader.create! post_id: post.id, person_id: 1
|
731
711
|
|
732
|
-
post_rel = PostWithPreloadDefaultScope.preload(:readers).joins(:readers).where(title:
|
712
|
+
post_rel = PostWithPreloadDefaultScope.preload(:readers).joins(:readers).where(title: "Uhuu")
|
733
713
|
result_post = PostWithPreloadDefaultScope.all.merge(post_rel).to_a.first
|
734
714
|
|
735
715
|
assert_no_queries do
|
736
716
|
assert_equal [reader], result_post.readers.to_a
|
737
717
|
end
|
738
718
|
|
739
|
-
post_rel = PostWithIncludesDefaultScope.includes(:readers).where(title:
|
719
|
+
post_rel = PostWithIncludesDefaultScope.includes(:readers).where(title: "Uhuu")
|
740
720
|
result_post = PostWithIncludesDefaultScope.all.merge(post_rel).to_a.first
|
741
721
|
|
742
722
|
assert_no_queries do
|
@@ -748,11 +728,11 @@ class RelationTest < ActiveRecord::TestCase
|
|
748
728
|
posts = Post.preload(:comments)
|
749
729
|
post = posts.find { |p| p.id == 1 }
|
750
730
|
assert_equal 2, post.comments.size
|
751
|
-
|
731
|
+
assert_includes post.comments, comments(:greetings)
|
752
732
|
|
753
733
|
post = Post.where("posts.title = 'Welcome to the weblog'").preload(:comments).first
|
754
734
|
assert_equal 2, post.comments.size
|
755
|
-
|
735
|
+
assert_includes post.comments, comments(:greetings)
|
756
736
|
|
757
737
|
posts = Post.preload(:last_comment)
|
758
738
|
post = posts.find { |p| p.id == 1 }
|
@@ -760,10 +740,10 @@ class RelationTest < ActiveRecord::TestCase
|
|
760
740
|
end
|
761
741
|
|
762
742
|
def test_to_sql_on_eager_join
|
763
|
-
expected =
|
764
|
-
Post.eager_load(:last_comment).order(
|
743
|
+
expected = capture_sql {
|
744
|
+
Post.eager_load(:last_comment).order("comments.id DESC").to_a
|
765
745
|
}.first
|
766
|
-
actual = Post.eager_load(:last_comment).order(
|
746
|
+
actual = Post.eager_load(:last_comment).order("comments.id DESC").to_sql
|
767
747
|
assert_equal expected, actual
|
768
748
|
end
|
769
749
|
|
@@ -774,7 +754,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
774
754
|
end
|
775
755
|
|
776
756
|
def test_loading_with_one_association_with_non_preload
|
777
|
-
posts = Post.eager_load(:last_comment).order(
|
757
|
+
posts = Post.eager_load(:last_comment).order("comments.id DESC")
|
778
758
|
post = posts.find { |p| p.id == 1 }
|
779
759
|
assert_equal Post.find(1).last_comment, post.last_comment
|
780
760
|
end
|
@@ -785,7 +765,6 @@ class RelationTest < ActiveRecord::TestCase
|
|
785
765
|
expected_taggings = taggings(:welcome_general, :thinking_general)
|
786
766
|
|
787
767
|
assert_no_queries do
|
788
|
-
assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
|
789
768
|
assert_equal expected_taggings, author.taggings.uniq.sort_by(&:id)
|
790
769
|
end
|
791
770
|
|
@@ -798,56 +777,74 @@ class RelationTest < ActiveRecord::TestCase
|
|
798
777
|
author = Author.all.find_by_id!(authors(:david).id)
|
799
778
|
assert_equal "David", author.name
|
800
779
|
|
801
|
-
assert_raises(ActiveRecord::RecordNotFound) { Author.all.find_by_id_and_name!(20,
|
780
|
+
assert_raises(ActiveRecord::RecordNotFound) { Author.all.find_by_id_and_name!(20, "invalid") }
|
802
781
|
end
|
803
782
|
|
804
783
|
def test_find_id
|
805
784
|
authors = Author.all
|
806
785
|
|
807
786
|
david = authors.find(authors(:david).id)
|
808
|
-
assert_equal
|
787
|
+
assert_equal "David", david.name
|
809
788
|
|
810
|
-
assert_raises(ActiveRecord::RecordNotFound) { authors.where(:
|
789
|
+
assert_raises(ActiveRecord::RecordNotFound) { authors.where(name: "lifo").find("42") }
|
811
790
|
end
|
812
791
|
|
813
792
|
def test_find_ids
|
814
|
-
authors = Author.order(
|
793
|
+
authors = Author.order("id ASC")
|
815
794
|
|
816
795
|
results = authors.find(authors(:david).id, authors(:mary).id)
|
817
796
|
assert_kind_of Array, results
|
818
797
|
assert_equal 2, results.size
|
819
|
-
assert_equal
|
820
|
-
assert_equal
|
798
|
+
assert_equal "David", results[0].name
|
799
|
+
assert_equal "Mary", results[1].name
|
821
800
|
assert_equal results, authors.find([authors(:david).id, authors(:mary).id])
|
822
801
|
|
823
|
-
assert_raises(ActiveRecord::RecordNotFound) { authors.where(:
|
824
|
-
assert_raises(ActiveRecord::RecordNotFound) { authors.find([
|
802
|
+
assert_raises(ActiveRecord::RecordNotFound) { authors.where(name: "lifo").find(authors(:david).id, "42") }
|
803
|
+
assert_raises(ActiveRecord::RecordNotFound) { authors.find(["42", 43]) }
|
825
804
|
end
|
826
805
|
|
827
806
|
def test_find_in_empty_array
|
828
|
-
authors = Author.all.where(:
|
829
|
-
|
807
|
+
authors = Author.all.where(id: [])
|
808
|
+
assert_predicate authors.to_a, :blank?
|
830
809
|
end
|
831
810
|
|
832
811
|
def test_where_with_ar_object
|
833
812
|
author = Author.first
|
834
|
-
authors = Author.all.where(:
|
813
|
+
authors = Author.all.where(id: author)
|
835
814
|
assert_equal 1, authors.to_a.length
|
836
815
|
end
|
837
816
|
|
838
|
-
def
|
817
|
+
def test_where_with_ar_relation
|
818
|
+
author = Post.last.author
|
819
|
+
posts = Post.all.where(author: author)
|
820
|
+
assert_equal 3, posts.to_a.length
|
821
|
+
end
|
822
|
+
|
823
|
+
def test_where_id_with_delegated_ar_object
|
824
|
+
decorator = Class.new(SimpleDelegator)
|
839
825
|
author = Author.first
|
840
|
-
|
841
|
-
assert_equal
|
826
|
+
assert_equal 1, Author.where(id: decorator.new(author)).to_a.length
|
827
|
+
assert_equal 1, Author.where(id: [decorator.new(author)]).to_a.length
|
842
828
|
end
|
843
829
|
|
844
|
-
|
830
|
+
def test_where_relation_with_delegated_ar_object
|
831
|
+
decorator = Class.new(SimpleDelegator)
|
832
|
+
author = Post.last.author
|
833
|
+
assert_equal 3, Post.where(author: decorator.new(author)).to_a.length
|
834
|
+
assert_equal 3, Post.where(author: [decorator.new(author)]).to_a.length
|
835
|
+
end
|
845
836
|
|
846
|
-
def
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
837
|
+
def test_find_by_with_delegated_ar_object
|
838
|
+
decorator = Class.new(SimpleDelegator)
|
839
|
+
author = Author.first
|
840
|
+
assert_equal author, Author.find_by(id: decorator.new(author))
|
841
|
+
assert_equal author, Author.find_by(id: [decorator.new(author)])
|
842
|
+
end
|
843
|
+
|
844
|
+
def test_find_with_list_of_ar
|
845
|
+
author = Author.first
|
846
|
+
authors = Author.find([author.id])
|
847
|
+
assert_equal author, authors.first
|
851
848
|
end
|
852
849
|
|
853
850
|
def test_find_by_id_with_list_of_ar
|
@@ -859,25 +856,25 @@ class RelationTest < ActiveRecord::TestCase
|
|
859
856
|
def test_find_all_using_where_twice_should_or_the_relation
|
860
857
|
david = authors(:david)
|
861
858
|
relation = Author.unscoped
|
862
|
-
relation = relation.where(:
|
863
|
-
relation = relation.where(:
|
864
|
-
relation = relation.where(:
|
859
|
+
relation = relation.where(name: david.name)
|
860
|
+
relation = relation.where(name: "Santiago")
|
861
|
+
relation = relation.where(id: david.id)
|
865
862
|
assert_equal [], relation.to_a
|
866
863
|
end
|
867
864
|
|
868
865
|
def test_multi_where_ands_queries
|
869
866
|
relation = Author.unscoped
|
870
867
|
david = authors(:david)
|
871
|
-
sql = relation.where(:
|
872
|
-
assert_match(
|
868
|
+
sql = relation.where(name: david.name).where(name: "Santiago").to_sql
|
869
|
+
assert_match("AND", sql)
|
873
870
|
end
|
874
871
|
|
875
872
|
def test_find_all_with_multiple_should_use_and
|
876
873
|
david = authors(:david)
|
877
874
|
relation = [
|
878
|
-
{ :
|
879
|
-
{ :
|
880
|
-
{ :
|
875
|
+
{ name: david.name },
|
876
|
+
{ name: "Santiago" },
|
877
|
+
{ name: "tenderlove" },
|
881
878
|
].inject(Author.unscoped) do |memo, param|
|
882
879
|
memo.where(param)
|
883
880
|
end
|
@@ -893,20 +890,18 @@ class RelationTest < ActiveRecord::TestCase
|
|
893
890
|
|
894
891
|
def test_find_all_using_where_with_relation
|
895
892
|
david = authors(:david)
|
896
|
-
# switching the lines below would succeed in current rails
|
897
|
-
# assert_queries(2) {
|
898
893
|
assert_queries(1) {
|
899
|
-
relation = Author.where(:
|
894
|
+
relation = Author.where(id: Author.where(id: david.id))
|
900
895
|
assert_equal [david], relation.to_a
|
901
896
|
}
|
902
897
|
|
903
898
|
assert_queries(1) {
|
904
|
-
relation = Author.where(
|
899
|
+
relation = Author.where("id in (?)", Author.where(id: david).select(:id))
|
905
900
|
assert_equal [david], relation.to_a
|
906
901
|
}
|
907
902
|
|
908
903
|
assert_queries(1) do
|
909
|
-
relation = Author.where(
|
904
|
+
relation = Author.where("id in (:author_ids)", author_ids: Author.where(id: david).select(:id))
|
910
905
|
assert_equal [david], relation.to_a
|
911
906
|
end
|
912
907
|
end
|
@@ -921,22 +916,20 @@ class RelationTest < ActiveRecord::TestCase
|
|
921
916
|
end
|
922
917
|
|
923
918
|
assert_queries(1) do
|
924
|
-
relation = Post.where(
|
925
|
-
assert_equal davids_posts, relation.order(:id).to_a,
|
919
|
+
relation = Post.where("id in (?)", david.posts.select(:id))
|
920
|
+
assert_equal davids_posts, relation.order(:id).to_a, "should process Relation as bind variables"
|
926
921
|
end
|
927
922
|
|
928
923
|
assert_queries(1) do
|
929
|
-
relation = Post.where(
|
930
|
-
assert_equal davids_posts, relation.order(:id).to_a,
|
924
|
+
relation = Post.where("id in (:post_ids)", post_ids: david.posts.select(:id))
|
925
|
+
assert_equal davids_posts, relation.order(:id).to_a, "should process Relation as named bind variables"
|
931
926
|
end
|
932
927
|
end
|
933
928
|
|
934
929
|
def test_find_all_using_where_with_relation_and_alternate_primary_key
|
935
930
|
cool_first = minivans(:cool_first)
|
936
|
-
# switching the lines below would succeed in current rails
|
937
|
-
# assert_queries(2) {
|
938
931
|
assert_queries(1) {
|
939
|
-
relation = Minivan.where(:
|
932
|
+
relation = Minivan.where(minivan_id: Minivan.where(name: cool_first.name))
|
940
933
|
assert_equal [cool_first], relation.to_a
|
941
934
|
}
|
942
935
|
end
|
@@ -944,10 +937,10 @@ class RelationTest < ActiveRecord::TestCase
|
|
944
937
|
def test_find_all_using_where_with_relation_does_not_alter_select_values
|
945
938
|
david = authors(:david)
|
946
939
|
|
947
|
-
subquery = Author.where(:
|
940
|
+
subquery = Author.where(id: david.id)
|
948
941
|
|
949
942
|
assert_queries(1) {
|
950
|
-
relation = Author.where(:
|
943
|
+
relation = Author.where(id: subquery)
|
951
944
|
assert_equal [david], relation.to_a
|
952
945
|
}
|
953
946
|
|
@@ -957,112 +950,32 @@ class RelationTest < ActiveRecord::TestCase
|
|
957
950
|
def test_find_all_using_where_with_relation_with_joins
|
958
951
|
david = authors(:david)
|
959
952
|
assert_queries(1) {
|
960
|
-
relation = Author.where(:
|
953
|
+
relation = Author.where(id: Author.joins(:posts).where(id: david.id))
|
961
954
|
assert_equal [david], relation.to_a
|
962
955
|
}
|
963
956
|
end
|
964
957
|
|
965
|
-
|
966
958
|
def test_find_all_using_where_with_relation_with_select_to_build_subquery
|
967
959
|
david = authors(:david)
|
968
960
|
assert_queries(1) {
|
969
|
-
relation = Author.where(:
|
961
|
+
relation = Author.where(name: Author.where(id: david.id).select(:name))
|
970
962
|
assert_equal [david], relation.to_a
|
971
963
|
}
|
972
964
|
end
|
973
965
|
|
974
|
-
def test_exists
|
975
|
-
davids = Author.where(:name => 'David')
|
976
|
-
assert davids.exists?
|
977
|
-
assert davids.exists?(authors(:david).id)
|
978
|
-
assert ! davids.exists?(authors(:mary).id)
|
979
|
-
assert ! davids.exists?("42")
|
980
|
-
assert ! davids.exists?(42)
|
981
|
-
assert ! davids.exists?(davids.new.id)
|
982
|
-
|
983
|
-
fake = Author.where(:name => 'fake author')
|
984
|
-
assert ! fake.exists?
|
985
|
-
assert ! fake.exists?(authors(:david).id)
|
986
|
-
end
|
987
|
-
|
988
|
-
def test_exists_uses_existing_scope
|
989
|
-
post = authors(:david).posts.first
|
990
|
-
authors = Author.includes(:posts).where(name: "David", posts: { id: post.id })
|
991
|
-
assert authors.exists?(authors(:david).id)
|
992
|
-
end
|
993
|
-
|
994
|
-
def test_any_with_scope_on_hash_includes
|
995
|
-
post = authors(:david).posts.first
|
996
|
-
categories = Categorization.includes(author: :posts).where(posts: { id: post.id })
|
997
|
-
assert categories.exists?
|
998
|
-
end
|
999
|
-
|
1000
966
|
def test_last
|
1001
967
|
authors = Author.all
|
1002
968
|
assert_equal authors(:bob), authors.last
|
1003
969
|
end
|
1004
970
|
|
1005
|
-
def test_destroy_all
|
1006
|
-
davids = Author.where(:name => 'David')
|
1007
|
-
|
1008
|
-
# Force load
|
1009
|
-
assert_equal [authors(:david)], davids.to_a
|
1010
|
-
assert davids.loaded?
|
1011
|
-
|
1012
|
-
assert_difference('Author.count', -1) { davids.destroy_all }
|
1013
|
-
|
1014
|
-
assert_equal [], davids.to_a
|
1015
|
-
assert davids.loaded?
|
1016
|
-
end
|
1017
|
-
|
1018
|
-
def test_destroy_all_with_conditions_is_deprecated
|
1019
|
-
assert_deprecated do
|
1020
|
-
assert_difference('Author.count', -1) { Author.destroy_all(name: 'David') }
|
1021
|
-
end
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
def test_delete_all
|
1025
|
-
davids = Author.where(:name => 'David')
|
1026
|
-
|
1027
|
-
assert_difference('Author.count', -1) { davids.delete_all }
|
1028
|
-
assert ! davids.loaded?
|
1029
|
-
end
|
1030
|
-
|
1031
|
-
def test_delete_all_with_conditions_is_deprecated
|
1032
|
-
assert_deprecated do
|
1033
|
-
assert_difference('Author.count', -1) { Author.delete_all(name: 'David') }
|
1034
|
-
end
|
1035
|
-
end
|
1036
|
-
|
1037
|
-
def test_delete_all_loaded
|
1038
|
-
davids = Author.where(:name => 'David')
|
1039
|
-
|
1040
|
-
# Force load
|
1041
|
-
assert_equal [authors(:david)], davids.to_a
|
1042
|
-
assert davids.loaded?
|
1043
|
-
|
1044
|
-
assert_difference('Author.count', -1) { davids.delete_all }
|
1045
|
-
|
1046
|
-
assert_equal [], davids.to_a
|
1047
|
-
assert davids.loaded?
|
1048
|
-
end
|
1049
|
-
|
1050
|
-
def test_delete_all_with_unpermitted_relation_raises_error
|
1051
|
-
assert_raises(ActiveRecord::ActiveRecordError) { Author.limit(10).delete_all }
|
1052
|
-
assert_raises(ActiveRecord::ActiveRecordError) { Author.distinct.delete_all }
|
1053
|
-
assert_raises(ActiveRecord::ActiveRecordError) { Author.group(:name).delete_all }
|
1054
|
-
assert_raises(ActiveRecord::ActiveRecordError) { Author.having('SUM(id) < 3').delete_all }
|
1055
|
-
assert_raises(ActiveRecord::ActiveRecordError) { Author.offset(10).delete_all }
|
1056
|
-
end
|
1057
|
-
|
1058
971
|
def test_select_with_aggregates
|
1059
972
|
posts = Post.select(:title, :body)
|
1060
973
|
|
1061
974
|
assert_equal 11, posts.count(:all)
|
1062
975
|
assert_equal 11, posts.size
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
976
|
+
assert_predicate posts, :any?
|
977
|
+
assert_predicate posts, :many?
|
978
|
+
assert_not_empty posts
|
1066
979
|
end
|
1067
980
|
|
1068
981
|
def test_select_takes_a_variable_list_of_args
|
@@ -1084,6 +997,10 @@ class RelationTest < ActiveRecord::TestCase
|
|
1084
997
|
assert_raises(ArgumentError) { Developer.select }
|
1085
998
|
end
|
1086
999
|
|
1000
|
+
def test_select_argument_error_with_block
|
1001
|
+
assert_raises(ArgumentError) { Developer.select(:id) { |d| d.id % 2 == 0 } }
|
1002
|
+
end
|
1003
|
+
|
1087
1004
|
def test_count
|
1088
1005
|
posts = Post.all
|
1089
1006
|
|
@@ -1091,8 +1008,13 @@ class RelationTest < ActiveRecord::TestCase
|
|
1091
1008
|
assert_equal 11, posts.count(:all)
|
1092
1009
|
assert_equal 11, posts.count(:id)
|
1093
1010
|
|
1094
|
-
assert_equal
|
1095
|
-
assert_equal
|
1011
|
+
assert_equal 3, posts.where("legacy_comments_count > 1").count
|
1012
|
+
assert_equal 6, posts.where(comments_count: 0).count
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
def test_count_with_block
|
1016
|
+
posts = Post.all
|
1017
|
+
assert_equal 8, posts.count { |p| p.comments_count.even? }
|
1096
1018
|
end
|
1097
1019
|
|
1098
1020
|
def test_count_on_association_relation
|
@@ -1103,42 +1025,65 @@ class RelationTest < ActiveRecord::TestCase
|
|
1103
1025
|
assert_equal author.posts.where(author_id: author.id).size, posts.count
|
1104
1026
|
|
1105
1027
|
assert_equal 0, author.posts.where(author_id: another_author.id).size
|
1106
|
-
|
1028
|
+
assert_empty author.posts.where(author_id: another_author.id)
|
1107
1029
|
end
|
1108
1030
|
|
1109
1031
|
def test_count_with_distinct
|
1110
1032
|
posts = Post.all
|
1111
1033
|
|
1112
|
-
assert_equal
|
1034
|
+
assert_equal 4, posts.distinct(true).count(:comments_count)
|
1113
1035
|
assert_equal 11, posts.distinct(false).count(:comments_count)
|
1114
1036
|
|
1115
|
-
assert_equal
|
1037
|
+
assert_equal 4, posts.distinct(true).select(:comments_count).count
|
1116
1038
|
assert_equal 11, posts.distinct(false).select(:comments_count).count
|
1117
1039
|
end
|
1118
1040
|
|
1119
|
-
def
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1041
|
+
def test_size_with_distinct
|
1042
|
+
posts = Post.distinct.select(:author_id, :comments_count)
|
1043
|
+
assert_queries(1) { assert_equal 8, posts.size }
|
1044
|
+
assert_queries(1) { assert_equal 8, posts.load.size }
|
1045
|
+
end
|
1046
|
+
|
1047
|
+
def test_size_with_eager_loading_and_custom_order
|
1048
|
+
posts = Post.includes(:comments).order("comments.id")
|
1049
|
+
assert_queries(1) { assert_equal 11, posts.size }
|
1050
|
+
assert_queries(1) { assert_equal 11, posts.load.size }
|
1051
|
+
end
|
1052
|
+
|
1053
|
+
def test_size_with_eager_loading_and_custom_select_and_order
|
1054
|
+
posts = Post.includes(:comments).order("comments.id").select(:type)
|
1055
|
+
assert_queries(1) { assert_equal 11, posts.size }
|
1056
|
+
assert_queries(1) { assert_equal 11, posts.load.size }
|
1057
|
+
end
|
1058
|
+
|
1059
|
+
def test_size_with_eager_loading_and_custom_order_and_distinct
|
1060
|
+
posts = Post.includes(:comments).order("comments.id").distinct
|
1061
|
+
assert_queries(1) { assert_equal 11, posts.size }
|
1062
|
+
assert_queries(1) { assert_equal 11, posts.load.size }
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
def test_size_with_eager_loading_and_manual_distinct_select_and_custom_order
|
1066
|
+
accounts = Account.select("DISTINCT accounts.firm_id").order("accounts.firm_id")
|
1067
|
+
|
1068
|
+
assert_queries(1) { assert_equal 5, accounts.size }
|
1069
|
+
assert_queries(1) { assert_equal 5, accounts.load.size }
|
1125
1070
|
end
|
1126
1071
|
|
1127
1072
|
def test_count_explicit_columns
|
1128
|
-
Post.update_all(:
|
1073
|
+
Post.update_all(comments_count: nil)
|
1129
1074
|
posts = Post.all
|
1130
1075
|
|
1131
|
-
assert_equal [0], posts.select(
|
1132
|
-
assert_equal 0, posts.where(
|
1076
|
+
assert_equal [0], posts.select("comments_count").where("id is not null").group("id").order("id").count.values.uniq
|
1077
|
+
assert_equal 0, posts.where("id is not null").select("comments_count").count
|
1133
1078
|
|
1134
|
-
assert_equal 11, posts.select(
|
1135
|
-
assert_equal 0, posts.select(
|
1079
|
+
assert_equal 11, posts.select("comments_count").count("id")
|
1080
|
+
assert_equal 0, posts.select("comments_count").count
|
1136
1081
|
assert_equal 0, posts.count(:comments_count)
|
1137
|
-
assert_equal 0, posts.count(
|
1082
|
+
assert_equal 0, posts.count("comments_count")
|
1138
1083
|
end
|
1139
1084
|
|
1140
1085
|
def test_multiple_selects
|
1141
|
-
post = Post.all.select(
|
1086
|
+
post = Post.all.select("comments_count").select("title").order("id ASC").first
|
1142
1087
|
assert_equal "Welcome to the weblog", post.title
|
1143
1088
|
assert_equal 2, post.comments_count
|
1144
1089
|
end
|
@@ -1147,31 +1092,31 @@ class RelationTest < ActiveRecord::TestCase
|
|
1147
1092
|
posts = Post.all
|
1148
1093
|
|
1149
1094
|
assert_queries(1) { assert_equal 11, posts.size }
|
1150
|
-
|
1095
|
+
assert_not_predicate posts, :loaded?
|
1151
1096
|
|
1152
|
-
best_posts = posts.where(:
|
1153
|
-
best_posts.
|
1154
|
-
assert_no_queries { assert_equal
|
1097
|
+
best_posts = posts.where(comments_count: 0)
|
1098
|
+
best_posts.load # force load
|
1099
|
+
assert_no_queries { assert_equal 6, best_posts.size }
|
1155
1100
|
end
|
1156
1101
|
|
1157
1102
|
def test_size_with_limit
|
1158
1103
|
posts = Post.limit(10)
|
1159
1104
|
|
1160
1105
|
assert_queries(1) { assert_equal 10, posts.size }
|
1161
|
-
|
1106
|
+
assert_not_predicate posts, :loaded?
|
1162
1107
|
|
1163
|
-
best_posts = posts.where(:
|
1164
|
-
best_posts.
|
1165
|
-
assert_no_queries { assert_equal
|
1108
|
+
best_posts = posts.where(comments_count: 0)
|
1109
|
+
best_posts.load # force load
|
1110
|
+
assert_no_queries { assert_equal 6, best_posts.size }
|
1166
1111
|
end
|
1167
1112
|
|
1168
1113
|
def test_size_with_zero_limit
|
1169
1114
|
posts = Post.limit(0)
|
1170
1115
|
|
1171
1116
|
assert_no_queries { assert_equal 0, posts.size }
|
1172
|
-
|
1117
|
+
assert_not_predicate posts, :loaded?
|
1173
1118
|
|
1174
|
-
posts.
|
1119
|
+
posts.load # force load
|
1175
1120
|
assert_no_queries { assert_equal 0, posts.size }
|
1176
1121
|
end
|
1177
1122
|
|
@@ -1179,13 +1124,13 @@ class RelationTest < ActiveRecord::TestCase
|
|
1179
1124
|
posts = Post.limit(0)
|
1180
1125
|
|
1181
1126
|
assert_no_queries { assert_equal true, posts.empty? }
|
1182
|
-
|
1127
|
+
assert_not_predicate posts, :loaded?
|
1183
1128
|
end
|
1184
1129
|
|
1185
1130
|
def test_count_complex_chained_relations
|
1186
|
-
posts = Post.select(
|
1131
|
+
posts = Post.select("comments_count").where("id is not null").group("author_id").where("legacy_comments_count > 0")
|
1187
1132
|
|
1188
|
-
expected = { 1 => 2 }
|
1133
|
+
expected = { 1 => 4, 2 => 1 }
|
1189
1134
|
assert_equal expected, posts.count
|
1190
1135
|
end
|
1191
1136
|
|
@@ -1193,48 +1138,40 @@ class RelationTest < ActiveRecord::TestCase
|
|
1193
1138
|
posts = Post.all
|
1194
1139
|
|
1195
1140
|
assert_queries(1) { assert_equal false, posts.empty? }
|
1196
|
-
|
1141
|
+
assert_not_predicate posts, :loaded?
|
1197
1142
|
|
1198
|
-
no_posts = posts.where(:
|
1143
|
+
no_posts = posts.where(title: "")
|
1199
1144
|
assert_queries(1) { assert_equal true, no_posts.empty? }
|
1200
|
-
|
1145
|
+
assert_not_predicate no_posts, :loaded?
|
1201
1146
|
|
1202
|
-
best_posts = posts.where(:
|
1203
|
-
best_posts.
|
1147
|
+
best_posts = posts.where(comments_count: 0)
|
1148
|
+
best_posts.load # force load
|
1204
1149
|
assert_no_queries { assert_equal false, best_posts.empty? }
|
1205
1150
|
end
|
1206
1151
|
|
1207
1152
|
def test_empty_complex_chained_relations
|
1208
|
-
posts = Post.select("comments_count").where("id is not null").group("author_id").where("
|
1153
|
+
posts = Post.select("comments_count").where("id is not null").group("author_id").where("legacy_comments_count > 0")
|
1209
1154
|
|
1210
1155
|
assert_queries(1) { assert_equal false, posts.empty? }
|
1211
|
-
|
1156
|
+
assert_not_predicate posts, :loaded?
|
1212
1157
|
|
1213
|
-
no_posts = posts.where(:
|
1158
|
+
no_posts = posts.where(title: "")
|
1214
1159
|
assert_queries(1) { assert_equal true, no_posts.empty? }
|
1215
|
-
|
1160
|
+
assert_not_predicate no_posts, :loaded?
|
1216
1161
|
end
|
1217
1162
|
|
1218
1163
|
def test_any
|
1219
1164
|
posts = Post.all
|
1220
1165
|
|
1221
|
-
# This test was failing when run on its own (as opposed to running the entire suite).
|
1222
|
-
# The second line in the assert_queries block was causing visit_Arel_Attributes_Attribute
|
1223
|
-
# in Arel::Visitors::ToSql to trigger a SHOW TABLES query. Running that line here causes
|
1224
|
-
# the SHOW TABLES result to be cached so we don't have to do it again in the block.
|
1225
|
-
#
|
1226
|
-
# This is obviously a rubbish fix but it's the best I can come up with for now...
|
1227
|
-
posts.where(:id => nil).any?
|
1228
|
-
|
1229
1166
|
assert_queries(3) do
|
1230
1167
|
assert posts.any? # Uses COUNT()
|
1231
|
-
|
1168
|
+
assert_not_predicate posts.where(id: nil), :any?
|
1232
1169
|
|
1233
|
-
assert posts.any? {|p| p.id > 0 }
|
1234
|
-
|
1170
|
+
assert posts.any? { |p| p.id > 0 }
|
1171
|
+
assert_not posts.any? { |p| p.id <= 0 }
|
1235
1172
|
end
|
1236
1173
|
|
1237
|
-
|
1174
|
+
assert_predicate posts, :loaded?
|
1238
1175
|
end
|
1239
1176
|
|
1240
1177
|
def test_many
|
@@ -1242,50 +1179,50 @@ class RelationTest < ActiveRecord::TestCase
|
|
1242
1179
|
|
1243
1180
|
assert_queries(2) do
|
1244
1181
|
assert posts.many? # Uses COUNT()
|
1245
|
-
assert posts.many? {|p| p.id > 0 }
|
1246
|
-
|
1182
|
+
assert posts.many? { |p| p.id > 0 }
|
1183
|
+
assert_not posts.many? { |p| p.id < 2 }
|
1247
1184
|
end
|
1248
1185
|
|
1249
|
-
|
1186
|
+
assert_predicate posts, :loaded?
|
1250
1187
|
end
|
1251
1188
|
|
1252
1189
|
def test_many_with_limits
|
1253
1190
|
posts = Post.all
|
1254
1191
|
|
1255
|
-
|
1256
|
-
|
1192
|
+
assert_predicate posts, :many?
|
1193
|
+
assert_not_predicate posts.limit(1), :many?
|
1257
1194
|
end
|
1258
1195
|
|
1259
1196
|
def test_none?
|
1260
1197
|
posts = Post.all
|
1261
1198
|
assert_queries(1) do
|
1262
|
-
|
1199
|
+
assert_not posts.none? # Uses COUNT()
|
1263
1200
|
end
|
1264
1201
|
|
1265
|
-
|
1202
|
+
assert_not_predicate posts, :loaded?
|
1266
1203
|
|
1267
1204
|
assert_queries(1) do
|
1268
|
-
assert posts.none? {|p| p.id < 0 }
|
1269
|
-
|
1205
|
+
assert posts.none? { |p| p.id < 0 }
|
1206
|
+
assert_not posts.none? { |p| p.id == 1 }
|
1270
1207
|
end
|
1271
1208
|
|
1272
|
-
|
1209
|
+
assert_predicate posts, :loaded?
|
1273
1210
|
end
|
1274
1211
|
|
1275
1212
|
def test_one
|
1276
1213
|
posts = Post.all
|
1277
1214
|
assert_queries(1) do
|
1278
|
-
|
1215
|
+
assert_not posts.one? # Uses COUNT()
|
1279
1216
|
end
|
1280
1217
|
|
1281
|
-
|
1218
|
+
assert_not_predicate posts, :loaded?
|
1282
1219
|
|
1283
1220
|
assert_queries(1) do
|
1284
|
-
|
1285
|
-
assert posts.one? {|p| p.id == 1 }
|
1221
|
+
assert_not posts.one? { |p| p.id < 3 }
|
1222
|
+
assert posts.one? { |p| p.id == 1 }
|
1286
1223
|
end
|
1287
1224
|
|
1288
|
-
|
1225
|
+
assert_predicate posts, :loaded?
|
1289
1226
|
end
|
1290
1227
|
|
1291
1228
|
def test_to_a_should_dup_target
|
@@ -1306,11 +1243,11 @@ class RelationTest < ActiveRecord::TestCase
|
|
1306
1243
|
end
|
1307
1244
|
|
1308
1245
|
def test_scoped_build
|
1309
|
-
posts = Post.where(:
|
1246
|
+
posts = Post.where(title: "You told a lie")
|
1310
1247
|
|
1311
1248
|
post = posts.new
|
1312
1249
|
assert_kind_of Post, post
|
1313
|
-
assert_equal
|
1250
|
+
assert_equal "You told a lie", post.title
|
1314
1251
|
end
|
1315
1252
|
|
1316
1253
|
def test_create
|
@@ -1318,11 +1255,11 @@ class RelationTest < ActiveRecord::TestCase
|
|
1318
1255
|
|
1319
1256
|
sparrow = birds.create
|
1320
1257
|
assert_kind_of Bird, sparrow
|
1321
|
-
|
1258
|
+
assert_not_predicate sparrow, :persisted?
|
1322
1259
|
|
1323
|
-
hen = birds.where(:
|
1324
|
-
|
1325
|
-
assert_equal
|
1260
|
+
hen = birds.where(name: "hen").create
|
1261
|
+
assert_predicate hen, :persisted?
|
1262
|
+
assert_equal "hen", hen.name
|
1326
1263
|
end
|
1327
1264
|
|
1328
1265
|
def test_create_bang
|
@@ -1330,201 +1267,317 @@ class RelationTest < ActiveRecord::TestCase
|
|
1330
1267
|
|
1331
1268
|
assert_raises(ActiveRecord::RecordInvalid) { birds.create! }
|
1332
1269
|
|
1333
|
-
hen = birds.where(:
|
1270
|
+
hen = birds.where(name: "hen").create!
|
1334
1271
|
assert_kind_of Bird, hen
|
1335
|
-
|
1336
|
-
assert_equal
|
1272
|
+
assert_predicate hen, :persisted?
|
1273
|
+
assert_equal "hen", hen.name
|
1274
|
+
end
|
1275
|
+
|
1276
|
+
def test_create_with_polymorphic_association
|
1277
|
+
author = authors(:david)
|
1278
|
+
post = posts(:welcome)
|
1279
|
+
comment = Comment.where(post: post, author: author).create!(body: "hello")
|
1280
|
+
|
1281
|
+
assert_equal author, comment.author
|
1282
|
+
assert_equal post, comment.post
|
1337
1283
|
end
|
1338
1284
|
|
1339
1285
|
def test_first_or_create
|
1340
|
-
parrot = Bird.where(:
|
1286
|
+
parrot = Bird.where(color: "green").first_or_create(name: "parrot")
|
1341
1287
|
assert_kind_of Bird, parrot
|
1342
|
-
|
1343
|
-
assert_equal
|
1344
|
-
assert_equal
|
1288
|
+
assert_predicate parrot, :persisted?
|
1289
|
+
assert_equal "parrot", parrot.name
|
1290
|
+
assert_equal "green", parrot.color
|
1345
1291
|
|
1346
|
-
same_parrot = Bird.where(:
|
1292
|
+
same_parrot = Bird.where(color: "green").first_or_create(name: "parakeet")
|
1347
1293
|
assert_kind_of Bird, same_parrot
|
1348
|
-
|
1294
|
+
assert_predicate same_parrot, :persisted?
|
1349
1295
|
assert_equal parrot, same_parrot
|
1296
|
+
|
1297
|
+
canary = Bird.where(Bird.arel_table[:color].is_distinct_from("green")).first_or_create(name: "canary")
|
1298
|
+
assert_equal "canary", canary.name
|
1299
|
+
assert_nil canary.color
|
1350
1300
|
end
|
1351
1301
|
|
1352
1302
|
def test_first_or_create_with_no_parameters
|
1353
|
-
parrot = Bird.where(:
|
1303
|
+
parrot = Bird.where(color: "green").first_or_create
|
1354
1304
|
assert_kind_of Bird, parrot
|
1355
|
-
|
1356
|
-
assert_equal
|
1305
|
+
assert_not_predicate parrot, :persisted?
|
1306
|
+
assert_equal "green", parrot.color
|
1357
1307
|
end
|
1358
1308
|
|
1359
1309
|
def test_first_or_create_with_block
|
1360
|
-
|
1310
|
+
canary = Bird.create!(color: "yellow", name: "canary")
|
1311
|
+
parrot = Bird.where(color: "green").first_or_create do |bird|
|
1312
|
+
bird.name = "parrot"
|
1313
|
+
bird.enable_count = true
|
1314
|
+
assert_equal canary, Bird.find_by!(name: "canary")
|
1315
|
+
end
|
1316
|
+
assert_equal 1, parrot.total_count
|
1361
1317
|
assert_kind_of Bird, parrot
|
1362
|
-
|
1363
|
-
assert_equal
|
1364
|
-
assert_equal
|
1318
|
+
assert_predicate parrot, :persisted?
|
1319
|
+
assert_equal "green", parrot.color
|
1320
|
+
assert_equal "parrot", parrot.name
|
1365
1321
|
|
1366
|
-
same_parrot = Bird.where(:
|
1322
|
+
same_parrot = Bird.where(color: "green").first_or_create { |bird| bird.name = "parakeet" }
|
1367
1323
|
assert_equal parrot, same_parrot
|
1368
1324
|
end
|
1369
1325
|
|
1370
1326
|
def test_first_or_create_with_array
|
1371
|
-
several_green_birds = Bird.where(:
|
1327
|
+
several_green_birds = Bird.where(color: "green").first_or_create([{ name: "parrot" }, { name: "parakeet" }])
|
1372
1328
|
assert_kind_of Array, several_green_birds
|
1373
1329
|
several_green_birds.each { |bird| assert bird.persisted? }
|
1374
1330
|
|
1375
|
-
same_parrot = Bird.where(:
|
1331
|
+
same_parrot = Bird.where(color: "green").first_or_create([{ name: "hummingbird" }, { name: "macaw" }])
|
1376
1332
|
assert_kind_of Bird, same_parrot
|
1377
1333
|
assert_equal several_green_birds.first, same_parrot
|
1378
1334
|
end
|
1379
1335
|
|
1380
1336
|
def test_first_or_create_bang_with_valid_options
|
1381
|
-
parrot = Bird.where(:
|
1337
|
+
parrot = Bird.where(color: "green").first_or_create!(name: "parrot")
|
1382
1338
|
assert_kind_of Bird, parrot
|
1383
|
-
|
1384
|
-
assert_equal
|
1385
|
-
assert_equal
|
1339
|
+
assert_predicate parrot, :persisted?
|
1340
|
+
assert_equal "parrot", parrot.name
|
1341
|
+
assert_equal "green", parrot.color
|
1386
1342
|
|
1387
|
-
same_parrot = Bird.where(:
|
1343
|
+
same_parrot = Bird.where(color: "green").first_or_create!(name: "parakeet")
|
1388
1344
|
assert_kind_of Bird, same_parrot
|
1389
|
-
|
1345
|
+
assert_predicate same_parrot, :persisted?
|
1390
1346
|
assert_equal parrot, same_parrot
|
1391
1347
|
end
|
1392
1348
|
|
1393
1349
|
def test_first_or_create_bang_with_invalid_options
|
1394
|
-
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(:
|
1350
|
+
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(color: "green").first_or_create!(pirate_id: 1) }
|
1395
1351
|
end
|
1396
1352
|
|
1397
1353
|
def test_first_or_create_bang_with_no_parameters
|
1398
|
-
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(:
|
1354
|
+
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(color: "green").first_or_create! }
|
1399
1355
|
end
|
1400
1356
|
|
1401
1357
|
def test_first_or_create_bang_with_valid_block
|
1402
|
-
|
1358
|
+
canary = Bird.create!(color: "yellow", name: "canary")
|
1359
|
+
parrot = Bird.where(color: "green").first_or_create! do |bird|
|
1360
|
+
bird.name = "parrot"
|
1361
|
+
bird.enable_count = true
|
1362
|
+
assert_equal canary, Bird.find_by!(name: "canary")
|
1363
|
+
end
|
1364
|
+
assert_equal 1, parrot.total_count
|
1403
1365
|
assert_kind_of Bird, parrot
|
1404
|
-
|
1405
|
-
assert_equal
|
1406
|
-
assert_equal
|
1366
|
+
assert_predicate parrot, :persisted?
|
1367
|
+
assert_equal "green", parrot.color
|
1368
|
+
assert_equal "parrot", parrot.name
|
1407
1369
|
|
1408
|
-
same_parrot = Bird.where(:
|
1370
|
+
same_parrot = Bird.where(color: "green").first_or_create! { |bird| bird.name = "parakeet" }
|
1409
1371
|
assert_equal parrot, same_parrot
|
1410
1372
|
end
|
1411
1373
|
|
1412
1374
|
def test_first_or_create_bang_with_invalid_block
|
1413
1375
|
assert_raise(ActiveRecord::RecordInvalid) do
|
1414
|
-
Bird.where(:
|
1376
|
+
Bird.where(color: "green").first_or_create! { |bird| bird.pirate_id = 1 }
|
1415
1377
|
end
|
1416
1378
|
end
|
1417
1379
|
|
1418
|
-
def
|
1419
|
-
several_green_birds = Bird.where(:
|
1380
|
+
def test_first_or_create_bang_with_valid_array
|
1381
|
+
several_green_birds = Bird.where(color: "green").first_or_create!([{ name: "parrot" }, { name: "parakeet" }])
|
1420
1382
|
assert_kind_of Array, several_green_birds
|
1421
1383
|
several_green_birds.each { |bird| assert bird.persisted? }
|
1422
1384
|
|
1423
|
-
same_parrot = Bird.where(:
|
1385
|
+
same_parrot = Bird.where(color: "green").first_or_create!([{ name: "hummingbird" }, { name: "macaw" }])
|
1424
1386
|
assert_kind_of Bird, same_parrot
|
1425
1387
|
assert_equal several_green_birds.first, same_parrot
|
1426
1388
|
end
|
1427
1389
|
|
1428
|
-
def
|
1429
|
-
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(:
|
1390
|
+
def test_first_or_create_bang_with_invalid_array
|
1391
|
+
assert_raises(ActiveRecord::RecordInvalid) { Bird.where(color: "green").first_or_create!([ { name: "parrot" }, { pirate_id: 1 } ]) }
|
1430
1392
|
end
|
1431
1393
|
|
1432
1394
|
def test_first_or_initialize
|
1433
|
-
parrot = Bird.where(:
|
1395
|
+
parrot = Bird.where(color: "green").first_or_initialize(name: "parrot")
|
1434
1396
|
assert_kind_of Bird, parrot
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
assert_equal
|
1439
|
-
assert_equal
|
1397
|
+
assert_not_predicate parrot, :persisted?
|
1398
|
+
assert_predicate parrot, :valid?
|
1399
|
+
assert_predicate parrot, :new_record?
|
1400
|
+
assert_equal "parrot", parrot.name
|
1401
|
+
assert_equal "green", parrot.color
|
1402
|
+
|
1403
|
+
canary = Bird.where(Bird.arel_table[:color].is_distinct_from("green")).first_or_initialize(name: "canary")
|
1404
|
+
assert_equal "canary", canary.name
|
1405
|
+
assert_nil canary.color
|
1440
1406
|
end
|
1441
1407
|
|
1442
1408
|
def test_first_or_initialize_with_no_parameters
|
1443
|
-
parrot = Bird.where(:
|
1409
|
+
parrot = Bird.where(color: "green").first_or_initialize
|
1444
1410
|
assert_kind_of Bird, parrot
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
assert_equal
|
1411
|
+
assert_not_predicate parrot, :persisted?
|
1412
|
+
assert_not_predicate parrot, :valid?
|
1413
|
+
assert_predicate parrot, :new_record?
|
1414
|
+
assert_equal "green", parrot.color
|
1449
1415
|
end
|
1450
1416
|
|
1451
1417
|
def test_first_or_initialize_with_block
|
1452
|
-
|
1418
|
+
canary = Bird.create!(color: "yellow", name: "canary")
|
1419
|
+
parrot = Bird.where(color: "green").first_or_initialize do |bird|
|
1420
|
+
bird.name = "parrot"
|
1421
|
+
bird.enable_count = true
|
1422
|
+
assert_equal canary, Bird.find_by!(name: "canary")
|
1423
|
+
end
|
1424
|
+
assert_equal 1, parrot.total_count
|
1453
1425
|
assert_kind_of Bird, parrot
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
assert_equal
|
1458
|
-
assert_equal
|
1426
|
+
assert_not_predicate parrot, :persisted?
|
1427
|
+
assert_predicate parrot, :valid?
|
1428
|
+
assert_predicate parrot, :new_record?
|
1429
|
+
assert_equal "green", parrot.color
|
1430
|
+
assert_equal "parrot", parrot.name
|
1459
1431
|
end
|
1460
1432
|
|
1461
1433
|
def test_find_or_create_by
|
1462
|
-
assert_nil Bird.find_by(name:
|
1434
|
+
assert_nil Bird.find_by(name: "bob")
|
1463
1435
|
|
1464
|
-
bird = Bird.find_or_create_by(name:
|
1465
|
-
|
1436
|
+
bird = Bird.find_or_create_by(name: "bob")
|
1437
|
+
assert_predicate bird, :persisted?
|
1466
1438
|
|
1467
|
-
assert_equal bird, Bird.find_or_create_by(name:
|
1439
|
+
assert_equal bird, Bird.find_or_create_by(name: "bob")
|
1468
1440
|
end
|
1469
1441
|
|
1470
1442
|
def test_find_or_create_by_with_create_with
|
1471
|
-
assert_nil Bird.find_by(name:
|
1443
|
+
assert_nil Bird.find_by(name: "bob")
|
1472
1444
|
|
1473
|
-
bird = Bird.create_with(color:
|
1474
|
-
|
1475
|
-
assert_equal
|
1445
|
+
bird = Bird.create_with(color: "green").find_or_create_by(name: "bob")
|
1446
|
+
assert_predicate bird, :persisted?
|
1447
|
+
assert_equal "green", bird.color
|
1476
1448
|
|
1477
|
-
assert_equal bird, Bird.create_with(color:
|
1449
|
+
assert_equal bird, Bird.create_with(color: "blue").find_or_create_by(name: "bob")
|
1478
1450
|
end
|
1479
1451
|
|
1480
1452
|
def test_find_or_create_by!
|
1481
|
-
assert_raises(ActiveRecord::RecordInvalid) { Bird.find_or_create_by!(color:
|
1453
|
+
assert_raises(ActiveRecord::RecordInvalid) { Bird.find_or_create_by!(color: "green") }
|
1454
|
+
end
|
1455
|
+
|
1456
|
+
def test_create_or_find_by
|
1457
|
+
assert_nil Subscriber.find_by(nick: "bob")
|
1458
|
+
|
1459
|
+
subscriber = Subscriber.create!(nick: "bob")
|
1460
|
+
|
1461
|
+
assert_equal subscriber, Subscriber.create_or_find_by(nick: "bob")
|
1462
|
+
assert_not_equal subscriber, Subscriber.create_or_find_by(nick: "cat")
|
1463
|
+
end
|
1464
|
+
|
1465
|
+
def test_create_or_find_by_should_not_raise_due_to_validation_errors
|
1466
|
+
assert_nothing_raised do
|
1467
|
+
bird = Bird.create_or_find_by(color: "green")
|
1468
|
+
assert_predicate bird, :invalid?
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
|
1472
|
+
def test_create_or_find_by_with_non_unique_attributes
|
1473
|
+
Subscriber.create!(nick: "bob", name: "the builder")
|
1474
|
+
|
1475
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
1476
|
+
Subscriber.create_or_find_by(nick: "bob", name: "the cat")
|
1477
|
+
end
|
1478
|
+
end
|
1479
|
+
|
1480
|
+
def test_create_or_find_by_within_transaction
|
1481
|
+
assert_nil Subscriber.find_by(nick: "bob")
|
1482
|
+
|
1483
|
+
subscriber = Subscriber.create!(nick: "bob")
|
1484
|
+
|
1485
|
+
Subscriber.transaction do
|
1486
|
+
assert_equal subscriber, Subscriber.create_or_find_by(nick: "bob")
|
1487
|
+
assert_not_equal subscriber, Subscriber.create_or_find_by(nick: "cat")
|
1488
|
+
end
|
1489
|
+
end
|
1490
|
+
|
1491
|
+
def test_create_or_find_by_with_bang
|
1492
|
+
assert_nil Subscriber.find_by(nick: "bob")
|
1493
|
+
|
1494
|
+
subscriber = Subscriber.create!(nick: "bob")
|
1495
|
+
|
1496
|
+
assert_equal subscriber, Subscriber.create_or_find_by!(nick: "bob")
|
1497
|
+
assert_not_equal subscriber, Subscriber.create_or_find_by!(nick: "cat")
|
1498
|
+
end
|
1499
|
+
|
1500
|
+
def test_create_or_find_by_with_bang_should_raise_due_to_validation_errors
|
1501
|
+
assert_raises(ActiveRecord::RecordInvalid) { Bird.create_or_find_by!(color: "green") }
|
1502
|
+
end
|
1503
|
+
|
1504
|
+
def test_create_or_find_by_with_bang_with_non_unique_attributes
|
1505
|
+
Subscriber.create!(nick: "bob", name: "the builder")
|
1506
|
+
|
1507
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
1508
|
+
Subscriber.create_or_find_by!(nick: "bob", name: "the cat")
|
1509
|
+
end
|
1510
|
+
end
|
1511
|
+
|
1512
|
+
def test_create_or_find_by_with_bang_within_transaction
|
1513
|
+
assert_nil Subscriber.find_by(nick: "bob")
|
1514
|
+
|
1515
|
+
subscriber = Subscriber.create!(nick: "bob")
|
1516
|
+
|
1517
|
+
Subscriber.transaction do
|
1518
|
+
assert_equal subscriber, Subscriber.create_or_find_by!(nick: "bob")
|
1519
|
+
assert_not_equal subscriber, Subscriber.create_or_find_by!(nick: "cat")
|
1520
|
+
end
|
1482
1521
|
end
|
1483
1522
|
|
1484
1523
|
def test_find_or_initialize_by
|
1485
|
-
assert_nil Bird.find_by(name:
|
1524
|
+
assert_nil Bird.find_by(name: "bob")
|
1486
1525
|
|
1487
|
-
bird = Bird.find_or_initialize_by(name:
|
1488
|
-
|
1526
|
+
bird = Bird.find_or_initialize_by(name: "bob")
|
1527
|
+
assert_predicate bird, :new_record?
|
1489
1528
|
bird.save!
|
1490
1529
|
|
1491
|
-
assert_equal bird, Bird.find_or_initialize_by(name:
|
1530
|
+
assert_equal bird, Bird.find_or_initialize_by(name: "bob")
|
1492
1531
|
end
|
1493
1532
|
|
1494
|
-
def
|
1495
|
-
hens = Bird.where(:
|
1496
|
-
assert_equal
|
1533
|
+
def test_explicit_create_with
|
1534
|
+
hens = Bird.where(name: "hen")
|
1535
|
+
assert_equal "hen", hens.new.name
|
1497
1536
|
|
1498
|
-
hens = hens.create_with(:
|
1499
|
-
assert_equal
|
1537
|
+
hens = hens.create_with(name: "cock")
|
1538
|
+
assert_equal "cock", hens.new.name
|
1539
|
+
end
|
1540
|
+
|
1541
|
+
def test_create_with_nested_attributes
|
1542
|
+
assert_difference("Project.count", 1) do
|
1543
|
+
developers = Developer.where(name: "Aaron")
|
1544
|
+
developers = developers.create_with(
|
1545
|
+
projects_attributes: [{ name: "p1" }]
|
1546
|
+
)
|
1547
|
+
developers.create!
|
1548
|
+
end
|
1500
1549
|
end
|
1501
1550
|
|
1502
1551
|
def test_except
|
1503
|
-
relation = Post.where(:
|
1552
|
+
relation = Post.where(author_id: 1).order("id ASC").limit(1)
|
1504
1553
|
assert_equal [posts(:welcome)], relation.to_a
|
1505
1554
|
|
1506
1555
|
author_posts = relation.except(:order, :limit)
|
1507
|
-
assert_equal Post.where(:
|
1556
|
+
assert_equal Post.where(author_id: 1).sort_by(&:id), author_posts.sort_by(&:id)
|
1557
|
+
assert_equal author_posts.sort_by(&:id), relation.scoping { Post.except(:order, :limit).sort_by(&:id) }
|
1508
1558
|
|
1509
1559
|
all_posts = relation.except(:where, :order, :limit)
|
1510
|
-
assert_equal Post.all, all_posts
|
1560
|
+
assert_equal Post.all.sort_by(&:id), all_posts.sort_by(&:id)
|
1561
|
+
assert_equal all_posts.sort_by(&:id), relation.scoping { Post.except(:where, :order, :limit).sort_by(&:id) }
|
1511
1562
|
end
|
1512
1563
|
|
1513
1564
|
def test_only
|
1514
|
-
relation = Post.where(:
|
1565
|
+
relation = Post.where(author_id: 1).order("id ASC").limit(1)
|
1515
1566
|
assert_equal [posts(:welcome)], relation.to_a
|
1516
1567
|
|
1517
1568
|
author_posts = relation.only(:where)
|
1518
|
-
assert_equal Post.where(:
|
1569
|
+
assert_equal Post.where(author_id: 1).sort_by(&:id), author_posts.sort_by(&:id)
|
1570
|
+
assert_equal author_posts.sort_by(&:id), relation.scoping { Post.only(:where).sort_by(&:id) }
|
1519
1571
|
|
1520
|
-
all_posts = relation.only(:
|
1521
|
-
assert_equal Post.
|
1572
|
+
all_posts = relation.only(:order)
|
1573
|
+
assert_equal Post.order("id ASC").to_a, all_posts.to_a
|
1574
|
+
assert_equal all_posts.to_a, relation.scoping { Post.only(:order).to_a }
|
1522
1575
|
end
|
1523
1576
|
|
1524
1577
|
def test_anonymous_extension
|
1525
|
-
relation = Post.where(:
|
1578
|
+
relation = Post.where(author_id: 1).order("id ASC").extending do
|
1526
1579
|
def author
|
1527
|
-
|
1580
|
+
"lifo"
|
1528
1581
|
end
|
1529
1582
|
end
|
1530
1583
|
|
@@ -1533,7 +1586,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1533
1586
|
end
|
1534
1587
|
|
1535
1588
|
def test_named_extension
|
1536
|
-
relation = Post.where(:
|
1589
|
+
relation = Post.where(author_id: 1).order("id ASC").extending(Post::NamedExtension)
|
1537
1590
|
assert_equal "lifo", relation.author
|
1538
1591
|
assert_equal "lifo", relation.limit(1).author
|
1539
1592
|
end
|
@@ -1543,29 +1596,29 @@ class RelationTest < ActiveRecord::TestCase
|
|
1543
1596
|
end
|
1544
1597
|
|
1545
1598
|
def test_default_scope_order_with_scope_order
|
1546
|
-
assert_equal
|
1547
|
-
assert_equal
|
1599
|
+
assert_equal "zyke", CoolCar.order_using_new_style.limit(1).first.name
|
1600
|
+
assert_equal "zyke", FastCar.order_using_new_style.limit(1).first.name
|
1548
1601
|
end
|
1549
1602
|
|
1550
1603
|
def test_order_using_scoping
|
1551
|
-
car1 = CoolCar.order(
|
1552
|
-
CoolCar.all.merge!(order:
|
1604
|
+
car1 = CoolCar.order("id DESC").scoping do
|
1605
|
+
CoolCar.all.merge!(order: "id asc").first
|
1553
1606
|
end
|
1554
|
-
assert_equal
|
1607
|
+
assert_equal "zyke", car1.name
|
1555
1608
|
|
1556
|
-
car2 = FastCar.order(
|
1557
|
-
FastCar.all.merge!(order:
|
1609
|
+
car2 = FastCar.order("id DESC").scoping do
|
1610
|
+
FastCar.all.merge!(order: "id asc").first
|
1558
1611
|
end
|
1559
|
-
assert_equal
|
1612
|
+
assert_equal "zyke", car2.name
|
1560
1613
|
end
|
1561
1614
|
|
1562
1615
|
def test_unscoped_block_style
|
1563
|
-
assert_equal
|
1564
|
-
assert_equal
|
1616
|
+
assert_equal "honda", CoolCar.unscoped { CoolCar.order_using_new_style.limit(1).first.name }
|
1617
|
+
assert_equal "honda", FastCar.unscoped { FastCar.order_using_new_style.limit(1).first.name }
|
1565
1618
|
end
|
1566
1619
|
|
1567
1620
|
def test_intersection_with_array
|
1568
|
-
relation = Author.where(:
|
1621
|
+
relation = Author.where(name: "David")
|
1569
1622
|
rails_author = relation.first
|
1570
1623
|
|
1571
1624
|
assert_equal [rails_author], [rails_author] & relation
|
@@ -1577,114 +1630,47 @@ class RelationTest < ActiveRecord::TestCase
|
|
1577
1630
|
end
|
1578
1631
|
|
1579
1632
|
def test_ordering_with_extra_spaces
|
1580
|
-
assert_equal authors(:david), Author.order(
|
1581
|
-
end
|
1582
|
-
|
1583
|
-
def test_update_all_with_blank_argument
|
1584
|
-
assert_raises(ArgumentError) { Comment.update_all({}) }
|
1585
|
-
end
|
1586
|
-
|
1587
|
-
def test_update_all_with_joins
|
1588
|
-
comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id)
|
1589
|
-
count = comments.count
|
1590
|
-
|
1591
|
-
assert_equal count, comments.update_all(:post_id => posts(:thinking).id)
|
1592
|
-
assert_equal posts(:thinking), comments(:greetings).post
|
1593
|
-
end
|
1594
|
-
|
1595
|
-
def test_update_all_with_joins_and_limit
|
1596
|
-
comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id).limit(1)
|
1597
|
-
assert_equal 1, comments.update_all(:post_id => posts(:thinking).id)
|
1598
|
-
end
|
1599
|
-
|
1600
|
-
def test_update_all_with_joins_and_limit_and_order
|
1601
|
-
comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id).order('comments.id').limit(1)
|
1602
|
-
assert_equal 1, comments.update_all(:post_id => posts(:thinking).id)
|
1603
|
-
assert_equal posts(:thinking), comments(:greetings).post
|
1604
|
-
assert_equal posts(:welcome), comments(:more_greetings).post
|
1605
|
-
end
|
1606
|
-
|
1607
|
-
def test_update_all_with_joins_and_offset
|
1608
|
-
all_comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id)
|
1609
|
-
count = all_comments.count
|
1610
|
-
comments = all_comments.offset(1)
|
1611
|
-
|
1612
|
-
assert_equal count - 1, comments.update_all(:post_id => posts(:thinking).id)
|
1613
|
-
end
|
1614
|
-
|
1615
|
-
def test_update_all_with_joins_and_offset_and_order
|
1616
|
-
all_comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id).order('posts.id', 'comments.id')
|
1617
|
-
count = all_comments.count
|
1618
|
-
comments = all_comments.offset(1)
|
1619
|
-
|
1620
|
-
assert_equal count - 1, comments.update_all(:post_id => posts(:thinking).id)
|
1621
|
-
assert_equal posts(:thinking), comments(:more_greetings).post
|
1622
|
-
assert_equal posts(:welcome), comments(:greetings).post
|
1623
|
-
end
|
1624
|
-
|
1625
|
-
def test_update_on_relation
|
1626
|
-
topic1 = TopicWithCallbacks.create! title: 'arel', author_name: nil
|
1627
|
-
topic2 = TopicWithCallbacks.create! title: 'activerecord', author_name: nil
|
1628
|
-
topics = TopicWithCallbacks.where(id: [topic1.id, topic2.id])
|
1629
|
-
topics.update(title: 'adequaterecord')
|
1630
|
-
|
1631
|
-
assert_equal 'adequaterecord', topic1.reload.title
|
1632
|
-
assert_equal 'adequaterecord', topic2.reload.title
|
1633
|
-
# Testing that the before_update callbacks have run
|
1634
|
-
assert_equal 'David', topic1.reload.author_name
|
1635
|
-
assert_equal 'David', topic2.reload.author_name
|
1636
|
-
end
|
1637
|
-
|
1638
|
-
def test_update_on_relation_passing_active_record_object_is_deprecated
|
1639
|
-
topic = Topic.create!(title: 'Foo', author_name: nil)
|
1640
|
-
assert_deprecated(/update/) do
|
1641
|
-
Topic.where(id: topic.id).update(topic, title: 'Bar')
|
1642
|
-
end
|
1633
|
+
assert_equal authors(:david), Author.order("id DESC , name DESC").last
|
1643
1634
|
end
|
1644
1635
|
|
1645
1636
|
def test_distinct
|
1646
|
-
tag1 = Tag.create(:
|
1647
|
-
tag2 = Tag.create(:
|
1637
|
+
tag1 = Tag.create(name: "Foo")
|
1638
|
+
tag2 = Tag.create(name: "Foo")
|
1648
1639
|
|
1649
|
-
query = Tag.select(:name).where(:
|
1640
|
+
query = Tag.select(:name).where(id: [tag1.id, tag2.id])
|
1650
1641
|
|
1651
|
-
assert_equal [
|
1642
|
+
assert_equal ["Foo", "Foo"], query.map(&:name)
|
1652
1643
|
assert_sql(/DISTINCT/) do
|
1653
|
-
assert_equal [
|
1654
|
-
assert_deprecated { assert_equal ['Foo'], query.uniq.map(&:name) }
|
1644
|
+
assert_equal ["Foo"], query.distinct.map(&:name)
|
1655
1645
|
end
|
1656
1646
|
assert_sql(/DISTINCT/) do
|
1657
|
-
assert_equal [
|
1658
|
-
assert_deprecated { assert_equal ['Foo'], query.uniq(true).map(&:name) }
|
1659
|
-
end
|
1660
|
-
assert_equal ['Foo', 'Foo'], query.distinct(true).distinct(false).map(&:name)
|
1661
|
-
|
1662
|
-
assert_deprecated do
|
1663
|
-
assert_equal ['Foo', 'Foo'], query.uniq(true).uniq(false).map(&:name)
|
1647
|
+
assert_equal ["Foo"], query.distinct(true).map(&:name)
|
1664
1648
|
end
|
1649
|
+
assert_equal ["Foo", "Foo"], query.distinct(true).distinct(false).map(&:name)
|
1665
1650
|
end
|
1666
1651
|
|
1667
1652
|
def test_doesnt_add_having_values_if_options_are_blank
|
1668
|
-
scope = Post.having(
|
1669
|
-
|
1653
|
+
scope = Post.having("")
|
1654
|
+
assert_empty scope.having_clause
|
1670
1655
|
|
1671
1656
|
scope = Post.having([])
|
1672
|
-
|
1657
|
+
assert_empty scope.having_clause
|
1673
1658
|
end
|
1674
1659
|
|
1675
1660
|
def test_having_with_binds_for_both_where_and_having
|
1676
1661
|
post = Post.first
|
1677
|
-
having_then_where = Post.having(id: post.id).where(title: post.title).group(:id)
|
1678
|
-
where_then_having = Post.where(title: post.title).having(id: post.id).group(:id)
|
1662
|
+
having_then_where = Post.having(id: post.id).where(title: post.title).group(:id, :author_id, :title, :body, :type, :legacy_comments_count, :taggings_with_delete_all_count, :taggings_with_destroy_count, :tags_count, :indestructible_tags_count, :tags_with_destroy_count, :tags_with_nullify_count)
|
1663
|
+
where_then_having = Post.where(title: post.title).having(id: post.id).group(:id, :author_id, :title, :body, :type, :legacy_comments_count, :taggings_with_delete_all_count, :taggings_with_destroy_count, :tags_count, :indestructible_tags_count, :tags_with_destroy_count, :tags_with_nullify_count)
|
1679
1664
|
|
1680
1665
|
assert_equal [post], having_then_where
|
1681
1666
|
assert_equal [post], where_then_having
|
1682
1667
|
end
|
1683
1668
|
|
1684
1669
|
def test_multiple_where_and_having_clauses
|
1670
|
+
puts "test_multiple_where_and_having_clauses"
|
1685
1671
|
post = Post.first
|
1686
1672
|
having_then_where = Post.having(id: post.id).where(title: post.title)
|
1687
|
-
.having(id: post.id).where(title: post.title).group(:id)
|
1673
|
+
.having(id: post.id).where(title: post.title).group(:id, :author_id, :title, :body, :type, :legacy_comments_count, :taggings_with_delete_all_count, :taggings_with_destroy_count, :tags_count, :indestructible_tags_count, :tags_with_destroy_count, :tags_with_nullify_count)
|
1688
1674
|
|
1689
1675
|
assert_equal [post], having_then_where
|
1690
1676
|
end
|
@@ -1695,72 +1681,86 @@ class RelationTest < ActiveRecord::TestCase
|
|
1695
1681
|
|
1696
1682
|
def test_references_triggers_eager_loading
|
1697
1683
|
scope = Post.includes(:comments)
|
1698
|
-
|
1699
|
-
|
1684
|
+
assert_not_predicate scope, :eager_loading?
|
1685
|
+
assert_predicate scope.references(:comments), :eager_loading?
|
1700
1686
|
end
|
1701
1687
|
|
1702
1688
|
def test_references_doesnt_trigger_eager_loading_if_reference_not_included
|
1703
1689
|
scope = Post.references(:comments)
|
1704
|
-
|
1690
|
+
assert_not_predicate scope, :eager_loading?
|
1705
1691
|
end
|
1706
1692
|
|
1707
1693
|
def test_automatically_added_where_references
|
1708
|
-
scope = Post.where(:
|
1709
|
-
assert_equal [
|
1694
|
+
scope = Post.where(comments: { body: "Bla" })
|
1695
|
+
assert_equal ["comments"], scope.references_values
|
1710
1696
|
|
1711
|
-
scope = Post.where(
|
1712
|
-
assert_equal [
|
1697
|
+
scope = Post.where("comments.body" => "Bla")
|
1698
|
+
assert_equal ["comments"], scope.references_values
|
1713
1699
|
end
|
1714
1700
|
|
1715
1701
|
def test_automatically_added_where_not_references
|
1716
1702
|
scope = Post.where.not(comments: { body: "Bla" })
|
1717
|
-
assert_equal [
|
1703
|
+
assert_equal ["comments"], scope.references_values
|
1718
1704
|
|
1719
|
-
scope = Post.where.not(
|
1720
|
-
assert_equal [
|
1705
|
+
scope = Post.where.not("comments.body" => "Bla")
|
1706
|
+
assert_equal ["comments"], scope.references_values
|
1721
1707
|
end
|
1722
1708
|
|
1723
1709
|
def test_automatically_added_having_references
|
1724
|
-
scope = Post.having(:
|
1725
|
-
assert_equal [
|
1710
|
+
scope = Post.having(comments: { body: "Bla" })
|
1711
|
+
assert_equal ["comments"], scope.references_values
|
1726
1712
|
|
1727
|
-
scope = Post.having(
|
1728
|
-
assert_equal [
|
1713
|
+
scope = Post.having("comments.body" => "Bla")
|
1714
|
+
assert_equal ["comments"], scope.references_values
|
1729
1715
|
end
|
1730
1716
|
|
1731
1717
|
def test_automatically_added_order_references
|
1732
|
-
scope = Post.order(
|
1733
|
-
assert_equal [
|
1718
|
+
scope = Post.order("comments.body")
|
1719
|
+
assert_equal ["comments"], scope.references_values
|
1734
1720
|
|
1735
|
-
scope = Post.order(
|
1736
|
-
|
1721
|
+
scope = Post.order("#{Comment.quoted_table_name}.#{Comment.quoted_primary_key}")
|
1722
|
+
if current_adapter?(:OracleAdapter)
|
1723
|
+
assert_equal ["COMMENTS"], scope.references_values
|
1724
|
+
else
|
1725
|
+
assert_equal ["comments"], scope.references_values
|
1726
|
+
end
|
1727
|
+
|
1728
|
+
scope = Post.order("comments.body", "yaks.body")
|
1729
|
+
assert_equal ["comments", "yaks"], scope.references_values
|
1737
1730
|
|
1738
1731
|
# Don't infer yaks, let's not go down that road again...
|
1739
|
-
scope = Post.order(
|
1740
|
-
assert_equal [
|
1732
|
+
scope = Post.order("comments.body, yaks.body")
|
1733
|
+
assert_equal ["comments"], scope.references_values
|
1741
1734
|
|
1742
|
-
scope = Post.order(
|
1743
|
-
assert_equal [
|
1735
|
+
scope = Post.order("comments.body asc")
|
1736
|
+
assert_equal ["comments"], scope.references_values
|
1744
1737
|
|
1745
|
-
scope = Post.order(
|
1738
|
+
scope = Post.order("foo(comments.body)")
|
1746
1739
|
assert_equal [], scope.references_values
|
1747
1740
|
end
|
1748
1741
|
|
1749
1742
|
def test_automatically_added_reorder_references
|
1750
|
-
scope = Post.reorder(
|
1743
|
+
scope = Post.reorder("comments.body")
|
1751
1744
|
assert_equal %w(comments), scope.references_values
|
1752
1745
|
|
1753
|
-
scope = Post.reorder(
|
1746
|
+
scope = Post.reorder("#{Comment.quoted_table_name}.#{Comment.quoted_primary_key}")
|
1747
|
+
if current_adapter?(:OracleAdapter)
|
1748
|
+
assert_equal ["COMMENTS"], scope.references_values
|
1749
|
+
else
|
1750
|
+
assert_equal ["comments"], scope.references_values
|
1751
|
+
end
|
1752
|
+
|
1753
|
+
scope = Post.reorder("comments.body", "yaks.body")
|
1754
1754
|
assert_equal %w(comments yaks), scope.references_values
|
1755
1755
|
|
1756
1756
|
# Don't infer yaks, let's not go down that road again...
|
1757
|
-
scope = Post.reorder(
|
1757
|
+
scope = Post.reorder("comments.body, yaks.body")
|
1758
1758
|
assert_equal %w(comments), scope.references_values
|
1759
1759
|
|
1760
|
-
scope = Post.reorder(
|
1760
|
+
scope = Post.reorder("comments.body asc")
|
1761
1761
|
assert_equal %w(comments), scope.references_values
|
1762
1762
|
|
1763
|
-
scope = Post.reorder(
|
1763
|
+
scope = Post.reorder("foo(comments.body)")
|
1764
1764
|
assert_equal [], scope.references_values
|
1765
1765
|
end
|
1766
1766
|
|
@@ -1776,6 +1776,27 @@ class RelationTest < ActiveRecord::TestCase
|
|
1776
1776
|
assert_nil relation.order_values.first
|
1777
1777
|
end
|
1778
1778
|
|
1779
|
+
def test_reorder_with_first
|
1780
|
+
sql_log = capture_sql do
|
1781
|
+
message = <<~MSG.squish
|
1782
|
+
`.reorder(nil)` with `.first` / `.first!` no longer
|
1783
|
+
takes non-deterministic result in Rails 7.0.
|
1784
|
+
To continue taking non-deterministic result, use `.take` / `.take!` instead.
|
1785
|
+
MSG
|
1786
|
+
assert_deprecated(message) do
|
1787
|
+
assert Post.order(:title).reorder(nil).first
|
1788
|
+
end
|
1789
|
+
end
|
1790
|
+
assert sql_log.all? { |sql| !/order by/i.match?(sql) }, "ORDER BY was used in the query: #{sql_log}"
|
1791
|
+
end
|
1792
|
+
|
1793
|
+
def test_reorder_with_take
|
1794
|
+
sql_log = capture_sql do
|
1795
|
+
assert Post.order(:title).reorder(nil).take
|
1796
|
+
end
|
1797
|
+
assert sql_log.all? { |sql| !/order by/i.match?(sql) }, "ORDER BY was used in the query: #{sql_log}"
|
1798
|
+
end
|
1799
|
+
|
1779
1800
|
def test_presence
|
1780
1801
|
topics = Topic.all
|
1781
1802
|
|
@@ -1785,7 +1806,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1785
1806
|
# checking if there are topics is used before you actually display them,
|
1786
1807
|
# thus it shouldn't invoke an extra count query.
|
1787
1808
|
assert_no_queries { assert topics.present? }
|
1788
|
-
assert_no_queries {
|
1809
|
+
assert_no_queries { assert_not topics.blank? }
|
1789
1810
|
|
1790
1811
|
# shows count of topics and loops after loading the query should not trigger extra queries either.
|
1791
1812
|
assert_no_queries { topics.size }
|
@@ -1795,7 +1816,25 @@ class RelationTest < ActiveRecord::TestCase
|
|
1795
1816
|
# count always trigger the COUNT query.
|
1796
1817
|
assert_queries(1) { topics.count }
|
1797
1818
|
|
1798
|
-
|
1819
|
+
assert_predicate topics, :loaded?
|
1820
|
+
end
|
1821
|
+
|
1822
|
+
def test_delete_by
|
1823
|
+
david = authors(:david)
|
1824
|
+
|
1825
|
+
assert_difference("Post.count", -3) { david.posts.delete_by(body: "hello") }
|
1826
|
+
|
1827
|
+
deleted = Author.delete_by(id: david.id)
|
1828
|
+
assert_equal 1, deleted
|
1829
|
+
end
|
1830
|
+
|
1831
|
+
def test_destroy_by
|
1832
|
+
david = authors(:david)
|
1833
|
+
|
1834
|
+
assert_difference("Post.count", -3) { david.posts.destroy_by(body: "hello") }
|
1835
|
+
|
1836
|
+
destroyed = Author.destroy_by(id: david.id)
|
1837
|
+
assert_equal [david], destroyed
|
1799
1838
|
end
|
1800
1839
|
|
1801
1840
|
test "find_by with hash conditions returns the first matching record" do
|
@@ -1807,11 +1846,11 @@ class RelationTest < ActiveRecord::TestCase
|
|
1807
1846
|
end
|
1808
1847
|
|
1809
1848
|
test "find_by with multi-arg conditions returns the first matching record" do
|
1810
|
-
assert_equal posts(:eager_other), Post.order(:id).find_by(
|
1849
|
+
assert_equal posts(:eager_other), Post.order(:id).find_by("author_id = ?", 2)
|
1811
1850
|
end
|
1812
1851
|
|
1813
1852
|
test "find_by returns nil if the record is missing" do
|
1814
|
-
|
1853
|
+
assert_nil Post.all.find_by("1 = 0")
|
1815
1854
|
end
|
1816
1855
|
|
1817
1856
|
test "find_by doesn't have implicit ordering" do
|
@@ -1831,7 +1870,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1831
1870
|
end
|
1832
1871
|
|
1833
1872
|
test "find_by! with multi-arg conditions returns the first matching record" do
|
1834
|
-
assert_equal posts(:eager_other), Post.order(:id).find_by!(
|
1873
|
+
assert_equal posts(:eager_other), Post.order(:id).find_by!("author_id = ?", 2)
|
1835
1874
|
end
|
1836
1875
|
|
1837
1876
|
test "find_by! doesn't have implicit ordering" do
|
@@ -1853,7 +1892,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1853
1892
|
relation.to_a
|
1854
1893
|
|
1855
1894
|
assert_raises(ActiveRecord::ImmutableRelation) do
|
1856
|
-
relation.where!
|
1895
|
+
relation.where! "foo"
|
1857
1896
|
end
|
1858
1897
|
end
|
1859
1898
|
|
@@ -1871,7 +1910,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1871
1910
|
relation.to_a
|
1872
1911
|
|
1873
1912
|
assert_raises(ActiveRecord::ImmutableRelation) do
|
1874
|
-
relation.merge! where:
|
1913
|
+
relation.merge! where: "foo"
|
1875
1914
|
end
|
1876
1915
|
end
|
1877
1916
|
|
@@ -1886,7 +1925,7 @@ class RelationTest < ActiveRecord::TestCase
|
|
1886
1925
|
|
1887
1926
|
test "relations with cached arel can't be mutated [internal API]" do
|
1888
1927
|
relation = Post.all
|
1889
|
-
relation.
|
1928
|
+
relation.arel
|
1890
1929
|
|
1891
1930
|
assert_raises(ActiveRecord::ImmutableRelation) { relation.limit!(5) }
|
1892
1931
|
assert_raises(ActiveRecord::ImmutableRelation) { relation.where!("1 = 2") }
|
@@ -1902,6 +1941,18 @@ class RelationTest < ActiveRecord::TestCase
|
|
1902
1941
|
assert_equal "#<ActiveRecord::Relation [#{Post.limit(10).map(&:inspect).join(', ')}, ...]>", relation.inspect
|
1903
1942
|
end
|
1904
1943
|
|
1944
|
+
test "relations don't load all records in #inspect" do
|
1945
|
+
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) do
|
1946
|
+
Post.all.inspect
|
1947
|
+
end
|
1948
|
+
end
|
1949
|
+
|
1950
|
+
test "loading query is annotated in #inspect" do
|
1951
|
+
assert_sql(%r(/\* loading for inspect \*/)) do
|
1952
|
+
Post.all.inspect
|
1953
|
+
end
|
1954
|
+
end
|
1955
|
+
|
1905
1956
|
test "already-loaded relations don't perform a new query in #inspect" do
|
1906
1957
|
relation = Post.limit(2)
|
1907
1958
|
relation.to_a
|
@@ -1913,19 +1964,27 @@ class RelationTest < ActiveRecord::TestCase
|
|
1913
1964
|
end
|
1914
1965
|
end
|
1915
1966
|
|
1916
|
-
test
|
1917
|
-
|
1967
|
+
test "using a custom table affects the wheres" do
|
1968
|
+
post = posts(:welcome)
|
1969
|
+
|
1970
|
+
assert_equal post, custom_post_relation.where!(title: post.title).take
|
1971
|
+
end
|
1972
|
+
|
1973
|
+
test "using a custom table with joins affects the joins" do
|
1974
|
+
post = posts(:welcome)
|
1975
|
+
|
1976
|
+
assert_equal post, custom_post_relation.joins(:author).where!(title: post.title).take
|
1977
|
+
end
|
1918
1978
|
|
1919
|
-
|
1920
|
-
|
1921
|
-
|
1922
|
-
relation.where!(:foo => "bar")
|
1979
|
+
test "arel_table respects a custom table" do
|
1980
|
+
assert_equal [posts(:sti_comments)], custom_post_relation.ranked_by_comments.limit_by(1).to_a
|
1981
|
+
end
|
1923
1982
|
|
1924
|
-
|
1925
|
-
assert_equal
|
1983
|
+
test "alias_tracker respects a custom table" do
|
1984
|
+
assert_equal posts(:welcome), custom_post_relation("categories_posts").joins(:categories).first
|
1926
1985
|
end
|
1927
1986
|
|
1928
|
-
test
|
1987
|
+
test "#load" do
|
1929
1988
|
relation = Post.all
|
1930
1989
|
assert_queries(1) do
|
1931
1990
|
assert_equal relation, relation.load
|
@@ -1933,13 +1992,13 @@ class RelationTest < ActiveRecord::TestCase
|
|
1933
1992
|
assert_no_queries { relation.to_a }
|
1934
1993
|
end
|
1935
1994
|
|
1936
|
-
test
|
1937
|
-
authors_count = Post.select(
|
1938
|
-
group(
|
1995
|
+
test "group with select and includes" do
|
1996
|
+
authors_count = Post.select("author_id, COUNT(author_id) AS num_posts").
|
1997
|
+
group("author_id").order("author_id").includes(:author).to_a
|
1939
1998
|
|
1940
1999
|
assert_no_queries do
|
1941
2000
|
result = authors_count.map do |post|
|
1942
|
-
[post.num_posts, post.author
|
2001
|
+
[post.num_posts, post.author&.name]
|
1943
2002
|
end
|
1944
2003
|
|
1945
2004
|
expected = [[1, nil], [5, "David"], [3, "Mary"], [2, "Bob"]]
|
@@ -1953,74 +2012,240 @@ class RelationTest < ActiveRecord::TestCase
|
|
1953
2012
|
assert_equal [1, 1, 1], posts.map(&:author_address_id)
|
1954
2013
|
end
|
1955
2014
|
|
2015
|
+
test "joins with select custom attribute" do
|
2016
|
+
contract = Company.create!(name: "test").contracts.create!
|
2017
|
+
company = Company.joins(:contracts).select(:id, :metadata).find(contract.company_id)
|
2018
|
+
assert_equal contract.metadata, company.metadata
|
2019
|
+
end
|
2020
|
+
|
2021
|
+
test "joins with order by custom attribute" do
|
2022
|
+
companies = Company.create!([{ name: "test1" }, { name: "test2" }])
|
2023
|
+
companies.each { |company| company.contracts.create! }
|
2024
|
+
assert_equal companies, Company.joins(:contracts).order(:metadata, :count)
|
2025
|
+
assert_equal companies.reverse, Company.joins(:contracts).order(metadata: :desc, count: :desc)
|
2026
|
+
end
|
2027
|
+
|
1956
2028
|
test "delegations do not leak to other classes" do
|
1957
2029
|
Topic.all.by_lifo
|
1958
2030
|
assert Topic.all.class.method_defined?(:by_lifo)
|
1959
|
-
|
2031
|
+
assert_not_respond_to Post.all, :by_lifo
|
1960
2032
|
end
|
1961
2033
|
|
1962
|
-
def
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
2034
|
+
def test_unscope_with_subquery
|
2035
|
+
p1 = Post.where(id: 1)
|
2036
|
+
p2 = Post.where(id: 2)
|
2037
|
+
|
2038
|
+
assert_not_equal p1, p2
|
2039
|
+
|
2040
|
+
comments = Comment.where(post: p1).unscope(where: :post_id).where(post: p2)
|
1966
2041
|
|
1967
|
-
|
1968
|
-
assert_equal
|
2042
|
+
assert_not_equal p1.first.comments, comments
|
2043
|
+
assert_equal p2.first.comments, comments
|
1969
2044
|
end
|
1970
2045
|
|
1971
|
-
def
|
1972
|
-
|
1973
|
-
|
2046
|
+
def test_unscope_with_merge
|
2047
|
+
p0 = Post.where(author_id: 0)
|
2048
|
+
p1 = Post.where(author_id: 1, comments_count: 1)
|
1974
2049
|
|
1975
|
-
|
1976
|
-
assert_equal [],
|
2050
|
+
assert_equal [posts(:authorless)], p0
|
2051
|
+
assert_equal [posts(:thinking)], p1
|
2052
|
+
|
2053
|
+
comments = Comment.merge(p0).unscope(where: :author_id).where(post: p1)
|
2054
|
+
|
2055
|
+
assert_not_equal p0.first.comments, comments
|
2056
|
+
assert_equal p1.first.comments, comments
|
1977
2057
|
end
|
1978
2058
|
|
1979
|
-
def
|
1980
|
-
|
2059
|
+
def test_unscope_with_unknown_column
|
2060
|
+
comment = comments(:greetings)
|
2061
|
+
comment.update!(comments: 1)
|
2062
|
+
|
2063
|
+
comments = Comment.where(comments: 1).unscope(where: :unknown_column)
|
2064
|
+
assert_equal [comment], comments
|
2065
|
+
|
2066
|
+
comments = Comment.where(comments: 1).unscope(where: { comments: :unknown_column })
|
2067
|
+
assert_equal [comment], comments
|
2068
|
+
end
|
2069
|
+
|
2070
|
+
def test_unscope_specific_where_value
|
2071
|
+
posts = Post.where(title: "Welcome to the weblog", body: "Such a lovely day")
|
2072
|
+
|
2073
|
+
assert_equal 1, posts.count
|
2074
|
+
assert_equal 1, posts.unscope(where: :title).count
|
2075
|
+
assert_equal 1, posts.unscope(where: :body).count
|
2076
|
+
end
|
1981
2077
|
|
1982
|
-
|
1983
|
-
|
2078
|
+
def test_unscope_with_aliased_column
|
2079
|
+
posts = Post.where(author: authors(:mary), text: "hullo").order(:id)
|
2080
|
+
assert_equal [posts(:misc_by_mary)], posts
|
1984
2081
|
|
1985
|
-
|
1986
|
-
assert_equal
|
2082
|
+
posts = posts.unscope(where: :"posts.text")
|
2083
|
+
assert_equal posts(:eager_other, :misc_by_mary, :other_by_mary), posts
|
1987
2084
|
end
|
1988
2085
|
|
1989
|
-
def
|
1990
|
-
|
1991
|
-
|
1992
|
-
|
2086
|
+
def test_unscope_with_table_name_qualified_column
|
2087
|
+
comments = Comment.joins(:post).where("posts.id": posts(:thinking))
|
2088
|
+
assert_equal [comments(:does_it_hurt)], comments
|
2089
|
+
|
2090
|
+
comments = comments.where(id: comments(:greetings))
|
2091
|
+
assert_empty comments
|
2092
|
+
|
2093
|
+
comments = comments.unscope(where: :"posts.id")
|
2094
|
+
assert_equal [comments(:greetings)], comments
|
2095
|
+
end
|
2096
|
+
|
2097
|
+
def test_unscope_with_table_name_qualified_hash
|
2098
|
+
comments = Comment.joins(:post).where("posts.id": posts(:thinking))
|
2099
|
+
assert_equal [comments(:does_it_hurt)], comments
|
2100
|
+
|
2101
|
+
comments = comments.where(id: comments(:greetings))
|
2102
|
+
assert_empty comments
|
2103
|
+
|
2104
|
+
comments = comments.unscope(where: { posts: :id })
|
2105
|
+
assert_equal [comments(:greetings)], comments
|
2106
|
+
end
|
2107
|
+
|
2108
|
+
def test_unscope_with_arel_sql
|
2109
|
+
posts = Post.where(Arel.sql("'Welcome to the weblog'").eq(Post.arel_table[:title]))
|
2110
|
+
|
2111
|
+
assert_equal 1, posts.count
|
2112
|
+
assert_equal Post.count, posts.unscope(where: :title).count
|
2113
|
+
|
2114
|
+
posts = Post.where(Arel.sql("posts.title").eq("Welcome to the weblog"))
|
1993
2115
|
|
1994
|
-
|
1995
|
-
assert_equal
|
2116
|
+
assert_equal 1, posts.count
|
2117
|
+
assert_equal 1, posts.unscope(where: :title).count
|
2118
|
+
end
|
2119
|
+
|
2120
|
+
def test_unscope_grouped_where
|
2121
|
+
posts = Post.where(
|
2122
|
+
title: ["Welcome to the weblog", "So I was thinking", nil]
|
2123
|
+
)
|
2124
|
+
|
2125
|
+
assert_equal 2, posts.count
|
2126
|
+
assert_equal Post.count, posts.unscope(where: :title).count
|
2127
|
+
end
|
2128
|
+
|
2129
|
+
def test_locked_should_not_build_arel
|
2130
|
+
posts = Post.locked
|
2131
|
+
assert_predicate posts, :locked?
|
2132
|
+
assert_nothing_raised { posts.lock!(false) }
|
1996
2133
|
end
|
1997
2134
|
|
1998
2135
|
def test_relation_join_method
|
1999
|
-
assert_equal
|
2136
|
+
assert_equal "Thank you for the welcome,Thank you again for the welcome", Post.first.comments.order(:id).join(",")
|
2000
2137
|
end
|
2001
2138
|
|
2002
|
-
def
|
2003
|
-
|
2139
|
+
def test_relation_with_private_kernel_method
|
2140
|
+
accounts = Account.all
|
2141
|
+
assert_equal [accounts(:signals37)], accounts.open
|
2142
|
+
assert_equal [accounts(:signals37)], accounts.available
|
2143
|
+
|
2144
|
+
sub_accounts = SubAccount.all
|
2145
|
+
assert_equal [accounts(:signals37)], sub_accounts.open
|
2146
|
+
assert_equal [accounts(:signals37)], sub_accounts.available
|
2004
2147
|
|
2005
|
-
|
2006
|
-
|
2007
|
-
|
2008
|
-
|
2009
|
-
|
2010
|
-
|
2148
|
+
assert_equal [topics(:second)], topics(:first).open_replies
|
2149
|
+
end
|
2150
|
+
|
2151
|
+
def test_where_with_take_memoization
|
2152
|
+
5.times do |idx|
|
2153
|
+
Post.create!(title: idx.to_s, body: idx.to_s)
|
2011
2154
|
end
|
2012
2155
|
|
2013
|
-
posts.
|
2014
|
-
|
2156
|
+
posts = Post.all
|
2157
|
+
first_post = posts.take
|
2158
|
+
third_post = posts.where(title: "3").take
|
2159
|
+
|
2160
|
+
assert_equal "3", third_post.title
|
2161
|
+
assert_not_same first_post, third_post
|
2162
|
+
end
|
2163
|
+
|
2164
|
+
def test_find_by_with_take_memoization
|
2165
|
+
5.times do |idx|
|
2166
|
+
Post.create!(title: idx.to_s, body: idx.to_s)
|
2015
2167
|
end
|
2016
2168
|
|
2017
|
-
|
2169
|
+
posts = Post.all
|
2170
|
+
first_post = posts.take
|
2171
|
+
third_post = posts.find_by(title: "3")
|
2172
|
+
|
2173
|
+
assert_equal "3", third_post.title
|
2174
|
+
assert_not_same first_post, third_post
|
2018
2175
|
end
|
2019
2176
|
|
2020
|
-
|
2021
|
-
|
2022
|
-
|
2023
|
-
|
2177
|
+
test "#skip_query_cache!" do
|
2178
|
+
Post.cache do
|
2179
|
+
assert_queries(1) do
|
2180
|
+
Post.all.load
|
2181
|
+
Post.all.load
|
2182
|
+
end
|
2183
|
+
|
2184
|
+
assert_queries(2) do
|
2185
|
+
Post.all.skip_query_cache!.load
|
2186
|
+
Post.all.skip_query_cache!.load
|
2187
|
+
end
|
2024
2188
|
end
|
2025
2189
|
end
|
2190
|
+
|
2191
|
+
test "#skip_query_cache! with an eager load" do
|
2192
|
+
Post.cache do
|
2193
|
+
assert_queries(1) do
|
2194
|
+
Post.eager_load(:comments).load
|
2195
|
+
Post.eager_load(:comments).load
|
2196
|
+
end
|
2197
|
+
|
2198
|
+
assert_queries(2) do
|
2199
|
+
Post.eager_load(:comments).skip_query_cache!.load
|
2200
|
+
Post.eager_load(:comments).skip_query_cache!.load
|
2201
|
+
end
|
2202
|
+
end
|
2203
|
+
end
|
2204
|
+
|
2205
|
+
test "#skip_query_cache! with a preload" do
|
2206
|
+
Post.cache do
|
2207
|
+
assert_queries(2) do
|
2208
|
+
Post.preload(:comments).load
|
2209
|
+
Post.preload(:comments).load
|
2210
|
+
end
|
2211
|
+
|
2212
|
+
assert_queries(4) do
|
2213
|
+
Post.preload(:comments).skip_query_cache!.load
|
2214
|
+
Post.preload(:comments).skip_query_cache!.load
|
2215
|
+
end
|
2216
|
+
end
|
2217
|
+
end
|
2218
|
+
|
2219
|
+
test "#where with set" do
|
2220
|
+
david = authors(:david)
|
2221
|
+
mary = authors(:mary)
|
2222
|
+
|
2223
|
+
authors = Author.where(name: ["David", "Mary"].to_set)
|
2224
|
+
assert_equal [david, mary], authors.order(:id)
|
2225
|
+
end
|
2226
|
+
|
2227
|
+
test "#where with empty set" do
|
2228
|
+
authors = Author.where(name: Set.new)
|
2229
|
+
assert_empty authors
|
2230
|
+
end
|
2231
|
+
|
2232
|
+
(ActiveRecord::Relation::MULTI_VALUE_METHODS - [:extending]).each do |method|
|
2233
|
+
test "#{method} with blank value" do
|
2234
|
+
authors = Author.public_send(method, [""])
|
2235
|
+
assert_empty authors.public_send(:"#{method}_values")
|
2236
|
+
end
|
2237
|
+
end
|
2238
|
+
|
2239
|
+
private
|
2240
|
+
def custom_post_relation(alias_name = "omg_posts")
|
2241
|
+
table_alias = Post.arel_table.alias(alias_name)
|
2242
|
+
table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
|
2243
|
+
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
|
2244
|
+
|
2245
|
+
ActiveRecord::Relation.create(
|
2246
|
+
Post,
|
2247
|
+
table: table_alias,
|
2248
|
+
predicate_builder: predicate_builder
|
2249
|
+
)
|
2250
|
+
end
|
2026
2251
|
end
|