ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES +9 -0
- data/LICENSE +55 -18
- data/ext/Makefile +14 -14
- data/ext/extconf.rb +4 -4
- data/ext/ibm_db.c +62 -57
- data/ext/ibm_db.o +0 -0
- data/ext/ibm_db.so +0 -0
- data/ext/mkmf.log +11 -11
- 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 +1463 -1279
- data/lib/ibm_db.so +1 -0
- data/lib/mswin32/ibm_db.rb +7 -3
- data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
- data/lib/mswin32/rb3x/i386/ruby30/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 +196 -11
data/test/cases/finder_test.rb
CHANGED
@@ -1,35 +1,42 @@
|
|
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
|
19
|
-
require
|
4
|
+
require "models/post"
|
5
|
+
require "models/author"
|
6
|
+
require "models/account"
|
7
|
+
require "models/categorization"
|
8
|
+
require "models/comment"
|
9
|
+
require "models/company"
|
10
|
+
require "models/tagging"
|
11
|
+
require "models/topic"
|
12
|
+
require "models/reply"
|
13
|
+
require "models/rating"
|
14
|
+
require "models/entrant"
|
15
|
+
require "models/project"
|
16
|
+
require "models/developer"
|
17
|
+
require "models/computer"
|
18
|
+
require "models/customer"
|
19
|
+
require "models/toy"
|
20
|
+
require "models/matey"
|
21
|
+
require "models/dog"
|
22
|
+
require "models/car"
|
23
|
+
require "models/tyre"
|
24
|
+
require "models/subscriber"
|
25
|
+
require "models/non_primary_key"
|
26
|
+
require "support/stubs/strong_parameters"
|
20
27
|
|
21
28
|
class FinderTest < ActiveRecord::TestCase
|
22
29
|
fixtures :companies, :topics, :entrants, :developers, :developers_projects, :posts, :comments, :accounts, :authors, :author_addresses, :customers, :categories, :categorizations, :cars
|
23
30
|
|
24
31
|
def test_find_by_id_with_hash
|
25
|
-
|
26
|
-
Post.find_by_id(:
|
32
|
+
assert_nothing_raised do
|
33
|
+
Post.find_by_id(limit: 1)
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
30
37
|
def test_find_by_title_and_id_with_hash
|
31
|
-
|
32
|
-
Post.find_by_title_and_id(
|
38
|
+
assert_nothing_raised do
|
39
|
+
Post.find_by_title_and_id("foo", limit: 1)
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
@@ -37,6 +44,11 @@ class FinderTest < ActiveRecord::TestCase
|
|
37
44
|
assert_equal(topics(:first).title, Topic.find(1).title)
|
38
45
|
end
|
39
46
|
|
47
|
+
def test_find_with_hash_parameter
|
48
|
+
assert_raises(ActiveRecord::RecordNotFound) { Post.find(foo: "bar") }
|
49
|
+
assert_raises(ActiveRecord::RecordNotFound) { Post.find(foo: "bar", bar: "baz") }
|
50
|
+
end
|
51
|
+
|
40
52
|
def test_find_with_proc_parameter_and_block
|
41
53
|
exception = assert_raises(RuntimeError) do
|
42
54
|
Topic.all.find(-> { raise "should happen" }) { |e| e.title == "non-existing-title" }
|
@@ -49,78 +61,91 @@ class FinderTest < ActiveRecord::TestCase
|
|
49
61
|
end
|
50
62
|
|
51
63
|
def test_find_with_ids_returning_ordered
|
52
|
-
|
53
|
-
|
54
|
-
assert_equal
|
55
|
-
assert_equal
|
56
|
-
assert_equal 'The Fifth Topic of the day', records[2].title
|
64
|
+
records = Topic.find([4, 2, 5])
|
65
|
+
assert_equal "The Fourth Topic of the day", records[0].title
|
66
|
+
assert_equal "The Second Topic of the day", records[1].title
|
67
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
57
68
|
|
58
|
-
records = Topic.find(4,2,5)
|
59
|
-
assert_equal
|
60
|
-
assert_equal
|
61
|
-
assert_equal
|
69
|
+
records = Topic.find(4, 2, 5)
|
70
|
+
assert_equal "The Fourth Topic of the day", records[0].title
|
71
|
+
assert_equal "The Second Topic of the day", records[1].title
|
72
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
62
73
|
|
63
|
-
records = Topic.find([
|
64
|
-
assert_equal
|
65
|
-
assert_equal
|
66
|
-
assert_equal
|
74
|
+
records = Topic.find(["4", "2", "5"])
|
75
|
+
assert_equal "The Fourth Topic of the day", records[0].title
|
76
|
+
assert_equal "The Second Topic of the day", records[1].title
|
77
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
67
78
|
|
68
|
-
records = Topic.find(
|
69
|
-
assert_equal
|
70
|
-
assert_equal
|
71
|
-
assert_equal
|
79
|
+
records = Topic.find("4", "2", "5")
|
80
|
+
assert_equal "The Fourth Topic of the day", records[0].title
|
81
|
+
assert_equal "The Second Topic of the day", records[1].title
|
82
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
72
83
|
end
|
73
84
|
|
74
85
|
def test_find_with_ids_and_order_clause
|
75
86
|
# The order clause takes precedence over the informed ids
|
76
|
-
records = Topic.order(:author_name).find([5,3,1])
|
77
|
-
assert_equal
|
78
|
-
assert_equal
|
79
|
-
assert_equal
|
87
|
+
records = Topic.order(:author_name).find([5, 3, 1])
|
88
|
+
assert_equal "The Third Topic of the day", records[0].title
|
89
|
+
assert_equal "The First Topic", records[1].title
|
90
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
80
91
|
|
81
|
-
records = Topic.order(:id).find([5,3,1])
|
82
|
-
assert_equal
|
83
|
-
assert_equal
|
84
|
-
assert_equal
|
92
|
+
records = Topic.order(:id).find([5, 3, 1])
|
93
|
+
assert_equal "The First Topic", records[0].title
|
94
|
+
assert_equal "The Third Topic of the day", records[1].title
|
95
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
85
96
|
end
|
86
97
|
|
87
98
|
def test_find_with_ids_with_limit_and_order_clause
|
88
|
-
puts "finder_test.test_find_with_ids_with_limit_and_order_clause"
|
89
99
|
# The order clause takes precedence over the informed ids
|
90
|
-
records = Topic.limit(2).order(:id).find([5,3,1])
|
100
|
+
records = Topic.limit(2).order(:id).find([5, 3, 1])
|
91
101
|
assert_equal 2, records.size
|
92
|
-
assert_equal
|
93
|
-
assert_equal
|
102
|
+
assert_equal "The First Topic", records[0].title
|
103
|
+
assert_equal "The Third Topic of the day", records[1].title
|
94
104
|
end
|
95
105
|
|
96
106
|
def test_find_with_ids_and_limit
|
97
|
-
records = Topic.limit(3).find([3,2,5,1,4])
|
107
|
+
records = Topic.limit(3).find([3, 2, 5, 1, 4])
|
98
108
|
assert_equal 3, records.size
|
99
|
-
assert_equal
|
100
|
-
assert_equal
|
101
|
-
assert_equal
|
109
|
+
assert_equal "The Third Topic of the day", records[0].title
|
110
|
+
assert_equal "The Second Topic of the day", records[1].title
|
111
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
102
112
|
end
|
103
113
|
|
104
114
|
def test_find_with_ids_where_and_limit
|
105
115
|
# Please note that Topic 1 is the only not approved so
|
106
116
|
# if it were among the first 3 it would raise an ActiveRecord::RecordNotFound
|
107
|
-
records = Topic.where(approved: true).limit(3).find([3,2,5,1,4])
|
117
|
+
records = Topic.where(approved: true).limit(3).find([3, 2, 5, 1, 4])
|
108
118
|
assert_equal 3, records.size
|
109
|
-
assert_equal
|
110
|
-
assert_equal
|
111
|
-
assert_equal
|
119
|
+
assert_equal "The Third Topic of the day", records[0].title
|
120
|
+
assert_equal "The Second Topic of the day", records[1].title
|
121
|
+
assert_equal "The Fifth Topic of the day", records[2].title
|
112
122
|
end
|
113
123
|
|
114
124
|
def test_find_with_ids_and_offset
|
115
|
-
records = Topic.offset(2).find([3,2,5,1,4])
|
125
|
+
records = Topic.offset(2).find([3, 2, 5, 1, 4])
|
116
126
|
assert_equal 3, records.size
|
117
|
-
assert_equal
|
118
|
-
assert_equal
|
119
|
-
assert_equal
|
127
|
+
assert_equal "The Fifth Topic of the day", records[0].title
|
128
|
+
assert_equal "The First Topic", records[1].title
|
129
|
+
assert_equal "The Fourth Topic of the day", records[2].title
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_find_with_ids_with_no_id_passed
|
133
|
+
exception = assert_raises(ActiveRecord::RecordNotFound) { Topic.find }
|
134
|
+
assert_equal exception.model, "Topic"
|
135
|
+
assert_equal exception.primary_key, "id"
|
120
136
|
end
|
121
137
|
|
122
|
-
def
|
123
|
-
|
138
|
+
def test_find_with_ids_with_id_out_of_range
|
139
|
+
exception = assert_raises(ActiveRecord::RecordNotFound) do
|
140
|
+
Topic.find("9999999999999999999999999999999")
|
141
|
+
end
|
142
|
+
|
143
|
+
assert_equal exception.model, "Topic"
|
144
|
+
assert_equal exception.primary_key, "id"
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_find_passing_active_record_object_is_not_permitted
|
148
|
+
assert_raises(ArgumentError) do
|
124
149
|
Topic.find(Topic.last)
|
125
150
|
end
|
126
151
|
end
|
@@ -129,7 +154,7 @@ class FinderTest < ActiveRecord::TestCase
|
|
129
154
|
gc_disabled = GC.disable
|
130
155
|
Post.where("author_id" => nil) # warm up
|
131
156
|
x = Symbol.all_symbols.count
|
132
|
-
Post.where("title" => {"xxxqqqq" => "bar"})
|
157
|
+
Post.where("title" => { "xxxqqqq" => "bar" })
|
133
158
|
assert_equal x, Symbol.all_symbols.count
|
134
159
|
ensure
|
135
160
|
GC.enable if gc_disabled == false
|
@@ -138,7 +163,7 @@ class FinderTest < ActiveRecord::TestCase
|
|
138
163
|
# find should handle strings that come from URLs
|
139
164
|
# (example: Category.find(params[:id]))
|
140
165
|
def test_find_with_string
|
141
|
-
assert_equal(Topic.find(1).title,Topic.find("1").title)
|
166
|
+
assert_equal(Topic.find(1).title, Topic.find("1").title)
|
142
167
|
end
|
143
168
|
|
144
169
|
def test_exists
|
@@ -146,23 +171,49 @@ class FinderTest < ActiveRecord::TestCase
|
|
146
171
|
assert_equal true, Topic.exists?("1")
|
147
172
|
assert_equal true, Topic.exists?(title: "The First Topic")
|
148
173
|
assert_equal true, Topic.exists?(heading: "The First Topic")
|
149
|
-
assert_equal true, Topic.exists?(:
|
174
|
+
assert_equal true, Topic.exists?(author_name: "Mary", approved: true)
|
150
175
|
assert_equal true, Topic.exists?(["parent_id = ?", 1])
|
151
176
|
assert_equal true, Topic.exists?(id: [1, 9999])
|
152
177
|
|
153
178
|
assert_equal false, Topic.exists?(45)
|
179
|
+
assert_equal false, Topic.exists?(9999999999999999999999999999999)
|
154
180
|
assert_equal false, Topic.exists?(Topic.new.id)
|
155
181
|
|
156
|
-
assert_raise(NoMethodError) { Topic.exists?([1,2]) }
|
182
|
+
assert_raise(NoMethodError) { Topic.exists?([1, 2]) }
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_exists_with_scope
|
186
|
+
davids = Author.where(name: "David")
|
187
|
+
assert_equal true, davids.exists?
|
188
|
+
assert_equal true, davids.exists?(authors(:david).id)
|
189
|
+
assert_equal false, davids.exists?(authors(:mary).id)
|
190
|
+
assert_equal false, davids.exists?("42")
|
191
|
+
assert_equal false, davids.exists?(42)
|
192
|
+
assert_equal false, davids.exists?(davids.new.id)
|
193
|
+
|
194
|
+
fake = Author.where(name: "fake author")
|
195
|
+
assert_equal false, fake.exists?
|
196
|
+
assert_equal false, fake.exists?(authors(:david).id)
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_exists_uses_existing_scope
|
200
|
+
post = authors(:david).posts.first
|
201
|
+
authors = Author.includes(:posts).where(name: "David", posts: { id: post.id })
|
202
|
+
assert_equal true, authors.exists?(authors(:david).id)
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_any_with_scope_on_hash_includes
|
206
|
+
post = authors(:david).posts.first
|
207
|
+
categories = Categorization.includes(author: :posts).where(posts: { id: post.id })
|
208
|
+
assert_equal true, categories.exists?
|
157
209
|
end
|
158
210
|
|
159
211
|
def test_exists_with_polymorphic_relation
|
160
|
-
|
161
|
-
|
162
|
-
relation = Post.tagged_with_comment('tagging comment')
|
212
|
+
post = Post.create!(title: "Post", body: "default", taggings: [Tagging.new(comment: "tagging comment")])
|
213
|
+
relation = Post.tagged_with_comment("tagging comment")
|
163
214
|
|
164
|
-
assert_equal true, relation.exists?(title: [
|
165
|
-
assert_equal true, relation.exists?([
|
215
|
+
assert_equal true, relation.exists?(title: ["Post"])
|
216
|
+
assert_equal true, relation.exists?(["title LIKE ?", "Post%"])
|
166
217
|
assert_equal true, relation.exists?
|
167
218
|
assert_equal true, relation.exists?(post.id)
|
168
219
|
assert_equal true, relation.exists?(post.id.to_s)
|
@@ -170,23 +221,38 @@ class FinderTest < ActiveRecord::TestCase
|
|
170
221
|
assert_equal false, relation.exists?(false)
|
171
222
|
end
|
172
223
|
|
173
|
-
def
|
174
|
-
|
175
|
-
|
224
|
+
def test_exists_with_string
|
225
|
+
assert_equal false, Subscriber.exists?("foo")
|
226
|
+
assert_equal false, Subscriber.exists?(" ")
|
227
|
+
|
228
|
+
Subscriber.create!(id: "foo")
|
229
|
+
Subscriber.create!(id: " ")
|
230
|
+
|
231
|
+
assert_equal true, Subscriber.exists?("foo")
|
232
|
+
assert_equal true, Subscriber.exists?(" ")
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_exists_with_strong_parameters
|
236
|
+
assert_equal false, Subscriber.exists?(ProtectedParams.new(nick: "foo").permit!)
|
237
|
+
|
238
|
+
Subscriber.create!(nick: "foo")
|
239
|
+
|
240
|
+
assert_equal true, Subscriber.exists?(ProtectedParams.new(nick: "foo").permit!)
|
241
|
+
|
242
|
+
assert_raises(ActiveModel::ForbiddenAttributesError) do
|
243
|
+
Subscriber.exists?(ProtectedParams.new(nick: "foo"))
|
176
244
|
end
|
177
245
|
end
|
178
246
|
|
179
|
-
def
|
180
|
-
|
181
|
-
|
182
|
-
assert_equal false, Topic.exists?(("9"*53).to_i) # number that's bigger than int
|
247
|
+
def test_exists_passing_active_record_object_is_not_permitted
|
248
|
+
assert_raises(ArgumentError) do
|
249
|
+
Topic.exists?(Topic.new)
|
183
250
|
end
|
184
|
-
assert_equal false, Topic.exists?("foo")
|
185
251
|
end
|
186
252
|
|
187
253
|
def test_exists_does_not_select_columns_without_alias
|
188
|
-
|
189
|
-
assert_sql(/SELECT
|
254
|
+
c = Topic.connection
|
255
|
+
assert_sql(/SELECT 1 AS one FROM #{Regexp.escape(c.quote_table_name("topics"))}/i) do
|
190
256
|
Topic.exists?
|
191
257
|
end
|
192
258
|
end
|
@@ -209,29 +275,81 @@ class FinderTest < ActiveRecord::TestCase
|
|
209
275
|
assert_equal true, Topic.first.replies.exists?
|
210
276
|
end
|
211
277
|
|
212
|
-
|
213
|
-
|
278
|
+
def test_exists_with_empty_hash_arg
|
279
|
+
assert_equal true, Topic.exists?({})
|
280
|
+
end
|
281
|
+
|
282
|
+
def test_exists_with_distinct_and_offset_and_joins
|
283
|
+
assert Post.left_joins(:comments).distinct.offset(10).exists?
|
284
|
+
assert_not Post.left_joins(:comments).distinct.offset(11).exists?
|
285
|
+
end
|
286
|
+
|
287
|
+
def test_exists_with_distinct_and_offset_and_select
|
288
|
+
assert Post.select(:body).distinct.offset(4).exists?
|
289
|
+
assert_not Post.select(:body).distinct.offset(5).exists?
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_exists_with_distinct_and_offset_and_eagerload_and_order
|
293
|
+
assert Post.eager_load(:comments).distinct.offset(10).merge(Comment.order(post_id: :asc)).exists?
|
294
|
+
assert_not Post.eager_load(:comments).distinct.offset(11).merge(Comment.order(post_id: :asc)).exists?
|
295
|
+
end
|
296
|
+
|
297
|
+
# Ensure +exists?+ runs without an error by excluding distinct value.
|
298
|
+
# See https://github.com/rails/rails/pull/26981.
|
299
|
+
def test_exists_with_order_and_distinct
|
214
300
|
assert_equal true, Topic.order(:id).distinct.exists?
|
215
301
|
end
|
216
302
|
|
303
|
+
# Ensure +exists?+ runs without an error by excluding order value.
|
304
|
+
def test_exists_with_order
|
305
|
+
assert_equal true, Topic.order(Arel.sql("invalid sql here")).exists?
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_exists_with_large_number
|
309
|
+
assert_equal true, Topic.where(id: [1, 9223372036854775808]).exists?
|
310
|
+
assert_equal true, Topic.where(id: 1..9223372036854775808).exists?
|
311
|
+
assert_equal true, Topic.where(id: -9223372036854775809..9223372036854775808).exists?
|
312
|
+
assert_equal false, Topic.where(id: 9223372036854775808..9223372036854775809).exists?
|
313
|
+
assert_equal false, Topic.where(id: -9223372036854775810..-9223372036854775809).exists?
|
314
|
+
assert_equal false, Topic.where(id: 9223372036854775808..1).exists?
|
315
|
+
assert_equal true, Topic.where(id: 1).or(Topic.where(id: 9223372036854775808)).exists?
|
316
|
+
assert_equal true, Topic.where.not(id: 9223372036854775808).exists?
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_exists_with_joins
|
320
|
+
assert_equal true, Topic.joins(:replies).where(replies_topics: { approved: true }).order("replies_topics.created_at DESC").exists?
|
321
|
+
end
|
322
|
+
|
323
|
+
def test_exists_with_left_joins
|
324
|
+
assert_equal true, Topic.left_joins(:replies).where(replies_topics: { approved: true }).order("replies_topics.created_at DESC").exists?
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_exists_with_eager_load
|
328
|
+
assert_equal true, Topic.eager_load(:replies).where(replies_topics: { approved: true }).order("replies_topics.created_at DESC").exists?
|
329
|
+
end
|
330
|
+
|
217
331
|
def test_exists_with_includes_limit_and_empty_result
|
218
|
-
|
219
|
-
assert_equal false, Topic.includes(:replies).limit(0).exists?
|
220
|
-
assert_equal false, Topic.includes(:replies).limit(1).where('0 = 1').exists?
|
332
|
+
assert_no_queries { assert_equal false, Topic.includes(:replies).limit(0).exists? }
|
333
|
+
assert_queries(1) { assert_equal false, Topic.includes(:replies).limit(1).where("0 = 1").exists? }
|
221
334
|
end
|
222
335
|
|
223
336
|
def test_exists_with_distinct_association_includes_and_limit
|
224
|
-
puts "finder_test.test_exists_with_distinct_association_includes_and_limit"
|
225
337
|
author = Author.first
|
226
|
-
|
227
|
-
assert_equal
|
338
|
+
unique_categorized_posts = author.unique_categorized_posts.includes(:special_comments)
|
339
|
+
assert_no_queries { assert_equal false, unique_categorized_posts.limit(0).exists? }
|
340
|
+
assert_queries(1) { assert_equal true, unique_categorized_posts.limit(1).exists? }
|
228
341
|
end
|
229
342
|
|
230
343
|
def test_exists_with_distinct_association_includes_limit_and_order
|
231
|
-
puts "finder_test.test_exists_with_distinct_association_includes_limit_and_order"
|
232
344
|
author = Author.first
|
233
|
-
|
234
|
-
assert_equal
|
345
|
+
unique_categorized_posts = author.unique_categorized_posts.includes(:special_comments).order("comments.tags_count DESC")
|
346
|
+
assert_no_queries { assert_equal false, unique_categorized_posts.limit(0).exists? }
|
347
|
+
assert_queries(1) { assert_equal true, unique_categorized_posts.limit(1).exists? }
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_exists_should_reference_correct_aliases_while_joining_tables_of_has_many_through_association
|
351
|
+
ratings = developers(:david).ratings.includes(comment: :post).where(posts: { id: 1 })
|
352
|
+
assert_queries(1) { assert_not_predicate ratings.limit(1), :exists? }
|
235
353
|
end
|
236
354
|
|
237
355
|
def test_exists_with_empty_table_and_no_args_given
|
@@ -241,17 +359,14 @@ class FinderTest < ActiveRecord::TestCase
|
|
241
359
|
|
242
360
|
def test_exists_with_aggregate_having_three_mappings
|
243
361
|
existing_address = customers(:david).address
|
244
|
-
assert_equal true, Customer.exists?(:
|
362
|
+
assert_equal true, Customer.exists?(address: existing_address)
|
245
363
|
end
|
246
364
|
|
247
365
|
def test_exists_with_aggregate_having_three_mappings_with_one_difference
|
248
366
|
existing_address = customers(:david).address
|
249
|
-
assert_equal false, Customer.exists?(:
|
250
|
-
|
251
|
-
assert_equal false, Customer.exists?(:
|
252
|
-
Address.new(existing_address.street, existing_address.city + "1", existing_address.country))
|
253
|
-
assert_equal false, Customer.exists?(:address =>
|
254
|
-
Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
|
367
|
+
assert_equal false, Customer.exists?(address: Address.new(existing_address.street, existing_address.city, existing_address.country + "1"))
|
368
|
+
assert_equal false, Customer.exists?(address: Address.new(existing_address.street, existing_address.city + "1", existing_address.country))
|
369
|
+
assert_equal false, Customer.exists?(address: Address.new(existing_address.street + "1", existing_address.city, existing_address.country))
|
255
370
|
end
|
256
371
|
|
257
372
|
def test_exists_does_not_instantiate_records
|
@@ -260,6 +375,125 @@ class FinderTest < ActiveRecord::TestCase
|
|
260
375
|
end
|
261
376
|
end
|
262
377
|
|
378
|
+
def test_include_on_unloaded_relation_with_match
|
379
|
+
assert_sql(/1 AS one.*LIMIT/) do
|
380
|
+
assert_equal true, Customer.where(name: "David").include?(customers(:david))
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_include_on_unloaded_relation_without_match
|
385
|
+
assert_sql(/1 AS one.*LIMIT/) do
|
386
|
+
assert_equal false, Customer.where(name: "David").include?(customers(:mary))
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
def test_include_on_unloaded_relation_with_mismatched_class
|
391
|
+
topic = topics(:first)
|
392
|
+
assert Customer.exists?(topic.id)
|
393
|
+
|
394
|
+
assert_no_queries do
|
395
|
+
assert_equal false, Customer.where(name: "David").include?(topic)
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
def test_include_on_unloaded_relation_with_offset
|
400
|
+
assert_sql(/ORDER BY name ASC/) do
|
401
|
+
assert_equal true, Customer.offset(1).order("name ASC").include?(customers(:mary))
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
def test_include_on_unloaded_relation_with_limit
|
406
|
+
mary = customers(:mary)
|
407
|
+
barney = customers(:barney)
|
408
|
+
david = customers(:david)
|
409
|
+
|
410
|
+
assert_equal false, Customer.order(id: :desc).limit(2).include?(david)
|
411
|
+
assert_equal true, Customer.order(id: :desc).limit(2).include?(barney)
|
412
|
+
assert_equal true, Customer.order(id: :desc).limit(2).include?(mary)
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_include_on_unloaded_relation_with_having_referencing_aliased_select
|
416
|
+
skip if current_adapter?(:PostgreSQLAdapter)
|
417
|
+
bob = authors(:bob)
|
418
|
+
mary = authors(:mary)
|
419
|
+
|
420
|
+
assert_equal false, Author.select("COUNT(*) as total_posts", "authors.*").joins(:posts).group(:id).having("total_posts > 2").include?(bob)
|
421
|
+
assert_equal true, Author.select("COUNT(*) as total_posts", "authors.*").joins(:posts).group(:id).having("total_posts > 2").include?(mary)
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_include_on_loaded_relation_with_match
|
425
|
+
customers = Customer.where(name: "David").load
|
426
|
+
david = customers(:david)
|
427
|
+
|
428
|
+
assert_no_queries do
|
429
|
+
assert_equal true, customers.include?(david)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
def test_include_on_loaded_relation_without_match
|
434
|
+
customers = Customer.where(name: "David").load
|
435
|
+
mary = customers(:mary)
|
436
|
+
|
437
|
+
assert_no_queries do
|
438
|
+
assert_equal false, customers.include?(mary)
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
def test_member_on_unloaded_relation_with_match
|
443
|
+
assert_sql(/1 AS one.*LIMIT/) do
|
444
|
+
assert_equal true, Customer.where(name: "David").member?(customers(:david))
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
def test_member_on_unloaded_relation_without_match
|
449
|
+
assert_sql(/1 AS one.*LIMIT/) do
|
450
|
+
assert_equal false, Customer.where(name: "David").member?(customers(:mary))
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
454
|
+
def test_member_on_unloaded_relation_with_mismatched_class
|
455
|
+
topic = topics(:first)
|
456
|
+
assert Customer.exists?(topic.id)
|
457
|
+
|
458
|
+
assert_no_queries do
|
459
|
+
assert_equal false, Customer.where(name: "David").member?(topic)
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
def test_member_on_unloaded_relation_with_offset
|
464
|
+
assert_sql(/ORDER BY name ASC/) do
|
465
|
+
assert_equal true, Customer.offset(1).order("name ASC").member?(customers(:mary))
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
def test_member_on_unloaded_relation_with_limit
|
470
|
+
mary = customers(:mary)
|
471
|
+
barney = customers(:barney)
|
472
|
+
david = customers(:david)
|
473
|
+
|
474
|
+
assert_equal false, Customer.order(id: :desc).limit(2).member?(david)
|
475
|
+
assert_equal true, Customer.order(id: :desc).limit(2).member?(barney)
|
476
|
+
assert_equal true, Customer.order(id: :desc).limit(2).member?(mary)
|
477
|
+
end
|
478
|
+
|
479
|
+
def test_member_on_loaded_relation_with_match
|
480
|
+
customers = Customer.where(name: "David").load
|
481
|
+
david = customers(:david)
|
482
|
+
|
483
|
+
assert_no_queries do
|
484
|
+
assert_equal true, customers.member?(david)
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_member_on_loaded_relation_without_match
|
489
|
+
customers = Customer.where(name: "David").load
|
490
|
+
mary = customers(:mary)
|
491
|
+
|
492
|
+
assert_no_queries do
|
493
|
+
assert_equal false, customers.member?(mary)
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
263
497
|
def test_find_by_array_of_one_id
|
264
498
|
assert_kind_of(Array, Topic.find([ 1 ]))
|
265
499
|
assert_equal(1, Topic.find([ 1 ]).length)
|
@@ -271,47 +505,63 @@ class FinderTest < ActiveRecord::TestCase
|
|
271
505
|
end
|
272
506
|
|
273
507
|
def test_find_by_ids_with_limit_and_offset
|
274
|
-
assert_equal 2, Entrant.limit(2).find([1,3,2]).size
|
275
|
-
entrants = Entrant.limit(3).offset(2).find([1,3,2])
|
508
|
+
assert_equal 2, Entrant.limit(2).find([1, 3, 2]).size
|
509
|
+
entrants = Entrant.limit(3).offset(2).find([1, 3, 2])
|
276
510
|
assert_equal 1, entrants.size
|
277
|
-
assert_equal
|
511
|
+
assert_equal "Ruby Guru", entrants.first.name
|
278
512
|
|
279
513
|
# Also test an edge case: If you have 11 results, and you set a
|
280
514
|
# limit of 3 and offset of 9, then you should find that there
|
281
515
|
# will be only 2 results, regardless of the limit.
|
282
516
|
devs = Developer.all
|
283
|
-
last_devs = Developer.limit(3).offset(9).find
|
517
|
+
last_devs = Developer.limit(3).offset(9).find(devs.map(&:id).sort)
|
284
518
|
assert_equal 2, last_devs.size
|
285
|
-
assert_equal
|
286
|
-
assert_equal
|
519
|
+
assert_equal "fixture_10", last_devs[0].name
|
520
|
+
assert_equal "Jamis", last_devs[1].name
|
287
521
|
end
|
288
522
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
523
|
+
def test_find_with_large_number
|
524
|
+
assert_queries(0) do
|
525
|
+
assert_raises(ActiveRecord::RecordNotFound) { Topic.find("9999999999999999999999999999999") }
|
526
|
+
end
|
527
|
+
end
|
293
528
|
|
294
|
-
|
295
|
-
|
296
|
-
|
529
|
+
def test_find_by_with_large_number
|
530
|
+
assert_queries(0) do
|
531
|
+
assert_nil Topic.find_by(id: "9999999999999999999999999999999")
|
532
|
+
end
|
533
|
+
end
|
297
534
|
|
298
|
-
|
299
|
-
|
300
|
-
|
535
|
+
def test_find_by_id_with_large_number
|
536
|
+
assert_queries(0) do
|
537
|
+
assert_nil Topic.find_by_id("9999999999999999999999999999999")
|
538
|
+
end
|
539
|
+
end
|
540
|
+
|
541
|
+
def test_find_on_relation_with_large_number
|
542
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
543
|
+
Topic.where("1=1").find(9999999999999999999999999999999)
|
544
|
+
end
|
545
|
+
assert_equal topics(:first), Topic.where(id: [1, 9999999999999999999999999999999]).find(1)
|
546
|
+
end
|
301
547
|
|
302
|
-
|
303
|
-
|
304
|
-
|
548
|
+
def test_find_by_on_relation_with_large_number
|
549
|
+
assert_nil Topic.where("1=1").find_by(id: 9999999999999999999999999999999)
|
550
|
+
assert_equal topics(:first), Topic.where(id: [1, 9999999999999999999999999999999]).find_by(id: 1)
|
551
|
+
end
|
305
552
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
553
|
+
def test_find_by_bang_on_relation_with_large_number
|
554
|
+
assert_raises(ActiveRecord::RecordNotFound) do
|
555
|
+
Topic.where("1=1").find_by!(id: 9999999999999999999999999999999)
|
556
|
+
end
|
557
|
+
assert_equal topics(:first), Topic.where(id: [1, 9999999999999999999999999999999]).find_by!(id: 1)
|
311
558
|
end
|
312
559
|
|
313
560
|
def test_find_an_empty_array
|
314
|
-
|
561
|
+
empty_array = []
|
562
|
+
result = Topic.find(empty_array)
|
563
|
+
assert_equal [], result
|
564
|
+
assert_not_same empty_array, result
|
315
565
|
end
|
316
566
|
|
317
567
|
def test_find_doesnt_have_implicit_ordering
|
@@ -323,7 +573,7 @@ class FinderTest < ActiveRecord::TestCase
|
|
323
573
|
end
|
324
574
|
|
325
575
|
def test_find_with_group_and_sanitized_having_method
|
326
|
-
developers = Developer.group(:salary).having("sum(salary) > ?", 10000).select(
|
576
|
+
developers = Developer.group(:salary).having("sum(salary) > ?", 10000).select("salary").to_a
|
327
577
|
assert_equal 3, developers.size
|
328
578
|
assert_equal 3, developers.map(&:salary).uniq.size
|
329
579
|
assert developers.all? { |developer| developer.salary > 10000 }
|
@@ -349,18 +599,23 @@ class FinderTest < ActiveRecord::TestCase
|
|
349
599
|
end
|
350
600
|
|
351
601
|
def test_find_by_association_subquery
|
352
|
-
|
353
|
-
assert_equal
|
354
|
-
assert_equal
|
602
|
+
firm = companies(:first_firm)
|
603
|
+
assert_equal firm.account, Account.find_by(firm: Firm.where(id: firm))
|
604
|
+
assert_equal firm.account, Account.find_by(firm_id: Firm.where(id: firm))
|
355
605
|
end
|
356
606
|
|
357
607
|
def test_find_by_and_where_consistency_with_active_record_instance
|
358
|
-
|
359
|
-
assert_equal
|
608
|
+
firm = companies(:first_firm)
|
609
|
+
assert_equal Account.where(firm_id: firm).take, Account.find_by(firm_id: firm)
|
610
|
+
end
|
611
|
+
|
612
|
+
def test_find_by_with_alias
|
613
|
+
account = accounts(:last_account)
|
614
|
+
assert_equal account, Account.find_by(available_credit: account.available_credit)
|
360
615
|
end
|
361
616
|
|
362
617
|
def test_take
|
363
|
-
assert_equal topics(:first), Topic.take
|
618
|
+
assert_equal topics(:first), Topic.where("title = 'The First Topic'").take
|
364
619
|
end
|
365
620
|
|
366
621
|
def test_take_failing
|
@@ -403,6 +658,8 @@ class FinderTest < ActiveRecord::TestCase
|
|
403
658
|
expected = topics(:first)
|
404
659
|
expected.touch # PostgreSQL changes the default order if no order clause is used
|
405
660
|
assert_equal expected, Topic.first
|
661
|
+
assert_equal expected, Topic.limit(5).first
|
662
|
+
assert_equal expected, Topic.order(nil).first
|
406
663
|
end
|
407
664
|
|
408
665
|
def test_model_class_responds_to_first_bang
|
@@ -414,20 +671,19 @@ class FinderTest < ActiveRecord::TestCase
|
|
414
671
|
end
|
415
672
|
|
416
673
|
def test_second
|
417
|
-
puts "finder_test.test_second"
|
418
674
|
assert_equal topics(:second).title, Topic.second.title
|
419
675
|
end
|
420
676
|
|
421
677
|
def test_second_with_offset
|
422
|
-
puts "finder_test.test_second_with_offset"
|
423
678
|
assert_equal topics(:fifth), Topic.offset(3).second
|
424
679
|
end
|
425
680
|
|
426
681
|
def test_second_have_primary_key_order_by_default
|
427
|
-
puts "finder_test.test_second_have_primary_key_order_by_default"
|
428
682
|
expected = topics(:second)
|
429
683
|
expected.touch # PostgreSQL changes the default order if no order clause is used
|
430
684
|
assert_equal expected, Topic.second
|
685
|
+
assert_equal expected, Topic.limit(5).second
|
686
|
+
assert_equal expected, Topic.order(nil).second
|
431
687
|
end
|
432
688
|
|
433
689
|
def test_model_class_responds_to_second_bang
|
@@ -439,20 +695,19 @@ class FinderTest < ActiveRecord::TestCase
|
|
439
695
|
end
|
440
696
|
|
441
697
|
def test_third
|
442
|
-
puts "finder_test.test_third"
|
443
698
|
assert_equal topics(:third).title, Topic.third.title
|
444
699
|
end
|
445
700
|
|
446
701
|
def test_third_with_offset
|
447
|
-
puts "finder_test.test_third_with_offset"
|
448
702
|
assert_equal topics(:fifth), Topic.offset(2).third
|
449
703
|
end
|
450
704
|
|
451
705
|
def test_third_have_primary_key_order_by_default
|
452
|
-
puts "finder_test.test_third_have_primary_key_order_by_default"
|
453
706
|
expected = topics(:third)
|
454
707
|
expected.touch # PostgreSQL changes the default order if no order clause is used
|
455
708
|
assert_equal expected, Topic.third
|
709
|
+
assert_equal expected, Topic.limit(5).third
|
710
|
+
assert_equal expected, Topic.order(nil).third
|
456
711
|
end
|
457
712
|
|
458
713
|
def test_model_class_responds_to_third_bang
|
@@ -464,20 +719,19 @@ class FinderTest < ActiveRecord::TestCase
|
|
464
719
|
end
|
465
720
|
|
466
721
|
def test_fourth
|
467
|
-
puts "finder_test.test_fourth"
|
468
722
|
assert_equal topics(:fourth).title, Topic.fourth.title
|
469
723
|
end
|
470
724
|
|
471
725
|
def test_fourth_with_offset
|
472
|
-
puts "finder_test.test_fourth_with_offset"
|
473
726
|
assert_equal topics(:fifth), Topic.offset(1).fourth
|
474
727
|
end
|
475
728
|
|
476
729
|
def test_fourth_have_primary_key_order_by_default
|
477
|
-
puts "finder_test.test_fourth_have_primary_key_order_by_default"
|
478
730
|
expected = topics(:fourth)
|
479
731
|
expected.touch # PostgreSQL changes the default order if no order clause is used
|
480
732
|
assert_equal expected, Topic.fourth
|
733
|
+
assert_equal expected, Topic.limit(5).fourth
|
734
|
+
assert_equal expected, Topic.order(nil).fourth
|
481
735
|
end
|
482
736
|
|
483
737
|
def test_model_class_responds_to_fourth_bang
|
@@ -493,15 +747,15 @@ class FinderTest < ActiveRecord::TestCase
|
|
493
747
|
end
|
494
748
|
|
495
749
|
def test_fifth_with_offset
|
496
|
-
puts "finder_test.test_fifth_with_offset"
|
497
750
|
assert_equal topics(:fifth), Topic.offset(0).fifth
|
498
751
|
end
|
499
752
|
|
500
753
|
def test_fifth_have_primary_key_order_by_default
|
501
|
-
puts "finder_test.test_fifth_have_primary_key_order_by_default"
|
502
754
|
expected = topics(:fifth)
|
503
755
|
expected.touch # PostgreSQL changes the default order if no order clause is used
|
504
756
|
assert_equal expected, Topic.fifth
|
757
|
+
assert_equal expected, Topic.limit(5).fifth
|
758
|
+
assert_equal expected, Topic.order(nil).fifth
|
505
759
|
end
|
506
760
|
|
507
761
|
def test_model_class_responds_to_fifth_bang
|
@@ -513,19 +767,18 @@ class FinderTest < ActiveRecord::TestCase
|
|
513
767
|
end
|
514
768
|
|
515
769
|
def test_second_to_last
|
516
|
-
puts "finder_test.test_second_to_last"
|
517
770
|
assert_equal topics(:fourth).title, Topic.second_to_last.title
|
518
771
|
|
519
772
|
# test with offset
|
520
773
|
assert_equal topics(:fourth), Topic.offset(1).second_to_last
|
521
774
|
assert_equal topics(:fourth), Topic.offset(2).second_to_last
|
522
775
|
assert_equal topics(:fourth), Topic.offset(3).second_to_last
|
523
|
-
|
524
|
-
|
776
|
+
assert_nil Topic.offset(4).second_to_last
|
777
|
+
assert_nil Topic.offset(5).second_to_last
|
525
778
|
|
526
|
-
#test with limit
|
527
|
-
|
528
|
-
|
779
|
+
# test with limit
|
780
|
+
assert_nil Topic.limit(1).second
|
781
|
+
assert_nil Topic.limit(1).second_to_last
|
529
782
|
end
|
530
783
|
|
531
784
|
def test_second_to_last_have_primary_key_order_by_default
|
@@ -548,15 +801,15 @@ class FinderTest < ActiveRecord::TestCase
|
|
548
801
|
# test with offset
|
549
802
|
assert_equal topics(:third), Topic.offset(1).third_to_last
|
550
803
|
assert_equal topics(:third), Topic.offset(2).third_to_last
|
551
|
-
|
552
|
-
|
553
|
-
|
804
|
+
assert_nil Topic.offset(3).third_to_last
|
805
|
+
assert_nil Topic.offset(4).third_to_last
|
806
|
+
assert_nil Topic.offset(5).third_to_last
|
554
807
|
|
555
808
|
# test with limit
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
809
|
+
assert_nil Topic.limit(1).third
|
810
|
+
assert_nil Topic.limit(1).third_to_last
|
811
|
+
assert_nil Topic.limit(2).third
|
812
|
+
assert_nil Topic.limit(2).third_to_last
|
560
813
|
end
|
561
814
|
|
562
815
|
def test_third_to_last_have_primary_key_order_by_default
|
@@ -594,31 +847,29 @@ class FinderTest < ActiveRecord::TestCase
|
|
594
847
|
end
|
595
848
|
|
596
849
|
def test_take_and_first_and_last_with_integer_should_use_sql_limit
|
597
|
-
puts "finder_test.test_take_and_first_and_last_with_integer_should_use_sql_limit"
|
598
850
|
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) { Topic.take(3).entries }
|
599
851
|
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) { Topic.first(2).entries }
|
600
852
|
assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) { Topic.last(5).entries }
|
601
853
|
end
|
602
854
|
|
603
855
|
def test_last_with_integer_and_order_should_keep_the_order
|
604
|
-
puts "finder_test.test_last_with_integer_and_order_should_keep_the_order"
|
605
856
|
assert_equal Topic.order("title").to_a.last(2), Topic.order("title").last(2)
|
606
857
|
end
|
607
858
|
|
608
859
|
def test_last_with_integer_and_order_should_use_sql_limit
|
609
860
|
relation = Topic.order("title")
|
610
861
|
assert_queries(1) { relation.last(5) }
|
611
|
-
|
862
|
+
assert_not_predicate relation, :loaded?
|
612
863
|
end
|
613
864
|
|
614
865
|
def test_last_with_integer_and_reorder_should_use_sql_limit
|
615
866
|
relation = Topic.reorder("title")
|
616
867
|
assert_queries(1) { relation.last(5) }
|
617
|
-
|
868
|
+
assert_not_predicate relation, :loaded?
|
618
869
|
end
|
619
870
|
|
620
871
|
def test_last_on_loaded_relation_should_not_use_sql
|
621
|
-
relation
|
872
|
+
relation = Topic.limit(10).load
|
622
873
|
assert_no_queries do
|
623
874
|
relation.last
|
624
875
|
relation.last(2)
|
@@ -626,25 +877,95 @@ class FinderTest < ActiveRecord::TestCase
|
|
626
877
|
end
|
627
878
|
|
628
879
|
def test_last_with_irreversible_order
|
629
|
-
|
630
|
-
Topic.order("coalesce(author_name, title)").last
|
880
|
+
assert_raises(ActiveRecord::IrreversibleOrderError) do
|
881
|
+
Topic.order(Arel.sql("coalesce(author_name, title)")).last
|
631
882
|
end
|
632
883
|
end
|
633
884
|
|
634
885
|
def test_last_on_relation_with_limit_and_offset
|
635
|
-
post = posts(
|
886
|
+
post = posts("sti_comments")
|
636
887
|
|
637
888
|
comments = post.comments.order(id: :asc)
|
638
889
|
assert_equal comments.limit(2).to_a.last, comments.limit(2).last
|
639
890
|
assert_equal comments.limit(2).to_a.last(2), comments.limit(2).last(2)
|
640
891
|
assert_equal comments.limit(2).to_a.last(3), comments.limit(2).last(3)
|
641
892
|
|
893
|
+
assert_equal comments.offset(2).to_a.last, comments.offset(2).last
|
894
|
+
assert_equal comments.offset(2).to_a.last(2), comments.offset(2).last(2)
|
895
|
+
assert_equal comments.offset(2).to_a.last(3), comments.offset(2).last(3)
|
896
|
+
|
642
897
|
comments = comments.offset(1)
|
643
898
|
assert_equal comments.limit(2).to_a.last, comments.limit(2).last
|
644
899
|
assert_equal comments.limit(2).to_a.last(2), comments.limit(2).last(2)
|
645
900
|
assert_equal comments.limit(2).to_a.last(3), comments.limit(2).last(3)
|
646
901
|
end
|
647
902
|
|
903
|
+
def test_first_on_relation_with_limit_and_offset
|
904
|
+
post = posts("sti_comments")
|
905
|
+
|
906
|
+
comments = post.comments.order(id: :asc)
|
907
|
+
assert_equal comments.limit(2).to_a.first, comments.limit(2).first
|
908
|
+
assert_equal comments.limit(2).to_a.first(2), comments.limit(2).first(2)
|
909
|
+
assert_equal comments.limit(2).to_a.first(3), comments.limit(2).first(3)
|
910
|
+
|
911
|
+
assert_equal comments.offset(2).to_a.first, comments.offset(2).first
|
912
|
+
assert_equal comments.offset(2).to_a.first(2), comments.offset(2).first(2)
|
913
|
+
assert_equal comments.offset(2).to_a.first(3), comments.offset(2).first(3)
|
914
|
+
|
915
|
+
comments = comments.offset(1)
|
916
|
+
assert_equal comments.limit(2).to_a.first, comments.limit(2).first
|
917
|
+
assert_equal comments.limit(2).to_a.first(2), comments.limit(2).first(2)
|
918
|
+
assert_equal comments.limit(2).to_a.first(3), comments.limit(2).first(3)
|
919
|
+
end
|
920
|
+
|
921
|
+
def test_first_have_determined_order_by_default
|
922
|
+
expected = [companies(:second_client), companies(:another_client)]
|
923
|
+
clients = Client.where(name: expected.map(&:name))
|
924
|
+
|
925
|
+
assert_equal expected, clients.first(2)
|
926
|
+
assert_equal expected, clients.limit(5).first(2)
|
927
|
+
assert_equal expected, clients.order(nil).first(2)
|
928
|
+
end
|
929
|
+
|
930
|
+
def test_implicit_order_column_is_configurable
|
931
|
+
old_implicit_order_column = Topic.implicit_order_column
|
932
|
+
Topic.implicit_order_column = "title"
|
933
|
+
|
934
|
+
assert_equal topics(:fifth), Topic.first
|
935
|
+
assert_equal topics(:third), Topic.last
|
936
|
+
|
937
|
+
c = Topic.connection
|
938
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("topics.title"))} DESC, #{Regexp.escape(c.quote_table_name("topics.id"))} DESC LIMIT/i) {
|
939
|
+
Topic.last
|
940
|
+
}
|
941
|
+
ensure
|
942
|
+
Topic.implicit_order_column = old_implicit_order_column
|
943
|
+
end
|
944
|
+
|
945
|
+
def test_implicit_order_set_to_primary_key
|
946
|
+
old_implicit_order_column = Topic.implicit_order_column
|
947
|
+
Topic.implicit_order_column = "id"
|
948
|
+
|
949
|
+
c = Topic.connection
|
950
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("topics.id"))} DESC LIMIT/i) {
|
951
|
+
Topic.last
|
952
|
+
}
|
953
|
+
ensure
|
954
|
+
Topic.implicit_order_column = old_implicit_order_column
|
955
|
+
end
|
956
|
+
|
957
|
+
def test_implicit_order_for_model_without_primary_key
|
958
|
+
old_implicit_order_column = NonPrimaryKey.implicit_order_column
|
959
|
+
NonPrimaryKey.implicit_order_column = "created_at"
|
960
|
+
|
961
|
+
c = NonPrimaryKey.connection
|
962
|
+
assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("non_primary_keys.created_at"))} DESC LIMIT/i) {
|
963
|
+
NonPrimaryKey.last
|
964
|
+
}
|
965
|
+
ensure
|
966
|
+
NonPrimaryKey.implicit_order_column = old_implicit_order_column
|
967
|
+
end
|
968
|
+
|
648
969
|
def test_take_and_first_and_last_with_integer_should_return_an_array
|
649
970
|
assert_kind_of Array, Topic.take(5)
|
650
971
|
assert_kind_of Array, Topic.first(5)
|
@@ -661,12 +982,12 @@ class FinderTest < ActiveRecord::TestCase
|
|
661
982
|
|
662
983
|
def test_find_only_some_columns
|
663
984
|
topic = Topic.select("author_name").find(1)
|
664
|
-
assert_raise(ActiveModel::MissingAttributeError) {topic.title}
|
665
|
-
assert_raise(ActiveModel::MissingAttributeError) {topic.title?}
|
985
|
+
assert_raise(ActiveModel::MissingAttributeError) { topic.title }
|
986
|
+
assert_raise(ActiveModel::MissingAttributeError) { topic.title? }
|
666
987
|
assert_nil topic.read_attribute("title")
|
667
988
|
assert_equal "David", topic.author_name
|
668
|
-
|
669
|
-
|
989
|
+
assert_not topic.attribute_present?("title")
|
990
|
+
assert_not topic.attribute_present?(:title)
|
670
991
|
assert topic.attribute_present?("author_name")
|
671
992
|
assert_respond_to topic, "author_name"
|
672
993
|
end
|
@@ -682,8 +1003,8 @@ class FinderTest < ActiveRecord::TestCase
|
|
682
1003
|
end
|
683
1004
|
|
684
1005
|
def test_find_on_hash_conditions_with_qualified_attribute_dot_notation_string
|
685
|
-
assert Topic.where(
|
686
|
-
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(
|
1006
|
+
assert Topic.where("topics.approved" => false).find(1)
|
1007
|
+
assert_raise(ActiveRecord::RecordNotFound) { Topic.where("topics.approved" => true).find(1) }
|
687
1008
|
end
|
688
1009
|
|
689
1010
|
def test_find_on_hash_conditions_with_qualified_attribute_dot_notation_symbol
|
@@ -697,68 +1018,75 @@ class FinderTest < ActiveRecord::TestCase
|
|
697
1018
|
end
|
698
1019
|
|
699
1020
|
def test_find_on_combined_explicit_and_hashed_table_names
|
700
|
-
assert Topic.where(
|
701
|
-
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(
|
702
|
-
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(
|
1021
|
+
assert Topic.where("topics.approved" => false, topics: { author_name: "David" }).find(1)
|
1022
|
+
assert_raise(ActiveRecord::RecordNotFound) { Topic.where("topics.approved" => true, topics: { author_name: "David" }).find(1) }
|
1023
|
+
assert_raise(ActiveRecord::RecordNotFound) { Topic.where("topics.approved" => false, topics: { author_name: "Melanie" }).find(1) }
|
703
1024
|
end
|
704
1025
|
|
705
1026
|
def test_find_with_hash_conditions_on_joined_table
|
706
|
-
firms = Firm.joins(:account).where(:
|
1027
|
+
firms = Firm.joins(:account).where(accounts: { credit_limit: 50 })
|
707
1028
|
assert_equal 1, firms.size
|
708
1029
|
assert_equal companies(:first_firm), firms.first
|
709
1030
|
end
|
710
1031
|
|
711
1032
|
def test_find_with_hash_conditions_on_joined_table_and_with_range
|
712
|
-
firms = DependentFirm.joins(:account).where(name:
|
1033
|
+
firms = DependentFirm.joins(:account).where(name: "RailsCore", accounts: { credit_limit: 55..60 })
|
713
1034
|
assert_equal 1, firms.size
|
714
1035
|
assert_equal companies(:rails_core), firms.first
|
715
1036
|
end
|
716
1037
|
|
717
1038
|
def test_find_on_hash_conditions_with_explicit_table_name_and_aggregate
|
718
1039
|
david = customers(:david)
|
719
|
-
assert Customer.where(
|
1040
|
+
assert Customer.where("customers.name" => david.name, :address => david.address).find(david.id)
|
720
1041
|
assert_raise(ActiveRecord::RecordNotFound) {
|
721
|
-
Customer.where(
|
1042
|
+
Customer.where("customers.name" => david.name + "1", :address => david.address).find(david.id)
|
722
1043
|
}
|
723
1044
|
end
|
724
1045
|
|
725
1046
|
def test_find_on_association_proxy_conditions
|
726
|
-
assert_equal [1, 2, 3, 5, 6, 7, 8, 9, 10, 12], Comment.where(post_id: authors(:david).posts).map(&:id).sort
|
1047
|
+
assert_equal [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13], Comment.where(post_id: authors(:david).posts).map(&:id).sort
|
727
1048
|
end
|
728
1049
|
|
729
1050
|
def test_find_on_hash_conditions_with_range
|
730
|
-
assert_equal [1,2], Topic.where(id: 1..2).to_a.map(&:id).sort
|
1051
|
+
assert_equal [1, 2], Topic.where(id: 1..2).to_a.map(&:id).sort
|
731
1052
|
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(id: 2..3).find(1) }
|
732
1053
|
end
|
733
1054
|
|
734
1055
|
def test_find_on_hash_conditions_with_end_exclusive_range
|
735
|
-
assert_equal [1,2,3], Topic.where(id: 1..3).to_a.map(&:id).sort
|
736
|
-
assert_equal [1,2], Topic.where(id: 1...3).to_a.map(&:id).sort
|
1056
|
+
assert_equal [1, 2, 3], Topic.where(id: 1..3).to_a.map(&:id).sort
|
1057
|
+
assert_equal [1, 2], Topic.where(id: 1...3).to_a.map(&:id).sort
|
737
1058
|
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(id: 2...3).find(3) }
|
738
1059
|
end
|
739
1060
|
|
740
1061
|
def test_find_on_hash_conditions_with_multiple_ranges
|
741
|
-
assert_equal [1,2,3], Comment.where(id: 1..3, post_id: 1..2).to_a.map(&:id).sort
|
1062
|
+
assert_equal [1, 2, 3], Comment.where(id: 1..3, post_id: 1..2).to_a.map(&:id).sort
|
742
1063
|
assert_equal [1], Comment.where(id: 1..1, post_id: 1..10).to_a.map(&:id).sort
|
743
1064
|
end
|
744
1065
|
|
745
1066
|
def test_find_on_hash_conditions_with_array_of_integers_and_ranges
|
746
|
-
assert_equal [1,2,3,5,6,7,8,9], Comment.where(id: [1..2, 3, 5, 6..8, 9]).to_a.map(&:id).sort
|
1067
|
+
assert_equal [1, 2, 3, 5, 6, 7, 8, 9], Comment.where(id: [1..2, 3, 5, 6..8, 9]).to_a.map(&:id).sort
|
747
1068
|
end
|
748
1069
|
|
749
1070
|
def test_find_on_hash_conditions_with_array_of_ranges
|
750
|
-
assert_equal [1,2,6,7,8], Comment.where(id: [1..2, 6..8]).to_a.map(&:id).sort
|
1071
|
+
assert_equal [1, 2, 6, 7, 8], Comment.where(id: [1..2, 6..8]).to_a.map(&:id).sort
|
1072
|
+
end
|
1073
|
+
|
1074
|
+
def test_find_on_hash_conditions_with_open_ended_range
|
1075
|
+
assert_equal [1, 2, 3], Comment.where(id: Float::INFINITY..3).to_a.map(&:id).sort
|
1076
|
+
end
|
1077
|
+
|
1078
|
+
def test_find_on_hash_conditions_with_numeric_range_for_string
|
1079
|
+
topic = Topic.create!(title: "12 Factor App")
|
1080
|
+
assert_equal [topic], Topic.where(title: 10..2).to_a
|
751
1081
|
end
|
752
1082
|
|
753
1083
|
def test_find_on_multiple_hash_conditions
|
754
1084
|
assert Topic.where(author_name: "David", title: "The First Topic", replies_count: 1, approved: false).find(1)
|
755
1085
|
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(author_name: "David", title: "The First Topic", replies_count: 1, approved: true).find(1) }
|
756
1086
|
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(author_name: "David", title: "HHC", replies_count: 1, approved: false).find(1) }
|
757
|
-
assert_raise(ActiveRecord::RecordNotFound) { Topic.where(author_name: "David", title: "The First Topic", replies_count: 1, approved: true).find(1) }
|
758
1087
|
end
|
759
1088
|
|
760
1089
|
def test_condition_interpolation
|
761
|
-
puts "finder_test.test_condition_interpolation"
|
762
1090
|
assert_kind_of Firm, Company.where("name = '%s'", "37signals").first
|
763
1091
|
assert_nil Company.where(["name = '%s'", "37signals!"]).first
|
764
1092
|
assert_nil Company.where(["name = '%s'", "37signals!' OR 1=1"]).first
|
@@ -766,7 +1094,6 @@ class FinderTest < ActiveRecord::TestCase
|
|
766
1094
|
end
|
767
1095
|
|
768
1096
|
def test_condition_array_interpolation
|
769
|
-
puts "finder_test.test_condition_array_interpolation"
|
770
1097
|
assert_kind_of Firm, Company.where(["name = '%s'", "37signals"]).first
|
771
1098
|
assert_nil Company.where(["name = '%s'", "37signals!"]).first
|
772
1099
|
assert_nil Company.where(["name = '%s'", "37signals!' OR 1=1"]).first
|
@@ -786,16 +1113,14 @@ class FinderTest < ActiveRecord::TestCase
|
|
786
1113
|
end
|
787
1114
|
|
788
1115
|
def test_hash_condition_find_with_escaped_characters
|
789
|
-
puts "finder_test.test_hash_condition_find_with_escaped_characters"
|
790
1116
|
Company.create("name" => "Ain't noth'n like' \#stuff")
|
791
1117
|
assert Company.where(name: "Ain't noth'n like' \#stuff").first
|
792
1118
|
end
|
793
1119
|
|
794
1120
|
def test_hash_condition_find_with_array
|
795
|
-
|
796
|
-
p1, p2
|
797
|
-
assert_equal [p1, p2], Post.where(id: [p1, p2]).order(
|
798
|
-
assert_equal [p1, p2], Post.where(id: [p1, p2.id]).order('id asc').to_a
|
1121
|
+
p1, p2 = Post.limit(2).order("id asc").to_a
|
1122
|
+
assert_equal [p1, p2], Post.where(id: [p1, p2]).order("id asc").to_a
|
1123
|
+
assert_equal [p1, p2], Post.where(id: [p1, p2.id]).order("id asc").to_a
|
799
1124
|
end
|
800
1125
|
|
801
1126
|
def test_hash_condition_find_with_nil
|
@@ -807,57 +1132,95 @@ class FinderTest < ActiveRecord::TestCase
|
|
807
1132
|
def test_hash_condition_find_with_aggregate_having_one_mapping
|
808
1133
|
balance = customers(:david).balance
|
809
1134
|
assert_kind_of Money, balance
|
810
|
-
found_customer = Customer.where(:
|
1135
|
+
found_customer = Customer.where(balance: balance).first
|
811
1136
|
assert_equal customers(:david), found_customer
|
812
1137
|
end
|
813
1138
|
|
1139
|
+
def test_hash_condition_find_with_aggregate_having_three_mappings_array
|
1140
|
+
david_address = customers(:david).address
|
1141
|
+
zaphod_address = customers(:zaphod).address
|
1142
|
+
barney_address = customers(:barney).address
|
1143
|
+
assert_kind_of Address, david_address
|
1144
|
+
assert_kind_of Address, zaphod_address
|
1145
|
+
found_customers = Customer.where(address: [david_address, zaphod_address, barney_address])
|
1146
|
+
assert_equal [customers(:david), customers(:zaphod), customers(:barney)], found_customers.sort_by(&:id)
|
1147
|
+
end
|
1148
|
+
|
1149
|
+
def test_hash_condition_find_with_aggregate_having_one_mapping_array
|
1150
|
+
david_balance = customers(:david).balance
|
1151
|
+
zaphod_balance = customers(:zaphod).balance
|
1152
|
+
assert_kind_of Money, david_balance
|
1153
|
+
assert_kind_of Money, zaphod_balance
|
1154
|
+
found_customers = Customer.where(balance: [david_balance, zaphod_balance])
|
1155
|
+
assert_equal [customers(:david), customers(:zaphod)], found_customers.sort_by(&:id)
|
1156
|
+
assert_equal Customer.where(balance: [david_balance.amount, zaphod_balance.amount]).to_sql, found_customers.to_sql
|
1157
|
+
end
|
1158
|
+
|
814
1159
|
def test_hash_condition_find_with_aggregate_attribute_having_same_name_as_field_and_key_value_being_aggregate
|
815
1160
|
gps_location = customers(:david).gps_location
|
816
1161
|
assert_kind_of GpsLocation, gps_location
|
817
|
-
found_customer = Customer.where(:
|
1162
|
+
found_customer = Customer.where(gps_location: gps_location).first
|
818
1163
|
assert_equal customers(:david), found_customer
|
819
1164
|
end
|
820
1165
|
|
821
1166
|
def test_hash_condition_find_with_aggregate_having_one_mapping_and_key_value_being_attribute_value
|
822
1167
|
balance = customers(:david).balance
|
823
1168
|
assert_kind_of Money, balance
|
824
|
-
found_customer = Customer.where(:
|
1169
|
+
found_customer = Customer.where(balance: balance.amount).first
|
825
1170
|
assert_equal customers(:david), found_customer
|
826
1171
|
end
|
827
1172
|
|
828
1173
|
def test_hash_condition_find_with_aggregate_attribute_having_same_name_as_field_and_key_value_being_attribute_value
|
829
1174
|
gps_location = customers(:david).gps_location
|
830
1175
|
assert_kind_of GpsLocation, gps_location
|
831
|
-
found_customer = Customer.where(:
|
1176
|
+
found_customer = Customer.where(gps_location: gps_location.gps_location).first
|
832
1177
|
assert_equal customers(:david), found_customer
|
833
1178
|
end
|
834
1179
|
|
835
1180
|
def test_hash_condition_find_with_aggregate_having_three_mappings
|
836
1181
|
address = customers(:david).address
|
837
1182
|
assert_kind_of Address, address
|
838
|
-
|
839
|
-
assert_equal customers(:david),
|
1183
|
+
customers = Customer.where(address: address).order(:id)
|
1184
|
+
assert_equal [customers(:david)], customers
|
1185
|
+
assert_equal customers(:david, :mary), customers.unscope(where: [:address_city, :address_country])
|
840
1186
|
end
|
841
1187
|
|
842
1188
|
def test_hash_condition_find_with_one_condition_being_aggregate_and_another_not
|
843
1189
|
address = customers(:david).address
|
844
1190
|
assert_kind_of Address, address
|
845
|
-
found_customer = Customer.where(:
|
1191
|
+
found_customer = Customer.where(address: address, name: customers(:david).name).first
|
846
1192
|
assert_equal customers(:david), found_customer
|
847
1193
|
end
|
848
1194
|
|
1195
|
+
def test_hash_condition_find_nil_with_aggregate_having_one_mapping
|
1196
|
+
assert_nil customers(:zaphod).gps_location
|
1197
|
+
found_customer = Customer.where(gps_location: nil, name: customers(:zaphod).name).first
|
1198
|
+
assert_equal customers(:zaphod), found_customer
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
def test_hash_condition_find_nil_with_aggregate_having_multiple_mappings
|
1202
|
+
customers(:david).update(address: nil)
|
1203
|
+
assert_nil customers(:david).address_street
|
1204
|
+
assert_nil customers(:david).address_city
|
1205
|
+
found_customer = Customer.where(address: nil, name: customers(:david).name).first
|
1206
|
+
assert_equal customers(:david), found_customer
|
1207
|
+
end
|
1208
|
+
|
1209
|
+
def test_hash_condition_find_empty_array_with_aggregate_having_multiple_mappings
|
1210
|
+
assert_nil Customer.where(address: []).first
|
1211
|
+
end
|
1212
|
+
|
849
1213
|
def test_condition_utc_time_interpolation_with_default_timezone_local
|
850
|
-
with_env_tz
|
1214
|
+
with_env_tz "America/New_York" do
|
851
1215
|
with_timezone_config default: :local do
|
852
1216
|
topic = Topic.first
|
853
|
-
assert_equal topic, Topic.where([
|
1217
|
+
assert_equal topic, Topic.where(["written_on = ?", topic.written_on.getutc]).first
|
854
1218
|
end
|
855
1219
|
end
|
856
1220
|
end
|
857
1221
|
|
858
1222
|
def test_hash_condition_utc_time_interpolation_with_default_timezone_local
|
859
|
-
|
860
|
-
with_env_tz 'America/New_York' do
|
1223
|
+
with_env_tz "America/New_York" do
|
861
1224
|
with_timezone_config default: :local do
|
862
1225
|
topic = Topic.first
|
863
1226
|
assert_equal topic, Topic.where(written_on: topic.written_on.getutc).first
|
@@ -866,18 +1229,16 @@ class FinderTest < ActiveRecord::TestCase
|
|
866
1229
|
end
|
867
1230
|
|
868
1231
|
def test_condition_local_time_interpolation_with_default_timezone_utc
|
869
|
-
|
870
|
-
with_env_tz 'America/New_York' do
|
1232
|
+
with_env_tz "America/New_York" do
|
871
1233
|
with_timezone_config default: :utc do
|
872
1234
|
topic = Topic.first
|
873
|
-
assert_equal topic, Topic.where([
|
1235
|
+
assert_equal topic, Topic.where(["written_on = ?", topic.written_on.getlocal]).first
|
874
1236
|
end
|
875
1237
|
end
|
876
1238
|
end
|
877
1239
|
|
878
1240
|
def test_hash_condition_local_time_interpolation_with_default_timezone_utc
|
879
|
-
|
880
|
-
with_env_tz 'America/New_York' do
|
1241
|
+
with_env_tz "America/New_York" do
|
881
1242
|
with_timezone_config default: :utc do
|
882
1243
|
topic = Topic.first
|
883
1244
|
assert_equal topic, Topic.where(written_on: topic.written_on.getlocal).first
|
@@ -894,35 +1255,27 @@ class FinderTest < ActiveRecord::TestCase
|
|
894
1255
|
Company.where(["id=? AND name = ?", 2]).first
|
895
1256
|
}
|
896
1257
|
assert_raise(ActiveRecord::PreparedStatementInvalid) {
|
897
|
-
|
1258
|
+
Company.where(["id=?", 2, 3, 4]).first
|
898
1259
|
}
|
899
1260
|
end
|
900
1261
|
|
901
1262
|
def test_bind_variables_with_quotes
|
902
|
-
|
903
|
-
Company.
|
904
|
-
assert Company.where(["name = ?", "37signals' go'es agains"]).first
|
1263
|
+
Company.create("name" => "37signals' go'es against")
|
1264
|
+
assert Company.where(["name = ?", "37signals' go'es against"]).first
|
905
1265
|
end
|
906
1266
|
|
907
1267
|
def test_named_bind_variables_with_quotes
|
908
|
-
|
909
|
-
Company.
|
910
|
-
assert Company.where(["name = :name", {name: "37signals' go'es agains"}]).first
|
1268
|
+
Company.create("name" => "37signals' go'es against")
|
1269
|
+
assert Company.where(["name = :name", { name: "37signals' go'es against" }]).first
|
911
1270
|
end
|
912
1271
|
|
913
1272
|
def test_named_bind_variables
|
914
|
-
puts "finder_test.test_named_bind_variables"
|
915
1273
|
assert_kind_of Firm, Company.where(["name = :name", { name: "37signals" }]).first
|
916
1274
|
assert_nil Company.where(["name = :name", { name: "37signals!" }]).first
|
917
1275
|
assert_nil Company.where(["name = :name", { name: "37signals!' OR 1=1" }]).first
|
918
1276
|
assert_kind_of Time, Topic.where(["id = :id", { id: 1 }]).first.written_on
|
919
1277
|
end
|
920
1278
|
|
921
|
-
def test_string_sanitation
|
922
|
-
assert_not_equal "'something ' 1=1'", ActiveRecord::Base.sanitize("something ' 1=1")
|
923
|
-
assert_equal "'something; select table'", ActiveRecord::Base.sanitize("something; select table")
|
924
|
-
end
|
925
|
-
|
926
1279
|
def test_count_by_sql
|
927
1280
|
assert_equal(0, Entrant.count_by_sql("SELECT COUNT(*) FROM entrants WHERE id > 3"))
|
928
1281
|
assert_equal(1, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 2]))
|
@@ -942,8 +1295,7 @@ class FinderTest < ActiveRecord::TestCase
|
|
942
1295
|
end
|
943
1296
|
|
944
1297
|
def test_find_by_on_attribute_that_is_a_reserved_word
|
945
|
-
|
946
|
-
dog_alias = 'Dog'
|
1298
|
+
dog_alias = "Dog"
|
947
1299
|
dog = Dog.create(alias: dog_alias)
|
948
1300
|
|
949
1301
|
assert_equal dog, Dog.find_by_alias(dog_alias)
|
@@ -955,13 +1307,12 @@ class FinderTest < ActiveRecord::TestCase
|
|
955
1307
|
end
|
956
1308
|
|
957
1309
|
def test_find_by_one_attribute_bang_with_blank_defined
|
958
|
-
puts "finder_test.test_find_by_one_attribute_bang_with_blank_defined"
|
959
1310
|
blank_topic = BlankTopic.create(title: "The Blank One")
|
960
1311
|
assert_equal blank_topic, BlankTopic.find_by_title!("The Blank One")
|
961
1312
|
end
|
962
1313
|
|
963
1314
|
def test_find_by_one_attribute_with_conditions
|
964
|
-
assert_equal accounts(:rails_core_account), Account.where(
|
1315
|
+
assert_equal accounts(:rails_core_account), Account.where("firm_id = ?", 6).find_by_credit_limit(50)
|
965
1316
|
end
|
966
1317
|
|
967
1318
|
def test_find_by_one_attribute_that_is_an_aggregate
|
@@ -1000,13 +1351,13 @@ class FinderTest < ActiveRecord::TestCase
|
|
1000
1351
|
|
1001
1352
|
def test_dynamic_finder_on_one_attribute_with_conditions_returns_same_results_after_caching
|
1002
1353
|
# ensure this test can run independently of order
|
1003
|
-
|
1004
|
-
a = Account.where(
|
1005
|
-
assert_equal a, Account.where(
|
1354
|
+
Account.singleton_class.remove_method :find_by_credit_limit if Account.public_methods.include?(:find_by_credit_limit)
|
1355
|
+
a = Account.where("firm_id = ?", 6).find_by_credit_limit(50)
|
1356
|
+
assert_equal a, Account.where("firm_id = ?", 6).find_by_credit_limit(50) # find_by_credit_limit has been cached
|
1006
1357
|
end
|
1007
1358
|
|
1008
1359
|
def test_find_by_one_attribute_with_several_options
|
1009
|
-
assert_equal accounts(:unknown), Account.order(
|
1360
|
+
assert_equal accounts(:unknown), Account.order("id DESC").where("id != ?", 3).find_by_credit_limit(50)
|
1010
1361
|
end
|
1011
1362
|
|
1012
1363
|
def test_find_by_one_missing_attribute
|
@@ -1029,16 +1380,6 @@ class FinderTest < ActiveRecord::TestCase
|
|
1029
1380
|
assert_raise(ArgumentError) { Topic.find_by_title_and_author_name("The First Topic") }
|
1030
1381
|
end
|
1031
1382
|
|
1032
|
-
def test_find_last_with_offset
|
1033
|
-
puts "finder_test.test_find_last_with_offset"
|
1034
|
-
devs = Developer.order('id')
|
1035
|
-
|
1036
|
-
assert_equal devs[2], Developer.offset(2).first
|
1037
|
-
assert_equal devs[-3], Developer.offset(2).last
|
1038
|
-
assert_equal devs[-3], Developer.offset(2).last
|
1039
|
-
assert_equal devs[-3], Developer.offset(2).order('id DESC').first
|
1040
|
-
end
|
1041
|
-
|
1042
1383
|
def test_find_by_nil_attribute
|
1043
1384
|
topic = Topic.find_by_last_read nil
|
1044
1385
|
assert_not_nil topic
|
@@ -1054,20 +1395,10 @@ class FinderTest < ActiveRecord::TestCase
|
|
1054
1395
|
assert_raise(ActiveRecord::StatementInvalid) { Topic.find_by_sql "select 1 from badtable" }
|
1055
1396
|
end
|
1056
1397
|
|
1057
|
-
def test_find_all_with_join
|
1058
|
-
developers_on_project_one = Developer.
|
1059
|
-
joins('LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id').
|
1060
|
-
where('project_id=1').to_a
|
1061
|
-
assert_equal 3, developers_on_project_one.length
|
1062
|
-
developer_names = developers_on_project_one.map(&:name)
|
1063
|
-
assert developer_names.include?('David')
|
1064
|
-
assert developer_names.include?('Jamis')
|
1065
|
-
end
|
1066
|
-
|
1067
1398
|
def test_joins_dont_clobber_id
|
1068
1399
|
first = Firm.
|
1069
|
-
joins(
|
1070
|
-
where(
|
1400
|
+
joins("INNER JOIN companies clients ON clients.firm_id = companies.id").
|
1401
|
+
where("companies.id = 1").first
|
1071
1402
|
assert_equal 1, first.id
|
1072
1403
|
end
|
1073
1404
|
|
@@ -1081,13 +1412,12 @@ class FinderTest < ActiveRecord::TestCase
|
|
1081
1412
|
|
1082
1413
|
def test_find_by_id_with_conditions_with_or
|
1083
1414
|
assert_nothing_raised do
|
1084
|
-
Post.where("posts.id <= 3 OR posts.#{QUOTED_TYPE} = 'Post'").find([1,2,3])
|
1415
|
+
Post.where("posts.id <= 3 OR posts.#{QUOTED_TYPE} = 'Post'").find([1, 2, 3])
|
1085
1416
|
end
|
1086
1417
|
end
|
1087
1418
|
|
1088
1419
|
def test_find_ignores_previously_inserted_record
|
1089
|
-
|
1090
|
-
Post.create!(:title => 'test', :body => 'it out')
|
1420
|
+
Post.create!(title: "test", body: "it out")
|
1091
1421
|
assert_equal [], Post.where(id: nil)
|
1092
1422
|
end
|
1093
1423
|
|
@@ -1096,14 +1426,13 @@ class FinderTest < ActiveRecord::TestCase
|
|
1096
1426
|
end
|
1097
1427
|
|
1098
1428
|
def test_find_by_empty_in_condition
|
1099
|
-
assert_equal [], Post.where(
|
1429
|
+
assert_equal [], Post.where("id in (?)", [])
|
1100
1430
|
end
|
1101
1431
|
|
1102
1432
|
def test_find_by_records
|
1103
|
-
|
1104
|
-
p1, p2
|
1105
|
-
assert_equal [p1, p2], Post.where([
|
1106
|
-
assert_equal [p1, p2], Post.where(['id in (?)', [p1, p2.id]]).order('id asc')
|
1433
|
+
p1, p2 = Post.limit(2).order("id asc").to_a
|
1434
|
+
assert_equal [p1, p2], Post.where(["id in (?)", [p1, p2]]).order("id asc")
|
1435
|
+
assert_equal [p1, p2], Post.where(["id in (?)", [p1, p2.id]]).order("id asc")
|
1107
1436
|
end
|
1108
1437
|
|
1109
1438
|
def test_select_value
|
@@ -1115,8 +1444,8 @@ class FinderTest < ActiveRecord::TestCase
|
|
1115
1444
|
end
|
1116
1445
|
|
1117
1446
|
def test_select_values
|
1118
|
-
assert_equal ["1","2","3","4","5","6","7","8","9", "10", "11"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map!(&:to_s)
|
1119
|
-
assert_equal ["37signals","Summit","Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy", "Ex Nihilo Part Deux", "Apex"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
|
1447
|
+
assert_equal ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "15"], Company.connection.select_values("SELECT id FROM companies ORDER BY id").map!(&:to_s)
|
1448
|
+
assert_equal ["37signals", "Summit", "Microsoft", "Flamboyant Software", "Ex Nihilo", "RailsCore", "Leetsoft", "Jadedpixel", "Odegy", "Ex Nihilo Part Deux", "Apex", "RVshare"], Company.connection.select_values("SELECT name FROM companies ORDER BY id")
|
1120
1449
|
end
|
1121
1450
|
|
1122
1451
|
def test_select_rows
|
@@ -1124,50 +1453,72 @@ class FinderTest < ActiveRecord::TestCase
|
|
1124
1453
|
[["1", "1", nil, "37signals"],
|
1125
1454
|
["2", "1", "2", "Summit"],
|
1126
1455
|
["3", "1", "1", "Microsoft"]],
|
1127
|
-
Company.connection.select_rows("SELECT id, firm_id, client_of, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! {|i| i.map! {|j| j.to_s unless j.nil?}})
|
1456
|
+
Company.connection.select_rows("SELECT id, firm_id, client_of, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! { |i| i.map! { |j| j.to_s unless j.nil? } })
|
1128
1457
|
assert_equal [["1", "37signals"], ["2", "Summit"], ["3", "Microsoft"]],
|
1129
|
-
Company.connection.select_rows("SELECT id, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! {|i| i.map! {|j| j.to_s unless j.nil?}}
|
1458
|
+
Company.connection.select_rows("SELECT id, name FROM companies WHERE id IN (1,2,3) ORDER BY id").map! { |i| i.map! { |j| j.to_s unless j.nil? } }
|
1130
1459
|
end
|
1131
1460
|
|
1132
1461
|
def test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct
|
1133
|
-
puts "finder_test.test_find_with_order_on_included_associations_with_construct_finder_sql_for_association_limiting_and_is_distinct"
|
1134
1462
|
assert_equal 2, Post.includes(authors: :author_address).
|
1135
1463
|
where.not(author_addresses: { id: nil }).
|
1136
|
-
order(
|
1464
|
+
order("author_addresses.id DESC").limit(2).to_a.size
|
1137
1465
|
|
1138
1466
|
assert_equal 3, Post.includes(author: :author_address, authors: :author_address).
|
1139
1467
|
where.not(author_addresses_authors: { id: nil }).
|
1140
|
-
order(
|
1468
|
+
order("author_addresses_authors.id DESC").limit(3).to_a.size
|
1469
|
+
end
|
1470
|
+
|
1471
|
+
def test_find_with_eager_loading_collection_and_ordering_by_collection_primary_key
|
1472
|
+
assert_equal Post.first, Post.eager_load(comments: :ratings).
|
1473
|
+
order("posts.id, ratings.id, comments.id").first
|
1141
1474
|
end
|
1142
1475
|
|
1143
1476
|
def test_find_with_nil_inside_set_passed_for_one_attribute
|
1144
1477
|
client_of = Company.
|
1145
1478
|
where(client_of: [2, 1, nil],
|
1146
|
-
name: [
|
1147
|
-
order(
|
1479
|
+
name: ["37signals", "Summit", "Microsoft"]).
|
1480
|
+
order("client_of DESC").
|
1148
1481
|
map(&:client_of)
|
1149
1482
|
|
1150
|
-
|
1483
|
+
assert_includes client_of, nil
|
1151
1484
|
assert_equal [2, 1].sort, client_of.compact.sort
|
1152
1485
|
end
|
1153
1486
|
|
1154
1487
|
def test_find_with_nil_inside_set_passed_for_attribute
|
1155
1488
|
client_of = Company.
|
1156
1489
|
where(client_of: [nil]).
|
1157
|
-
order(
|
1490
|
+
order("client_of DESC").
|
1158
1491
|
map(&:client_of)
|
1159
1492
|
|
1160
1493
|
assert_equal [], client_of.compact
|
1161
1494
|
end
|
1162
1495
|
|
1163
1496
|
def test_with_limiting_with_custom_select
|
1164
|
-
puts "finder_test.test_with_limiting_with_custom_select"
|
1165
1497
|
posts = Post.references(:authors).merge(
|
1166
|
-
:
|
1167
|
-
:
|
1498
|
+
includes: :author, select: 'posts.*, authors.id as "author_id"',
|
1499
|
+
limit: 3, order: "posts.id"
|
1168
1500
|
).to_a
|
1169
1501
|
assert_equal 3, posts.size
|
1170
|
-
assert_equal [
|
1502
|
+
assert_equal [1, 1, nil], posts.map(&:author_id)
|
1503
|
+
end
|
1504
|
+
|
1505
|
+
def test_custom_select_takes_precedence_over_original_value
|
1506
|
+
posts = Post.select("UPPER(title) AS title")
|
1507
|
+
assert_equal "WELCOME TO THE WEBLOG", posts.first.title
|
1508
|
+
assert_equal "WELCOME TO THE WEBLOG", posts.preload(:comments).first.title
|
1509
|
+
assert_equal "WELCOME TO THE WEBLOG", posts.eager_load(:comments).first.title
|
1510
|
+
end
|
1511
|
+
|
1512
|
+
def test_eager_load_for_no_has_many_with_limit_and_joins_for_has_many
|
1513
|
+
relation = Post.eager_load(:author).joins(comments: :post)
|
1514
|
+
assert_equal 5, relation.to_a.size
|
1515
|
+
assert_equal 5, relation.limit(5).to_a.size
|
1516
|
+
end
|
1517
|
+
|
1518
|
+
def test_eager_load_for_no_has_many_with_limit_and_left_joins_for_has_many
|
1519
|
+
relation = Post.eager_load(:author).left_joins(comments: :post)
|
1520
|
+
assert_equal 11, relation.to_a.size
|
1521
|
+
assert_equal 11, relation.limit(11).to_a.size
|
1171
1522
|
end
|
1172
1523
|
|
1173
1524
|
def test_find_one_message_on_primary_key
|
@@ -1184,9 +1535,9 @@ class FinderTest < ActiveRecord::TestCase
|
|
1184
1535
|
table_with_custom_primary_key do |model|
|
1185
1536
|
model.primary_key = :name
|
1186
1537
|
e = assert_raises(ActiveRecord::RecordNotFound) do
|
1187
|
-
model.find
|
1538
|
+
model.find "Hello World!"
|
1188
1539
|
end
|
1189
|
-
assert_equal
|
1540
|
+
assert_equal "Couldn't find MercedesCar with 'name'=Hello World!", e.message
|
1190
1541
|
end
|
1191
1542
|
end
|
1192
1543
|
|
@@ -1194,9 +1545,9 @@ class FinderTest < ActiveRecord::TestCase
|
|
1194
1545
|
table_with_custom_primary_key do |model|
|
1195
1546
|
model.primary_key = :name
|
1196
1547
|
e = assert_raises(ActiveRecord::RecordNotFound) do
|
1197
|
-
model.find
|
1548
|
+
model.find "Hello", "World!"
|
1198
1549
|
end
|
1199
|
-
assert_equal
|
1550
|
+
assert_equal "Couldn't find all MercedesCars with 'name': (Hello, World!) (found 0 results, but was looking for 2).", e.message
|
1200
1551
|
end
|
1201
1552
|
end
|
1202
1553
|
|
@@ -1219,16 +1570,20 @@ class FinderTest < ActiveRecord::TestCase
|
|
1219
1570
|
end
|
1220
1571
|
|
1221
1572
|
test "find_by with multi-arg conditions returns the first matching record" do
|
1222
|
-
assert_equal posts(:eager_other), Post.find_by(
|
1573
|
+
assert_equal posts(:eager_other), Post.find_by("id = ?", posts(:eager_other).id)
|
1574
|
+
end
|
1575
|
+
|
1576
|
+
test "find_by with range conditions returns the first matching record" do
|
1577
|
+
assert_equal posts(:eager_other), Post.find_by(id: posts(:eager_other).id...posts(:misc_by_bob).id)
|
1223
1578
|
end
|
1224
1579
|
|
1225
1580
|
test "find_by returns nil if the record is missing" do
|
1226
|
-
|
1581
|
+
assert_nil Post.find_by("1 = 0")
|
1227
1582
|
end
|
1228
1583
|
|
1229
1584
|
test "find_by with associations" do
|
1230
1585
|
assert_equal authors(:david), Post.find_by(author: authors(:david)).author
|
1231
|
-
assert_equal authors(:mary)
|
1586
|
+
assert_equal authors(:mary), Post.find_by(author: authors(:mary)).author
|
1232
1587
|
end
|
1233
1588
|
|
1234
1589
|
test "find_by doesn't have implicit ordering" do
|
@@ -1244,7 +1599,7 @@ class FinderTest < ActiveRecord::TestCase
|
|
1244
1599
|
end
|
1245
1600
|
|
1246
1601
|
test "find_by! with multi-arg conditions returns the first matching record" do
|
1247
|
-
assert_equal posts(:eager_other), Post.find_by!(
|
1602
|
+
assert_equal posts(:eager_other), Post.find_by!("id = ?", posts(:eager_other).id)
|
1248
1603
|
end
|
1249
1604
|
|
1250
1605
|
test "find_by! doesn't have implicit ordering" do
|
@@ -1277,11 +1632,39 @@ class FinderTest < ActiveRecord::TestCase
|
|
1277
1632
|
assert_equal tyre2, zyke.tyres.custom_find_by(id: tyre2.id)
|
1278
1633
|
end
|
1279
1634
|
|
1280
|
-
|
1635
|
+
test "#skip_query_cache! for #exists?" do
|
1636
|
+
Topic.cache do
|
1637
|
+
assert_queries(1) do
|
1638
|
+
Topic.exists?
|
1639
|
+
Topic.exists?
|
1640
|
+
end
|
1641
|
+
|
1642
|
+
assert_queries(2) do
|
1643
|
+
Topic.all.skip_query_cache!.exists?
|
1644
|
+
Topic.all.skip_query_cache!.exists?
|
1645
|
+
end
|
1646
|
+
end
|
1647
|
+
end
|
1648
|
+
|
1649
|
+
test "#skip_query_cache! for #exists? with a limited eager load" do
|
1650
|
+
Topic.cache do
|
1651
|
+
assert_queries(1) do
|
1652
|
+
Topic.eager_load(:replies).limit(1).exists?
|
1653
|
+
Topic.eager_load(:replies).limit(1).exists?
|
1654
|
+
end
|
1655
|
+
|
1656
|
+
assert_queries(2) do
|
1657
|
+
Topic.eager_load(:replies).limit(1).skip_query_cache!.exists?
|
1658
|
+
Topic.eager_load(:replies).limit(1).skip_query_cache!.exists?
|
1659
|
+
end
|
1660
|
+
end
|
1661
|
+
end
|
1662
|
+
|
1663
|
+
private
|
1281
1664
|
def table_with_custom_primary_key
|
1282
1665
|
yield(Class.new(Toy) do
|
1283
1666
|
def self.name
|
1284
|
-
|
1667
|
+
"MercedesCar"
|
1285
1668
|
end
|
1286
1669
|
end)
|
1287
1670
|
end
|
@@ -1290,5 +1673,4 @@ class FinderTest < ActiveRecord::TestCase
|
|
1290
1673
|
err = assert_raises(exception_class) { block.call }
|
1291
1674
|
assert_match message, err.message
|
1292
1675
|
end
|
1293
|
-
|
1294
1676
|
end
|