ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,6 +1,9 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/subscriber'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/comment"
5
+ require "models/post"
6
+ require "models/subscriber"
4
7
 
5
8
  class EachTest < ActiveRecord::TestCase
6
9
  fixtures :posts, :subscribers
@@ -8,12 +11,12 @@ class EachTest < ActiveRecord::TestCase
8
11
  def setup
9
12
  @posts = Post.order("id asc")
10
13
  @total = Post.count
11
- Post.count('id') # preheat arel's table cache
14
+ Post.count("id") # preheat arel's table cache
12
15
  end
13
16
 
14
17
  def test_each_should_execute_one_query_per_batch
15
18
  assert_queries(@total + 1) do
16
- Post.find_each(:batch_size => 1) do |post|
19
+ Post.find_each(batch_size: 1) do |post|
17
20
  assert_kind_of Post, post
18
21
  end
19
22
  end
@@ -21,31 +24,29 @@ class EachTest < ActiveRecord::TestCase
21
24
 
22
25
  def test_each_should_not_return_query_chain_and_execute_only_one_query
23
26
  assert_queries(1) do
24
- result = Post.find_each(:batch_size => 100000){ }
27
+ result = Post.find_each(batch_size: 100000) { }
25
28
  assert_nil result
26
29
  end
27
30
  end
28
31
 
29
32
  def test_each_should_return_an_enumerator_if_no_block_is_present
30
33
  assert_queries(1) do
31
- Post.find_each(:batch_size => 100000).with_index do |post, index|
34
+ Post.find_each(batch_size: 100000).with_index do |post, index|
32
35
  assert_kind_of Post, post
33
36
  assert_kind_of Integer, index
34
37
  end
35
38
  end
36
39
  end
37
40
 
38
- if Enumerator.method_defined? :size
39
- def test_each_should_return_a_sized_enumerator
40
- assert_equal 11, Post.find_each(batch_size: 1).size
41
- assert_equal 5, Post.find_each(batch_size: 2, start: 7).size
42
- assert_equal 11, Post.find_each(batch_size: 10_000).size
43
- end
41
+ def test_each_should_return_a_sized_enumerator
42
+ assert_equal 11, Post.find_each(batch_size: 1).size
43
+ assert_equal 5, Post.find_each(batch_size: 2, start: 7).size
44
+ assert_equal 11, Post.find_each(batch_size: 10_000).size
44
45
  end
45
46
 
46
47
  def test_each_enumerator_should_execute_one_query_per_batch
47
48
  assert_queries(@total + 1) do
48
- Post.find_each(:batch_size => 1).with_index do |post, index|
49
+ Post.find_each(batch_size: 1).with_index do |post, index|
49
50
  assert_kind_of Post, post
50
51
  assert_kind_of Integer, index
51
52
  end
@@ -62,16 +63,32 @@ class EachTest < ActiveRecord::TestCase
62
63
 
63
64
  def test_each_should_execute_if_id_is_in_select
64
65
  assert_queries(6) do
65
- Post.select("id, title, type").find_each(:batch_size => 2) do |post|
66
+ Post.select("id, title, type").find_each(batch_size: 2) do |post|
66
67
  assert_kind_of Post, post
67
68
  end
68
69
  end
69
70
  end
70
71
 
71
- def test_warn_if_limit_scope_is_set
72
- assert_called(ActiveRecord::Base.logger, :warn) do
73
- Post.limit(1).find_each { |post| post }
72
+ test "find_each should honor limit if passed a block" do
73
+ limit = @total - 1
74
+ total = 0
75
+
76
+ Post.limit(limit).find_each do |post|
77
+ total += 1
74
78
  end
79
+
80
+ assert_equal limit, total
81
+ end
82
+
83
+ test "find_each should honor limit if no block is passed" do
84
+ limit = @total - 1
85
+ total = 0
86
+
87
+ Post.limit(limit).find_each.each do |post|
88
+ total += 1
89
+ end
90
+
91
+ assert_equal limit, total
75
92
  end
76
93
 
77
94
  def test_warn_if_order_scope_is_set
@@ -84,7 +101,7 @@ class EachTest < ActiveRecord::TestCase
84
101
  previous_logger = ActiveRecord::Base.logger
85
102
  ActiveRecord::Base.logger = nil
86
103
  assert_nothing_raised do
87
- Post.limit(1).find_each { |post| post }
104
+ Post.order("comments_count DESC").find_each { |post| post }
88
105
  end
89
106
  ensure
90
107
  ActiveRecord::Base.logger = previous_logger
@@ -92,7 +109,7 @@ class EachTest < ActiveRecord::TestCase
92
109
 
93
110
  def test_find_in_batches_should_return_batches
94
111
  assert_queries(@total + 1) do
95
- Post.find_in_batches(:batch_size => 1) do |batch|
112
+ Post.find_in_batches(batch_size: 1) do |batch|
96
113
  assert_kind_of Array, batch
97
114
  assert_kind_of Post, batch.first
98
115
  end
@@ -119,30 +136,48 @@ class EachTest < ActiveRecord::TestCase
119
136
 
120
137
  def test_find_in_batches_shouldnt_execute_query_unless_needed
121
138
  assert_queries(2) do
122
- Post.find_in_batches(:batch_size => @total) {|batch| assert_kind_of Array, batch }
139
+ Post.find_in_batches(batch_size: @total) { |batch| assert_kind_of Array, batch }
123
140
  end
124
141
 
125
142
  assert_queries(1) do
126
- Post.find_in_batches(:batch_size => @total + 1) {|batch| assert_kind_of Array, batch }
143
+ Post.find_in_batches(batch_size: @total + 1) { |batch| assert_kind_of Array, batch }
127
144
  end
128
145
  end
129
146
 
130
147
  def test_find_in_batches_should_quote_batch_order
131
148
  c = Post.connection
132
- assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
133
- Post.find_in_batches(:batch_size => 1) do |batch|
149
+ assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))}/i) do
150
+ Post.find_in_batches(batch_size: 1) do |batch|
134
151
  assert_kind_of Array, batch
135
152
  assert_kind_of Post, batch.first
136
153
  end
137
154
  end
138
155
  end
139
156
 
157
+ def test_find_in_batches_should_quote_batch_order_with_desc_order
158
+ c = Post.connection
159
+ assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))} DESC/) do
160
+ Post.find_in_batches(batch_size: 1, order: :desc) do |batch|
161
+ assert_kind_of Array, batch
162
+ assert_kind_of Post, batch.first
163
+ end
164
+ end
165
+ end
166
+
167
+ def test_each_should_raise_if_order_is_invalid
168
+ assert_raise(ArgumentError) do
169
+ Post.select(:title).find_each(batch_size: 1, order: :invalid) { |post|
170
+ flunk "should not call this block"
171
+ }
172
+ end
173
+ end
174
+
140
175
  def test_find_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
141
- not_a_post = "not a post"
176
+ not_a_post = +"not a post"
142
177
  def not_a_post.id; end
143
- not_a_post.stub(:id, ->{ raise StandardError.new("not_a_post had #id called on it") }) do
178
+ not_a_post.stub(:id, -> { raise StandardError.new("not_a_post had #id called on it") }) do
144
179
  assert_nothing_raised do
145
- Post.find_in_batches(:batch_size => 1) do |batch|
180
+ Post.find_in_batches(batch_size: 1) do |batch|
146
181
  assert_kind_of Array, batch
147
182
  assert_kind_of Post, batch.first
148
183
 
@@ -166,57 +201,51 @@ class EachTest < ActiveRecord::TestCase
166
201
 
167
202
  def test_find_in_batches_should_error_on_ignore_the_order
168
203
  assert_raise(ArgumentError) do
169
- PostWithDefaultScope.find_in_batches(error_on_ignore: true){}
204
+ PostWithDefaultScope.find_in_batches(error_on_ignore: true) { }
170
205
  end
171
206
  end
172
207
 
173
- def test_find_in_batches_should_not_error_if_config_overriden
174
- # Set the config option which will be overriden
175
- prev = ActiveRecord::Base.error_on_ignored_order_or_limit
176
- ActiveRecord::Base.error_on_ignored_order_or_limit = true
208
+ def test_find_in_batches_should_not_error_if_config_overridden
209
+ # Set the config option which will be overridden
210
+ prev = ActiveRecord::Base.error_on_ignored_order
211
+ ActiveRecord::Base.error_on_ignored_order = true
177
212
  assert_nothing_raised do
178
- PostWithDefaultScope.find_in_batches(error_on_ignore: false){}
213
+ PostWithDefaultScope.find_in_batches(error_on_ignore: false) { }
179
214
  end
180
215
  ensure
181
216
  # Set back to default
182
- ActiveRecord::Base.error_on_ignored_order_or_limit = prev
217
+ ActiveRecord::Base.error_on_ignored_order = prev
183
218
  end
184
219
 
185
220
  def test_find_in_batches_should_error_on_config_specified_to_error
186
221
  # Set the config option
187
- prev = ActiveRecord::Base.error_on_ignored_order_or_limit
188
- ActiveRecord::Base.error_on_ignored_order_or_limit = true
222
+ prev = ActiveRecord::Base.error_on_ignored_order
223
+ ActiveRecord::Base.error_on_ignored_order = true
189
224
  assert_raise(ArgumentError) do
190
- PostWithDefaultScope.find_in_batches(){}
225
+ PostWithDefaultScope.find_in_batches() { }
191
226
  end
192
227
  ensure
193
228
  # Set back to default
194
- ActiveRecord::Base.error_on_ignored_order_or_limit = prev
229
+ ActiveRecord::Base.error_on_ignored_order = prev
195
230
  end
196
231
 
197
232
  def test_find_in_batches_should_not_error_by_default
198
233
  assert_nothing_raised do
199
- PostWithDefaultScope.find_in_batches(){}
234
+ PostWithDefaultScope.find_in_batches() { }
200
235
  end
201
236
  end
202
237
 
203
238
  def test_find_in_batches_should_not_ignore_the_default_scope_if_it_is_other_then_order
204
- special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
239
+ default_scope = SpecialPostWithDefaultScope.all
205
240
  posts = []
206
241
  SpecialPostWithDefaultScope.find_in_batches do |batch|
207
242
  posts.concat(batch)
208
243
  end
209
- assert_equal special_posts_ids, posts.map(&:id)
210
- end
211
-
212
- def test_find_in_batches_should_not_modify_passed_options
213
- assert_nothing_raised do
214
- Post.find_in_batches({ batch_size: 42, start: 1 }.freeze){}
215
- end
244
+ assert_equal default_scope.pluck(:id).sort, posts.map(&:id).sort
216
245
  end
217
246
 
218
247
  def test_find_in_batches_should_use_any_column_as_primary_key
219
- nick_order_subscribers = Subscriber.order('nick asc')
248
+ nick_order_subscribers = Subscriber.order("nick asc")
220
249
  start_nick = nick_order_subscribers.second.nick
221
250
 
222
251
  subscribers = []
@@ -239,7 +268,7 @@ class EachTest < ActiveRecord::TestCase
239
268
  def test_find_in_batches_should_return_an_enumerator
240
269
  enum = nil
241
270
  assert_no_queries do
242
- enum = Post.find_in_batches(:batch_size => 1)
271
+ enum = Post.find_in_batches(batch_size: 1)
243
272
  end
244
273
  assert_queries(4) do
245
274
  enum.first(4) do |batch|
@@ -249,6 +278,28 @@ class EachTest < ActiveRecord::TestCase
249
278
  end
250
279
  end
251
280
 
281
+ test "find_in_batches should honor limit if passed a block" do
282
+ limit = @total - 1
283
+ total = 0
284
+
285
+ Post.limit(limit).find_in_batches do |batch|
286
+ total += batch.size
287
+ end
288
+
289
+ assert_equal limit, total
290
+ end
291
+
292
+ test "find_in_batches should honor limit if no block is passed" do
293
+ limit = @total - 1
294
+ total = 0
295
+
296
+ Post.limit(limit).find_in_batches.each do |batch|
297
+ total += batch.size
298
+ end
299
+
300
+ assert_equal limit, total
301
+ end
302
+
252
303
  def test_in_batches_should_not_execute_any_query
253
304
  assert_no_queries do
254
305
  assert_kind_of ActiveRecord::Batches::BatchEnumerator, Post.in_batches(of: 2)
@@ -274,7 +325,7 @@ class EachTest < ActiveRecord::TestCase
274
325
  def test_in_batches_each_record_should_yield_record_if_block_is_given
275
326
  assert_queries(6) do
276
327
  Post.in_batches(of: 2).each_record do |post|
277
- assert post.title.present?
328
+ assert_predicate post.title, :present?
278
329
  assert_kind_of Post, post
279
330
  end
280
331
  end
@@ -283,14 +334,14 @@ class EachTest < ActiveRecord::TestCase
283
334
  def test_in_batches_each_record_should_return_enumerator_if_no_block_given
284
335
  assert_queries(6) do
285
336
  Post.in_batches(of: 2).each_record.with_index do |post, i|
286
- assert post.title.present?
337
+ assert_predicate post.title, :present?
287
338
  assert_kind_of Post, post
288
339
  end
289
340
  end
290
341
  end
291
342
 
292
343
  def test_in_batches_each_record_should_be_ordered_by_id
293
- ids = Post.order('id ASC').pluck(:id)
344
+ ids = Post.order("id ASC").pluck(:id)
294
345
  assert_queries(6) do
295
346
  Post.in_batches(of: 2).each_record.with_index do |post, i|
296
347
  assert_equal ids[i], post.id
@@ -305,33 +356,49 @@ class EachTest < ActiveRecord::TestCase
305
356
  assert_equal Post.all.pluck(:title), ["updated-title"] * Post.count
306
357
  end
307
358
 
359
+ def test_in_batches_update_all_returns_rows_affected
360
+ assert_equal 11, Post.in_batches(of: 2).update_all(title: "updated-title")
361
+ end
362
+
363
+ def test_in_batches_update_all_returns_zero_when_no_batches
364
+ assert_equal 0, Post.where("1=0").in_batches(of: 2).update_all(title: "updated-title")
365
+ end
366
+
308
367
  def test_in_batches_delete_all_should_not_delete_records_in_other_batches
309
- not_deleted_count = Post.where('id <= 2').count
310
- Post.where('id > 2').in_batches(of: 2).delete_all
311
- assert_equal 0, Post.where('id > 2').count
368
+ not_deleted_count = Post.where("id <= 2").count
369
+ Post.where("id > 2").in_batches(of: 2).delete_all
370
+ assert_equal 0, Post.where("id > 2").count
312
371
  assert_equal not_deleted_count, Post.count
313
372
  end
314
373
 
374
+ def test_in_batches_delete_all_returns_rows_affected
375
+ assert_equal 11, Post.in_batches(of: 2).delete_all
376
+ end
377
+
378
+ def test_in_batches_delete_all_returns_zero_when_no_batches
379
+ assert_equal 0, Post.where("1=0").in_batches(of: 2).delete_all
380
+ end
381
+
315
382
  def test_in_batches_should_not_be_loaded
316
383
  Post.in_batches(of: 1) do |relation|
317
- assert_not relation.loaded?
384
+ assert_not_predicate relation, :loaded?
318
385
  end
319
386
 
320
387
  Post.in_batches(of: 1, load: false) do |relation|
321
- assert_not relation.loaded?
388
+ assert_not_predicate relation, :loaded?
322
389
  end
323
390
  end
324
391
 
325
392
  def test_in_batches_should_be_loaded
326
393
  Post.in_batches(of: 1, load: true) do |relation|
327
- assert relation.loaded?
394
+ assert_predicate relation, :loaded?
328
395
  end
329
396
  end
330
397
 
331
398
  def test_in_batches_if_not_loaded_executes_more_queries
332
399
  assert_queries(@total + 1) do
333
400
  Post.in_batches(of: 1, load: false) do |relation|
334
- assert_not relation.loaded?
401
+ assert_not_predicate relation, :loaded?
335
402
  end
336
403
  end
337
404
  end
@@ -345,7 +412,7 @@ class EachTest < ActiveRecord::TestCase
345
412
  end
346
413
 
347
414
  def test_in_batches_should_start_from_the_start_option
348
- post = Post.order('id ASC').where('id >= ?', 2).first
415
+ post = Post.order("id ASC").where("id >= ?", 2).first
349
416
  assert_queries(2) do
350
417
  relation = Post.in_batches(of: 1, start: 2).first
351
418
  assert_equal post, relation.first
@@ -353,7 +420,7 @@ class EachTest < ActiveRecord::TestCase
353
420
  end
354
421
 
355
422
  def test_in_batches_should_end_at_the_finish_option
356
- post = Post.order('id DESC').where('id <= ?', 5).first
423
+ post = Post.order("id DESC").where("id <= ?", 5).first
357
424
  assert_queries(7) do
358
425
  relation = Post.in_batches(of: 1, finish: 5, load: true).reverse_each.first
359
426
  assert_equal post, relation.last
@@ -372,7 +439,7 @@ class EachTest < ActiveRecord::TestCase
372
439
 
373
440
  def test_in_batches_should_quote_batch_order
374
441
  c = Post.connection
375
- assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
442
+ assert_sql(/ORDER BY #{c.quote_table_name('posts')}\.#{c.quote_column_name('id')}/) do
376
443
  Post.in_batches(of: 1) do |relation|
377
444
  assert_kind_of ActiveRecord::Relation, relation
378
445
  assert_kind_of Post, relation.first
@@ -380,8 +447,18 @@ class EachTest < ActiveRecord::TestCase
380
447
  end
381
448
  end
382
449
 
450
+ def test_in_batches_should_quote_batch_order_with_desc_order
451
+ c = Post.connection
452
+ assert_sql(/ORDER BY #{Regexp.escape(c.quote_table_name("posts.id"))} DESC/) do
453
+ Post.in_batches(of: 1, order: :desc) do |relation|
454
+ assert_kind_of ActiveRecord::Relation, relation
455
+ assert_kind_of Post, relation.first
456
+ end
457
+ end
458
+ end
459
+
383
460
  def test_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
384
- not_a_post = "not a post"
461
+ not_a_post = +"not a post"
385
462
  def not_a_post.id
386
463
  raise StandardError.new("not_a_post had #id called on it")
387
464
  end
@@ -391,28 +468,22 @@ class EachTest < ActiveRecord::TestCase
391
468
  assert_kind_of ActiveRecord::Relation, relation
392
469
  assert_kind_of Post, relation.first
393
470
 
394
- relation = [not_a_post] * relation.count
471
+ [not_a_post] * relation.count
395
472
  end
396
473
  end
397
474
  end
398
475
 
399
476
  def test_in_batches_should_not_ignore_default_scope_without_order_statements
400
- special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
477
+ default_scope = SpecialPostWithDefaultScope.all
401
478
  posts = []
402
479
  SpecialPostWithDefaultScope.in_batches do |relation|
403
480
  posts.concat(relation)
404
481
  end
405
- assert_equal special_posts_ids, posts.map(&:id)
406
- end
407
-
408
- def test_in_batches_should_not_modify_passed_options
409
- assert_nothing_raised do
410
- Post.in_batches({ of: 42, start: 1 }.freeze){}
411
- end
482
+ assert_equal default_scope.pluck(:id).sort, posts.map(&:id).sort
412
483
  end
413
484
 
414
485
  def test_in_batches_should_use_any_column_as_primary_key
415
- nick_order_subscribers = Subscriber.order('nick asc')
486
+ nick_order_subscribers = Subscriber.order("nick asc")
416
487
  start_nick = nick_order_subscribers.second.nick
417
488
 
418
489
  subscribers = []
@@ -469,21 +540,156 @@ class EachTest < ActiveRecord::TestCase
469
540
  def test_in_batches_relations_update_all_should_not_affect_matching_records_in_other_batches
470
541
  Post.update_all(author_id: 0)
471
542
  person = Post.last
472
- person.update_attributes(author_id: 1)
543
+ person.update(author_id: 1)
473
544
 
474
545
  Post.in_batches(of: 2) do |batch|
475
- batch.where('author_id >= 1').update_all('author_id = author_id + 1')
546
+ batch.where("author_id >= 1").update_all("author_id = author_id + 1")
476
547
  end
477
548
  assert_equal 2, person.reload.author_id # incremented only once
478
549
  end
479
550
 
480
- if Enumerator.method_defined? :size
481
- def test_find_in_batches_should_return_a_sized_enumerator
482
- assert_equal 11, Post.find_in_batches(:batch_size => 1).size
483
- assert_equal 6, Post.find_in_batches(:batch_size => 2).size
484
- assert_equal 4, Post.find_in_batches(batch_size: 2, start: 4).size
485
- assert_equal 4, Post.find_in_batches(:batch_size => 3).size
486
- assert_equal 1, Post.find_in_batches(:batch_size => 10_000).size
551
+ def test_find_in_batches_should_return_a_sized_enumerator
552
+ assert_equal 11, Post.find_in_batches(batch_size: 1).size
553
+ assert_equal 6, Post.find_in_batches(batch_size: 2).size
554
+ assert_equal 4, Post.find_in_batches(batch_size: 2, start: 4).size
555
+ assert_equal 4, Post.find_in_batches(batch_size: 3).size
556
+ assert_equal 1, Post.find_in_batches(batch_size: 10_000).size
557
+ end
558
+
559
+ [true, false].each do |load|
560
+ test "in_batches should return limit records when limit is less than batch size and load is #{load}" do
561
+ limit = 3
562
+ batch_size = 5
563
+ total = 0
564
+
565
+ Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
566
+ total += batch.count
567
+ end
568
+
569
+ assert_equal limit, total
570
+ end
571
+
572
+ test "in_batches should return limit records when limit is greater than batch size and load is #{load}" do
573
+ limit = 5
574
+ batch_size = 3
575
+ total = 0
576
+
577
+ Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
578
+ total += batch.count
579
+ end
580
+
581
+ assert_equal limit, total
582
+ end
583
+
584
+ test "in_batches should return limit records when limit is a multiple of the batch size and load is #{load}" do
585
+ limit = 6
586
+ batch_size = 3
587
+ total = 0
588
+
589
+ Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
590
+ total += batch.count
591
+ end
592
+
593
+ assert_equal limit, total
594
+ end
595
+
596
+ test "in_batches should return no records if the limit is 0 and load is #{load}" do
597
+ limit = 0
598
+ batch_size = 1
599
+ total = 0
600
+
601
+ Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
602
+ total += batch.count
603
+ end
604
+
605
+ assert_equal limit, total
606
+ end
607
+
608
+ test "in_batches should return all if the limit is greater than the number of records when load is #{load}" do
609
+ limit = @total + 1
610
+ batch_size = 1
611
+ total = 0
612
+
613
+ Post.limit(limit).in_batches(of: batch_size, load: load) do |batch|
614
+ total += batch.count
615
+ end
616
+
617
+ assert_equal @total, total
618
+ end
619
+ end
620
+
621
+ test ".find_each respects table alias" do
622
+ assert_queries(1) do
623
+ table_alias = Post.arel_table.alias("omg_posts")
624
+ table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
625
+ predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
626
+
627
+ posts = ActiveRecord::Relation.create(
628
+ Post,
629
+ table: table_alias,
630
+ predicate_builder: predicate_builder
631
+ )
632
+ posts.find_each { }
633
+ end
634
+ end
635
+
636
+ test ".find_each bypasses the query cache for its own queries" do
637
+ Post.cache do
638
+ assert_queries(2) do
639
+ Post.find_each { }
640
+ Post.find_each { }
641
+ end
642
+ end
643
+ end
644
+
645
+ test ".find_each does not disable the query cache inside the given block" do
646
+ Post.cache do
647
+ Post.find_each(start: 1, finish: 1) do |post|
648
+ assert_queries(1) do
649
+ post.comments.count
650
+ post.comments.count
651
+ end
652
+ end
653
+ end
654
+ end
655
+
656
+ test ".find_in_batches bypasses the query cache for its own queries" do
657
+ Post.cache do
658
+ assert_queries(2) do
659
+ Post.find_in_batches { }
660
+ Post.find_in_batches { }
661
+ end
662
+ end
663
+ end
664
+
665
+ test ".find_in_batches does not disable the query cache inside the given block" do
666
+ Post.cache do
667
+ Post.find_in_batches(start: 1, finish: 1) do |batch|
668
+ assert_queries(1) do
669
+ batch.first.comments.count
670
+ batch.first.comments.count
671
+ end
672
+ end
673
+ end
674
+ end
675
+
676
+ test ".in_batches bypasses the query cache for its own queries" do
677
+ Post.cache do
678
+ assert_queries(2) do
679
+ Post.in_batches { }
680
+ Post.in_batches { }
681
+ end
682
+ end
683
+ end
684
+
685
+ test ".in_batches does not disable the query cache inside the given block" do
686
+ Post.cache do
687
+ Post.in_batches(start: 1, finish: 1) do |relation|
688
+ assert_queries(1) do
689
+ relation.count
690
+ relation.count
691
+ end
692
+ end
487
693
  end
488
694
  end
489
695
  end
@@ -1,44 +1,39 @@
1
- require "cases/helper"
2
-
3
- # Without using prepared statements, it makes no sense to test
4
- # BLOB data with DB2, because the length of a statement
5
- # is limited to 32KB.
6
- unless current_adapter?(:DB2Adapter)
7
- require 'models/binary'
1
+ # frozen_string_literal: true
8
2
 
9
- class BinaryTest < ActiveRecord::TestCase
10
- FIXTURES = %w(flowers.jpg example.log test.txt)
3
+ require "cases/helper"
4
+ require "models/binary"
11
5
 
12
- def test_mixed_encoding
13
- str = "\x80"
14
- str.force_encoding('ASCII-8BIT')
6
+ class BinaryTest < ActiveRecord::TestCase
7
+ FIXTURES = %w(flowers.jpg example.log test.txt)
15
8
 
16
- binary = Binary.new :name => 'いただきます!', :data => str
17
- binary.save!
18
- binary.reload
19
- assert_equal str, binary.data
9
+ def test_mixed_encoding
10
+ str = +"\x80"
11
+ str.force_encoding("ASCII-8BIT")
20
12
 
21
- name = binary.name
13
+ binary = Binary.new name: "いただきます!", data: str
14
+ binary.save!
15
+ binary.reload
16
+ assert_equal str, binary.data
22
17
 
23
- assert_equal 'いただきます!', name
24
- end
18
+ name = binary.name
19
+ assert_equal "いただきます!", name
20
+ end
25
21
 
26
- def test_load_save
27
- Binary.delete_all
22
+ def test_load_save
23
+ Binary.delete_all
28
24
 
29
- FIXTURES.each do |filename|
30
- data = File.read(ASSETS_ROOT + "/#{filename}")
31
- data.force_encoding('ASCII-8BIT')
32
- data.freeze
25
+ FIXTURES.each do |filename|
26
+ data = File.read(ASSETS_ROOT + "/#{filename}")
27
+ data.force_encoding("ASCII-8BIT")
28
+ data.freeze
33
29
 
34
- bin = Binary.new(:data => data)
35
- assert_equal data, bin.data, 'Newly assigned data differs from original'
30
+ bin = Binary.new(data: data)
31
+ assert_equal data, bin.data, "Newly assigned data differs from original"
36
32
 
37
- bin.save!
38
- assert_equal data, bin.data, 'Data differs from original after save'
33
+ bin.save!
34
+ assert_equal data, bin.data, "Data differs from original after save"
39
35
 
40
- assert_equal data, bin.reload.data, 'Reloaded data differs from original'
41
- end
36
+ assert_equal data, bin.reload.data, "Reloaded data differs from original"
42
37
  end
43
38
  end
44
39
  end