ibm_db 5.6.1-arm64-darwin-24

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