ibm_db 5.6.1 → 5.7.0

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 (592) hide show
  1. checksums.yaml +4 -4
  2. data/ext/Makefile +13 -9
  3. data/ext/extconf.rb +176 -110
  4. data/ext/ibm_db.c +60 -0
  5. data/ext/ibm_db.o +0 -0
  6. data/ext/ibm_db.so +0 -0
  7. data/ext/mkmf.log +6 -6
  8. data/ext/ruby_ibm_db_cli.c +14 -10
  9. data/ext/ruby_ibm_db_cli.h +4 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/IBM_DB.rb +2 -2
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1254 -277
  13. data/test/active_record/connection_adapters/fake_legacy_adapter.rb +17 -0
  14. data/test/active_record/connection_adapters/fake_misleading_legacy_adapter.rb +8 -0
  15. data/test/activejob/destroy_association_async_job_test.rb +62 -0
  16. data/test/activejob/destroy_association_async_test.rb +147 -11
  17. data/test/activejob/job_runtime_test.rb +41 -0
  18. data/test/activejob/unloadable_base_job.rb +3 -0
  19. data/test/cases/active_record_schema_test.rb +196 -0
  20. data/test/cases/active_record_test.rb +21 -0
  21. data/test/cases/adapter_prevent_writes_test.rb +26 -202
  22. data/test/cases/adapter_test.rb +592 -82
  23. data/test/cases/adapters/abstract_mysql_adapter/active_schema_test.rb +210 -0
  24. data/test/cases/adapters/abstract_mysql_adapter/adapter_prevent_writes_test.rb +111 -0
  25. data/test/cases/adapters/abstract_mysql_adapter/auto_increment_test.rb +48 -0
  26. data/test/cases/adapters/abstract_mysql_adapter/bind_parameter_test.rb +91 -0
  27. data/test/cases/adapters/abstract_mysql_adapter/case_sensitivity_test.rb +65 -0
  28. data/test/cases/adapters/abstract_mysql_adapter/charset_collation_test.rb +85 -0
  29. data/test/cases/adapters/abstract_mysql_adapter/connection_test.rb +267 -0
  30. data/test/cases/adapters/abstract_mysql_adapter/count_deleted_rows_with_lock_test.rb +29 -0
  31. data/test/cases/adapters/abstract_mysql_adapter/json_test.rb +24 -0
  32. data/test/cases/adapters/abstract_mysql_adapter/mysql_boolean_test.rb +102 -0
  33. data/test/cases/adapters/abstract_mysql_adapter/mysql_enum_test.rb +47 -0
  34. data/test/cases/adapters/abstract_mysql_adapter/mysql_explain_test.rb +71 -0
  35. data/test/cases/adapters/abstract_mysql_adapter/nested_deadlock_test.rb +191 -0
  36. data/test/cases/adapters/abstract_mysql_adapter/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/abstract_mysql_adapter/quoting_test.rb +49 -0
  38. data/test/cases/adapters/abstract_mysql_adapter/schema_migrations_test.rb +68 -0
  39. data/test/cases/adapters/abstract_mysql_adapter/schema_test.rb +130 -0
  40. data/test/cases/adapters/abstract_mysql_adapter/set_test.rb +32 -0
  41. data/test/cases/adapters/abstract_mysql_adapter/sp_test.rb +39 -0
  42. data/test/cases/adapters/abstract_mysql_adapter/sql_types_test.rb +16 -0
  43. data/test/cases/adapters/abstract_mysql_adapter/table_options_test.rb +125 -0
  44. data/test/cases/adapters/abstract_mysql_adapter/transaction_test.rb +204 -0
  45. data/test/cases/adapters/abstract_mysql_adapter/unsigned_type_test.rb +77 -0
  46. data/test/cases/adapters/abstract_mysql_adapter/virtual_column_test.rb +69 -0
  47. data/test/cases/adapters/abstract_mysql_adapter/warnings_test.rb +109 -0
  48. data/test/cases/adapters/mysql2/check_constraint_quoting_test.rb +35 -0
  49. data/test/cases/adapters/mysql2/dbconsole_test.rb +87 -0
  50. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +136 -10
  51. data/test/cases/adapters/mysql2/mysql2_rake_test.rb +433 -0
  52. data/test/cases/adapters/postgresql/active_schema_test.rb +8 -4
  53. data/test/cases/adapters/postgresql/array_test.rb +6 -6
  54. data/test/cases/adapters/postgresql/bind_parameter_test.rb +52 -0
  55. data/test/cases/adapters/postgresql/bit_string_test.rb +2 -2
  56. data/test/cases/adapters/postgresql/bytea_test.rb +3 -3
  57. data/test/cases/adapters/postgresql/case_insensitive_test.rb +1 -1
  58. data/test/cases/adapters/postgresql/change_schema_test.rb +32 -1
  59. data/test/cases/adapters/postgresql/cidr_test.rb +17 -0
  60. data/test/cases/adapters/postgresql/citext_test.rb +7 -1
  61. data/test/cases/adapters/postgresql/collation_test.rb +1 -1
  62. data/test/cases/adapters/postgresql/composite_test.rb +1 -1
  63. data/test/cases/adapters/postgresql/connection_test.rb +43 -36
  64. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +3 -2
  65. data/test/cases/adapters/postgresql/datatype_test.rb +9 -4
  66. data/test/cases/adapters/postgresql/date_test.rb +2 -2
  67. data/test/cases/adapters/postgresql/dbconsole_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/deferred_constraints_test.rb +55 -0
  69. data/test/cases/adapters/postgresql/domain_test.rb +1 -1
  70. data/test/cases/adapters/postgresql/enum_test.rb +208 -8
  71. data/test/cases/adapters/postgresql/explain_test.rb +25 -6
  72. data/test/cases/adapters/postgresql/extension_migration_test.rb +51 -9
  73. data/test/cases/adapters/postgresql/foreign_table_test.rb +3 -3
  74. data/test/cases/adapters/postgresql/full_text_test.rb +1 -1
  75. data/test/cases/adapters/postgresql/geometric_test.rb +13 -6
  76. data/test/cases/adapters/postgresql/hstore_test.rb +22 -32
  77. data/test/cases/adapters/postgresql/infinity_test.rb +13 -2
  78. data/test/cases/adapters/postgresql/integer_test.rb +1 -1
  79. data/test/cases/adapters/postgresql/interval_test.rb +9 -17
  80. data/test/cases/adapters/postgresql/invertible_migration_test.rb +139 -0
  81. data/test/cases/adapters/postgresql/json_test.rb +5 -0
  82. data/test/cases/adapters/postgresql/ltree_test.rb +1 -1
  83. data/test/cases/adapters/postgresql/money_test.rb +17 -9
  84. data/test/cases/adapters/postgresql/network_test.rb +13 -1
  85. data/test/cases/adapters/postgresql/numbers_test.rb +18 -2
  86. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +9 -9
  87. data/test/cases/adapters/postgresql/partitions_test.rb +5 -2
  88. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +7 -110
  89. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +403 -20
  90. data/test/cases/adapters/postgresql/postgresql_rake_test.rb +637 -0
  91. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +1 -1
  92. data/test/cases/adapters/postgresql/quoting_test.rb +60 -1
  93. data/test/cases/adapters/postgresql/range_test.rb +185 -21
  94. data/test/cases/adapters/postgresql/referential_integrity_test.rb +29 -5
  95. data/test/cases/adapters/postgresql/rename_table_test.rb +35 -8
  96. data/test/cases/adapters/postgresql/schema_authorization_test.rb +2 -2
  97. data/test/cases/adapters/postgresql/schema_test.rb +270 -20
  98. data/test/cases/adapters/postgresql/serial_test.rb +5 -5
  99. data/test/cases/adapters/postgresql/statement_pool_test.rb +6 -2
  100. data/test/cases/adapters/postgresql/timestamp_test.rb +122 -5
  101. data/test/cases/adapters/postgresql/transaction_nested_test.rb +130 -6
  102. data/test/cases/adapters/postgresql/transaction_test.rb +37 -11
  103. data/test/cases/adapters/postgresql/type_lookup_test.rb +1 -1
  104. data/test/cases/adapters/postgresql/uuid_test.rb +77 -9
  105. data/test/cases/adapters/postgresql/virtual_column_test.rb +114 -0
  106. data/test/cases/adapters/postgresql/xml_test.rb +1 -1
  107. data/test/cases/adapters/sqlite3/bind_parameter_test.rb +52 -0
  108. data/test/cases/adapters/sqlite3/collation_test.rb +1 -1
  109. data/test/cases/adapters/sqlite3/copy_table_test.rb +28 -7
  110. data/test/cases/adapters/sqlite3/dbconsole_test.rb +81 -0
  111. data/test/cases/adapters/sqlite3/explain_test.rb +3 -3
  112. data/test/cases/adapters/sqlite3/quoting_test.rb +34 -3
  113. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +9 -102
  114. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +727 -72
  115. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +6 -3
  116. data/test/cases/adapters/sqlite3/sqlite_rake_test.rb +264 -0
  117. data/test/cases/adapters/sqlite3/statement_pool_test.rb +1 -1
  118. data/test/cases/adapters/sqlite3/transaction_test.rb +6 -3
  119. data/test/cases/adapters/sqlite3/virtual_column_test.rb +138 -0
  120. data/test/cases/adapters/sqlite3/virtual_table_test.rb +51 -0
  121. data/test/cases/adapters/trilogy/dbconsole_test.rb +76 -0
  122. data/test/cases/adapters/trilogy/trilogy_adapter_test.rb +473 -0
  123. data/test/cases/adapters/trilogy/trilogy_rake_test.rb +433 -0
  124. data/test/cases/aggregations_test.rb +16 -0
  125. data/test/cases/annotate_test.rb +14 -12
  126. data/test/cases/arel/attributes/attribute_test.rb +86 -47
  127. data/test/cases/arel/collectors/bind_test.rb +1 -1
  128. data/test/cases/arel/collectors/composite_test.rb +11 -1
  129. data/test/cases/arel/collectors/sql_string_test.rb +1 -1
  130. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +1 -1
  131. data/test/cases/arel/delete_manager_test.rb +0 -6
  132. data/test/cases/arel/factory_methods_test.rb +45 -0
  133. data/test/cases/arel/insert_manager_test.rb +1 -7
  134. data/test/cases/arel/nodes/as_test.rb +12 -0
  135. data/test/cases/arel/nodes/ascending_test.rb +1 -1
  136. data/test/cases/arel/nodes/bin_test.rb +1 -1
  137. data/test/cases/arel/nodes/bound_sql_literal_test.rb +31 -0
  138. data/test/cases/arel/nodes/cte_test.rb +46 -0
  139. data/test/cases/arel/nodes/descending_test.rb +1 -1
  140. data/test/cases/arel/nodes/equality_test.rb +3 -3
  141. data/test/cases/arel/nodes/filter_test.rb +37 -0
  142. data/test/cases/arel/nodes/fragments_test.rb +38 -0
  143. data/test/cases/arel/nodes/homogeneous_in_test.rb +52 -0
  144. data/test/cases/arel/nodes/infix_operation_test.rb +1 -1
  145. data/test/cases/arel/nodes/node_test.rb +1 -1
  146. data/test/cases/arel/nodes/or_test.rb +2 -2
  147. data/test/cases/arel/nodes/sql_literal_test.rb +18 -1
  148. data/test/cases/arel/nodes/table_alias_test.rb +12 -0
  149. data/test/cases/arel/nodes/unary_operation_test.rb +1 -1
  150. data/test/cases/arel/nodes/update_statement_test.rb +4 -0
  151. data/test/cases/arel/nodes_test.rb +3 -2
  152. data/test/cases/arel/select_manager_test.rb +12 -12
  153. data/test/cases/arel/support/fake_record.rb +22 -17
  154. data/test/cases/arel/table_test.rb +15 -25
  155. data/test/cases/arel/update_manager_test.rb +51 -6
  156. data/test/cases/arel/visitors/dispatch_contamination_test.rb +1 -1
  157. data/test/cases/arel/visitors/dot_test.rb +177 -2
  158. data/test/cases/arel/visitors/mysql_test.rb +49 -1
  159. data/test/cases/arel/visitors/postgres_test.rb +1 -31
  160. data/test/cases/arel/visitors/sqlite_test.rb +1 -1
  161. data/test/cases/arel/visitors/to_sql_test.rb +330 -20
  162. data/test/cases/assertions/query_assertions_test.rb +136 -0
  163. data/test/cases/associations/belongs_to_associations_test.rb +502 -41
  164. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +1 -1
  165. data/test/cases/associations/cascaded_eager_loading_test.rb +26 -15
  166. data/test/cases/associations/eager_load_nested_include_test.rb +1 -1
  167. data/test/cases/associations/eager_singularization_test.rb +1 -1
  168. data/test/cases/associations/eager_test.rb +255 -93
  169. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +25 -53
  170. data/test/cases/associations/has_many_associations_test.rb +282 -72
  171. data/test/cases/associations/has_many_through_associations_test.rb +172 -45
  172. data/test/cases/associations/has_many_through_disable_joins_associations_test.rb +197 -0
  173. data/test/cases/associations/has_one_associations_test.rb +160 -29
  174. data/test/cases/associations/has_one_through_associations_test.rb +64 -15
  175. data/test/cases/associations/has_one_through_disable_joins_associations_test.rb +82 -0
  176. data/test/cases/associations/inner_join_association_test.rb +36 -6
  177. data/test/cases/associations/inverse_associations_test.rb +177 -40
  178. data/test/cases/associations/join_model_test.rb +17 -12
  179. data/test/cases/associations/left_outer_join_association_test.rb +14 -3
  180. data/test/cases/associations/nested_error_test.rb +116 -0
  181. data/test/cases/associations/nested_through_associations_test.rb +54 -19
  182. data/test/cases/associations/required_test.rb +1 -1
  183. data/test/cases/associations_test.rb +1278 -21
  184. data/test/cases/asynchronous_queries_test.rb +310 -0
  185. data/test/cases/attribute_methods/read_test.rb +6 -0
  186. data/test/cases/attribute_methods/time_zone_converter_test.rb +21 -0
  187. data/test/cases/attribute_methods_test.rb +565 -46
  188. data/test/cases/attributes_test.rb +42 -1
  189. data/test/cases/autosave_association_test.rb +645 -92
  190. data/test/cases/base_prevent_writes_test.rb +28 -159
  191. data/test/cases/base_test.rb +434 -209
  192. data/test/cases/batches_test.rb +441 -57
  193. data/test/cases/binary_test.rb +31 -0
  194. data/test/cases/bind_parameter_test.rb +107 -16
  195. data/test/cases/cache_key_test.rb +7 -7
  196. data/test/cases/calculations_test.rb +541 -110
  197. data/test/cases/callbacks_test.rb +0 -1
  198. data/test/cases/clone_test.rb +5 -4
  199. data/test/cases/coders/yaml_column_test.rb +97 -2
  200. data/test/cases/collection_cache_key_test.rb +24 -16
  201. data/test/cases/column_alias_test.rb +2 -8
  202. data/test/cases/column_definition_test.rb +12 -3
  203. data/test/cases/comment_test.rb +23 -26
  204. data/test/cases/connection_adapters/adapter_leasing_test.rb +9 -9
  205. data/test/cases/connection_adapters/connection_handler_test.rb +145 -99
  206. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +79 -55
  207. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +17 -20
  208. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +146 -55
  209. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +136 -23
  210. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +96 -27
  211. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -5
  212. data/test/cases/connection_adapters/registration_test.rb +98 -0
  213. data/test/cases/connection_adapters/schema_cache_test.rb +288 -135
  214. data/test/cases/connection_adapters/standalone_connection_test.rb +38 -0
  215. data/test/cases/connection_adapters/statement_pool_test.rb +29 -0
  216. data/test/cases/connection_adapters/type_lookup_test.rb +12 -24
  217. data/test/cases/connection_handling_test.rb +210 -0
  218. data/test/cases/connection_management_test.rb +44 -7
  219. data/test/cases/connection_pool_test.rb +466 -99
  220. data/test/cases/core_test.rb +167 -9
  221. data/test/cases/counter_cache_test.rb +129 -2
  222. data/test/cases/custom_locking_test.rb +3 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +149 -13
  224. data/test/cases/database_configurations/resolver_test.rb +14 -10
  225. data/test/cases/database_configurations/url_config_test.rb +53 -0
  226. data/test/cases/database_configurations_test.rb +86 -43
  227. data/test/cases/database_selector_test.rb +30 -8
  228. data/test/cases/database_statements_test.rb +10 -14
  229. data/test/cases/date_time_precision_test.rb +141 -11
  230. data/test/cases/date_time_test.rb +19 -1
  231. data/test/cases/defaults_test.rb +107 -41
  232. data/test/cases/delegated_type_test.rb +69 -9
  233. data/test/cases/dirty_test.rb +82 -25
  234. data/test/cases/disconnected_test.rb +10 -9
  235. data/test/cases/dup_test.rb +26 -6
  236. data/test/cases/encryption/cipher/aes256_gcm_test.rb +50 -0
  237. data/test/cases/encryption/cipher_test.rb +65 -0
  238. data/test/cases/encryption/concurrency_test.rb +27 -0
  239. data/test/cases/encryption/config_test.rb +21 -0
  240. data/test/cases/encryption/configurable_test.rb +93 -0
  241. data/test/cases/encryption/contexts_test.rb +105 -0
  242. data/test/cases/encryption/derived_secret_key_provider_test.rb +31 -0
  243. data/test/cases/encryption/deterministic_key_provider_test.rb +11 -0
  244. data/test/cases/encryption/encryptable_record_api_test.rb +175 -0
  245. data/test/cases/encryption/encryptable_record_message_pack_serialized_test.rb +42 -0
  246. data/test/cases/encryption/encryptable_record_test.rb +470 -0
  247. data/test/cases/encryption/encrypted_fixtures_test.rb +22 -0
  248. data/test/cases/encryption/encrypting_only_encryptor_test.rb +20 -0
  249. data/test/cases/encryption/encryption_schemes_test.rb +240 -0
  250. data/test/cases/encryption/encryptor_test.rb +113 -0
  251. data/test/cases/encryption/envelope_encryption_key_provider_test.rb +49 -0
  252. data/test/cases/encryption/extended_deterministic_queries_test.rb +81 -0
  253. data/test/cases/encryption/helper.rb +152 -0
  254. data/test/cases/encryption/key_generator_test.rb +55 -0
  255. data/test/cases/encryption/key_provider_test.rb +57 -0
  256. data/test/cases/encryption/key_test.rb +17 -0
  257. data/test/cases/encryption/message_pack_message_serializer_test.rb +70 -0
  258. data/test/cases/encryption/message_serializer_test.rb +82 -0
  259. data/test/cases/encryption/message_test.rb +43 -0
  260. data/test/cases/encryption/null_encryptor_test.rb +21 -0
  261. data/test/cases/encryption/properties_test.rb +69 -0
  262. data/test/cases/encryption/read_only_null_encryptor_test.rb +19 -0
  263. data/test/cases/encryption/scheme_test.rb +58 -0
  264. data/test/cases/encryption/unencrypted_attributes_test.rb +27 -0
  265. data/test/cases/encryption/uniqueness_validations_test.rb +65 -0
  266. data/test/cases/enum_test.rb +374 -72
  267. data/test/cases/errors_test.rb +7 -4
  268. data/test/cases/excluding_test.rb +116 -0
  269. data/test/cases/explain_subscriber_test.rb +6 -1
  270. data/test/cases/explain_test.rb +119 -10
  271. data/test/cases/filter_attributes_test.rb +7 -14
  272. data/test/cases/finder_respond_to_test.rb +3 -3
  273. data/test/cases/finder_test.rb +357 -72
  274. data/test/cases/fixture_set/file_test.rb +9 -0
  275. data/test/cases/fixtures_test.rb +426 -190
  276. data/test/cases/helper.rb +66 -192
  277. data/test/cases/hot_compatibility_test.rb +10 -10
  278. data/test/cases/inheritance_test.rb +51 -61
  279. data/test/cases/inherited_test.rb +40 -0
  280. data/test/cases/insert_all_test.rb +419 -9
  281. data/test/cases/instrumentation_test.rb +202 -30
  282. data/test/cases/integration_test.rb +25 -7
  283. data/test/cases/invalid_connection_test.rb +5 -5
  284. data/test/cases/invertible_migration_test.rb +108 -24
  285. data/test/cases/json_attribute_test.rb +1 -0
  286. data/test/cases/json_serialization_test.rb +5 -5
  287. data/test/cases/json_shared_test_cases.rb +5 -9
  288. data/test/cases/locking_test.rb +67 -31
  289. data/test/cases/log_subscriber_test.rb +17 -15
  290. data/test/cases/marshal_serialization_test.rb +78 -5
  291. data/test/cases/message_pack_test.rb +91 -0
  292. data/test/cases/migration/change_schema_test.rb +77 -46
  293. data/test/cases/migration/change_table_test.rb +129 -114
  294. data/test/cases/migration/check_constraint_test.rb +192 -10
  295. data/test/cases/migration/column_attributes_test.rb +4 -9
  296. data/test/cases/migration/column_positioning_test.rb +2 -2
  297. data/test/cases/migration/columns_test.rb +118 -4
  298. data/test/cases/migration/command_recorder_test.rb +181 -14
  299. data/test/cases/migration/compatibility_test.rb +883 -196
  300. data/test/cases/migration/create_join_table_test.rb +8 -1
  301. data/test/cases/migration/exclusion_constraint_test.rb +192 -0
  302. data/test/cases/migration/foreign_key_test.rb +356 -14
  303. data/test/cases/migration/helper.rb +4 -1
  304. data/test/cases/migration/index_test.rb +67 -2
  305. data/test/cases/migration/invalid_options_test.rb +129 -0
  306. data/test/cases/migration/logger_test.rb +7 -4
  307. data/test/cases/migration/pending_migrations_test.rb +103 -60
  308. data/test/cases/migration/references_foreign_key_test.rb +73 -4
  309. data/test/cases/migration/references_index_test.rb +25 -27
  310. data/test/cases/migration/references_statements_test.rb +27 -3
  311. data/test/cases/migration/rename_table_test.rb +39 -54
  312. data/test/cases/migration/schema_definitions_test.rb +109 -0
  313. data/test/cases/migration/unique_constraint_test.rb +248 -0
  314. data/test/cases/migration_test.rb +677 -220
  315. data/test/cases/migrator_test.rb +102 -75
  316. data/test/cases/multi_db_migrator_test.rb +55 -34
  317. data/test/cases/multiparameter_attributes_test.rb +26 -29
  318. data/test/cases/multiple_db_test.rb +42 -19
  319. data/test/cases/nested_attributes_test.rb +124 -6
  320. data/test/cases/nested_attributes_with_callbacks_test.rb +2 -2
  321. data/test/cases/normalized_attribute_test.rb +117 -0
  322. data/test/cases/null_relation_test.rb +35 -2
  323. data/test/cases/persistence/reload_association_cache_test.rb +20 -0
  324. data/test/cases/persistence_test.rb +629 -22
  325. data/test/cases/pooled_connections_test.rb +57 -56
  326. data/test/cases/prepared_statement_status_test.rb +8 -3
  327. data/test/cases/primary_class_test.rb +134 -0
  328. data/test/cases/primary_keys_test.rb +171 -55
  329. data/test/cases/query_cache_test.rb +558 -263
  330. data/test/cases/query_logs_test.rb +293 -0
  331. data/test/cases/quoting_test.rb +39 -72
  332. data/test/cases/readonly_test.rb +50 -12
  333. data/test/cases/reaper_test.rb +22 -6
  334. data/test/cases/reflection_test.rb +207 -9
  335. data/test/cases/relation/and_test.rb +43 -0
  336. data/test/cases/relation/delegation_test.rb +32 -5
  337. data/test/cases/relation/delete_all_test.rb +27 -6
  338. data/test/cases/relation/field_ordered_values_test.rb +128 -0
  339. data/test/cases/relation/load_async_test.rb +650 -0
  340. data/test/cases/relation/merging_test.rb +80 -109
  341. data/test/cases/relation/mutation_test.rb +12 -7
  342. data/test/cases/relation/or_test.rb +11 -8
  343. data/test/cases/relation/order_test.rb +90 -0
  344. data/test/cases/relation/predicate_builder_test.rb +21 -6
  345. data/test/cases/relation/select_test.rb +162 -3
  346. data/test/cases/relation/structural_compatibility_test.rb +38 -0
  347. data/test/cases/relation/update_all_test.rb +81 -27
  348. data/test/cases/relation/where_chain_test.rb +190 -3
  349. data/test/cases/relation/where_clause_test.rb +43 -1
  350. data/test/cases/relation/where_test.rb +95 -7
  351. data/test/cases/relation/with_test.rb +165 -0
  352. data/test/cases/relation_test.rb +42 -37
  353. data/test/cases/relations_test.rb +436 -138
  354. data/test/cases/reload_models_test.rb +18 -14
  355. data/test/cases/reserved_word_test.rb +2 -1
  356. data/test/cases/result_test.rb +14 -22
  357. data/test/cases/sanitize_test.rb +89 -27
  358. data/test/cases/schema_dumper_test.rb +535 -62
  359. data/test/cases/scoping/default_scoping_test.rb +219 -35
  360. data/test/cases/scoping/named_scoping_test.rb +25 -46
  361. data/test/cases/scoping/relation_scoping_test.rb +112 -4
  362. data/test/cases/secure_password_test.rb +108 -0
  363. data/test/cases/secure_token_test.rb +72 -0
  364. data/test/cases/serialization_test.rb +1 -1
  365. data/test/cases/serialized_attribute_test.rb +305 -60
  366. data/test/cases/shard_keys_test.rb +125 -0
  367. data/test/cases/shard_selector_test.rb +45 -0
  368. data/test/cases/signed_id_test.rb +57 -5
  369. data/test/cases/statement_cache_test.rb +31 -30
  370. data/test/cases/statement_invalid_test.rb +8 -4
  371. data/test/cases/store_test.rb +73 -9
  372. data/test/cases/strict_loading_test.rb +327 -13
  373. data/test/cases/table_metadata_test.rb +16 -0
  374. data/test/cases/tasks/database_tasks_test.rb +517 -244
  375. data/test/cases/test_case.rb +254 -60
  376. data/test/cases/test_case_test.rb +69 -0
  377. data/test/cases/test_databases_test.rb +7 -3
  378. data/test/cases/test_fixtures_test.rb +19 -40
  379. data/test/cases/time_precision_test.rb +17 -5
  380. data/test/cases/timestamp_test.rb +124 -16
  381. data/test/cases/token_for_test.rb +165 -0
  382. data/test/cases/touch_later_test.rb +43 -1
  383. data/test/cases/transaction_callbacks_test.rb +325 -8
  384. data/test/cases/transaction_instrumentation_test.rb +453 -0
  385. data/test/cases/transaction_isolation_test.rb +12 -8
  386. data/test/cases/transactions_test.rb +629 -112
  387. data/test/cases/type/date_time_test.rb +7 -1
  388. data/test/cases/type/time_test.rb +9 -0
  389. data/test/cases/type/type_map_test.rb +108 -73
  390. data/test/cases/type/unsigned_integer_test.rb +12 -0
  391. data/test/cases/type_caster/connection_test.rb +19 -0
  392. data/test/cases/type_test.rb +1 -1
  393. data/test/cases/unconnected_test.rb +7 -7
  394. data/test/cases/unsafe_raw_sql_test.rb +39 -8
  395. data/test/cases/validations/absence_validation_test.rb +1 -1
  396. data/test/cases/validations/association_validation_test.rb +25 -3
  397. data/test/cases/validations/numericality_validation_test.rb +3 -9
  398. data/test/cases/validations/presence_validation_test.rb +1 -1
  399. data/test/cases/validations/uniqueness_validation_test.rb +280 -40
  400. data/test/cases/validations_test.rb +2 -2
  401. data/test/cases/view_test.rb +33 -22
  402. data/test/cases/yaml_serialization_test.rb +23 -17
  403. data/test/config.example.yml +58 -56
  404. data/test/config.rb +1 -0
  405. data/test/fixtures/1_need_quoting.yml +2 -0
  406. data/test/fixtures/accounts.yml +5 -0
  407. data/test/fixtures/aircrafts.yml +7 -0
  408. data/test/fixtures/book_identifiers.yml +11 -0
  409. data/test/fixtures/books.yml +5 -4
  410. data/test/fixtures/cake_designers.yml +5 -0
  411. data/test/fixtures/cars.yml +6 -0
  412. data/test/fixtures/chefs.yml +5 -0
  413. data/test/fixtures/clothing_items.yml +23 -0
  414. data/test/fixtures/clubs.yml +1 -1
  415. data/test/fixtures/comments.yml +2 -1
  416. data/test/fixtures/cpk_authors.yml +8 -0
  417. data/test/fixtures/cpk_books.yml +21 -0
  418. data/test/fixtures/cpk_order_agreements.yml +13 -0
  419. data/test/fixtures/cpk_order_tags.yml +15 -0
  420. data/test/fixtures/cpk_orders.yml +11 -0
  421. data/test/fixtures/cpk_posts.yml +12 -0
  422. data/test/fixtures/cpk_reviews.yml +13 -0
  423. data/test/fixtures/cpk_tags.yml +11 -0
  424. data/test/fixtures/drink_designers.yml +5 -0
  425. data/test/fixtures/encrypted_book_that_ignores_cases.yml +4 -0
  426. data/test/fixtures/encrypted_books.yml +4 -0
  427. data/test/fixtures/fk_object_to_point_to.yml +2 -0
  428. data/test/fixtures/memberships.yml +15 -15
  429. data/test/fixtures/paragraphs.yml +5 -0
  430. data/test/fixtures/parrots.yml +4 -0
  431. data/test/fixtures/people.yml +2 -0
  432. data/test/fixtures/pirates.yml +2 -2
  433. data/test/fixtures/primary_key_error/primary_key_error.yml +6 -0
  434. data/test/fixtures/references.yml +3 -3
  435. data/test/fixtures/sharded_blog_posts.yml +14 -0
  436. data/test/fixtures/sharded_blog_posts_tags.yml +27 -0
  437. data/test/fixtures/sharded_blogs.yml +8 -0
  438. data/test/fixtures/sharded_comments.yml +22 -0
  439. data/test/fixtures/sharded_tags.yml +34 -0
  440. data/test/fixtures/sponsors.yml +2 -2
  441. data/test/fixtures/topics.yml +1 -0
  442. data/test/fixtures/treasures.yml +4 -0
  443. data/test/fixtures/virtual_columns.yml +5 -0
  444. data/test/fixtures/warehouse_things.yml +1 -1
  445. data/test/migrations/old_and_new_versions/20210716122844_add_people_description.rb +5 -0
  446. data/test/migrations/old_and_new_versions/20210716123013_add_people_number_of_legs.rb +5 -0
  447. data/test/migrations/old_and_new_versions/230_add_people_hobby.rb +5 -0
  448. data/test/migrations/old_and_new_versions/231_add_people_last_name.rb +5 -0
  449. data/test/migrations/scope/1_unscoped.rb +7 -0
  450. data/test/migrations/scope/2_mysql_only.mysql.rb +7 -0
  451. data/test/models/admin/user.rb +2 -0
  452. data/test/models/admin/user_json.rb +48 -0
  453. data/test/models/attachment.rb +7 -0
  454. data/test/models/author.rb +70 -3
  455. data/test/models/author_encrypted.rb +16 -0
  456. data/test/models/bird.rb +1 -1
  457. data/test/models/book.rb +18 -11
  458. data/test/models/book_destroy_async.rb +1 -1
  459. data/test/models/book_encrypted.rb +106 -0
  460. data/test/models/book_identifier.rb +5 -0
  461. data/test/models/branch.rb +11 -0
  462. data/test/models/bulb.rb +1 -1
  463. data/test/models/car.rb +8 -1
  464. data/test/models/cat.rb +1 -1
  465. data/test/models/category.rb +3 -1
  466. data/test/models/chat_message.rb +8 -0
  467. data/test/models/chef.rb +52 -0
  468. data/test/models/clothing_item.rb +12 -0
  469. data/test/models/club.rb +4 -1
  470. data/test/models/comment.rb +7 -4
  471. data/test/models/comment_overlapping_counter_cache.rb +15 -0
  472. data/test/models/company.rb +16 -2
  473. data/test/models/computer.rb +1 -0
  474. data/test/models/contact.rb +3 -3
  475. data/test/models/contract.rb +5 -1
  476. data/test/models/cpk/author.rb +9 -0
  477. data/test/models/cpk/book.rb +55 -0
  478. data/test/models/cpk/book_destroy_async.rb +9 -0
  479. data/test/models/cpk/car.rb +9 -0
  480. data/test/models/cpk/car_review.rb +9 -0
  481. data/test/models/cpk/chapter.rb +16 -0
  482. data/test/models/cpk/chapter_destroy_async.rb +10 -0
  483. data/test/models/cpk/comment.rb +9 -0
  484. data/test/models/cpk/order.rb +55 -0
  485. data/test/models/cpk/order_agreement.rb +10 -0
  486. data/test/models/cpk/order_tag.rb +10 -0
  487. data/test/models/cpk/post.rb +10 -0
  488. data/test/models/cpk/posts_tag.rb +10 -0
  489. data/test/models/cpk/review.rb +9 -0
  490. data/test/models/cpk/tag.rb +10 -0
  491. data/test/models/cpk.rb +15 -0
  492. data/test/models/customer.rb +3 -1
  493. data/test/models/destroy_async_parent.rb +1 -1
  494. data/test/models/developer.rb +44 -3
  495. data/test/models/discount.rb +4 -0
  496. data/test/models/drink_designer.rb +1 -0
  497. data/test/models/editor.rb +8 -0
  498. data/test/models/editorship.rb +6 -0
  499. data/test/models/entry.rb +5 -0
  500. data/test/models/essay.rb +6 -1
  501. data/test/models/essay_destroy_async.rb +1 -0
  502. data/test/models/eye.rb +87 -21
  503. data/test/models/face.rb +1 -1
  504. data/test/models/friendship.rb +3 -0
  505. data/test/models/hardback.rb +7 -0
  506. data/test/models/hotel.rb +2 -0
  507. data/test/models/human.rb +2 -2
  508. data/test/models/invoice.rb +2 -1
  509. data/test/models/invokes_an_undefined_method.rb +5 -0
  510. data/test/models/line_item.rb +6 -0
  511. data/test/models/member.rb +9 -4
  512. data/test/models/membership.rb +2 -2
  513. data/test/models/message.rb +2 -1
  514. data/test/models/need_quoting.rb +5 -0
  515. data/test/models/paragraph.rb +5 -0
  516. data/test/models/parrot.rb +6 -3
  517. data/test/models/person.rb +7 -4
  518. data/test/models/pirate.rb +4 -1
  519. data/test/models/pk_autopopulated_by_a_trigger_record.rb +5 -0
  520. data/test/models/post.rb +65 -2
  521. data/test/models/post_encrypted.rb +15 -0
  522. data/test/models/post_with_prefetched_pk.rb +15 -0
  523. data/test/models/project.rb +1 -0
  524. data/test/models/publication.rb +16 -0
  525. data/test/models/raises_argument_error.rb +5 -0
  526. data/test/models/raises_no_method_error.rb +5 -0
  527. data/test/models/recipient.rb +5 -0
  528. data/test/models/reference.rb +1 -1
  529. data/test/models/reply.rb +1 -1
  530. data/test/models/room.rb +3 -0
  531. data/test/models/sharded/blog.rb +12 -0
  532. data/test/models/sharded/blog_post.rb +17 -0
  533. data/test/models/sharded/blog_post_destroy_async.rb +14 -0
  534. data/test/models/sharded/blog_post_tag.rb +11 -0
  535. data/test/models/sharded/blog_post_with_revision.rb +11 -0
  536. data/test/models/sharded/comment.rb +12 -0
  537. data/test/models/sharded/comment_destroy_async.rb +12 -0
  538. data/test/models/sharded/tag.rb +11 -0
  539. data/test/models/sharded.rb +8 -0
  540. data/test/models/ship.rb +1 -1
  541. data/test/models/shipping_line.rb +11 -0
  542. data/test/models/subscriber.rb +1 -0
  543. data/test/models/subscription.rb +3 -1
  544. data/test/models/too_long_table_name.rb +5 -0
  545. data/test/models/topic.rb +3 -1
  546. data/test/models/traffic_light.rb +2 -2
  547. data/test/models/traffic_light_encrypted.rb +21 -0
  548. data/test/models/translation.rb +9 -0
  549. data/test/models/treasure.rb +1 -1
  550. data/test/models/tyre.rb +1 -1
  551. data/test/models/user.rb +16 -0
  552. data/test/models/user_with_invalid_relation.rb +28 -0
  553. data/test/models/uuid_comment.rb +5 -0
  554. data/test/models/uuid_entry.rb +5 -0
  555. data/test/models/uuid_message.rb +5 -0
  556. data/test/models/zine.rb +2 -1
  557. data/test/schema/mysql2_specific_schema.rb +26 -12
  558. data/test/schema/postgresql_specific_schema.rb +121 -13
  559. data/test/schema/schema.rb +361 -103
  560. data/test/schema/sqlite_specific_schema.rb +17 -6
  561. data/test/schema/trilogy_specific_schema.rb +96 -0
  562. data/test/support/adapter_helper.rb +104 -0
  563. data/test/support/async_helper.rb +15 -0
  564. data/test/support/config.rb +1 -1
  565. data/test/support/connection.rb +14 -2
  566. data/test/support/ddl_helper.rb +1 -1
  567. data/test/support/fake_adapter.rb +42 -0
  568. data/test/support/load_schema_helper.rb +22 -0
  569. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic.dump +0 -0
  570. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_1_topic_associations.dump +0 -0
  571. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic.dump +0 -0
  572. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_7_1_topic_associations.dump +0 -0
  573. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic.dump +0 -0
  574. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_1_topic_associations.dump +0 -0
  575. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic.dump +0 -0
  576. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_7_1_topic_associations.dump +0 -0
  577. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic.dump +0 -0
  578. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_1_topic_associations.dump +0 -0
  579. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic.dump +0 -0
  580. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_7_1_topic_associations.dump +0 -0
  581. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic.dump +0 -0
  582. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_1_topic_associations.dump +0 -0
  583. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic.dump +0 -0
  584. data/test/support/marshal_compatibility_fixtures/SQLite/rails_7_1_topic_associations.dump +0 -0
  585. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic.dump +0 -0
  586. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_6_1_topic_associations.dump +0 -0
  587. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic.dump +0 -0
  588. data/test/support/marshal_compatibility_fixtures/Trilogy/rails_7_1_topic_associations.dump +0 -0
  589. data/test/support/schema_dumping_helper.rb +15 -9
  590. data/test/support/tools.rb +37 -0
  591. data/test/support/yaml_compatibility_fixtures/rails_4_1_no_symbol.yml +22 -0
  592. metadata +247 -15
@@ -2,7 +2,8 @@
2
2
 
3
3
  require "cases/helper"
4
4
  require "active_record/tasks/database_tasks"
5
- require "models/author"
5
+ require "models/course"
6
+ require "models/college"
6
7
 
7
8
  module ActiveRecord
8
9
  module DatabaseTasksSetupper
@@ -30,146 +31,207 @@ module ActiveRecord
30
31
  $stdout, $stderr = @original_stdout, @original_stderr
31
32
  end
32
33
 
33
- def with_stubbed_new
34
+ def with_stubbed_new(&block)
34
35
  ActiveRecord::Tasks::MySQLDatabaseTasks.stub(:new, @mysql_tasks) do
35
36
  ActiveRecord::Tasks::PostgreSQLDatabaseTasks.stub(:new, @postgresql_tasks) do
36
- ActiveRecord::Tasks::SQLiteDatabaseTasks.stub(:new, @sqlite_tasks) do
37
- yield
38
- end
37
+ ActiveRecord::Tasks::SQLiteDatabaseTasks.stub(:new, @sqlite_tasks, &block)
39
38
  end
40
39
  end
41
40
  end
42
41
  end
43
42
 
43
+ module DatabaseTasksHelper
44
+ def assert_called_for_configs(method_name, configs, &block)
45
+ mock = Minitest::Mock.new
46
+ configs.each { |config| mock.expect(:call, nil, config) }
47
+
48
+ ActiveRecord::Tasks::DatabaseTasks.stub(method_name, mock, &block)
49
+ assert_mock(mock)
50
+ end
51
+ end
52
+
44
53
  ADAPTERS_TASKS = {
45
54
  mysql2: :mysql_tasks,
55
+ trilogy: :mysql_tasks,
46
56
  postgresql: :postgresql_tasks,
47
57
  sqlite3: :sqlite_tasks
48
58
  }
49
59
 
50
- class DatabaseTasksUtilsTask < ActiveRecord::TestCase
51
- def test_raises_an_error_when_called_with_protected_environment
52
- protected_environments = ActiveRecord::Base.protected_environments
53
- current_env = ActiveRecord::Base.connection.migration_context.current_environment
54
-
55
- InternalMetadata[:environment] = current_env
56
-
57
- assert_called_on_instance_of(
58
- ActiveRecord::MigrationContext,
59
- :current_version,
60
- times: 6,
61
- returns: 1
62
- ) do
63
- assert_not_includes protected_environments, current_env
64
- # Assert no error
65
- ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
60
+ class DatabaseTasksCheckProtectedEnvironmentsTest < ActiveRecord::TestCase
61
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
62
+ self.use_transactional_tests = false
66
63
 
67
- ActiveRecord::Base.protected_environments = [current_env]
64
+ def setup
65
+ recreate_metadata_tables
66
+ end
68
67
 
69
- assert_raise(ActiveRecord::ProtectedEnvironmentError) do
70
- ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
71
- end
68
+ def teardown
69
+ recreate_metadata_tables
72
70
  end
73
- ensure
74
- ActiveRecord::Base.protected_environments = protected_environments
75
- end
76
71
 
77
- def test_raises_an_error_when_called_with_protected_environment_which_name_is_a_symbol
78
- protected_environments = ActiveRecord::Base.protected_environments
79
- current_env = ActiveRecord::Base.connection.migration_context.current_environment
72
+ def test_raises_an_error_when_called_with_protected_environment
73
+ protected_environments = ActiveRecord::Base.protected_environments
74
+ current_env = ActiveRecord::Base.connection_pool.migration_context.current_environment
80
75
 
81
- InternalMetadata[:environment] = current_env
76
+ ActiveRecord::Base.connection_pool.internal_metadata[:environment] = current_env
82
77
 
83
- assert_called_on_instance_of(
84
- ActiveRecord::MigrationContext,
85
- :current_version,
86
- times: 6,
87
- returns: 1
88
- ) do
89
- assert_not_includes protected_environments, current_env
90
- # Assert no error
91
- ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
78
+ assert_called_on_instance_of(
79
+ ActiveRecord::MigrationContext,
80
+ :current_version,
81
+ times: 6,
82
+ returns: 1
83
+ ) do
84
+ assert_not_includes protected_environments, current_env
85
+ # Assert no error
86
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!("arunit")
92
87
 
93
- ActiveRecord::Base.protected_environments = [current_env.to_sym]
94
- assert_raise(ActiveRecord::ProtectedEnvironmentError) do
95
- ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
88
+ ActiveRecord::Base.protected_environments = [current_env]
89
+
90
+ assert_raise(ActiveRecord::ProtectedEnvironmentError) do
91
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!("arunit")
92
+ end
96
93
  end
94
+ ensure
95
+ ActiveRecord::Base.protected_environments = protected_environments
97
96
  end
98
- ensure
99
- ActiveRecord::Base.protected_environments = protected_environments
100
- end
101
97
 
102
- def test_raises_an_error_if_no_migrations_have_been_made
103
- ActiveRecord::InternalMetadata.stub(:table_exists?, false) do
98
+ def test_raises_an_error_when_called_with_protected_environment_which_name_is_a_symbol
99
+ protected_environments = ActiveRecord::Base.protected_environments
100
+ current_env = ActiveRecord::Base.connection_pool.migration_context.current_environment
101
+
102
+ ActiveRecord::Base.connection_pool.internal_metadata[:environment] = current_env
103
+
104
104
  assert_called_on_instance_of(
105
105
  ActiveRecord::MigrationContext,
106
106
  :current_version,
107
+ times: 6,
107
108
  returns: 1
108
109
  ) do
109
- assert_raise(ActiveRecord::NoEnvironmentInSchemaError) do
110
- ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
110
+ assert_not_includes protected_environments, current_env
111
+ # Assert no error
112
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!("arunit")
113
+
114
+ ActiveRecord::Base.protected_environments = [current_env.to_sym]
115
+ assert_raise(ActiveRecord::ProtectedEnvironmentError) do
116
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!("arunit")
111
117
  end
112
118
  end
119
+ ensure
120
+ ActiveRecord::Base.protected_environments = protected_environments
113
121
  end
114
- end
115
- end
116
122
 
117
- class DatabaseTasksCurrentConfigTask < ActiveRecord::TestCase
118
- def test_current_config_set
119
- hash = {}
123
+ def test_raises_an_error_if_no_migrations_have_been_made
124
+ pool = ActiveRecord::Base.connection_pool
125
+ internal_metadata = pool.internal_metadata
126
+ schema_migration = pool.schema_migration
127
+ schema_migration.create_table
128
+ schema_migration.create_version("1")
120
129
 
121
- with_stubbed_configurations do
122
- ActiveRecord::Tasks::DatabaseTasks.current_config(config: hash, env: "production")
130
+ assert_predicate internal_metadata, :table_exists?
131
+ internal_metadata.drop_table
132
+ assert_not_predicate internal_metadata, :table_exists?
123
133
 
124
- assert_equal hash, ActiveRecord::Tasks::DatabaseTasks.current_config(env: "production")
134
+ assert_raises(ActiveRecord::NoEnvironmentInSchemaError) do
135
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!("arunit")
136
+ end
137
+ ensure
138
+ pool.automatic_reconnect = true
139
+ schema_migration.delete_version("1")
140
+ internal_metadata.create_table
125
141
  end
126
- end
127
142
 
128
- def test_current_config_read_none_found
129
- with_stubbed_configurations do
130
- config = ActiveRecord::Tasks::DatabaseTasks.current_config(env: "production", spec: "empty")
143
+ private
144
+ def recreate_metadata_tables
145
+ schema_migration = ActiveRecord::Base.connection_pool.schema_migration
146
+ schema_migration.drop_table
147
+ schema_migration.create_table
131
148
 
132
- assert_nil config
149
+ internal_metadata = ActiveRecord::Base.connection_pool.internal_metadata
150
+ internal_metadata.drop_table
151
+ internal_metadata.create_table
133
152
  end
134
153
  end
154
+ end
135
155
 
136
- def test_current_config_read_found
137
- with_stubbed_configurations do
138
- config = ActiveRecord::Tasks::DatabaseTasks.current_config(env: "production", spec: "exists")
156
+ class DatabaseTasksCheckProtectedEnvironmentsMultiDatabaseTest < ActiveRecord::TestCase
157
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
158
+ self.use_transactional_tests = false
139
159
 
140
- assert_equal({ database: "my-db" }, config)
141
- end
142
- end
160
+ def test_with_multiple_databases
161
+ env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call
143
162
 
144
- def test_current_config_read_after_set
145
- hash = {}
163
+ with_multi_db_configurations(env) do
164
+ protected_environments = ActiveRecord::Base.protected_environments
165
+ current_env = ActiveRecord::Base.connection_pool.migration_context.current_environment
166
+ assert_equal current_env, env
146
167
 
147
- with_stubbed_configurations do
148
- ActiveRecord::Tasks::DatabaseTasks.current_config(config: hash, env: "production")
168
+ ActiveRecord::Base.establish_connection(:primary)
169
+ ActiveRecord::Base.connection_pool.internal_metadata.create_table_and_set_flags(current_env)
149
170
 
150
- config = ActiveRecord::Tasks::DatabaseTasks.current_config(env: "production", spec: "exists")
171
+ ActiveRecord::Base.establish_connection(:secondary)
172
+ ActiveRecord::Base.connection_pool.internal_metadata.create_table_and_set_flags(current_env)
151
173
 
152
- assert_equal hash, config
153
- end
154
- end
174
+ assert_not_includes protected_environments, current_env
175
+ # Assert not raises
176
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!(env)
155
177
 
156
- private
157
- def with_stubbed_configurations
158
- old_configurations = ActiveRecord::Base.configurations
159
- ActiveRecord::Base.configurations = { "production" => { "exists" => { "database" => "my-db" } } }
178
+ ActiveRecord::Base.establish_connection(:secondary)
179
+ pool = ActiveRecord::Base.connection_pool
180
+ schema_migration = pool.schema_migration
181
+ schema_migration.create_table
182
+ schema_migration.create_version("1")
160
183
 
161
- assert_deprecated do
162
- yield
163
- end
164
- ensure
165
- ActiveRecord::Base.configurations = old_configurations
166
- assert_deprecated do
167
- ActiveRecord::Tasks::DatabaseTasks.current_config = nil
184
+ ActiveRecord::Base.protected_environments = [current_env.to_sym]
185
+
186
+ assert_raise(ActiveRecord::ProtectedEnvironmentError) do
187
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!(env)
188
+ end
189
+ ensure
190
+ ActiveRecord::Base.protected_environments = protected_environments
168
191
  end
169
192
  end
193
+
194
+ private
195
+ def with_multi_db_configurations(env)
196
+ old_configurations = ActiveRecord::Base.configurations
197
+ ActiveRecord::Base.configurations = {
198
+ env => {
199
+ primary: {
200
+ adapter: "sqlite3",
201
+ database: "test/fixtures/fixture_database.sqlite3",
202
+ },
203
+ secondary: {
204
+ adapter: "sqlite3",
205
+ database: "test/fixtures/fixture_database_2.sqlite3",
206
+ }
207
+ }
208
+ }
209
+
210
+ ActiveRecord::Base.establish_connection(:primary)
211
+ yield
212
+ ensure
213
+ [:primary, :secondary].each do |db|
214
+ ActiveRecord::Base.establish_connection(db)
215
+ ActiveRecord::Base.connection_pool.schema_migration.delete_all_versions
216
+ ActiveRecord::Base.connection_pool.internal_metadata.delete_all_entries
217
+ end
218
+ ActiveRecord::Base.configurations = old_configurations
219
+ ActiveRecord::Base.establish_connection(:arunit)
220
+ end
221
+ end
170
222
  end
171
223
 
172
224
  class DatabaseTasksRegisterTask < ActiveRecord::TestCase
225
+ setup do
226
+ @tasks_was = ActiveRecord::Tasks::DatabaseTasks.instance_variable_get(:@tasks).dup
227
+ @adapters_was = ActiveRecord::ConnectionAdapters.instance_variable_get(:@adapters).dup
228
+ end
229
+
230
+ teardown do
231
+ ActiveRecord::Tasks::DatabaseTasks.instance_variable_set(:@tasks, @tasks_was)
232
+ ActiveRecord::ConnectionAdapters.instance_variable_set(:@adapters, @adapters_was)
233
+ end
234
+
173
235
  def test_register_task
174
236
  klazz = Class.new do
175
237
  def initialize(*arguments); end
@@ -179,15 +241,31 @@ module ActiveRecord
179
241
 
180
242
  klazz.stub(:new, instance) do
181
243
  assert_called_with(instance, :structure_dump, ["awesome-file.sql", nil]) do
182
- ActiveRecord::Tasks::DatabaseTasks.register_task(/foo/, klazz)
183
- ActiveRecord::Tasks::DatabaseTasks.structure_dump({ "adapter" => :foo }, "awesome-file.sql")
244
+ ActiveRecord::Tasks::DatabaseTasks.register_task(/abstract/, klazz)
245
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump({ "adapter" => "abstract" }, "awesome-file.sql")
246
+ end
247
+ end
248
+ end
249
+
250
+ def test_register_task_precedence
251
+ klazz = Class.new do
252
+ def initialize(*arguments); end
253
+ def structure_dump(filename); end
254
+ end
255
+ instance = klazz.new
256
+
257
+ klazz.stub(:new, instance) do
258
+ assert_called_with(instance, :structure_dump, ["awesome-file.sql", nil]) do
259
+ ActiveRecord::ConnectionAdapters.register("custom_mysql", "ActiveRecord::ConnectionAdapters::Mysql2Adapter", "active_record/connection_adapters/mysql2_adapter")
260
+ ActiveRecord::Tasks::DatabaseTasks.register_task(/custom_mysql/, klazz)
261
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump({ "adapter" => :custom_mysql }, "awesome-file.sql")
184
262
  end
185
263
  end
186
264
  end
187
265
 
188
266
  def test_unregistered_task
189
267
  assert_raise(ActiveRecord::Tasks::DatabaseNotSupported) do
190
- ActiveRecord::Tasks::DatabaseTasks.structure_dump({ "adapter" => :bar }, "awesome-file.sql")
268
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump({ "adapter" => "abstract" }, "awesome-file.sql")
191
269
  end
192
270
  end
193
271
  end
@@ -212,7 +290,7 @@ module ActiveRecord
212
290
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, dir) do
213
291
  path = File.join(dir, "schema_cache.yml")
214
292
  assert_not File.file?(path)
215
- ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.connection, path)
293
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(ActiveRecord::Base.lease_connection, path)
216
294
  assert File.file?(path)
217
295
  end
218
296
  end
@@ -235,51 +313,49 @@ module ActiveRecord
235
313
  end
236
314
 
237
315
  def test_cache_dump_default_filename
238
- old_path = ENV["SCHEMA_CACHE"]
239
- ENV.delete("SCHEMA_CACHE")
316
+ config = DatabaseConfigurations::HashConfig.new("development", "primary", {})
240
317
 
241
318
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "db") do
242
- path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename("primary")
319
+ path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(config)
243
320
  assert_equal "db/schema_cache.yml", path
244
321
  end
245
- ensure
246
- ENV["SCHEMA_CACHE"] = old_path
322
+ end
323
+
324
+ def test_cache_dump_default_filename_with_custom_db_dir
325
+ config = DatabaseConfigurations::HashConfig.new("development", "primary", {})
326
+
327
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "my_db") do
328
+ path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(config)
329
+ assert_equal "my_db/schema_cache.yml", path
330
+ end
247
331
  end
248
332
 
249
333
  def test_cache_dump_alternate_filename
250
- old_path = ENV["SCHEMA_CACHE"]
251
- ENV.delete("SCHEMA_CACHE")
334
+ config = DatabaseConfigurations::HashConfig.new("development", "alternate", {})
252
335
 
253
336
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "db") do
254
- path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename("alternate")
337
+ path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(config)
255
338
  assert_equal "db/alternate_schema_cache.yml", path
256
339
  end
257
- ensure
258
- ENV["SCHEMA_CACHE"] = old_path
259
340
  end
260
341
 
261
- def test_cache_dump_filename_with_env_override
262
- old_path = ENV["SCHEMA_CACHE"]
263
- ENV["SCHEMA_CACHE"] = "tmp/something.yml"
342
+ def test_cache_dump_filename_with_path_from_db_config
343
+ config = DatabaseConfigurations::HashConfig.new("development", "primary", { schema_cache_path: "tmp/something.yml" })
264
344
 
265
345
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "db") do
266
- path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename("primary")
346
+ path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(config)
267
347
  assert_equal "tmp/something.yml", path
268
348
  end
269
- ensure
270
- ENV["SCHEMA_CACHE"] = old_path
271
349
  end
272
350
 
273
- def test_cache_dump_filename_with_path_from_db_config
274
- old_path = ENV["SCHEMA_CACHE"]
275
- ENV.delete("SCHEMA_CACHE")
351
+
352
+ def test_cache_dump_filename_with_path_from_the_argument_has_precedence
353
+ config = DatabaseConfigurations::HashConfig.new("development", "primary", { schema_cache_path: "tmp/something.yml" })
276
354
 
277
355
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "db") do
278
- path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename("primary", schema_cache_path: "tmp/something.yml")
279
- assert_equal "tmp/something.yml", path
356
+ path = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(config, schema_cache_path: "tmp/another.yml")
357
+ assert_equal "tmp/another.yml", path
280
358
  end
281
- ensure
282
- ENV["SCHEMA_CACHE"] = old_path
283
359
  end
284
360
  end
285
361
 
@@ -287,7 +363,27 @@ module ActiveRecord
287
363
  def test_ensure_db_dir
288
364
  Dir.mktmpdir do |dir|
289
365
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, dir) do
290
- db_config = OpenStruct.new(name: "fake_db_config")
366
+ updated_hash = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").configuration_hash.merge(schema_dump: "fake_db_config_schema.rb")
367
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("arunit", "primary", updated_hash)
368
+ path = "#{dir}/fake_db_config_schema.rb"
369
+
370
+ FileUtils.rm_rf(dir)
371
+ assert_not File.file?(path)
372
+
373
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
374
+
375
+ assert File.file?(path)
376
+ end
377
+ end
378
+ ensure
379
+ ActiveRecord::Base.clear_cache!
380
+ end
381
+
382
+ def test_db_dir_ignored_if_included_in_schema_dump
383
+ Dir.mktmpdir do |dir|
384
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, dir) do
385
+ updated_hash = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").configuration_hash.merge(schema_dump: "#{dir}/fake_db_config_schema.rb")
386
+ db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new("arunit", "primary", updated_hash)
291
387
  path = "#{dir}/fake_db_config_schema.rb"
292
388
 
293
389
  FileUtils.rm_rf(dir)
@@ -305,7 +401,7 @@ module ActiveRecord
305
401
 
306
402
  class DatabaseTasksCreateAllTest < ActiveRecord::TestCase
307
403
  def setup
308
- @configurations = { "development" => { "database" => "my-db" } }
404
+ @configurations = { "development" => { "adapter" => "abstract", "database" => "my-db" } }
309
405
 
310
406
  $stdout, @original_stdout = StringIO.new, $stdout
311
407
  $stderr, @original_stderr = StringIO.new, $stderr
@@ -377,25 +473,25 @@ module ActiveRecord
377
473
  end
378
474
 
379
475
  private
380
- def with_stubbed_configurations_establish_connection
476
+ def with_stubbed_configurations_establish_connection(&block)
381
477
  old_configurations = ActiveRecord::Base.configurations
382
478
  ActiveRecord::Base.configurations = @configurations
383
479
 
384
480
  # To refrain from connecting to a newly created empty DB in
385
481
  # sqlite3_mem tests
386
- ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
387
- yield
388
- end
482
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil, &block)
389
483
  ensure
390
484
  ActiveRecord::Base.configurations = old_configurations
391
485
  end
392
486
  end
393
487
 
394
488
  class DatabaseTasksCreateCurrentTest < ActiveRecord::TestCase
489
+ include DatabaseTasksHelper
490
+
395
491
  def setup
396
492
  @configurations = {
397
- "development" => { "database" => "dev-db" },
398
- "test" => { "database" => "test-db" },
493
+ "development" => { "adapter" => "abstract", "database" => "dev-db" },
494
+ "test" => { "adapter" => "abstract", "database" => "test-db" },
399
495
  "production" => { "url" => "abstract://prod-db-host/prod-db" }
400
496
  }
401
497
  end
@@ -430,8 +526,7 @@ module ActiveRecord
430
526
 
431
527
  def test_creates_test_and_development_databases_when_env_was_not_specified
432
528
  with_stubbed_configurations_establish_connection do
433
- assert_called_with(
434
- ActiveRecord::Tasks::DatabaseTasks,
529
+ assert_called_for_configs(
435
530
  :create,
436
531
  [
437
532
  [config_for("development", "primary")],
@@ -450,8 +545,7 @@ module ActiveRecord
450
545
  ENV["RAILS_ENV"] = "development"
451
546
 
452
547
  with_stubbed_configurations_establish_connection do
453
- assert_called_with(
454
- ActiveRecord::Tasks::DatabaseTasks,
548
+ assert_called_for_configs(
455
549
  :create,
456
550
  [
457
551
  [config_for("development", "primary")],
@@ -473,8 +567,7 @@ module ActiveRecord
473
567
  ENV["SKIP_TEST_DATABASE"] = "true"
474
568
 
475
569
  with_stubbed_configurations_establish_connection do
476
- assert_called_with(
477
- ActiveRecord::Tasks::DatabaseTasks,
570
+ assert_called_for_configs(
478
571
  :create,
479
572
  [
480
573
  [config_for("development", "primary")]
@@ -505,31 +598,38 @@ module ActiveRecord
505
598
  ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)
506
599
  end
507
600
 
508
- def with_stubbed_configurations_establish_connection
601
+ def with_stubbed_configurations_establish_connection(&block)
509
602
  old_configurations = ActiveRecord::Base.configurations
510
603
  ActiveRecord::Base.configurations = @configurations
511
604
 
512
- ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
513
- yield
514
- end
605
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil, &block)
515
606
  ensure
516
607
  ActiveRecord::Base.configurations = old_configurations
517
608
  end
518
609
  end
519
610
 
520
611
  class DatabaseTasksCreateCurrentThreeTierTest < ActiveRecord::TestCase
612
+ include DatabaseTasksHelper
613
+
521
614
  def setup
522
615
  @configurations = {
523
- "development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
524
- "test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
525
- "production" => { "primary" => { "url" => "abstract://prod-db-host/prod-db" }, "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
616
+ "development" => {
617
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
618
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
619
+ },
620
+ "test" => {
621
+ "primary" => { "adapter" => "abstract", "database" => "test-db" },
622
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-test-db" },
623
+ },
624
+ "production" => {
625
+ "primary" => { "url" => "abstract://prod-db-host/prod-db" },
626
+ "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
526
627
  }
527
628
  end
528
629
 
529
630
  def test_creates_current_environment_database
530
631
  with_stubbed_configurations_establish_connection do
531
- assert_called_with(
532
- ActiveRecord::Tasks::DatabaseTasks,
632
+ assert_called_for_configs(
533
633
  :create,
534
634
  [
535
635
  [config_for("test", "primary")],
@@ -545,8 +645,7 @@ module ActiveRecord
545
645
 
546
646
  def test_creates_current_environment_database_with_url
547
647
  with_stubbed_configurations_establish_connection do
548
- assert_called_with(
549
- ActiveRecord::Tasks::DatabaseTasks,
648
+ assert_called_for_configs(
550
649
  :create,
551
650
  [
552
651
  [config_for("production", "primary")],
@@ -562,8 +661,7 @@ module ActiveRecord
562
661
 
563
662
  def test_creates_test_and_development_databases_when_env_was_not_specified
564
663
  with_stubbed_configurations_establish_connection do
565
- assert_called_with(
566
- ActiveRecord::Tasks::DatabaseTasks,
664
+ assert_called_for_configs(
567
665
  :create,
568
666
  [
569
667
  [config_for("development", "primary")],
@@ -584,8 +682,7 @@ module ActiveRecord
584
682
  ENV["RAILS_ENV"] = "development"
585
683
 
586
684
  with_stubbed_configurations_establish_connection do
587
- assert_called_with(
588
- ActiveRecord::Tasks::DatabaseTasks,
685
+ assert_called_for_configs(
589
686
  :create,
590
687
  [
591
688
  [config_for("development", "primary")],
@@ -622,13 +719,11 @@ module ActiveRecord
622
719
  ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)
623
720
  end
624
721
 
625
- def with_stubbed_configurations_establish_connection
722
+ def with_stubbed_configurations_establish_connection(&block)
626
723
  old_configurations = ActiveRecord::Base.configurations
627
724
  ActiveRecord::Base.configurations = @configurations
628
725
 
629
- ActiveRecord::Base.connection_handler.stub(:establish_connection, nil) do
630
- yield
631
- end
726
+ ActiveRecord::Base.connection_handler.stub(:establish_connection, nil, &block)
632
727
  ensure
633
728
  ActiveRecord::Base.configurations = old_configurations
634
729
  end
@@ -650,7 +745,7 @@ module ActiveRecord
650
745
 
651
746
  class DatabaseTasksDropAllTest < ActiveRecord::TestCase
652
747
  def setup
653
- @configurations = { development: { "database" => "my-db" } }
748
+ @configurations = { development: { "adapter" => "abstract", "database" => "my-db" } }
654
749
 
655
750
  $stdout, @original_stdout = StringIO.new, $stdout
656
751
  $stderr, @original_stderr = StringIO.new, $stderr
@@ -733,10 +828,12 @@ module ActiveRecord
733
828
  end
734
829
 
735
830
  class DatabaseTasksDropCurrentTest < ActiveRecord::TestCase
831
+ include DatabaseTasksHelper
832
+
736
833
  def setup
737
834
  @configurations = {
738
- "development" => { "database" => "dev-db" },
739
- "test" => { "database" => "test-db" },
835
+ "development" => { "adapter" => "abstract", "database" => "dev-db" },
836
+ "test" => { "adapter" => "abstract", "database" => "test-db" },
740
837
  "production" => { "url" => "abstract://prod-db-host/prod-db" }
741
838
  }
742
839
  end
@@ -771,8 +868,7 @@ module ActiveRecord
771
868
 
772
869
  def test_drops_test_and_development_databases_when_env_was_not_specified
773
870
  with_stubbed_configurations do
774
- assert_called_with(
775
- ActiveRecord::Tasks::DatabaseTasks,
871
+ assert_called_for_configs(
776
872
  :drop,
777
873
  [
778
874
  [config_for("development", "primary")],
@@ -791,8 +887,7 @@ module ActiveRecord
791
887
  ENV["RAILS_ENV"] = "development"
792
888
 
793
889
  with_stubbed_configurations do
794
- assert_called_with(
795
- ActiveRecord::Tasks::DatabaseTasks,
890
+ assert_called_for_configs(
796
891
  :drop,
797
892
  [
798
893
  [config_for("development", "primary")],
@@ -824,18 +919,28 @@ module ActiveRecord
824
919
  end
825
920
 
826
921
  class DatabaseTasksDropCurrentThreeTierTest < ActiveRecord::TestCase
922
+ include DatabaseTasksHelper
923
+
827
924
  def setup
828
925
  @configurations = {
829
- "development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
830
- "test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
831
- "production" => { "primary" => { "url" => "abstract://prod-db-host/prod-db" }, "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
926
+ "development" => {
927
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
928
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
929
+ },
930
+ "test" => {
931
+ "primary" => { "adapter" => "abstract", "database" => "test-db" },
932
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-test-db" },
933
+ },
934
+ "production" => {
935
+ "primary" => { "url" => "abstract://prod-db-host/prod-db" },
936
+ "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" },
937
+ },
832
938
  }
833
939
  end
834
940
 
835
941
  def test_drops_current_environment_database
836
942
  with_stubbed_configurations do
837
- assert_called_with(
838
- ActiveRecord::Tasks::DatabaseTasks,
943
+ assert_called_for_configs(
839
944
  :drop,
840
945
  [
841
946
  [config_for("test", "primary")],
@@ -851,8 +956,7 @@ module ActiveRecord
851
956
 
852
957
  def test_drops_current_environment_database_with_url
853
958
  with_stubbed_configurations do
854
- assert_called_with(
855
- ActiveRecord::Tasks::DatabaseTasks,
959
+ assert_called_for_configs(
856
960
  :drop,
857
961
  [
858
962
  [config_for("production", "primary")],
@@ -868,8 +972,7 @@ module ActiveRecord
868
972
 
869
973
  def test_drops_test_and_development_databases_when_env_was_not_specified
870
974
  with_stubbed_configurations do
871
- assert_called_with(
872
- ActiveRecord::Tasks::DatabaseTasks,
975
+ assert_called_for_configs(
873
976
  :drop,
874
977
  [
875
978
  [config_for("development", "primary")],
@@ -890,8 +993,7 @@ module ActiveRecord
890
993
  ENV["RAILS_ENV"] = "development"
891
994
 
892
995
  with_stubbed_configurations do
893
- assert_called_with(
894
- ActiveRecord::Tasks::DatabaseTasks,
996
+ assert_called_for_configs(
895
997
  :drop,
896
998
  [
897
999
  [config_for("development", "primary")],
@@ -924,18 +1026,19 @@ module ActiveRecord
924
1026
  end
925
1027
  end
926
1028
 
927
- if current_adapter?(:SQLite3Adapter) && !in_memory_db?
928
- class DatabaseTasksMigrationTestCase < ActiveRecord::TestCase
1029
+ class DatabaseTasksMigrationTestCase < ActiveRecord::TestCase
1030
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
929
1031
  self.use_transactional_tests = false
1032
+ class_attribute :folder_name, default: "valid"
930
1033
 
931
1034
  # Use a memory db here to avoid having to rollback at the end
932
1035
  setup do
933
- migrations_path = MIGRATIONS_ROOT + "/valid"
934
- file = ActiveRecord::Base.connection.raw_connection.filename
1036
+ migrations_path = [MIGRATIONS_ROOT, folder_name].join("/")
1037
+ file = ActiveRecord::Base.lease_connection.raw_connection.filename
935
1038
  @conn = ActiveRecord::Base.establish_connection adapter: "sqlite3",
936
1039
  database: ":memory:", migrations_paths: migrations_path
937
1040
  source_db = SQLite3::Database.new file
938
- dest_db = ActiveRecord::Base.connection.raw_connection
1041
+ dest_db = ActiveRecord::Base.lease_connection.raw_connection
939
1042
  backup = SQLite3::Backup.new(dest_db, "main", source_db, "main")
940
1043
  backup.step(-1)
941
1044
  backup.finish
@@ -945,9 +1048,18 @@ module ActiveRecord
945
1048
  @conn.release_connection if @conn
946
1049
  ActiveRecord::Base.establish_connection :arunit
947
1050
  end
1051
+
1052
+ private
1053
+ def capture_migration_output
1054
+ capture(:stdout) do
1055
+ ActiveRecord::Tasks::DatabaseTasks.migrate
1056
+ end
1057
+ end
948
1058
  end
1059
+ end
949
1060
 
950
- class DatabaseTasksMigrateTest < DatabaseTasksMigrationTestCase
1061
+ class DatabaseTasksMigrateTest < DatabaseTasksMigrationTestCase
1062
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
951
1063
  def test_migrate_set_and_unset_empty_values_for_verbose_and_version_env_vars
952
1064
  verbose, version = ENV["VERBOSE"], ENV["VERSION"]
953
1065
 
@@ -983,24 +1095,85 @@ module ActiveRecord
983
1095
  ensure
984
1096
  ENV["VERBOSE"], ENV["VERSION"] = verbose, version
985
1097
  end
1098
+ end
1099
+ end
986
1100
 
987
- private
988
- def capture_migration_output
989
- capture(:stdout) do
990
- ActiveRecord::Tasks::DatabaseTasks.migrate
991
- end
992
- end
1101
+ class DatabaseTasksMigrateScopeTest < DatabaseTasksMigrationTestCase
1102
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
1103
+ self.folder_name = "scope"
1104
+
1105
+ def test_migrate_using_scope_and_verbose_mode
1106
+ verbose, version, scope = ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"]
1107
+
1108
+ # run up migration
1109
+ ENV["VERSION"] = "2"
1110
+ ENV["VERBOSE"] = "true"
1111
+ ENV["SCOPE"] = "mysql"
1112
+
1113
+ output = capture_migration_output
1114
+ assert_includes output, "migrating"
1115
+ assert_not_includes output, "No migrations ran. (using mysql scope)"
1116
+
1117
+ # run no migration because 2 was already run
1118
+ output = capture_migration_output
1119
+ assert_includes output, "No migrations ran. (using mysql scope)"
1120
+ assert_not_includes output, "migrating"
1121
+ ensure
1122
+ ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"] = verbose, version, scope
1123
+ end
1124
+
1125
+ def test_migrate_using_scope_and_non_verbose_mode
1126
+ verbose, version, scope = ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"]
1127
+
1128
+ # run up migration
1129
+ ENV["VERSION"] = "2"
1130
+ ENV["VERBOSE"] = "false"
1131
+ ENV["SCOPE"] = "mysql"
1132
+
1133
+ assert_empty capture_migration_output
1134
+
1135
+ # run no migration because 2 was already run
1136
+ assert_empty capture_migration_output
1137
+ ensure
1138
+ ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"] = verbose, version, scope
1139
+ end
1140
+
1141
+ def test_migrate_using_empty_scope_and_verbose_mode
1142
+ verbose, version, scope = ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"]
1143
+
1144
+ # run up migration
1145
+ ENV["VERSION"] = "2"
1146
+ ENV["VERBOSE"] = "true"
1147
+ ENV["SCOPE"] = ""
1148
+
1149
+ output = capture_migration_output
1150
+ assert_includes output, "migrating"
1151
+ assert_not_includes output, "No migrations ran. (using mysql scope)"
1152
+
1153
+ # run no migration because 1 already ran and 2 is mysql scoped
1154
+ output = capture_migration_output
1155
+ assert_empty output
1156
+ assert_not_includes output, "No migrations ran. (using mysql scope)"
1157
+ ensure
1158
+ ENV["VERBOSE"], ENV["VERSION"], ENV["SCOPE"] = verbose, version, scope
1159
+ end
993
1160
  end
1161
+ end
1162
+
1163
+ class DatabaseTasksMigrateStatusTest < DatabaseTasksMigrationTestCase
1164
+ if current_adapter?(:SQLite3Adapter) && !in_memory_db?
1165
+ def setup
1166
+ @schema_migration = ActiveRecord::Base.connection_pool.schema_migration
1167
+ end
994
1168
 
995
- class DatabaseTasksMigrateStatusTest < DatabaseTasksMigrationTestCase
996
1169
  def test_migrate_status_table
997
- ActiveRecord::SchemaMigration.create_table
1170
+ @schema_migration.create_table
998
1171
  output = capture_migration_status
999
1172
  assert_match(/database: :memory:/, output)
1000
1173
  assert_match(/down 001 Valid people have last names/, output)
1001
1174
  assert_match(/down 002 We need reminders/, output)
1002
1175
  assert_match(/down 003 Innocent jointable/, output)
1003
- ActiveRecord::SchemaMigration.drop_table
1176
+ @schema_migration.delete_all_versions
1004
1177
  end
1005
1178
 
1006
1179
  private
@@ -1042,6 +1215,10 @@ module ActiveRecord
1042
1215
  e = assert_raise(RuntimeError) { ActiveRecord::Tasks::DatabaseTasks.migrate }
1043
1216
  assert_match(/Invalid format of target version/, e.message)
1044
1217
 
1218
+ ENV["VERSION"] = "1__1"
1219
+ e = assert_raise(RuntimeError) { ActiveRecord::Tasks::DatabaseTasks.migrate }
1220
+ assert_match(/Invalid format of target version/, e.message)
1221
+
1045
1222
  ENV["VERSION"] = "1_name"
1046
1223
  e = assert_raise(RuntimeError) { ActiveRecord::Tasks::DatabaseTasks.migrate }
1047
1224
  assert_match(/Invalid format of target version/, e.message)
@@ -1057,7 +1234,7 @@ module ActiveRecord
1057
1234
  end
1058
1235
 
1059
1236
  def test_migrate_clears_schema_cache_afterward
1060
- assert_called(ActiveRecord::Base, :clear_cache!) do
1237
+ assert_called(ActiveRecord::Base.schema_cache, :clear!) do
1061
1238
  ActiveRecord::Tasks::DatabaseTasks.migrate
1062
1239
  end
1063
1240
  end
@@ -1081,9 +1258,9 @@ module ActiveRecord
1081
1258
  def test_purges_current_environment_database
1082
1259
  old_configurations = ActiveRecord::Base.configurations
1083
1260
  configurations = {
1084
- "development" => { "database" => "dev-db" },
1085
- "test" => { "database" => "test-db" },
1086
- "production" => { "database" => "prod-db" }
1261
+ "development" => { "adapter" => "abstract", "database" => "dev-db" },
1262
+ "test" => { "adapter" => "abstract", "database" => "test-db" },
1263
+ "production" => { "adapter" => "abstract", "database" => "prod-db" },
1087
1264
  }
1088
1265
 
1089
1266
  ActiveRecord::Base.configurations = configurations
@@ -1105,7 +1282,7 @@ module ActiveRecord
1105
1282
  class DatabaseTasksPurgeAllTest < ActiveRecord::TestCase
1106
1283
  def test_purge_all_local_configurations
1107
1284
  old_configurations = ActiveRecord::Base.configurations
1108
- configurations = { development: { "database" => "my-db" } }
1285
+ configurations = { development: { "adapter" => "abstract", "database" => "my-db" } }
1109
1286
  ActiveRecord::Base.configurations = configurations
1110
1287
 
1111
1288
  assert_called_with(
@@ -1120,33 +1297,39 @@ module ActiveRecord
1120
1297
  end
1121
1298
  end
1122
1299
 
1123
- unless in_memory_db?
1124
- class DatabaseTasksTruncateAllTest < ActiveRecord::TestCase
1300
+ class DatabaseTasksTruncateAllTest < ActiveRecord::TestCase
1301
+ unless in_memory_db?
1125
1302
  self.use_transactional_tests = false
1126
1303
 
1127
- fixtures :authors, :author_addresses
1304
+ fixtures :courses, :colleges
1128
1305
 
1129
1306
  def setup
1130
- SchemaMigration.create_table
1131
- SchemaMigration.create!(version: SchemaMigration.table_name)
1132
- InternalMetadata.create_table
1133
- InternalMetadata.create!(key: InternalMetadata.table_name)
1307
+ pool = ARUnit2Model.connection_pool
1308
+ @schema_migration = pool.schema_migration
1309
+ @schema_migration.create_table
1310
+ @schema_migration.create_version(@schema_migration.table_name)
1311
+
1312
+ @internal_metadata = pool.internal_metadata
1313
+ @internal_metadata.create_table
1314
+ @internal_metadata[@internal_metadata.table_name] = nil
1315
+
1316
+ @old_configurations = ActiveRecord::Base.configurations
1134
1317
  end
1135
1318
 
1136
1319
  def teardown
1137
- SchemaMigration.delete_all
1138
- InternalMetadata.delete_all
1320
+ @schema_migration.delete_all_versions
1321
+ @internal_metadata.delete_all_entries
1139
1322
  clean_up_connection_handler
1323
+ ActiveRecord::Base.configurations = @old_configurations
1140
1324
  end
1141
1325
 
1142
1326
  def test_truncate_tables
1143
- assert_operator SchemaMigration.count, :>, 0
1144
- assert_operator InternalMetadata.count, :>, 0
1145
- assert_operator Author.count, :>, 0
1146
- assert_operator AuthorAddress.count, :>, 0
1327
+ assert_operator @schema_migration.count, :>, 0
1328
+ assert_operator @internal_metadata.count, :>, 0
1329
+ assert_operator Course.count, :>, 0
1330
+ assert_operator College.count, :>, 0
1147
1331
 
1148
- old_configurations = ActiveRecord::Base.configurations
1149
- db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
1332
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit2", name: "primary")
1150
1333
  configurations = { development: db_config.configuration_hash }
1151
1334
  ActiveRecord::Base.configurations = configurations
1152
1335
 
@@ -1156,61 +1339,57 @@ module ActiveRecord
1156
1339
  )
1157
1340
  end
1158
1341
 
1159
- assert_operator SchemaMigration.count, :>, 0
1160
- assert_operator InternalMetadata.count, :>, 0
1161
- assert_equal 0, Author.count
1162
- assert_equal 0, AuthorAddress.count
1163
- ensure
1164
- ActiveRecord::Base.configurations = old_configurations
1342
+ assert_operator @schema_migration.count, :>, 0
1343
+ assert_operator @internal_metadata.count, :>, 0
1344
+ assert_equal 0, Course.count
1345
+ assert_equal 0, College.count
1165
1346
  end
1166
1347
  end
1167
1348
 
1168
1349
  class DatabaseTasksTruncateAllWithPrefixTest < DatabaseTasksTruncateAllTest
1169
1350
  setup do
1170
1351
  ActiveRecord::Base.table_name_prefix = "p_"
1171
-
1172
- SchemaMigration.reset_table_name
1173
- InternalMetadata.reset_table_name
1174
1352
  end
1175
1353
 
1176
1354
  teardown do
1177
1355
  ActiveRecord::Base.table_name_prefix = nil
1178
-
1179
- SchemaMigration.reset_table_name
1180
- InternalMetadata.reset_table_name
1181
1356
  end
1182
1357
  end
1183
1358
 
1184
1359
  class DatabaseTasksTruncateAllWithSuffixTest < DatabaseTasksTruncateAllTest
1185
1360
  setup do
1186
1361
  ActiveRecord::Base.table_name_suffix = "_s"
1187
-
1188
- SchemaMigration.reset_table_name
1189
- InternalMetadata.reset_table_name
1190
1362
  end
1191
1363
 
1192
1364
  teardown do
1193
1365
  ActiveRecord::Base.table_name_suffix = nil
1194
-
1195
- SchemaMigration.reset_table_name
1196
- InternalMetadata.reset_table_name
1197
1366
  end
1198
1367
  end
1199
1368
  end
1200
1369
 
1201
1370
  class DatabaseTasksTruncateAllWithMultipleDatabasesTest < ActiveRecord::TestCase
1371
+ include DatabaseTasksHelper
1372
+
1202
1373
  def setup
1203
1374
  @configurations = {
1204
- "development" => { "primary" => { "database" => "dev-db" }, "secondary" => { "database" => "secondary-dev-db" } },
1205
- "test" => { "primary" => { "database" => "test-db" }, "secondary" => { "database" => "secondary-test-db" } },
1206
- "production" => { "primary" => { "url" => "abstract://prod-db-host/prod-db" }, "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" } }
1375
+ "development" => {
1376
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
1377
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
1378
+ },
1379
+ "test" => {
1380
+ "primary" => { "adapter" => "abstract", "database" => "test-db" },
1381
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-test-db" },
1382
+ },
1383
+ "production" => {
1384
+ "primary" => { "url" => "abstract://prod-db-host/prod-db" },
1385
+ "secondary" => { "url" => "abstract://secondary-prod-db-host/secondary-prod-db" },
1386
+ }
1207
1387
  }
1208
1388
  end
1209
1389
 
1210
1390
  def test_truncate_all_databases_for_environment
1211
1391
  with_stubbed_configurations do
1212
- assert_called_with(
1213
- ActiveRecord::Tasks::DatabaseTasks,
1392
+ assert_called_for_configs(
1214
1393
  :truncate_tables,
1215
1394
  [
1216
1395
  [config_for("test", "primary")],
@@ -1226,8 +1405,7 @@ module ActiveRecord
1226
1405
 
1227
1406
  def test_truncate_all_databases_with_url_for_environment
1228
1407
  with_stubbed_configurations do
1229
- assert_called_with(
1230
- ActiveRecord::Tasks::DatabaseTasks,
1408
+ assert_called_for_configs(
1231
1409
  :truncate_tables,
1232
1410
  [
1233
1411
  [config_for("production", "primary")],
@@ -1243,8 +1421,7 @@ module ActiveRecord
1243
1421
 
1244
1422
  def test_truncate_all_development_databases_when_env_is_not_specified
1245
1423
  with_stubbed_configurations do
1246
- assert_called_with(
1247
- ActiveRecord::Tasks::DatabaseTasks,
1424
+ assert_called_for_configs(
1248
1425
  :truncate_tables,
1249
1426
  [
1250
1427
  [config_for("development", "primary")],
@@ -1263,8 +1440,7 @@ module ActiveRecord
1263
1440
  ENV["RAILS_ENV"] = "development"
1264
1441
 
1265
1442
  with_stubbed_configurations do
1266
- assert_called_with(
1267
- ActiveRecord::Tasks::DatabaseTasks,
1443
+ assert_called_for_configs(
1268
1444
  :truncate_tables,
1269
1445
  [
1270
1446
  [config_for("development", "primary")],
@@ -1311,7 +1487,7 @@ module ActiveRecord
1311
1487
  def test_charset_current
1312
1488
  old_configurations = ActiveRecord::Base.configurations
1313
1489
  configurations = {
1314
- "production" => { "database" => "prod-db" }
1490
+ "production" => { "adapter" => "abstract", "database" => "prod-db" }
1315
1491
  }
1316
1492
 
1317
1493
  ActiveRecord::Base.configurations = configurations
@@ -1344,7 +1520,7 @@ module ActiveRecord
1344
1520
  def test_collation_current
1345
1521
  old_configurations = ActiveRecord::Base.configurations
1346
1522
  configurations = {
1347
- "production" => { "database" => "prod-db" }
1523
+ "production" => { "adapter" => "abstract", "database" => "prod-db" }
1348
1524
  }
1349
1525
 
1350
1526
  ActiveRecord::Base.configurations = configurations
@@ -1382,13 +1558,16 @@ module ActiveRecord
1382
1558
  version = ENV["VERSION"]
1383
1559
 
1384
1560
  ENV["VERSION"] = "0"
1385
- assert_equal ENV["VERSION"].to_i, ActiveRecord::Tasks::DatabaseTasks.target_version
1561
+ assert_equal 0, ActiveRecord::Tasks::DatabaseTasks.target_version
1386
1562
 
1387
1563
  ENV["VERSION"] = "42"
1388
- assert_equal ENV["VERSION"].to_i, ActiveRecord::Tasks::DatabaseTasks.target_version
1564
+ assert_equal 42, ActiveRecord::Tasks::DatabaseTasks.target_version
1389
1565
 
1390
1566
  ENV["VERSION"] = "042"
1391
- assert_equal ENV["VERSION"].to_i, ActiveRecord::Tasks::DatabaseTasks.target_version
1567
+ assert_equal 42, ActiveRecord::Tasks::DatabaseTasks.target_version
1568
+
1569
+ ENV["VERSION"] = "2000_01_01_000042"
1570
+ assert_equal 20000101000042, ActiveRecord::Tasks::DatabaseTasks.target_version
1392
1571
  ensure
1393
1572
  ENV["VERSION"] = version
1394
1573
  end
@@ -1403,7 +1582,7 @@ module ActiveRecord
1403
1582
  ENV["VERSION"] = version
1404
1583
  end
1405
1584
 
1406
- def test_check_target_version_does_not_raise_error_if_version_is_not_setted
1585
+ def test_check_target_version_does_not_raise_error_if_version_is_not_set
1407
1586
  version = ENV.delete("VERSION")
1408
1587
  assert_nothing_raised { ActiveRecord::Tasks::DatabaseTasks.check_target_version }
1409
1588
  ensure
@@ -1456,6 +1635,9 @@ module ActiveRecord
1456
1635
  ENV["VERSION"] = "001"
1457
1636
  assert_nothing_raised { ActiveRecord::Tasks::DatabaseTasks.check_target_version }
1458
1637
 
1638
+ ENV["VERSION"] = "1_001"
1639
+ assert_nothing_raised { ActiveRecord::Tasks::DatabaseTasks.check_target_version }
1640
+
1459
1641
  ENV["VERSION"] = "001_name.rb"
1460
1642
  assert_nothing_raised { ActiveRecord::Tasks::DatabaseTasks.check_target_version }
1461
1643
  ensure
@@ -1506,21 +1688,112 @@ module ActiveRecord
1506
1688
  end
1507
1689
  end
1508
1690
 
1509
- class DatabaseTasksCheckSchemaFileDefaultsTest < ActiveRecord::TestCase
1510
- def test_check_schema_file_defaults
1691
+ class DatabaseTasksCheckSchemaFileMethods < ActiveRecord::TestCase
1692
+ setup do
1693
+ @configurations = { "development" => { "adapter" => "abstract", "database" => "my-db" } }
1694
+ end
1695
+
1696
+ def test_check_dump_filename_defaults
1511
1697
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1512
- assert_equal "/tmp/schema.rb", ActiveRecord::Tasks::DatabaseTasks.schema_file
1698
+ with_stubbed_configurations do
1699
+ assert_equal "/tmp/schema.rb", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "primary"))
1700
+ end
1513
1701
  end
1514
1702
  end
1515
- end
1516
1703
 
1517
- class DatabaseTasksCheckSchemaFileSpecifiedFormatsTest < ActiveRecord::TestCase
1704
+ def test_check_dump_filename_with_schema_env
1705
+ schema = ENV["SCHEMA"]
1706
+ ENV["SCHEMA"] = "schema_path"
1707
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1708
+ with_stubbed_configurations do
1709
+ assert_equal "schema_path", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "primary"))
1710
+ end
1711
+ end
1712
+ ensure
1713
+ ENV["SCHEMA"] = schema
1714
+ end
1715
+
1716
+ { ruby: "schema.rb", sql: "structure.sql" }.each_pair do |fmt, filename|
1717
+ define_method("test_check_dump_filename_for_#{fmt}_format") do
1718
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1719
+ with_stubbed_configurations do
1720
+ assert_equal "/tmp/#{filename}", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "primary"), fmt)
1721
+ end
1722
+ end
1723
+ end
1724
+ end
1725
+
1726
+ def test_check_dump_filename_defaults_for_non_primary_databases
1727
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1728
+ configurations = {
1729
+ "development" => {
1730
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
1731
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
1732
+ },
1733
+ }
1734
+ with_stubbed_configurations(configurations) do
1735
+ assert_equal "/tmp/secondary_schema.rb", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "secondary"))
1736
+ end
1737
+ end
1738
+ end
1739
+
1740
+ def test_setting_schema_dump_to_nil
1741
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1742
+ configurations = {
1743
+ "development" => { "primary" => { "adapter" => "abstract", "database" => "dev-db", "schema_dump" => false } },
1744
+ }
1745
+ with_stubbed_configurations(configurations) do
1746
+ assert_nil ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "primary"))
1747
+ end
1748
+ end
1749
+ end
1750
+
1751
+ def test_check_dump_filename_with_schema_env_with_non_primary_databases
1752
+ schema = ENV["SCHEMA"]
1753
+ ENV["SCHEMA"] = "schema_path"
1754
+ ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1755
+ configurations = {
1756
+ "development" => {
1757
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
1758
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
1759
+ },
1760
+ }
1761
+ with_stubbed_configurations(configurations) do
1762
+ assert_equal "schema_path", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "secondary"))
1763
+ end
1764
+ end
1765
+ ensure
1766
+ ENV["SCHEMA"] = schema
1767
+ end
1768
+
1518
1769
  { ruby: "schema.rb", sql: "structure.sql" }.each_pair do |fmt, filename|
1519
- define_method("test_check_schema_file_for_#{fmt}_format") do
1770
+ define_method("test_check_dump_filename_for_#{fmt}_format_with_non_primary_databases") do
1520
1771
  ActiveRecord::Tasks::DatabaseTasks.stub(:db_dir, "/tmp") do
1521
- assert_equal "/tmp/#{filename}", ActiveRecord::Tasks::DatabaseTasks.schema_file(fmt)
1772
+ configurations = {
1773
+ "development" => {
1774
+ "primary" => { "adapter" => "abstract", "database" => "dev-db" },
1775
+ "secondary" => { "adapter" => "abstract", "database" => "secondary-dev-db" },
1776
+ },
1777
+ }
1778
+ with_stubbed_configurations(configurations) do
1779
+ assert_equal "/tmp/secondary_#{filename}", ActiveRecord::Tasks::DatabaseTasks.schema_dump_path(config_for("development", "secondary"), fmt)
1780
+ end
1522
1781
  end
1523
1782
  end
1524
1783
  end
1784
+
1785
+ private
1786
+ def config_for(env_name, name)
1787
+ ActiveRecord::Base.configurations.configs_for(env_name: env_name, name: name)
1788
+ end
1789
+
1790
+ def with_stubbed_configurations(configurations = @configurations)
1791
+ old_configurations = ActiveRecord::Base.configurations
1792
+ ActiveRecord::Base.configurations = configurations
1793
+
1794
+ yield
1795
+ ensure
1796
+ ActiveRecord::Base.configurations = old_configurations
1797
+ end
1525
1798
  end
1526
1799
  end