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,29 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/club'
3
- require 'models/member_type'
4
- require 'models/member'
5
- require 'models/membership'
6
- require 'models/sponsor'
7
- require 'models/organization'
8
- require 'models/member_detail'
9
- require 'models/minivan'
10
- require 'models/dashboard'
11
- require 'models/speedometer'
12
- require 'models/category'
13
- require 'models/author'
14
- require 'models/essay'
15
- require 'models/owner'
16
- require 'models/post'
17
- require 'models/comment'
18
- require 'models/categorization'
19
- require 'models/customer'
20
- require 'models/carrier'
21
- require 'models/shop_account'
22
- require 'models/customer_carrier'
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"
23
25
 
24
26
  class HasOneThroughAssociationsTest < ActiveRecord::TestCase
25
27
  fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
26
- :dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners
28
+ :dashboards, :speedometers, :authors, :author_addresses, :posts, :comments, :categories, :essays, :owners
27
29
 
28
30
  def setup
29
31
  @member = members(:groucho)
@@ -33,15 +35,34 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
33
35
  assert_equal clubs(:boring_club), @member.club
34
36
  end
35
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
+
36
45
  def test_creating_association_creates_through_record
37
- new_member = Member.create(:name => "Chris")
38
- new_member.club = Club.create(:name => "LRUG")
46
+ new_member = Member.create(name: "Chris")
47
+ new_member.club = Club.create(name: "LRUG")
39
48
  assert_not_nil new_member.current_membership
40
49
  assert_not_nil new_member.club
41
50
  end
42
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
+
43
64
  def test_creating_association_builds_through_record_for_new
44
- new_member = Member.new(:name => "Jane")
65
+ new_member = Member.new(name: "Jane")
45
66
  new_member.club = clubs(:moustache_club)
46
67
  assert new_member.current_membership
47
68
  assert_equal clubs(:moustache_club), new_member.current_membership.club
@@ -50,9 +71,27 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
50
71
  assert_equal clubs(:moustache_club), new_member.club
51
72
  end
52
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
+
53
92
  def test_creating_association_sets_both_parent_ids_for_new
54
- member = Member.new(name: 'Sean Griffin')
55
- club = Club.new(name: 'Da Club')
93
+ member = Member.new(name: "Sean Griffin")
94
+ club = Club.new(name: "Da Club")
56
95
 
57
96
  member.club = club
58
97
 
@@ -65,7 +104,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
65
104
  end
66
105
 
67
106
  def test_replace_target_record
68
- new_club = Club.create(:name => "Marx Bros")
107
+ new_club = Club.create(name: "Marx Bros")
69
108
  @member.club = new_club
70
109
  @member.reload
71
110
  assert_equal new_club, @member.club
@@ -73,7 +112,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
73
112
 
74
113
  def test_replacing_target_record_deletes_old_association
75
114
  assert_no_difference "Membership.count" do
76
- new_club = Club.create(:name => "Bananarama")
115
+ new_club = Club.create(name: "Bananarama")
77
116
  @member.club = new_club
78
117
  @member.reload
79
118
  end
@@ -82,40 +121,47 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
82
121
  def test_set_record_to_nil_should_delete_association
83
122
  @member.club = nil
84
123
  @member.reload
85
- assert_equal nil, @member.current_membership
124
+ assert_nil @member.current_membership
86
125
  assert_nil @member.club
87
126
  end
88
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
+
89
135
  def test_has_one_through_polymorphic
90
136
  assert_equal clubs(:moustache_club), @member.sponsor_club
91
137
  end
92
138
 
93
139
  def test_has_one_through_eager_loading
94
- members = assert_queries(3) do #base table, through table, clubs table
95
- Member.all.merge!(:includes => :club, :where => ["name = ?", "Groucho Marx"]).to_a
140
+ members = assert_queries(3) do # base table, through table, clubs table
141
+ Member.all.merge!(includes: :club, where: ["name = ?", "Groucho Marx"]).to_a
96
142
  end
97
143
  assert_equal 1, members.size
98
- assert_not_nil assert_no_queries {members[0].club}
144
+ assert_not_nil assert_no_queries { members[0].club }
99
145
  end
100
146
 
101
147
  def test_has_one_through_eager_loading_through_polymorphic
102
- members = assert_queries(3) do #base table, through table, clubs table
103
- Member.all.merge!(:includes => :sponsor_club, :where => ["name = ?", "Groucho Marx"]).to_a
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
104
150
  end
105
151
  assert_equal 1, members.size
106
- assert_not_nil assert_no_queries {members[0].sponsor_club}
152
+ assert_not_nil assert_no_queries { members[0].sponsor_club }
107
153
  end
108
154
 
109
155
  def test_has_one_through_with_conditions_eager_loading
110
156
  # conditions on the through table
111
- assert_equal clubs(:moustache_club), Member.all.merge!(:includes => :favourite_club).find(@member.id).favourite_club
157
+ assert_equal clubs(:moustache_club), Member.all.merge!(includes: :favourite_club).find(@member.id).favourite_club
112
158
  memberships(:membership_of_favourite_club).update_columns(favourite: false)
113
- assert_equal nil, Member.all.merge!(:includes => :favourite_club).find(@member.id).reload.favourite_club
159
+ assert_nil Member.all.merge!(includes: :favourite_club).find(@member.id).reload.favourite_club
114
160
 
115
161
  # conditions on the source table
116
- assert_equal clubs(:moustache_club), Member.all.merge!(:includes => :hairy_club).find(@member.id).hairy_club
162
+ assert_equal clubs(:moustache_club), Member.all.merge!(includes: :hairy_club).find(@member.id).hairy_club
117
163
  clubs(:moustache_club).update_columns(name: "Association of Clean-Shaven Persons")
118
- assert_equal nil, Member.all.merge!(:includes => :hairy_club).find(@member.id).reload.hairy_club
164
+ assert_nil Member.all.merge!(includes: :hairy_club).find(@member.id).reload.hairy_club
119
165
  end
120
166
 
121
167
  def test_has_one_through_polymorphic_with_source_type
@@ -123,31 +169,31 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
123
169
  end
124
170
 
125
171
  def test_eager_has_one_through_polymorphic_with_source_type
126
- clubs = Club.all.merge!(:includes => :sponsored_member, :where => ["name = ?","Moustache and Eyebrow Fancier Club"]).to_a
172
+ clubs = Club.all.merge!(includes: :sponsored_member, where: ["name = ?", "Moustache and Eyebrow Fancier Club"]).to_a
127
173
  # Only the eyebrow fanciers club has a sponsored_member
128
- assert_not_nil assert_no_queries {clubs[0].sponsored_member}
174
+ assert_not_nil assert_no_queries { clubs[0].sponsored_member }
129
175
  end
130
176
 
131
177
  def test_has_one_through_nonpreload_eagerloading
132
178
  members = assert_queries(1) do
133
- Member.all.merge!(:includes => :club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name').to_a #force fallback
179
+ Member.all.merge!(includes: :club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
134
180
  end
135
181
  assert_equal 1, members.size
136
- assert_not_nil assert_no_queries {members[0].club}
182
+ assert_not_nil assert_no_queries { members[0].club }
137
183
  end
138
184
 
139
185
  def test_has_one_through_nonpreload_eager_loading_through_polymorphic
140
186
  members = assert_queries(1) do
141
- Member.all.merge!(:includes => :sponsor_club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name').to_a #force fallback
187
+ Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name").to_a # force fallback
142
188
  end
143
189
  assert_equal 1, members.size
144
- assert_not_nil assert_no_queries {members[0].sponsor_club}
190
+ assert_not_nil assert_no_queries { members[0].sponsor_club }
145
191
  end
146
192
 
147
193
  def test_has_one_through_nonpreload_eager_loading_through_polymorphic_with_more_than_one_through_record
148
- Sponsor.new(:sponsor_club => clubs(:crazy_club), :sponsorable => members(:groucho)).save!
194
+ Sponsor.new(sponsor_club: clubs(:crazy_club), sponsorable: members(:groucho)).save!
149
195
  members = assert_queries(1) do
150
- Member.all.merge!(:includes => :sponsor_club, :where => ["members.name = ?", "Groucho Marx"], :order => 'clubs.name DESC').to_a #force fallback
196
+ Member.all.merge!(includes: :sponsor_club, where: ["members.name = ?", "Groucho Marx"], order: "clubs.name DESC").to_a # force fallback
151
197
  end
152
198
  assert_equal 1, members.size
153
199
  assert_not_nil assert_no_queries { members[0].sponsor_club }
@@ -159,8 +205,8 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
159
205
  end
160
206
 
161
207
  def test_assigning_association_correctly_assigns_target
162
- new_member = Member.create(:name => "Chris")
163
- new_member.club = new_club = Club.create(:name => "LRUG")
208
+ new_member = Member.create(name: "Chris")
209
+ new_member.club = new_club = Club.create(name: "LRUG")
164
210
  assert_equal new_club, new_member.association(:club).target
165
211
  end
166
212
 
@@ -176,37 +222,37 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
176
222
 
177
223
  def test_assigning_to_has_one_through_preserves_decorated_join_record
178
224
  @organization = organizations(:nsa)
179
- assert_difference 'MemberDetail.count', 1 do
180
- @member_detail = MemberDetail.new(:extra_data => 'Extra')
225
+ assert_difference "MemberDetail.count", 1 do
226
+ @member_detail = MemberDetail.new(extra_data: "Extra")
181
227
  @member.member_detail = @member_detail
182
228
  @member.organization = @organization
183
229
  end
184
230
  assert_equal @organization, @member.organization
185
- assert @organization.members.include?(@member)
186
- assert_equal 'Extra', @member.member_detail.extra_data
231
+ assert_includes @organization.members, @member
232
+ assert_equal "Extra", @member.member_detail.extra_data
187
233
  end
188
234
 
189
235
  def test_reassigning_has_one_through
190
236
  @organization = organizations(:nsa)
191
237
  @new_organization = organizations(:discordians)
192
238
 
193
- assert_difference 'MemberDetail.count', 1 do
194
- @member_detail = MemberDetail.new(:extra_data => 'Extra')
239
+ assert_difference "MemberDetail.count", 1 do
240
+ @member_detail = MemberDetail.new(extra_data: "Extra")
195
241
  @member.member_detail = @member_detail
196
242
  @member.organization = @organization
197
243
  end
198
244
  assert_equal @organization, @member.organization
199
- assert_equal 'Extra', @member.member_detail.extra_data
200
- assert @organization.members.include?(@member)
201
- assert !@new_organization.members.include?(@member)
245
+ assert_equal "Extra", @member.member_detail.extra_data
246
+ assert_includes @organization.members, @member
247
+ assert_not_includes @new_organization.members, @member
202
248
 
203
- assert_no_difference 'MemberDetail.count' do
249
+ assert_no_difference "MemberDetail.count" do
204
250
  @member.organization = @new_organization
205
251
  end
206
252
  assert_equal @new_organization, @member.organization
207
- assert_equal 'Extra', @member.member_detail.extra_data
208
- assert !@organization.members.include?(@member)
209
- assert @new_organization.members.include?(@member)
253
+ assert_equal "Extra", @member.member_detail.extra_data
254
+ assert_not_includes @organization.members, @member
255
+ assert_includes @new_organization.members, @member
210
256
  end
211
257
 
212
258
  def test_preloading_has_one_through_on_belongs_to
@@ -217,10 +263,10 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
217
263
  @member.member_detail = @member_detail
218
264
  @member.organization = @organization
219
265
  @member_details = assert_queries(3) do
220
- MemberDetail.all.merge!(:includes => :member_type).to_a
266
+ MemberDetail.all.merge!(includes: :member_type).to_a
221
267
  end
222
268
  @new_detail = @member_details[0]
223
- assert @new_detail.send(:association, :member_type).loaded?
269
+ assert_predicate @new_detail.send(:association, :member_type), :loaded?
224
270
  assert_no_queries { @new_detail.member_type }
225
271
  end
226
272
 
@@ -230,19 +276,19 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
230
276
 
231
277
  assert_nothing_raised do
232
278
  Club.find(@club.id).save!
233
- Club.all.merge!(:includes => :sponsored_member).find(@club.id).save!
279
+ Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
234
280
  end
235
281
 
236
282
  @club.sponsor.destroy
237
283
 
238
284
  assert_nothing_raised do
239
285
  Club.find(@club.id).save!
240
- Club.all.merge!(:includes => :sponsored_member).find(@club.id).save!
286
+ Club.all.merge!(includes: :sponsored_member).find(@club.id).save!
241
287
  end
242
288
  end
243
289
 
244
290
  def test_through_belongs_to_after_destroy
245
- @member_detail = MemberDetail.new(:extra_data => 'Extra')
291
+ @member_detail = MemberDetail.new(extra_data: "Extra")
246
292
  @member.member_detail = @member_detail
247
293
  @member.save!
248
294
 
@@ -261,7 +307,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
261
307
  end
262
308
 
263
309
  def test_value_is_properly_quoted
264
- minivan = Minivan.find('m1')
310
+ minivan = Minivan.find("m1")
265
311
  assert_nothing_raised do
266
312
  minivan.dashboard
267
313
  end
@@ -270,7 +316,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
270
316
  def test_has_one_through_polymorphic_with_primary_key_option
271
317
  assert_equal categories(:general), authors(:david).essay_category
272
318
 
273
- authors = Author.joins(:essay_category).where('categories.id' => categories(:general).id)
319
+ authors = Author.joins(:essay_category).where("categories.id" => categories(:general).id)
274
320
  assert_equal authors(:david), authors.first
275
321
 
276
322
  assert_equal owners(:blackbeard), authors(:david).essay_owner
@@ -282,12 +328,12 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
282
328
  def test_has_one_through_with_primary_key_option
283
329
  assert_equal categories(:general), authors(:david).essay_category_2
284
330
 
285
- authors = Author.joins(:essay_category_2).where('categories.id' => categories(:general).id)
331
+ authors = Author.joins(:essay_category_2).where("categories.id" => categories(:general).id)
286
332
  assert_equal authors(:david), authors.first
287
333
  end
288
334
 
289
335
  def test_has_one_through_with_default_scope_on_join_model
290
- assert_equal posts(:welcome).comments.order('id').first, authors(:david).comment_on_first_post
336
+ assert_equal posts(:welcome).comments.order("id").first, authors(:david).comment_on_first_post
291
337
  end
292
338
 
293
339
  def test_has_one_through_many_raises_exception
@@ -308,12 +354,12 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
308
354
  minivan.dashboard
309
355
  proxy = minivan.send(:association_instance_get, :dashboard)
310
356
 
311
- assert !proxy.stale_target?
357
+ assert_not_predicate proxy, :stale_target?
312
358
  assert_equal dashboards(:cool_first), minivan.dashboard
313
359
 
314
360
  minivan.speedometer_id = speedometers(:second).id
315
361
 
316
- assert proxy.stale_target?
362
+ assert_predicate proxy, :stale_target?
317
363
  assert_equal dashboards(:second), minivan.dashboard
318
364
  end
319
365
 
@@ -325,7 +371,7 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
325
371
 
326
372
  minivan.speedometer_id = speedometers(:second).id
327
373
 
328
- assert proxy.stale_target?
374
+ assert_predicate proxy, :stale_target?
329
375
  assert_equal dashboards(:second), minivan.dashboard
330
376
  end
331
377
 
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/essay'
6
- require 'models/category'
7
- require 'models/categorization'
8
- require 'models/person'
9
- require 'models/tagging'
10
- require 'models/tag'
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"
11
13
 
12
14
  class InnerJoinAssociationTest < ActiveRecord::TestCase
13
- fixtures :authors, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
14
- :taggings, :tags
15
+ fixtures :authors, :author_addresses, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
16
+ :taggings, :tags, :people
15
17
 
16
18
  def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
17
19
  result = Author.joins(:thinking_posts, :welcome_posts).to_a
@@ -20,11 +22,80 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
20
22
 
21
23
  def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
22
24
  assert_nothing_raised do
23
- sql = Person.joins(:agents => {:agents => :agents}).joins(:agents => {:agents => {:primary_contact => :agents}}).to_sql
25
+ sql = Person.joins(agents: { agents: :agents }).joins(agents: { agents: { primary_contact: :agents } }).to_sql
24
26
  assert_match(/agents_people_4/i, sql)
25
27
  end
26
28
  end
27
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
+
28
99
  def test_construct_finder_sql_ignores_empty_joins_hash
29
100
  sql = Author.joins({}).to_sql
30
101
  assert_no_match(/JOIN/i, sql)
@@ -47,8 +118,13 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
47
118
  end
48
119
 
49
120
  def test_join_conditions_allow_nil_associations
50
- authors = Author.includes(:essays).where(:essays => {:id => nil})
51
- assert_equal 2, authors.count
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))
52
128
  end
53
129
 
54
130
  def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
@@ -58,56 +134,56 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
58
134
  end
59
135
 
60
136
  def test_find_with_implicit_inner_joins_honors_readonly_with_select
61
- authors = Author.joins(:posts).select('authors.*').to_a
62
- assert !authors.empty?, "expected authors to be non-empty"
63
- assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
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"
64
140
  end
65
141
 
66
142
  def test_find_with_implicit_inner_joins_honors_readonly_false
67
143
  authors = Author.joins(:posts).readonly(false).to_a
68
- assert !authors.empty?, "expected authors to be non-empty"
69
- assert authors.all? {|a| !a.readonly? }, "expected no authors to be readonly"
144
+ assert_not authors.empty?, "expected authors to be non-empty"
145
+ assert authors.all? { |a| !a.readonly? }, "expected no authors to be readonly"
70
146
  end
71
147
 
72
148
  def test_find_with_implicit_inner_joins_does_not_set_associations
73
- authors = Author.joins(:posts).select('authors.*').to_a
74
- assert !authors.empty?, "expected authors to be non-empty"
149
+ authors = Author.joins(:posts).select("authors.*").to_a
150
+ assert_not authors.empty?, "expected authors to be non-empty"
75
151
  assert authors.all? { |a| !a.instance_variable_defined?(:@posts) }, "expected no authors to have the @posts association loaded"
76
152
  end
77
153
 
78
154
  def test_count_honors_implicit_inner_joins
79
- real_count = Author.all.to_a.sum{|a| a.posts.count }
155
+ real_count = Author.all.to_a.sum { |a| a.posts.count }
80
156
  assert_equal real_count, Author.joins(:posts).count, "plain inner join count should match the number of referenced posts records"
81
157
  end
82
158
 
83
159
  def test_calculate_honors_implicit_inner_joins
84
- real_count = Author.all.to_a.sum{|a| a.posts.count }
85
- assert_equal real_count, Author.joins(:posts).calculate(:count, 'authors.id'), "plain inner join count should match the number of referenced posts records"
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"
86
162
  end
87
163
 
88
164
  def test_calculate_honors_implicit_inner_joins_and_distinct_and_conditions
89
- real_count = Author.all.to_a.select {|a| a.posts.any? {|p| p.title =~ /^Welcome/} }.length
90
- authors_with_welcoming_post_titles = Author.all.merge!(joins: :posts, where: "posts.title like 'Welcome%'").distinct.calculate(:count, 'authors.id')
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")
91
167
  assert_equal real_count, authors_with_welcoming_post_titles, "inner join and conditions should have only returned authors posting titles starting with 'Welcome'"
92
168
  end
93
169
 
94
170
  def test_find_with_sti_join
95
- scope = Post.joins(:special_comments).where(:id => posts(:sti_comments).id)
171
+ scope = Post.joins(:special_comments).where(id: posts(:sti_comments).id)
96
172
 
97
173
  # The join should match SpecialComment and its subclasses only
98
- assert scope.where("comments.type" => "Comment").empty?
99
- assert !scope.where("comments.type" => "SpecialComment").empty?
100
- assert !scope.where("comments.type" => "SubSpecialComment").empty?
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")
101
177
  end
102
178
 
103
179
  def test_find_with_conditions_on_reflection
104
- assert !posts(:welcome).comments.empty?
105
- assert Post.joins(:nonexistent_comments).where(:id => posts(:welcome).id).empty? # [sic!]
180
+ assert_not_empty posts(:welcome).comments
181
+ assert Post.joins(:nonexistent_comments).where(id: posts(:welcome).id).empty? # [sic!]
106
182
  end
107
183
 
108
184
  def test_find_with_conditions_on_through_reflection
109
- assert !posts(:welcome).tags.empty?
110
- assert Post.joins(:misc_tags).where(:id => posts(:welcome).id).empty?
185
+ assert_not_empty posts(:welcome).tags
186
+ assert_empty Post.joins(:misc_tags).where(id: posts(:welcome).id)
111
187
  end
112
188
 
113
189
  test "the default scope of the target is applied when joining associations" do
@@ -120,8 +196,8 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
120
196
 
121
197
  test "the default scope of the target is correctly aliased when joining associations" do
122
198
  author = Author.create! name: "Jon"
123
- author.categories.create! name: 'Not Special'
124
- author.special_categories.create! name: 'Special'
199
+ author.categories.create! name: "Not Special"
200
+ author.special_categories.create! name: "Special"
125
201
 
126
202
  categories = author.categories.includes(:special_categorizations).references(:special_categorizations).to_a
127
203
  assert_equal 2, categories.size
@@ -129,8 +205,8 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
129
205
 
130
206
  test "the correct records are loaded when including an aliased association" do
131
207
  author = Author.create! name: "Jon"
132
- author.categories.create! name: 'Not Special'
133
- author.special_categories.create! name: 'Special'
208
+ author.categories.create! name: "Not Special"
209
+ author.special_categories.create! name: "Special"
134
210
 
135
211
  categories = author.categories.eager_load(:special_categorizations).order(:name).to_a
136
212
  assert_equal 0, categories.first.special_categorizations.size