ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/migration/helper"
2
4
 
3
5
  module ActiveRecord
@@ -17,28 +19,44 @@ module ActiveRecord
17
19
 
18
20
  def test_references_column_type_adds_id
19
21
  with_change_table do |t|
20
- @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
22
+ if RUBY_VERSION < "2.7"
23
+ @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
24
+ else
25
+ @connection.expect :add_reference, nil, [:delete_me, :customer]
26
+ end
21
27
  t.references :customer
22
28
  end
23
29
  end
24
30
 
25
31
  def test_remove_references_column_type_removes_id
26
32
  with_change_table do |t|
27
- @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
33
+ if RUBY_VERSION < "2.7"
34
+ @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
35
+ else
36
+ @connection.expect :remove_reference, nil, [:delete_me, :customer]
37
+ end
28
38
  t.remove_references :customer
29
39
  end
30
40
  end
31
41
 
32
42
  def test_add_belongs_to_works_like_add_references
33
43
  with_change_table do |t|
34
- @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
44
+ if RUBY_VERSION < "2.7"
45
+ @connection.expect :add_reference, nil, [:delete_me, :customer, {}]
46
+ else
47
+ @connection.expect :add_reference, nil, [:delete_me, :customer]
48
+ end
35
49
  t.belongs_to :customer
36
50
  end
37
51
  end
38
52
 
39
53
  def test_remove_belongs_to_works_like_remove_references
40
54
  with_change_table do |t|
41
- @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
55
+ if RUBY_VERSION < "2.7"
56
+ @connection.expect :remove_reference, nil, [:delete_me, :customer, {}]
57
+ else
58
+ @connection.expect :remove_reference, nil, [:delete_me, :customer]
59
+ end
42
60
  t.remove_belongs_to :customer
43
61
  end
44
62
  end
@@ -95,7 +113,7 @@ module ActiveRecord
95
113
  def test_remove_timestamps_creates_updated_at_and_created_at
96
114
  with_change_table do |t|
97
115
  @connection.expect :remove_timestamps, nil, [:delete_me, { null: true }]
98
- t.remove_timestamps({ null: true })
116
+ t.remove_timestamps(null: true)
99
117
  end
100
118
  end
101
119
 
@@ -108,24 +126,39 @@ module ActiveRecord
108
126
 
109
127
  def test_integer_creates_integer_column
110
128
  with_change_table do |t|
111
- @connection.expect :add_column, nil, [:delete_me, :foo, :integer, {}]
112
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
129
+ if RUBY_VERSION < "2.7"
130
+ @connection.expect :add_column, nil, [:delete_me, :foo, :integer, {}]
131
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
132
+ else
133
+ @connection.expect :add_column, nil, [:delete_me, :foo, :integer]
134
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
135
+ end
113
136
  t.integer :foo, :bar
114
137
  end
115
138
  end
116
139
 
117
140
  def test_bigint_creates_bigint_column
118
141
  with_change_table do |t|
119
- @connection.expect :add_column, nil, [:delete_me, :foo, :bigint, {}]
120
- @connection.expect :add_column, nil, [:delete_me, :bar, :bigint, {}]
142
+ if RUBY_VERSION < "2.7"
143
+ @connection.expect :add_column, nil, [:delete_me, :foo, :bigint, {}]
144
+ @connection.expect :add_column, nil, [:delete_me, :bar, :bigint, {}]
145
+ else
146
+ @connection.expect :add_column, nil, [:delete_me, :foo, :bigint]
147
+ @connection.expect :add_column, nil, [:delete_me, :bar, :bigint]
148
+ end
121
149
  t.bigint :foo, :bar
122
150
  end
123
151
  end
124
152
 
125
153
  def test_string_creates_string_column
126
154
  with_change_table do |t|
127
- @connection.expect :add_column, nil, [:delete_me, :foo, :string, {}]
128
- @connection.expect :add_column, nil, [:delete_me, :bar, :string, {}]
155
+ if RUBY_VERSION < "2.7"
156
+ @connection.expect :add_column, nil, [:delete_me, :foo, :string, {}]
157
+ @connection.expect :add_column, nil, [:delete_me, :bar, :string, {}]
158
+ else
159
+ @connection.expect :add_column, nil, [:delete_me, :foo, :string]
160
+ @connection.expect :add_column, nil, [:delete_me, :bar, :string]
161
+ end
129
162
  t.string :foo, :bar
130
163
  end
131
164
  end
@@ -133,16 +166,26 @@ module ActiveRecord
133
166
  if current_adapter?(:PostgreSQLAdapter)
134
167
  def test_json_creates_json_column
135
168
  with_change_table do |t|
136
- @connection.expect :add_column, nil, [:delete_me, :foo, :json, {}]
137
- @connection.expect :add_column, nil, [:delete_me, :bar, :json, {}]
169
+ if RUBY_VERSION < "2.7"
170
+ @connection.expect :add_column, nil, [:delete_me, :foo, :json, {}]
171
+ @connection.expect :add_column, nil, [:delete_me, :bar, :json, {}]
172
+ else
173
+ @connection.expect :add_column, nil, [:delete_me, :foo, :json]
174
+ @connection.expect :add_column, nil, [:delete_me, :bar, :json]
175
+ end
138
176
  t.json :foo, :bar
139
177
  end
140
178
  end
141
179
 
142
180
  def test_xml_creates_xml_column
143
181
  with_change_table do |t|
144
- @connection.expect :add_column, nil, [:delete_me, :foo, :xml, {}]
145
- @connection.expect :add_column, nil, [:delete_me, :bar, :xml, {}]
182
+ if RUBY_VERSION < "2.7"
183
+ @connection.expect :add_column, nil, [:delete_me, :foo, :xml, {}]
184
+ @connection.expect :add_column, nil, [:delete_me, :bar, :xml, {}]
185
+ else
186
+ @connection.expect :add_column, nil, [:delete_me, :foo, :xml]
187
+ @connection.expect :add_column, nil, [:delete_me, :bar, :xml]
188
+ end
146
189
  t.xml :foo, :bar
147
190
  end
148
191
  end
@@ -150,29 +193,54 @@ module ActiveRecord
150
193
 
151
194
  def test_column_creates_column
152
195
  with_change_table do |t|
153
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
196
+ if RUBY_VERSION < "2.7"
197
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
198
+ else
199
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
200
+ end
154
201
  t.column :bar, :integer
155
202
  end
156
203
  end
157
204
 
158
205
  def test_column_creates_column_with_options
159
206
  with_change_table do |t|
160
- @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {:null => false}]
161
- t.column :bar, :integer, :null => false
207
+ if RUBY_VERSION < "2.7"
208
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer, { null: false }]
209
+ else
210
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer, { null: false }]
211
+ end
212
+ t.column :bar, :integer, null: false
213
+ end
214
+ end
215
+
216
+ def test_column_creates_column_with_index
217
+ with_change_table do |t|
218
+ if RUBY_VERSION < "2.7"
219
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer, {}]
220
+ @connection.expect :add_index, nil, [:delete_me, :bar, {}]
221
+ else
222
+ @connection.expect :add_column, nil, [:delete_me, :bar, :integer]
223
+ @connection.expect :add_index, nil, [:delete_me, :bar]
224
+ end
225
+ t.column :bar, :integer, index: true
162
226
  end
163
227
  end
164
228
 
165
229
  def test_index_creates_index
166
230
  with_change_table do |t|
167
- @connection.expect :add_index, nil, [:delete_me, :bar, {}]
231
+ if RUBY_VERSION < "2.7"
232
+ @connection.expect :add_index, nil, [:delete_me, :bar, {}]
233
+ else
234
+ @connection.expect :add_index, nil, [:delete_me, :bar]
235
+ end
168
236
  t.index :bar
169
237
  end
170
238
  end
171
239
 
172
240
  def test_index_creates_index_with_options
173
241
  with_change_table do |t|
174
- @connection.expect :add_index, nil, [:delete_me, :bar, {:unique => true}]
175
- t.index :bar, :unique => true
242
+ @connection.expect :add_index, nil, [:delete_me, :bar, { unique: true }]
243
+ t.index :bar, unique: true
176
244
  end
177
245
  end
178
246
 
@@ -185,8 +253,8 @@ module ActiveRecord
185
253
 
186
254
  def test_index_exists_with_options
187
255
  with_change_table do |t|
188
- @connection.expect :index_exists?, nil, [:delete_me, :bar, {:unique => true}]
189
- t.index_exists?(:bar, :unique => true)
256
+ @connection.expect :index_exists?, nil, [:delete_me, :bar, { unique: true }]
257
+ t.index_exists?(:bar, unique: true)
190
258
  end
191
259
  end
192
260
 
@@ -199,15 +267,19 @@ module ActiveRecord
199
267
 
200
268
  def test_change_changes_column
201
269
  with_change_table do |t|
202
- @connection.expect :change_column, nil, [:delete_me, :bar, :string, {}]
270
+ if RUBY_VERSION < "2.7"
271
+ @connection.expect :change_column, nil, [:delete_me, :bar, :string, {}]
272
+ else
273
+ @connection.expect :change_column, nil, [:delete_me, :bar, :string]
274
+ end
203
275
  t.change :bar, :string
204
276
  end
205
277
  end
206
278
 
207
279
  def test_change_changes_column_with_options
208
280
  with_change_table do |t|
209
- @connection.expect :change_column, nil, [:delete_me, :bar, :string, {:null => true}]
210
- t.change :bar, :string, :null => true
281
+ @connection.expect :change_column, nil, [:delete_me, :bar, :string, { null: true }]
282
+ t.change :bar, :string, null: true
211
283
  end
212
284
  end
213
285
 
@@ -218,24 +290,46 @@ module ActiveRecord
218
290
  end
219
291
  end
220
292
 
293
+ def test_change_null_changes_column
294
+ with_change_table do |t|
295
+ @connection.expect :change_column_null, nil, [:delete_me, :bar, true, nil]
296
+ t.change_null :bar, true
297
+ end
298
+ end
299
+
221
300
  def test_remove_drops_single_column
222
301
  with_change_table do |t|
223
- @connection.expect :remove_columns, nil, [:delete_me, :bar]
302
+ if RUBY_VERSION < "2.7"
303
+ @connection.expect :remove_columns, nil, [:delete_me, :bar, {}]
304
+ else
305
+ @connection.expect :remove_columns, nil, [:delete_me, :bar]
306
+ end
224
307
  t.remove :bar
225
308
  end
226
309
  end
227
310
 
228
311
  def test_remove_drops_multiple_columns
229
312
  with_change_table do |t|
230
- @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz]
313
+ if RUBY_VERSION < "2.7"
314
+ @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz, {}]
315
+ else
316
+ @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz]
317
+ end
231
318
  t.remove :bar, :baz
232
319
  end
233
320
  end
234
321
 
322
+ def test_remove_drops_multiple_columns_when_column_options_are_given
323
+ with_change_table do |t|
324
+ @connection.expect :remove_columns, nil, [:delete_me, :bar, :baz, type: :string, null: false]
325
+ t.remove :bar, :baz, type: :string, null: false
326
+ end
327
+ end
328
+
235
329
  def test_remove_index_removes_index_with_options
236
330
  with_change_table do |t|
237
- @connection.expect :remove_index, nil, [:delete_me, {:unique => true}]
238
- t.remove_index :unique => true
331
+ @connection.expect :remove_index, nil, [:delete_me, :bar, { unique: true }]
332
+ t.remove_index :bar, unique: true
239
333
  end
240
334
  end
241
335
 
@@ -251,6 +345,20 @@ module ActiveRecord
251
345
  assert_equal :delete_me, t.name
252
346
  end
253
347
  end
348
+
349
+ def test_check_constraint_creates_check_constraint
350
+ with_change_table do |t|
351
+ @connection.expect :add_check_constraint, nil, [:delete_me, "price > discounted_price", name: "price_check"]
352
+ t.check_constraint "price > discounted_price", name: "price_check"
353
+ end
354
+ end
355
+
356
+ def test_remove_check_constraint_removes_check_constraint
357
+ with_change_table do |t|
358
+ @connection.expect :remove_check_constraint, nil, [:delete_me, name: "price_check"]
359
+ t.remove_check_constraint name: "price_check"
360
+ end
361
+ end
254
362
  end
255
363
  end
256
364
  end
@@ -0,0 +1,162 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ if ActiveRecord::Base.connection.supports_check_constraints?
7
+ module ActiveRecord
8
+ class Migration
9
+ class CheckConstraintTest < ActiveRecord::TestCase
10
+ include SchemaDumpingHelper
11
+
12
+ class Trade < ActiveRecord::Base
13
+ end
14
+
15
+ setup do
16
+ @connection = ActiveRecord::Base.connection
17
+ @connection.create_table "trades", force: true do |t|
18
+ t.integer :price
19
+ t.integer :quantity
20
+ end
21
+ end
22
+
23
+ teardown do
24
+ @connection.drop_table "trades", if_exists: true rescue nil
25
+ end
26
+
27
+ def test_check_constraints
28
+ check_constraints = @connection.check_constraints("products")
29
+ assert_equal 1, check_constraints.size
30
+
31
+ constraint = check_constraints.first
32
+ assert_equal "products", constraint.table_name
33
+ assert_equal "products_price_check", constraint.name
34
+
35
+ if current_adapter?(:Mysql2Adapter)
36
+ assert_equal "`price` > `discounted_price`", constraint.expression
37
+ else
38
+ assert_equal "price > discounted_price", constraint.expression
39
+ end
40
+ end
41
+
42
+ def test_add_check_constraint
43
+ @connection.add_check_constraint :trades, "quantity > 0"
44
+
45
+ check_constraints = @connection.check_constraints("trades")
46
+ assert_equal 1, check_constraints.size
47
+
48
+ constraint = check_constraints.first
49
+ assert_equal "trades", constraint.table_name
50
+ assert_equal "chk_rails_2189e9f96c", constraint.name
51
+
52
+ if current_adapter?(:Mysql2Adapter)
53
+ assert_equal "`quantity` > 0", constraint.expression
54
+ else
55
+ assert_equal "quantity > 0", constraint.expression
56
+ end
57
+ end
58
+
59
+ def test_add_check_constraint_with_non_existent_table_raises
60
+ e = assert_raises(ActiveRecord::StatementInvalid) do
61
+ @connection.add_check_constraint :refunds, "quantity > 0", name: "quantity_check"
62
+ end
63
+ assert_match(/refunds/, e.message)
64
+ end
65
+
66
+ def test_added_check_constraint_ensures_valid_values
67
+ @connection.add_check_constraint :trades, "quantity > 0", name: "quantity_check"
68
+
69
+ assert_raises(ActiveRecord::StatementInvalid) do
70
+ Trade.create(quantity: -1)
71
+ end
72
+ end
73
+
74
+ if ActiveRecord::Base.connection.supports_validate_constraints?
75
+ def test_not_valid_check_constraint
76
+ Trade.create(quantity: -1)
77
+
78
+ @connection.add_check_constraint :trades, "quantity > 0", name: "quantity_check", validate: false
79
+
80
+ assert_raises(ActiveRecord::StatementInvalid) do
81
+ Trade.create(quantity: -1)
82
+ end
83
+ end
84
+
85
+ def test_validate_check_constraint_by_name
86
+ @connection.add_check_constraint :trades, "quantity > 0", name: "quantity_check", validate: false
87
+ assert_not_predicate @connection.check_constraints("trades").first, :validated?
88
+
89
+ @connection.validate_check_constraint :trades, name: "quantity_check"
90
+ assert_predicate @connection.check_constraints("trades").first, :validated?
91
+ end
92
+
93
+ def test_validate_non_existing_check_constraint_raises
94
+ assert_raises ArgumentError do
95
+ @connection.validate_check_constraint :trades, name: "quantity_check"
96
+ end
97
+ end
98
+ else
99
+ # Check constraint should still be created, but should not be invalid
100
+ def test_add_invalid_check_constraint
101
+ @connection.add_check_constraint :trades, "quantity > 0", name: "quantity_check", validate: false
102
+
103
+ check_constraints = @connection.check_constraints("trades")
104
+ assert_equal 1, check_constraints.size
105
+
106
+ cc = check_constraints.first
107
+ assert_predicate cc, :validated?
108
+ end
109
+ end
110
+
111
+ def test_remove_check_constraint
112
+ @connection.add_check_constraint :trades, "price > 0", name: "price_check"
113
+ @connection.add_check_constraint :trades, "quantity > 0", name: "quantity_check"
114
+
115
+ assert_equal 2, @connection.check_constraints("trades").size
116
+ @connection.remove_check_constraint :trades, name: "quantity_check"
117
+ assert_equal 1, @connection.check_constraints("trades").size
118
+
119
+ constraint = @connection.check_constraints("trades").first
120
+ assert_equal "trades", constraint.table_name
121
+ assert_equal "price_check", constraint.name
122
+
123
+ if current_adapter?(:Mysql2Adapter)
124
+ assert_equal "`price` > 0", constraint.expression
125
+ else
126
+ assert_equal "price > 0", constraint.expression
127
+ end
128
+ end
129
+
130
+ def test_remove_non_existing_check_constraint
131
+ assert_raises(ArgumentError) do
132
+ @connection.remove_check_constraint :trades, name: "nonexistent"
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ else
139
+ module ActiveRecord
140
+ class Migration
141
+ class NoForeignKeySupportTest < ActiveRecord::TestCase
142
+ setup do
143
+ @connection = ActiveRecord::Base.connection
144
+ end
145
+
146
+ def test_add_check_constraint_should_be_noop
147
+ @connection.add_check_constraint :products, "discounted_price > 0", name: "discounted_price_check"
148
+ end
149
+
150
+ def test_remove_check_constraint_should_be_noop
151
+ @connection.remove_check_constraint :products, name: "price_check"
152
+ end
153
+
154
+ def test_check_constraints_should_raise_not_implemented
155
+ assert_raises(NotImplementedError) do
156
+ @connection.check_constraints("products")
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/migration/helper"
2
4
 
3
5
  module ActiveRecord
@@ -9,7 +11,7 @@ module ActiveRecord
9
11
 
10
12
  def test_add_column_newline_default
11
13
  string = "foo\nbar"
12
- add_column 'test_models', 'command', :string, :default => string
14
+ add_column "test_models", "command", :string, default: string
13
15
  TestModel.reset_column_information
14
16
 
15
17
  assert_equal string, TestModel.new.command
@@ -18,10 +20,10 @@ module ActiveRecord
18
20
  def test_add_remove_single_field_using_string_arguments
19
21
  assert_no_column TestModel, :last_name
20
22
 
21
- add_column 'test_models', 'last_name', :string
23
+ add_column "test_models", "last_name", :string
22
24
  assert_column TestModel, :last_name
23
25
 
24
- remove_column 'test_models', 'last_name'
26
+ remove_column "test_models", "last_name"
25
27
  assert_no_column TestModel, :last_name
26
28
  end
27
29
 
@@ -43,11 +45,11 @@ module ActiveRecord
43
45
  assert_nil TestModel.columns_hash["description"].limit
44
46
  end
45
47
 
46
- if current_adapter?(:Mysql2Adapter)
48
+ if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
47
49
  def test_unabstracted_database_dependent_types
48
- add_column :test_models, :intelligence_quotient, :tinyint
50
+ add_column :test_models, :intelligence_quotient, :smallint
49
51
  TestModel.reset_column_information
50
- assert_match(/tinyint/, TestModel.columns_hash['intelligence_quotient'].sql_type)
52
+ assert_match(/smallint/, TestModel.columns_hash["intelligence_quotient"].sql_type)
51
53
  end
52
54
  end
53
55
 
@@ -56,15 +58,13 @@ module ActiveRecord
56
58
  # functionality. This allows us to more easily catch INSERT being broken,
57
59
  # but SELECT actually working fine.
58
60
  def test_native_decimal_insert_manual_vs_automatic
59
- correct_value = '0012345678901234567890.0123456789'.to_d
61
+ correct_value = "0012345678901234567890.0123456789".to_d
60
62
 
61
- connection.add_column "test_models", "wealth", :decimal, :precision => '30', :scale => '10'
63
+ connection.add_column "test_models", "wealth", :decimal, precision: "30", scale: "10"
62
64
 
63
65
  # Do a manual insertion
64
66
  if current_adapter?(:OracleAdapter)
65
67
  connection.execute "insert into test_models (id, wealth) values (people_seq.nextval, 12345678901234567890.0123456789)"
66
- elsif current_adapter?(:PostgreSQLAdapter)
67
- connection.execute "insert into test_models (wealth) values (12345678901234567890.0123456789)"
68
68
  else
69
69
  connection.execute "insert into test_models (wealth) values (12345678901234567890.0123456789)"
70
70
  end
@@ -74,15 +74,13 @@ module ActiveRecord
74
74
  assert_kind_of BigDecimal, row.wealth
75
75
 
76
76
  # If this assert fails, that means the SELECT is broken!
77
- unless current_adapter?(:SQLite3Adapter)
78
- assert_equal correct_value, row.wealth
79
- end
77
+ assert_equal correct_value, row.wealth
80
78
 
81
79
  # Reset to old state
82
80
  TestModel.delete_all
83
81
 
84
82
  # Now use the Rails insertion
85
- TestModel.create :wealth => BigDecimal.new("12345678901234567890.0123456789")
83
+ TestModel.create wealth: BigDecimal("12345678901234567890.0123456789")
86
84
 
87
85
  # SELECT
88
86
  row = TestModel.first
@@ -94,26 +92,40 @@ module ActiveRecord
94
92
  end
95
93
 
96
94
  def test_add_column_with_precision_and_scale
97
- connection.add_column 'test_models', 'wealth', :decimal, :precision => 9, :scale => 7
95
+ connection.add_column "test_models", "wealth", :decimal, precision: 9, scale: 7
98
96
 
99
- wealth_column = TestModel.columns_hash['wealth']
97
+ wealth_column = TestModel.columns_hash["wealth"]
100
98
  assert_equal 9, wealth_column.precision
101
99
  assert_equal 7, wealth_column.scale
102
100
  end
103
101
 
102
+ # Test SQLite3 adapter specifically for decimal types with precision and scale
103
+ # attributes, since these need to be maintained in schema but aren't actually
104
+ # used in SQLite3 itself
104
105
  if current_adapter?(:SQLite3Adapter)
106
+ def test_change_column_with_new_precision_and_scale
107
+ connection.add_column "test_models", "wealth", :decimal, precision: 9, scale: 7
108
+
109
+ connection.change_column "test_models", "wealth", :decimal, precision: 12, scale: 8
110
+ TestModel.reset_column_information
111
+
112
+ wealth_column = TestModel.columns_hash["wealth"]
113
+ assert_equal 12, wealth_column.precision
114
+ assert_equal 8, wealth_column.scale
115
+ end
116
+
105
117
  def test_change_column_preserve_other_column_precision_and_scale
106
- connection.add_column 'test_models', 'last_name', :string
107
- connection.add_column 'test_models', 'wealth', :decimal, :precision => 9, :scale => 7
118
+ connection.add_column "test_models", "last_name", :string
119
+ connection.add_column "test_models", "wealth", :decimal, precision: 9, scale: 7
108
120
 
109
- wealth_column = TestModel.columns_hash['wealth']
121
+ wealth_column = TestModel.columns_hash["wealth"]
110
122
  assert_equal 9, wealth_column.precision
111
123
  assert_equal 7, wealth_column.scale
112
124
 
113
- connection.change_column 'test_models', 'last_name', :string, :null => false
125
+ connection.change_column "test_models", "last_name", :string, null: false
114
126
  TestModel.reset_column_information
115
127
 
116
- wealth_column = TestModel.columns_hash['wealth']
128
+ wealth_column = TestModel.columns_hash["wealth"]
117
129
  assert_equal 9, wealth_column.precision
118
130
  assert_equal 7, wealth_column.scale
119
131
  end
@@ -126,28 +138,28 @@ module ActiveRecord
126
138
  add_column "test_models", "bio", :text
127
139
  add_column "test_models", "age", :integer
128
140
  add_column "test_models", "height", :float
129
- add_column "test_models", "wealth", :decimal, :precision => '30', :scale => '10'
141
+ add_column "test_models", "wealth", :decimal, precision: "30", scale: "10"
130
142
  add_column "test_models", "birthday", :datetime
131
143
  add_column "test_models", "favorite_day", :date
132
144
  add_column "test_models", "moment_of_truth", :datetime
133
145
  add_column "test_models", "male", :boolean
134
146
 
135
- TestModel.create :first_name => 'bob', :last_name => 'bobsen',
136
- :bio => "I was born ....", :age => 18, :height => 1.78,
137
- :wealth => BigDecimal.new("12345678901234567890.0123456789"),
138
- :birthday => 18.years.ago, :favorite_day => 10.days.ago,
139
- :moment_of_truth => "1782-10-10 21:40:18", :male => true
147
+ TestModel.create first_name: "bob", last_name: "bobsen",
148
+ bio: "I was born ....", age: 18, height: 1.78,
149
+ wealth: BigDecimal("12345678901234567890.0123456789"),
150
+ birthday: 18.years.ago, favorite_day: 10.days.ago,
151
+ moment_of_truth: "1782-10-10 21:40:18", male: true
140
152
 
141
153
  bob = TestModel.first
142
- assert_equal 'bob', bob.first_name
143
- assert_equal 'bobsen', bob.last_name
154
+ assert_equal "bob", bob.first_name
155
+ assert_equal "bobsen", bob.last_name
144
156
  assert_equal "I was born ....", bob.bio
145
157
  assert_equal 18, bob.age
146
158
 
147
159
  # Test for 30 significant digits (beyond the 16 of float), 10 of them
148
160
  # after the decimal place.
149
161
 
150
- assert_equal BigDecimal.new("0012345678901234567890.0123456789"), bob.wealth
162
+ assert_equal BigDecimal("0012345678901234567890.0123456789"), bob.wealth
151
163
 
152
164
  assert_equal true, bob.male?
153
165
 
@@ -164,11 +176,9 @@ module ActiveRecord
164
176
 
165
177
  if current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter)
166
178
  def test_out_of_range_limit_should_raise
167
- assert_raise(ActiveRecordError) { add_column :test_models, :integer_too_big, :integer, :limit => 10 }
168
-
169
- unless current_adapter?(:PostgreSQLAdapter)
170
- assert_raise(ActiveRecordError) { add_column :test_models, :text_too_big, :integer, :limit => 0xfffffffff }
171
- end
179
+ assert_raise(ArgumentError) { add_column :test_models, :integer_too_big, :integer, limit: 10 }
180
+ assert_raise(ArgumentError) { add_column :test_models, :text_too_big, :text, limit: 0xfffffffff }
181
+ assert_raise(ArgumentError) { add_column :test_models, :binary_too_big, :binary, limit: 0xfffffffff }
172
182
  end
173
183
  end
174
184
  end