ibm_db 5.2.0-x86-mingw32 → 5.3.2-x86-mingw32

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 (621) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +15 -13
  5. data/ext/ibm_db.c +62 -57
  6. data/ext/ibm_db.o +0 -0
  7. data/ext/ibm_db.so +0 -0
  8. data/ext/mkmf.log +26 -24
  9. data/ext/ruby_ibm_db_cli.c +1 -0
  10. data/ext/ruby_ibm_db_cli.o +0 -0
  11. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  12. data/lib/ibm_db.so +1 -0
  13. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  14. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  15. data/test/activejob/destroy_association_async_test.rb +305 -0
  16. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  17. data/test/activejob/helper.rb +15 -0
  18. data/test/assets/schema_dump_5_1.yml +345 -0
  19. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  20. data/test/cases/adapter_test.rb +432 -218
  21. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  22. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  24. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  27. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  28. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  30. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  31. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  32. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  33. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  34. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  35. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  36. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  38. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  39. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  40. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  42. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  43. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  44. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  45. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  46. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  47. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  48. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  49. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  50. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  51. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  52. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  53. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  54. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  55. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  56. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  57. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  58. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  59. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  60. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  61. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  62. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  63. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  64. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  65. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  66. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  67. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  68. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  69. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  70. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  71. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  72. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  73. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  74. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  75. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  76. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  77. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  78. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  79. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  80. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  81. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  82. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  83. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  84. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  85. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  86. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  87. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  88. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  89. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  90. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  91. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  92. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  93. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  94. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  95. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  96. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  97. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  98. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  99. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  100. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  101. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  102. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  103. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  104. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  105. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  106. data/test/cases/aggregations_test.rb +14 -12
  107. data/test/cases/annotate_test.rb +46 -0
  108. data/test/cases/ar_schema_test.rb +153 -86
  109. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  110. data/test/cases/arel/attributes/math_test.rb +83 -0
  111. data/test/cases/arel/attributes_test.rb +27 -0
  112. data/test/cases/arel/collectors/bind_test.rb +40 -0
  113. data/test/cases/arel/collectors/composite_test.rb +47 -0
  114. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  115. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  116. data/test/cases/arel/crud_test.rb +65 -0
  117. data/test/cases/arel/delete_manager_test.rb +53 -0
  118. data/test/cases/arel/factory_methods_test.rb +46 -0
  119. data/test/cases/arel/helper.rb +45 -0
  120. data/test/cases/arel/insert_manager_test.rb +241 -0
  121. data/test/cases/arel/nodes/and_test.rb +30 -0
  122. data/test/cases/arel/nodes/as_test.rb +36 -0
  123. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  124. data/test/cases/arel/nodes/bin_test.rb +35 -0
  125. data/test/cases/arel/nodes/binary_test.rb +29 -0
  126. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  127. data/test/cases/arel/nodes/case_test.rb +96 -0
  128. data/test/cases/arel/nodes/casted_test.rb +18 -0
  129. data/test/cases/arel/nodes/comment_test.rb +22 -0
  130. data/test/cases/arel/nodes/count_test.rb +35 -0
  131. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  132. data/test/cases/arel/nodes/descending_test.rb +46 -0
  133. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  134. data/test/cases/arel/nodes/equality_test.rb +62 -0
  135. data/test/cases/arel/nodes/extract_test.rb +43 -0
  136. data/test/cases/arel/nodes/false_test.rb +21 -0
  137. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  138. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  139. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  140. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  141. data/test/cases/arel/nodes/node_test.rb +22 -0
  142. data/test/cases/arel/nodes/not_test.rb +31 -0
  143. data/test/cases/arel/nodes/or_test.rb +36 -0
  144. data/test/cases/arel/nodes/over_test.rb +69 -0
  145. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  146. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  147. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  148. data/test/cases/arel/nodes/sum_test.rb +35 -0
  149. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  150. data/test/cases/arel/nodes/true_test.rb +21 -0
  151. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  152. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  153. data/test/cases/arel/nodes/window_test.rb +81 -0
  154. data/test/cases/arel/nodes_test.rb +34 -0
  155. data/test/cases/arel/select_manager_test.rb +1238 -0
  156. data/test/cases/arel/support/fake_record.rb +135 -0
  157. data/test/cases/arel/table_test.rb +216 -0
  158. data/test/cases/arel/update_manager_test.rb +126 -0
  159. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  160. data/test/cases/arel/visitors/dot_test.rb +90 -0
  161. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  162. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  163. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  164. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  165. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  166. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  167. data/test/cases/associations/callbacks_test.rb +56 -38
  168. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  169. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  170. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  171. data/test/cases/associations/eager_singularization_test.rb +21 -21
  172. data/test/cases/associations/eager_test.rb +559 -415
  173. data/test/cases/associations/extension_test.rb +18 -12
  174. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  175. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  176. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  177. data/test/cases/associations/has_one_associations_test.rb +294 -129
  178. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  179. data/test/cases/associations/inner_join_association_test.rb +114 -38
  180. data/test/cases/associations/inverse_associations_test.rb +606 -398
  181. data/test/cases/associations/join_model_test.rb +158 -148
  182. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  183. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  184. data/test/cases/associations/required_test.rb +35 -10
  185. data/test/cases/associations_test.rb +241 -110
  186. data/test/cases/attribute_methods/read_test.rb +11 -11
  187. data/test/cases/attribute_methods_test.rb +413 -298
  188. data/test/cases/attributes_test.rb +145 -27
  189. data/test/cases/autosave_association_test.rb +681 -436
  190. data/test/cases/base_prevent_writes_test.rb +229 -0
  191. data/test/cases/base_test.rb +599 -542
  192. data/test/cases/batches_test.rb +288 -82
  193. data/test/cases/binary_test.rb +26 -31
  194. data/test/cases/bind_parameter_test.rb +194 -21
  195. data/test/cases/boolean_test.rb +52 -0
  196. data/test/cases/cache_key_test.rb +110 -5
  197. data/test/cases/calculations_test.rb +740 -177
  198. data/test/cases/callbacks_test.rb +74 -207
  199. data/test/cases/clone_test.rb +15 -10
  200. data/test/cases/coders/json_test.rb +2 -0
  201. data/test/cases/coders/yaml_column_test.rb +16 -13
  202. data/test/cases/collection_cache_key_test.rb +177 -20
  203. data/test/cases/column_alias_test.rb +9 -7
  204. data/test/cases/column_definition_test.rb +10 -68
  205. data/test/cases/comment_test.rb +166 -107
  206. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  207. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  208. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  209. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  210. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  211. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  212. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  213. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  214. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  215. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  216. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  217. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  218. data/test/cases/connection_management_test.rb +13 -11
  219. data/test/cases/connection_pool_test.rb +316 -83
  220. data/test/cases/core_test.rb +82 -58
  221. data/test/cases/counter_cache_test.rb +204 -50
  222. data/test/cases/custom_locking_test.rb +5 -3
  223. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  224. data/test/cases/database_configurations/resolver_test.rb +150 -0
  225. data/test/cases/database_configurations_test.rb +145 -0
  226. data/test/cases/database_selector_test.rb +296 -0
  227. data/test/cases/database_statements_test.rb +18 -16
  228. data/test/cases/date_test.rb +8 -16
  229. data/test/cases/date_time_precision_test.rb +100 -78
  230. data/test/cases/date_time_test.rb +23 -8
  231. data/test/cases/defaults_test.rb +106 -71
  232. data/test/cases/delegated_type_test.rb +57 -0
  233. data/test/cases/dirty_test.rb +419 -223
  234. data/test/cases/disconnected_test.rb +6 -6
  235. data/test/cases/dup_test.rb +54 -27
  236. data/test/cases/enum_test.rb +461 -82
  237. data/test/cases/errors_test.rb +7 -7
  238. data/test/cases/explain_subscriber_test.rb +17 -15
  239. data/test/cases/explain_test.rb +11 -19
  240. data/test/cases/filter_attributes_test.rb +153 -0
  241. data/test/cases/finder_respond_to_test.rb +14 -14
  242. data/test/cases/finder_test.rb +669 -287
  243. data/test/cases/fixture_set/file_test.rb +34 -38
  244. data/test/cases/fixtures_test.rb +833 -176
  245. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  246. data/test/cases/habtm_destroy_order_test.rb +25 -25
  247. data/test/cases/helper.rb +78 -49
  248. data/test/cases/hot_compatibility_test.rb +33 -32
  249. data/test/cases/i18n_test.rb +18 -17
  250. data/test/cases/inheritance_test.rb +180 -115
  251. data/test/cases/insert_all_test.rb +489 -0
  252. data/test/cases/instrumentation_test.rb +101 -0
  253. data/test/cases/integration_test.rb +119 -31
  254. data/test/cases/invalid_connection_test.rb +18 -16
  255. data/test/cases/invertible_migration_test.rb +183 -43
  256. data/test/cases/json_attribute_test.rb +35 -0
  257. data/test/cases/json_serialization_test.rb +57 -58
  258. data/test/cases/json_shared_test_cases.rb +290 -0
  259. data/test/cases/locking_test.rb +413 -119
  260. data/test/cases/log_subscriber_test.rb +68 -26
  261. data/test/cases/marshal_serialization_test.rb +39 -0
  262. data/test/cases/migration/change_schema_test.rb +118 -72
  263. data/test/cases/migration/change_table_test.rb +138 -30
  264. data/test/cases/migration/check_constraint_test.rb +162 -0
  265. data/test/cases/migration/column_attributes_test.rb +45 -35
  266. data/test/cases/migration/column_positioning_test.rb +18 -6
  267. data/test/cases/migration/columns_test.rb +93 -77
  268. data/test/cases/migration/command_recorder_test.rb +121 -34
  269. data/test/cases/migration/compatibility_test.rb +578 -23
  270. data/test/cases/migration/create_join_table_test.rb +35 -25
  271. data/test/cases/migration/foreign_key_test.rb +503 -284
  272. data/test/cases/migration/helper.rb +4 -3
  273. data/test/cases/migration/index_test.rb +119 -70
  274. data/test/cases/migration/logger_test.rb +9 -6
  275. data/test/cases/migration/pending_migrations_test.rb +88 -34
  276. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  277. data/test/cases/migration/references_index_test.rb +38 -19
  278. data/test/cases/migration/references_statements_test.rb +15 -14
  279. data/test/cases/migration/rename_table_test.rb +53 -30
  280. data/test/cases/migration_test.rb +637 -269
  281. data/test/cases/migrator_test.rb +191 -135
  282. data/test/cases/mixin_test.rb +7 -11
  283. data/test/cases/modules_test.rb +36 -34
  284. data/test/cases/multi_db_migrator_test.rb +223 -0
  285. data/test/cases/multiparameter_attributes_test.rb +60 -33
  286. data/test/cases/multiple_db_test.rb +16 -22
  287. data/test/cases/nested_attributes_test.rb +341 -320
  288. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  289. data/test/cases/null_relation_test.rb +84 -0
  290. data/test/cases/numeric_data_test.rb +93 -0
  291. data/test/cases/persistence_test.rb +361 -269
  292. data/test/cases/pooled_connections_test.rb +18 -26
  293. data/test/cases/prepared_statement_status_test.rb +48 -0
  294. data/test/cases/primary_keys_test.rb +210 -104
  295. data/test/cases/query_cache_test.rb +610 -141
  296. data/test/cases/quoting_test.rb +132 -31
  297. data/test/cases/readonly_test.rb +49 -48
  298. data/test/cases/reaper_test.rb +146 -32
  299. data/test/cases/reflection_test.rb +167 -156
  300. data/test/cases/relation/delegation_test.rb +49 -36
  301. data/test/cases/relation/delete_all_test.rb +117 -0
  302. data/test/cases/relation/merging_test.rb +319 -42
  303. data/test/cases/relation/mutation_test.rb +55 -93
  304. data/test/cases/relation/or_test.rb +129 -29
  305. data/test/cases/relation/predicate_builder_test.rb +21 -6
  306. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  307. data/test/cases/relation/select_test.rb +67 -0
  308. data/test/cases/relation/update_all_test.rb +317 -0
  309. data/test/cases/relation/where_chain_test.rb +68 -32
  310. data/test/cases/relation/where_clause_test.rb +136 -61
  311. data/test/cases/relation/where_test.rb +155 -48
  312. data/test/cases/relation_test.rb +266 -112
  313. data/test/cases/relations_test.rb +969 -744
  314. data/test/cases/reload_models_test.rb +13 -9
  315. data/test/cases/reserved_word_test.rb +141 -0
  316. data/test/cases/result_test.rb +68 -17
  317. data/test/cases/sanitize_test.rb +87 -71
  318. data/test/cases/schema_dumper_test.rb +221 -128
  319. data/test/cases/schema_loading_test.rb +3 -2
  320. data/test/cases/scoping/default_scoping_test.rb +185 -144
  321. data/test/cases/scoping/named_scoping_test.rb +177 -89
  322. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  323. data/test/cases/secure_token_test.rb +18 -3
  324. data/test/cases/serialization_test.rb +30 -28
  325. data/test/cases/serialized_attribute_test.rb +133 -42
  326. data/test/cases/signed_id_test.rb +168 -0
  327. data/test/cases/statement_cache_test.rb +41 -24
  328. data/test/cases/statement_invalid_test.rb +42 -0
  329. data/test/cases/store_test.rb +180 -55
  330. data/test/cases/strict_loading_test.rb +473 -0
  331. data/test/cases/suppressor_test.rb +26 -12
  332. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  333. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  334. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  335. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  336. data/test/cases/test_case.rb +51 -40
  337. data/test/cases/test_databases_test.rb +79 -0
  338. data/test/cases/test_fixtures_test.rb +79 -19
  339. data/test/cases/time_precision_test.rb +98 -76
  340. data/test/cases/timestamp_test.rb +102 -99
  341. data/test/cases/touch_later_test.rb +12 -10
  342. data/test/cases/transaction_callbacks_test.rb +344 -90
  343. data/test/cases/transaction_isolation_test.rb +12 -12
  344. data/test/cases/transactions_test.rb +612 -162
  345. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  346. data/test/cases/type/date_time_test.rb +4 -2
  347. data/test/cases/type/integer_test.rb +4 -2
  348. data/test/cases/type/string_test.rb +10 -8
  349. data/test/cases/type/time_test.rb +28 -0
  350. data/test/cases/type/type_map_test.rb +29 -28
  351. data/test/cases/type/unsigned_integer_test.rb +19 -0
  352. data/test/cases/type_test.rb +2 -0
  353. data/test/cases/types_test.rb +3 -1
  354. data/test/cases/unconnected_test.rb +14 -1
  355. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  356. data/test/cases/validations/absence_validation_test.rb +19 -17
  357. data/test/cases/validations/association_validation_test.rb +30 -28
  358. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  359. data/test/cases/validations/i18n_validation_test.rb +22 -21
  360. data/test/cases/validations/length_validation_test.rb +34 -33
  361. data/test/cases/validations/numericality_validation_test.rb +181 -0
  362. data/test/cases/validations/presence_validation_test.rb +21 -19
  363. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  364. data/test/cases/validations_repair_helper.rb +2 -0
  365. data/test/cases/validations_test.rb +61 -26
  366. data/test/cases/view_test.rb +122 -116
  367. data/test/cases/yaml_serialization_test.rb +79 -34
  368. data/test/config.example.yml +19 -19
  369. data/test/config.rb +3 -1
  370. data/test/config.yml +16 -6
  371. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  372. data/test/fixtures/author_addresses.yml +1 -8
  373. data/test/fixtures/authors.yml +1 -7
  374. data/test/fixtures/binaries.yml +4 -0
  375. data/test/fixtures/books.yml +9 -2
  376. data/test/fixtures/categories_posts.yml +3 -0
  377. data/test/fixtures/citations.yml +5 -0
  378. data/test/fixtures/comments.yml +7 -0
  379. data/test/fixtures/companies.yml +5 -0
  380. data/test/fixtures/computers.yml +2 -0
  381. data/test/fixtures/customers.yml +10 -1
  382. data/test/fixtures/developers.yml +1 -1
  383. data/test/fixtures/essays.yml +10 -0
  384. data/test/fixtures/faces.yml +3 -3
  385. data/test/fixtures/humans.yml +5 -0
  386. data/test/fixtures/interests.yml +7 -7
  387. data/test/fixtures/memberships.yml +7 -0
  388. data/test/fixtures/minimalistics.yml +3 -0
  389. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  390. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  391. data/test/fixtures/naked/yml/parrots.yml +1 -0
  392. data/test/fixtures/other_books.yml +26 -0
  393. data/test/fixtures/other_posts.yml +1 -0
  394. data/test/fixtures/parrots.yml +7 -1
  395. data/test/fixtures/pirates.yml +3 -0
  396. data/test/fixtures/posts.yml +11 -3
  397. data/test/fixtures/readers.yml +6 -0
  398. data/test/fixtures/reserved_words/values.yml +2 -2
  399. data/test/fixtures/sponsors.yml +3 -0
  400. data/test/fixtures/strict_zines.yml +2 -0
  401. data/test/fixtures/subscribers.yml +1 -1
  402. data/test/fixtures/tasks.yml +1 -1
  403. data/test/fixtures/warehouse-things.yml +3 -0
  404. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  405. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  406. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  407. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  408. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  409. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  410. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  411. data/test/migrations/rename/1_we_need_things.rb +2 -0
  412. data/test/migrations/rename/2_rename_things.rb +2 -0
  413. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  414. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  415. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  416. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  417. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  419. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  420. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  421. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  422. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  423. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  424. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  425. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  431. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  432. data/test/models/account.rb +46 -0
  433. data/test/models/admin/account.rb +3 -1
  434. data/test/models/admin/randomly_named_c1.rb +2 -0
  435. data/test/models/admin/user.rb +16 -8
  436. data/test/models/admin.rb +4 -2
  437. data/test/models/aircraft.rb +3 -1
  438. data/test/models/arunit2_model.rb +2 -0
  439. data/test/models/author.rb +153 -102
  440. data/test/models/auto_id.rb +2 -0
  441. data/test/models/autoloadable/extra_firm.rb +2 -0
  442. data/test/models/binary.rb +3 -1
  443. data/test/models/binary_field.rb +6 -0
  444. data/test/models/bird.rb +13 -1
  445. data/test/models/book.rb +14 -4
  446. data/test/models/book_destroy_async.rb +24 -0
  447. data/test/models/boolean.rb +5 -0
  448. data/test/models/bulb.rb +13 -4
  449. data/test/models/cake_designer.rb +2 -0
  450. data/test/models/car.rb +17 -10
  451. data/test/models/carrier.rb +2 -0
  452. data/test/models/cart.rb +5 -0
  453. data/test/models/cat.rb +2 -0
  454. data/test/models/categorization.rb +8 -6
  455. data/test/models/category.rb +28 -16
  456. data/test/models/chef.rb +2 -0
  457. data/test/models/citation.rb +5 -1
  458. data/test/models/club.rb +13 -10
  459. data/test/models/college.rb +4 -2
  460. data/test/models/column.rb +2 -0
  461. data/test/models/column_name.rb +2 -0
  462. data/test/models/comment.rb +32 -10
  463. data/test/models/company.rb +102 -106
  464. data/test/models/company_in_module.rb +27 -26
  465. data/test/models/computer.rb +3 -1
  466. data/test/models/contact.rb +15 -13
  467. data/test/models/content.rb +5 -3
  468. data/test/models/contract.rb +21 -3
  469. data/test/models/country.rb +2 -4
  470. data/test/models/course.rb +3 -1
  471. data/test/models/customer.rb +10 -8
  472. data/test/models/customer_carrier.rb +2 -0
  473. data/test/models/dashboard.rb +2 -0
  474. data/test/models/default.rb +2 -0
  475. data/test/models/department.rb +2 -0
  476. data/test/models/destroy_async_parent.rb +15 -0
  477. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  478. data/test/models/developer.rb +152 -85
  479. data/test/models/dl_keyed_belongs_to.rb +13 -0
  480. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  481. data/test/models/dl_keyed_has_many.rb +5 -0
  482. data/test/models/dl_keyed_has_many_through.rb +5 -0
  483. data/test/models/dl_keyed_has_one.rb +5 -0
  484. data/test/models/dl_keyed_join.rb +10 -0
  485. data/test/models/dog.rb +2 -0
  486. data/test/models/dog_lover.rb +2 -0
  487. data/test/models/doubloon.rb +3 -1
  488. data/test/models/drink_designer.rb +17 -0
  489. data/test/models/edge.rb +4 -2
  490. data/test/models/electron.rb +2 -0
  491. data/test/models/engine.rb +3 -2
  492. data/test/models/entrant.rb +2 -0
  493. data/test/models/entry.rb +5 -0
  494. data/test/models/essay.rb +6 -3
  495. data/test/models/essay_destroy_async.rb +12 -0
  496. data/test/models/event.rb +3 -1
  497. data/test/models/eye.rb +5 -3
  498. data/test/models/face.rb +14 -6
  499. data/test/models/family.rb +6 -0
  500. data/test/models/family_tree.rb +6 -0
  501. data/test/models/friendship.rb +5 -3
  502. data/test/models/frog.rb +8 -0
  503. data/test/models/guid.rb +3 -1
  504. data/test/models/guitar.rb +2 -0
  505. data/test/models/hotel.rb +5 -3
  506. data/test/models/human.rb +39 -0
  507. data/test/models/image.rb +3 -1
  508. data/test/models/interest.rb +14 -3
  509. data/test/models/invoice.rb +4 -2
  510. data/test/models/item.rb +3 -1
  511. data/test/models/job.rb +5 -3
  512. data/test/models/joke.rb +4 -2
  513. data/test/models/keyboard.rb +3 -1
  514. data/test/models/legacy_thing.rb +2 -0
  515. data/test/models/lesson.rb +2 -0
  516. data/test/models/line_item.rb +3 -1
  517. data/test/models/liquid.rb +2 -0
  518. data/test/models/matey.rb +3 -1
  519. data/test/models/measurement.rb +4 -0
  520. data/test/models/member.rb +23 -20
  521. data/test/models/member_detail.rb +3 -0
  522. data/test/models/member_type.rb +2 -0
  523. data/test/models/membership.rb +4 -1
  524. data/test/models/mentor.rb +3 -1
  525. data/test/models/message.rb +5 -0
  526. data/test/models/minimalistic.rb +2 -0
  527. data/test/models/minivan.rb +3 -2
  528. data/test/models/mixed_case_monkey.rb +3 -1
  529. data/test/models/molecule.rb +2 -0
  530. data/test/models/mouse.rb +6 -0
  531. data/test/models/movie.rb +2 -0
  532. data/test/models/node.rb +4 -2
  533. data/test/models/non_primary_key.rb +2 -0
  534. data/test/models/notification.rb +2 -0
  535. data/test/models/numeric_data.rb +12 -0
  536. data/test/models/order.rb +4 -2
  537. data/test/models/organization.rb +9 -7
  538. data/test/models/other_dog.rb +3 -1
  539. data/test/models/owner.rb +6 -4
  540. data/test/models/parrot.rb +12 -4
  541. data/test/models/person.rb +59 -54
  542. data/test/models/personal_legacy_thing.rb +3 -1
  543. data/test/models/pet.rb +4 -2
  544. data/test/models/pet_treasure.rb +2 -0
  545. data/test/models/pirate.rb +67 -43
  546. data/test/models/possession.rb +3 -1
  547. data/test/models/post.rb +184 -86
  548. data/test/models/price_estimate.rb +11 -1
  549. data/test/models/professor.rb +3 -1
  550. data/test/models/project.rb +14 -12
  551. data/test/models/publisher/article.rb +2 -0
  552. data/test/models/publisher/magazine.rb +2 -0
  553. data/test/models/publisher.rb +2 -0
  554. data/test/models/randomly_named_c1.rb +2 -0
  555. data/test/models/rating.rb +5 -1
  556. data/test/models/reader.rb +7 -5
  557. data/test/models/recipe.rb +2 -0
  558. data/test/models/record.rb +2 -0
  559. data/test/models/reference.rb +6 -3
  560. data/test/models/reply.rb +39 -21
  561. data/test/models/room.rb +6 -0
  562. data/test/models/section.rb +6 -0
  563. data/test/models/seminar.rb +6 -0
  564. data/test/models/session.rb +6 -0
  565. data/test/models/ship.rb +12 -9
  566. data/test/models/ship_part.rb +5 -3
  567. data/test/models/shop.rb +4 -2
  568. data/test/models/shop_account.rb +2 -0
  569. data/test/models/speedometer.rb +2 -0
  570. data/test/models/sponsor.rb +8 -5
  571. data/test/models/squeak.rb +6 -0
  572. data/test/models/strict_zine.rb +7 -0
  573. data/test/models/string_key_object.rb +2 -0
  574. data/test/models/student.rb +2 -0
  575. data/test/models/subscriber.rb +4 -2
  576. data/test/models/subscription.rb +5 -1
  577. data/test/models/tag.rb +6 -3
  578. data/test/models/tagging.rb +13 -6
  579. data/test/models/task.rb +2 -0
  580. data/test/models/topic.rb +54 -19
  581. data/test/models/toy.rb +4 -0
  582. data/test/models/traffic_light.rb +2 -0
  583. data/test/models/treasure.rb +5 -3
  584. data/test/models/treaty.rb +2 -4
  585. data/test/models/tree.rb +2 -0
  586. data/test/models/tuning_peg.rb +2 -0
  587. data/test/models/tyre.rb +2 -0
  588. data/test/models/user.rb +12 -4
  589. data/test/models/uuid_child.rb +2 -0
  590. data/test/models/uuid_item.rb +2 -0
  591. data/test/models/uuid_parent.rb +2 -0
  592. data/test/models/vegetables.rb +12 -3
  593. data/test/models/vertex.rb +6 -4
  594. data/test/models/warehouse_thing.rb +2 -0
  595. data/test/models/wheel.rb +3 -1
  596. data/test/models/without_table.rb +3 -1
  597. data/test/models/zine.rb +3 -1
  598. data/test/schema/mysql2_specific_schema.rb +49 -35
  599. data/test/schema/oracle_specific_schema.rb +13 -15
  600. data/test/schema/postgresql_specific_schema.rb +51 -40
  601. data/test/schema/schema.rb +334 -154
  602. data/test/schema/sqlite_specific_schema.rb +9 -16
  603. data/test/support/config.rb +26 -26
  604. data/test/support/connection.rb +14 -8
  605. data/test/support/connection_helper.rb +3 -1
  606. data/test/support/ddl_helper.rb +2 -0
  607. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  608. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  609. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  610. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  617. data/test/support/schema_dumping_helper.rb +2 -0
  618. data/test/support/stubs/strong_parameters.rb +40 -0
  619. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  620. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  621. metadata +190 -14
@@ -1,30 +1,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/author'
3
- require 'models/post'
4
- require 'models/person'
5
- require 'models/reference'
6
- require 'models/job'
7
- require 'models/reader'
8
- require 'models/comment'
9
- require 'models/tag'
10
- require 'models/tagging'
11
- require 'models/subscriber'
12
- require 'models/book'
13
- require 'models/subscription'
14
- require 'models/rating'
15
- require 'models/member'
16
- require 'models/member_detail'
17
- require 'models/member_type'
18
- require 'models/sponsor'
19
- require 'models/club'
20
- require 'models/organization'
21
- require 'models/category'
22
- require 'models/categorization'
23
- require 'models/membership'
24
- require 'models/essay'
4
+ require "models/author"
5
+ require "models/post"
6
+ require "models/person"
7
+ require "models/reference"
8
+ require "models/job"
9
+ require "models/reader"
10
+ require "models/comment"
11
+ require "models/tag"
12
+ require "models/tagging"
13
+ require "models/subscriber"
14
+ require "models/book"
15
+ require "models/subscription"
16
+ require "models/rating"
17
+ require "models/member"
18
+ require "models/member_detail"
19
+ require "models/member_type"
20
+ require "models/sponsor"
21
+ require "models/club"
22
+ require "models/organization"
23
+ require "models/category"
24
+ require "models/categorization"
25
+ require "models/membership"
26
+ require "models/essay"
27
+ require "models/hotel"
28
+ require "models/department"
29
+ require "models/chef"
30
+ require "models/cake_designer"
31
+ require "models/drink_designer"
25
32
 
26
33
  class NestedThroughAssociationsTest < ActiveRecord::TestCase
27
- fixtures :authors, :books, :posts, :subscriptions, :subscribers, :tags, :taggings,
34
+ fixtures :authors, :author_addresses, :books, :posts, :subscriptions, :subscribers, :tags, :taggings,
28
35
  :people, :readers, :references, :jobs, :ratings, :comments, :members, :member_details,
29
36
  :member_types, :sponsors, :clubs, :organizations, :categories, :categories_posts,
30
37
  :categorizations, :memberships, :essays
@@ -55,23 +62,23 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
55
62
  end
56
63
 
57
64
  def test_has_many_through_has_many_with_has_many_through_source_reflection_preload
58
- authors = assert_queries(5) { Author.includes(:tags).to_a }
65
+ author = assert_queries(5) { Author.includes(:tags).first }
59
66
  general = tags(:general)
60
67
 
61
68
  assert_no_queries do
62
- assert_equal [general, general], authors.first.tags
69
+ assert_equal [general, general], author.tags
63
70
  end
64
71
  end
65
72
 
66
73
  def test_has_many_through_has_many_with_has_many_through_source_reflection_preload_via_joins
67
74
  assert_includes_and_joins_equal(
68
- Author.where('tags.id' => tags(:general).id),
75
+ Author.where("tags.id" => tags(:general).id),
69
76
  [authors(:david)], :tags
70
77
  )
71
78
 
72
79
  # This ensures that the polymorphism of taggings is being observed correctly
73
- authors = Author.joins(:tags).where('taggings.taggable_type' => 'FakeModel')
74
- assert authors.empty?
80
+ authors = Author.joins(:tags).where("taggings.taggable_type" => "FakeModel")
81
+ assert_empty authors
75
82
  end
76
83
 
77
84
  # has_many through
@@ -79,21 +86,21 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
79
86
  # Through: has_many through
80
87
  def test_has_many_through_has_many_through_with_has_many_source_reflection
81
88
  luke, david = subscribers(:first), subscribers(:second)
82
- assert_equal [luke, david, david], authors(:david).subscribers.order('subscribers.nick')
89
+ assert_equal [luke, david, david], authors(:david).subscribers.order("subscribers.nick")
83
90
  end
84
91
 
85
92
  def test_has_many_through_has_many_through_with_has_many_source_reflection_preload
86
93
  luke, david = subscribers(:first), subscribers(:second)
87
- authors = assert_queries(4) { Author.includes(:subscribers).to_a }
94
+ author = assert_queries(4) { Author.includes(:subscribers).first }
88
95
  assert_no_queries do
89
- assert_equal [luke, david, david], authors.first.subscribers.sort_by(&:nick)
96
+ assert_equal [luke, david, david], author.subscribers.sort_by(&:nick)
90
97
  end
91
98
  end
92
99
 
93
100
  def test_has_many_through_has_many_through_with_has_many_source_reflection_preload_via_joins
94
101
  # All authors with subscribers where one of the subscribers' nick is 'alterself'
95
102
  assert_includes_and_joins_equal(
96
- Author.where('subscribers.nick' => 'alterself'),
103
+ Author.where("subscribers.nick" => "alterself"),
97
104
  [authors(:david)], :subscribers
98
105
  )
99
106
  end
@@ -106,16 +113,16 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
106
113
  end
107
114
 
108
115
  def test_has_many_through_has_one_with_has_one_through_source_reflection_preload
109
- members = assert_queries(4) { Member.includes(:nested_member_types).to_a }
116
+ member = assert_queries(4) { Member.includes(:nested_member_types).first }
110
117
  founding = member_types(:founding)
111
118
  assert_no_queries do
112
- assert_equal [founding], members.first.nested_member_types
119
+ assert_equal [founding], member.nested_member_types
113
120
  end
114
121
  end
115
122
 
116
123
  def test_has_many_through_has_one_with_has_one_through_source_reflection_preload_via_joins
117
124
  assert_includes_and_joins_equal(
118
- Member.where('member_types.id' => member_types(:founding).id),
125
+ Member.where("member_types.id" => member_types(:founding).id),
119
126
  [members(:groucho)], :nested_member_types
120
127
  )
121
128
  end
@@ -128,16 +135,16 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
128
135
  end
129
136
 
130
137
  def test_has_many_through_has_one_through_with_has_one_source_reflection_preload
131
- members = assert_queries(4) { Member.includes(:nested_sponsors).to_a }
138
+ member = assert_queries(4) { Member.includes(:nested_sponsors).first }
132
139
  mustache = sponsors(:moustache_club_sponsor_for_groucho)
133
- assert_no_queries(ignore_none: false) do
134
- assert_equal [mustache], members.first.nested_sponsors
140
+ assert_no_queries do
141
+ assert_equal [mustache], member.nested_sponsors
135
142
  end
136
143
  end
137
144
 
138
145
  def test_has_many_through_has_one_through_with_has_one_source_reflection_preload_via_joins
139
146
  assert_includes_and_joins_equal(
140
- Member.where('sponsors.id' => sponsors(:moustache_club_sponsor_for_groucho).id),
147
+ Member.where("sponsors.id" => sponsors(:moustache_club_sponsor_for_groucho).id),
141
148
  [members(:groucho)], :nested_sponsors
142
149
  )
143
150
  end
@@ -149,28 +156,27 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
149
156
  groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
150
157
 
151
158
  assert_equal [groucho_details, other_details],
152
- members(:groucho).organization_member_details.order('member_details.id')
159
+ members(:groucho).organization_member_details.order("member_details.id")
153
160
  end
154
161
 
155
162
  def test_has_many_through_has_one_with_has_many_through_source_reflection_preload
156
163
  ActiveRecord::Base.connection.table_alias_length # preheat cache
157
- members = assert_queries(4) { Member.includes(:organization_member_details).to_a.sort_by(&:id) }
164
+ member = assert_queries(4) { Member.includes(:organization_member_details).first }
158
165
  groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
159
166
 
160
167
  assert_no_queries do
161
- assert_equal [groucho_details, other_details], members.first.organization_member_details.sort_by(&:id)
168
+ assert_equal [groucho_details, other_details], member.organization_member_details.sort_by(&:id)
162
169
  end
163
170
  end
164
171
 
165
172
  def test_has_many_through_has_one_with_has_many_through_source_reflection_preload_via_joins
166
173
  assert_includes_and_joins_equal(
167
- Member.where('member_details.id' => member_details(:groucho).id).order('member_details.id'),
174
+ Member.where("member_details.id" => member_details(:groucho).id).order("member_details.id"),
168
175
  [members(:groucho), members(:some_other_guy)], :organization_member_details
169
176
  )
170
177
 
171
- members = Member.joins(:organization_member_details).
172
- where('member_details.id' => 9)
173
- assert members.empty?
178
+ members = Member.joins(:organization_member_details).where("member_details.id" => 9)
179
+ assert_empty members
174
180
  end
175
181
 
176
182
  # has_many through
@@ -180,29 +186,28 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
180
186
  groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
181
187
 
182
188
  assert_equal [groucho_details, other_details],
183
- members(:groucho).organization_member_details_2.order('member_details.id')
189
+ members(:groucho).organization_member_details_2.order("member_details.id")
184
190
  end
185
191
 
186
192
  def test_has_many_through_has_one_through_with_has_many_source_reflection_preload
187
- members = assert_queries(4) { Member.includes(:organization_member_details_2).to_a.sort_by(&:id) }
193
+ member = assert_queries(4) { Member.includes(:organization_member_details_2).first }
188
194
  groucho_details, other_details = member_details(:groucho), member_details(:some_other_guy)
189
195
 
190
196
  # postgresql test if randomly executed then executes "SHOW max_identifier_length". Hence
191
197
  # the need to ignore certain predefined sqls that deal with system calls.
192
- assert_no_queries(ignore_none: false) do
193
- assert_equal [groucho_details, other_details], members.first.organization_member_details_2.sort_by(&:id)
198
+ assert_no_queries do
199
+ assert_equal [groucho_details, other_details], member.organization_member_details_2.sort_by(&:id)
194
200
  end
195
201
  end
196
202
 
197
203
  def test_has_many_through_has_one_through_with_has_many_source_reflection_preload_via_joins
198
204
  assert_includes_and_joins_equal(
199
- Member.where('member_details.id' => member_details(:groucho).id).order('member_details.id'),
205
+ Member.where("member_details.id" => member_details(:groucho).id).order("member_details.id"),
200
206
  [members(:groucho), members(:some_other_guy)], :organization_member_details_2
201
207
  )
202
208
 
203
- members = Member.joins(:organization_member_details_2).
204
- where('member_details.id' => 9)
205
- assert members.empty?
209
+ members = Member.joins(:organization_member_details_2).where("member_details.id" => 9)
210
+ assert_empty members
206
211
  end
207
212
 
208
213
  # has_many through
@@ -211,15 +216,15 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
211
216
  def test_has_many_through_has_many_with_has_and_belongs_to_many_source_reflection
212
217
  general, cooking = categories(:general), categories(:cooking)
213
218
 
214
- assert_equal [general, cooking], authors(:bob).post_categories.order('categories.id')
219
+ assert_equal [general, cooking], authors(:bob).post_categories.order("categories.id")
215
220
  end
216
221
 
217
222
  def test_has_many_through_has_many_with_has_and_belongs_to_many_source_reflection_preload
218
- authors = assert_queries(4) { Author.includes(:post_categories).to_a.sort_by(&:id) }
223
+ author = assert_queries(4) { Author.includes(:post_categories).third }
219
224
  general, cooking = categories(:general), categories(:cooking)
220
225
 
221
226
  assert_no_queries do
222
- assert_equal [general, cooking], authors[2].post_categories.sort_by(&:id)
227
+ assert_equal [general, cooking], author.post_categories.sort_by(&:id)
223
228
  end
224
229
  end
225
230
 
@@ -228,7 +233,7 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
228
233
  Author.joins(:post_categories).first
229
234
 
230
235
  assert_includes_and_joins_equal(
231
- Author.where('categories.id' => categories(:cooking).id),
236
+ Author.where("categories.id" => categories(:cooking).id),
232
237
  [authors(:bob)], :post_categories
233
238
  )
234
239
  end
@@ -239,16 +244,16 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
239
244
  def test_has_many_through_has_and_belongs_to_many_with_has_many_source_reflection
240
245
  greetings, more = comments(:greetings), comments(:more_greetings)
241
246
 
242
- assert_equal [greetings, more], categories(:technology).post_comments.order('comments.id')
247
+ assert_equal [greetings, more], categories(:technology).post_comments.order("comments.id")
243
248
  end
244
249
 
245
250
  def test_has_many_through_has_and_belongs_to_many_with_has_many_source_reflection_preload
246
251
  Category.includes(:post_comments).to_a # preheat cache
247
- categories = assert_queries(4) { Category.includes(:post_comments).to_a.sort_by(&:id) }
252
+ category = assert_queries(4) { Category.includes(:post_comments).second }
248
253
  greetings, more = comments(:greetings), comments(:more_greetings)
249
254
 
250
255
  assert_no_queries do
251
- assert_equal [greetings, more], categories[1].post_comments.sort_by(&:id)
256
+ assert_equal [greetings, more], category.post_comments.sort_by(&:id)
252
257
  end
253
258
  end
254
259
 
@@ -257,7 +262,7 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
257
262
  Category.joins(:post_comments).first
258
263
 
259
264
  assert_includes_and_joins_equal(
260
- Category.where('comments.id' => comments(:more_greetings).id).order('categories.id'),
265
+ Category.where("comments.id" => comments(:more_greetings).id).order("categories.id"),
261
266
  [categories(:general), categories(:technology)], :post_comments
262
267
  )
263
268
  end
@@ -268,15 +273,15 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
268
273
  def test_has_many_through_has_many_with_has_many_through_habtm_source_reflection
269
274
  greetings, more = comments(:greetings), comments(:more_greetings)
270
275
 
271
- assert_equal [greetings, more], authors(:bob).category_post_comments.order('comments.id')
276
+ assert_equal [greetings, more], authors(:bob).category_post_comments.order("comments.id")
272
277
  end
273
278
 
274
279
  def test_has_many_through_has_many_with_has_many_through_habtm_source_reflection_preload
275
- authors = assert_queries(6) { Author.includes(:category_post_comments).to_a.sort_by(&:id) }
280
+ author = assert_queries(6) { Author.includes(:category_post_comments).third }
276
281
  greetings, more = comments(:greetings), comments(:more_greetings)
277
282
 
278
283
  assert_no_queries do
279
- assert_equal [greetings, more], authors[2].category_post_comments.sort_by(&:id)
284
+ assert_equal [greetings, more], author.category_post_comments.sort_by(&:id)
280
285
  end
281
286
  end
282
287
 
@@ -285,7 +290,7 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
285
290
  Author.joins(:category_post_comments).first
286
291
 
287
292
  assert_includes_and_joins_equal(
288
- Author.where('comments.id' => comments(:does_it_hurt).id).order('authors.id'),
293
+ Author.where("comments.id" => comments(:does_it_hurt).id).order("authors.id"),
289
294
  [authors(:david), authors(:mary)], :category_post_comments
290
295
  )
291
296
  end
@@ -298,17 +303,17 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
298
303
  end
299
304
 
300
305
  def test_has_many_through_has_many_through_with_belongs_to_source_reflection_preload
301
- authors = assert_queries(5) { Author.includes(:tagging_tags).to_a }
306
+ author = assert_queries(5) { Author.includes(:tagging_tags).first }
302
307
  general = tags(:general)
303
308
 
304
309
  assert_no_queries do
305
- assert_equal [general, general], authors.first.tagging_tags
310
+ assert_equal [general, general], author.tagging_tags
306
311
  end
307
312
  end
308
313
 
309
314
  def test_has_many_through_has_many_through_with_belongs_to_source_reflection_preload_via_joins
310
315
  assert_includes_and_joins_equal(
311
- Author.where('tags.id' => tags(:general).id),
316
+ Author.where("tags.id" => tags(:general).id),
312
317
  [authors(:david)], :tagging_tags
313
318
  )
314
319
  end
@@ -320,21 +325,21 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
320
325
  welcome_general, thinking_general = taggings(:welcome_general), taggings(:thinking_general)
321
326
 
322
327
  assert_equal [welcome_general, thinking_general],
323
- categorizations(:david_welcome_general).post_taggings.order('taggings.id')
328
+ categorizations(:david_welcome_general).post_taggings.order("taggings.id")
324
329
  end
325
330
 
326
331
  def test_has_many_through_belongs_to_with_has_many_through_source_reflection_preload
327
- categorizations = assert_queries(4) { Categorization.includes(:post_taggings).to_a.sort_by(&:id) }
332
+ categorization = assert_queries(4) { Categorization.includes(:post_taggings).first }
328
333
  welcome_general, thinking_general = taggings(:welcome_general), taggings(:thinking_general)
329
334
 
330
335
  assert_no_queries do
331
- assert_equal [welcome_general, thinking_general], categorizations.first.post_taggings.sort_by(&:id)
336
+ assert_equal [welcome_general, thinking_general], categorization.post_taggings.sort_by(&:id)
332
337
  end
333
338
  end
334
339
 
335
340
  def test_has_many_through_belongs_to_with_has_many_through_source_reflection_preload_via_joins
336
341
  assert_includes_and_joins_equal(
337
- Categorization.where('taggings.id' => taggings(:welcome_general).id).order('taggings.id'),
342
+ Categorization.where("taggings.id" => taggings(:welcome_general).id).order("taggings.id"),
338
343
  [categorizations(:david_welcome_general)], :post_taggings
339
344
  )
340
345
  end
@@ -347,17 +352,17 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
347
352
  end
348
353
 
349
354
  def test_has_one_through_has_one_with_has_one_through_source_reflection_preload
350
- members = assert_queries(4) { Member.includes(:nested_member_type).to_a.sort_by(&:id) }
355
+ member = assert_queries(4) { Member.includes(:nested_member_type).first }
351
356
  founding = member_types(:founding)
352
357
 
353
358
  assert_no_queries do
354
- assert_equal founding, members.first.nested_member_type
359
+ assert_equal founding, member.nested_member_type
355
360
  end
356
361
  end
357
362
 
358
363
  def test_has_one_through_has_one_with_has_one_through_source_reflection_preload_via_joins
359
364
  assert_includes_and_joins_equal(
360
- Member.where('member_types.id' => member_types(:founding).id),
365
+ Member.where("member_types.id" => member_types(:founding).id),
361
366
  [members(:groucho)], :nested_member_type
362
367
  )
363
368
  end
@@ -373,7 +378,7 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
373
378
  prev_default_scope = Club.default_scopes
374
379
 
375
380
  [:includes, :preload, :joins, :eager_load].each do |q|
376
- Club.default_scopes = [proc { Club.send(q, :category) }]
381
+ Club.default_scopes = [proc { Club.public_send(q, :category) }]
377
382
  assert_equal categories(:general), members(:groucho).reload.club_category
378
383
  end
379
384
  ensure
@@ -381,17 +386,17 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
381
386
  end
382
387
 
383
388
  def test_has_one_through_has_one_through_with_belongs_to_source_reflection_preload
384
- members = assert_queries(4) { Member.includes(:club_category).to_a.sort_by(&:id) }
389
+ member = assert_queries(4) { Member.includes(:club_category).first }
385
390
  general = categories(:general)
386
391
 
387
392
  assert_no_queries do
388
- assert_equal general, members.first.club_category
393
+ assert_equal general, member.club_category
389
394
  end
390
395
  end
391
396
 
392
397
  def test_has_one_through_has_one_through_with_belongs_to_source_reflection_preload_via_joins
393
398
  assert_includes_and_joins_equal(
394
- Member.where('categories.id' => categories(:technology).id),
399
+ Member.where("categories.id" => categories(:technology).id),
395
400
  [members(:blarpy_winkup)], :club_category
396
401
  )
397
402
  end
@@ -404,7 +409,7 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
404
409
  def test_distinct_has_many_through_a_has_many_through_association_on_through_reflection
405
410
  author = authors(:david)
406
411
  assert_equal [subscribers(:first), subscribers(:second)],
407
- author.distinct_subscribers.order('subscribers.nick')
412
+ author.distinct_subscribers.order("subscribers.nick")
408
413
  end
409
414
 
410
415
  def test_nested_has_many_through_with_a_table_referenced_multiple_times
@@ -413,26 +418,31 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
413
418
  author.similar_posts.sort_by(&:id)
414
419
 
415
420
  # Mary and Bob both have posts in misc, but they are the only ones.
416
- authors = Author.joins(:similar_posts).where('posts.id' => posts(:misc_by_bob).id)
421
+ authors = Author.joins(:similar_posts).where("posts.id" => posts(:misc_by_bob).id)
417
422
  assert_equal [authors(:mary), authors(:bob)], authors.distinct.sort_by(&:id)
418
423
 
419
424
  # Check the polymorphism of taggings is being observed correctly (in both joins)
420
- authors = Author.joins(:similar_posts).where('taggings.taggable_type' => 'FakeModel')
421
- assert authors.empty?
422
- authors = Author.joins(:similar_posts).where('taggings_authors_join.taggable_type' => 'FakeModel')
423
- assert authors.empty?
425
+ authors = Author.joins(:similar_posts).where("taggings.taggable_type" => "FakeModel")
426
+ assert_empty authors
427
+ authors = Author.joins(:similar_posts).where("taggings_authors_join.taggable_type" => "FakeModel")
428
+ assert_empty authors
429
+ end
430
+
431
+ def test_nested_has_many_through_with_scope_on_polymorphic_reflection
432
+ authors = Author.joins(:ordered_posts).where("posts.id" => posts(:misc_by_bob).id)
433
+ assert_equal [authors(:mary), authors(:bob)], authors.distinct.sort_by(&:id)
424
434
  end
425
435
 
426
436
  def test_has_many_through_with_foreign_key_option_on_through_reflection
427
- assert_equal [posts(:welcome), posts(:authorless)], people(:david).agents_posts.order('posts.id')
437
+ assert_equal [posts(:welcome), posts(:authorless)], people(:david).agents_posts.order("posts.id")
428
438
  assert_equal [authors(:david)], references(:david_unicyclist).agents_posts_authors
429
439
 
430
- references = Reference.joins(:agents_posts_authors).where('authors.id' => authors(:david).id)
440
+ references = Reference.joins(:agents_posts_authors).where("authors.id" => authors(:david).id)
431
441
  assert_equal [references(:david_unicyclist)], references
432
442
  end
433
443
 
434
444
  def test_has_many_through_with_foreign_key_option_on_source_reflection
435
- assert_equal [people(:michael), people(:susan)], jobs(:unicyclist).agents.order('people.id')
445
+ assert_equal [people(:michael), people(:susan)], jobs(:unicyclist).agents.order("people.id")
436
446
 
437
447
  jobs = Job.joins(:agents)
438
448
  assert_equal [jobs(:unicyclist), jobs(:unicyclist)], jobs
@@ -443,19 +453,19 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
443
453
  assert_equal [ratings(:special_comment_rating), ratings(:sub_special_comment_rating)], ratings
444
454
 
445
455
  # Ensure STI is respected in the join
446
- scope = Post.joins(:special_comments_ratings).where(:id => posts(:sti_comments).id)
447
- assert scope.where("comments.type" => "Comment").empty?
448
- assert !scope.where("comments.type" => "SpecialComment").empty?
449
- assert !scope.where("comments.type" => "SubSpecialComment").empty?
456
+ scope = Post.joins(:special_comments_ratings).where(id: posts(:sti_comments).id)
457
+ assert_empty scope.where("comments.type" => "Comment")
458
+ assert_not_empty scope.where("comments.type" => "SpecialComment")
459
+ assert_not_empty scope.where("comments.type" => "SubSpecialComment")
450
460
  end
451
461
 
452
462
  def test_has_many_through_with_sti_on_nested_through_reflection
453
463
  taggings = posts(:sti_comments).special_comments_ratings_taggings
454
464
  assert_equal [taggings(:special_comment_rating)], taggings
455
465
 
456
- scope = Post.joins(:special_comments_ratings_taggings).where(:id => posts(:sti_comments).id)
457
- assert scope.where("comments.type" => "Comment").empty?
458
- assert !scope.where("comments.type" => "SpecialComment").empty?
466
+ scope = Post.joins(:special_comments_ratings_taggings).where(id: posts(:sti_comments).id)
467
+ assert_empty scope.where("comments.type" => "Comment")
468
+ assert_not_empty scope.where("comments.type" => "SpecialComment")
459
469
  end
460
470
 
461
471
  def test_nested_has_many_through_writers_should_raise_error
@@ -505,20 +515,20 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
505
515
  end
506
516
 
507
517
  def test_nested_has_many_through_with_conditions_on_through_associations_preload
508
- assert Author.where('tags.id' => 100).joins(:misc_post_first_blue_tags).empty?
518
+ assert_empty Author.where("tags.id" => 100).joins(:misc_post_first_blue_tags)
509
519
 
510
- authors = assert_queries(3) { Author.includes(:misc_post_first_blue_tags).to_a.sort_by(&:id) }
520
+ author = assert_queries(2) { Author.includes(:misc_post_first_blue_tags).third }
511
521
  blue = tags(:blue)
512
522
 
513
523
  assert_no_queries do
514
- assert_equal [blue], authors[2].misc_post_first_blue_tags
524
+ assert_equal [blue], author.misc_post_first_blue_tags
515
525
  end
516
526
  end
517
527
 
518
528
  def test_nested_has_many_through_with_conditions_on_through_associations_preload_via_joins
519
529
  # Pointless condition to force single-query loading
520
530
  assert_includes_and_joins_equal(
521
- Author.where('tags.id = tags.id').references(:tags),
531
+ Author.where("tags.id = tags.id").references(:tags),
522
532
  [authors(:bob)], :misc_post_first_blue_tags
523
533
  )
524
534
  end
@@ -528,18 +538,27 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
528
538
  end
529
539
 
530
540
  def test_nested_has_many_through_with_conditions_on_source_associations_preload
531
- authors = assert_queries(4) { Author.includes(:misc_post_first_blue_tags_2).to_a.sort_by(&:id) }
541
+ author = assert_queries(2) { Author.includes(:misc_post_first_blue_tags_2).third }
532
542
  blue = tags(:blue)
533
543
 
534
544
  assert_no_queries do
535
- assert_equal [blue], authors[2].misc_post_first_blue_tags_2
545
+ assert_equal [blue], author.misc_post_first_blue_tags_2
546
+ end
547
+ end
548
+
549
+ def test_through_association_preload_doesnt_reset_source_association_if_already_preloaded
550
+ blue = tags(:blue)
551
+ author = Author.preload(posts: :first_blue_tags_2, misc_post_first_blue_tags_2: {}).third
552
+
553
+ assert_no_queries do
554
+ assert_equal [blue], author.posts.first.first_blue_tags_2
536
555
  end
537
556
  end
538
557
 
539
558
  def test_nested_has_many_through_with_conditions_on_source_associations_preload_via_joins
540
559
  # Pointless condition to force single-query loading
541
560
  assert_includes_and_joins_equal(
542
- Author.where('tags.id = tags.id').references(:tags),
561
+ Author.where("tags.id = tags.id").references(:tags),
543
562
  [authors(:bob)], :misc_post_first_blue_tags_2
544
563
  )
545
564
  end
@@ -548,13 +567,13 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
548
567
  assert_equal [categories(:general)], organizations(:nsa).author_essay_categories
549
568
 
550
569
  organizations = Organization.joins(:author_essay_categories).
551
- where('categories.id' => categories(:general).id)
570
+ where("categories.id" => categories(:general).id)
552
571
  assert_equal [organizations(:nsa)], organizations
553
572
 
554
573
  assert_equal categories(:general), organizations(:nsa).author_owned_essay_category
555
574
 
556
575
  organizations = Organization.joins(:author_owned_essay_category).
557
- where('categories.id' => categories(:general).id)
576
+ where("categories.id" => categories(:general).id)
558
577
  assert_equal [organizations(:nsa)], organizations
559
578
  end
560
579
 
@@ -562,14 +581,52 @@ class NestedThroughAssociationsTest < ActiveRecord::TestCase
562
581
  c = Categorization.new
563
582
  c.author = authors(:david)
564
583
  c.post_taggings.to_a
565
- assert !c.post_taggings.empty?
584
+ assert_not_empty c.post_taggings
566
585
  c.save
567
- assert !c.post_taggings.empty?
586
+ assert_not_empty c.post_taggings
568
587
  end
569
588
 
570
- private
589
+ def test_polymorphic_has_many_through_when_through_association_has_not_loaded
590
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
591
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
592
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
593
+ Hotel.create!(departments: [department])
594
+ hotel = Hotel.includes(:cake_designers, :drink_designers).take
571
595
 
596
+ assert_equal [cake_designer], hotel.cake_designers
597
+ assert_equal [drink_designer], hotel.drink_designers
598
+ end
599
+
600
+ def test_polymorphic_has_many_through_when_through_association_has_already_loaded
601
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
602
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
603
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
604
+ Hotel.create!(departments: [department])
605
+ hotel = Hotel.includes(:chefs, :cake_designers, :drink_designers).take
606
+
607
+ assert_equal [cake_designer], hotel.cake_designers
608
+ assert_equal [drink_designer], hotel.drink_designers
609
+ end
610
+
611
+ def test_polymorphic_has_many_through_joined_different_table_twice
612
+ cake_designer = CakeDesigner.create!(chef: Chef.new)
613
+ drink_designer = DrinkDesigner.create!(chef: Chef.new)
614
+ department = Department.create!(chefs: [cake_designer.chef, drink_designer.chef])
615
+ hotel = Hotel.create!(departments: [department])
616
+
617
+ assert_equal hotel, Hotel.joins(:cake_designers, :drink_designers).take
618
+ end
619
+
620
+ def test_has_many_through_reset_source_reflection_after_loading_is_complete
621
+ preloaded = Category.preload(:ordered_post_comments).find(1, 2).last
622
+ original = Category.find(2)
623
+ assert_equal original.ordered_post_comments.ids, preloaded.ordered_post_comments.ids
624
+ end
625
+
626
+ private
572
627
  def assert_includes_and_joins_equal(query, expected, association)
628
+ query = query.order(:id)
629
+
573
630
  actual = assert_queries(1) { query.joins(association).to_a.uniq }
574
631
  assert_equal expected, actual
575
632