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,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  module PostgresqlUUIDHelper
5
7
  def connection
@@ -9,6 +11,14 @@ module PostgresqlUUIDHelper
9
11
  def drop_table(name)
10
12
  connection.drop_table name, if_exists: true
11
13
  end
14
+
15
+ def uuid_function
16
+ connection.supports_pgcrypto_uuid? ? "gen_random_uuid()" : "uuid_generate_v4()"
17
+ end
18
+
19
+ def uuid_default
20
+ connection.supports_pgcrypto_uuid? ? {} : { default: uuid_function }
21
+ end
12
22
  end
13
23
 
14
24
  class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
@@ -20,10 +30,11 @@ class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
20
30
  end
21
31
 
22
32
  setup do
23
- enable_extension!('uuid-ossp', connection)
33
+ enable_extension!("uuid-ossp", connection)
34
+ enable_extension!("pgcrypto", connection) if connection.supports_pgcrypto_uuid?
24
35
 
25
36
  connection.create_table "uuid_data_type" do |t|
26
- t.uuid 'guid'
37
+ t.uuid "guid"
27
38
  end
28
39
  end
29
40
 
@@ -31,72 +42,130 @@ class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
31
42
  drop_table "uuid_data_type"
32
43
  end
33
44
 
45
+ if ActiveRecord::Base.connection.respond_to?(:supports_pgcrypto_uuid?) &&
46
+ ActiveRecord::Base.connection.supports_pgcrypto_uuid?
47
+ def test_uuid_column_default
48
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "gen_random_uuid()"
49
+ UUIDType.reset_column_information
50
+ column = UUIDType.columns_hash["thingy"]
51
+ assert_equal "gen_random_uuid()", column.default_function
52
+ end
53
+ end
54
+
34
55
  def test_change_column_default
35
- @connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v1()"
56
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v1()"
36
57
  UUIDType.reset_column_information
37
- column = UUIDType.columns_hash['thingy']
58
+ column = UUIDType.columns_hash["thingy"]
38
59
  assert_equal "uuid_generate_v1()", column.default_function
39
60
 
40
- @connection.change_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v4()"
41
-
61
+ connection.change_column :uuid_data_type, :thingy, :uuid, null: false, default: "uuid_generate_v4()"
42
62
  UUIDType.reset_column_information
43
- column = UUIDType.columns_hash['thingy']
63
+ column = UUIDType.columns_hash["thingy"]
44
64
  assert_equal "uuid_generate_v4()", column.default_function
45
65
  ensure
46
66
  UUIDType.reset_column_information
47
67
  end
48
68
 
69
+ def test_add_column_with_null_true_and_default_nil
70
+ connection.add_column :uuid_data_type, :thingy, :uuid, null: true, default: nil
71
+
72
+ UUIDType.reset_column_information
73
+ column = UUIDType.columns_hash["thingy"]
74
+
75
+ assert column.null
76
+ assert_nil column.default
77
+ end
78
+
79
+ def test_add_column_with_default_array
80
+ connection.add_column :uuid_data_type, :thingy, :uuid, array: true, default: []
81
+
82
+ UUIDType.reset_column_information
83
+ column = UUIDType.columns_hash["thingy"]
84
+
85
+ assert_predicate column, :array?
86
+ assert_equal "{}", column.default
87
+
88
+ schema = dump_table_schema "uuid_data_type"
89
+ assert_match %r{t\.uuid "thingy", default: \[\], array: true$}, schema
90
+ end
91
+
49
92
  def test_data_type_of_uuid_types
50
93
  column = UUIDType.columns_hash["guid"]
51
94
  assert_equal :uuid, column.type
52
95
  assert_equal "uuid", column.sql_type
53
- assert_not column.array?
96
+ assert_not_predicate column, :array?
54
97
 
55
98
  type = UUIDType.type_for_attribute("guid")
56
- assert_not type.binary?
99
+ assert_not_predicate type, :binary?
57
100
  end
58
101
 
59
102
  def test_treat_blank_uuid_as_nil
60
- UUIDType.create! guid: ''
61
- assert_equal(nil, UUIDType.last.guid)
103
+ UUIDType.create! guid: ""
104
+ assert_nil(UUIDType.last.guid)
62
105
  end
63
106
 
64
107
  def test_treat_invalid_uuid_as_nil
65
- uuid = UUIDType.create! guid: 'foobar'
66
- assert_equal(nil, uuid.guid)
108
+ uuid = UUIDType.create! guid: "foobar"
109
+ assert_nil(uuid.guid)
67
110
  end
68
111
 
69
112
  def test_invalid_uuid_dont_modify_before_type_cast
70
- uuid = UUIDType.new guid: 'foobar'
71
- assert_equal 'foobar', uuid.guid_before_type_cast
113
+ uuid = UUIDType.new guid: "foobar"
114
+ assert_equal "foobar", uuid.guid_before_type_cast
115
+ end
116
+
117
+ def test_invalid_uuid_dont_match_to_nil
118
+ UUIDType.create!
119
+ assert_empty UUIDType.where(guid: "")
120
+ assert_empty UUIDType.where(guid: "foobar")
121
+ end
122
+
123
+ def test_uuid_change_case_does_not_mark_dirty
124
+ model = UUIDType.create!(guid: "abcd-0123-4567-89ef-dead-beef-0101-1010")
125
+ model.guid = model.guid.swapcase
126
+ assert_not_predicate model, :changed?
127
+ end
128
+
129
+ class DuckUUID
130
+ def initialize(uuid)
131
+ @uuid = uuid
132
+ end
133
+
134
+ def to_s
135
+ @uuid
136
+ end
72
137
  end
73
138
 
74
139
  def test_acceptable_uuid_regex
75
140
  # Valid uuids
76
- ['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11',
77
- '{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}',
78
- 'a0eebc999c0b4ef8bb6d6bb9bd380a11',
79
- 'a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11',
80
- '{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}',
141
+ ["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11",
142
+ "{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}",
143
+ "a0eebc999c0b4ef8bb6d6bb9bd380a11",
144
+ "a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11",
145
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}",
81
146
  # The following is not a valid RFC 4122 UUID, but PG doesn't seem to care,
82
147
  # so we shouldn't block it either. (Pay attention to "fb6d" – the "f" here
83
148
  # is invalid – it must be one of 8, 9, A, B, a, b according to the spec.)
84
- '{a0eebc99-9c0b-4ef8-fb6d-6bb9bd380a11}',
149
+ "{a0eebc99-9c0b-4ef8-fb6d-6bb9bd380a11}",
150
+ # Support Object-Oriented UUIDs which respond to #to_s
151
+ DuckUUID.new("A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11"),
85
152
  ].each do |valid_uuid|
86
153
  uuid = UUIDType.new guid: valid_uuid
87
- assert_not_nil uuid.guid
154
+ assert_instance_of String, uuid.guid
88
155
  end
89
156
 
90
157
  # Invalid uuids
91
- [['A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11'],
158
+ [["A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11"],
92
159
  Hash.new,
93
160
  0,
94
161
  0.0,
95
162
  true,
96
- 'Z0000C99-9C0B-4EF8-BB6D-6BB9BD380A11',
97
- 'a0eebc999r0b4ef8ab6d6bb9bd380a11',
98
- 'a0ee-bc99------4ef8-bb6d-6bb9-bd38-0a11',
99
- '{a0eebc99-bb6d6bb9-bd380a11}'].each do |invalid_uuid|
163
+ "Z0000C99-9C0B-4EF8-BB6D-6BB9BD380A11",
164
+ "a0eebc999r0b4ef8ab6d6bb9bd380a11",
165
+ "a0ee-bc99------4ef8-bb6d-6bb9-bd38-0a11",
166
+ "{a0eebc99-bb6d6bb9-bd380a11}",
167
+ "{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11",
168
+ "a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}"].each do |invalid_uuid|
100
169
  uuid = UUIDType.new guid: invalid_uuid
101
170
  assert_nil uuid.guid
102
171
  end
@@ -133,7 +202,7 @@ class PostgresqlUUIDTest < ActiveRecord::PostgreSQLTestCase
133
202
  duplicate = klass.new(guid: record.guid)
134
203
 
135
204
  assert record.guid.present? # Ensure we actually are testing a UUID
136
- assert_not duplicate.valid?
205
+ assert_not_predicate duplicate, :valid?
137
206
  end
138
207
  end
139
208
 
@@ -142,71 +211,104 @@ class PostgresqlUUIDGenerationTest < ActiveRecord::PostgreSQLTestCase
142
211
  include SchemaDumpingHelper
143
212
 
144
213
  class UUID < ActiveRecord::Base
145
- self.table_name = 'pg_uuids'
214
+ self.table_name = "pg_uuids"
146
215
  end
147
216
 
148
217
  setup do
149
- connection.create_table('pg_uuids', id: :uuid, default: 'uuid_generate_v1()') do |t|
150
- t.string 'name'
151
- t.uuid 'other_uuid', default: 'uuid_generate_v4()'
218
+ connection.create_table("pg_uuids", id: :uuid, default: "uuid_generate_v1()") do |t|
219
+ t.string "name"
220
+ t.uuid "other_uuid", default: "uuid_generate_v4()"
152
221
  end
153
222
 
154
223
  # Create custom PostgreSQL function to generate UUIDs
155
224
  # to test dumping tables which columns have defaults with custom functions
156
- connection.execute <<-SQL
157
- CREATE OR REPLACE FUNCTION my_uuid_generator() RETURNS uuid
158
- AS $$ SELECT * FROM uuid_generate_v4() $$
159
- LANGUAGE SQL VOLATILE;
225
+ connection.execute <<~SQL
226
+ CREATE OR REPLACE FUNCTION my_uuid_generator() RETURNS uuid
227
+ AS $$ SELECT * FROM #{uuid_function} $$
228
+ LANGUAGE SQL VOLATILE;
160
229
  SQL
161
230
 
162
231
  # Create such a table with custom function as default value generator
163
- connection.create_table('pg_uuids_2', id: :uuid, default: 'my_uuid_generator()') do |t|
164
- t.string 'name'
165
- t.uuid 'other_uuid_2', default: 'my_uuid_generator()'
232
+ connection.create_table("pg_uuids_2", id: :uuid, default: "my_uuid_generator()") do |t|
233
+ t.string "name"
234
+ t.uuid "other_uuid_2", default: "my_uuid_generator()"
235
+ end
236
+
237
+ connection.create_table("pg_uuids_3", id: :uuid, **uuid_default) do |t|
238
+ t.string "name"
166
239
  end
167
240
  end
168
241
 
169
242
  teardown do
170
243
  drop_table "pg_uuids"
171
- drop_table 'pg_uuids_2'
172
- connection.execute 'DROP FUNCTION IF EXISTS my_uuid_generator();'
244
+ drop_table "pg_uuids_2"
245
+ drop_table "pg_uuids_3"
246
+ connection.execute "DROP FUNCTION IF EXISTS my_uuid_generator();"
173
247
  end
174
248
 
175
- if ActiveRecord::Base.connection.supports_extensions?
176
- def test_id_is_uuid
177
- assert_equal :uuid, UUID.columns_hash['id'].type
178
- assert UUID.primary_key
179
- end
249
+ def test_id_is_uuid
250
+ assert_equal :uuid, UUID.columns_hash["id"].type
251
+ assert UUID.primary_key
252
+ end
180
253
 
181
- def test_id_has_a_default
182
- u = UUID.create
183
- assert_not_nil u.id
184
- end
254
+ def test_id_has_a_default
255
+ u = UUID.create
256
+ assert_not_nil u.id
257
+ end
185
258
 
186
- def test_auto_create_uuid
187
- u = UUID.create
188
- u.reload
189
- assert_not_nil u.other_uuid
190
- end
259
+ def test_auto_create_uuid
260
+ u = UUID.create
261
+ u.reload
262
+ assert_not_nil u.other_uuid
263
+ end
191
264
 
192
- def test_pk_and_sequence_for_uuid_primary_key
193
- pk, seq = connection.pk_and_sequence_for('pg_uuids')
194
- assert_equal 'id', pk
195
- assert_equal nil, seq
196
- end
265
+ def test_pk_and_sequence_for_uuid_primary_key
266
+ pk, seq = connection.pk_and_sequence_for("pg_uuids")
267
+ assert_equal "id", pk
268
+ assert_nil seq
269
+ end
197
270
 
198
- def test_schema_dumper_for_uuid_primary_key
199
- schema = dump_table_schema "pg_uuids"
200
- assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: -> { "uuid_generate_v1\(\)" }/, schema)
201
- assert_match(/t\.uuid "other_uuid", default: -> { "uuid_generate_v4\(\)" }/, schema)
202
- end
271
+ def test_schema_dumper_for_uuid_primary_key
272
+ schema = dump_table_schema "pg_uuids"
273
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: -> { "uuid_generate_v1\(\)" }/, schema)
274
+ assert_match(/t\.uuid "other_uuid", default: -> { "uuid_generate_v4\(\)" }/, schema)
275
+ end
276
+
277
+ def test_schema_dumper_for_uuid_primary_key_with_custom_default
278
+ schema = dump_table_schema "pg_uuids_2"
279
+ assert_match(/\bcreate_table "pg_uuids_2", id: :uuid, default: -> { "my_uuid_generator\(\)" }/, schema)
280
+ assert_match(/t\.uuid "other_uuid_2", default: -> { "my_uuid_generator\(\)" }/, schema)
281
+ end
203
282
 
204
- def test_schema_dumper_for_uuid_primary_key_with_custom_default
205
- schema = dump_table_schema "pg_uuids_2"
206
- assert_match(/\bcreate_table "pg_uuids_2", id: :uuid, default: -> { "my_uuid_generator\(\)" }/, schema)
207
- assert_match(/t\.uuid "other_uuid_2", default: -> { "my_uuid_generator\(\)" }/, schema)
283
+ def test_schema_dumper_for_uuid_primary_key_default
284
+ schema = dump_table_schema "pg_uuids_3"
285
+ if connection.supports_pgcrypto_uuid?
286
+ assert_match(/\bcreate_table "pg_uuids_3", id: :uuid, default: -> { "gen_random_uuid\(\)" }/, schema)
287
+ else
288
+ assert_match(/\bcreate_table "pg_uuids_3", id: :uuid, default: -> { "uuid_generate_v4\(\)" }/, schema)
208
289
  end
209
290
  end
291
+
292
+ def test_schema_dumper_for_uuid_primary_key_default_in_legacy_migration
293
+ @verbose_was = ActiveRecord::Migration.verbose
294
+ ActiveRecord::Migration.verbose = false
295
+
296
+ migration = Class.new(ActiveRecord::Migration[5.0]) do
297
+ def version; 101 end
298
+ def migrate(x)
299
+ create_table("pg_uuids_4", id: :uuid)
300
+ end
301
+ end.new
302
+ ActiveRecord::Migrator.new(:up, [migration], ActiveRecord::Base.connection.schema_migration).migrate
303
+
304
+ schema = dump_table_schema "pg_uuids_4"
305
+ assert_match(/\bcreate_table "pg_uuids_4", id: :uuid, default: -> { "uuid_generate_v4\(\)" }/, schema)
306
+ ensure
307
+ drop_table "pg_uuids_4"
308
+ ActiveRecord::Migration.verbose = @verbose_was
309
+ ActiveRecord::Base.connection.schema_migration.delete_all
310
+ end
311
+ uses_transaction :test_schema_dumper_for_uuid_primary_key_default_in_legacy_migration
210
312
  end
211
313
 
212
314
  class PostgresqlUUIDTestNilDefault < ActiveRecord::PostgreSQLTestCase
@@ -214,9 +316,9 @@ class PostgresqlUUIDTestNilDefault < ActiveRecord::PostgreSQLTestCase
214
316
  include SchemaDumpingHelper
215
317
 
216
318
  setup do
217
- connection.create_table('pg_uuids', id: false) do |t|
319
+ connection.create_table("pg_uuids", id: false) do |t|
218
320
  t.primary_key :id, :uuid, default: nil
219
- t.string 'name'
321
+ t.string "name"
220
322
  end
221
323
  end
222
324
 
@@ -224,71 +326,86 @@ class PostgresqlUUIDTestNilDefault < ActiveRecord::PostgreSQLTestCase
224
326
  drop_table "pg_uuids"
225
327
  end
226
328
 
227
- if ActiveRecord::Base.connection.supports_extensions?
228
- def test_id_allows_default_override_via_nil
229
- col_desc = connection.execute("SELECT pg_get_expr(d.adbin, d.adrelid) as default
230
- FROM pg_attribute a
231
- LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
232
- WHERE a.attname='id' AND a.attrelid = 'pg_uuids'::regclass").first
233
- assert_nil col_desc["default"]
234
- end
329
+ def test_id_allows_default_override_via_nil
330
+ col_desc = connection.execute("SELECT pg_get_expr(d.adbin, d.adrelid) as default
331
+ FROM pg_attribute a
332
+ LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
333
+ WHERE a.attname='id' AND a.attrelid = 'pg_uuids'::regclass").first
334
+ assert_nil col_desc["default"]
335
+ end
235
336
 
236
- def test_schema_dumper_for_uuid_primary_key_with_default_override_via_nil
237
- schema = dump_table_schema "pg_uuids"
238
- assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: nil/, schema)
239
- end
337
+ def test_schema_dumper_for_uuid_primary_key_with_default_override_via_nil
338
+ schema = dump_table_schema "pg_uuids"
339
+ assert_match(/\bcreate_table "pg_uuids", id: :uuid, default: nil/, schema)
240
340
  end
341
+
342
+ def test_schema_dumper_for_uuid_primary_key_with_default_nil_in_legacy_migration
343
+ @verbose_was = ActiveRecord::Migration.verbose
344
+ ActiveRecord::Migration.verbose = false
345
+
346
+ migration = Class.new(ActiveRecord::Migration[5.0]) do
347
+ def version; 101 end
348
+ def migrate(x)
349
+ create_table("pg_uuids_4", id: :uuid, default: nil)
350
+ end
351
+ end.new
352
+ ActiveRecord::Migrator.new(:up, [migration], ActiveRecord::Base.connection.schema_migration).migrate
353
+
354
+ schema = dump_table_schema "pg_uuids_4"
355
+ assert_match(/\bcreate_table "pg_uuids_4", id: :uuid, default: nil/, schema)
356
+ ensure
357
+ drop_table "pg_uuids_4"
358
+ ActiveRecord::Migration.verbose = @verbose_was
359
+ ActiveRecord::Base.connection.schema_migration.delete_all
360
+ end
361
+ uses_transaction :test_schema_dumper_for_uuid_primary_key_with_default_nil_in_legacy_migration
241
362
  end
242
363
 
243
364
  class PostgresqlUUIDTestInverseOf < ActiveRecord::PostgreSQLTestCase
244
365
  include PostgresqlUUIDHelper
245
366
 
246
367
  class UuidPost < ActiveRecord::Base
247
- self.table_name = 'pg_uuid_posts'
368
+ self.table_name = "pg_uuid_posts"
248
369
  has_many :uuid_comments, inverse_of: :uuid_post
249
370
  end
250
371
 
251
372
  class UuidComment < ActiveRecord::Base
252
- self.table_name = 'pg_uuid_comments'
373
+ self.table_name = "pg_uuid_comments"
253
374
  belongs_to :uuid_post
254
375
  end
255
376
 
256
377
  setup do
257
378
  connection.transaction do
258
- connection.create_table('pg_uuid_posts', id: :uuid) do |t|
259
- t.string 'title'
379
+ connection.create_table("pg_uuid_posts", id: :uuid, **uuid_default) do |t|
380
+ t.string "title"
260
381
  end
261
- connection.create_table('pg_uuid_comments', id: :uuid) do |t|
382
+ connection.create_table("pg_uuid_comments", id: :uuid, **uuid_default) do |t|
262
383
  t.references :uuid_post, type: :uuid
263
- t.string 'content'
384
+ t.string "content"
264
385
  end
265
386
  end
266
387
  end
267
388
 
268
389
  teardown do
269
- drop_table "pg_uuid_comments"
270
- drop_table "pg_uuid_posts"
390
+ drop_table "pg_uuid_comments"
391
+ drop_table "pg_uuid_posts"
271
392
  end
272
393
 
273
- if ActiveRecord::Base.connection.supports_extensions?
274
- def test_collection_association_with_uuid
275
- post = UuidPost.create!
276
- comment = post.uuid_comments.create!
277
- assert post.uuid_comments.find(comment.id)
278
- end
279
-
280
- def test_find_with_uuid
281
- UuidPost.create!
282
- assert_raise ActiveRecord::RecordNotFound do
283
- UuidPost.find(123456)
284
- end
285
-
286
- end
394
+ def test_collection_association_with_uuid
395
+ post = UuidPost.create!
396
+ comment = post.uuid_comments.create!
397
+ assert post.uuid_comments.find(comment.id)
398
+ end
287
399
 
288
- def test_find_by_with_uuid
289
- UuidPost.create!
290
- assert_nil UuidPost.find_by(id: 789)
400
+ def test_find_with_uuid
401
+ UuidPost.create!
402
+ assert_raise ActiveRecord::RecordNotFound do
403
+ UuidPost.find(123456)
291
404
  end
292
405
  end
293
406
 
407
+ def test_find_by_with_uuid
408
+ UuidPost.create!
409
+ assert_nil UuidPost.find_by(id: 789)
410
+ end
294
411
  end
@@ -1,28 +1,24 @@
1
- require 'cases/helper'
2
- require 'support/schema_dumping_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class PostgresqlXMLTest < ActiveRecord::PostgreSQLTestCase
5
7
  include SchemaDumpingHelper
6
8
  class XmlDataType < ActiveRecord::Base
7
- self.table_name = 'xml_data_type'
9
+ self.table_name = "xml_data_type"
8
10
  end
9
11
 
10
12
  def setup
11
13
  @connection = ActiveRecord::Base.connection
12
- begin
13
- @connection.transaction do
14
- @connection.create_table('xml_data_type') do |t|
15
- t.xml 'payload'
16
- end
17
- end
18
- rescue ActiveRecord::StatementInvalid
19
- skip "do not test on PG without xml"
14
+ @connection.create_table("xml_data_type") do |t|
15
+ t.xml "payload"
20
16
  end
21
- @column = XmlDataType.columns_hash['payload']
17
+ @column = XmlDataType.columns_hash["payload"]
22
18
  end
23
19
 
24
20
  teardown do
25
- @connection.drop_table 'xml_data_type', if_exists: true
21
+ @connection.drop_table "xml_data_type", if_exists: true
26
22
  end
27
23
 
28
24
  def test_column
@@ -30,7 +26,7 @@ class PostgresqlXMLTest < ActiveRecord::PostgreSQLTestCase
30
26
  end
31
27
 
32
28
  def test_null_xml
33
- @connection.execute %q|insert into xml_data_type (payload) VALUES(null)|
29
+ @connection.execute "insert into xml_data_type (payload) VALUES(null)"
34
30
  assert_nil XmlDataType.first.payload
35
31
  end
36
32
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/schema_dumping_helper'
4
+ require "support/schema_dumping_helper"
3
5
 
4
6
  class SQLite3CollationTest < ActiveRecord::SQLite3TestCase
5
7
  include SchemaDumpingHelper
@@ -7,8 +9,12 @@ class SQLite3CollationTest < ActiveRecord::SQLite3TestCase
7
9
  def setup
8
10
  @connection = ActiveRecord::Base.connection
9
11
  @connection.create_table :collation_table_sqlite3, force: true do |t|
10
- t.string :string_nocase, collation: 'NOCASE'
11
- t.text :text_rtrim, collation: 'RTRIM'
12
+ t.string :string_nocase, collation: "NOCASE"
13
+ t.text :text_rtrim, collation: "RTRIM"
14
+ # The decimal column might interfere with collation parsing.
15
+ # Thus, add this column type and some other string column afterwards.
16
+ t.decimal :decimal_col, precision: 6, scale: 2
17
+ t.string :string_after_decimal_nocase, collation: "NOCASE"
12
18
  end
13
19
  end
14
20
 
@@ -17,37 +23,42 @@ class SQLite3CollationTest < ActiveRecord::SQLite3TestCase
17
23
  end
18
24
 
19
25
  test "string column with collation" do
20
- column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'string_nocase' }
26
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "string_nocase" }
27
+ assert_equal :string, column.type
28
+ assert_equal "NOCASE", column.collation
29
+
30
+ # Verify collation of a column behind the decimal column as well.
31
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "string_after_decimal_nocase" }
21
32
  assert_equal :string, column.type
22
- assert_equal 'NOCASE', column.collation
33
+ assert_equal "NOCASE", column.collation
23
34
  end
24
35
 
25
36
  test "text column with collation" do
26
- column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'text_rtrim' }
37
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "text_rtrim" }
27
38
  assert_equal :text, column.type
28
- assert_equal 'RTRIM', column.collation
39
+ assert_equal "RTRIM", column.collation
29
40
  end
30
41
 
31
42
  test "add column with collation" do
32
- @connection.add_column :collation_table_sqlite3, :title, :string, collation: 'RTRIM'
43
+ @connection.add_column :collation_table_sqlite3, :title, :string, collation: "RTRIM"
33
44
 
34
- column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'title' }
45
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "title" }
35
46
  assert_equal :string, column.type
36
- assert_equal 'RTRIM', column.collation
47
+ assert_equal "RTRIM", column.collation
37
48
  end
38
49
 
39
50
  test "change column with collation" do
40
51
  @connection.add_column :collation_table_sqlite3, :description, :string
41
- @connection.change_column :collation_table_sqlite3, :description, :text, collation: 'RTRIM'
52
+ @connection.change_column :collation_table_sqlite3, :description, :text, collation: "RTRIM"
42
53
 
43
- column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == 'description' }
54
+ column = @connection.columns(:collation_table_sqlite3).find { |c| c.name == "description" }
44
55
  assert_equal :text, column.type
45
- assert_equal 'RTRIM', column.collation
56
+ assert_equal "RTRIM", column.collation
46
57
  end
47
58
 
48
59
  test "schema dump includes collation" do
49
60
  output = dump_table_schema("collation_table_sqlite3")
50
- assert_match %r{t.string\s+"string_nocase",\s+collation: "NOCASE"$}, output
51
- assert_match %r{t.text\s+"text_rtrim",\s+collation: "RTRIM"$}, output
61
+ assert_match %r{t\.string\s+"string_nocase",\s+collation: "NOCASE"$}, output
62
+ assert_match %r{t\.text\s+"text_rtrim",\s+collation: "RTRIM"$}, output
52
63
  end
53
64
  end