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
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "support/schema_dumping_helper"
5
+
6
+ if ActiveRecord::Base.connection.supports_virtual_columns?
7
+ class Mysql2VirtualColumnTest < ActiveRecord::Mysql2TestCase
8
+ include SchemaDumpingHelper
9
+
10
+ self.use_transactional_tests = false
11
+
12
+ class VirtualColumn < ActiveRecord::Base
13
+ end
14
+
15
+ def setup
16
+ @connection = ActiveRecord::Base.connection
17
+ @connection.create_table :virtual_columns, force: true do |t|
18
+ t.string :name
19
+ t.virtual :upper_name, type: :string, as: "UPPER(`name`)"
20
+ t.virtual :name_length, type: :integer, as: "LENGTH(`name`)", stored: true
21
+ t.virtual :name_octet_length, type: :integer, as: "OCTET_LENGTH(`name`)", stored: true
22
+ t.json :profile
23
+ t.virtual :profile_email, type: :string, as: "json_extract(`profile`,_utf8mb4'$.email')", stored: true
24
+ end
25
+ VirtualColumn.create(name: "Rails")
26
+ end
27
+
28
+ def teardown
29
+ @connection.drop_table :virtual_columns, if_exists: true
30
+ VirtualColumn.reset_column_information
31
+ end
32
+
33
+ def test_virtual_column
34
+ column = VirtualColumn.columns_hash["upper_name"]
35
+ assert_predicate column, :virtual?
36
+ assert_match %r{\bVIRTUAL\b}, column.extra
37
+ assert_equal "RAILS", VirtualColumn.take.upper_name
38
+ end
39
+
40
+ def test_stored_column
41
+ column = VirtualColumn.columns_hash["name_length"]
42
+ assert_predicate column, :virtual?
43
+ assert_match %r{\b(?:STORED|PERSISTENT)\b}, column.extra
44
+ assert_equal 5, VirtualColumn.take.name_length
45
+ end
46
+
47
+ def test_change_table
48
+ @connection.change_table :virtual_columns do |t|
49
+ t.virtual :lower_name, type: :string, as: "LOWER(name)"
50
+ end
51
+ VirtualColumn.reset_column_information
52
+ column = VirtualColumn.columns_hash["lower_name"]
53
+ assert_predicate column, :virtual?
54
+ assert_match %r{\bVIRTUAL\b}, column.extra
55
+ assert_equal "rails", VirtualColumn.take.lower_name
56
+ end
57
+
58
+ def test_schema_dumping
59
+ output = dump_table_schema("virtual_columns")
60
+ assert_match(/t\.virtual\s+"upper_name",\s+type: :string,\s+as: "(?:UPPER|UCASE)\(`name`\)"$/i, output)
61
+ assert_match(/t\.virtual\s+"name_length",\s+type: :integer,\s+as: "(?:octet_length|length)\(`name`\)",\s+stored: true$/i, output)
62
+ assert_match(/t\.virtual\s+"name_octet_length",\s+type: :integer,\s+as: "(?:octet_length|length)\(`name`\)",\s+stored: true$/i, output)
63
+ assert_match(/t\.virtual\s+"profile_email",\s+type: :string,\s+as: "json_extract\(`profile`,\w*?'\$\.email'\)", stored: true$/i, output)
64
+ end
65
+ end
66
+ end
@@ -1,7 +1,11 @@
1
- require 'cases/helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
2
4
 
3
5
  class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
4
6
  def setup
7
+ ActiveRecord::Base.connection.materialize_transactions
8
+
5
9
  ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
6
10
  def execute(sql, name = nil) sql end
7
11
  end
@@ -15,59 +19,69 @@ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
15
19
 
16
20
  def test_create_database_with_encoding
17
21
  assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
18
- assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
19
- assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, 'encoding' => :latin1)
22
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, encoding: :latin1)
23
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, "encoding" => :latin1)
20
24
  end
21
25
 
22
26
  def test_create_database_with_collation_and_ctype
23
- assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, :encoding => :"UTF8", :collation => :"ja_JP.UTF8", :ctype => :"ja_JP.UTF8")
27
+ assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, encoding: :"UTF8", collation: :"ja_JP.UTF8", ctype: :"ja_JP.UTF8")
24
28
  end
25
29
 
26
30
  def test_add_index
27
- # add_index calls index_name_exists? which can't work since execute is stubbed
28
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_exists?) { |*| false }
29
-
30
- expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" ("last_name") WHERE state = 'active')
31
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" ("last_name") WHERE state = 'active')
31
32
  assert_equal expected, add_index(:people, :last_name, unique: true, where: "state = 'active'")
32
33
 
33
- expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" (lower(last_name)))
34
- assert_equal expected, add_index(:people, 'lower(last_name)', unique: true)
34
+ expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" (lower(last_name)))
35
+ assert_equal expected, add_index(:people, "lower(last_name)", unique: true)
35
36
 
36
- expected = %(CREATE UNIQUE INDEX "index_people_on_last_name_varchar_pattern_ops" ON "people" (last_name varchar_pattern_ops))
37
- assert_equal expected, add_index(:people, 'last_name varchar_pattern_ops', unique: true)
37
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name_varchar_pattern_ops" ON "people" (last_name varchar_pattern_ops))
38
+ assert_equal expected, add_index(:people, "last_name varchar_pattern_ops", unique: true)
38
39
 
39
- expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" ("last_name"))
40
+ expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" ("last_name"))
40
41
  assert_equal expected, add_index(:people, :last_name, algorithm: :concurrently)
41
42
 
42
- expected = %(CREATE INDEX "index_people_on_last_name_and_first_name" ON "people" ("last_name" DESC, "first_name" ASC))
43
+ expected = %(CREATE INDEX CONCURRENTLY IF NOT EXISTS "index_people_on_last_name" ON "people" ("last_name"))
44
+ assert_equal expected, add_index(:people, :last_name, if_not_exists: true, algorithm: :concurrently)
45
+
46
+ expected = %(CREATE INDEX "index_people_on_last_name_and_first_name" ON "people" ("last_name" DESC, "first_name" ASC))
43
47
  assert_equal expected, add_index(:people, [:last_name, :first_name], order: { last_name: :desc, first_name: :asc })
44
48
  assert_equal expected, add_index(:people, ["last_name", :first_name], order: { last_name: :desc, "first_name" => :asc })
45
49
 
46
50
  %w(gin gist hash btree).each do |type|
47
- expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
51
+ expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
48
52
  assert_equal expected, add_index(:people, :last_name, using: type)
49
53
 
50
- expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
54
+ expected = %(CREATE INDEX CONCURRENTLY "index_people_on_last_name" ON "people" USING #{type} ("last_name"))
51
55
  assert_equal expected, add_index(:people, :last_name, using: type, algorithm: :concurrently)
52
56
 
53
- expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name") WHERE state = 'active')
57
+ expected = %(CREATE UNIQUE INDEX "index_people_on_last_name" ON "people" USING #{type} ("last_name") WHERE state = 'active')
54
58
  assert_equal expected, add_index(:people, :last_name, using: type, unique: true, where: "state = 'active'")
55
59
 
56
- expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" USING #{type} (lower(last_name)))
57
- assert_equal expected, add_index(:people, 'lower(last_name)', using: type, unique: true)
60
+ expected = %(CREATE UNIQUE INDEX "index_people_on_lower_last_name" ON "people" USING #{type} (lower(last_name)))
61
+ assert_equal expected, add_index(:people, "lower(last_name)", using: type, unique: true)
58
62
  end
59
63
 
64
+ expected = %(CREATE INDEX "index_people_on_last_name" ON "people" USING gist ("last_name" bpchar_pattern_ops))
65
+ assert_equal expected, add_index(:people, :last_name, using: :gist, opclass: { last_name: :bpchar_pattern_ops })
66
+
67
+ expected = %(CREATE INDEX "index_people_on_last_name_and_first_name" ON "people" ("last_name" DESC NULLS LAST, "first_name" ASC))
68
+ assert_equal expected, add_index(:people, [:last_name, :first_name], order: { last_name: "DESC NULLS LAST", first_name: :asc })
69
+
70
+ expected = %(CREATE INDEX "index_people_on_last_name" ON "people" ("last_name" NULLS FIRST))
71
+ assert_equal expected, add_index(:people, :last_name, order: "NULLS FIRST")
72
+
73
+ expected = %(CREATE INDEX IF NOT EXISTS "index_people_on_last_name" ON "people" ("last_name"))
74
+ assert_equal expected, add_index(:people, :last_name, if_not_exists: true)
75
+
60
76
  assert_raise ArgumentError do
61
77
  add_index(:people, :last_name, algorithm: :copy)
62
78
  end
63
-
64
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_exists?
65
79
  end
66
80
 
67
81
  def test_remove_index
68
82
  # remove_index calls index_name_for_remove which can't work since execute is stubbed
69
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_for_remove) do |*|
70
- 'index_people_on_last_name'
83
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.define_method(:index_name_for_remove) do |*|
84
+ "index_people_on_last_name"
71
85
  end
72
86
 
73
87
  expected = %(DROP INDEX CONCURRENTLY "index_people_on_last_name")
@@ -77,7 +91,7 @@ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
77
91
  add_index(:people, :last_name, algorithm: :copy)
78
92
  end
79
93
 
80
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send :remove_method, :index_name_for_remove
94
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.remove_method :index_name_for_remove
81
95
  end
82
96
 
83
97
  def test_remove_index_when_name_is_specified
@@ -93,6 +107,7 @@ class PostgresqlActiveSchemaTest < ActiveRecord::PostgreSQLTestCase
93
107
 
94
108
  private
95
109
  def method_missing(method_symbol, *arguments)
96
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
110
+ ActiveRecord::Base.connection.public_send(method_symbol, *arguments)
97
111
  end
112
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
98
113
  end
@@ -1,64 +1,100 @@
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 PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
5
7
  include SchemaDumpingHelper
6
8
  include InTimeZone
7
9
 
8
10
  class PgArray < ActiveRecord::Base
9
- self.table_name = 'pg_arrays'
11
+ self.table_name = "pg_arrays"
10
12
  end
11
13
 
12
14
  def setup
13
15
  @connection = ActiveRecord::Base.connection
14
16
 
15
- enable_extension!('hstore', @connection)
17
+ enable_extension!("hstore", @connection)
16
18
 
17
19
  @connection.transaction do
18
- @connection.create_table('pg_arrays') do |t|
19
- t.string 'tags', array: true
20
- t.integer 'ratings', array: true
20
+ @connection.create_table "pg_arrays", force: true do |t|
21
+ t.string "tags", array: true, limit: 255
22
+ t.integer "ratings", array: true
21
23
  t.datetime :datetimes, array: true
22
24
  t.hstore :hstores, array: true
25
+ t.decimal :decimals, array: true, default: [], precision: 10, scale: 2
23
26
  t.timestamp :timestamps, array: true, default: [], precision: 6
24
27
  end
25
28
  end
26
29
  PgArray.reset_column_information
27
- @column = PgArray.columns_hash['tags']
30
+ @column = PgArray.columns_hash["tags"]
28
31
  @type = PgArray.type_for_attribute("tags")
29
32
  end
30
33
 
31
34
  teardown do
32
- @connection.drop_table 'pg_arrays', if_exists: true
33
- disable_extension!('hstore', @connection)
35
+ @connection.drop_table "pg_arrays", if_exists: true
36
+ disable_extension!("hstore", @connection)
34
37
  end
35
38
 
36
39
  def test_column
37
40
  assert_equal :string, @column.type
38
- assert_equal "character varying", @column.sql_type
39
- assert @column.array?
40
- assert_not @type.binary?
41
+ assert_equal "character varying(255)", @column.sql_type
42
+ assert_predicate @column, :array?
43
+ assert_not_predicate @type, :binary?
41
44
 
42
- ratings_column = PgArray.columns_hash['ratings']
45
+ ratings_column = PgArray.columns_hash["ratings"]
43
46
  assert_equal :integer, ratings_column.type
44
- assert ratings_column.array?
47
+ assert_predicate ratings_column, :array?
48
+ end
49
+
50
+ def test_not_compatible_with_serialize_array
51
+ new_klass = Class.new(PgArray) do
52
+ serialize :tags, Array
53
+ end
54
+ assert_raises(ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError) do
55
+ new_klass.new
56
+ end
57
+ end
58
+
59
+ class MyTags
60
+ def initialize(tags); @tags = tags end
61
+ def to_a; @tags end
62
+ def self.load(tags); new(tags) end
63
+ def self.dump(object); object.to_a end
64
+ end
65
+
66
+ def test_array_with_serialized_attributes
67
+ new_klass = Class.new(PgArray) do
68
+ serialize :tags, MyTags
69
+ end
70
+
71
+ new_klass.create!(tags: MyTags.new(["one", "two"]))
72
+ record = new_klass.first
73
+
74
+ assert_instance_of MyTags, record.tags
75
+ assert_equal ["one", "two"], record.tags.to_a
76
+
77
+ record.tags = MyTags.new(["three", "four"])
78
+ record.save!
79
+
80
+ assert_equal ["three", "four"], record.reload.tags.to_a
45
81
  end
46
82
 
47
83
  def test_default
48
- @connection.add_column 'pg_arrays', 'score', :integer, array: true, default: [4, 4, 2]
84
+ @connection.add_column "pg_arrays", "score", :integer, array: true, default: [4, 4, 2]
49
85
  PgArray.reset_column_information
50
86
 
51
- assert_equal([4, 4, 2], PgArray.column_defaults['score'])
87
+ assert_equal([4, 4, 2], PgArray.column_defaults["score"])
52
88
  assert_equal([4, 4, 2], PgArray.new.score)
53
89
  ensure
54
90
  PgArray.reset_column_information
55
91
  end
56
92
 
57
93
  def test_default_strings
58
- @connection.add_column 'pg_arrays', 'names', :string, array: true, default: ["foo", "bar"]
94
+ @connection.add_column "pg_arrays", "names", :string, array: true, default: ["foo", "bar"]
59
95
  PgArray.reset_column_information
60
96
 
61
- assert_equal(["foo", "bar"], PgArray.column_defaults['names'])
97
+ assert_equal(["foo", "bar"], PgArray.column_defaults["names"])
62
98
  assert_equal(["foo", "bar"], PgArray.new.names)
63
99
  ensure
64
100
  PgArray.reset_column_information
@@ -69,11 +105,23 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
69
105
  @connection.change_column :pg_arrays, :snippets, :text, array: true, default: []
70
106
 
71
107
  PgArray.reset_column_information
72
- column = PgArray.columns_hash['snippets']
108
+ column = PgArray.columns_hash["snippets"]
73
109
 
74
110
  assert_equal :text, column.type
75
- assert_equal [], PgArray.column_defaults['snippets']
76
- assert column.array?
111
+ assert_equal [], PgArray.column_defaults["snippets"]
112
+ assert_predicate column, :array?
113
+ end
114
+
115
+ def test_change_column_from_non_array_to_array
116
+ @connection.add_column :pg_arrays, :snippets, :string
117
+ @connection.change_column :pg_arrays, :snippets, :text, array: true, default: [], using: "string_to_array(\"snippets\", ',')"
118
+
119
+ PgArray.reset_column_information
120
+ column = PgArray.columns_hash["snippets"]
121
+
122
+ assert_equal :text, column.type
123
+ assert_equal [], PgArray.column_defaults["snippets"]
124
+ assert_predicate column, :array?
77
125
  end
78
126
 
79
127
  def test_change_column_cant_make_non_array_column_to_array
@@ -89,17 +137,17 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
89
137
  @connection.change_column_default :pg_arrays, :tags, []
90
138
 
91
139
  PgArray.reset_column_information
92
- assert_equal [], PgArray.column_defaults['tags']
140
+ assert_equal [], PgArray.column_defaults["tags"]
93
141
  end
94
142
 
95
143
  def test_type_cast_array
96
- assert_equal(['1', '2', '3'], @type.deserialize('{1,2,3}'))
97
- assert_equal([], @type.deserialize('{}'))
98
- assert_equal([nil], @type.deserialize('{NULL}'))
144
+ assert_equal(["1", "2", "3"], @type.deserialize("{1,2,3}"))
145
+ assert_equal([], @type.deserialize("{}"))
146
+ assert_equal([nil], @type.deserialize("{NULL}"))
99
147
  end
100
148
 
101
149
  def test_type_cast_integers
102
- x = PgArray.new(ratings: ['1', '2'])
150
+ x = PgArray.new(ratings: ["1", "2"])
103
151
 
104
152
  assert_equal([1, 2], x.ratings)
105
153
 
@@ -111,22 +159,23 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
111
159
 
112
160
  def test_schema_dump_with_shorthand
113
161
  output = dump_table_schema "pg_arrays"
114
- assert_match %r[t\.string\s+"tags",\s+array: true], output
162
+ assert_match %r[t\.string\s+"tags",\s+limit: 255,\s+array: true], output
115
163
  assert_match %r[t\.integer\s+"ratings",\s+array: true], output
164
+ assert_match %r[t\.decimal\s+"decimals",\s+precision: 10,\s+scale: 2,\s+default: \[\],\s+array: true], output
116
165
  end
117
166
 
118
167
  def test_select_with_strings
119
168
  @connection.execute "insert into pg_arrays (tags) VALUES ('{1,2,3}')"
120
169
  x = PgArray.first
121
- assert_equal(['1','2','3'], x.tags)
170
+ assert_equal(["1", "2", "3"], x.tags)
122
171
  end
123
172
 
124
173
  def test_rewrite_with_strings
125
174
  @connection.execute "insert into pg_arrays (tags) VALUES ('{1,2,3}')"
126
175
  x = PgArray.first
127
- x.tags = ['1','2','3','4']
176
+ x.tags = ["1", "2", "3", "4"]
128
177
  x.save!
129
- assert_equal ['1','2','3','4'], x.reload.tags
178
+ assert_equal ["1", "2", "3", "4"], x.reload.tags
130
179
  end
131
180
 
132
181
  def test_select_with_integers
@@ -138,25 +187,25 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
138
187
  def test_rewrite_with_integers
139
188
  @connection.execute "insert into pg_arrays (ratings) VALUES ('{1,2,3}')"
140
189
  x = PgArray.first
141
- x.ratings = [2, '3', 4]
190
+ x.ratings = [2, "3", 4]
142
191
  x.save!
143
192
  assert_equal [2, 3, 4], x.reload.ratings
144
193
  end
145
194
 
146
195
  def test_multi_dimensional_with_strings
147
- assert_cycle(:tags, [[['1'], ['2']], [['2'], ['3']]])
196
+ assert_cycle(:tags, [[["1"], ["2"]], [["2"], ["3"]]])
148
197
  end
149
198
 
150
199
  def test_with_empty_strings
151
- assert_cycle(:tags, [ '1', '2', '', '4', '', '5' ])
200
+ assert_cycle(:tags, [ "1", "2", "", "4", "", "5" ])
152
201
  end
153
202
 
154
203
  def test_with_multi_dimensional_empty_strings
155
- assert_cycle(:tags, [[['1', '2'], ['', '4'], ['', '5']]])
204
+ assert_cycle(:tags, [[["1", "2"], ["", "4"], ["", "5"]]])
156
205
  end
157
206
 
158
207
  def test_with_arbitrary_whitespace
159
- assert_cycle(:tags, [[['1', '2'], [' ', '4'], [' ', '5']]])
208
+ assert_cycle(:tags, [[["1", "2"], [" ", "4"], [" ", "5"]]])
160
209
  end
161
210
 
162
211
  def test_multi_dimensional_with_integers
@@ -164,28 +213,28 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
164
213
  end
165
214
 
166
215
  def test_strings_with_quotes
167
- assert_cycle(:tags, ['this has','some "s that need to be escaped"'])
216
+ assert_cycle(:tags, ["this has", 'some "s that need to be escaped"'])
168
217
  end
169
218
 
170
219
  def test_strings_with_commas
171
- assert_cycle(:tags, ['this,has','many,values'])
220
+ assert_cycle(:tags, ["this,has", "many,values"])
172
221
  end
173
222
 
174
223
  def test_strings_with_array_delimiters
175
- assert_cycle(:tags, ['{','}'])
224
+ assert_cycle(:tags, ["{", "}"])
176
225
  end
177
226
 
178
227
  def test_strings_with_null_strings
179
- assert_cycle(:tags, ['NULL','NULL'])
228
+ assert_cycle(:tags, ["NULL", "NULL"])
180
229
  end
181
230
 
182
231
  def test_contains_nils
183
- assert_cycle(:tags, ['1',nil,nil])
232
+ assert_cycle(:tags, ["1", nil, nil])
184
233
  end
185
234
 
186
235
  def test_insert_fixture
187
236
  tag_values = ["val1", "val2", "val3_with_'_multiple_quote_'_chars"]
188
- @connection.insert_fixture({"tags" => tag_values}, "pg_arrays" )
237
+ @connection.insert_fixture({ "tags" => tag_values }, "pg_arrays")
189
238
  assert_equal(PgArray.last.tags, tag_values)
190
239
  end
191
240
 
@@ -212,14 +261,14 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
212
261
  x = PgArray.create!(tags: tags)
213
262
  x.reload
214
263
 
215
- refute x.changed?
264
+ assert_not_predicate x, :changed?
216
265
  end
217
266
 
218
267
  def test_quoting_non_standard_delimiters
219
268
  strings = ["hello,", "world;"]
220
269
  oid = ActiveRecord::ConnectionAdapters::PostgreSQL::OID
221
- comma_delim = oid::Array.new(ActiveRecord::Type::String.new, ',')
222
- semicolon_delim = oid::Array.new(ActiveRecord::Type::String.new, ';')
270
+ comma_delim = oid::Array.new(ActiveRecord::Type::String.new, ",")
271
+ semicolon_delim = oid::Array.new(ActiveRecord::Type::String.new, ";")
223
272
  conn = PgArray.connection
224
273
 
225
274
  assert_equal %({"hello,",world;}), conn.type_cast(comma_delim.serialize(strings))
@@ -234,18 +283,18 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
234
283
  x.reload
235
284
 
236
285
  assert_equal %w(one two three), x.tags
237
- assert_not x.changed?
286
+ assert_not_predicate x, :changed?
238
287
  end
239
288
 
240
289
  def test_mutate_value_in_array
241
- x = PgArray.create!(hstores: [{ a: 'a' }, { b: 'b' }])
290
+ x = PgArray.create!(hstores: [{ a: "a" }, { b: "b" }])
242
291
 
243
- x.hstores.first['a'] = 'c'
292
+ x.hstores.first["a"] = "c"
244
293
  x.save!
245
294
  x.reload
246
295
 
247
- assert_equal [{ 'a' => 'c' }, { 'b' => 'b' }], x.hstores
248
- assert_not x.changed?
296
+ assert_equal [{ "a" => "c" }, { "b" => "b" }], x.hstores
297
+ assert_not_predicate x, :changed?
249
298
  end
250
299
 
251
300
  def test_datetime_with_timezone_awareness
@@ -292,6 +341,12 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
292
341
  assert_equal record.tags, record.reload.tags
293
342
  end
294
343
 
344
+ def test_where_by_attribute_with_array
345
+ tags = ["black", "blue"]
346
+ record = PgArray.create!(tags: tags)
347
+ assert_equal record, PgArray.where(tags: tags).take
348
+ end
349
+
295
350
  def test_uniqueness_validation
296
351
  klass = Class.new(PgArray) do
297
352
  validates_uniqueness_of :tags
@@ -302,7 +357,7 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
302
357
  assert e1.persisted?, "Saving e1"
303
358
 
304
359
  e2 = klass.create("tags" => ["black", "blue"])
305
- assert !e2.persisted?, "e2 shouldn't be valid"
360
+ assert_not e2.persisted?, "e2 shouldn't be valid"
306
361
  assert e2.errors[:tags].any?, "Should have errors for tags"
307
362
  assert_equal ["has already been taken"], e2.errors[:tags], "Should have uniqueness message for tags"
308
363
  end
@@ -323,17 +378,17 @@ class PostgresqlArrayTest < ActiveRecord::PostgreSQLTestCase
323
378
  end
324
379
 
325
380
  private
326
- def assert_cycle field, array
327
- # test creation
328
- x = PgArray.create!(field => array)
329
- x.reload
330
- assert_equal(array, x.public_send(field))
331
-
332
- # test updating
333
- x = PgArray.create!(field => [])
334
- x.public_send("#{field}=", array)
335
- x.save!
336
- x.reload
337
- assert_equal(array, x.public_send(field))
338
- end
381
+ def assert_cycle(field, array)
382
+ # test creation
383
+ x = PgArray.create!(field => array)
384
+ x.reload
385
+ assert_equal(array, x.public_send(field))
386
+
387
+ # test updating
388
+ x = PgArray.create!(field => [])
389
+ x.public_send("#{field}=", array)
390
+ x.save!
391
+ x.reload
392
+ assert_equal(array, x.public_send(field))
393
+ end
339
394
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'support/connection_helper'
3
- require 'support/schema_dumping_helper'
4
+ require "support/connection_helper"
5
+ require "support/schema_dumping_helper"
4
6
 
5
7
  class PostgresqlBitStringTest < ActiveRecord::PostgreSQLTestCase
6
8
  include ConnectionHelper
@@ -10,7 +12,7 @@ class PostgresqlBitStringTest < ActiveRecord::PostgreSQLTestCase
10
12
 
11
13
  def setup
12
14
  @connection = ActiveRecord::Base.connection
13
- @connection.create_table('postgresql_bit_strings', :force => true) do |t|
15
+ @connection.create_table("postgresql_bit_strings", force: true) do |t|
14
16
  t.bit :a_bit, default: "00000011", limit: 8
15
17
  t.bit_varying :a_bit_varying, default: "0011", limit: 4
16
18
  t.bit :another_bit
@@ -20,34 +22,34 @@ class PostgresqlBitStringTest < ActiveRecord::PostgreSQLTestCase
20
22
 
21
23
  def teardown
22
24
  return unless @connection
23
- @connection.drop_table 'postgresql_bit_strings', if_exists: true
25
+ @connection.drop_table "postgresql_bit_strings", if_exists: true
24
26
  end
25
27
 
26
28
  def test_bit_string_column
27
29
  column = PostgresqlBitString.columns_hash["a_bit"]
28
30
  assert_equal :bit, column.type
29
31
  assert_equal "bit(8)", column.sql_type
30
- assert_not column.array?
32
+ assert_not_predicate column, :array?
31
33
 
32
34
  type = PostgresqlBitString.type_for_attribute("a_bit")
33
- assert_not type.binary?
35
+ assert_not_predicate type, :binary?
34
36
  end
35
37
 
36
38
  def test_bit_string_varying_column
37
39
  column = PostgresqlBitString.columns_hash["a_bit_varying"]
38
40
  assert_equal :bit_varying, column.type
39
41
  assert_equal "bit varying(4)", column.sql_type
40
- assert_not column.array?
42
+ assert_not_predicate column, :array?
41
43
 
42
44
  type = PostgresqlBitString.type_for_attribute("a_bit_varying")
43
- assert_not type.binary?
45
+ assert_not_predicate type, :binary?
44
46
  end
45
47
 
46
48
  def test_default
47
- assert_equal "00000011", PostgresqlBitString.column_defaults['a_bit']
49
+ assert_equal "00000011", PostgresqlBitString.column_defaults["a_bit"]
48
50
  assert_equal "00000011", PostgresqlBitString.new.a_bit
49
51
 
50
- assert_equal "0011", PostgresqlBitString.column_defaults['a_bit_varying']
52
+ assert_equal "0011", PostgresqlBitString.column_defaults["a_bit_varying"]
51
53
  assert_equal "0011", PostgresqlBitString.new.a_bit_varying
52
54
  end
53
55