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,671 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/company"
6
+ require "models/membership"
7
+ require "models/person"
8
+ require "models/post"
9
+ require "models/project"
10
+ require "models/subscriber"
11
+ require "models/vegetables"
12
+ require "models/shop"
13
+ require "models/sponsor"
14
+
15
+ module InheritanceTestHelper
16
+ def with_store_full_sti_class(&block)
17
+ assign_store_full_sti_class true, &block
18
+ end
19
+
20
+ def without_store_full_sti_class(&block)
21
+ assign_store_full_sti_class false, &block
22
+ end
23
+
24
+ def assign_store_full_sti_class(flag)
25
+ old_store_full_sti_class = ActiveRecord::Base.store_full_sti_class
26
+ ActiveRecord::Base.store_full_sti_class = flag
27
+ yield
28
+ ensure
29
+ ActiveRecord::Base.store_full_sti_class = old_store_full_sti_class
30
+ end
31
+ end
32
+
33
+ class InheritanceTest < ActiveRecord::TestCase
34
+ include InheritanceTestHelper
35
+ fixtures :companies, :projects, :subscribers, :accounts, :vegetables, :memberships
36
+
37
+ def test_class_with_store_full_sti_class_returns_full_name
38
+ with_store_full_sti_class do
39
+ assert_equal "Namespaced::Company", Namespaced::Company.sti_name
40
+ end
41
+ end
42
+
43
+ def test_class_with_blank_sti_name
44
+ company = Company.first
45
+ company = company.dup
46
+ company.extend(Module.new {
47
+ def _read_attribute(name)
48
+ return " " if name == "type"
49
+ super
50
+ end
51
+ })
52
+ company.save!
53
+ company = Company.all.to_a.find { |x| x.id == company.id }
54
+ assert_equal " ", company.type
55
+ end
56
+
57
+ def test_class_without_store_full_sti_class_returns_demodulized_name
58
+ without_store_full_sti_class do
59
+ assert_equal "Company", Namespaced::Company.sti_name
60
+ end
61
+ end
62
+
63
+ def test_compute_type_success
64
+ assert_equal Author, Company.send(:compute_type, "Author")
65
+ end
66
+
67
+ def test_compute_type_nonexistent_constant
68
+ e = assert_raises NameError do
69
+ Company.send :compute_type, "NonexistentModel"
70
+ end
71
+ assert_match "uninitialized constant Company::NonexistentModel", e.message
72
+ assert_equal "Company::NonexistentModel", e.name
73
+ end
74
+
75
+ def test_compute_type_no_method_error
76
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc { raise NoMethodError }) do
77
+ assert_raises NoMethodError do
78
+ Company.send :compute_type, "InvalidModel"
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_compute_type_on_undefined_method
84
+ error = nil
85
+ begin
86
+ Class.new(Author) do
87
+ alias_method :foo, :bar
88
+ end
89
+ rescue => e
90
+ error = e
91
+ end
92
+
93
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc { raise e }) do
94
+ exception = assert_raises NameError do
95
+ Company.send :compute_type, "InvalidModel"
96
+ end
97
+ assert_equal error.message, exception.message
98
+ end
99
+ end
100
+
101
+ def test_compute_type_argument_error
102
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc { raise ArgumentError }) do
103
+ assert_raises ArgumentError do
104
+ Company.send :compute_type, "InvalidModel"
105
+ end
106
+ end
107
+ end
108
+
109
+ def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
110
+ without_store_full_sti_class do
111
+ item = Namespaced::Company.new
112
+ assert_equal "Company", item[:type]
113
+ end
114
+ end
115
+
116
+ def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
117
+ with_store_full_sti_class do
118
+ item = Namespaced::Company.new
119
+ assert_equal "Namespaced::Company", item[:type]
120
+ end
121
+ end
122
+
123
+ def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
124
+ with_store_full_sti_class do
125
+ item = Namespaced::Company.create name: "Wolverine 2"
126
+ assert_not_nil Company.find(item.id)
127
+ assert_not_nil Namespaced::Company.find(item.id)
128
+ end
129
+ end
130
+
131
+ def test_descends_from_active_record
132
+ assert_not_predicate ActiveRecord::Base, :descends_from_active_record?
133
+
134
+ # Abstract subclass of AR::Base.
135
+ assert_predicate LoosePerson, :descends_from_active_record?
136
+
137
+ # Concrete subclass of an abstract class.
138
+ assert_predicate LooseDescendant, :descends_from_active_record?
139
+
140
+ # Concrete subclass of AR::Base.
141
+ assert_predicate TightPerson, :descends_from_active_record?
142
+
143
+ # Concrete subclass of a concrete class but has no type column.
144
+ assert_predicate TightDescendant, :descends_from_active_record?
145
+
146
+ # Concrete subclass of AR::Base.
147
+ assert_predicate Post, :descends_from_active_record?
148
+
149
+ # Concrete subclasses of a concrete class which has a type column.
150
+ assert_not_predicate StiPost, :descends_from_active_record?
151
+ assert_not_predicate SubStiPost, :descends_from_active_record?
152
+
153
+ # Abstract subclass of a concrete class which has a type column.
154
+ # This is pathological, as you'll never have Sub < Abstract < Concrete.
155
+ assert_not_predicate AbstractStiPost, :descends_from_active_record?
156
+
157
+ # Concrete subclass of an abstract class which has a type column.
158
+ assert_not_predicate SubAbstractStiPost, :descends_from_active_record?
159
+ end
160
+
161
+ def test_company_descends_from_active_record
162
+ assert_not_predicate ActiveRecord::Base, :descends_from_active_record?
163
+ assert AbstractCompany.descends_from_active_record?, "AbstractCompany should descend from ActiveRecord::Base"
164
+ assert Company.descends_from_active_record?, "Company should descend from ActiveRecord::Base"
165
+ assert_not Class.new(Company).descends_from_active_record?, "Company subclass should not descend from ActiveRecord::Base"
166
+ end
167
+
168
+ def test_abstract_class
169
+ assert_not_predicate ActiveRecord::Base, :abstract_class?
170
+ assert_predicate LoosePerson, :abstract_class?
171
+ assert_not_predicate LooseDescendant, :abstract_class?
172
+ end
173
+
174
+ def test_inheritance_base_class
175
+ assert_equal Post, Post.base_class
176
+ assert_predicate Post, :base_class?
177
+ assert_equal Post, SpecialPost.base_class
178
+ assert_not_predicate SpecialPost, :base_class?
179
+ assert_equal Post, StiPost.base_class
180
+ assert_not_predicate StiPost, :base_class?
181
+ assert_equal Post, SubStiPost.base_class
182
+ assert_not_predicate SubStiPost, :base_class?
183
+ assert_equal SubAbstractStiPost, SubAbstractStiPost.base_class
184
+ assert_predicate SubAbstractStiPost, :base_class?
185
+ end
186
+
187
+ def test_abstract_inheritance_base_class
188
+ assert_equal LoosePerson, LoosePerson.base_class
189
+ assert_predicate LoosePerson, :base_class?
190
+ assert_equal LooseDescendant, LooseDescendant.base_class
191
+ assert_predicate LooseDescendant, :base_class?
192
+ assert_equal TightPerson, TightPerson.base_class
193
+ assert_predicate TightPerson, :base_class?
194
+ assert_equal TightPerson, TightDescendant.base_class
195
+ assert_not_predicate TightDescendant, :base_class?
196
+ end
197
+
198
+ def test_base_class_activerecord_error
199
+ klass = Class.new { include ActiveRecord::Inheritance }
200
+ assert_raise(ActiveRecord::ActiveRecordError) { klass.base_class }
201
+ end
202
+
203
+ def test_a_bad_type_column
204
+ Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
205
+
206
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
207
+ end
208
+
209
+ def test_inheritance_find
210
+ assert_kind_of Firm, Company.find(1), "37signals should be a firm"
211
+ assert_kind_of Firm, Firm.find(1), "37signals should be a firm"
212
+ assert_kind_of Client, Company.find(2), "Summit should be a client"
213
+ assert_kind_of Client, Client.find(2), "Summit should be a client"
214
+ end
215
+
216
+ def test_alt_inheritance_find
217
+ assert_kind_of Cucumber, Vegetable.find(1)
218
+ assert_kind_of Cucumber, Cucumber.find(1)
219
+ assert_kind_of Cabbage, Vegetable.find(2)
220
+ assert_kind_of Cabbage, Cabbage.find(2)
221
+ end
222
+
223
+ def test_alt_becomes_works_with_sti
224
+ vegetable = Vegetable.find(1)
225
+ assert_kind_of Vegetable, vegetable
226
+ cabbage = vegetable.becomes(Cabbage)
227
+ assert_kind_of Cabbage, cabbage
228
+ end
229
+
230
+ def test_becomes_sets_variables_before_initialization_callbacks
231
+ vegetable = Vegetable.create!(name: "yelling carrot")
232
+ assert_kind_of Vegetable, vegetable
233
+ assert_equal "yelling carrot", vegetable.name
234
+
235
+ yelling_veggie = vegetable.becomes(YellingVegetable)
236
+ assert_equal "YELLING CARROT", yelling_veggie.name, "YellingVegetable name should be YELLING CARROT"
237
+ assert_equal "YELLING CARROT", vegetable.name, "Vegetable name should be YELLING CARROT after becoming a YellingVegetable"
238
+ end
239
+
240
+ def test_becomes_and_change_tracking_for_inheritance_columns
241
+ cucumber = Vegetable.find(1)
242
+ cabbage = cucumber.becomes!(Cabbage)
243
+ assert_equal ["Cucumber", "Cabbage"], cabbage.custom_type_change
244
+ end
245
+
246
+ def test_alt_becomes_bang_resets_inheritance_type_column
247
+ vegetable = Vegetable.create!(name: "Red Pepper")
248
+ assert_nil vegetable.custom_type
249
+
250
+ cabbage = vegetable.becomes!(Cabbage)
251
+ assert_equal "Cabbage", cabbage.custom_type
252
+
253
+ cabbage.becomes!(Vegetable)
254
+ assert_nil cabbage.custom_type
255
+ end
256
+
257
+ def test_inheritance_find_all
258
+ companies = Company.all.merge!(order: "id").to_a
259
+ assert_kind_of Firm, companies[0], "37signals should be a firm"
260
+ assert_kind_of Client, companies[1], "Summit should be a client"
261
+ end
262
+
263
+ def test_alt_inheritance_find_all
264
+ companies = Vegetable.all.merge!(order: "id").to_a
265
+ assert_kind_of Cucumber, companies[0]
266
+ assert_kind_of Cabbage, companies[1]
267
+ end
268
+
269
+ def test_inheritance_save
270
+ firm = Firm.new
271
+ firm.name = "Next Angle"
272
+ firm.save
273
+
274
+ next_angle = Company.find(firm.id)
275
+ assert_kind_of Firm, next_angle, "Next Angle should be a firm"
276
+ end
277
+
278
+ def test_alt_inheritance_save
279
+ cabbage = Cabbage.new(name: "Savoy")
280
+ cabbage.save!
281
+
282
+ savoy = Vegetable.find(cabbage.id)
283
+ assert_kind_of Cabbage, savoy
284
+ end
285
+
286
+ def test_inheritance_new_with_default_class
287
+ company = Company.new
288
+ assert_equal Company, company.class
289
+ end
290
+
291
+ def test_inheritance_new_with_base_class
292
+ company = Company.new(type: "Company")
293
+ assert_equal Company, company.class
294
+ end
295
+
296
+ def test_inheritance_new_with_subclass
297
+ firm = Company.new(type: "Firm")
298
+ assert_equal Firm, firm.class
299
+ end
300
+
301
+ def test_where_new_with_subclass
302
+ firm = Company.where(type: "Firm").new
303
+ assert_equal Firm, firm.class
304
+ end
305
+
306
+ def test_where_create_with_subclass
307
+ firm = Company.where(type: "Firm").create(name: "Basecamp")
308
+ assert_equal Firm, firm.class
309
+ end
310
+
311
+ def test_where_create_bang_with_subclass
312
+ firm = Company.where(type: "Firm").create!(name: "Basecamp")
313
+ assert_equal Firm, firm.class
314
+ end
315
+
316
+ def test_new_with_abstract_class
317
+ e = assert_raises(NotImplementedError) do
318
+ AbstractCompany.new
319
+ end
320
+ assert_equal("AbstractCompany is an abstract class and cannot be instantiated.", e.message)
321
+ end
322
+
323
+ def test_new_with_ar_base
324
+ e = assert_raises(NotImplementedError) do
325
+ ActiveRecord::Base.new
326
+ end
327
+ assert_equal("ActiveRecord::Base is an abstract class and cannot be instantiated.", e.message)
328
+ end
329
+
330
+ def test_new_with_invalid_type
331
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(type: "InvalidType") }
332
+ end
333
+
334
+ def test_new_with_unrelated_type
335
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(type: "Account") }
336
+ end
337
+
338
+ def test_where_new_with_invalid_type
339
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "InvalidType").new }
340
+ end
341
+
342
+ def test_where_new_with_unrelated_type
343
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "Account").new }
344
+ end
345
+
346
+ def test_where_create_with_invalid_type
347
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "InvalidType").create }
348
+ end
349
+
350
+ def test_where_create_with_unrelated_type
351
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "Account").create }
352
+ end
353
+
354
+ def test_where_create_bang_with_invalid_type
355
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "InvalidType").create! }
356
+ end
357
+
358
+ def test_where_create_bang_with_unrelated_type
359
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.where(type: "Account").create! }
360
+ end
361
+
362
+ def test_new_with_unrelated_namespaced_type
363
+ without_store_full_sti_class do
364
+ e = assert_raises ActiveRecord::SubclassNotFound do
365
+ Namespaced::Company.new(type: "Firm")
366
+ end
367
+
368
+ assert_equal "Invalid single-table inheritance type: Namespaced::Firm is not a subclass of Namespaced::Company", e.message
369
+ end
370
+ end
371
+
372
+ def test_new_with_complex_inheritance
373
+ assert_nothing_raised { Client.new(type: "VerySpecialClient") }
374
+ end
375
+
376
+ def test_new_without_storing_full_sti_class
377
+ without_store_full_sti_class do
378
+ item = Company.new(type: "SpecialCo")
379
+ assert_instance_of Company::SpecialCo, item
380
+ end
381
+ end
382
+
383
+ def test_new_with_autoload_paths
384
+ path = File.expand_path("../models/autoloadable", __dir__)
385
+ ActiveSupport::Dependencies.autoload_paths << path
386
+
387
+ firm = Company.new(type: "ExtraFirm")
388
+ assert_equal ExtraFirm, firm.class
389
+ ensure
390
+ ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
391
+ ActiveSupport::Dependencies.clear
392
+ end
393
+
394
+ def test_inheritance_condition
395
+ assert_equal 12, Company.count
396
+ assert_equal 3, Firm.count
397
+ assert_equal 5, Client.count
398
+ end
399
+
400
+ def test_alt_inheritance_condition
401
+ assert_equal 4, Vegetable.count
402
+ assert_equal 1, Cucumber.count
403
+ assert_equal 3, Cabbage.count
404
+ end
405
+
406
+ def test_finding_incorrect_type_data
407
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
408
+ assert_nothing_raised { Firm.find(1) }
409
+ end
410
+
411
+ def test_alt_finding_incorrect_type_data
412
+ assert_raise(ActiveRecord::RecordNotFound) { Cucumber.find(2) }
413
+ assert_nothing_raised { Cucumber.find(1) }
414
+ end
415
+
416
+ def test_update_all_within_inheritance
417
+ Client.update_all "name = 'I am a client'"
418
+ assert_equal "I am a client", Client.first.name
419
+ # Order by added as otherwise Oracle tests were failing because of different order of results
420
+ assert_equal "37signals", Firm.all.merge!(order: "id").to_a.first.name
421
+ end
422
+
423
+ def test_alt_update_all_within_inheritance
424
+ Cabbage.update_all "name = 'the cabbage'"
425
+ assert_equal "the cabbage", Cabbage.first.name
426
+ assert_equal ["my cucumber"], Cucumber.all.map(&:name).uniq
427
+ end
428
+
429
+ def test_destroy_all_within_inheritance
430
+ Client.destroy_all
431
+ assert_equal 0, Client.count
432
+ assert_equal 3, Firm.count
433
+ end
434
+
435
+ def test_alt_destroy_all_within_inheritance
436
+ Cabbage.destroy_all
437
+ assert_equal 0, Cabbage.count
438
+ assert_equal 1, Cucumber.count
439
+ end
440
+
441
+ def test_find_first_within_inheritance
442
+ assert_kind_of Firm, Company.all.merge!(where: "name = '37signals'").first
443
+ assert_kind_of Firm, Firm.all.merge!(where: "name = '37signals'").first
444
+ assert_nil Client.all.merge!(where: "name = '37signals'").first
445
+ end
446
+
447
+ def test_alt_find_first_within_inheritance
448
+ assert_kind_of Cabbage, Vegetable.all.merge!(where: "name = 'his cabbage'").first
449
+ assert_kind_of Cabbage, Cabbage.all.merge!(where: "name = 'his cabbage'").first
450
+ assert_nil Cucumber.all.merge!(where: "name = 'his cabbage'").first
451
+ end
452
+
453
+ def test_complex_inheritance
454
+ very_special_client = VerySpecialClient.create("name" => "veryspecial")
455
+ assert_equal very_special_client, VerySpecialClient.where("name = 'veryspecial'").first
456
+ assert_equal very_special_client, SpecialClient.all.merge!(where: "name = 'veryspecial'").first
457
+ assert_equal very_special_client, Company.all.merge!(where: "name = 'veryspecial'").first
458
+ assert_equal very_special_client, Client.all.merge!(where: "name = 'veryspecial'").first
459
+ assert_equal 1, Client.all.merge!(where: "name = 'Summit'").to_a.size
460
+ assert_equal very_special_client, Client.find(very_special_client.id)
461
+ end
462
+
463
+ def test_alt_complex_inheritance
464
+ king_cole = KingCole.create("name" => "uniform heads")
465
+ assert_equal king_cole, KingCole.where("name = 'uniform heads'").first
466
+ assert_equal king_cole, GreenCabbage.all.merge!(where: "name = 'uniform heads'").first
467
+ assert_equal king_cole, Cabbage.all.merge!(where: "name = 'uniform heads'").first
468
+ assert_equal king_cole, Vegetable.all.merge!(where: "name = 'uniform heads'").first
469
+ assert_equal 1, Cabbage.all.merge!(where: "name = 'his cabbage'").to_a.size
470
+ assert_equal king_cole, Cabbage.find(king_cole.id)
471
+ end
472
+
473
+ def test_eager_load_belongs_to_something_inherited
474
+ account = Account.all.merge!(includes: :firm).find(1)
475
+ assert account.association(:firm).loaded?, "association was not eager loaded"
476
+ end
477
+
478
+ def test_alt_eager_loading
479
+ cabbage = RedCabbage.all.merge!(includes: :seller).find(4)
480
+ assert cabbage.association(:seller).loaded?, "association was not eager loaded"
481
+ end
482
+
483
+ def test_eager_load_belongs_to_primary_key_quoting
484
+ c = Account.connection
485
+ bind_param = Arel::Nodes::BindParam.new(nil)
486
+ assert_sql(/#{Regexp.escape(c.quote_table_name("companies.id"))} = (?:#{Regexp.escape(bind_param.to_sql)}|1)/i) do
487
+ Account.all.merge!(includes: :firm).find(1)
488
+ end
489
+ end
490
+
491
+ def test_inherits_custom_primary_key
492
+ assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
493
+ end
494
+
495
+ def test_inheritance_without_mapping
496
+ assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
497
+ assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = "roger"; s.save }
498
+ end
499
+
500
+ def test_scope_inherited_properly
501
+ assert_nothing_raised { Company.of_first_firm.to_a }
502
+ assert_nothing_raised { Client.of_first_firm.to_a }
503
+ end
504
+
505
+ def test_inheritance_with_default_scope
506
+ assert_equal 1, SelectedMembership.count(:all)
507
+ end
508
+ end
509
+
510
+ class InheritanceComputeTypeTest < ActiveRecord::TestCase
511
+ include InheritanceTestHelper
512
+ fixtures :companies
513
+
514
+ def test_instantiation_doesnt_try_to_require_corresponding_file
515
+ without_store_full_sti_class do
516
+ foo = Firm.first.clone
517
+ foo.type = "FirmOnTheFly"
518
+ foo.save!
519
+
520
+ # Should fail without FirmOnTheFly in the type condition.
521
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
522
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find_by!(id: foo.id) }
523
+
524
+ # Nest FirmOnTheFly in the test case where Dependencies won't see it.
525
+ self.class.const_set :FirmOnTheFly, Class.new(Firm)
526
+ assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
527
+ assert_raise(ActiveRecord::SubclassNotFound) { Firm.find_by!(id: foo.id) }
528
+
529
+ # Nest FirmOnTheFly in Firm where Dependencies will see it.
530
+ # This is analogous to nesting models in a migration.
531
+ Firm.const_set :FirmOnTheFly, Class.new(Firm)
532
+
533
+ # And instantiate will find the existing constant rather than trying
534
+ # to require firm_on_the_fly.
535
+ assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
536
+ assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find_by!(id: foo.id) }
537
+ end
538
+ ensure
539
+ self.class.send(:remove_const, :FirmOnTheFly) rescue nil
540
+ Firm.send(:remove_const, :FirmOnTheFly) rescue nil
541
+ end
542
+
543
+ def test_sti_type_from_attributes_disabled_in_non_sti_class
544
+ phone = Shop::Product::Type.new(name: "Phone")
545
+ product = Shop::Product.new(type: phone)
546
+ assert product.save
547
+ end
548
+
549
+ def test_inheritance_new_with_subclass_as_default
550
+ original_type = Company.columns_hash["type"].default
551
+ ActiveRecord::Base.connection.change_column_default :companies, :type, "Firm"
552
+ Company.reset_column_information
553
+
554
+ firm = Company.new # without arguments
555
+ assert_equal "Firm", firm.type
556
+ assert_instance_of Firm, firm
557
+
558
+ firm = Company.new(firm_name: "Shri Hans Plastic") # with arguments
559
+ assert_equal "Firm", firm.type
560
+ assert_instance_of Firm, firm
561
+
562
+ client = Client.new
563
+ assert_equal "Client", client.type
564
+ assert_instance_of Client, client
565
+
566
+ firm = Company.new(type: "Client") # overwrite the default type
567
+ assert_equal "Client", firm.type
568
+ assert_instance_of Client, firm
569
+ ensure
570
+ ActiveRecord::Base.connection.change_column_default :companies, :type, original_type
571
+ Company.reset_column_information
572
+ end
573
+ end
574
+
575
+ class InheritanceAttributeTest < ActiveRecord::TestCase
576
+ class Company < ActiveRecord::Base
577
+ self.table_name = "companies"
578
+ attribute :type, :string, default: "InheritanceAttributeTest::Startup"
579
+ end
580
+
581
+ class Startup < Company
582
+ end
583
+
584
+ class Empire < Company
585
+ end
586
+
587
+ def test_inheritance_new_with_subclass_as_default
588
+ startup = Company.new # without arguments
589
+ assert_equal "InheritanceAttributeTest::Startup", startup.type
590
+ assert_instance_of Startup, startup
591
+
592
+ empire = Company.new(type: "InheritanceAttributeTest::Empire") # without arguments
593
+ assert_equal "InheritanceAttributeTest::Empire", empire.type
594
+ assert_instance_of Empire, empire
595
+ end
596
+ end
597
+
598
+ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
599
+ setup do
600
+ @old_registry = ActiveRecord::Type.registry
601
+ ActiveRecord::Type.registry = ActiveRecord::Type.registry.dup
602
+ ActiveRecord::Type.register :omg_sti, InheritanceAttributeMappingTest::OmgStiType
603
+ Company.delete_all
604
+ Sponsor.delete_all
605
+ end
606
+
607
+ teardown do
608
+ ActiveRecord::Type.registry = @old_registry
609
+ end
610
+
611
+ class OmgStiType < ActiveRecord::Type::String
612
+ def cast_value(value)
613
+ if value =~ /\Aomg_(.+)\z/
614
+ $1.classify
615
+ else
616
+ value
617
+ end
618
+ end
619
+
620
+ def serialize(value)
621
+ if value
622
+ "omg_%s" % value.underscore
623
+ end
624
+ end
625
+ end
626
+
627
+ class Company < ActiveRecord::Base
628
+ self.table_name = "companies"
629
+ attribute :type, :omg_sti
630
+ end
631
+
632
+ class Startup < Company; end
633
+ class Empire < Company; end
634
+
635
+ class Sponsor < ActiveRecord::Base
636
+ self.table_name = "sponsors"
637
+ attribute :sponsorable_type, :omg_sti
638
+
639
+ belongs_to :sponsorable, polymorphic: true
640
+ end
641
+
642
+ def test_sti_with_custom_type
643
+ Startup.create! name: "a Startup"
644
+ Empire.create! name: "an Empire"
645
+
646
+ assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/startup"],
647
+ ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows("SELECT name, type FROM companies").sort
648
+ assert_equal [["a Startup", "InheritanceAttributeMappingTest::Startup"],
649
+ ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
650
+
651
+ startup = Startup.first
652
+ startup.becomes! Empire
653
+ startup.save!
654
+
655
+ assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/empire"],
656
+ ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows("SELECT name, type FROM companies").sort
657
+
658
+ assert_equal [["a Startup", "InheritanceAttributeMappingTest::Empire"],
659
+ ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
660
+ end
661
+
662
+ def test_polymorphic_associations_custom_type
663
+ startup = Startup.create! name: "a Startup"
664
+ sponsor = Sponsor.create! sponsorable: startup
665
+
666
+ assert_equal ["omg_inheritance_attribute_mapping_test/company"], ActiveRecord::Base.connection.select_values("SELECT sponsorable_type FROM sponsors")
667
+
668
+ sponsor = Sponsor.find(sponsor.id)
669
+ assert_equal startup, sponsor.sponsorable
670
+ end
671
+ end