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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,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 SchemaDumperTest < ActiveRecord::TestCase
5
7
  include SchemaDumpingHelper
@@ -26,33 +28,16 @@ class SchemaDumperTest < ActiveRecord::TestCase
26
28
  def test_dump_schema_information_outputs_lexically_ordered_versions
27
29
  versions = %w{ 20100101010101 20100201010101 20100301010101 }
28
30
  versions.reverse_each do |v|
29
- ActiveRecord::SchemaMigration.create!(:version => v)
31
+ ActiveRecord::SchemaMigration.create!(version: v)
30
32
  end
31
33
 
32
34
  schema_info = ActiveRecord::Base.connection.dump_schema_information
33
35
  assert_match(/20100201010101.*20100301010101/m, schema_info)
36
+ assert_includes schema_info, "20100101010101"
34
37
  ensure
35
38
  ActiveRecord::SchemaMigration.delete_all
36
39
  end
37
40
 
38
- if current_adapter?(:SQLite3Adapter)
39
- %w{3.7.8 3.7.11 3.7.12}.each do |version_string|
40
- test "dumps schema version for sqlite version #{version_string}" do
41
- version = ActiveRecord::ConnectionAdapters::SQLite3Adapter::Version.new(version_string)
42
- ActiveRecord::Base.connection.stubs(:sqlite_version).returns(version)
43
-
44
- versions = %w{ 20100101010101 20100201010101 20100301010101 }
45
- versions.reverse_each do |v|
46
- ActiveRecord::SchemaMigration.create!(:version => v)
47
- end
48
-
49
- schema_info = ActiveRecord::Base.connection.dump_schema_information
50
- assert_match(/20100201010101.*20100301010101/m, schema_info)
51
- ActiveRecord::SchemaMigration.delete_all
52
- end
53
- end
54
- end
55
-
56
41
  def test_schema_dump
57
42
  output = standard_dump
58
43
  assert_match %r{create_table "accounts"}, output
@@ -64,7 +49,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
64
49
 
65
50
  def test_schema_dump_uses_force_cascade_on_create_table
66
51
  output = dump_table_schema "authors"
67
- assert_match %r{create_table "authors", force: :cascade}, output
52
+ assert_match %r{create_table "authors",.* force: :cascade}, output
68
53
  end
69
54
 
70
55
  def test_schema_dump_excludes_sqlite_sequence
@@ -74,46 +59,38 @@ class SchemaDumperTest < ActiveRecord::TestCase
74
59
 
75
60
  def test_schema_dump_includes_camelcase_table_name
76
61
  output = standard_dump
77
- if current_adapter?(:IBM_DBAdapter)
78
- #DB2 is case insensitive
79
- assert_match %r{create_table "camelcase"}, output
80
- else
81
- assert_match %r{create_table "CamelCase"}, output
82
- end
62
+ assert_match %r{create_table "CamelCase"}, output
83
63
  end
84
64
 
85
- def assert_line_up(lines, pattern, required = false)
65
+ def assert_no_line_up(lines, pattern)
86
66
  return assert(true) if lines.empty?
87
67
  matches = lines.map { |line| line.match(pattern) }
88
- assert matches.all? if required
89
68
  matches.compact!
90
69
  return assert(true) if matches.empty?
91
- assert_equal 1, matches.map{ |match| match.offset(0).first }.uniq.length
70
+ line_matches = lines.map { |line| [line, line.match(pattern)] }.select { |line, match| match }
71
+ assert line_matches.all? { |line, match|
72
+ start = match.offset(0).first
73
+ line[start - 2..start - 1] == ", "
74
+ }
92
75
  end
93
76
 
94
77
  def column_definition_lines(output = standard_dump)
95
- output.scan(/^( *)create_table.*?\n(.*?)^\1end/m).map{ |m| m.last.split(/\n/) }
78
+ output.scan(/^( *)create_table.*?\n(.*?)^\1end/m).map { |m| m.last.split(/\n/) }
96
79
  end
97
80
 
98
- def test_types_line_up
81
+ def test_types_no_line_up
99
82
  column_definition_lines.each do |column_set|
100
83
  next if column_set.empty?
101
84
 
102
- lengths = column_set.map do |column|
103
- if match = column.match(/\bt\.\w+\s+(?="\w+?")/)
104
- match[0].length
105
- end
106
- end.compact
107
-
108
- assert_equal 1, lengths.uniq.length
85
+ assert column_set.all? { |column| !column.match(/\bt\.\w+\s{2,}/) }
109
86
  end
110
87
  end
111
88
 
112
- def test_arguments_line_up
89
+ def test_arguments_no_line_up
113
90
  column_definition_lines.each do |column_set|
114
- assert_line_up(column_set, /default: /)
115
- assert_line_up(column_set, /limit: /)
116
- assert_line_up(column_set, /null: /)
91
+ assert_no_line_up(column_set, /default: /)
92
+ assert_no_line_up(column_set, /limit: /)
93
+ assert_no_line_up(column_set, /null: /)
117
94
  end
118
95
  end
119
96
 
@@ -130,44 +107,29 @@ class SchemaDumperTest < ActiveRecord::TestCase
130
107
  def test_schema_dump_includes_limit_constraint_for_integer_columns
131
108
  output = dump_all_table_schema([/^(?!integer_limits)/])
132
109
 
133
- assert_match %r{c_int_without_limit}, output
110
+ assert_match %r{"c_int_without_limit"(?!.*limit)}, output
134
111
 
135
112
  if current_adapter?(:PostgreSQLAdapter)
136
- assert_no_match %r{c_int_without_limit.*limit:}, output
137
-
138
113
  assert_match %r{c_int_1.*limit: 2}, output
139
114
  assert_match %r{c_int_2.*limit: 2}, output
140
115
 
141
116
  # int 3 is 4 bytes in postgresql
142
- assert_match %r{c_int_3.*}, output
143
- assert_no_match %r{c_int_3.*limit:}, output
144
-
145
- assert_match %r{c_int_4.*}, output
146
- assert_no_match %r{c_int_4.*limit:}, output
117
+ assert_match %r{"c_int_3"(?!.*limit)}, output
118
+ assert_match %r{"c_int_4"(?!.*limit)}, output
147
119
  elsif current_adapter?(:Mysql2Adapter)
148
- assert_match %r{c_int_without_limit"$}, output
149
-
150
120
  assert_match %r{c_int_1.*limit: 1}, output
151
121
  assert_match %r{c_int_2.*limit: 2}, output
152
122
  assert_match %r{c_int_3.*limit: 3}, output
153
123
 
154
- assert_match %r{c_int_4.*}, output
155
- assert_no_match %r{c_int_4.*:limit}, output
124
+ assert_match %r{"c_int_4"(?!.*limit)}, output
156
125
  elsif current_adapter?(:SQLite3Adapter)
157
- assert_no_match %r{c_int_without_limit.*limit:}, output
158
-
159
126
  assert_match %r{c_int_1.*limit: 1}, output
160
127
  assert_match %r{c_int_2.*limit: 2}, output
161
128
  assert_match %r{c_int_3.*limit: 3}, output
162
129
  assert_match %r{c_int_4.*limit: 4}, output
163
130
  end
164
131
 
165
- if current_adapter?(:SQLite3Adapter)
166
- assert_match %r{c_int_5.*limit: 5}, output
167
- assert_match %r{c_int_6.*limit: 6}, output
168
- assert_match %r{c_int_7.*limit: 7}, output
169
- assert_match %r{c_int_8.*limit: 8}, output
170
- elsif current_adapter?(:OracleAdapter)
132
+ if current_adapter?(:SQLite3Adapter, :OracleAdapter)
171
133
  assert_match %r{c_int_5.*limit: 5}, output
172
134
  assert_match %r{c_int_6.*limit: 6}, output
173
135
  assert_match %r{c_int_7.*limit: 7}, output
@@ -181,7 +143,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
181
143
  end
182
144
 
183
145
  def test_schema_dump_with_string_ignored_table
184
- output = dump_all_table_schema(['accounts'])
146
+ output = dump_all_table_schema(["accounts"])
185
147
  assert_no_match %r{create_table "accounts"}, output
186
148
  assert_match %r{create_table "authors"}, output
187
149
  assert_no_match %r{create_table "schema_migrations"}, output
@@ -197,29 +159,58 @@ class SchemaDumperTest < ActiveRecord::TestCase
197
159
  end
198
160
 
199
161
  def test_schema_dumps_index_columns_in_right_order
200
- index_definition = standard_dump.split(/\n/).grep(/t\.index.*company_index/).first.strip
201
- if current_adapter?(:PostgreSQLAdapter)
202
- assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", order: { rating: :desc }, using: :btree', index_definition
203
- elsif current_adapter?(:Mysql2Adapter)
204
- assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", length: { type: 10 }, using: :btree', index_definition
162
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*company_index/).first.strip
163
+ if current_adapter?(:Mysql2Adapter)
164
+ if ActiveRecord::Base.connection.supports_index_sort_order?
165
+ assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", length: { type: 10 }, order: { rating: :desc }', index_definition
166
+ else
167
+ assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", length: { type: 10 }', index_definition
168
+ end
169
+ elsif ActiveRecord::Base.connection.supports_index_sort_order?
170
+ assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index", order: { rating: :desc }', index_definition
205
171
  else
206
172
  assert_equal 't.index ["firm_id", "type", "rating"], name: "company_index"', index_definition
207
173
  end
208
174
  end
209
175
 
210
176
  def test_schema_dumps_partial_indices
211
- index_definition = standard_dump.split(/\n/).grep(/t\.index.*company_partial_index/).first.strip
212
- if current_adapter?(:PostgreSQLAdapter)
213
- assert_equal 't.index ["firm_id", "type"], name: "company_partial_index", where: "(rating > 10)", using: :btree', index_definition
214
- elsif current_adapter?(:Mysql2Adapter)
215
- assert_equal 't.index ["firm_id", "type"], name: "company_partial_index", using: :btree', index_definition
216
- elsif current_adapter?(:SQLite3Adapter) && ActiveRecord::Base.connection.supports_partial_index?
217
- assert_equal 't.index ["firm_id", "type"], name: "company_partial_index", where: "rating > 10"', index_definition
177
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*company_partial_index/).first.strip
178
+ if ActiveRecord::Base.connection.supports_partial_index?
179
+ assert_equal 't.index ["firm_id", "type"], name: "company_partial_index", where: "(rating > 10)"', index_definition
218
180
  else
219
181
  assert_equal 't.index ["firm_id", "type"], name: "company_partial_index"', index_definition
220
182
  end
221
183
  end
222
184
 
185
+ def test_schema_dumps_index_sort_order
186
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*_name_and_rating/).first.strip
187
+ if ActiveRecord::Base.connection.supports_index_sort_order?
188
+ assert_equal 't.index ["name", "rating"], name: "index_companies_on_name_and_rating", order: :desc', index_definition
189
+ else
190
+ assert_equal 't.index ["name", "rating"], name: "index_companies_on_name_and_rating"', index_definition
191
+ end
192
+ end
193
+
194
+ def test_schema_dumps_index_length
195
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*_name_and_description/).first.strip
196
+ if current_adapter?(:Mysql2Adapter)
197
+ assert_equal 't.index ["name", "description"], name: "index_companies_on_name_and_description", length: 10', index_definition
198
+ else
199
+ assert_equal 't.index ["name", "description"], name: "index_companies_on_name_and_description"', index_definition
200
+ end
201
+ end
202
+
203
+ if ActiveRecord::Base.connection.supports_check_constraints?
204
+ def test_schema_dumps_check_constraints
205
+ constraint_definition = dump_table_schema("products").split(/\n/).grep(/t.check_constraint.*products_price_check/).first.strip
206
+ if current_adapter?(:Mysql2Adapter)
207
+ assert_equal 't.check_constraint "`price` > `discounted_price`", name: "products_price_check"', constraint_definition
208
+ else
209
+ assert_equal 't.check_constraint "price > discounted_price", name: "products_price_check"', constraint_definition
210
+ end
211
+ end
212
+ end
213
+
223
214
  def test_schema_dump_should_honor_nonstandard_primary_keys
224
215
  output = standard_dump
225
216
  match = output.match(%r{create_table "movies"(.*)do})
@@ -228,43 +219,76 @@ class SchemaDumperTest < ActiveRecord::TestCase
228
219
  end
229
220
 
230
221
  def test_schema_dump_should_use_false_as_default
231
- output = standard_dump
222
+ output = dump_table_schema "booleans"
232
223
  assert_match %r{t\.boolean\s+"has_fun",.+default: false}, output
233
224
  end
234
225
 
235
- if current_adapter?(:Mysql2Adapter)
236
- def test_schema_dump_should_add_default_value_for_mysql_text_field
237
- output = standard_dump
238
- assert_match %r{t\.text\s+"body",\s+limit: 65535,\s+null: false$}, output
226
+ def test_schema_dump_does_not_include_limit_for_text_field
227
+ output = dump_table_schema "admin_users"
228
+ assert_match %r{t\.text\s+"params"}, output
229
+ end
230
+
231
+ def test_schema_dump_does_not_include_limit_for_binary_field
232
+ output = dump_table_schema "binaries"
233
+ assert_match %r{t\.binary\s+"data"$}, output
234
+ end
235
+
236
+ def test_schema_dump_does_not_include_limit_for_float_field
237
+ output = dump_table_schema "numeric_data"
238
+ assert_match %r{t\.float\s+"temperature"}, output
239
+ end
240
+
241
+ if ActiveRecord::Base.connection.supports_expression_index?
242
+ def test_schema_dump_expression_indices
243
+ index_definition = dump_table_schema("companies").split(/\n/).grep(/t\.index.*company_expression_index/).first.strip
244
+ index_definition.sub!(/, name: "company_expression_index"\z/, "")
245
+
246
+ if current_adapter?(:PostgreSQLAdapter)
247
+ assert_match %r{CASE.+lower\(\(name\)::text\).+END\) DESC"\z}i, index_definition
248
+ elsif current_adapter?(:Mysql2Adapter)
249
+ assert_match %r{CASE.+lower\(`name`\).+END\) DESC"\z}i, index_definition
250
+ elsif current_adapter?(:SQLite3Adapter)
251
+ assert_match %r{CASE.+lower\(name\).+END\) DESC"\z}i, index_definition
252
+ else
253
+ assert false
254
+ end
239
255
  end
256
+ end
240
257
 
258
+ if current_adapter?(:Mysql2Adapter)
241
259
  def test_schema_dump_includes_length_for_mysql_binary_fields
242
- output = standard_dump
260
+ output = dump_table_schema "binary_fields"
243
261
  assert_match %r{t\.binary\s+"var_binary",\s+limit: 255$}, output
244
262
  assert_match %r{t\.binary\s+"var_binary_large",\s+limit: 4095$}, output
245
263
  end
246
264
 
247
265
  def test_schema_dump_includes_length_for_mysql_blob_and_text_fields
248
- output = standard_dump
249
- assert_match %r{t\.blob\s+"tiny_blob",\s+limit: 255$}, output
250
- assert_match %r{t\.binary\s+"normal_blob",\s+limit: 65535$}, output
251
- assert_match %r{t\.binary\s+"medium_blob",\s+limit: 16777215$}, output
252
- assert_match %r{t\.binary\s+"long_blob",\s+limit: 4294967295$}, output
253
- assert_match %r{t\.text\s+"tiny_text",\s+limit: 255$}, output
254
- assert_match %r{t\.text\s+"normal_text",\s+limit: 65535$}, output
255
- assert_match %r{t\.text\s+"medium_text",\s+limit: 16777215$}, output
256
- assert_match %r{t\.text\s+"long_text",\s+limit: 4294967295$}, output
266
+ output = dump_table_schema "binary_fields"
267
+ assert_match %r{t\.binary\s+"tiny_blob",\s+size: :tiny$}, output
268
+ assert_match %r{t\.binary\s+"normal_blob"$}, output
269
+ assert_match %r{t\.binary\s+"medium_blob",\s+size: :medium$}, output
270
+ assert_match %r{t\.binary\s+"long_blob",\s+size: :long$}, output
271
+ assert_match %r{t\.text\s+"tiny_text",\s+size: :tiny$}, output
272
+ assert_match %r{t\.text\s+"normal_text"$}, output
273
+ assert_match %r{t\.text\s+"medium_text",\s+size: :medium$}, output
274
+ assert_match %r{t\.text\s+"long_text",\s+size: :long$}, output
275
+ assert_match %r{t\.binary\s+"tiny_blob_2",\s+size: :tiny$}, output
276
+ assert_match %r{t\.binary\s+"medium_blob_2",\s+size: :medium$}, output
277
+ assert_match %r{t\.binary\s+"long_blob_2",\s+size: :long$}, output
278
+ assert_match %r{t\.text\s+"tiny_text_2",\s+size: :tiny$}, output
279
+ assert_match %r{t\.text\s+"medium_text_2",\s+size: :medium$}, output
280
+ assert_match %r{t\.text\s+"long_text_2",\s+size: :long$}, output
257
281
  end
258
282
 
259
283
  def test_schema_does_not_include_limit_for_emulated_mysql_boolean_fields
260
- output = standard_dump
284
+ output = dump_table_schema "booleans"
261
285
  assert_no_match %r{t\.boolean\s+"has_fun",.+limit: 1}, output
262
286
  end
263
287
 
264
288
  def test_schema_dumps_index_type
265
- output = standard_dump
266
- assert_match %r{t\.index \["awesome"\], name: "index_key_tests_on_awesome", type: :fulltext}, output
267
- assert_match %r{t\.index \["pizza"\], name: "index_key_tests_on_pizza", using: :btree}, output
289
+ output = dump_table_schema "key_tests"
290
+ assert_match %r{t\.index \["awesome"\], name: "index_key_tests_on_awesome", type: :fulltext$}, output
291
+ assert_match %r{t\.index \["pizza"\], name: "index_key_tests_on_pizza"$}, output
268
292
  end
269
293
  end
270
294
 
@@ -275,40 +299,62 @@ class SchemaDumperTest < ActiveRecord::TestCase
275
299
 
276
300
  if current_adapter?(:PostgreSQLAdapter)
277
301
  def test_schema_dump_includes_bigint_default
278
- output = standard_dump
302
+ output = dump_table_schema "defaults"
279
303
  assert_match %r{t\.bigint\s+"bigint_default",\s+default: 0}, output
280
304
  end
281
305
 
282
306
  def test_schema_dump_includes_limit_on_array_type
283
- output = standard_dump
307
+ output = dump_table_schema "bigint_array"
284
308
  assert_match %r{t\.bigint\s+"big_int_data_points\",\s+array: true}, output
285
309
  end
286
310
 
287
311
  def test_schema_dump_allows_array_of_decimal_defaults
288
- output = standard_dump
312
+ output = dump_table_schema "bigint_array"
289
313
  assert_match %r{t\.decimal\s+"decimal_array_default",\s+default: \["1.23", "3.45"\],\s+array: true}, output
290
314
  end
291
315
 
292
- def test_schema_dump_expression_indices
293
- index_definition = standard_dump.split(/\n/).grep(/t\.index.*company_expression_index/).first.strip
294
- assert_equal 't.index "lower((name)::text)", name: "company_expression_index", using: :btree', index_definition
316
+ def test_schema_dump_interval_type
317
+ output = dump_table_schema "postgresql_times"
318
+ assert_match %r{t\.interval\s+"time_interval"$}, output
319
+ assert_match %r{t\.interval\s+"scaled_time_interval",\s+precision: 6$}, output
320
+ end
321
+
322
+ def test_schema_dump_oid_type
323
+ output = dump_table_schema "postgresql_oids"
324
+ assert_match %r{t\.oid\s+"obj_id"$}, output
295
325
  end
296
326
 
297
- if ActiveRecord::Base.connection.supports_extensions?
298
- def test_schema_dump_includes_extensions
299
- connection = ActiveRecord::Base.connection
327
+ def test_schema_dump_includes_extensions
328
+ connection = ActiveRecord::Base.connection
300
329
 
301
- connection.stubs(:extensions).returns(['hstore'])
330
+ connection.stub(:extensions, ["hstore"]) do
302
331
  output = perform_schema_dump
303
332
  assert_match "# These are extensions that must be enabled", output
304
333
  assert_match %r{enable_extension "hstore"}, output
334
+ end
305
335
 
306
- connection.stubs(:extensions).returns([])
336
+ connection.stub(:extensions, []) do
307
337
  output = perform_schema_dump
308
338
  assert_no_match "# These are extensions that must be enabled", output
309
339
  assert_no_match %r{enable_extension}, output
310
340
  end
311
341
  end
342
+
343
+ def test_schema_dump_includes_extensions_in_alphabetic_order
344
+ connection = ActiveRecord::Base.connection
345
+
346
+ connection.stub(:extensions, ["hstore", "uuid-ossp", "xml2"]) do
347
+ output = perform_schema_dump
348
+ enabled_extensions = output.scan(%r{enable_extension "(.+)"}).flatten
349
+ assert_equal ["hstore", "uuid-ossp", "xml2"], enabled_extensions
350
+ end
351
+
352
+ connection.stub(:extensions, ["uuid-ossp", "xml2", "hstore"]) do
353
+ output = perform_schema_dump
354
+ enabled_extensions = output.scan(%r{enable_extension "(.+)"}).flatten
355
+ assert_equal ["hstore", "uuid-ossp", "xml2"], enabled_extensions
356
+ end
357
+ end
312
358
  end
313
359
 
314
360
  def test_schema_dump_keeps_large_precision_integer_columns_as_decimal
@@ -316,11 +362,8 @@ class SchemaDumperTest < ActiveRecord::TestCase
316
362
  # Oracle supports precision up to 38 and it identifies decimals with scale 0 as integers
317
363
  if current_adapter?(:OracleAdapter)
318
364
  assert_match %r{t\.integer\s+"atoms_in_universe",\s+precision: 38}, output
319
- elsif current_adapter?(:IBM_DBAdapter)
320
- # DB2 supports precision up to 31
321
- assert_match %r{t.decimal\s+"atoms_in_universe",\s+precision: 31,\s+scale: 0}, output
322
- elsif current_adapter?(:FbAdapter)
323
- assert_match %r{t\.integer\s+"atoms_in_universe",\s+precision: 18}, output
365
+ elsif current_adapter?(:IBM_DBAdapter)
366
+ assert_match %r{t\.decimal\s+"atoms_in_universe",\s+precision: 31}, output
324
367
  else
325
368
  assert_match %r{t\.decimal\s+"atoms_in_universe",\s+precision: 55}, output
326
369
  end
@@ -336,7 +379,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
336
379
 
337
380
  def test_schema_dump_keeps_id_false_when_id_is_false_and_unique_not_null_column_added
338
381
  output = standard_dump
339
- assert_match %r{create_table "subscribers", id: false}, output
382
+ assert_match %r{create_table "string_key_objects", id: false}, output
340
383
  end
341
384
 
342
385
  if ActiveRecord::Base.connection.supports_foreign_keys?
@@ -358,9 +401,9 @@ class SchemaDumperTest < ActiveRecord::TestCase
358
401
 
359
402
  create_table("dogs") do |t|
360
403
  t.column :name, :string
361
- t.column :owner_id, :integer
404
+ t.references :owner
362
405
  t.index [:name]
363
- t.foreign_key :dog_owners, column: "owner_id" if supports_foreign_keys?
406
+ t.foreign_key :dog_owners, column: "owner_id"
364
407
  end
365
408
  end
366
409
  def down
@@ -371,8 +414,8 @@ class SchemaDumperTest < ActiveRecord::TestCase
371
414
 
372
415
  def test_schema_dump_with_table_name_prefix_and_suffix
373
416
  original, $stdout = $stdout, StringIO.new
374
- ActiveRecord::Base.table_name_prefix = 'foo_'
375
- ActiveRecord::Base.table_name_suffix = '_bar'
417
+ ActiveRecord::Base.table_name_prefix = "foo_"
418
+ ActiveRecord::Base.table_name_suffix = "_bar"
376
419
 
377
420
  migration = CreateDogMigration.new
378
421
  migration.migrate(:up)
@@ -390,7 +433,32 @@ class SchemaDumperTest < ActiveRecord::TestCase
390
433
  ensure
391
434
  migration.migrate(:down)
392
435
 
393
- ActiveRecord::Base.table_name_suffix = ActiveRecord::Base.table_name_prefix = ''
436
+ ActiveRecord::Base.table_name_suffix = ActiveRecord::Base.table_name_prefix = ""
437
+ $stdout = original
438
+ end
439
+
440
+ def test_schema_dump_with_table_name_prefix_and_suffix_regexp_escape
441
+ original, $stdout = $stdout, StringIO.new
442
+ ActiveRecord::Base.table_name_prefix = "foo$"
443
+ ActiveRecord::Base.table_name_suffix = "$bar"
444
+
445
+ migration = CreateDogMigration.new
446
+ migration.migrate(:up)
447
+
448
+ output = perform_schema_dump
449
+ assert_no_match %r{create_table "foo\$.+\$bar"}, output
450
+ assert_no_match %r{add_index "foo\$.+\$bar"}, output
451
+ assert_no_match %r{create_table "schema_migrations"}, output
452
+ assert_no_match %r{create_table "ar_internal_metadata"}, output
453
+
454
+ if ActiveRecord::Base.connection.supports_foreign_keys?
455
+ assert_no_match %r{add_foreign_key "foo\$.+\$bar"}, output
456
+ assert_no_match %r{add_foreign_key "[^"]+", "foo\$.+\$bar"}, output
457
+ end
458
+ ensure
459
+ migration.migrate(:down)
460
+
461
+ ActiveRecord::Base.table_name_suffix = ActiveRecord::Base.table_name_prefix = ""
394
462
  $stdout = original
395
463
  end
396
464
 
@@ -408,7 +476,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
408
476
 
409
477
  original_table_name_prefix = ActiveRecord::Base.table_name_prefix
410
478
  original_schema_dumper_ignore_tables = ActiveRecord::SchemaDumper.ignore_tables
411
- ActiveRecord::Base.table_name_prefix = 'omg_'
479
+ ActiveRecord::Base.table_name_prefix = "omg_"
412
480
  ActiveRecord::SchemaDumper.ignore_tables = ["cats"]
413
481
  migration = create_cat_migration.new
414
482
  migration.migrate(:up)
@@ -417,7 +485,7 @@ class SchemaDumperTest < ActiveRecord::TestCase
417
485
  output = ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream).string
418
486
 
419
487
  assert_match %r{create_table "omg_cats"}, output
420
- refute_match %r{create_table "cats"}, output
488
+ assert_no_match %r{create_table "cats"}, output
421
489
  ensure
422
490
  migration.migrate(:down)
423
491
  ActiveRecord::Base.table_name_prefix = original_table_name_prefix
@@ -432,26 +500,51 @@ class SchemaDumperDefaultsTest < ActiveRecord::TestCase
432
500
 
433
501
  setup do
434
502
  @connection = ActiveRecord::Base.connection
435
- @connection.create_table :defaults, force: true do |t|
503
+ @connection.create_table :dump_defaults, force: true do |t|
436
504
  t.string :string_with_default, default: "Hello!"
437
- t.date :date_with_default, default: '2014-06-05'
505
+ t.date :date_with_default, default: "2014-06-05"
438
506
  t.datetime :datetime_with_default, default: "2014-06-05 07:17:04"
439
507
  t.time :time_with_default, default: "07:17:04"
508
+ t.decimal :decimal_with_default, default: "1234567890.0123456789", precision: 20, scale: 10
509
+ t.text :text_with_default, default: "John' Doe" if supports_text_column_with_default?
510
+ end
511
+
512
+ if current_adapter?(:PostgreSQLAdapter)
513
+ @connection.create_table :infinity_defaults, force: true do |t|
514
+ t.float :float_with_inf_default, default: Float::INFINITY
515
+ t.float :float_with_nan_default, default: Float::NAN
516
+ t.datetime :beginning_of_time, default: "-infinity"
517
+ t.datetime :end_of_time, default: "infinity"
518
+ end
440
519
  end
441
520
  end
442
521
 
443
522
  teardown do
444
- return unless @connection
445
- @connection.drop_table 'defaults'
446
- #, if_exists: true
523
+ @connection.drop_table "dump_defaults", if_exists: true
447
524
  end
448
525
 
449
526
  def test_schema_dump_defaults_with_universally_supported_types
450
- output = dump_table_schema('defaults')
527
+ output = dump_table_schema("dump_defaults")
451
528
 
452
529
  assert_match %r{t\.string\s+"string_with_default",.*?default: "Hello!"}, output
453
- assert_match %r{t\.date\s+"date_with_default",\s+default: '2014-06-05'}, output
454
- assert_match %r{t\.datetime\s+"datetime_with_default",\s+default: '2014-06-05 07:17:04'}, output
455
- assert_match %r{t\.time\s+"time_with_default",\s+default: '2000-01-01 07:17:04'}, output
530
+ assert_match %r{t\.date\s+"date_with_default",\s+default: "2014-06-05"}, output
531
+ assert_match %r{t\.datetime\s+"datetime_with_default",\s+precision: 6,\s+default: "2014-06-05 07:17:04"}, output
532
+ assert_match %r{t\.time\s+"time_with_default",\s+default: "2000-01-01 07:17:04"}, output
533
+ assert_match %r{t\.decimal\s+"decimal_with_default",\s+precision: 20,\s+scale: 10,\s+default: "1234567890.0123456789"}, output
534
+ end
535
+
536
+ def test_schema_dump_with_text_column
537
+ output = dump_table_schema("dump_defaults")
538
+
539
+ assert_match %r{t\.text\s+"text_with_default",.*?default: "John' Doe"}, output
540
+ end if supports_text_column_with_default?
541
+
542
+ def test_schema_dump_with_column_infinity_default
543
+ skip unless current_adapter?(:PostgreSQLAdapter)
544
+ output = dump_table_schema("infinity_defaults")
545
+ assert_match %r{t\.float\s+"float_with_inf_default",\s+default: ::Float::INFINITY}, output
546
+ assert_match %r{t\.float\s+"float_with_nan_default",\s+default: ::Float::NAN}, output
547
+ assert_match %r{t\.datetime\s+"beginning_of_time",\s+default: -::Float::INFINITY}, output
548
+ assert_match %r{t\.datetime\s+"end_of_time",\s+default: ::Float::INFINITY}, output
456
549
  end
457
550
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
4
 
3
5
  module SchemaLoadCounter
@@ -8,7 +10,7 @@ module SchemaLoadCounter
8
10
 
9
11
  def load_schema!
10
12
  self.load_schema_calls ||= 0
11
- self.load_schema_calls +=1
13
+ self.load_schema_calls += 1
12
14
  super
13
15
  end
14
16
  end
@@ -41,7 +43,6 @@ class SchemaLoadingTest < ActiveRecord::TestCase
41
43
  end
42
44
 
43
45
  private
44
-
45
46
  def define_model
46
47
  Class.new(ActiveRecord::Base) do
47
48
  include SchemaLoadCounter