ibm_db 5.2.0-x86-mingw32 → 5.4.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -0,0 +1,317 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/category"
6
+ require "models/comment"
7
+ require "models/computer"
8
+ require "models/developer"
9
+ require "models/post"
10
+ require "models/person"
11
+ require "models/pet"
12
+ require "models/toy"
13
+ require "models/topic"
14
+ require "models/tag"
15
+ require "models/tagging"
16
+ require "models/warehouse_thing"
17
+
18
+ class UpdateAllTest < ActiveRecord::TestCase
19
+ fixtures :authors, :author_addresses, :comments, :developers, :posts, :people, :pets, :toys, :tags, :taggings, "warehouse_things"
20
+
21
+ class TopicWithCallbacks < ActiveRecord::Base
22
+ self.table_name = :topics
23
+ cattr_accessor :topic_count
24
+ before_update { |topic| topic.author_name = "David" if topic.author_name.blank? }
25
+ after_update { |topic| topic.class.topic_count = topic.class.count }
26
+ end
27
+
28
+ def test_update_all_with_scope
29
+ tag = Tag.first
30
+ Post.tagged_with(tag.id).update_all(title: "rofl")
31
+ posts = Post.tagged_with(tag.id).all.to_a
32
+ assert_operator posts.length, :>, 0
33
+ posts.each { |post| assert_equal "rofl", post.title }
34
+ end
35
+
36
+ def test_update_all_with_non_standard_table_name
37
+ assert_equal 1, WarehouseThing.where(id: 1).update_all(["value = ?", 0])
38
+ assert_equal 0, WarehouseThing.find(1).value
39
+ end
40
+
41
+ def test_update_all_with_blank_argument
42
+ assert_raises(ArgumentError) { Comment.update_all({}) }
43
+ end
44
+
45
+ def test_update_all_with_joins
46
+ pets = Pet.joins(:toys).where(toys: { name: "Bone" })
47
+
48
+ assert_equal true, pets.exists?
49
+ sqls = capture_sql do
50
+ assert_equal pets.count, pets.update_all(name: "Bob")
51
+ end
52
+
53
+ if current_adapter?(:Mysql2Adapter)
54
+ assert_no_match %r/SELECT DISTINCT #{Regexp.escape(Pet.connection.quote_table_name("pets.pet_id"))}/, sqls.last
55
+ else
56
+ assert_match %r/SELECT #{Regexp.escape(Pet.connection.quote_table_name("pets.pet_id"))}/, sqls.last
57
+ end
58
+ end
59
+
60
+ def test_update_all_with_left_joins
61
+ pets = Pet.left_joins(:toys).where(toys: { name: "Bone" })
62
+
63
+ assert_equal true, pets.exists?
64
+ assert_equal pets.count, pets.update_all(name: "Bob")
65
+ end
66
+
67
+ def test_update_all_with_includes
68
+ pets = Pet.includes(:toys).where(toys: { name: "Bone" })
69
+
70
+ assert_equal true, pets.exists?
71
+ assert_equal pets.count, pets.update_all(name: "Bob")
72
+ end
73
+
74
+ def test_update_all_with_joins_and_limit_and_order
75
+ comments = Comment.joins(:post).where("posts.id" => posts(:welcome).id).order("comments.id").limit(1)
76
+ assert_equal 1, comments.count
77
+ assert_equal 1, comments.update_all(post_id: posts(:thinking).id)
78
+ assert_equal posts(:thinking), comments(:greetings).post
79
+ assert_equal posts(:welcome), comments(:more_greetings).post
80
+ end
81
+
82
+ def test_update_all_with_joins_and_offset_and_order
83
+ comments = Comment.joins(:post).where("posts.id" => posts(:welcome).id).order("comments.id").offset(1)
84
+ assert_equal 1, comments.count
85
+ assert_equal 1, comments.update_all(post_id: posts(:thinking).id)
86
+ assert_equal posts(:thinking), comments(:more_greetings).post
87
+ assert_equal posts(:welcome), comments(:greetings).post
88
+ end
89
+
90
+ def test_update_counters_with_joins
91
+ assert_nil pets(:parrot).integer
92
+
93
+ Pet.joins(:toys).where(toys: { name: "Bone" }).update_counters(integer: 1)
94
+
95
+ assert_equal 1, pets(:parrot).reload.integer
96
+ end
97
+
98
+ def test_touch_all_updates_records_timestamps
99
+ david = developers(:david)
100
+ david_previously_updated_at = david.updated_at
101
+ jamis = developers(:jamis)
102
+ jamis_previously_updated_at = jamis.updated_at
103
+ Developer.where(name: "David").touch_all
104
+
105
+ assert_not_equal david_previously_updated_at, david.reload.updated_at
106
+ assert_equal jamis_previously_updated_at, jamis.reload.updated_at
107
+ end
108
+
109
+ def test_touch_all_with_custom_timestamp
110
+ developer = developers(:david)
111
+ previously_created_at = developer.created_at
112
+ previously_updated_at = developer.updated_at
113
+ Developer.where(name: "David").touch_all(:created_at)
114
+ developer.reload
115
+
116
+ assert_not_equal previously_created_at, developer.created_at
117
+ assert_not_equal previously_updated_at, developer.updated_at
118
+ end
119
+
120
+ def test_touch_all_with_given_time
121
+ developer = developers(:david)
122
+ previously_created_at = developer.created_at
123
+ previously_updated_at = developer.updated_at
124
+ new_time = Time.utc(2015, 2, 16, 4, 54, 0)
125
+ Developer.where(name: "David").touch_all(:created_at, time: new_time)
126
+ developer.reload
127
+
128
+ assert_not_equal previously_created_at, developer.created_at
129
+ assert_not_equal previously_updated_at, developer.updated_at
130
+ assert_equal new_time, developer.created_at
131
+ assert_equal new_time, developer.updated_at
132
+ end
133
+
134
+ def test_update_on_relation
135
+ topic1 = TopicWithCallbacks.create! title: "arel", author_name: nil
136
+ topic2 = TopicWithCallbacks.create! title: "activerecord", author_name: nil
137
+ topics = TopicWithCallbacks.where(id: [topic1.id, topic2.id])
138
+ topics.update(title: "adequaterecord")
139
+
140
+ assert_equal TopicWithCallbacks.count, TopicWithCallbacks.topic_count
141
+
142
+ assert_equal "adequaterecord", topic1.reload.title
143
+ assert_equal "adequaterecord", topic2.reload.title
144
+ # Testing that the before_update callbacks have run
145
+ assert_equal "David", topic1.reload.author_name
146
+ assert_equal "David", topic2.reload.author_name
147
+ end
148
+
149
+ def test_update_with_ids_on_relation
150
+ topic1 = TopicWithCallbacks.create!(title: "arel", author_name: nil)
151
+ topic2 = TopicWithCallbacks.create!(title: "activerecord", author_name: nil)
152
+ topics = TopicWithCallbacks.none
153
+ topics.update(
154
+ [topic1.id, topic2.id],
155
+ [{ title: "adequaterecord" }, { title: "adequaterecord" }]
156
+ )
157
+
158
+ assert_equal TopicWithCallbacks.count, TopicWithCallbacks.topic_count
159
+
160
+ assert_equal "adequaterecord", topic1.reload.title
161
+ assert_equal "adequaterecord", topic2.reload.title
162
+ # Testing that the before_update callbacks have run
163
+ assert_equal "David", topic1.reload.author_name
164
+ assert_equal "David", topic2.reload.author_name
165
+ end
166
+
167
+ def test_update_on_relation_passing_active_record_object_is_not_permitted
168
+ topic = Topic.create!(title: "Foo", author_name: nil)
169
+ assert_raises(ArgumentError) do
170
+ Topic.where(id: topic.id).update(topic, title: "Bar")
171
+ end
172
+ end
173
+
174
+ def test_update_all_cares_about_optimistic_locking
175
+ david = people(:david)
176
+
177
+ travel 5.seconds do
178
+ now = Time.now.utc
179
+ assert_not_equal now, david.updated_at
180
+
181
+ people = Person.where(id: people(:michael, :david, :susan))
182
+ expected = people.pluck(:lock_version)
183
+ expected.map! { |version| version + 1 }
184
+ people.update_all(updated_at: now)
185
+
186
+ assert_equal [now] * 3, people.pluck(:updated_at)
187
+ assert_equal expected, people.pluck(:lock_version)
188
+
189
+ assert_raises(ActiveRecord::StaleObjectError) do
190
+ david.touch(time: now)
191
+ end
192
+ end
193
+ end
194
+
195
+ def test_update_counters_cares_about_optimistic_locking
196
+ david = people(:david)
197
+
198
+ travel 5.seconds do
199
+ now = Time.now.utc
200
+ assert_not_equal now, david.updated_at
201
+
202
+ people = Person.where(id: people(:michael, :david, :susan))
203
+ expected = people.pluck(:lock_version)
204
+ expected.map! { |version| version + 1 }
205
+ people.update_counters(touch: { time: now })
206
+
207
+ assert_equal [now] * 3, people.pluck(:updated_at)
208
+ assert_equal expected, people.pluck(:lock_version)
209
+
210
+ assert_raises(ActiveRecord::StaleObjectError) do
211
+ david.touch(time: now)
212
+ end
213
+ end
214
+ end
215
+
216
+ def test_touch_all_cares_about_optimistic_locking
217
+ david = people(:david)
218
+
219
+ travel 5.seconds do
220
+ now = Time.now.utc
221
+ assert_not_equal now, david.updated_at
222
+
223
+ people = Person.where(id: people(:michael, :david, :susan))
224
+ expected = people.pluck(:lock_version)
225
+ expected.map! { |version| version + 1 }
226
+ people.touch_all(time: now)
227
+
228
+ assert_equal [now] * 3, people.pluck(:updated_at)
229
+ assert_equal expected, people.pluck(:lock_version)
230
+
231
+ assert_raises(ActiveRecord::StaleObjectError) do
232
+ david.touch(time: now)
233
+ end
234
+ end
235
+ end
236
+
237
+ def test_klass_level_update_all
238
+ travel 5.seconds do
239
+ now = Time.now.utc
240
+
241
+ Person.all.each do |person|
242
+ assert_not_equal now, person.updated_at
243
+ end
244
+
245
+ Person.update_all(updated_at: now)
246
+
247
+ Person.all.each do |person|
248
+ assert_equal now, person.updated_at
249
+ end
250
+ end
251
+ end
252
+
253
+ def test_klass_level_touch_all
254
+ travel 5.seconds do
255
+ now = Time.now.utc
256
+
257
+ Person.all.each do |person|
258
+ assert_not_equal now, person.updated_at
259
+ end
260
+
261
+ Person.touch_all(time: now)
262
+
263
+ Person.all.each do |person|
264
+ assert_equal now, person.updated_at
265
+ end
266
+ end
267
+ end
268
+
269
+ # Oracle UPDATE does not support ORDER BY
270
+ unless current_adapter?(:OracleAdapter)
271
+ def test_update_all_ignores_order_without_limit_from_association
272
+ author = authors(:david)
273
+ assert_nothing_raised do
274
+ assert_equal author.posts_with_comments_and_categories.length, author.posts_with_comments_and_categories.update_all([ "body = ?", "bulk update!" ])
275
+ end
276
+ end
277
+
278
+ def test_update_all_doesnt_ignore_order
279
+ assert_equal authors(:david).id + 1, authors(:mary).id # make sure there is going to be a duplicate PK error
280
+ test_update_with_order_succeeds = lambda do |order|
281
+ Author.order(order).update_all("id = id + 1")
282
+ rescue ActiveRecord::ActiveRecordError
283
+ false
284
+ end
285
+
286
+ if test_update_with_order_succeeds.call("id DESC")
287
+ # test that this wasn't a fluke and using an incorrect order results in an exception
288
+ assert_not test_update_with_order_succeeds.call("id ASC")
289
+ else
290
+ # test that we're failing because the current Arel's engine doesn't support UPDATE ORDER BY queries is using subselects instead
291
+ assert_sql(/\AUPDATE .+ \(SELECT .* ORDER BY id DESC\)\z/i) do
292
+ test_update_with_order_succeeds.call("id DESC")
293
+ end
294
+ end
295
+ end
296
+
297
+ def test_update_all_with_order_and_limit_updates_subset_only
298
+ author = authors(:david)
299
+ limited_posts = author.posts_sorted_by_id_limited
300
+ assert_equal 1, limited_posts.size
301
+ assert_equal 2, limited_posts.limit(2).size
302
+ assert_equal 1, limited_posts.update_all([ "body = ?", "bulk update!" ])
303
+ assert_equal "bulk update!", posts(:welcome).body
304
+ assert_not_equal "bulk update!", posts(:thinking).body
305
+ end
306
+
307
+ def test_update_all_with_order_and_limit_and_offset_updates_subset_only
308
+ author = authors(:david)
309
+ limited_posts = author.posts_sorted_by_id_limited.offset(1)
310
+ assert_equal 1, limited_posts.size
311
+ assert_equal 2, limited_posts.limit(2).size
312
+ assert_equal 1, limited_posts.update_all([ "body = ?", "bulk update!" ])
313
+ assert_equal "bulk update!", posts(:thinking).body
314
+ assert_not_equal "bulk update!", posts(:welcome).body
315
+ end
316
+ end
317
+ end
@@ -1,19 +1,30 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/comment'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/author"
6
+ require "models/human"
7
+ require "models/essay"
8
+ require "models/comment"
9
+ require "models/categorization"
4
10
 
5
11
  module ActiveRecord
6
12
  class WhereChainTest < ActiveRecord::TestCase
7
- fixtures :posts
13
+ fixtures :posts, :comments, :authors, :humans, :essays, :author_addresses
14
+
15
+ def test_missing_with_association
16
+ assert posts(:authorless).author.blank?
17
+ assert_equal [posts(:authorless)], Post.where.missing(:author).to_a
18
+ end
8
19
 
9
- def setup
10
- super
11
- @name = 'title'
20
+ def test_missing_with_multiple_association
21
+ assert posts(:authorless).comments.empty?
22
+ assert_equal [posts(:authorless)], Post.where.missing(:author, :comments).to_a
12
23
  end
13
24
 
14
25
  def test_not_inverts_where_clause
15
- relation = Post.where.not(title: 'hello')
16
- expected_where_clause = Post.where(title: 'hello').where_clause.invert
26
+ relation = Post.where.not(title: "hello")
27
+ expected_where_clause = Post.where(title: "hello").where_clause.invert
17
28
 
18
29
  assert_equal expected_where_clause, relation.where_clause
19
30
  end
@@ -25,81 +36,106 @@ module ActiveRecord
25
36
  end
26
37
 
27
38
  def test_association_not_eq
28
- expected = Arel::Nodes::Grouping.new(Comment.arel_table[@name].not_eq(Arel::Nodes::BindParam.new))
29
- relation = Post.joins(:comments).where.not(comments: {title: 'hello'})
39
+ expected = Comment.arel_table["title"].not_eq(Arel::Nodes::BindParam.new(1))
40
+ relation = Post.joins(:comments).where.not(comments: { title: "hello" })
30
41
  assert_equal(expected.to_sql, relation.where_clause.ast.to_sql)
31
42
  end
32
43
 
33
44
  def test_not_eq_with_preceding_where
34
- relation = Post.where(title: 'hello').where.not(title: 'world')
45
+ relation = Post.where(title: "hello").where.not(title: "world")
35
46
  expected_where_clause =
36
- Post.where(title: 'hello').where_clause +
37
- Post.where(title: 'world').where_clause.invert
47
+ Post.where(title: "hello").where_clause +
48
+ Post.where(title: "world").where_clause.invert
38
49
 
39
50
  assert_equal expected_where_clause, relation.where_clause
40
51
  end
41
52
 
42
53
  def test_not_eq_with_succeeding_where
43
- relation = Post.where.not(title: 'hello').where(title: 'world')
54
+ relation = Post.where.not(title: "hello").where(title: "world")
44
55
  expected_where_clause =
45
- Post.where(title: 'hello').where_clause.invert +
46
- Post.where(title: 'world').where_clause
56
+ Post.where(title: "hello").where_clause.invert +
57
+ Post.where(title: "world").where_clause
47
58
 
48
59
  assert_equal expected_where_clause, relation.where_clause
49
60
  end
50
61
 
51
62
  def test_chaining_multiple
52
- relation = Post.where.not(author_id: [1, 2]).where.not(title: 'ruby on rails')
63
+ relation = Post.where.not(author_id: [1, 2]).where.not(title: "ruby on rails")
53
64
  expected_where_clause =
54
65
  Post.where(author_id: [1, 2]).where_clause.invert +
55
- Post.where(title: 'ruby on rails').where_clause.invert
66
+ Post.where(title: "ruby on rails").where_clause.invert
56
67
 
57
68
  assert_equal expected_where_clause, relation.where_clause
58
69
  end
59
70
 
60
71
  def test_rewhere_with_one_condition
61
- relation = Post.where(title: 'hello').where(title: 'world').rewhere(title: 'alone')
62
- expected = Post.where(title: 'alone')
72
+ relation = Post.where(body: "hello").where(body: "world").rewhere(body: "hullo")
73
+ expected = Post.where(body: "hullo")
63
74
 
64
- assert_equal expected.where_clause, relation.where_clause
75
+ assert_equal expected.to_a, relation.to_a
65
76
  end
66
77
 
67
78
  def test_rewhere_with_multiple_overwriting_conditions
68
- relation = Post.where(title: 'hello').where(body: 'world').rewhere(title: 'alone', body: 'again')
69
- expected = Post.where(title: 'alone', body: 'again')
79
+ relation = Post.where(body: "hello").where(type: "StiPost").rewhere(body: "hullo", type: "Post")
80
+ expected = Post.where(body: "hullo", type: "Post")
70
81
 
71
- assert_equal expected.where_clause, relation.where_clause
82
+ assert_equal expected.to_a, relation.to_a
72
83
  end
73
84
 
74
85
  def test_rewhere_with_one_overwriting_condition_and_one_unrelated
75
- relation = Post.where(title: 'hello').where(body: 'world').rewhere(title: 'alone')
76
- expected = Post.where(body: 'world', title: 'alone')
86
+ relation = Post.where(body: "hello").where(type: "Post").rewhere(body: "hullo")
87
+ expected = Post.where(body: "hullo", type: "Post")
88
+
89
+ assert_equal expected.to_a, relation.to_a
90
+ end
91
+
92
+ def test_rewhere_with_alias_condition
93
+ relation = Post.where(text: "hello").where(text: "world").rewhere(text: "hullo")
94
+ expected = Post.where(text: "hullo")
95
+
96
+ assert_equal expected.to_a, relation.to_a
97
+ end
98
+
99
+ def test_rewhere_with_nested_condition
100
+ relation = Post.where.missing(:comments).rewhere("comments.id": comments(:does_it_hurt))
101
+ expected = Post.left_joins(:comments).where("comments.id": comments(:does_it_hurt))
102
+
103
+ assert_equal expected.to_a, relation.to_a
104
+ end
105
+
106
+ def test_rewhere_with_polymorphic_association
107
+ relation = Essay.where(writer: authors(:david)).rewhere(writer: humans(:steve))
108
+ expected = Essay.where(writer: humans(:steve))
77
109
 
78
- assert_equal expected.where_clause, relation.where_clause
110
+ assert_equal expected.to_a, relation.to_a
79
111
  end
80
112
 
81
113
  def test_rewhere_with_range
82
114
  relation = Post.where(comments_count: 1..3).rewhere(comments_count: 3..5)
115
+ expected = Post.where(comments_count: 3..5)
83
116
 
84
- assert_equal Post.where(comments_count: 3..5), relation
117
+ assert_equal expected.to_a, relation.to_a
85
118
  end
86
119
 
87
120
  def test_rewhere_with_infinite_upper_bound_range
88
121
  relation = Post.where(comments_count: 1..Float::INFINITY).rewhere(comments_count: 3..5)
122
+ expected = Post.where(comments_count: 3..5)
89
123
 
90
- assert_equal Post.where(comments_count: 3..5), relation
124
+ assert_equal expected.to_a, relation.to_a
91
125
  end
92
126
 
93
127
  def test_rewhere_with_infinite_lower_bound_range
94
128
  relation = Post.where(comments_count: -Float::INFINITY..1).rewhere(comments_count: 3..5)
129
+ expected = Post.where(comments_count: 3..5)
95
130
 
96
- assert_equal Post.where(comments_count: 3..5), relation
131
+ assert_equal expected.to_a, relation.to_a
97
132
  end
98
133
 
99
134
  def test_rewhere_with_infinite_range
100
135
  relation = Post.where(comments_count: -Float::INFINITY..Float::INFINITY).rewhere(comments_count: 3..5)
136
+ expected = Post.where(comments_count: 3..5)
101
137
 
102
- assert_equal Post.where(comments_count: 3..5), relation
138
+ assert_equal expected.to_a, relation.to_a
103
139
  end
104
140
  end
105
141
  end