ibm_db 5.1.0-x86-mingw32 → 5.3.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,220 +1,267 @@
1
- require 'cases/helper'
2
- require 'active_record/tasks/database_tasks'
3
- require 'pathname'
1
+ # frozen_string_literal: true
4
2
 
5
- if current_adapter?(:SQLite3Adapter)
6
- module ActiveRecord
7
- class SqliteDBCreateTest < ActiveRecord::TestCase
8
- def setup
9
- @database = 'db_create.sqlite3'
10
- @connection = stub :connection
11
- @configuration = {
12
- 'adapter' => 'sqlite3',
13
- 'database' => @database
14
- }
15
-
16
- File.stubs(:exist?).returns(false)
17
- ActiveRecord::Base.stubs(:connection).returns(@connection)
18
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
19
-
20
- $stdout, @original_stdout = StringIO.new, $stdout
21
- $stderr, @original_stderr = StringIO.new, $stderr
22
- end
23
-
24
- def teardown
25
- $stdout, $stderr = @original_stdout, @original_stderr
26
- end
27
-
28
- def test_db_checks_database_exists
29
- File.expects(:exist?).with(@database).returns(false)
30
-
31
- ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
32
- end
33
-
34
- def test_when_db_created_successfully_outputs_info_to_stdout
35
- ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
3
+ require "cases/helper"
4
+ require "active_record/tasks/database_tasks"
5
+ require "pathname"
36
6
 
37
- assert_equal $stdout.string, "Created database '#{@database}'\n"
38
- end
39
-
40
- def test_db_create_when_file_exists
41
- File.stubs(:exist?).returns(true)
42
-
43
- ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
44
-
45
- assert_equal $stderr.string, "Database '#{@database}' already exists\n"
46
- end
7
+ if current_adapter?(:SQLite3Adapter)
8
+ module ActiveRecord
9
+ class SqliteDBCreateTest < ActiveRecord::TestCase
10
+ def setup
11
+ @database = "db_create.sqlite3"
12
+ @configuration = {
13
+ "adapter" => "sqlite3",
14
+ "database" => @database
15
+ }
16
+ $stdout, @original_stdout = StringIO.new, $stdout
17
+ $stderr, @original_stderr = StringIO.new, $stderr
18
+ end
47
19
 
48
- def test_db_create_with_file_does_nothing
49
- File.stubs(:exist?).returns(true)
50
- $stderr.stubs(:puts).returns(nil)
20
+ def teardown
21
+ $stdout, $stderr = @original_stdout, @original_stderr
22
+ end
51
23
 
52
- ActiveRecord::Base.expects(:establish_connection).never
24
+ def test_db_checks_database_exists
25
+ ActiveRecord::Base.stub(:establish_connection, nil) do
26
+ assert_called_with(File, :exist?, [@database], returns: false) do
27
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
28
+ end
29
+ end
30
+ end
53
31
 
54
- ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
55
- end
32
+ def test_when_db_created_successfully_outputs_info_to_stdout
33
+ ActiveRecord::Base.stub(:establish_connection, nil) do
34
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
56
35
 
57
- def test_db_create_establishes_a_connection
58
- ActiveRecord::Base.expects(:establish_connection).with(@configuration)
36
+ assert_equal "Created database '#{@database}'\n", $stdout.string
37
+ end
38
+ end
59
39
 
60
- ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root'
61
- end
40
+ def test_db_create_when_file_exists
41
+ File.stub(:exist?, true) do
42
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
62
43
 
63
- def test_db_create_with_error_prints_message
64
- ActiveRecord::Base.stubs(:establish_connection).raises(Exception)
44
+ assert_equal "Database '#{@database}' already exists\n", $stderr.string
45
+ end
46
+ end
65
47
 
66
- $stderr.stubs(:puts).returns(true)
67
- $stderr.expects(:puts).
68
- with("Couldn't create database for #{@configuration.inspect}")
48
+ def test_db_create_with_file_does_nothing
49
+ File.stub(:exist?, true) do
50
+ assert_not_called(ActiveRecord::Base, :establish_connection) do
51
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
52
+ end
53
+ end
54
+ end
69
55
 
70
- assert_raises(Exception) { ActiveRecord::Tasks::DatabaseTasks.create @configuration, '/rails/root' }
71
- end
72
- end
56
+ def test_db_create_establishes_a_connection
57
+ calls = []
58
+ ActiveRecord::Base.stub(:establish_connection, proc { |*args| calls << args }) do
59
+ ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
60
+ end
73
61
 
74
- class SqliteDBDropTest < ActiveRecord::TestCase
75
- def setup
76
- @database = "db_create.sqlite3"
77
- @path = stub(:to_s => '/absolute/path', :absolute? => true)
78
- @configuration = {
79
- 'adapter' => 'sqlite3',
80
- 'database' => @database
81
- }
82
-
83
- Pathname.stubs(:new).returns(@path)
84
- File.stubs(:join).returns('/former/relative/path')
85
- FileUtils.stubs(:rm).returns(true)
86
-
87
- $stdout, @original_stdout = StringIO.new, $stdout
88
- $stderr, @original_stderr = StringIO.new, $stderr
89
- end
62
+ assert_equal [@configuration.symbolize_keys], calls.map { |c| c.first.configuration_hash }
63
+ end
90
64
 
91
- def teardown
92
- $stdout, $stderr = @original_stdout, @original_stderr
65
+ def test_db_create_with_error_prints_message
66
+ ActiveRecord::Base.stub(:establish_connection, proc { raise Exception }) do
67
+ assert_raises(Exception) { ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root" }
68
+ assert_match "Couldn't create '#{@configuration['database']}' database. Please check your configuration.", $stderr.string
69
+ end
70
+ end
93
71
  end
94
72
 
95
- def test_creates_path_from_database
96
- Pathname.expects(:new).with(@database).returns(@path)
73
+ class SqliteDBDropTest < ActiveRecord::TestCase
74
+ def setup
75
+ @database = "db_create.sqlite3"
76
+ @configuration = {
77
+ "adapter" => "sqlite3",
78
+ "database" => @database
79
+ }
80
+ @path = Class.new do
81
+ def to_s; "/absolute/path" end
82
+ def absolute?; true end
83
+ end.new
84
+
85
+ $stdout, @original_stdout = StringIO.new, $stdout
86
+ $stderr, @original_stderr = StringIO.new, $stderr
87
+ end
97
88
 
98
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration, '/rails/root'
99
- end
89
+ def teardown
90
+ $stdout, $stderr = @original_stdout, @original_stderr
91
+ end
100
92
 
101
- def test_removes_file_with_absolute_path
102
- File.stubs(:exist?).returns(true)
103
- @path.stubs(:absolute?).returns(true)
93
+ def test_creates_path_from_database
94
+ assert_called_with(Pathname, :new, [@database], returns: @path) do
95
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration, "/rails/root"
96
+ end
97
+ end
104
98
 
105
- FileUtils.expects(:rm).with('/absolute/path')
99
+ def test_removes_file_with_absolute_path
100
+ Pathname.stub(:new, @path) do
101
+ assert_called_with(FileUtils, :rm, ["/absolute/path"]) do
102
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration, "/rails/root"
103
+ end
104
+ end
105
+ end
106
106
 
107
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration, '/rails/root'
108
- end
107
+ def test_generates_absolute_path_with_given_root
108
+ Pathname.stub(:new, @path) do
109
+ @path.stub(:absolute?, false) do
110
+ assert_called_with(File, :join, ["/rails/root", @path],
111
+ returns: "/former/relative/path"
112
+ ) do
113
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration, "/rails/root"
114
+ end
115
+ end
116
+ end
117
+ end
109
118
 
110
- def test_generates_absolute_path_with_given_root
111
- @path.stubs(:absolute?).returns(false)
119
+ def test_removes_file_with_relative_path
120
+ File.stub(:join, "/former/relative/path") do
121
+ @path.stub(:absolute?, false) do
122
+ assert_called_with(FileUtils, :rm, ["/former/relative/path"]) do
123
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration, "/rails/root"
124
+ end
125
+ end
126
+ end
127
+ end
112
128
 
113
- File.expects(:join).with('/rails/root', @path).
114
- returns('/former/relative/path')
129
+ def test_when_db_dropped_successfully_outputs_info_to_stdout
130
+ FileUtils.stub(:rm, nil) do
131
+ ActiveRecord::Tasks::DatabaseTasks.drop @configuration, "/rails/root"
115
132
 
116
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration, '/rails/root'
133
+ assert_equal "Dropped database '#{@database}'\n", $stdout.string
134
+ end
135
+ end
117
136
  end
118
137
 
119
- def test_removes_file_with_relative_path
120
- File.stubs(:exist?).returns(true)
121
- @path.stubs(:absolute?).returns(false)
122
-
123
- FileUtils.expects(:rm).with('/former/relative/path')
138
+ class SqliteDBCharsetTest < ActiveRecord::TestCase
139
+ def setup
140
+ @database = "db_create.sqlite3"
141
+ @connection = Class.new { def encoding; end }.new
142
+ @configuration = {
143
+ "adapter" => "sqlite3",
144
+ "database" => @database
145
+ }
146
+ end
124
147
 
125
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration, '/rails/root'
148
+ def test_db_retrieves_charset
149
+ ActiveRecord::Base.stub(:connection, @connection) do
150
+ assert_called(@connection, :encoding) do
151
+ ActiveRecord::Tasks::DatabaseTasks.charset @configuration, "/rails/root"
152
+ end
153
+ end
154
+ end
126
155
  end
127
156
 
128
- def test_when_db_dropped_successfully_outputs_info_to_stdout
129
- ActiveRecord::Tasks::DatabaseTasks.drop @configuration, '/rails/root'
157
+ class SqliteDBCollationTest < ActiveRecord::TestCase
158
+ def setup
159
+ @database = "db_create.sqlite3"
160
+ @configuration = {
161
+ "adapter" => "sqlite3",
162
+ "database" => @database
163
+ }
164
+ end
130
165
 
131
- assert_equal $stdout.string, "Dropped database '#{@database}'\n"
166
+ def test_db_retrieves_collation
167
+ assert_raise NoMethodError do
168
+ ActiveRecord::Tasks::DatabaseTasks.collation @configuration, "/rails/root"
169
+ end
170
+ end
132
171
  end
133
- end
134
172
 
135
- class SqliteDBCharsetTest < ActiveRecord::TestCase
136
- def setup
137
- @database = 'db_create.sqlite3'
138
- @connection = stub :connection
139
- @configuration = {
140
- 'adapter' => 'sqlite3',
141
- 'database' => @database
142
- }
143
-
144
- File.stubs(:exist?).returns(false)
145
- ActiveRecord::Base.stubs(:connection).returns(@connection)
146
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
147
- end
173
+ class SqliteStructureDumpTest < ActiveRecord::TestCase
174
+ def setup
175
+ @database = "db_create.sqlite3"
176
+ @configuration = {
177
+ "adapter" => "sqlite3",
178
+ "database" => @database
179
+ }
148
180
 
149
- def test_db_retrieves_charset
150
- @connection.expects(:encoding)
151
- ActiveRecord::Tasks::DatabaseTasks.charset @configuration, '/rails/root'
152
- end
153
- end
154
-
155
- class SqliteDBCollationTest < ActiveRecord::TestCase
156
- def setup
157
- @database = 'db_create.sqlite3'
158
- @connection = stub :connection
159
- @configuration = {
160
- 'adapter' => 'sqlite3',
161
- 'database' => @database
162
- }
163
-
164
- File.stubs(:exist?).returns(false)
165
- ActiveRecord::Base.stubs(:connection).returns(@connection)
166
- ActiveRecord::Base.stubs(:establish_connection).returns(true)
167
- end
181
+ `sqlite3 #{@database} 'CREATE TABLE bar(id INTEGER)'`
182
+ `sqlite3 #{@database} 'CREATE TABLE foo(id INTEGER)'`
183
+ end
168
184
 
169
- def test_db_retrieves_collation
170
- assert_raise NoMethodError do
171
- ActiveRecord::Tasks::DatabaseTasks.collation @configuration, '/rails/root'
185
+ def test_structure_dump
186
+ dbfile = @database
187
+ filename = "awesome-file.sql"
188
+
189
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump @configuration, filename, "/rails/root"
190
+ assert File.exist?(dbfile)
191
+ assert File.exist?(filename)
192
+ assert_match(/CREATE TABLE foo/, File.read(filename))
193
+ assert_match(/CREATE TABLE bar/, File.read(filename))
194
+ ensure
195
+ FileUtils.rm_f(filename)
196
+ FileUtils.rm_f(dbfile)
172
197
  end
173
- end
174
- end
175
198
 
176
- class SqliteStructureDumpTest < ActiveRecord::TestCase
177
- def setup
178
- @database = "db_create.sqlite3"
179
- @configuration = {
180
- 'adapter' => 'sqlite3',
181
- 'database' => @database
182
- }
183
- end
199
+ def test_structure_dump_with_ignore_tables
200
+ dbfile = @database
201
+ filename = "awesome-file.sql"
202
+ assert_called(ActiveRecord::SchemaDumper, :ignore_tables, returns: ["foo"]) do
203
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename, "/rails/root")
204
+ end
205
+ assert File.exist?(dbfile)
206
+ assert File.exist?(filename)
207
+ assert_match(/bar/, File.read(filename))
208
+ assert_no_match(/foo/, File.read(filename))
209
+ ensure
210
+ FileUtils.rm_f(filename)
211
+ FileUtils.rm_f(dbfile)
212
+ end
184
213
 
185
- def test_structure_dump
186
- dbfile = @database
187
- filename = "awesome-file.sql"
214
+ def test_structure_dump_execution_fails
215
+ dbfile = @database
216
+ filename = "awesome-file.sql"
217
+ assert_called_with(
218
+ Kernel,
219
+ :system,
220
+ ["sqlite3", "--noop", "db_create.sqlite3", ".schema", out: "awesome-file.sql"],
221
+ returns: nil
222
+ ) do
223
+ e = assert_raise(RuntimeError) do
224
+ with_structure_dump_flags(["--noop"]) do
225
+ quietly { ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename, "/rails/root") }
226
+ end
227
+ end
228
+ assert_match("failed to execute:", e.message)
229
+ end
230
+ ensure
231
+ FileUtils.rm_f(filename)
232
+ FileUtils.rm_f(dbfile)
233
+ end
188
234
 
189
- ActiveRecord::Tasks::DatabaseTasks.structure_dump @configuration, filename, '/rails/root'
190
- assert File.exist?(dbfile)
191
- assert File.exist?(filename)
192
- ensure
193
- FileUtils.rm_f(filename)
194
- FileUtils.rm_f(dbfile)
235
+ private
236
+ def with_structure_dump_flags(flags)
237
+ old = ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags
238
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = flags
239
+ yield
240
+ ensure
241
+ ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = old
242
+ end
195
243
  end
196
- end
197
244
 
198
- class SqliteStructureLoadTest < ActiveRecord::TestCase
199
- def setup
200
- @database = "db_create.sqlite3"
201
- @configuration = {
202
- 'adapter' => 'sqlite3',
203
- 'database' => @database
204
- }
205
- end
245
+ class SqliteStructureLoadTest < ActiveRecord::TestCase
246
+ def setup
247
+ @database = "db_create.sqlite3"
248
+ @configuration = {
249
+ "adapter" => "sqlite3",
250
+ "database" => @database
251
+ }
252
+ end
206
253
 
207
- def test_structure_load
208
- dbfile = @database
209
- filename = "awesome-file.sql"
254
+ def test_structure_load
255
+ dbfile = @database
256
+ filename = "awesome-file.sql"
210
257
 
211
- open(filename, 'w') { |f| f.puts("select datetime('now', 'localtime');") }
212
- ActiveRecord::Tasks::DatabaseTasks.structure_load @configuration, filename, '/rails/root'
213
- assert File.exist?(dbfile)
214
- ensure
215
- FileUtils.rm_f(filename)
216
- FileUtils.rm_f(dbfile)
258
+ open(filename, "w") { |f| f.puts("select datetime('now', 'localtime');") }
259
+ ActiveRecord::Tasks::DatabaseTasks.structure_load @configuration, filename, "/rails/root"
260
+ assert File.exist?(dbfile)
261
+ ensure
262
+ FileUtils.rm_f(filename)
263
+ FileUtils.rm_f(dbfile)
264
+ end
217
265
  end
218
266
  end
219
267
  end
220
- end
@@ -1,25 +1,40 @@
1
- require 'active_support/test_case'
2
- require 'active_support/testing/stream'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
4
+ require "active_support/testing/autorun"
5
+ require "active_support/testing/method_call_assertions"
6
+ require "active_support/testing/stream"
7
+ require "active_record/fixtures"
8
+
9
+ require "cases/validations_repair_helper"
3
10
 
4
11
  module ActiveRecord
5
12
  # = Active Record Test Case
6
13
  #
7
14
  # Defines some test assertions to test against SQL queries.
8
15
  class TestCase < ActiveSupport::TestCase #:nodoc:
16
+ include ActiveSupport::Testing::MethodCallAssertions
9
17
  include ActiveSupport::Testing::Stream
18
+ include ActiveRecord::TestFixtures
19
+ include ActiveRecord::ValidationsRepairHelper
10
20
 
11
- def teardown
12
- SQLCounter.clear_log
21
+ self.fixture_path = FIXTURES_ROOT
22
+ self.use_instantiated_fixtures = false
23
+ self.use_transactional_tests = true
24
+
25
+ def create_fixtures(*fixture_set_names, &block)
26
+ ActiveRecord::FixtureSet.create_fixtures(ActiveRecord::TestCase.fixture_path, fixture_set_names, fixture_class_names, &block)
13
27
  end
14
28
 
15
- def assert_date_from_db(expected, actual, message = nil)
16
- assert_equal expected.to_s, actual.to_s, message
29
+ def teardown
30
+ SQLCounter.clear_log
17
31
  end
18
32
 
19
33
  def capture_sql
34
+ ActiveRecord::Base.connection.materialize_transactions
20
35
  SQLCounter.clear_log
21
36
  yield
22
- SQLCounter.log_all.dup
37
+ SQLCounter.log.dup
23
38
  end
24
39
 
25
40
  def assert_sql(*patterns_to_match)
@@ -27,13 +42,14 @@ module ActiveRecord
27
42
  ensure
28
43
  failed_patterns = []
29
44
  patterns_to_match.each do |pattern|
30
- failed_patterns << pattern unless SQLCounter.log_all.any?{ |sql| pattern === sql }
45
+ failed_patterns << pattern unless SQLCounter.log_all.any? { |sql| pattern === sql }
31
46
  end
32
47
  assert failed_patterns.empty?, "Query pattern(s) #{failed_patterns.map(&:inspect).join(', ')} not found.#{SQLCounter.log.size == 0 ? '' : "\nQueries:\n#{SQLCounter.log.join("\n")}"}"
33
48
  end
34
49
 
35
50
  def assert_queries(num = 1, options = {})
36
51
  ignore_none = options.fetch(:ignore_none) { num == :any }
52
+ ActiveRecord::Base.connection.materialize_transactions
37
53
  SQLCounter.clear_log
38
54
  x = yield
39
55
  the_log = ignore_none ? SQLCounter.log_all : SQLCounter.log
@@ -51,11 +67,11 @@ module ActiveRecord
51
67
  assert_queries(0, options, &block)
52
68
  end
53
69
 
54
- def assert_column(model, column_name, msg=nil)
70
+ def assert_column(model, column_name, msg = nil)
55
71
  assert has_column?(model, column_name), msg
56
72
  end
57
73
 
58
- def assert_no_column(model, column_name, msg=nil)
74
+ def assert_no_column(model, column_name, msg = nil)
59
75
  assert_not has_column?(model, column_name), msg
60
76
  end
61
77
 
@@ -64,8 +80,26 @@ module ActiveRecord
64
80
  model.column_names.include?(column_name.to_s)
65
81
  end
66
82
 
67
- def frozen_error_class
68
- Object.const_defined?(:FrozenError) ? FrozenError : RuntimeError
83
+ def with_has_many_inversing
84
+ old = ActiveRecord::Base.has_many_inversing
85
+ ActiveRecord::Base.has_many_inversing = true
86
+ yield
87
+ ensure
88
+ ActiveRecord::Base.has_many_inversing = old
89
+ end
90
+
91
+ def reset_callbacks(klass, kind)
92
+ old_callbacks = {}
93
+ old_callbacks[klass] = klass.send("_#{kind}_callbacks").dup
94
+ klass.subclasses.each do |subclass|
95
+ old_callbacks[subclass] = subclass.send("_#{kind}_callbacks").dup
96
+ end
97
+ yield
98
+ ensure
99
+ klass.send("_#{kind}_callbacks=", old_callbacks[klass])
100
+ klass.subclasses.each do |subclass|
101
+ subclass.send("_#{kind}_callbacks=", old_callbacks[subclass])
102
+ end
69
103
  end
70
104
  end
71
105
 
@@ -93,39 +127,16 @@ module ActiveRecord
93
127
  def clear_log; self.log = []; self.log_all = []; end
94
128
  end
95
129
 
96
- self.clear_log
97
-
98
- self.ignored_sql = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/]
99
-
100
- # FIXME: this needs to be refactored so specific database can add their own
101
- # ignored SQL, or better yet, use a different notification for the queries
102
- # instead examining the SQL content.
103
- oracle_ignored = [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im, /^\s*select .* from all_constraints/im, /^\s*select .* from all_tab_cols/im]
104
- mysql_ignored = [/^SHOW FULL TABLES/i, /^SHOW FULL FIELDS/, /^SHOW CREATE TABLE /i, /^SHOW VARIABLES /, /^\s*SELECT (?:column_name|table_name)\b.*\bFROM information_schema\.(?:key_column_usage|tables)\b/im]
105
- postgresql_ignored = [/^\s*select\b.*\bfrom\b.*pg_namespace\b/im, /^\s*select tablename\b.*from pg_tables\b/im, /^\s*select\b.*\battname\b.*\bfrom\b.*\bpg_attribute\b/im, /^SHOW search_path/i]
106
- sqlite3_ignored = [/^\s*SELECT name\b.*\bFROM sqlite_master/im, /^\s*SELECT sql\b.*\bFROM sqlite_master/im]
107
-
108
- [oracle_ignored, mysql_ignored, postgresql_ignored, sqlite3_ignored].each do |db_ignored_sql|
109
- ignored_sql.concat db_ignored_sql
110
- end
111
-
112
- attr_reader :ignore
113
-
114
- def initialize(ignore = Regexp.union(self.class.ignored_sql))
115
- @ignore = ignore
116
- end
130
+ clear_log
117
131
 
118
132
  def call(name, start, finish, message_id, values)
119
- sql = values[:sql]
120
-
121
- # FIXME: this seems bad. we should probably have a better way to indicate
122
- # the query was cached
123
- return if 'CACHE' == values[:name]
133
+ return if values[:cached]
124
134
 
135
+ sql = values[:sql]
125
136
  self.class.log_all << sql
126
- self.class.log << sql unless ignore =~ sql
137
+ self.class.log << sql unless ["SCHEMA", "TRANSACTION"].include? values[:name]
127
138
  end
128
139
  end
129
140
 
130
- ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
141
+ ActiveSupport::Notifications.subscribe("sql.active_record", SQLCounter.new)
131
142
  end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "active_record/test_databases"
5
+
6
+ class TestDatabasesTest < ActiveRecord::TestCase
7
+ unless in_memory_db?
8
+ def test_databases_are_created
9
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "arunit"
10
+ prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, {
11
+ "arunit" => {
12
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
13
+ }
14
+ }
15
+
16
+ base_db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
17
+ expected_database = "#{base_db_config.database}-2"
18
+
19
+ ActiveRecord::Tasks::DatabaseTasks.stub(:reconstruct_from_schema, ->(db_config, _, _) {
20
+ assert_equal expected_database, db_config.database
21
+ }) do
22
+ ActiveRecord::TestDatabases.create_and_load_schema(2, env_name: "arunit")
23
+ end
24
+ ensure
25
+ ActiveRecord::Base.configurations = prev_configs
26
+ ActiveRecord::Base.establish_connection(:arunit)
27
+ ENV["RAILS_ENV"] = previous_env
28
+ end
29
+
30
+ def test_create_databases_after_fork
31
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "arunit"
32
+ prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, {
33
+ "arunit" => {
34
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
35
+ }
36
+ }
37
+
38
+ idx = 42
39
+ base_db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
40
+ expected_database = "#{base_db_config.database}-#{idx}"
41
+
42
+ ActiveRecord::Tasks::DatabaseTasks.stub(:reconstruct_from_schema, ->(db_config, _, _) {
43
+ assert_equal expected_database, db_config.database
44
+ }) do
45
+ ActiveSupport::Testing::Parallelization.after_fork_hooks.each { |cb| cb.call(idx) }
46
+ end
47
+
48
+ # Updates the database configuration
49
+ assert_equal expected_database, ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary").database
50
+ ensure
51
+ ActiveRecord::Base.configurations = prev_configs
52
+ ActiveRecord::Base.establish_connection(:arunit)
53
+ ENV["RAILS_ENV"] = previous_env
54
+ end
55
+
56
+ def test_order_of_configurations_isnt_changed_by_test_databases
57
+ previous_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "arunit"
58
+ prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, {
59
+ "arunit" => {
60
+ "primary" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" },
61
+ "replica" => { "adapter" => "sqlite3", "database" => "test/db/primary.sqlite3" }
62
+ }
63
+ }
64
+
65
+ idx = 42
66
+ base_configs_order = ActiveRecord::Base.configurations.configs_for(env_name: "arunit").map(&:name)
67
+
68
+ ActiveRecord::Tasks::DatabaseTasks.stub(:reconstruct_from_schema, ->(db_config, _, _) {
69
+ assert_equal base_configs_order, ActiveRecord::Base.configurations.configs_for(env_name: "arunit").map(&:name)
70
+ }) do
71
+ ActiveSupport::Testing::Parallelization.after_fork_hooks.each { |cb| cb.call(idx) }
72
+ end
73
+ ensure
74
+ ActiveRecord::Base.configurations = prev_configs
75
+ ActiveRecord::Base.establish_connection(:arunit)
76
+ ENV["RAILS_ENV"] = previous_env
77
+ end
78
+ end
79
+ end