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,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+
5
+ class RequiredAssociationsTest < ActiveRecord::TestCase
6
+ self.use_transactional_tests = false
7
+
8
+ class Parent < ActiveRecord::Base
9
+ end
10
+
11
+ class Child < ActiveRecord::Base
12
+ end
13
+
14
+ setup do
15
+ @connection = ActiveRecord::Base.connection
16
+ @connection.create_table :parents, force: true
17
+ @connection.create_table :children, force: true do |t|
18
+ t.belongs_to :parent
19
+ end
20
+ end
21
+
22
+ teardown do
23
+ @connection.drop_table "parents", if_exists: true
24
+ @connection.drop_table "children", if_exists: true
25
+ end
26
+
27
+ test "belongs_to associations can be optional by default" do
28
+ original_value = ActiveRecord::Base.belongs_to_required_by_default
29
+ ActiveRecord::Base.belongs_to_required_by_default = false
30
+
31
+ model = subclass_of(Child) do
32
+ belongs_to :parent, inverse_of: false,
33
+ class_name: "RequiredAssociationsTest::Parent"
34
+ end
35
+
36
+ assert model.new.save
37
+ assert model.new(parent: Parent.new).save
38
+ ensure
39
+ ActiveRecord::Base.belongs_to_required_by_default = original_value
40
+ end
41
+
42
+ test "required belongs_to associations have presence validated" do
43
+ model = subclass_of(Child) do
44
+ belongs_to :parent, required: true, inverse_of: false,
45
+ class_name: "RequiredAssociationsTest::Parent"
46
+ end
47
+
48
+ record = model.new
49
+ assert_not record.save
50
+ assert_equal ["Parent must exist"], record.errors.full_messages
51
+
52
+ record.parent = Parent.new
53
+ assert record.save
54
+ end
55
+
56
+ test "belongs_to associations can be required by default" do
57
+ original_value = ActiveRecord::Base.belongs_to_required_by_default
58
+ ActiveRecord::Base.belongs_to_required_by_default = true
59
+
60
+ model = subclass_of(Child) do
61
+ belongs_to :parent, inverse_of: false,
62
+ class_name: "RequiredAssociationsTest::Parent"
63
+ end
64
+
65
+ record = model.new
66
+ assert_not record.save
67
+ assert_equal ["Parent must exist"], record.errors.full_messages
68
+
69
+ record.parent = Parent.new
70
+ assert record.save
71
+ ensure
72
+ ActiveRecord::Base.belongs_to_required_by_default = original_value
73
+ end
74
+
75
+ test "has_one associations are not required by default" do
76
+ model = subclass_of(Parent) do
77
+ has_one :child, inverse_of: false,
78
+ class_name: "RequiredAssociationsTest::Child"
79
+ end
80
+
81
+ assert model.new.save
82
+ assert model.new(child: Child.new).save
83
+ end
84
+
85
+ test "required has_one associations have presence validated" do
86
+ model = subclass_of(Parent) do
87
+ has_one :child, required: true, inverse_of: false,
88
+ class_name: "RequiredAssociationsTest::Child"
89
+ end
90
+
91
+ record = model.new
92
+ assert_not record.save
93
+ assert_equal ["Child must exist"], record.errors.full_messages
94
+
95
+ record.child = Child.new
96
+ assert record.save
97
+ end
98
+
99
+ test "required has_one associations have a correct error message" do
100
+ model = subclass_of(Parent) do
101
+ has_one :child, required: true, inverse_of: false,
102
+ class_name: "RequiredAssociationsTest::Child"
103
+ end
104
+
105
+ record = model.create
106
+ assert_equal ["Child must exist"], record.errors.full_messages
107
+ end
108
+
109
+ test "required belongs_to associations have a correct error message" do
110
+ model = subclass_of(Child) do
111
+ belongs_to :parent, required: true, inverse_of: false,
112
+ class_name: "RequiredAssociationsTest::Parent"
113
+ end
114
+
115
+ record = model.create
116
+ assert_equal ["Parent must exist"], record.errors.full_messages
117
+ end
118
+
119
+ private
120
+ def subclass_of(klass, &block)
121
+ subclass = Class.new(klass, &block)
122
+ def subclass.name
123
+ superclass.name
124
+ end
125
+ subclass
126
+ end
127
+ end
@@ -0,0 +1,516 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/computer"
5
+ require "models/developer"
6
+ require "models/project"
7
+ require "models/company"
8
+ require "models/categorization"
9
+ require "models/category"
10
+ require "models/post"
11
+ require "models/author"
12
+ require "models/comment"
13
+ require "models/tag"
14
+ require "models/tagging"
15
+ require "models/person"
16
+ require "models/reader"
17
+ require "models/ship_part"
18
+ require "models/ship"
19
+ require "models/liquid"
20
+ require "models/molecule"
21
+ require "models/electron"
22
+ require "models/human"
23
+ require "models/interest"
24
+ require "models/pirate"
25
+ require "models/parrot"
26
+ require "models/bird"
27
+ require "models/treasure"
28
+ require "models/price_estimate"
29
+
30
+ class AssociationsTest < ActiveRecord::TestCase
31
+ fixtures :accounts, :companies, :developers, :projects, :developers_projects,
32
+ :computers, :people, :readers, :authors, :author_addresses, :author_favorites
33
+
34
+ def test_eager_loading_should_not_change_count_of_children
35
+ liquid = Liquid.create(name: "salty")
36
+ molecule = liquid.molecules.create(name: "molecule_1")
37
+ molecule.electrons.create(name: "electron_1")
38
+ molecule.electrons.create(name: "electron_2")
39
+
40
+ liquids = Liquid.includes(molecules: :electrons).references(:molecules).where("molecules.id is not null")
41
+ assert_equal 1, liquids[0].molecules.length
42
+ end
43
+
44
+ def test_subselect
45
+ author = authors :david
46
+ favs = author.author_favorites
47
+ fav2 = author.author_favorites.where(author: Author.where(id: author.id)).to_a
48
+ assert_equal favs, fav2
49
+ end
50
+
51
+ def test_loading_the_association_target_should_keep_child_records_marked_for_destruction
52
+ ship = Ship.create!(name: "The good ship Dollypop")
53
+ part = ship.parts.create!(name: "Mast")
54
+ part.mark_for_destruction
55
+ assert_predicate ship.parts[0], :marked_for_destruction?
56
+ end
57
+
58
+ def test_loading_the_association_target_should_load_most_recent_attributes_for_child_records_marked_for_destruction
59
+ ship = Ship.create!(name: "The good ship Dollypop")
60
+ part = ship.parts.create!(name: "Mast")
61
+ part.mark_for_destruction
62
+ ShipPart.find(part.id).update_columns(name: "Deck")
63
+ assert_equal "Deck", ship.parts[0].name
64
+ end
65
+
66
+ def test_include_with_order_works
67
+ assert_nothing_raised { Account.all.merge!(order: "id", includes: :firm).first }
68
+ assert_nothing_raised { Account.all.merge!(order: :id, includes: :firm).first }
69
+ end
70
+
71
+ def test_bad_collection_keys
72
+ assert_raise(ArgumentError, "ActiveRecord should have barked on bad collection keys") do
73
+ Class.new(ActiveRecord::Base).has_many(:wheels, name: "wheels")
74
+ end
75
+ end
76
+
77
+ def test_should_construct_new_finder_sql_after_create
78
+ person = Person.new first_name: "clark"
79
+ assert_equal [], person.readers.to_a
80
+ person.save!
81
+ reader = Reader.create! person: person, post: Post.new(title: "foo", body: "bar")
82
+ assert person.readers.find(reader.id)
83
+ end
84
+
85
+ def test_force_reload
86
+ firm = Firm.new("name" => "A New Firm, Inc")
87
+ firm.save
88
+ firm.clients.each { } # forcing to load all clients
89
+ assert firm.clients.empty?, "New firm shouldn't have client objects"
90
+ assert_equal 0, firm.clients.size, "New firm should have 0 clients"
91
+
92
+ client = Client.new("name" => "TheClient.com", "firm_id" => firm.id)
93
+ client.save
94
+
95
+ assert firm.clients.empty?, "New firm should have cached no client objects"
96
+ assert_equal 0, firm.clients.size, "New firm should have cached 0 clients count"
97
+
98
+ firm.clients.reload
99
+
100
+ assert_not firm.clients.empty?, "New firm should have reloaded client objects"
101
+ assert_equal 1, firm.clients.size, "New firm should have reloaded clients count"
102
+ end
103
+
104
+ def test_using_limitable_reflections_helper
105
+ using_limitable_reflections = lambda { |reflections| Tagging.all.send :using_limitable_reflections?, reflections }
106
+ belongs_to_reflections = [Tagging.reflect_on_association(:tag), Tagging.reflect_on_association(:super_tag)]
107
+ has_many_reflections = [Tag.reflect_on_association(:taggings), Developer.reflect_on_association(:projects)]
108
+ mixed_reflections = (belongs_to_reflections + has_many_reflections).uniq
109
+ assert using_limitable_reflections.call(belongs_to_reflections), "Belong to associations are limitable"
110
+ assert_not using_limitable_reflections.call(has_many_reflections), "All has many style associations are not limitable"
111
+ assert_not using_limitable_reflections.call(mixed_reflections), "No collection associations (has many style) should pass"
112
+ end
113
+
114
+ def test_association_with_references
115
+ firm = companies(:first_firm)
116
+ assert_equal [:foo], firm.association_with_references.references_values
117
+ end
118
+ end
119
+
120
+ class AssociationProxyTest < ActiveRecord::TestCase
121
+ fixtures :authors, :author_addresses, :posts, :categorizations, :categories, :developers, :projects, :developers_projects
122
+
123
+ def test_push_does_not_load_target
124
+ david = authors(:david)
125
+
126
+ david.posts << (post = Post.new(title: "New on Edge", body: "More cool stuff!"))
127
+ assert_not_predicate david.posts, :loaded?
128
+ assert_includes david.posts, post
129
+ end
130
+
131
+ def test_push_has_many_through_does_not_load_target
132
+ david = authors(:david)
133
+
134
+ david.categories << categories(:technology)
135
+ assert_not_predicate david.categories, :loaded?
136
+ assert_includes david.categories, categories(:technology)
137
+ end
138
+
139
+ def test_push_followed_by_save_does_not_load_target
140
+ david = authors(:david)
141
+
142
+ david.posts << (post = Post.new(title: "New on Edge", body: "More cool stuff!"))
143
+ assert_not_predicate david.posts, :loaded?
144
+ david.save
145
+ assert_not_predicate david.posts, :loaded?
146
+ assert_includes david.posts, post
147
+ end
148
+
149
+ def test_push_does_not_lose_additions_to_new_record
150
+ josh = Author.new(name: "Josh")
151
+ josh.posts << Post.new(title: "New on Edge", body: "More cool stuff!")
152
+ assert_predicate josh.posts, :loaded?
153
+ assert_equal 1, josh.posts.size
154
+ end
155
+
156
+ def test_append_behaves_like_push
157
+ josh = Author.new(name: "Josh")
158
+ josh.posts.append Post.new(title: "New on Edge", body: "More cool stuff!")
159
+ assert_predicate josh.posts, :loaded?
160
+ assert_equal 1, josh.posts.size
161
+ end
162
+
163
+ def test_prepend_is_not_defined
164
+ josh = Author.new(name: "Josh")
165
+ assert_raises(NoMethodError) { josh.posts.prepend Post.new }
166
+ end
167
+
168
+ def test_save_on_parent_does_not_load_target
169
+ david = developers(:david)
170
+
171
+ assert_not_predicate david.projects, :loaded?
172
+ david.update_columns(created_at: Time.now)
173
+ assert_not_predicate david.projects, :loaded?
174
+ end
175
+
176
+ def test_load_does_load_target
177
+ david = developers(:david)
178
+
179
+ assert_not_predicate david.projects, :loaded?
180
+ david.projects.load
181
+ assert_predicate david.projects, :loaded?
182
+ end
183
+
184
+ def test_inspect_does_not_reload_a_not_yet_loaded_target
185
+ andreas = Developer.new name: "Andreas", log: "new developer added"
186
+ assert_not_predicate andreas.audit_logs, :loaded?
187
+ assert_match(/message: "new developer added"/, andreas.audit_logs.inspect)
188
+ assert_predicate andreas.audit_logs, :loaded?
189
+ end
190
+
191
+ def test_save_on_parent_saves_children
192
+ developer = Developer.create name: "Bryan", salary: 50_000
193
+ assert_equal 1, developer.reload.audit_logs.size
194
+ end
195
+
196
+ def test_create_via_association_with_block
197
+ post = authors(:david).posts.create(title: "New on Edge") { |p| p.body = "More cool stuff!" }
198
+ assert_equal post.title, "New on Edge"
199
+ assert_equal post.body, "More cool stuff!"
200
+ end
201
+
202
+ def test_create_with_bang_via_association_with_block
203
+ post = authors(:david).posts.create!(title: "New on Edge") { |p| p.body = "More cool stuff!" }
204
+ assert_equal post.title, "New on Edge"
205
+ assert_equal post.body, "More cool stuff!"
206
+ end
207
+
208
+ def test_reload_returns_association
209
+ david = developers(:david)
210
+ assert_nothing_raised do
211
+ assert_equal david.projects, david.projects.reload.reload
212
+ end
213
+ end
214
+
215
+ def test_proxy_association_accessor
216
+ david = developers(:david)
217
+ assert_equal david.association(:projects), david.projects.proxy_association
218
+ end
219
+
220
+ def test_scoped_allows_conditions
221
+ assert developers(:david).projects.merge(where: "foo").to_sql.include?("foo")
222
+ end
223
+
224
+ test "getting a scope from an association" do
225
+ david = developers(:david)
226
+
227
+ assert david.projects.scope.is_a?(ActiveRecord::Relation)
228
+ assert_equal david.projects, david.projects.scope
229
+ end
230
+
231
+ test "proxy object is cached" do
232
+ david = developers(:david)
233
+ assert_same david.projects, david.projects
234
+ end
235
+
236
+ test "proxy object can be stubbed" do
237
+ david = developers(:david)
238
+ david.projects.define_singleton_method(:extra_method) { 42 }
239
+
240
+ assert_equal 42, david.projects.extra_method
241
+ end
242
+
243
+ test "inverses get set of subsets of the association" do
244
+ human = Human.create
245
+ human.interests.create
246
+
247
+ human = Human.find(human.id)
248
+
249
+ assert_queries(1) do
250
+ assert_equal human, human.interests.where("1=1").first.human
251
+ end
252
+ end
253
+
254
+ test "first! works on loaded associations" do
255
+ david = authors(:david)
256
+ assert_equal david.first_posts.first, david.first_posts.reload.first!
257
+ assert_predicate david.first_posts, :loaded?
258
+ assert_no_queries { david.first_posts.first! }
259
+ end
260
+
261
+ def test_pluck_uses_loaded_target
262
+ david = authors(:david)
263
+ assert_equal david.first_posts.pluck(:title), david.first_posts.load.pluck(:title)
264
+ assert_predicate david.first_posts, :loaded?
265
+ assert_no_queries { david.first_posts.pluck(:title) }
266
+ end
267
+
268
+ def test_pick_uses_loaded_target
269
+ david = authors(:david)
270
+ assert_equal david.first_posts.pick(:title), david.first_posts.load.pick(:title)
271
+ assert_predicate david.first_posts, :loaded?
272
+ assert_no_queries { david.first_posts.pick(:title) }
273
+ end
274
+
275
+ def test_reset_unloads_target
276
+ david = authors(:david)
277
+ david.posts.reload
278
+
279
+ assert_predicate david.posts, :loaded?
280
+ assert_predicate david.posts, :loaded
281
+ david.posts.reset
282
+ assert_not_predicate david.posts, :loaded?
283
+ assert_not_predicate david.posts, :loaded
284
+ end
285
+
286
+ def test_target_merging_ignores_persisted_in_memory_records
287
+ david = authors(:david)
288
+ assert david.thinking_posts.include?(posts(:thinking))
289
+
290
+ david.thinking_posts.create!(title: "Something else entirely", body: "Does not matter.")
291
+
292
+ assert_equal 1, david.thinking_posts.size
293
+ assert_equal 1, david.thinking_posts.to_a.size
294
+ end
295
+ end
296
+
297
+ class OverridingAssociationsTest < ActiveRecord::TestCase
298
+ class DifferentPerson < ActiveRecord::Base; end
299
+
300
+ class PeopleList < ActiveRecord::Base
301
+ has_and_belongs_to_many :has_and_belongs_to_many, before_add: :enlist
302
+ has_many :has_many, before_add: :enlist
303
+ belongs_to :belongs_to
304
+ has_one :has_one
305
+ end
306
+
307
+ class DifferentPeopleList < PeopleList
308
+ # Different association with the same name, callbacks should be omitted here.
309
+ has_and_belongs_to_many :has_and_belongs_to_many, class_name: "DifferentPerson"
310
+ has_many :has_many, class_name: "DifferentPerson"
311
+ belongs_to :belongs_to, class_name: "DifferentPerson"
312
+ has_one :has_one, class_name: "DifferentPerson"
313
+ end
314
+
315
+ def test_habtm_association_redefinition_callbacks_should_differ_and_not_inherited
316
+ # redeclared association on AR descendant should not inherit callbacks from superclass
317
+ callbacks = PeopleList.before_add_for_has_and_belongs_to_many
318
+ assert_equal(1, callbacks.length)
319
+ callbacks = DifferentPeopleList.before_add_for_has_and_belongs_to_many
320
+ assert_equal([], callbacks)
321
+ end
322
+
323
+ def test_has_many_association_redefinition_callbacks_should_differ_and_not_inherited
324
+ # redeclared association on AR descendant should not inherit callbacks from superclass
325
+ callbacks = PeopleList.before_add_for_has_many
326
+ assert_equal(1, callbacks.length)
327
+ callbacks = DifferentPeopleList.before_add_for_has_many
328
+ assert_equal([], callbacks)
329
+ end
330
+
331
+ def test_habtm_association_redefinition_reflections_should_differ_and_not_inherited
332
+ assert_not_equal(
333
+ PeopleList.reflect_on_association(:has_and_belongs_to_many),
334
+ DifferentPeopleList.reflect_on_association(:has_and_belongs_to_many)
335
+ )
336
+ end
337
+
338
+ def test_has_many_association_redefinition_reflections_should_differ_and_not_inherited
339
+ assert_not_equal(
340
+ PeopleList.reflect_on_association(:has_many),
341
+ DifferentPeopleList.reflect_on_association(:has_many)
342
+ )
343
+ end
344
+
345
+ def test_belongs_to_association_redefinition_reflections_should_differ_and_not_inherited
346
+ assert_not_equal(
347
+ PeopleList.reflect_on_association(:belongs_to),
348
+ DifferentPeopleList.reflect_on_association(:belongs_to)
349
+ )
350
+ end
351
+
352
+ def test_has_one_association_redefinition_reflections_should_differ_and_not_inherited
353
+ assert_not_equal(
354
+ PeopleList.reflect_on_association(:has_one),
355
+ DifferentPeopleList.reflect_on_association(:has_one)
356
+ )
357
+ end
358
+
359
+ def test_requires_symbol_argument
360
+ assert_raises ArgumentError do
361
+ Class.new(Post) do
362
+ belongs_to "author"
363
+ end
364
+ end
365
+ end
366
+ end
367
+
368
+ class PreloaderTest < ActiveRecord::TestCase
369
+ fixtures :posts, :comments
370
+
371
+ def test_preload_with_scope
372
+ post = posts(:welcome)
373
+
374
+ preloader = ActiveRecord::Associations::Preloader.new
375
+ preloader.preload([post], :comments, Comment.where(body: "Thank you for the welcome"))
376
+
377
+ assert_predicate post.comments, :loaded?
378
+ assert_equal [comments(:greetings)], post.comments
379
+ end
380
+
381
+ def test_preload_for_hmt_with_conditions
382
+ post = posts(:welcome)
383
+ _normal_category = post.categories.create!(name: "Normal")
384
+ special_category = post.special_categories.create!(name: "Special")
385
+
386
+ preloader = ActiveRecord::Associations::Preloader.new
387
+ preloader.preload([post], :hmt_special_categories)
388
+
389
+ assert_equal 1, post.hmt_special_categories.length
390
+ assert_equal [special_category], post.hmt_special_categories
391
+ end
392
+ end
393
+
394
+ class GeneratedMethodsTest < ActiveRecord::TestCase
395
+ fixtures :developers, :computers, :posts, :comments
396
+
397
+ def test_association_methods_override_attribute_methods_of_same_name
398
+ assert_equal(developers(:david), computers(:workstation).developer)
399
+ # this next line will fail if the attribute methods module is generated lazily
400
+ # after the association methods module is generated
401
+ assert_equal(developers(:david), computers(:workstation).developer)
402
+ assert_equal(developers(:david).id, computers(:workstation)[:developer])
403
+ end
404
+
405
+ def test_model_method_overrides_association_method
406
+ assert_equal(comments(:greetings).body, posts(:welcome).first_comment)
407
+ end
408
+
409
+ module MyModule
410
+ def comments; :none end
411
+ end
412
+
413
+ class MyArticle < ActiveRecord::Base
414
+ self.table_name = "articles"
415
+ include MyModule
416
+ has_many :comments, inverse_of: false
417
+ end
418
+
419
+ def test_included_module_overwrites_association_methods
420
+ assert_equal :none, MyArticle.new.comments
421
+ end
422
+ end
423
+
424
+ class WithAnnotationsTest < ActiveRecord::TestCase
425
+ fixtures :pirates, :parrots, :treasures
426
+
427
+ def test_belongs_to_with_annotation_includes_a_query_comment
428
+ pirate = SpacePirate.where.not(parrot_id: nil).first
429
+ assert pirate, "should have a Pirate record"
430
+
431
+ log = capture_sql do
432
+ pirate.parrot
433
+ end
434
+ assert_not_predicate log, :empty?
435
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
436
+
437
+ assert_sql(%r{/\* that tells jokes \*/}) do
438
+ pirate.parrot_with_annotation
439
+ end
440
+ end
441
+
442
+ def test_has_and_belongs_to_many_with_annotation_includes_a_query_comment
443
+ pirate = SpacePirate.first
444
+ assert pirate, "should have a Pirate record"
445
+
446
+ log = capture_sql do
447
+ pirate.parrots.first
448
+ end
449
+ assert_not_predicate log, :empty?
450
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
451
+
452
+ assert_sql(%r{/\* that are very colorful \*/}) do
453
+ pirate.parrots_with_annotation.first
454
+ end
455
+ end
456
+
457
+ def test_has_one_with_annotation_includes_a_query_comment
458
+ pirate = SpacePirate.first
459
+ assert pirate, "should have a Pirate record"
460
+
461
+ log = capture_sql do
462
+ pirate.ship
463
+ end
464
+ assert_not_predicate log, :empty?
465
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
466
+
467
+ assert_sql(%r{/\* that is a rocket \*/}) do
468
+ pirate.ship_with_annotation
469
+ end
470
+ end
471
+
472
+ def test_has_many_with_annotation_includes_a_query_comment
473
+ pirate = SpacePirate.first
474
+ assert pirate, "should have a Pirate record"
475
+
476
+ log = capture_sql do
477
+ pirate.birds.first
478
+ end
479
+ assert_not_predicate log, :empty?
480
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
481
+
482
+ assert_sql(%r{/\* that are also parrots \*/}) do
483
+ pirate.birds_with_annotation.first
484
+ end
485
+ end
486
+
487
+ def test_has_many_through_with_annotation_includes_a_query_comment
488
+ pirate = SpacePirate.first
489
+ assert pirate, "should have a Pirate record"
490
+
491
+ log = capture_sql do
492
+ pirate.treasure_estimates.first
493
+ end
494
+ assert_not_predicate log, :empty?
495
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
496
+
497
+ assert_sql(%r{/\* yarrr \*/}) do
498
+ pirate.treasure_estimates_with_annotation.first
499
+ end
500
+ end
501
+
502
+ def test_has_many_through_with_annotation_includes_a_query_comment_when_eager_loading
503
+ pirate = SpacePirate.first
504
+ assert pirate, "should have a Pirate record"
505
+
506
+ log = capture_sql do
507
+ pirate.treasure_estimates.first
508
+ end
509
+ assert_not_predicate log, :empty?
510
+ assert_predicate log.select { |query| query.match?(%r{/\*}) }, :empty?
511
+
512
+ assert_sql(%r{/\* yarrr \*/}) do
513
+ SpacePirate.includes(:treasure_estimates_with_annotation, :treasures).first
514
+ end
515
+ end
516
+ end