ibm_db 5.2.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.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,39 +1,20 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/comment'
1
+ # frozen_string_literal: true
4
2
 
5
- module ActiveRecord
6
- class DelegationTest < ActiveRecord::TestCase
7
- fixtures :posts
8
-
9
- def call_method(target, method)
10
- method_arity = target.to_a.method(method).arity
11
-
12
- if method_arity.zero?
13
- target.public_send(method)
14
- elsif method_arity < 0
15
- if method == :shuffle!
16
- target.public_send(method)
17
- else
18
- target.public_send(method, 1)
19
- end
20
- elsif method_arity == 1
21
- target.public_send(method, 1)
22
- else
23
- raise NotImplementedError
24
- end
25
- end
26
- end
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/comment"
6
+ require "active_support/core_ext/symbol/starts_ends_with"
27
7
 
28
- module DelegationWhitelistBlacklistTests
8
+ module ActiveRecord
9
+ module DelegationTests
29
10
  ARRAY_DELEGATES = [
30
11
  :+, :-, :|, :&, :[], :shuffle,
31
12
  :all?, :collect, :compact, :detect, :each, :each_cons, :each_with_index,
32
13
  :exclude?, :find_all, :flat_map, :group_by, :include?, :length,
33
- :map, :none?, :one?, :partition, :reject, :reverse,
34
- :sample, :second, :sort, :sort_by, :third,
14
+ :map, :none?, :one?, :partition, :reject, :reverse, :rotate,
15
+ :sample, :second, :sort, :sort_by, :slice, :third, :index, :rindex,
35
16
  :to_ary, :to_set, :to_xml, :to_yaml, :join,
36
- :in_groups, :in_groups_of, :to_sentence, :to_formatted_s
17
+ :in_groups, :in_groups_of, :to_sentence, :to_formatted_s, :as_json
37
18
  ]
38
19
 
39
20
  ARRAY_DELEGATES.each do |method|
@@ -41,23 +22,55 @@ module ActiveRecord
41
22
  assert_respond_to target, method
42
23
  end
43
24
  end
25
+
26
+ def test_not_respond_to_arel_method
27
+ assert_not_respond_to target, :exists
28
+ end
44
29
  end
45
30
 
46
- class DelegationAssociationTest < DelegationTest
47
- include DelegationWhitelistBlacklistTests
31
+ class DelegationAssociationTest < ActiveRecord::TestCase
32
+ include DelegationTests
48
33
 
49
34
  def target
50
- Post.first.comments
35
+ Post.new.comments
51
36
  end
52
37
  end
53
38
 
54
- class DelegationRelationTest < DelegationTest
55
- include DelegationWhitelistBlacklistTests
56
-
57
- fixtures :comments
39
+ class DelegationRelationTest < ActiveRecord::TestCase
40
+ include DelegationTests
58
41
 
59
42
  def target
60
43
  Comment.all
61
44
  end
62
45
  end
46
+
47
+ class QueryingMethodsDelegationTest < ActiveRecord::TestCase
48
+ QUERYING_METHODS =
49
+ ActiveRecord::Batches.public_instance_methods(false) +
50
+ ActiveRecord::Calculations.public_instance_methods(false) +
51
+ ActiveRecord::FinderMethods.public_instance_methods(false) - [:include?, :member?, :raise_record_not_found_exception!] +
52
+ ActiveRecord::SpawnMethods.public_instance_methods(false) - [:spawn, :merge!] +
53
+ ActiveRecord::QueryMethods.public_instance_methods(false).reject { |method|
54
+ method.end_with?("=", "!", "value", "values", "clause")
55
+ } - [:reverse_order, :arel, :extensions, :construct_join_dependency] + [
56
+ :any?, :many?, :none?, :one?,
57
+ :first_or_create, :first_or_create!, :first_or_initialize,
58
+ :find_or_create_by, :find_or_create_by!, :find_or_initialize_by,
59
+ :create_or_find_by, :create_or_find_by!,
60
+ :destroy_all, :delete_all, :update_all, :touch_all, :delete_by, :destroy_by
61
+ ]
62
+
63
+ def test_delegate_querying_methods
64
+ klass = Class.new(ActiveRecord::Base) do
65
+ self.table_name = "posts"
66
+ end
67
+
68
+ assert_equal QUERYING_METHODS.sort, ActiveRecord::Querying::QUERYING_METHODS.sort
69
+
70
+ QUERYING_METHODS.each do |method|
71
+ assert_respond_to klass.all, method
72
+ assert_respond_to klass, method
73
+ end
74
+ end
75
+ end
63
76
  end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/post"
6
+ require "models/pet"
7
+ require "models/toy"
8
+
9
+ class DeleteAllTest < ActiveRecord::TestCase
10
+ fixtures :authors, :author_addresses, :posts, :pets, :toys
11
+
12
+ def test_destroy_all
13
+ davids = Author.where(name: "David")
14
+
15
+ # Force load
16
+ assert_equal [authors(:david)], davids.to_a
17
+ assert_predicate davids, :loaded?
18
+
19
+ assert_difference("Author.count", -1) do
20
+ destroyed = davids.destroy_all
21
+ assert_equal [authors(:david)], destroyed
22
+ assert_predicate destroyed.first, :frozen?
23
+ end
24
+
25
+ assert_equal [], davids.to_a
26
+ assert_predicate davids, :loaded?
27
+ end
28
+
29
+ def test_delete_all
30
+ davids = Author.where(name: "David")
31
+
32
+ assert_difference("Author.count", -1) { davids.delete_all }
33
+ assert_not_predicate davids, :loaded?
34
+ end
35
+
36
+ def test_delete_all_with_index_hint
37
+ davids = Author.where(name: "David").from("#{Author.quoted_table_name} /*! USE INDEX (PRIMARY) */")
38
+
39
+ assert_difference("Author.count", -1) { davids.delete_all }
40
+ assert_not_predicate davids, :loaded?
41
+ end
42
+
43
+ def test_delete_all_loaded
44
+ davids = Author.where(name: "David")
45
+
46
+ # Force load
47
+ assert_equal [authors(:david)], davids.to_a
48
+ assert_predicate davids, :loaded?
49
+
50
+ assert_difference("Author.count", -1) { davids.delete_all }
51
+
52
+ assert_equal [], davids.to_a
53
+ assert_predicate davids, :loaded?
54
+ end
55
+
56
+ def test_delete_all_with_unpermitted_relation_raises_error
57
+ assert_raises(ActiveRecord::ActiveRecordError) { Author.distinct.delete_all }
58
+ assert_raises(ActiveRecord::ActiveRecordError) { Author.group(:name).delete_all }
59
+ assert_raises(ActiveRecord::ActiveRecordError) { Author.having("SUM(id) < 3").delete_all }
60
+ end
61
+
62
+ def test_delete_all_with_joins_and_where_part_is_hash
63
+ pets = Pet.joins(:toys).where(toys: { name: "Bone" })
64
+
65
+ assert_equal true, pets.exists?
66
+ sqls = capture_sql do
67
+ assert_equal pets.count, pets.delete_all
68
+ end
69
+
70
+ if current_adapter?(:Mysql2Adapter)
71
+ assert_no_match %r/SELECT DISTINCT #{Regexp.escape(Pet.connection.quote_table_name("pets.pet_id"))}/, sqls.last
72
+ else
73
+ assert_match %r/SELECT #{Regexp.escape(Pet.connection.quote_table_name("pets.pet_id"))}/, sqls.last
74
+ end
75
+ end
76
+
77
+ def test_delete_all_with_joins_and_where_part_is_not_hash
78
+ pets = Pet.joins(:toys).where("toys.name = ?", "Bone")
79
+
80
+ assert_equal true, pets.exists?
81
+ assert_equal pets.count, pets.delete_all
82
+ end
83
+
84
+ def test_delete_all_with_left_joins
85
+ pets = Pet.left_joins(:toys).where(toys: { name: "Bone" })
86
+
87
+ assert_equal true, pets.exists?
88
+ assert_equal pets.count, pets.delete_all
89
+ end
90
+
91
+ def test_delete_all_with_includes
92
+ pets = Pet.includes(:toys).where(toys: { name: "Bone" })
93
+
94
+ assert_equal true, pets.exists?
95
+ assert_equal pets.count, pets.delete_all
96
+ end
97
+
98
+ def test_delete_all_with_order_and_limit_deletes_subset_only
99
+ author = authors(:david)
100
+ limited_posts = Post.where(author: author).order(:id).limit(1)
101
+ assert_equal 1, limited_posts.size
102
+ assert_equal 2, limited_posts.limit(2).size
103
+ assert_equal 1, limited_posts.delete_all
104
+ assert_raise(ActiveRecord::RecordNotFound) { posts(:welcome) }
105
+ assert posts(:thinking)
106
+ end
107
+
108
+ def test_delete_all_with_order_and_limit_and_offset_deletes_subset_only
109
+ author = authors(:david)
110
+ limited_posts = Post.where(author: author).order(:id).limit(1).offset(1)
111
+ assert_equal 1, limited_posts.size
112
+ assert_equal 2, limited_posts.limit(2).size
113
+ assert_equal 1, limited_posts.delete_all
114
+ assert_raise(ActiveRecord::RecordNotFound) { posts(:thinking) }
115
+ assert posts(:welcome)
116
+ end
117
+ end
@@ -1,52 +1,264 @@
1
- require 'cases/helper'
2
- require 'models/author'
3
- require 'models/comment'
4
- require 'models/developer'
5
- require 'models/computer'
6
- require 'models/post'
7
- require 'models/project'
8
- require 'models/rating'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/categorization"
6
+ require "models/comment"
7
+ require "models/developer"
8
+ require "models/computer"
9
+ require "models/post"
10
+ require "models/project"
11
+ require "models/rating"
9
12
 
10
13
  class RelationMergingTest < ActiveRecord::TestCase
11
- fixtures :developers, :comments, :authors, :posts
14
+ fixtures :developers, :comments, :authors, :author_addresses, :posts
15
+
16
+ def test_merge_in_clause
17
+ david, mary, bob = authors = authors(:david, :mary, :bob)
18
+
19
+ david_and_mary = Author.where(id: [david, mary]).order(:id)
20
+ mary_and_bob = Author.where(id: [mary, bob]).order(:id)
21
+
22
+ assert_equal [david, mary], david_and_mary
23
+ assert_equal [mary, bob], mary_and_bob
24
+
25
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary))
26
+ assert_equal [mary], david_and_mary.merge(Author.rewhere(id: mary))
27
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary), rewhere: true)
28
+
29
+ assert_equal [bob], david_and_mary.merge(Author.where(id: bob))
30
+ assert_equal [bob], david_and_mary.merge(Author.rewhere(id: bob))
31
+ assert_equal [bob], david_and_mary.merge(Author.where(id: bob), rewhere: true)
32
+
33
+ assert_equal [david, bob], mary_and_bob.merge(Author.where(id: [david, bob]))
34
+ assert_equal [david, bob], mary_and_bob.merge(Author.where(id: [david, bob]), rewhere: true)
35
+
36
+ assert_equal [mary, bob], david_and_mary.merge(mary_and_bob)
37
+ assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
38
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
39
+ assert_equal authors, david_and_mary.or(mary_and_bob)
40
+
41
+ assert_equal [david, mary], mary_and_bob.merge(david_and_mary)
42
+ assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
43
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
44
+ assert_equal authors, david_and_mary.or(mary_and_bob)
45
+
46
+ david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
47
+
48
+ assert_equal [david], david_and_mary.merge(david_and_bob)
49
+ assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
50
+ assert_equal [david], david_and_mary.and(david_and_bob)
51
+ assert_equal authors, david_and_mary.or(david_and_bob)
52
+ end
53
+
54
+ def test_merge_between_clause
55
+ david, mary, bob = authors = authors(:david, :mary, :bob)
56
+
57
+ david_and_mary = Author.where(id: david.id..mary.id).order(:id)
58
+ mary_and_bob = Author.where(id: mary.id..bob.id).order(:id)
59
+
60
+ assert_equal [david, mary], david_and_mary
61
+ assert_equal [mary, bob], mary_and_bob
62
+
63
+ author_id = Regexp.escape(Author.connection.quote_table_name("authors.id"))
64
+ message = %r/Merging \(#{author_id} BETWEEN (\?|\W?\w?\d) AND \g<1>\) and \(#{author_id} (?:= \g<1>|IN \(\g<1>, \g<1>\))\) no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0\./
65
+
66
+ assert_deprecated(message) do
67
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary))
68
+ end
69
+ assert_equal [mary], david_and_mary.merge(Author.rewhere(id: mary))
70
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary), rewhere: true)
71
+
72
+ assert_deprecated(message) do
73
+ assert_equal [], david_and_mary.merge(Author.where(id: bob))
74
+ end
75
+ assert_equal [bob], david_and_mary.merge(Author.rewhere(id: bob))
76
+ assert_equal [bob], david_and_mary.merge(Author.where(id: bob), rewhere: true)
77
+
78
+ assert_deprecated(message) do
79
+ assert_equal [bob], mary_and_bob.merge(Author.where(id: [david, bob]))
80
+ end
81
+ assert_equal [david, bob], mary_and_bob.merge(Author.where(id: [david, bob]), rewhere: true)
82
+
83
+ message = %r/Merging \(#{author_id} BETWEEN (\?|\W?\w?\d) AND \g<1>\) and \(#{author_id} BETWEEN \g<1> AND \g<1>\) no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0\./
84
+
85
+ assert_deprecated(message) do
86
+ assert_equal [mary], david_and_mary.merge(mary_and_bob)
87
+ end
88
+ assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
89
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
90
+ assert_equal authors, david_and_mary.or(mary_and_bob)
91
+
92
+ assert_deprecated(message) do
93
+ assert_equal [mary], mary_and_bob.merge(david_and_mary)
94
+ end
95
+ assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
96
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
97
+ assert_equal authors, david_and_mary.or(mary_and_bob)
98
+
99
+ david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
100
+
101
+ assert_equal [david], david_and_mary.merge(david_and_bob)
102
+ assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
103
+ assert_equal [david], david_and_mary.and(david_and_bob)
104
+ assert_equal authors, david_and_mary.or(david_and_bob)
105
+ end
106
+
107
+ def test_merge_or_clause
108
+ david, mary, bob = authors = authors(:david, :mary, :bob)
109
+
110
+ david_and_mary = Author.where(id: david).or(Author.where(id: mary)).order(:id)
111
+ mary_and_bob = Author.where(id: mary).or(Author.where(id: bob)).order(:id)
112
+
113
+ assert_equal [david, mary], david_and_mary
114
+ assert_equal [mary, bob], mary_and_bob
115
+
116
+ author_id = Regexp.escape(Author.connection.quote_table_name("authors.id"))
117
+ message = %r/Merging \(\(#{author_id} = (\?|\W?\w?\d) OR #{author_id} = \g<1>\)\) and \(#{author_id} (?:= \g<1>|IN \(\g<1>, \g<1>\))\) no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0\./
118
+
119
+ assert_deprecated(message) do
120
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary))
121
+ end
122
+ assert_equal [mary], david_and_mary.merge(Author.rewhere(id: mary))
123
+ assert_equal [mary], david_and_mary.merge(Author.where(id: mary), rewhere: true)
124
+
125
+ assert_deprecated(message) do
126
+ assert_equal [], david_and_mary.merge(Author.where(id: bob))
127
+ end
128
+ assert_equal [bob], david_and_mary.merge(Author.rewhere(id: bob))
129
+ assert_equal [bob], david_and_mary.merge(Author.where(id: bob), rewhere: true)
130
+
131
+ assert_deprecated(message) do
132
+ assert_equal [bob], mary_and_bob.merge(Author.where(id: [david, bob]))
133
+ end
134
+ assert_equal [david, bob], mary_and_bob.merge(Author.where(id: [david, bob]), rewhere: true)
135
+
136
+ message = %r/Merging \(\(#{author_id} = (\?|\W?\w?\d) OR #{author_id} = \g<1>\)\) and \(\(#{author_id} = \g<1> OR #{author_id} = \g<1>\)\) no longer maintain both conditions, and will be replaced by the latter in Rails 7\.0\./
137
+
138
+ assert_deprecated(message) do
139
+ assert_equal [mary], david_and_mary.merge(mary_and_bob)
140
+ end
141
+ assert_equal [mary, bob], david_and_mary.merge(mary_and_bob, rewhere: true)
142
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
143
+ assert_equal authors, david_and_mary.or(mary_and_bob)
144
+
145
+ assert_deprecated(message) do
146
+ assert_equal [mary], mary_and_bob.merge(david_and_mary)
147
+ end
148
+ assert_equal [david, mary], mary_and_bob.merge(david_and_mary, rewhere: true)
149
+ assert_equal [mary], david_and_mary.and(mary_and_bob)
150
+ assert_equal authors, david_and_mary.or(mary_and_bob)
151
+
152
+ david_and_bob = Author.where(id: david).or(Author.where(name: "Bob"))
153
+
154
+ assert_equal [david], david_and_mary.merge(david_and_bob)
155
+ assert_equal [david], david_and_mary.merge(david_and_bob, rewhere: true)
156
+ assert_equal [david], david_and_mary.and(david_and_bob)
157
+ assert_equal authors, david_and_mary.or(david_and_bob)
158
+ end
159
+
160
+ def test_merge_not_in_clause
161
+ david, mary, bob = authors(:david, :mary, :bob)
162
+
163
+ non_mary_and_bob = Author.where.not(id: [mary, bob])
164
+
165
+ assert_equal [david], non_mary_and_bob
166
+
167
+ assert_deprecated do
168
+ assert_equal [david], Author.where(id: david).merge(non_mary_and_bob)
169
+ end
170
+ assert_equal [david], Author.where(id: david).merge(non_mary_and_bob, rewhere: true)
171
+
172
+ assert_deprecated do
173
+ assert_equal [], Author.where(id: mary).merge(non_mary_and_bob)
174
+ end
175
+ assert_equal [david], Author.where(id: mary).merge(non_mary_and_bob, rewhere: true)
176
+ end
177
+
178
+ def test_merge_not_range_clause
179
+ david, mary, bob = authors(:david, :mary, :bob)
180
+
181
+ less_than_bob = Author.where.not(id: bob.id..Float::INFINITY).order(:id)
182
+
183
+ assert_equal [david, mary], less_than_bob
184
+
185
+ assert_deprecated do
186
+ assert_equal [david], Author.where(id: david).merge(less_than_bob)
187
+ end
188
+ assert_equal [david, mary], Author.where(id: david).merge(less_than_bob, rewhere: true)
189
+
190
+ assert_deprecated do
191
+ assert_equal [mary], Author.where(id: mary).merge(less_than_bob)
192
+ end
193
+ assert_equal [david, mary], Author.where(id: mary).merge(less_than_bob, rewhere: true)
194
+ end
195
+
196
+ def test_merge_doesnt_duplicate_same_clauses
197
+ david, mary, bob = authors(:david, :mary, :bob)
198
+
199
+ non_mary_and_bob = Author.where.not(id: [mary, bob])
200
+
201
+ author_id = Author.connection.quote_table_name("authors.id")
202
+ assert_sql(/WHERE #{Regexp.escape(author_id)} NOT IN \((\?|\W?\w?\d), \g<1>\)\z/) do
203
+ assert_equal [david], non_mary_and_bob.merge(non_mary_and_bob)
204
+ end
205
+
206
+ only_david = Author.where("#{author_id} IN (?)", david)
207
+
208
+ assert_sql(/WHERE \(#{Regexp.escape(author_id)} IN \(1\)\)\z/) do
209
+ assert_equal [david], only_david.merge(only_david)
210
+ end
211
+
212
+ assert_sql(/WHERE \(#{Regexp.escape(author_id)} IN \(1\)\)\z/) do
213
+ assert_equal [david], only_david.merge(only_david, rewhere: true)
214
+ end
215
+ end
12
216
 
13
217
  def test_relation_merging
14
- devs = Developer.where("salary >= 80000").merge(Developer.limit(2)).merge(Developer.order('id ASC').where("id < 3"))
218
+ devs = Developer.where("salary >= 80000").merge(Developer.limit(2)).merge(Developer.order("id ASC").where("id < 3"))
15
219
  assert_equal [developers(:david), developers(:jamis)], devs.to_a
16
220
 
17
- dev_with_count = Developer.limit(1).merge(Developer.order('id DESC')).merge(Developer.select('developers.*'))
221
+ dev_with_count = Developer.limit(1).merge(Developer.order("id DESC")).merge(Developer.select("developers.*"))
18
222
  assert_equal [developers(:poor_jamis)], dev_with_count.to_a
19
223
  end
20
224
 
21
225
  def test_relation_to_sql
22
226
  post = Post.first
23
227
  sql = post.comments.to_sql
24
- assert_match(/.?post_id.? = #{post.id}\Z/i, sql)
228
+ assert_match(/.?post_id.? = #{post.id}\z/i, sql)
25
229
  end
26
230
 
27
231
  def test_relation_merging_with_arel_equalities_keeps_last_equality
28
- devs = Developer.where(Developer.arel_table[:salary].eq(80000)).merge(
29
- Developer.where(Developer.arel_table[:salary].eq(9000))
30
- )
232
+ salary_attr = Developer.arel_table[:salary]
233
+
234
+ devs = Developer.where(salary_attr.eq(80000)).merge(Developer.where(salary_attr.eq(9000)))
235
+ assert_equal [developers(:poor_jamis)], devs.to_a
236
+
237
+ devs = Developer.where(salary_attr.eq(80000)).merge(Developer.where(salary_attr.eq(9000)), rewhere: true)
238
+ assert_equal [developers(:poor_jamis)], devs.to_a
239
+
240
+ devs = Developer.where(salary_attr.eq(80000)).rewhere(salary_attr.eq(9000))
31
241
  assert_equal [developers(:poor_jamis)], devs.to_a
32
242
  end
33
243
 
34
244
  def test_relation_merging_with_arel_equalities_keeps_last_equality_with_non_attribute_left_hand
35
245
  salary_attr = Developer.arel_table[:salary]
36
- devs = Developer.where(
37
- Arel::Nodes::NamedFunction.new('abs', [salary_attr]).eq(80000)
38
- ).merge(
39
- Developer.where(
40
- Arel::Nodes::NamedFunction.new('abs', [salary_attr]).eq(9000)
41
- )
42
- )
246
+ abs_salary = Arel::Nodes::NamedFunction.new("abs", [salary_attr])
247
+
248
+ devs = Developer.where(abs_salary.eq(80000)).merge(Developer.where(abs_salary.eq(9000)))
249
+ assert_equal [developers(:poor_jamis)], devs.to_a
250
+
251
+ devs = Developer.where(abs_salary.eq(80000)).merge(Developer.where(abs_salary.eq(9000)), rewhere: true)
252
+ assert_equal [developers(:poor_jamis)], devs.to_a
253
+
254
+ devs = Developer.where(abs_salary.eq(80000)).rewhere(abs_salary.eq(9000))
43
255
  assert_equal [developers(:poor_jamis)], devs.to_a
44
256
  end
45
257
 
46
258
  def test_relation_merging_with_eager_load
47
259
  relations = []
48
- relations << Post.order('comments.id DESC').merge(Post.eager_load(:last_comment)).merge(Post.all)
49
- relations << Post.eager_load(:last_comment).merge(Post.order('comments.id DESC')).merge(Post.all)
260
+ relations << Post.order("comments.id DESC").merge(Post.eager_load(:last_comment)).merge(Post.all)
261
+ relations << Post.eager_load(:last_comment).merge(Post.order("comments.id DESC")).merge(Post.all)
50
262
 
51
263
  relations.each do |posts|
52
264
  post = posts.find { |p| p.id == 1 }
@@ -56,7 +268,7 @@ class RelationMergingTest < ActiveRecord::TestCase
56
268
 
57
269
  def test_relation_merging_with_locks
58
270
  devs = Developer.lock.where("salary >= 80000").order("id DESC").merge(Developer.limit(2))
59
- assert devs.locked.present?
271
+ assert_predicate devs, :locked?
60
272
  end
61
273
 
62
274
  def test_relation_merging_with_preload
@@ -66,29 +278,37 @@ class RelationMergingTest < ActiveRecord::TestCase
66
278
  end
67
279
 
68
280
  def test_relation_merging_with_joins
69
- comments = Comment.joins(:post).where(:body => 'Thank you for the welcome').merge(Post.where(:body => 'Such a lovely day'))
281
+ comments = Comment.joins(:post).where(body: "Thank you for the welcome").merge(Post.where(body: "Such a lovely day"))
70
282
  assert_equal 1, comments.count
71
283
  end
72
284
 
285
+ def test_relation_merging_with_left_outer_joins
286
+ comments = Comment.joins(:post).where(body: "Thank you for the welcome").merge(Post.left_outer_joins(:author).where(body: "Such a lovely day"))
287
+
288
+ assert_equal 1, comments.count
289
+ end
290
+
291
+ def test_relation_merging_with_skip_query_cache
292
+ assert_equal Post.all.merge(Post.all.skip_query_cache!).skip_query_cache_value, true
293
+ end
294
+
73
295
  def test_relation_merging_with_association
74
296
  assert_queries(2) do # one for loading post, and another one merged query
75
- post = Post.where(:body => 'Such a lovely day').first
76
- comments = Comment.where(:body => 'Thank you for the welcome').merge(post.comments)
297
+ post = Post.where(body: "Such a lovely day").first
298
+ comments = Comment.where(body: "Thank you for the welcome").merge(post.comments)
77
299
  assert_equal 1, comments.count
78
300
  end
79
301
  end
80
302
 
81
303
  test "merge collapses wheres from the LHS only" do
82
- left = Post.where(title: "omg").where(comments_count: 1)
304
+ left = Post.where(title: "omg").where(comments_count: 1)
83
305
  right = Post.where(title: "wtf").where(title: "bbq")
84
306
 
85
- expected = [left.bound_attributes[1]] + right.bound_attributes
86
- merged = left.merge(right)
307
+ merged = left.merge(right)
87
308
 
88
- assert_equal expected, merged.bound_attributes
89
- assert !merged.to_sql.include?("omg")
90
- assert merged.to_sql.include?("wtf")
91
- assert merged.to_sql.include?("bbq")
309
+ assert_not_includes merged.to_sql, "omg"
310
+ assert_includes merged.to_sql, "wtf"
311
+ assert_includes merged.to_sql, "bbq"
92
312
  end
93
313
 
94
314
  def test_merging_reorders_bind_params
@@ -107,14 +327,68 @@ class RelationMergingTest < ActiveRecord::TestCase
107
327
 
108
328
  def test_merging_with_from_clause
109
329
  relation = Post.all
110
- assert relation.from_clause.empty?
330
+ assert_empty relation.from_clause
111
331
  relation = relation.merge(Post.from("posts"))
112
- refute relation.from_clause.empty?
332
+ assert_not_empty relation.from_clause
333
+ end
334
+
335
+ def test_merging_with_from_clause_on_different_class
336
+ assert Comment.joins(:post).merge(Post.from("posts")).first
337
+ end
338
+
339
+ def test_merging_with_order_with_binds
340
+ relation = Post.all.merge(Post.order([Arel.sql("title LIKE ?"), "%suffix"]))
341
+ assert_equal ["title LIKE '%suffix'"], relation.order_values
342
+ end
343
+
344
+ def test_merging_with_order_without_binds
345
+ relation = Post.all.merge(Post.order(Arel.sql("title LIKE '%?'")))
346
+ assert_equal ["title LIKE '%?'"], relation.order_values
347
+ end
348
+
349
+ def test_merging_annotations_respects_merge_order
350
+ assert_sql(%r{/\* foo \*/ /\* bar \*/}) do
351
+ Post.annotate("foo").merge(Post.annotate("bar")).first
352
+ end
353
+ assert_sql(%r{/\* bar \*/ /\* foo \*/}) do
354
+ Post.annotate("bar").merge(Post.annotate("foo")).first
355
+ end
356
+ assert_sql(%r{/\* foo \*/ /\* bar \*/ /\* baz \*/ /\* qux \*/}) do
357
+ Post.annotate("foo").annotate("bar").merge(Post.annotate("baz").annotate("qux")).first
358
+ end
359
+ end
360
+
361
+ def test_merging_duplicated_annotations
362
+ posts = Post.annotate("foo")
363
+ assert_sql(%r{FROM #{Regexp.escape(Post.quoted_table_name)} /\* foo \*/\z}) do
364
+ posts.merge(posts).uniq!(:annotate).to_a
365
+ end
366
+
367
+ message = <<-MSG.squish
368
+ Duplicated query annotations are no longer shown in queries in Rails 7.0.
369
+ To migrate to Rails 7.0's behavior, use `uniq!(:annotate)` to deduplicate query annotations
370
+ (`posts.uniq!(:annotate)`).
371
+ MSG
372
+ assert_deprecated(message) do
373
+ assert_sql(%r{FROM #{Regexp.escape(Post.quoted_table_name)} /\* foo \*/ /\* foo \*/\z}) do
374
+ posts.merge(posts).to_a
375
+ end
376
+ end
377
+ assert_deprecated(message) do
378
+ assert_sql(%r{FROM #{Regexp.escape(Post.quoted_table_name)} /\* foo \*/ /\* bar \*/ /\* foo \*/\z}) do
379
+ Post.annotate("foo").merge(Post.annotate("bar")).merge(posts).to_a
380
+ end
381
+ end
382
+ assert_deprecated(message) do
383
+ assert_sql(%r{FROM #{Regexp.escape(Post.quoted_table_name)} /\* bar \*/ /\* foo \*/ /\* foo \*/\z}) do
384
+ Post.annotate("bar").merge(Post.annotate("foo")).merge(posts).to_a
385
+ end
386
+ end
113
387
  end
114
388
  end
115
389
 
116
390
  class MergingDifferentRelationsTest < ActiveRecord::TestCase
117
- fixtures :posts, :authors, :developers
391
+ fixtures :posts, :authors, :author_addresses, :developers
118
392
 
119
393
  test "merging where relations" do
120
394
  hello_by_bob = Post.where(body: "hello").joins(:author).
@@ -126,24 +400,27 @@ class MergingDifferentRelationsTest < ActiveRecord::TestCase
126
400
 
127
401
  test "merging order relations" do
128
402
  posts_by_author_name = Post.limit(3).joins(:author).
403
+ where.not("authors.name": "David").
129
404
  merge(Author.order(:name)).pluck("authors.name")
130
405
 
131
- assert_equal ["Bob", "Bob", "David"], posts_by_author_name
406
+ assert_equal ["Bob", "Bob", "Mary"], posts_by_author_name
132
407
 
133
408
  posts_by_author_name = Post.limit(3).joins(:author).
409
+ where.not("authors.name": "David").
134
410
  merge(Author.order("name")).pluck("authors.name")
135
411
 
136
- assert_equal ["Bob", "Bob", "David"], posts_by_author_name
412
+ assert_equal ["Bob", "Bob", "Mary"], posts_by_author_name
137
413
  end
138
414
 
139
415
  test "merging order relations (using a hash argument)" do
140
416
  posts_by_author_name = Post.limit(4).joins(:author).
417
+ where.not("authors.name": "David").
141
418
  merge(Author.order(name: :desc)).pluck("authors.name")
142
419
 
143
- assert_equal ["Mary", "Mary", "Mary", "David"], posts_by_author_name
420
+ assert_equal ["Mary", "Mary", "Mary", "Bob"], posts_by_author_name
144
421
  end
145
422
 
146
- test "relation merging (using a proc argument)" do
423
+ test "relation merging (using a proc argument)" do
147
424
  dev = Developer.where(name: "Jamis").first
148
425
 
149
426
  comment_1 = dev.comments.create!(body: "I'm Jamis", post: Post.first)