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,520 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/topic"
5
+ require "models/customer"
6
+ require "models/company"
7
+ require "models/company_in_module"
8
+ require "models/ship"
9
+ require "models/pirate"
10
+ require "models/price_estimate"
11
+ require "models/essay"
12
+ require "models/author"
13
+ require "models/organization"
14
+ require "models/post"
15
+ require "models/tagging"
16
+ require "models/category"
17
+ require "models/book"
18
+ require "models/subscriber"
19
+ require "models/subscription"
20
+ require "models/tag"
21
+ require "models/sponsor"
22
+ require "models/edge"
23
+ require "models/hotel"
24
+ require "models/chef"
25
+ require "models/department"
26
+ require "models/cake_designer"
27
+ require "models/drink_designer"
28
+ require "models/recipe"
29
+
30
+ class ReflectionTest < ActiveRecord::TestCase
31
+ include ActiveRecord::Reflection
32
+
33
+ fixtures :topics, :customers, :companies, :subscribers, :price_estimates
34
+
35
+ def setup
36
+ @first = Topic.find(1)
37
+ end
38
+
39
+ def test_human_name
40
+ assert_equal "Price estimate", PriceEstimate.model_name.human
41
+ assert_equal "Subscriber", Subscriber.model_name.human
42
+ end
43
+
44
+ def test_read_attribute_names
45
+ assert_equal(
46
+ %w( id title author_name author_email_address bonus_time written_on last_read content important group approved replies_count unique_replies_count parent_id parent_title type created_at updated_at ).sort,
47
+ @first.attribute_names.sort
48
+ )
49
+ end
50
+
51
+ def test_columns
52
+ assert_equal 18, Topic.columns.length
53
+ end
54
+
55
+ def test_columns_are_returned_in_the_order_they_were_declared
56
+ column_names = Topic.columns.map(&:name)
57
+ assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content important approved replies_count unique_replies_count parent_id parent_title type group created_at updated_at), column_names
58
+ end
59
+
60
+ def test_content_columns
61
+ content_columns = Topic.content_columns
62
+ content_column_names = content_columns.map(&:name)
63
+ assert_equal 13, content_columns.length
64
+ assert_equal %w(title author_name author_email_address written_on bonus_time last_read content important group approved parent_title created_at updated_at).sort, content_column_names.sort
65
+ end
66
+
67
+ def test_column_string_type_and_limit
68
+ assert_equal :string, @first.column_for_attribute("title").type
69
+ assert_equal :string, @first.column_for_attribute(:title).type
70
+ assert_equal :string, @first.type_for_attribute("title").type
71
+ assert_equal :string, @first.type_for_attribute(:title).type
72
+ assert_equal :string, @first.type_for_attribute("heading").type
73
+ assert_equal :string, @first.type_for_attribute(:heading).type
74
+ assert_equal 250, @first.column_for_attribute("title").limit
75
+ end
76
+
77
+ def test_column_null_not_null
78
+ subscriber = Subscriber.first
79
+ assert subscriber.column_for_attribute("name").null
80
+ assert_not subscriber.column_for_attribute("nick").null
81
+ end
82
+
83
+ def test_human_name_for_column
84
+ assert_equal "Author name", @first.column_for_attribute("author_name").human_name
85
+ end
86
+
87
+ def test_integer_columns
88
+ assert_equal :integer, @first.column_for_attribute("id").type
89
+ assert_equal :integer, @first.column_for_attribute(:id).type
90
+ assert_equal :integer, @first.type_for_attribute("id").type
91
+ assert_equal :integer, @first.type_for_attribute(:id).type
92
+ end
93
+
94
+ def test_non_existent_columns_return_null_object
95
+ column = @first.column_for_attribute("attribute_that_doesnt_exist")
96
+ assert_instance_of ActiveRecord::ConnectionAdapters::NullColumn, column
97
+ assert_equal "attribute_that_doesnt_exist", column.name
98
+ assert_nil column.sql_type
99
+ assert_nil column.type
100
+
101
+ column = @first.column_for_attribute(:attribute_that_doesnt_exist)
102
+ assert_instance_of ActiveRecord::ConnectionAdapters::NullColumn, column
103
+ end
104
+
105
+ def test_non_existent_types_are_identity_types
106
+ type = @first.type_for_attribute("attribute_that_doesnt_exist")
107
+ object = Object.new
108
+
109
+ assert_equal object, type.deserialize(object)
110
+ assert_equal object, type.cast(object)
111
+ assert_equal object, type.serialize(object)
112
+
113
+ type = @first.type_for_attribute(:attribute_that_doesnt_exist)
114
+ assert_equal object, type.deserialize(object)
115
+ assert_equal object, type.cast(object)
116
+ assert_equal object, type.serialize(object)
117
+ end
118
+
119
+ def test_reflection_klass_for_nested_class_name
120
+ reflection = ActiveRecord::Reflection.create(
121
+ :has_many,
122
+ nil,
123
+ nil,
124
+ { class_name: "MyApplication::Business::Company" },
125
+ Customer
126
+ )
127
+ assert_nothing_raised do
128
+ assert_equal MyApplication::Business::Company, reflection.klass
129
+ end
130
+ end
131
+
132
+ def test_irregular_reflection_class_name
133
+ ActiveSupport::Inflector.inflections do |inflect|
134
+ inflect.irregular "plural_irregular", "plurales_irregulares"
135
+ end
136
+ reflection = ActiveRecord::Reflection.create(:has_many, "plurales_irregulares", nil, {}, ActiveRecord::Base)
137
+ assert_equal "PluralIrregular", reflection.class_name
138
+ end
139
+
140
+ def test_aggregation_reflection
141
+ reflection_for_address = AggregateReflection.new(
142
+ :address, nil, { mapping: [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
143
+ )
144
+
145
+ reflection_for_balance = AggregateReflection.new(
146
+ :balance, nil, { class_name: "Money", mapping: %w(balance amount) }, Customer
147
+ )
148
+
149
+ reflection_for_gps_location = AggregateReflection.new(
150
+ :gps_location, nil, {}, Customer
151
+ )
152
+
153
+ assert_includes Customer.reflect_on_all_aggregations, reflection_for_gps_location
154
+ assert_includes Customer.reflect_on_all_aggregations, reflection_for_balance
155
+ assert_includes Customer.reflect_on_all_aggregations, reflection_for_address
156
+
157
+ assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
158
+
159
+ assert_equal Address, Customer.reflect_on_aggregation(:address).klass
160
+
161
+ assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
162
+ end
163
+
164
+ def test_reflect_on_all_autosave_associations
165
+ expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
166
+ received = Pirate.reflect_on_all_autosave_associations
167
+
168
+ assert_not_empty received
169
+ assert_not_equal Pirate.reflect_on_all_associations.length, received.length
170
+ assert_equal expected, received
171
+ end
172
+
173
+ def test_has_many_reflection
174
+ reflection_for_clients = ActiveRecord::Reflection.create(:has_many, :clients, nil, { order: "id", dependent: :destroy }, Firm)
175
+
176
+ assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
177
+
178
+ assert_equal Client, Firm.reflect_on_association(:clients).klass
179
+ assert_equal "companies", Firm.reflect_on_association(:clients).table_name
180
+
181
+ assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
182
+ assert_equal "companies", Firm.reflect_on_association(:clients_of_firm).table_name
183
+ end
184
+
185
+ def test_has_one_reflection
186
+ reflection_for_account = ActiveRecord::Reflection.create(:has_one, :account, nil, { foreign_key: "firm_id", dependent: :destroy }, Firm)
187
+ assert_equal reflection_for_account, Firm.reflect_on_association(:account)
188
+
189
+ assert_equal Account, Firm.reflect_on_association(:account).klass
190
+ assert_equal "accounts", Firm.reflect_on_association(:account).table_name
191
+ end
192
+
193
+ def test_belongs_to_inferred_foreign_key_from_assoc_name
194
+ Company.belongs_to :foo
195
+ assert_equal "foo_id", Company.reflect_on_association(:foo).foreign_key
196
+ Company.belongs_to :bar, class_name: "Xyzzy"
197
+ assert_equal "bar_id", Company.reflect_on_association(:bar).foreign_key
198
+ Company.belongs_to :baz, class_name: "Xyzzy", foreign_key: "xyzzy_id"
199
+ assert_equal "xyzzy_id", Company.reflect_on_association(:baz).foreign_key
200
+ end
201
+
202
+ def test_association_reflection_in_modules
203
+ ActiveRecord::Base.store_full_sti_class = false
204
+
205
+ assert_reflection MyApplication::Business::Firm,
206
+ :clients_of_firm,
207
+ klass: MyApplication::Business::Client,
208
+ class_name: "Client",
209
+ table_name: "companies"
210
+
211
+ assert_reflection MyApplication::Billing::Account,
212
+ :firm,
213
+ klass: MyApplication::Business::Firm,
214
+ class_name: "MyApplication::Business::Firm",
215
+ table_name: "companies"
216
+
217
+ assert_reflection MyApplication::Billing::Account,
218
+ :qualified_billing_firm,
219
+ klass: MyApplication::Billing::Firm,
220
+ class_name: "MyApplication::Billing::Firm",
221
+ table_name: "companies"
222
+
223
+ assert_reflection MyApplication::Billing::Account,
224
+ :unqualified_billing_firm,
225
+ klass: MyApplication::Billing::Firm,
226
+ class_name: "Firm",
227
+ table_name: "companies"
228
+
229
+ assert_reflection MyApplication::Billing::Account,
230
+ :nested_qualified_billing_firm,
231
+ klass: MyApplication::Billing::Nested::Firm,
232
+ class_name: "MyApplication::Billing::Nested::Firm",
233
+ table_name: "companies"
234
+
235
+ assert_reflection MyApplication::Billing::Account,
236
+ :nested_unqualified_billing_firm,
237
+ klass: MyApplication::Billing::Nested::Firm,
238
+ class_name: "Nested::Firm",
239
+ table_name: "companies"
240
+ ensure
241
+ ActiveRecord::Base.store_full_sti_class = true
242
+ end
243
+
244
+ def test_reflection_should_not_raise_error_when_compared_to_other_object
245
+ assert_not_equal Object.new, Firm._reflections["clients"]
246
+ end
247
+
248
+ def test_reflections_should_return_keys_as_strings
249
+ assert Category.reflections.keys.all? { |key| key.is_a? String }, "Model.reflections is expected to return string for keys"
250
+ end
251
+
252
+ def test_has_and_belongs_to_many_reflection
253
+ assert_equal :has_and_belongs_to_many, Category.reflections["posts"].macro
254
+ assert_equal :posts, Category.reflect_on_all_associations(:has_and_belongs_to_many).first.name
255
+ end
256
+
257
+ def test_has_many_through_reflection
258
+ assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
259
+ end
260
+
261
+ def test_chain
262
+ expected = [
263
+ Organization.reflect_on_association(:author_essay_categories),
264
+ Author.reflect_on_association(:essays),
265
+ Organization.reflect_on_association(:authors)
266
+ ]
267
+ actual = Organization.reflect_on_association(:author_essay_categories).chain
268
+
269
+ assert_equal expected, actual
270
+ end
271
+
272
+ def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case
273
+ hotel = Hotel.create!
274
+ department = hotel.departments.create!
275
+ department.chefs.create!(employable: CakeDesigner.create!)
276
+ department.chefs.create!(employable: DrinkDesigner.create!)
277
+
278
+ assert_equal 1, hotel.cake_designers.size
279
+ assert_equal 1, hotel.cake_designers.count
280
+ assert_equal 1, hotel.drink_designers.size
281
+ assert_equal 1, hotel.drink_designers.count
282
+ assert_equal 2, hotel.chefs.size
283
+ assert_equal 2, hotel.chefs.count
284
+ end
285
+
286
+ def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case_and_sti
287
+ hotel = Hotel.create!
288
+ hotel.mocktail_designers << MocktailDesigner.create!
289
+
290
+ assert_equal 1, hotel.mocktail_designers.size
291
+ assert_equal 1, hotel.mocktail_designers.count
292
+ assert_equal 1, hotel.chef_lists.size
293
+ assert_equal 1, hotel.chef_lists.count
294
+
295
+ hotel.mocktail_designers = []
296
+
297
+ assert_equal 0, hotel.mocktail_designers.size
298
+ assert_equal 0, hotel.mocktail_designers.count
299
+ assert_equal 0, hotel.chef_lists.size
300
+ assert_equal 0, hotel.chef_lists.count
301
+ end
302
+
303
+ def test_scope_chain_of_polymorphic_association_does_not_leak_into_other_hmt_associations
304
+ hotel = Hotel.create!
305
+ department = hotel.departments.create!
306
+ drink = department.chefs.create!(employable: DrinkDesigner.create!)
307
+ Recipe.create!(chef_id: drink.id, hotel_id: hotel.id)
308
+
309
+ expected_sql = capture_sql { hotel.recipes.to_a }
310
+
311
+ Hotel.reflect_on_association(:recipes).clear_association_scope_cache
312
+ hotel.reload
313
+ hotel.drink_designers.to_a
314
+ loaded_sql = capture_sql { hotel.recipes.to_a }
315
+
316
+ assert_equal expected_sql, loaded_sql
317
+ end
318
+
319
+ def test_nested?
320
+ assert_not_predicate Author.reflect_on_association(:comments), :nested?
321
+ assert_predicate Author.reflect_on_association(:tags), :nested?
322
+
323
+ # Only goes :through once, but the through_reflection is a has_and_belongs_to_many, so this is
324
+ # a nested through association
325
+ assert_predicate Category.reflect_on_association(:post_comments), :nested?
326
+ end
327
+
328
+ def test_association_primary_key
329
+ # Normal association
330
+ assert_equal "id", Author.reflect_on_association(:posts).association_primary_key.to_s
331
+ assert_equal "id", Author.reflect_on_association(:essay).association_primary_key.to_s
332
+ assert_equal "name", Essay.reflect_on_association(:writer).association_primary_key.to_s
333
+
334
+ # Through association (uses the :primary_key option from the source reflection)
335
+ assert_equal "nick", Author.reflect_on_association(:subscribers).association_primary_key.to_s
336
+ assert_equal "name", Author.reflect_on_association(:essay_category).association_primary_key.to_s
337
+ assert_equal "custom_primary_key", Author.reflect_on_association(:tags_with_primary_key).association_primary_key.to_s # nested
338
+ end
339
+
340
+ def test_association_primary_key_raises_when_missing_primary_key
341
+ reflection = ActiveRecord::Reflection.create(:has_many, :edge, nil, {}, Author)
342
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.association_primary_key }
343
+
344
+ through = Class.new(ActiveRecord::Reflection::ThroughReflection) {
345
+ define_method(:source_reflection) { reflection }
346
+ }.new(reflection)
347
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { through.association_primary_key }
348
+ end
349
+
350
+ def test_active_record_primary_key
351
+ assert_equal "nick", Subscriber.reflect_on_association(:subscriptions).active_record_primary_key.to_s
352
+ assert_equal "name", Author.reflect_on_association(:essay).active_record_primary_key.to_s
353
+ end
354
+
355
+ def test_active_record_primary_key_raises_when_missing_primary_key
356
+ reflection = ActiveRecord::Reflection.create(:has_many, :author, nil, {}, Edge)
357
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.active_record_primary_key }
358
+ end
359
+
360
+ def test_type
361
+ assert_equal "taggable_type", Post.reflect_on_association(:taggings).type.to_s
362
+ assert_equal "imageable_class", Post.reflect_on_association(:images).type.to_s
363
+ assert_nil Post.reflect_on_association(:readers).type
364
+ end
365
+
366
+ def test_foreign_type
367
+ assert_equal "sponsorable_type", Sponsor.reflect_on_association(:sponsorable).foreign_type.to_s
368
+ assert_equal "sponsorable_type", Sponsor.reflect_on_association(:thing).foreign_type.to_s
369
+ assert_nil Sponsor.reflect_on_association(:sponsor_club).foreign_type
370
+ end
371
+
372
+ def test_collection_association
373
+ assert_predicate Pirate.reflect_on_association(:birds), :collection?
374
+ assert_predicate Pirate.reflect_on_association(:parrots), :collection?
375
+
376
+ assert_not_predicate Pirate.reflect_on_association(:ship), :collection?
377
+ assert_not_predicate Ship.reflect_on_association(:pirate), :collection?
378
+ end
379
+
380
+ def test_default_association_validation
381
+ assert_predicate ActiveRecord::Reflection.create(:has_many, :clients, nil, {}, Firm), :validate?
382
+
383
+ assert_not_predicate ActiveRecord::Reflection.create(:has_one, :client, nil, {}, Firm), :validate?
384
+ assert_not_predicate ActiveRecord::Reflection.create(:belongs_to, :client, nil, {}, Firm), :validate?
385
+ end
386
+
387
+ def test_always_validate_association_if_explicit
388
+ assert_predicate ActiveRecord::Reflection.create(:has_one, :client, nil, { validate: true }, Firm), :validate?
389
+ assert_predicate ActiveRecord::Reflection.create(:belongs_to, :client, nil, { validate: true }, Firm), :validate?
390
+ assert_predicate ActiveRecord::Reflection.create(:has_many, :clients, nil, { validate: true }, Firm), :validate?
391
+ end
392
+
393
+ def test_validate_association_if_autosave
394
+ assert_predicate ActiveRecord::Reflection.create(:has_one, :client, nil, { autosave: true }, Firm), :validate?
395
+ assert_predicate ActiveRecord::Reflection.create(:belongs_to, :client, nil, { autosave: true }, Firm), :validate?
396
+ assert_predicate ActiveRecord::Reflection.create(:has_many, :clients, nil, { autosave: true }, Firm), :validate?
397
+ end
398
+
399
+ def test_never_validate_association_if_explicit
400
+ assert_not_predicate ActiveRecord::Reflection.create(:has_one, :client, nil, { autosave: true, validate: false }, Firm), :validate?
401
+ assert_not_predicate ActiveRecord::Reflection.create(:belongs_to, :client, nil, { autosave: true, validate: false }, Firm), :validate?
402
+ assert_not_predicate ActiveRecord::Reflection.create(:has_many, :clients, nil, { autosave: true, validate: false }, Firm), :validate?
403
+ end
404
+
405
+ def test_foreign_key
406
+ assert_equal "author_id", Author.reflect_on_association(:posts).foreign_key.to_s
407
+ assert_equal "category_id", Post.reflect_on_association(:categorizations).foreign_key.to_s
408
+ end
409
+
410
+ def test_symbol_for_class_name
411
+ assert_equal Client, Firm.reflect_on_association(:unsorted_clients_with_symbol).klass
412
+ end
413
+
414
+ def test_class_for_class_name
415
+ error = assert_raises(ArgumentError) do
416
+ ActiveRecord::Reflection.create(:has_many, :clients, nil, { class_name: Client }, Firm)
417
+ end
418
+ assert_equal "A class was passed to `:class_name` but we are expecting a string.", error.message
419
+ end
420
+
421
+ def test_join_table
422
+ category = Struct.new(:table_name, :pluralize_table_names).new("categories", true)
423
+ product = Struct.new(:table_name, :pluralize_table_names).new("products", true)
424
+
425
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
426
+ reflection.stub(:klass, category) do
427
+ assert_equal "categories_products", reflection.join_table
428
+ end
429
+
430
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
431
+ reflection.stub(:klass, product) do
432
+ assert_equal "categories_products", reflection.join_table
433
+ end
434
+ end
435
+
436
+ def test_join_table_with_common_prefix
437
+ category = Struct.new(:table_name, :pluralize_table_names).new("catalog_categories", true)
438
+ product = Struct.new(:table_name, :pluralize_table_names).new("catalog_products", true)
439
+
440
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
441
+ reflection.stub(:klass, category) do
442
+ assert_equal "catalog_categories_products", reflection.join_table
443
+ end
444
+
445
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
446
+ reflection.stub(:klass, product) do
447
+ assert_equal "catalog_categories_products", reflection.join_table
448
+ end
449
+ end
450
+
451
+ def test_join_table_with_different_prefix
452
+ category = Struct.new(:table_name, :pluralize_table_names).new("catalog_categories", true)
453
+ page = Struct.new(:table_name, :pluralize_table_names).new("content_pages", true)
454
+
455
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, page)
456
+ reflection.stub(:klass, category) do
457
+ assert_equal "catalog_categories_content_pages", reflection.join_table
458
+ end
459
+
460
+ reflection = ActiveRecord::Reflection.create(:has_many, :pages, nil, {}, category)
461
+ reflection.stub(:klass, page) do
462
+ assert_equal "catalog_categories_content_pages", reflection.join_table
463
+ end
464
+ end
465
+
466
+ def test_join_table_can_be_overridden
467
+ category = Struct.new(:table_name, :pluralize_table_names).new("categories", true)
468
+ product = Struct.new(:table_name, :pluralize_table_names).new("products", true)
469
+
470
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, { join_table: "product_categories" }, product)
471
+ reflection.stub(:klass, category) do
472
+ assert_equal "product_categories", reflection.join_table
473
+ end
474
+
475
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, { join_table: "product_categories" }, category)
476
+ reflection.stub(:klass, product) do
477
+ assert_equal "product_categories", reflection.join_table
478
+ end
479
+ end
480
+
481
+ def test_includes_accepts_symbols
482
+ hotel = Hotel.create!
483
+ department = hotel.departments.create!
484
+ department.chefs.create!
485
+
486
+ assert_nothing_raised do
487
+ assert_equal department.chefs, Hotel.includes([departments: :chefs]).first.chefs
488
+ end
489
+ end
490
+
491
+ def test_includes_accepts_strings
492
+ hotel = Hotel.create!
493
+ department = hotel.departments.create!
494
+ department.chefs.create!
495
+
496
+ assert_nothing_raised do
497
+ assert_equal department.chefs, Hotel.includes(["departments" => "chefs"]).first.chefs
498
+ end
499
+ end
500
+
501
+ def test_reflect_on_association_accepts_symbols
502
+ assert_nothing_raised do
503
+ assert_equal Hotel.reflect_on_association(:departments).name, :departments
504
+ end
505
+ end
506
+
507
+ def test_reflect_on_association_accepts_strings
508
+ assert_nothing_raised do
509
+ assert_equal Hotel.reflect_on_association("departments").name, :departments
510
+ end
511
+ end
512
+
513
+ private
514
+ def assert_reflection(klass, association, options)
515
+ assert reflection = klass.reflect_on_association(association)
516
+ options.each do |method, value|
517
+ assert_equal(value, reflection.public_send(method))
518
+ end
519
+ end
520
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/comment"
6
+ require "active_support/core_ext/symbol/starts_ends_with"
7
+
8
+ module ActiveRecord
9
+ module DelegationTests
10
+ ARRAY_DELEGATES = [
11
+ :+, :-, :|, :&, :[], :shuffle,
12
+ :all?, :collect, :compact, :detect, :each, :each_cons, :each_with_index,
13
+ :exclude?, :find_all, :flat_map, :group_by, :include?, :length,
14
+ :map, :none?, :one?, :partition, :reject, :reverse, :rotate,
15
+ :sample, :second, :sort, :sort_by, :slice, :third, :index, :rindex,
16
+ :to_ary, :to_set, :to_xml, :to_yaml, :join,
17
+ :in_groups, :in_groups_of, :to_sentence, :to_formatted_s, :as_json
18
+ ]
19
+
20
+ ARRAY_DELEGATES.each do |method|
21
+ define_method "test_delegates_#{method}_to_Array" do
22
+ assert_respond_to target, method
23
+ end
24
+ end
25
+
26
+ def test_not_respond_to_arel_method
27
+ assert_not_respond_to target, :exists
28
+ end
29
+ end
30
+
31
+ class DelegationAssociationTest < ActiveRecord::TestCase
32
+ include DelegationTests
33
+
34
+ def target
35
+ Post.new.comments
36
+ end
37
+ end
38
+
39
+ class DelegationRelationTest < ActiveRecord::TestCase
40
+ include DelegationTests
41
+
42
+ def target
43
+ Comment.all
44
+ end
45
+ end
46
+
47
+ class QueryingMethodsDelegationTest < ActiveRecord::TestCase
48
+ QUERYING_METHODS =
49
+ ActiveRecord::Batches.public_instance_methods(false) +
50
+ ActiveRecord::Calculations.public_instance_methods(false) +
51
+ ActiveRecord::FinderMethods.public_instance_methods(false) - [:include?, :member?, :raise_record_not_found_exception!] +
52
+ ActiveRecord::SpawnMethods.public_instance_methods(false) - [:spawn, :merge!] +
53
+ ActiveRecord::QueryMethods.public_instance_methods(false).reject { |method|
54
+ method.end_with?("=", "!", "value", "values", "clause")
55
+ } - [:reverse_order, :arel, :extensions, :construct_join_dependency] + [
56
+ :any?, :many?, :none?, :one?,
57
+ :first_or_create, :first_or_create!, :first_or_initialize,
58
+ :find_or_create_by, :find_or_create_by!, :find_or_initialize_by,
59
+ :create_or_find_by, :create_or_find_by!,
60
+ :destroy_all, :delete_all, :update_all, :touch_all, :delete_by, :destroy_by
61
+ ]
62
+
63
+ def test_delegate_querying_methods
64
+ klass = Class.new(ActiveRecord::Base) do
65
+ self.table_name = "posts"
66
+ end
67
+
68
+ assert_equal QUERYING_METHODS.sort, ActiveRecord::Querying::QUERYING_METHODS.sort
69
+
70
+ QUERYING_METHODS.each do |method|
71
+ assert_respond_to klass.all, method
72
+ assert_respond_to klass, method
73
+ end
74
+ end
75
+ end
76
+ end