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,345 +1,417 @@
1
- require 'cases/helper'
2
- require 'active_record/tasks/database_tasks'
1
+ # frozen_string_literal: true
3
2
 
4
- if current_adapter?(:Mysql2Adapter)
5
- module ActiveRecord
6
- class MysqlDBCreateTest < ActiveRecord::TestCase
7
- def setup
8
- @connection = stub(:create_database => true)
9
- @configuration = {
10
- 'adapter' => 'mysql2',
11
- 'database' => 'my-app-db'
12
- }
13
-
14
- ActiveRecord::Base.stubs(:connection).returns(@connection)
15
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
16
-
17
- $stdout, @original_stdout = StringIO.new, $stdout
18
- $stderr, @original_stderr = StringIO.new, $stderr
19
- end
20
-
21
- def teardown
22
- $stdout, $stderr = @original_stdout, @original_stderr
23
- end
24
-
25
- def test_establishes_connection_without_database
26
- ActiveRecord::Base.expects(:establish_connection).
27
- with('adapter' => 'mysql2', 'database' => nil)
28
-
29
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
30
- end
31
-
32
- def test_creates_database_with_no_default_options
33
- @connection.expects(:create_database).
34
- with('my-app-db', {})
35
-
36
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
37
- end
38
-
39
- def test_creates_database_with_given_encoding
40
- @connection.expects(:create_database).
41
- with('my-app-db', charset: 'latin1')
42
-
43
- ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge('encoding' => 'latin1')
44
- end
45
-
46
- def test_creates_database_with_given_collation
47
- @connection.expects(:create_database).
48
- with('my-app-db', collation: 'latin1_swedish_ci')
3
+ require "cases/helper"
4
+ require "active_record/tasks/database_tasks"
49
5
 
50
- ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge('collation' => 'latin1_swedish_ci')
51
- end
52
-
53
- def test_establishes_connection_to_database
54
- ActiveRecord::Base.expects(:establish_connection).with(@configuration)
55
-
56
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
57
- end
58
-
59
- def test_when_database_created_successfully_outputs_info_to_stdout
60
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
61
-
62
- assert_equal $stdout.string, "Created database 'my-app-db'\n"
63
- end
64
-
65
- def test_create_when_database_exists_outputs_info_to_stderr
66
- ActiveRecord::Base.connection.stubs(:create_database).raises(
67
- ActiveRecord::Tasks::DatabaseAlreadyExists
68
- )
69
-
70
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
71
-
72
- assert_equal $stderr.string, "Database 'my-app-db' already exists\n"
73
- end
74
- end
75
-
76
- class MysqlDBCreateAsRootTest < ActiveRecord::TestCase
77
- def setup
78
- @connection = stub("Connection", create_database: true)
79
- @error = Mysql2::Error.new("Invalid permissions")
80
- @configuration = {
81
- 'adapter' => 'mysql2',
82
- 'database' => 'my-app-db',
83
- 'username' => 'pat',
84
- 'password' => 'wossname'
85
- }
86
-
87
- $stdin.stubs(:gets).returns("secret\n")
88
- $stdout.stubs(:print).returns(nil)
89
- @error.stubs(:errno).returns(1045)
90
- ActiveRecord::Base.stubs(:connection).returns(@connection)
91
- ActiveRecord::Base.stubs(:establish_connection).
92
- raises(@error).
93
- then.returns(true)
94
-
95
- $stdout, @original_stdout = StringIO.new, $stdout
96
- $stderr, @original_stderr = StringIO.new, $stderr
97
- end
98
-
99
- def teardown
100
- $stdout, $stderr = @original_stdout, @original_stderr
101
- end
102
-
103
- def test_root_password_is_requested
104
- assert_permissions_granted_for("pat")
105
- $stdin.expects(:gets).returns("secret\n")
106
-
107
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
108
- end
109
-
110
- def test_connection_established_as_root
111
- assert_permissions_granted_for("pat")
112
- ActiveRecord::Base.expects(:establish_connection).with(
113
- 'adapter' => 'mysql2',
114
- 'database' => nil,
115
- 'username' => 'root',
116
- 'password' => 'secret'
117
- )
118
-
119
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
120
- end
121
-
122
- def test_database_created_by_root
123
- assert_permissions_granted_for("pat")
124
- @connection.expects(:create_database).
125
- with('my-app-db', {})
126
-
127
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
128
- end
129
-
130
- def test_grant_privileges_for_normal_user
131
- assert_permissions_granted_for("pat")
132
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
133
- end
134
-
135
- def test_do_not_grant_privileges_for_root_user
136
- @configuration['username'] = 'root'
137
- @configuration['password'] = ''
138
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
139
- end
140
-
141
- def test_connection_established_as_normal_user
142
- assert_permissions_granted_for("pat")
143
- ActiveRecord::Base.expects(:establish_connection).returns do
144
- ActiveRecord::Base.expects(:establish_connection).with(
145
- 'adapter' => 'mysql2',
146
- 'database' => 'my-app-db',
147
- 'username' => 'pat',
148
- 'password' => 'secret'
149
- )
150
-
151
- raise @error
6
+ if current_adapter?(:Mysql2Adapter)
7
+ module ActiveRecord
8
+ class MysqlDBCreateTest < ActiveRecord::TestCase
9
+ def setup
10
+ @connection = Class.new do
11
+ def create_database(*); end
12
+ def error_number(_); end
13
+ end.new
14
+ @configuration = {
15
+ "adapter" => "mysql2",
16
+ "database" => "my-app-db"
17
+ }
18
+ $stdout, @original_stdout = StringIO.new, $stdout
19
+ $stderr, @original_stderr = StringIO.new, $stderr
152
20
  end
153
21
 
154
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
155
- end
156
-
157
- def test_sends_output_to_stderr_when_other_errors
158
- @error.stubs(:errno).returns(42)
159
-
160
- $stderr.expects(:puts).at_least_once.returns(nil)
22
+ def teardown
23
+ $stdout, $stderr = @original_stdout, @original_stderr
24
+ end
161
25
 
162
- ActiveRecord::Tasks::DatabaseTasks.create @configuration
163
- end
26
+ def test_establishes_connection_without_database
27
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
28
+
29
+ ActiveRecord::Base.stub(:connection, @connection) do
30
+ assert_called_with(
31
+ ActiveRecord::Base,
32
+ :establish_connection,
33
+ [
34
+ [adapter: "mysql2", database: nil],
35
+ [db_config]
36
+ ]
37
+ ) do
38
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
39
+ end
40
+ end
41
+ end
164
42
 
165
- private
43
+ def test_creates_database_with_no_default_options
44
+ with_stubbed_connection_establish_connection do
45
+ assert_called_with(@connection, :create_database, ["my-app-db", {}]) do
46
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
47
+ end
48
+ end
49
+ end
166
50
 
167
- def assert_permissions_granted_for(db_user)
168
- db_name = @configuration['database']
169
- db_password = @configuration['password']
170
- @connection.expects(:execute).with("GRANT ALL PRIVILEGES ON #{db_name}.* TO '#{db_user}'@'localhost' IDENTIFIED BY '#{db_password}' WITH GRANT OPTION;")
171
- end
172
- end
51
+ def test_creates_database_with_given_encoding
52
+ with_stubbed_connection_establish_connection do
53
+ assert_called_with(@connection, :create_database, ["my-app-db", charset: "latin1"]) do
54
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge("encoding" => "latin1")
55
+ end
56
+ end
57
+ end
173
58
 
174
- class MySQLDBDropTest < ActiveRecord::TestCase
175
- def setup
176
- @connection = stub(:drop_database => true)
177
- @configuration = {
178
- 'adapter' => 'mysql2',
179
- 'database' => 'my-app-db'
180
- }
59
+ def test_creates_database_with_given_collation
60
+ with_stubbed_connection_establish_connection do
61
+ assert_called_with(
62
+ @connection,
63
+ :create_database,
64
+ ["my-app-db", collation: "latin1_swedish_ci"]
65
+ ) do
66
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge("collation" => "latin1_swedish_ci")
67
+ end
68
+ end
69
+ end
181
70
 
182
- ActiveRecord::Base.stubs(:connection).returns(@connection)
183
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
71
+ def test_establishes_connection_to_database
72
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
73
+
74
+ ActiveRecord::Base.stub(:connection, @connection) do
75
+ assert_called_with(
76
+ ActiveRecord::Base,
77
+ :establish_connection,
78
+ [
79
+ [adapter: "mysql2", database: nil],
80
+ [db_config]
81
+ ]
82
+ ) do
83
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
84
+ end
85
+ end
86
+ end
184
87
 
185
- $stdout, @original_stdout = StringIO.new, $stdout
186
- $stderr, @original_stderr = StringIO.new, $stderr
187
- end
88
+ def test_when_database_created_successfully_outputs_info_to_stdout
89
+ with_stubbed_connection_establish_connection do
90
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
188
91
 
189
- def teardown
190
- $stdout, $stderr = @original_stdout, @original_stderr
191
- end
92
+ assert_equal "Created database 'my-app-db'\n", $stdout.string
93
+ end
94
+ end
192
95
 
193
- def test_establishes_connection_to_mysql_database
194
- ActiveRecord::Base.expects(:establish_connection).with @configuration
96
+ def test_create_when_database_exists_outputs_info_to_stderr
97
+ with_stubbed_connection_establish_connection do
98
+ ActiveRecord::Base.connection.stub(
99
+ :create_database,
100
+ proc { raise ActiveRecord::DatabaseAlreadyExists }
101
+ ) do
102
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
103
+
104
+ assert_equal "Database 'my-app-db' already exists\n", $stderr.string
105
+ end
106
+ end
107
+ end
195
108
 
196
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration
197
- end
109
+ private
110
+ def with_stubbed_connection_establish_connection
111
+ ActiveRecord::Base.stub(:establish_connection, nil) do
112
+ ActiveRecord::Base.stub(:connection, @connection) do
113
+ yield
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ class MysqlDBCreateWithInvalidPermissionsTest < ActiveRecord::TestCase
120
+ def setup
121
+ @error = Mysql2::Error.new("Invalid permissions")
122
+ @configuration = {
123
+ "adapter" => "mysql2",
124
+ "database" => "my-app-db",
125
+ "username" => "pat",
126
+ "password" => "wossname"
127
+ }
128
+ $stdout, @original_stdout = StringIO.new, $stdout
129
+ $stderr, @original_stderr = StringIO.new, $stderr
130
+ end
198
131
 
199
- def test_drops_database
200
- @connection.expects(:drop_database).with('my-app-db')
132
+ def teardown
133
+ $stdout, $stderr = @original_stdout, @original_stderr
134
+ end
201
135
 
202
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration
136
+ def test_raises_error
137
+ ActiveRecord::Base.stub(:establish_connection, -> * { raise @error }) do
138
+ assert_raises(Mysql2::Error, "Invalid permissions") do
139
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration
140
+ end
141
+ end
142
+ end
203
143
  end
204
144
 
205
- def test_when_database_dropped_successfully_outputs_info_to_stdout
206
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration
207
-
208
- assert_equal $stdout.string, "Dropped database 'my-app-db'\n"
209
- end
210
- end
145
+ class MySQLDBDropTest < ActiveRecord::TestCase
146
+ def setup
147
+ @connection = Class.new { def drop_database(name); end }.new
148
+ @configuration = {
149
+ "adapter" => "mysql2",
150
+ "database" => "my-app-db"
151
+ }
152
+ $stdout, @original_stdout = StringIO.new, $stdout
153
+ $stderr, @original_stderr = StringIO.new, $stderr
154
+ end
211
155
 
212
- class MySQLPurgeTest < ActiveRecord::TestCase
213
- def setup
214
- @connection = stub(:recreate_database => true)
215
- @configuration = {
216
- 'adapter' => 'mysql2',
217
- 'database' => 'test-db'
218
- }
156
+ def teardown
157
+ $stdout, $stderr = @original_stdout, @original_stderr
158
+ end
219
159
 
220
- ActiveRecord::Base.stubs(:connection).returns(@connection)
221
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
222
- end
160
+ def test_establishes_connection_to_mysql_database
161
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
162
+
163
+ ActiveRecord::Base.stub(:connection, @connection) do
164
+ assert_called_with(
165
+ ActiveRecord::Base,
166
+ :establish_connection,
167
+ [db_config]
168
+ ) do
169
+ ActiveRecord::Tasks::DatabaseTasks.drop(db_config)
170
+ end
171
+ end
172
+ end
223
173
 
224
- def test_establishes_connection_to_the_appropriate_database
225
- ActiveRecord::Base.expects(:establish_connection).with(@configuration)
174
+ def test_drops_database
175
+ with_stubbed_connection_establish_connection do
176
+ assert_called_with(@connection, :drop_database, ["my-app-db"]) do
177
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
178
+ end
179
+ end
180
+ end
226
181
 
227
- ActiveRecord::Tasks::DatabaseTasks.purge @configuration
228
- end
182
+ def test_when_database_dropped_successfully_outputs_info_to_stdout
183
+ with_stubbed_connection_establish_connection do
184
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration
229
185
 
230
- def test_recreates_database_with_no_default_options
231
- @connection.expects(:recreate_database).
232
- with('test-db', {})
186
+ assert_equal "Dropped database 'my-app-db'\n", $stdout.string
187
+ end
188
+ end
233
189
 
234
- ActiveRecord::Tasks::DatabaseTasks.purge @configuration
235
- end
190
+ private
191
+ def with_stubbed_connection_establish_connection
192
+ ActiveRecord::Base.stub(:establish_connection, nil) do
193
+ ActiveRecord::Base.stub(:connection, @connection) do
194
+ yield
195
+ end
196
+ end
197
+ end
198
+ end
199
+
200
+ class MySQLPurgeTest < ActiveRecord::TestCase
201
+ def setup
202
+ @connection = Class.new { def recreate_database(*); end }.new
203
+ @configuration = {
204
+ "adapter" => "mysql2",
205
+ "database" => "test-db"
206
+ }
207
+ end
236
208
 
237
- def test_recreates_database_with_the_given_options
238
- @connection.expects(:recreate_database).
239
- with('test-db', charset: 'latin', collation: 'latin1_swedish_ci')
209
+ def test_establishes_connection_to_the_appropriate_database
210
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("default_env", "primary", @configuration)
211
+
212
+ ActiveRecord::Base.stub(:connection, @connection) do
213
+ assert_called_with(
214
+ ActiveRecord::Base,
215
+ :establish_connection,
216
+ [db_config]
217
+ ) do
218
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
219
+ end
220
+ end
221
+ end
240
222
 
241
- ActiveRecord::Tasks::DatabaseTasks.purge @configuration.merge(
242
- 'encoding' => 'latin', 'collation' => 'latin1_swedish_ci')
243
- end
244
- end
223
+ def test_recreates_database_with_no_default_options
224
+ with_stubbed_connection_establish_connection do
225
+ assert_called_with(@connection, :recreate_database, ["test-db", {}]) do
226
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration
227
+ end
228
+ end
229
+ end
245
230
 
246
- class MysqlDBCharsetTest < ActiveRecord::TestCase
247
- def setup
248
- @connection = stub(:create_database => true)
249
- @configuration = {
250
- 'adapter' => 'mysql2',
251
- 'database' => 'my-app-db'
252
- }
231
+ def test_recreates_database_with_the_given_options
232
+ with_stubbed_connection_establish_connection do
233
+ assert_called_with(
234
+ @connection,
235
+ :recreate_database,
236
+ ["test-db", charset: "latin", collation: "latin1_swedish_ci"]
237
+ ) do
238
+ ActiveRecord::Tasks::DatabaseTasks.purge @configuration.merge(
239
+ "encoding" => "latin", "collation" => "latin1_swedish_ci")
240
+ end
241
+ end
242
+ end
253
243
 
254
- ActiveRecord::Base.stubs(:connection).returns(@connection)
255
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
256
- end
244
+ private
245
+ def with_stubbed_connection_establish_connection
246
+ ActiveRecord::Base.stub(:establish_connection, nil) do
247
+ ActiveRecord::Base.stub(:connection, @connection) do
248
+ yield
249
+ end
250
+ end
251
+ end
252
+ end
253
+
254
+ class MysqlDBCharsetTest < ActiveRecord::TestCase
255
+ def setup
256
+ @connection = Class.new { def charset; end }.new
257
+ @configuration = {
258
+ "adapter" => "mysql2",
259
+ "database" => "my-app-db"
260
+ }
261
+ end
257
262
 
258
- def test_db_retrieves_charset
259
- @connection.expects(:charset)
260
- ActiveRecord::Tasks::DatabaseTasks.charset @configuration
263
+ def test_db_retrieves_charset
264
+ ActiveRecord::Base.stub(:connection, @connection) do
265
+ assert_called(@connection, :charset) do
266
+ ActiveRecord::Tasks::DatabaseTasks.charset @configuration
267
+ end
268
+ end
269
+ end
261
270
  end
262
- end
263
-
264
- class MysqlDBCollationTest < ActiveRecord::TestCase
265
- def setup
266
- @connection = stub(:create_database => true)
267
- @configuration = {
268
- 'adapter' => 'mysql2',
269
- 'database' => 'my-app-db'
270
- }
271
271
 
272
- ActiveRecord::Base.stubs(:connection).returns(@connection)
273
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
274
- end
272
+ class MysqlDBCollationTest < ActiveRecord::TestCase
273
+ def setup
274
+ @connection = Class.new { def collation; end }.new
275
+ @configuration = {
276
+ "adapter" => "mysql2",
277
+ "database" => "my-app-db"
278
+ }
279
+ end
275
280
 
276
- def test_db_retrieves_collation
277
- @connection.expects(:collation)
278
- ActiveRecord::Tasks::DatabaseTasks.collation @configuration
281
+ def test_db_retrieves_collation
282
+ ActiveRecord::Base.stub(:connection, @connection) do
283
+ assert_called(@connection, :collation) do
284
+ ActiveRecord::Tasks::DatabaseTasks.collation @configuration
285
+ end
286
+ end
287
+ end
279
288
  end
280
- end
281
289
 
282
- class MySQLStructureDumpTest < ActiveRecord::TestCase
283
- def setup
284
- @configuration = {
285
- 'adapter' => 'mysql2',
286
- 'database' => 'test-db'
287
- }
288
- end
290
+ class MySQLStructureDumpTest < ActiveRecord::TestCase
291
+ def setup
292
+ @configuration = {
293
+ "adapter" => "mysql2",
294
+ "database" => "test-db"
295
+ }
296
+ end
289
297
 
290
- def test_structure_dump
291
- filename = "awesome-file.sql"
292
- Kernel.expects(:system).with("mysqldump", "--result-file", filename, "--no-data", "--routines", "test-db").returns(true)
298
+ def test_structure_dump
299
+ filename = "awesome-file.sql"
300
+ assert_called_with(
301
+ Kernel,
302
+ :system,
303
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
304
+ returns: true
305
+ ) do
306
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
307
+ end
308
+ end
293
309
 
294
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
295
- end
310
+ def test_structure_dump_with_extra_flags
311
+ filename = "awesome-file.sql"
312
+ expected_command = ["mysqldump", "--noop", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"]
296
313
 
297
- def test_warn_when_external_structure_dump_command_execution_fails
298
- filename = "awesome-file.sql"
299
- Kernel.expects(:system)
300
- .with("mysqldump", "--result-file", filename, "--no-data", "--routines", "test-db")
301
- .returns(false)
314
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
315
+ with_structure_dump_flags(["--noop"]) do
316
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
317
+ end
318
+ end
319
+ end
302
320
 
303
- e = assert_raise(RuntimeError) {
304
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
305
- }
306
- assert_match(/^failed to execute: `mysqldump`$/, e.message)
307
- end
321
+ def test_structure_dump_with_ignore_tables
322
+ filename = "awesome-file.sql"
323
+ ActiveRecord::SchemaDumper.stub(:ignore_tables, ["foo", "bar"]) do
324
+ assert_called_with(
325
+ Kernel,
326
+ :system,
327
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "--ignore-table=test-db.foo", "--ignore-table=test-db.bar", "test-db"],
328
+ returns: true
329
+ ) do
330
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
331
+ end
332
+ end
333
+ end
308
334
 
309
- def test_structure_dump_with_port_number
310
- filename = "awesome-file.sql"
311
- Kernel.expects(:system).with("mysqldump", "--port=10000", "--result-file", filename, "--no-data", "--routines", "test-db").returns(true)
335
+ def test_warn_when_external_structure_dump_command_execution_fails
336
+ filename = "awesome-file.sql"
337
+ assert_called_with(
338
+ Kernel,
339
+ :system,
340
+ ["mysqldump", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
341
+ returns: false
342
+ ) do
343
+ e = assert_raise(RuntimeError) {
344
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
345
+ }
346
+ assert_match(/^failed to execute: `mysqldump`$/, e.message)
347
+ end
348
+ end
312
349
 
313
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(
314
- @configuration.merge('port' => 10000),
315
- filename)
316
- end
350
+ def test_structure_dump_with_port_number
351
+ filename = "awesome-file.sql"
352
+ assert_called_with(
353
+ Kernel,
354
+ :system,
355
+ ["mysqldump", "--port=10000", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
356
+ returns: true
357
+ ) do
358
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
359
+ @configuration.merge("port" => 10000),
360
+ filename)
361
+ end
362
+ end
317
363
 
318
- def test_structure_dump_with_ssl
319
- filename = "awesome-file.sql"
320
- Kernel.expects(:system).with("mysqldump", "--ssl-ca=ca.crt", "--result-file", filename, "--no-data", "--routines", "test-db").returns(true)
364
+ def test_structure_dump_with_ssl
365
+ filename = "awesome-file.sql"
366
+ assert_called_with(
367
+ Kernel,
368
+ :system,
369
+ ["mysqldump", "--ssl-ca=ca.crt", "--result-file", filename, "--no-data", "--routines", "--skip-comments", "test-db"],
370
+ returns: true
371
+ ) do
372
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(
373
+ @configuration.merge("sslca" => "ca.crt"),
374
+ filename)
375
+ end
376
+ end
321
377
 
322
- ActiveRecord::Tasks::DatabaseTasks.structure_dump(
323
- @configuration.merge("sslca" => "ca.crt"),
324
- filename)
325
- end
326
- end
378
+ private
379
+ def with_structure_dump_flags(flags)
380
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags
381
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
382
+ yield
383
+ ensure
384
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = old
385
+ end
386
+ end
387
+
388
+ class MySQLStructureLoadTest < ActiveRecord::TestCase
389
+ def setup
390
+ @configuration = {
391
+ "adapter" => "mysql2",
392
+ "database" => "test-db"
393
+ }
394
+ end
327
395
 
328
- class MySQLStructureLoadTest < ActiveRecord::TestCase
329
- def setup
330
- @configuration = {
331
- 'adapter' => 'mysql2',
332
- 'database' => 'test-db'
333
- }
334
- end
396
+ def test_structure_load
397
+ filename = "awesome-file.sql"
398
+ expected_command = ["mysql", "--noop", "--execute", %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}, "--database", "test-db"]
335
399
 
336
- def test_structure_load
337
- filename = "awesome-file.sql"
338
- Kernel.expects(:system).with('mysql', '--execute', %{SET FOREIGN_KEY_CHECKS = 0; SOURCE #{filename}; SET FOREIGN_KEY_CHECKS = 1}, "--database", "test-db")
339
- .returns(true)
400
+ assert_called_with(Kernel, :system, expected_command, returns: true) do
401
+ with_structure_load_flags(["--noop"]) do
402
+ ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
403
+ end
404
+ end
405
+ end
340
406
 
341
- ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
407
+ private
408
+ def with_structure_load_flags(flags)
409
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_load_flags
410
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = flags
411
+ yield
412
+ ensure
413
+ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = old
414
+ end
342
415
  end
343
416
  end
344
417
  end
345
- end