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,429 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/club"
5
+ require "models/member_type"
6
+ require "models/member"
7
+ require "models/membership"
8
+ require "models/sponsor"
9
+ require "models/organization"
10
+ require "models/member_detail"
11
+ require "models/minivan"
12
+ require "models/dashboard"
13
+ require "models/speedometer"
14
+ require "models/category"
15
+ require "models/author"
16
+ require "models/essay"
17
+ require "models/owner"
18
+ require "models/post"
19
+ require "models/comment"
20
+ require "models/categorization"
21
+ require "models/customer"
22
+ require "models/carrier"
23
+ require "models/shop_account"
24
+ require "models/customer_carrier"
25
+
26
+ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
27
+ fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
28
+ :dashboards, :speedometers, :authors, :author_addresses, :posts, :comments, :categories, :essays, :owners
29
+
30
+ def setup
31
+ @member = members(:groucho)
32
+ end
33
+
34
+ def test_has_one_through_with_has_one
35
+ assert_equal clubs(:boring_club), @member.club
36
+ end
37
+
38
+ def test_has_one_through_executes_limited_query
39
+ boring_club = clubs(:boring_club)
40
+ assert_sql(/LIMIT|ROWNUM <=|FETCH FIRST/) do
41
+ assert_equal boring_club, @member.general_club
42
+ end
43
+ end
44
+
45
+ def test_creating_association_creates_through_record
46
+ new_member = Member.create(name: "Chris")
47
+ new_member.club = Club.create(name: "LRUG")
48
+ assert_not_nil new_member.current_membership
49
+ assert_not_nil new_member.club
50
+ end
51
+
52
+ def test_creating_association_builds_through_record
53
+ new_member = Member.create(name: "Chris")
54
+ new_club = new_member.association(:club).build
55
+ assert new_member.current_membership
56
+ assert_equal new_club, new_member.club
57
+ assert_predicate new_club, :new_record?
58
+ assert_predicate new_member.current_membership, :new_record?
59
+ assert new_member.save
60
+ assert_predicate new_club, :persisted?
61
+ assert_predicate new_member.current_membership, :persisted?
62
+ end
63
+
64
+ def test_creating_association_builds_through_record_for_new
65
+ new_member = Member.new(name: "Jane")
66
+ new_member.club = clubs(:moustache_club)
67
+ assert new_member.current_membership
68
+ assert_equal clubs(:moustache_club), new_member.current_membership.club
69
+ assert_equal clubs(:moustache_club), new_member.club
70
+ assert new_member.save
71
+ assert_equal clubs(:moustache_club), new_member.club
72
+ end
73
+
74
+ def test_building_multiple_associations_builds_through_record
75
+ member_type = MemberType.create!
76
+ member = Member.create!
77
+ member_detail_with_one_association = MemberDetail.new(member_type: member_type)
78
+ assert_predicate member_detail_with_one_association.member, :new_record?
79
+ member_detail_with_two_associations = MemberDetail.new(member_type: member_type, admittable: member)
80
+ assert_predicate member_detail_with_two_associations.member, :new_record?
81
+ end
82
+
83
+ def test_creating_multiple_associations_creates_through_record
84
+ member_type = MemberType.create!
85
+ member = Member.create!
86
+ member_detail_with_one_association = MemberDetail.create!(member_type: member_type)
87
+ assert_not_predicate member_detail_with_one_association.member, :new_record?
88
+ member_detail_with_two_associations = MemberDetail.create!(member_type: member_type, admittable: member)
89
+ assert_not_predicate member_detail_with_two_associations.member, :new_record?
90
+ end
91
+
92
+ def test_creating_association_sets_both_parent_ids_for_new
93
+ member = Member.new(name: "Sean Griffin")
94
+ club = Club.new(name: "Da Club")
95
+
96
+ member.club = club
97
+
98
+ member.save!
99
+
100
+ assert member.id
101
+ assert club.id
102
+ assert_equal member.id, member.current_membership.member_id
103
+ assert_equal club.id, member.current_membership.club_id
104
+ end
105
+
106
+ def test_replace_target_record
107
+ new_club = Club.create(name: "Marx Bros")
108
+ @member.club = new_club
109
+ @member.reload
110
+ assert_equal new_club, @member.club
111
+ end
112
+
113
+ def test_replacing_target_record_deletes_old_association
114
+ assert_no_difference "Membership.count" do
115
+ new_club = Club.create(name: "Bananarama")
116
+ @member.club = new_club
117
+ @member.reload
118
+ end
119
+ end
120
+
121
+ def test_set_record_to_nil_should_delete_association
122
+ @member.club = nil
123
+ @member.reload
124
+ assert_nil @member.current_membership
125
+ assert_nil @member.club
126
+ end
127
+
128
+ def test_set_record_after_delete_association
129
+ @member.club = nil
130
+ @member.club = clubs(:moustache_club)
131
+ @member.reload
132
+ assert_equal clubs(:moustache_club), @member.club
133
+ end
134
+
135
+ def test_has_one_through_polymorphic
136
+ assert_equal clubs(:moustache_club), @member.sponsor_club
137
+ end
138
+
139
+ def test_has_one_through_eager_loading
140
+ members = assert_queries(3) do # base table, through table, clubs table
141
+ Member.all.merge!(includes: :club, where: ["name = ?", "Groucho Marx"]).to_a
142
+ end
143
+ assert_equal 1, members.size
144
+ assert_not_nil assert_no_queries { members[0].club }
145
+ end
146
+
147
+ def test_has_one_through_eager_loading_through_polymorphic
148
+ members = assert_queries(3) do # base table, through table, clubs table
149
+ Member.all.merge!(includes: :sponsor_club, where: ["name = ?", "Groucho Marx"]).to_a
150
+ end
151
+ assert_equal 1, members.size
152
+ assert_not_nil assert_no_queries { members[0].sponsor_club }
153
+ end
154
+
155
+ def test_has_one_through_with_conditions_eager_loading
156
+ # conditions on the through table
157
+ assert_equal clubs(:moustache_club), Member.all.merge!(includes: :favourite_club).find(@member.id).favourite_club
158
+ memberships(:membership_of_favourite_club).update_columns(favourite: false)
159
+ assert_nil Member.all.merge!(includes: :favourite_club).find(@member.id).reload.favourite_club
160
+
161
+ # conditions on the source table
162
+ assert_equal clubs(:moustache_club), Member.all.merge!(includes: :hairy_club).find(@member.id).hairy_club
163
+ clubs(:moustache_club).update_columns(name: "Association of Clean-Shaven Persons")
164
+ assert_nil Member.all.merge!(includes: :hairy_club).find(@member.id).reload.hairy_club
165
+ end
166
+
167
+ def test_has_one_through_polymorphic_with_source_type
168
+ assert_equal members(:groucho), clubs(:moustache_club).sponsored_member
169
+ end
170
+
171
+ def test_eager_has_one_through_polymorphic_with_source_type
172
+ clubs = Club.all.merge!(includes: :sponsored_member, where: ["name = ?", "Moustache and Eyebrow Fancier Club"]).to_a
173
+ # Only the eyebrow fanciers club has a sponsored_member
174
+ assert_not_nil assert_no_queries { clubs[0].sponsored_member }
175
+ end
176
+
177
+ def test_has_one_through_nonpreload_eagerloading
178
+ members = assert_queries(1) do
179
+ Member.all.merge!(includes: :club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
180
+ end
181
+ assert_equal 1, members.size
182
+ assert_not_nil assert_no_queries { members[0].club }
183
+ end
184
+
185
+ def test_has_one_through_nonpreload_eager_loading_through_polymorphic
186
+ members = assert_queries(1) do
187
+ Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
188
+ end
189
+ assert_equal 1, members.size
190
+ assert_not_nil assert_no_queries { members[0].sponsor_club }
191
+ end
192
+
193
+ def test_has_one_through_nonpreload_eager_loading_through_polymorphic_with_more_than_one_through_record
194
+ Sponsor.new(sponsor_club: clubs(:crazy_club), sponsorable: members(:groucho)).save!
195
+ members = assert_queries(1) do
196
+ Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name DESC").to_a # force fallback
197
+ end
198
+ assert_equal 1, members.size
199
+ assert_not_nil assert_no_queries { members[0].sponsor_club }
200
+ assert_equal clubs(:crazy_club), members[0].sponsor_club
201
+ end
202
+
203
+ def test_uninitialized_has_one_through_should_return_nil_for_unsaved_record
204
+ assert_nil Member.new.club
205
+ end
206
+
207
+ def test_assigning_association_correctly_assigns_target
208
+ new_member = Member.create(name: "Chris")
209
+ new_member.club = new_club = Club.create(name: "LRUG")
210
+ assert_equal new_club, new_member.association(:club).target
211
+ end
212
+
213
+ def test_has_one_through_proxy_should_not_respond_to_private_methods
214
+ assert_raise(NoMethodError) { clubs(:moustache_club).private_method }
215
+ assert_raise(NoMethodError) { @member.club.private_method }
216
+ end
217
+
218
+ def test_has_one_through_proxy_should_respond_to_private_methods_via_send
219
+ clubs(:moustache_club).send(:private_method)
220
+ @member.club.send(:private_method)
221
+ end
222
+
223
+ def test_assigning_to_has_one_through_preserves_decorated_join_record
224
+ @organization = organizations(:nsa)
225
+ assert_difference "MemberDetail.count", 1 do
226
+ @member_detail = MemberDetail.new(extra_data: "Extra")
227
+ @member.member_detail = @member_detail
228
+ @member.organization = @organization
229
+ end
230
+ assert_equal @organization, @member.organization
231
+ assert_includes @organization.members, @member
232
+ assert_equal "Extra", @member.member_detail.extra_data
233
+ end
234
+
235
+ def test_reassigning_has_one_through
236
+ @organization = organizations(:nsa)
237
+ @new_organization = organizations(:discordians)
238
+
239
+ assert_difference "MemberDetail.count", 1 do
240
+ @member_detail = MemberDetail.new(extra_data: "Extra")
241
+ @member.member_detail = @member_detail
242
+ @member.organization = @organization
243
+ end
244
+ assert_equal @organization, @member.organization
245
+ assert_equal "Extra", @member.member_detail.extra_data
246
+ assert_includes @organization.members, @member
247
+ assert_not_includes @new_organization.members, @member
248
+
249
+ assert_no_difference "MemberDetail.count" do
250
+ @member.organization = @new_organization
251
+ end
252
+ assert_equal @new_organization, @member.organization
253
+ assert_equal "Extra", @member.member_detail.extra_data
254
+ assert_not_includes @organization.members, @member
255
+ assert_includes @new_organization.members, @member
256
+ end
257
+
258
+ def test_preloading_has_one_through_on_belongs_to
259
+ MemberDetail.delete_all
260
+ assert_not_nil @member.member_type
261
+ @organization = organizations(:nsa)
262
+ @member_detail = MemberDetail.new
263
+ @member.member_detail = @member_detail
264
+ @member.organization = @organization
265
+ @member_details = assert_queries(3) do
266
+ MemberDetail.all.merge!(includes: :member_type).to_a
267
+ end
268
+ @new_detail = @member_details[0]
269
+ assert_predicate @new_detail.send(:association, :member_type), :loaded?
270
+ assert_no_queries { @new_detail.member_type }
271
+ end
272
+
273
+ def test_save_of_record_with_loaded_has_one_through
274
+ @club = @member.club
275
+ assert_not_nil @club.sponsored_member
276
+
277
+ assert_nothing_raised do
278
+ Club.find(@club.id).save!
279
+ Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
280
+ end
281
+
282
+ @club.sponsor.destroy
283
+
284
+ assert_nothing_raised do
285
+ Club.find(@club.id).save!
286
+ Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
287
+ end
288
+ end
289
+
290
+ def test_through_belongs_to_after_destroy
291
+ @member_detail = MemberDetail.new(extra_data: "Extra")
292
+ @member.member_detail = @member_detail
293
+ @member.save!
294
+
295
+ assert_not_nil @member_detail.member_type
296
+ @member_detail.destroy
297
+ assert_queries(1) do
298
+ @member_detail.association(:member_type).reload
299
+ assert_not_nil @member_detail.member_type
300
+ end
301
+
302
+ @member_detail.member.destroy
303
+ assert_queries(1) do
304
+ @member_detail.association(:member_type).reload
305
+ assert_nil @member_detail.member_type
306
+ end
307
+ end
308
+
309
+ def test_value_is_properly_quoted
310
+ minivan = Minivan.find("m1")
311
+ assert_nothing_raised do
312
+ minivan.dashboard
313
+ end
314
+ end
315
+
316
+ def test_has_one_through_polymorphic_with_primary_key_option
317
+ assert_equal categories(:general), authors(:david).essay_category
318
+
319
+ authors = Author.joins(:essay_category).where("categories.id" => categories(:general).id)
320
+ assert_equal authors(:david), authors.first
321
+
322
+ assert_equal owners(:blackbeard), authors(:david).essay_owner
323
+
324
+ authors = Author.joins(:essay_owner).where("owners.name = 'blackbeard'")
325
+ assert_equal authors(:david), authors.first
326
+ end
327
+
328
+ def test_has_one_through_with_primary_key_option
329
+ assert_equal categories(:general), authors(:david).essay_category_2
330
+
331
+ authors = Author.joins(:essay_category_2).where("categories.id" => categories(:general).id)
332
+ assert_equal authors(:david), authors.first
333
+ end
334
+
335
+ def test_has_one_through_with_default_scope_on_join_model
336
+ assert_equal posts(:welcome).comments.order("id").first, authors(:david).comment_on_first_post
337
+ end
338
+
339
+ def test_has_one_through_many_raises_exception
340
+ assert_raise(ActiveRecord::HasOneThroughCantAssociateThroughCollection) do
341
+ members(:groucho).club_through_many
342
+ end
343
+ end
344
+
345
+ def test_has_one_through_polymorphic_association
346
+ assert_raise(ActiveRecord::HasOneAssociationPolymorphicThroughError) do
347
+ @member.premium_club
348
+ end
349
+ end
350
+
351
+ def test_has_one_through_belongs_to_should_update_when_the_through_foreign_key_changes
352
+ minivan = minivans(:cool_first)
353
+
354
+ minivan.dashboard
355
+ proxy = minivan.send(:association_instance_get, :dashboard)
356
+
357
+ assert_not_predicate proxy, :stale_target?
358
+ assert_equal dashboards(:cool_first), minivan.dashboard
359
+
360
+ minivan.speedometer_id = speedometers(:second).id
361
+
362
+ assert_predicate proxy, :stale_target?
363
+ assert_equal dashboards(:second), minivan.dashboard
364
+ end
365
+
366
+ def test_has_one_through_belongs_to_setting_belongs_to_foreign_key_after_nil_target_loaded
367
+ minivan = Minivan.new
368
+
369
+ minivan.dashboard
370
+ proxy = minivan.send(:association_instance_get, :dashboard)
371
+
372
+ minivan.speedometer_id = speedometers(:second).id
373
+
374
+ assert_predicate proxy, :stale_target?
375
+ assert_equal dashboards(:second), minivan.dashboard
376
+ end
377
+
378
+ def test_assigning_has_one_through_belongs_to_with_new_record_owner
379
+ minivan = Minivan.new
380
+ dashboard = dashboards(:cool_first)
381
+
382
+ minivan.dashboard = dashboard
383
+
384
+ assert_equal dashboard, minivan.dashboard
385
+ assert_equal dashboard, minivan.speedometer.dashboard
386
+ end
387
+
388
+ def test_has_one_through_with_custom_select_on_join_model_default_scope
389
+ assert_equal clubs(:boring_club), members(:groucho).selected_club
390
+ end
391
+
392
+ def test_has_one_through_relationship_cannot_have_a_counter_cache
393
+ assert_raise(ArgumentError) do
394
+ Class.new(ActiveRecord::Base) do
395
+ has_one :thing, through: :other_thing, counter_cache: true
396
+ end
397
+ end
398
+ end
399
+
400
+ def test_has_one_through_do_not_cache_association_reader_if_the_though_method_has_default_scopes
401
+ customer = Customer.create!
402
+ carrier = Carrier.create!
403
+ customer_carrier = CustomerCarrier.create!(
404
+ customer: customer,
405
+ carrier: carrier,
406
+ )
407
+ account = ShopAccount.create!(customer_carrier: customer_carrier)
408
+
409
+ CustomerCarrier.current_customer = customer
410
+
411
+ account_carrier = account.carrier
412
+ assert_equal carrier, account_carrier
413
+
414
+ CustomerCarrier.current_customer = nil
415
+
416
+ other_carrier = Carrier.create!
417
+ other_customer = Customer.create!
418
+ other_customer_carrier = CustomerCarrier.create!(
419
+ customer: other_customer,
420
+ carrier: other_carrier,
421
+ )
422
+ other_account = ShopAccount.create!(customer_carrier: other_customer_carrier)
423
+
424
+ account_carrier = other_account.carrier
425
+ assert_equal other_carrier, account_carrier
426
+ ensure
427
+ CustomerCarrier.current_customer = nil
428
+ end
429
+ end
@@ -0,0 +1,215 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/comment"
6
+ require "models/author"
7
+ require "models/essay"
8
+ require "models/category"
9
+ require "models/categorization"
10
+ require "models/person"
11
+ require "models/tagging"
12
+ require "models/tag"
13
+
14
+ class InnerJoinAssociationTest < ActiveRecord::TestCase
15
+ fixtures :authors, :author_addresses, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
16
+ :taggings, :tags, :people
17
+
18
+ def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
19
+ result = Author.joins(:thinking_posts, :welcome_posts).to_a
20
+ assert_equal authors(:david), result.first
21
+ end
22
+
23
+ def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
24
+ assert_nothing_raised do
25
+ sql = Person.joins(agents: { agents: :agents }).joins(agents: { agents: { primary_contact: :agents } }).to_sql
26
+ assert_match(/agents_people_4/i, sql)
27
+ end
28
+ end
29
+
30
+ def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations_with_left_outer_joins
31
+ sql = Person.joins(agents: :agents).left_outer_joins(agents: :agents).to_sql
32
+ assert_match(/agents_people_2/i, sql)
33
+ assert_match(/INNER JOIN/i, sql)
34
+ assert_no_match(/agents_people_4/i, sql)
35
+ assert_no_match(/LEFT OUTER JOIN/i, sql)
36
+ end
37
+
38
+ def test_construct_finder_sql_does_not_table_name_collide_with_string_joins
39
+ string_join = <<~SQL
40
+ JOIN people agents_people ON agents_people.primary_contact_id = agents_people_2.id AND agents_people.id > agents_people_2.id
41
+ SQL
42
+
43
+ expected = people(:susan)
44
+ assert_sql(/agents_people_2/i) do
45
+ assert_equal [expected], Person.joins(:agents).joins(string_join)
46
+ end
47
+ end
48
+
49
+ def test_construct_finder_sql_does_not_table_name_collide_with_aliased_joins
50
+ agents = Person.arel_table.alias("agents_people")
51
+ agents_2 = Person.arel_table.alias("agents_people_2")
52
+ constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
53
+
54
+ expected = people(:susan)
55
+ assert_sql(/agents_people_2/i) do
56
+ assert_equal [expected], Person.joins(:agents).joins(agents.create_join(agents, agents.create_on(constraint)))
57
+ end
58
+ end
59
+
60
+ def test_user_supplied_joins_order_should_be_preserved
61
+ string_join = <<~SQL
62
+ JOIN people agents_people_2 ON agents_people_2.primary_contact_id = people.id
63
+ SQL
64
+ agents = Person.arel_table.alias("agents_people")
65
+ agents_2 = Person.arel_table.alias("agents_people_2")
66
+ constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
67
+
68
+ expected = people(:susan)
69
+ assert_equal [expected], Person.joins(string_join).joins(agents.create_join(agents, agents.create_on(constraint)))
70
+ end
71
+
72
+ def test_deduplicate_joins
73
+ posts = Post.arel_table
74
+ constraint = posts[:author_id].eq(Author.arel_table[:id])
75
+
76
+ authors = Author.joins(posts.create_join(posts, posts.create_on(constraint)))
77
+ authors = authors.joins(:author_address).merge(authors.where("posts.type": "SpecialPost"))
78
+
79
+ assert_equal [authors(:david)], authors
80
+ end
81
+
82
+ def test_eager_load_with_string_joins
83
+ string_join = <<~SQL
84
+ LEFT JOIN people agents_people ON agents_people.primary_contact_id = agents_people_2.id AND agents_people.id > agents_people_2.id
85
+ SQL
86
+
87
+ assert_equal 3, Person.eager_load(:agents).joins(string_join).count
88
+ end
89
+
90
+ def test_eager_load_with_arel_joins
91
+ agents = Person.arel_table.alias("agents_people")
92
+ agents_2 = Person.arel_table.alias("agents_people_2")
93
+ constraint = agents[:primary_contact_id].eq(agents_2[:id]).and(agents[:id].gt(agents_2[:id]))
94
+ arel_join = agents.create_join(agents, agents.create_on(constraint), Arel::Nodes::OuterJoin)
95
+
96
+ assert_equal 3, Person.eager_load(:agents).joins(arel_join).count
97
+ end
98
+
99
+ def test_construct_finder_sql_ignores_empty_joins_hash
100
+ sql = Author.joins({}).to_sql
101
+ assert_no_match(/JOIN/i, sql)
102
+ end
103
+
104
+ def test_construct_finder_sql_ignores_empty_joins_array
105
+ sql = Author.joins([]).to_sql
106
+ assert_no_match(/JOIN/i, sql)
107
+ end
108
+
109
+ def test_join_conditions_added_to_join_clause
110
+ sql = Author.joins(:essays).to_sql
111
+ assert_match(/writer_type.*?=.*?Author/i, sql)
112
+ assert_no_match(/WHERE/i, sql)
113
+ end
114
+
115
+ def test_join_association_conditions_support_string_and_arel_expressions
116
+ assert_equal 0, Author.joins(:welcome_posts_with_one_comment).count
117
+ assert_equal 1, Author.joins(:welcome_posts_with_comments).count
118
+ end
119
+
120
+ def test_join_conditions_allow_nil_associations
121
+ authors = Author.includes(:essays).where(essays: { id: nil })
122
+ assert_equal 1, authors.count
123
+ end
124
+
125
+ def test_join_with_reserved_word
126
+ assert_equal [categories_posts(:technology_welcome)],
127
+ Post::CategoryPost.joins(:group).where("group.id": categories(:technology))
128
+ end
129
+
130
+ def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
131
+ authors = Author.joins(:posts)
132
+ assert_not authors.empty?, "expected authors to be non-empty"
133
+ assert authors.none?(&:readonly?), "expected no authors to be readonly"
134
+ end
135
+
136
+ def test_find_with_implicit_inner_joins_honors_readonly_with_select
137
+ authors = Author.joins(:posts).select("authors.*").to_a
138
+ assert_not authors.empty?, "expected authors to be non-empty"
139
+ assert authors.all? { |a| !a.readonly? }, "expected no authors to be readonly"
140
+ end
141
+
142
+ def test_find_with_implicit_inner_joins_honors_readonly_false
143
+ authors = Author.joins(:posts).readonly(false).to_a
144
+ assert_not authors.empty?, "expected authors to be non-empty"
145
+ assert authors.all? { |a| !a.readonly? }, "expected no authors to be readonly"
146
+ end
147
+
148
+ def test_find_with_implicit_inner_joins_does_not_set_associations
149
+ authors = Author.joins(:posts).select("authors.*").to_a
150
+ assert_not authors.empty?, "expected authors to be non-empty"
151
+ assert authors.all? { |a| !a.instance_variable_defined?(:@posts) }, "expected no authors to have the @posts association loaded"
152
+ end
153
+
154
+ def test_count_honors_implicit_inner_joins
155
+ real_count = Author.all.to_a.sum { |a| a.posts.count }
156
+ assert_equal real_count, Author.joins(:posts).count, "plain inner join count should match the number of referenced posts records"
157
+ end
158
+
159
+ def test_calculate_honors_implicit_inner_joins
160
+ real_count = Author.all.to_a.sum { |a| a.posts.count }
161
+ assert_equal real_count, Author.joins(:posts).calculate(:count, "authors.id"), "plain inner join count should match the number of referenced posts records"
162
+ end
163
+
164
+ def test_calculate_honors_implicit_inner_joins_and_distinct_and_conditions
165
+ real_count = Author.all.to_a.select { |a| a.posts.any? { |p| p.title.start_with?("Welcome") } }.length
166
+ authors_with_welcoming_post_titles = Author.all.merge!(joins: :posts, where: "posts.title like 'Welcome%'").distinct.calculate(:count, "authors.id")
167
+ assert_equal real_count, authors_with_welcoming_post_titles, "inner join and conditions should have only returned authors posting titles starting with 'Welcome'"
168
+ end
169
+
170
+ def test_find_with_sti_join
171
+ scope = Post.joins(:special_comments).where(id: posts(:sti_comments).id)
172
+
173
+ # The join should match SpecialComment and its subclasses only
174
+ assert_empty scope.where("comments.type" => "Comment")
175
+ assert_not_empty scope.where("comments.type" => "SpecialComment")
176
+ assert_not_empty scope.where("comments.type" => "SubSpecialComment")
177
+ end
178
+
179
+ def test_find_with_conditions_on_reflection
180
+ assert_not_empty posts(:welcome).comments
181
+ assert Post.joins(:nonexistent_comments).where(id: posts(:welcome).id).empty? # [sic!]
182
+ end
183
+
184
+ def test_find_with_conditions_on_through_reflection
185
+ assert_not_empty posts(:welcome).tags
186
+ assert_empty Post.joins(:misc_tags).where(id: posts(:welcome).id)
187
+ end
188
+
189
+ test "the default scope of the target is applied when joining associations" do
190
+ author = Author.create! name: "Jon"
191
+ author.categorizations.create!
192
+ author.categorizations.create! special: true
193
+
194
+ assert_equal [author], Author.where(id: author).joins(:special_categorizations)
195
+ end
196
+
197
+ test "the default scope of the target is correctly aliased when joining associations" do
198
+ author = Author.create! name: "Jon"
199
+ author.categories.create! name: "Not Special"
200
+ author.special_categories.create! name: "Special"
201
+
202
+ categories = author.categories.includes(:special_categorizations).references(:special_categorizations).to_a
203
+ assert_equal 2, categories.size
204
+ end
205
+
206
+ test "the correct records are loaded when including an aliased association" do
207
+ author = Author.create! name: "Jon"
208
+ author.categories.create! name: "Not Special"
209
+ author.special_categories.create! name: "Special"
210
+
211
+ categories = author.categories.eager_load(:special_categorizations).order(:name).to_a
212
+ assert_equal 0, categories.first.special_categorizations.size
213
+ assert_equal 1, categories.second.special_categorizations.size
214
+ end
215
+ end