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,636 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/author"
5
+ require "models/post"
6
+ require "models/person"
7
+ require "models/reference"
8
+ require "models/job"
9
+ require "models/reader"
10
+ require "models/comment"
11
+ require "models/tag"
12
+ require "models/tagging"
13
+ require "models/subscriber"
14
+ require "models/book"
15
+ require "models/subscription"
16
+ require "models/rating"
17
+ require "models/member"
18
+ require "models/member_detail"
19
+ require "models/member_type"
20
+ require "models/sponsor"
21
+ require "models/club"
22
+ require "models/organization"
23
+ require "models/category"
24
+ require "models/categorization"
25
+ require "models/membership"
26
+ require "models/essay"
27
+ require "models/hotel"
28
+ require "models/department"
29
+ require "models/chef"
30
+ require "models/cake_designer"
31
+ require "models/drink_designer"
32
+
33
+ class NestedThroughAssociationsTest < ActiveRecord::TestCase
34
+ fixtures :authors, :author_addresses, :books, :posts, :subscriptions, :subscribers, :tags, :taggings,
35
+ :people, :readers, :references, :jobs, :ratings, :comments, :members, :member_details,
36
+ :member_types, :sponsors, :clubs, :organizations, :categories, :categories_posts,
37
+ :categorizations, :memberships, :essays
38
+
39
+ # Through associations can either use the has_many or has_one macros.
40
+ #
41
+ # has_many
42
+ # - Source reflection can be has_many, has_one, belongs_to or has_and_belongs_to_many
43
+ # - Through reflection can be has_many, has_one, belongs_to or has_and_belongs_to_many
44
+ #
45
+ # has_one
46
+ # - Source reflection can be has_one or belongs_to
47
+ # - Through reflection can be has_one or belongs_to
48
+ #
49
+ # Additionally, the source reflection and/or through reflection may be subject to
50
+ # polymorphism and/or STI.
51
+ #
52
+ # When testing these, we need to make sure it works via loading the association directly, or
53
+ # joining the association, or including the association. We also need to ensure that associations
54
+ # are readonly where relevant.
55
+
56
+ # has_many through
57
+ # Source: has_many through
58
+ # Through: has_many
59
+ def test_has_many_through_has_many_with_has_many_through_source_reflection
60
+ general = tags(:general)
61
+ assert_equal [general, general], authors(:david).tags
62
+ end
63
+
64
+ def test_has_many_through_has_many_with_has_many_through_source_reflection_preload
65
+ author = assert_queries(5) { Author.includes(:tags).first }
66
+ general = tags(:general)
67
+
68
+ assert_no_queries do
69
+ assert_equal [general, general], author.tags
70
+ end
71
+ end
72
+
73
+ def test_has_many_through_has_many_with_has_many_through_source_reflection_preload_via_joins
74
+ assert_includes_and_joins_equal(
75
+ Author.where("tags.id" => tags(:general).id),
76
+ [authors(:david)], :tags
77
+ )
78
+
79
+ # This ensures that the polymorphism of taggings is being observed correctly
80
+ authors = Author.joins(:tags).where("taggings.taggable_type" => "FakeModel")
81
+ assert_empty authors
82
+ end
83
+
84
+ # has_many through
85
+ # Source: has_many
86
+ # Through: has_many through
87
+ def test_has_many_through_has_many_through_with_has_many_source_reflection
88
+ luke, david = subscribers(:first), subscribers(:second)
89
+ assert_equal [luke, david, david], authors(:david).subscribers.order("subscribers.nick")
90
+ end
91
+
92
+ def test_has_many_through_has_many_through_with_has_many_source_reflection_preload
93
+ luke, david = subscribers(:first), subscribers(:second)
94
+ author = assert_queries(4) { Author.includes(:subscribers).first }
95
+ assert_no_queries do
96
+ assert_equal [luke, david, david], author.subscribers.sort_by(&:nick)
97
+ end
98
+ end
99
+
100
+ def test_has_many_through_has_many_through_with_has_many_source_reflection_preload_via_joins
101
+ # All authors with subscribers where one of the subscribers' nick is 'alterself'
102
+ assert_includes_and_joins_equal(
103
+ Author.where("subscribers.nick" => "alterself"),
104
+ [authors(:david)], :subscribers
105
+ )
106
+ end
107
+
108
+ # has_many through
109
+ # Source: has_one through
110
+ # Through: has_one
111
+ def test_has_many_through_has_one_with_has_one_through_source_reflection
112
+ assert_equal [member_types(:founding)], members(:groucho).nested_member_types
113
+ end
114
+
115
+ def test_has_many_through_has_one_with_has_one_through_source_reflection_preload
116
+ member = assert_queries(4) { Member.includes(:nested_member_types).first }
117
+ founding = member_types(:founding)
118
+ assert_no_queries do
119
+ assert_equal [founding], member.nested_member_types
120
+ end
121
+ end
122
+
123
+ def test_has_many_through_has_one_with_has_one_through_source_reflection_preload_via_joins
124
+ assert_includes_and_joins_equal(
125
+ Member.where("member_types.id" => member_types(:founding).id),
126
+ [members(:groucho)], :nested_member_types
127
+ )
128
+ end
129
+
130
+ # has_many through
131
+ # Source: has_one
132
+ # Through: has_one through
133
+ def test_has_many_through_has_one_through_with_has_one_source_reflection
134
+ assert_equal [sponsors(:moustache_club_sponsor_for_groucho)], members(:groucho).nested_sponsors
135
+ end
136
+
137
+ def test_has_many_through_has_one_through_with_has_one_source_reflection_preload
138
+ member = assert_queries(4) { Member.includes(:nested_sponsors).first }
139
+ mustache = sponsors(:moustache_club_sponsor_for_groucho)
140
+ assert_no_queries do
141
+ assert_equal [mustache], member.nested_sponsors
142
+ end
143
+ end
144
+
145
+ def test_has_many_through_has_one_through_with_has_one_source_reflection_preload_via_joins
146
+ assert_includes_and_joins_equal(
147
+ Member.where("sponsors.id" => sponsors(:moustache_club_sponsor_for_groucho).id),
148
+ [members(:groucho)], :nested_sponsors
149
+ )
150
+ end
151
+
152
+ # has_many through
153
+ # Source: has_many through
154
+ # Through: has_one
155
+ def test_has_many_through_has_one_with_has_many_through_source_reflection
156
+ groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
157
+
158
+ assert_equal [groucho_details, other_details],
159
+ members(:groucho).organization_member_details.order("member_details.id")
160
+ end
161
+
162
+ def test_has_many_through_has_one_with_has_many_through_source_reflection_preload
163
+ ActiveRecord::Base.connection.table_alias_length # preheat cache
164
+ member = assert_queries(4) { Member.includes(:organization_member_details).first }
165
+ groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
166
+
167
+ assert_no_queries do
168
+ assert_equal [groucho_details, other_details], member.organization_member_details.sort_by(&:id)
169
+ end
170
+ end
171
+
172
+ def test_has_many_through_has_one_with_has_many_through_source_reflection_preload_via_joins
173
+ assert_includes_and_joins_equal(
174
+ Member.where("member_details.id" => member_details(:groucho).id).order("member_details.id"),
175
+ [members(:groucho), members(:some_other_guy)], :organization_member_details
176
+ )
177
+
178
+ members = Member.joins(:organization_member_details).where("member_details.id" => 9)
179
+ assert_empty members
180
+ end
181
+
182
+ # has_many through
183
+ # Source: has_many
184
+ # Through: has_one through
185
+ def test_has_many_through_has_one_through_with_has_many_source_reflection
186
+ groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
187
+
188
+ assert_equal [groucho_details, other_details],
189
+ members(:groucho).organization_member_details_2.order("member_details.id")
190
+ end
191
+
192
+ def test_has_many_through_has_one_through_with_has_many_source_reflection_preload
193
+ member = assert_queries(4) { Member.includes(:organization_member_details_2).first }
194
+ groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
195
+
196
+ # postgresql test if randomly executed then executes "SHOW max_identifier_length". Hence
197
+ # the need to ignore certain predefined sqls that deal with system calls.
198
+ assert_no_queries do
199
+ assert_equal [groucho_details, other_details], member.organization_member_details_2.sort_by(&:id)
200
+ end
201
+ end
202
+
203
+ def test_has_many_through_has_one_through_with_has_many_source_reflection_preload_via_joins
204
+ assert_includes_and_joins_equal(
205
+ Member.where("member_details.id" => member_details(:groucho).id).order("member_details.id"),
206
+ [members(:groucho), members(:some_other_guy)], :organization_member_details_2
207
+ )
208
+
209
+ members = Member.joins(:organization_member_details_2).where("member_details.id" => 9)
210
+ assert_empty members
211
+ end
212
+
213
+ # has_many through
214
+ # Source: has_and_belongs_to_many
215
+ # Through: has_many
216
+ def test_has_many_through_has_many_with_has_and_belongs_to_many_source_reflection
217
+ general, cooking = categories(:general), categories(:cooking)
218
+
219
+ assert_equal [general, cooking], authors(:bob).post_categories.order("categories.id")
220
+ end
221
+
222
+ def test_has_many_through_has_many_with_has_and_belongs_to_many_source_reflection_preload
223
+ author = assert_queries(4) { Author.includes(:post_categories).third }
224
+ general, cooking = categories(:general), categories(:cooking)
225
+
226
+ assert_no_queries do
227
+ assert_equal [general, cooking], author.post_categories.sort_by(&:id)
228
+ end
229
+ end
230
+
231
+ def test_has_many_through_has_many_with_has_and_belongs_to_many_source_reflection_preload_via_joins
232
+ # preload table schemas
233
+ Author.joins(:post_categories).first
234
+
235
+ assert_includes_and_joins_equal(
236
+ Author.where("categories.id" => categories(:cooking).id),
237
+ [authors(:bob)], :post_categories
238
+ )
239
+ end
240
+
241
+ # has_many through
242
+ # Source: has_many
243
+ # Through: has_and_belongs_to_many
244
+ def test_has_many_through_has_and_belongs_to_many_with_has_many_source_reflection
245
+ greetings, more = comments(:greetings), comments(:more_greetings)
246
+
247
+ assert_equal [greetings, more], categories(:technology).post_comments.order("comments.id")
248
+ end
249
+
250
+ def test_has_many_through_has_and_belongs_to_many_with_has_many_source_reflection_preload
251
+ Category.includes(:post_comments).to_a # preheat cache
252
+ category = assert_queries(4) { Category.includes(:post_comments).second }
253
+ greetings, more = comments(:greetings), comments(:more_greetings)
254
+
255
+ assert_no_queries do
256
+ assert_equal [greetings, more], category.post_comments.sort_by(&:id)
257
+ end
258
+ end
259
+
260
+ def test_has_many_through_has_and_belongs_to_many_with_has_many_source_reflection_preload_via_joins
261
+ # preload table schemas
262
+ Category.joins(:post_comments).first
263
+
264
+ assert_includes_and_joins_equal(
265
+ Category.where("comments.id" => comments(:more_greetings).id).order("categories.id"),
266
+ [categories(:general), categories(:technology)], :post_comments
267
+ )
268
+ end
269
+
270
+ # has_many through
271
+ # Source: has_many through a habtm
272
+ # Through: has_many through
273
+ def test_has_many_through_has_many_with_has_many_through_habtm_source_reflection
274
+ greetings, more = comments(:greetings), comments(:more_greetings)
275
+
276
+ assert_equal [greetings, more], authors(:bob).category_post_comments.order("comments.id")
277
+ end
278
+
279
+ def test_has_many_through_has_many_with_has_many_through_habtm_source_reflection_preload
280
+ author = assert_queries(6) { Author.includes(:category_post_comments).third }
281
+ greetings, more = comments(:greetings), comments(:more_greetings)
282
+
283
+ assert_no_queries do
284
+ assert_equal [greetings, more], author.category_post_comments.sort_by(&:id)
285
+ end
286
+ end
287
+
288
+ def test_has_many_through_has_many_with_has_many_through_habtm_source_reflection_preload_via_joins
289
+ # preload table schemas
290
+ Author.joins(:category_post_comments).first
291
+
292
+ assert_includes_and_joins_equal(
293
+ Author.where("comments.id" => comments(:does_it_hurt).id).order("authors.id"),
294
+ [authors(:david), authors(:mary)], :category_post_comments
295
+ )
296
+ end
297
+
298
+ # has_many through
299
+ # Source: belongs_to
300
+ # Through: has_many through
301
+ def test_has_many_through_has_many_through_with_belongs_to_source_reflection
302
+ assert_equal [tags(:general), tags(:general)], authors(:david).tagging_tags
303
+ end
304
+
305
+ def test_has_many_through_has_many_through_with_belongs_to_source_reflection_preload
306
+ author = assert_queries(5) { Author.includes(:tagging_tags).first }
307
+ general = tags(:general)
308
+
309
+ assert_no_queries do
310
+ assert_equal [general, general], author.tagging_tags
311
+ end
312
+ end
313
+
314
+ def test_has_many_through_has_many_through_with_belongs_to_source_reflection_preload_via_joins
315
+ assert_includes_and_joins_equal(
316
+ Author.where("tags.id" => tags(:general).id),
317
+ [authors(:david)], :tagging_tags
318
+ )
319
+ end
320
+
321
+ # has_many through
322
+ # Source: has_many through
323
+ # Through: belongs_to
324
+ def test_has_many_through_belongs_to_with_has_many_through_source_reflection
325
+ welcome_general, thinking_general = taggings(:welcome_general), taggings(:thinking_general)
326
+
327
+ assert_equal [welcome_general, thinking_general],
328
+ categorizations(:david_welcome_general).post_taggings.order("taggings.id")
329
+ end
330
+
331
+ def test_has_many_through_belongs_to_with_has_many_through_source_reflection_preload
332
+ categorization = assert_queries(4) { Categorization.includes(:post_taggings).first }
333
+ welcome_general, thinking_general = taggings(:welcome_general), taggings(:thinking_general)
334
+
335
+ assert_no_queries do
336
+ assert_equal [welcome_general, thinking_general], categorization.post_taggings.sort_by(&:id)
337
+ end
338
+ end
339
+
340
+ def test_has_many_through_belongs_to_with_has_many_through_source_reflection_preload_via_joins
341
+ assert_includes_and_joins_equal(
342
+ Categorization.where("taggings.id" => taggings(:welcome_general).id).order("taggings.id"),
343
+ [categorizations(:david_welcome_general)], :post_taggings
344
+ )
345
+ end
346
+
347
+ # has_one through
348
+ # Source: has_one through
349
+ # Through: has_one
350
+ def test_has_one_through_has_one_with_has_one_through_source_reflection
351
+ assert_equal member_types(:founding), members(:groucho).nested_member_type
352
+ end
353
+
354
+ def test_has_one_through_has_one_with_has_one_through_source_reflection_preload
355
+ member = assert_queries(4) { Member.includes(:nested_member_type).first }
356
+ founding = member_types(:founding)
357
+
358
+ assert_no_queries do
359
+ assert_equal founding, member.nested_member_type
360
+ end
361
+ end
362
+
363
+ def test_has_one_through_has_one_with_has_one_through_source_reflection_preload_via_joins
364
+ assert_includes_and_joins_equal(
365
+ Member.where("member_types.id" => member_types(:founding).id),
366
+ [members(:groucho)], :nested_member_type
367
+ )
368
+ end
369
+
370
+ # has_one through
371
+ # Source: belongs_to
372
+ # Through: has_one through
373
+ def test_has_one_through_has_one_through_with_belongs_to_source_reflection
374
+ assert_equal categories(:general), members(:groucho).club_category
375
+ end
376
+
377
+ def test_joins_and_includes_from_through_models_not_included_in_association
378
+ prev_default_scope = Club.default_scopes
379
+
380
+ [:includes, :preload, :joins, :eager_load].each do |q|
381
+ Club.default_scopes = [proc { Club.public_send(q, :category) }]
382
+ assert_equal categories(:general), members(:groucho).reload.club_category
383
+ end
384
+ ensure
385
+ Club.default_scopes = prev_default_scope
386
+ end
387
+
388
+ def test_has_one_through_has_one_through_with_belongs_to_source_reflection_preload
389
+ member = assert_queries(4) { Member.includes(:club_category).first }
390
+ general = categories(:general)
391
+
392
+ assert_no_queries do
393
+ assert_equal general, member.club_category
394
+ end
395
+ end
396
+
397
+ def test_has_one_through_has_one_through_with_belongs_to_source_reflection_preload_via_joins
398
+ assert_includes_and_joins_equal(
399
+ Member.where("categories.id" => categories(:technology).id),
400
+ [members(:blarpy_winkup)], :club_category
401
+ )
402
+ end
403
+
404
+ def test_distinct_has_many_through_a_has_many_through_association_on_source_reflection
405
+ author = authors(:david)
406
+ assert_equal [tags(:general)], author.distinct_tags
407
+ end
408
+
409
+ def test_distinct_has_many_through_a_has_many_through_association_on_through_reflection
410
+ author = authors(:david)
411
+ assert_equal [subscribers(:first), subscribers(:second)],
412
+ author.distinct_subscribers.order("subscribers.nick")
413
+ end
414
+
415
+ def test_nested_has_many_through_with_a_table_referenced_multiple_times
416
+ author = authors(:bob)
417
+ assert_equal [posts(:misc_by_bob), posts(:misc_by_mary), posts(:other_by_bob), posts(:other_by_mary)],
418
+ author.similar_posts.sort_by(&:id)
419
+
420
+ # Mary and Bob both have posts in misc, but they are the only ones.
421
+ authors = Author.joins(:similar_posts).where("posts.id" => posts(:misc_by_bob).id)
422
+ assert_equal [authors(:mary), authors(:bob)], authors.distinct.sort_by(&:id)
423
+
424
+ # Check the polymorphism of taggings is being observed correctly (in both joins)
425
+ authors = Author.joins(:similar_posts).where("taggings.taggable_type" => "FakeModel")
426
+ assert_empty authors
427
+ authors = Author.joins(:similar_posts).where("taggings_authors_join.taggable_type" => "FakeModel")
428
+ assert_empty authors
429
+ end
430
+
431
+ def test_nested_has_many_through_with_scope_on_polymorphic_reflection
432
+ authors = Author.joins(:ordered_posts).where("posts.id" => posts(:misc_by_bob).id)
433
+ assert_equal [authors(:mary), authors(:bob)], authors.distinct.sort_by(&:id)
434
+ end
435
+
436
+ def test_has_many_through_with_foreign_key_option_on_through_reflection
437
+ assert_equal [posts(:welcome), posts(:authorless)], people(:david).agents_posts.order("posts.id")
438
+ assert_equal [authors(:david)], references(:david_unicyclist).agents_posts_authors
439
+
440
+ references = Reference.joins(:agents_posts_authors).where("authors.id" => authors(:david).id)
441
+ assert_equal [references(:david_unicyclist)], references
442
+ end
443
+
444
+ def test_has_many_through_with_foreign_key_option_on_source_reflection
445
+ assert_equal [people(:michael), people(:susan)], jobs(:unicyclist).agents.order("people.id")
446
+
447
+ jobs = Job.joins(:agents)
448
+ assert_equal [jobs(:unicyclist), jobs(:unicyclist)], jobs
449
+ end
450
+
451
+ def test_has_many_through_with_sti_on_through_reflection
452
+ ratings = posts(:sti_comments).special_comments_ratings.sort_by(&:id)
453
+ assert_equal [ratings(:special_comment_rating), ratings(:sub_special_comment_rating)], ratings
454
+
455
+ # Ensure STI is respected in the join
456
+ scope = Post.joins(:special_comments_ratings).where(id: posts(:sti_comments).id)
457
+ assert_empty scope.where("comments.type" => "Comment")
458
+ assert_not_empty scope.where("comments.type" => "SpecialComment")
459
+ assert_not_empty scope.where("comments.type" => "SubSpecialComment")
460
+ end
461
+
462
+ def test_has_many_through_with_sti_on_nested_through_reflection
463
+ taggings = posts(:sti_comments).special_comments_ratings_taggings
464
+ assert_equal [taggings(:special_comment_rating)], taggings
465
+
466
+ scope = Post.joins(:special_comments_ratings_taggings).where(id: posts(:sti_comments).id)
467
+ assert_empty scope.where("comments.type" => "Comment")
468
+ assert_not_empty scope.where("comments.type" => "SpecialComment")
469
+ end
470
+
471
+ def test_nested_has_many_through_writers_should_raise_error
472
+ david = authors(:david)
473
+ subscriber = subscribers(:first)
474
+
475
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
476
+ david.subscribers = [subscriber]
477
+ end
478
+
479
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
480
+ david.subscriber_ids = [subscriber.id]
481
+ end
482
+
483
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
484
+ david.subscribers << subscriber
485
+ end
486
+
487
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
488
+ david.subscribers.delete(subscriber)
489
+ end
490
+
491
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
492
+ david.subscribers.clear
493
+ end
494
+
495
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
496
+ david.subscribers.build
497
+ end
498
+
499
+ assert_raises(ActiveRecord::HasManyThroughNestedAssociationsAreReadonly) do
500
+ david.subscribers.create
501
+ end
502
+ end
503
+
504
+ def test_nested_has_one_through_writers_should_raise_error
505
+ groucho = members(:groucho)
506
+ founding = member_types(:founding)
507
+
508
+ assert_raises(ActiveRecord::HasOneThroughNestedAssociationsAreReadonly) do
509
+ groucho.nested_member_type = founding
510
+ end
511
+ end
512
+
513
+ def test_nested_has_many_through_with_conditions_on_through_associations
514
+ assert_equal [tags(:blue)], authors(:bob).misc_post_first_blue_tags
515
+ end
516
+
517
+ def test_nested_has_many_through_with_conditions_on_through_associations_preload
518
+ assert_empty Author.where("tags.id" => 100).joins(:misc_post_first_blue_tags)
519
+
520
+ author = assert_queries(2) { Author.includes(:misc_post_first_blue_tags).third }
521
+ blue = tags(:blue)
522
+
523
+ assert_no_queries do
524
+ assert_equal [blue], author.misc_post_first_blue_tags
525
+ end
526
+ end
527
+
528
+ def test_nested_has_many_through_with_conditions_on_through_associations_preload_via_joins
529
+ # Pointless condition to force single-query loading
530
+ assert_includes_and_joins_equal(
531
+ Author.where("tags.id = tags.id").references(:tags),
532
+ [authors(:bob)], :misc_post_first_blue_tags
533
+ )
534
+ end
535
+
536
+ def test_nested_has_many_through_with_conditions_on_source_associations
537
+ assert_equal [tags(:blue)], authors(:bob).misc_post_first_blue_tags_2
538
+ end
539
+
540
+ def test_nested_has_many_through_with_conditions_on_source_associations_preload
541
+ author = assert_queries(2) { Author.includes(:misc_post_first_blue_tags_2).third }
542
+ blue = tags(:blue)
543
+
544
+ assert_no_queries do
545
+ assert_equal [blue], author.misc_post_first_blue_tags_2
546
+ end
547
+ end
548
+
549
+ def test_through_association_preload_doesnt_reset_source_association_if_already_preloaded
550
+ blue = tags(:blue)
551
+ author = Author.preload(posts: :first_blue_tags_2, misc_post_first_blue_tags_2: {}).third
552
+
553
+ assert_no_queries do
554
+ assert_equal [blue], author.posts.first.first_blue_tags_2
555
+ end
556
+ end
557
+
558
+ def test_nested_has_many_through_with_conditions_on_source_associations_preload_via_joins
559
+ # Pointless condition to force single-query loading
560
+ assert_includes_and_joins_equal(
561
+ Author.where("tags.id = tags.id").references(:tags),
562
+ [authors(:bob)], :misc_post_first_blue_tags_2
563
+ )
564
+ end
565
+
566
+ def test_nested_has_many_through_with_foreign_key_option_on_the_source_reflection_through_reflection
567
+ assert_equal [categories(:general)], organizations(:nsa).author_essay_categories
568
+
569
+ organizations = Organization.joins(:author_essay_categories).
570
+ where("categories.id" => categories(:general).id)
571
+ assert_equal [organizations(:nsa)], organizations
572
+
573
+ assert_equal categories(:general), organizations(:nsa).author_owned_essay_category
574
+
575
+ organizations = Organization.joins(:author_owned_essay_category).
576
+ where("categories.id" => categories(:general).id)
577
+ assert_equal [organizations(:nsa)], organizations
578
+ end
579
+
580
+ def test_nested_has_many_through_should_not_be_autosaved
581
+ c = Categorization.new
582
+ c.author = authors(:david)
583
+ c.post_taggings.to_a
584
+ assert_not_empty c.post_taggings
585
+ c.save
586
+ assert_not_empty c.post_taggings
587
+ end
588
+
589
+ def test_polymorphic_has_many_through_when_through_association_has_not_loaded
590
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
591
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
592
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
593
+ Hotel.create!(departments: [department])
594
+ hotel = Hotel.includes(:cake_designers, :drink_designers).take
595
+
596
+ assert_equal [cake_designer], hotel.cake_designers
597
+ assert_equal [drink_designer], hotel.drink_designers
598
+ end
599
+
600
+ def test_polymorphic_has_many_through_when_through_association_has_already_loaded
601
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
602
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
603
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
604
+ Hotel.create!(departments: [department])
605
+ hotel = Hotel.includes(:chefs, :cake_designers, :drink_designers).take
606
+
607
+ assert_equal [cake_designer], hotel.cake_designers
608
+ assert_equal [drink_designer], hotel.drink_designers
609
+ end
610
+
611
+ def test_polymorphic_has_many_through_joined_different_table_twice
612
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
613
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
614
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
615
+ hotel = Hotel.create!(departments: [department])
616
+
617
+ assert_equal hotel, Hotel.joins(:cake_designers, :drink_designers).take
618
+ end
619
+
620
+ def test_has_many_through_reset_source_reflection_after_loading_is_complete
621
+ preloaded = Category.preload(:ordered_post_comments).find(1, 2).last
622
+ original = Category.find(2)
623
+ assert_equal original.ordered_post_comments.ids, preloaded.ordered_post_comments.ids
624
+ end
625
+
626
+ private
627
+ def assert_includes_and_joins_equal(query, expected, association)
628
+ query = query.order(:id)
629
+
630
+ actual = assert_queries(1) { query.joins(association).to_a.uniq }
631
+ assert_equal expected, actual
632
+
633
+ actual = assert_queries(1) { query.includes(association).to_a.uniq }
634
+ assert_equal expected, actual
635
+ end
636
+ end