ibm_db 5.1.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 (624) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/ext/Makefile +14 -14
  5. data/ext/extconf.rb +4 -4
  6. data/ext/ibm_db.c +62 -57
  7. data/ext/ibm_db.o +0 -0
  8. data/ext/ibm_db.so +0 -0
  9. data/ext/mkmf.log +11 -11
  10. data/ext/ruby_ibm_db_cli.c +1 -0
  11. data/ext/ruby_ibm_db_cli.o +0 -0
  12. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1463 -1279
  13. data/lib/ibm_db.so +1 -0
  14. data/lib/mswin32/ibm_db.rb +7 -3
  15. data/lib/mswin32/rb2x/i386/ruby25/ibm_db.so +0 -0
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  18. data/test/activejob/destroy_association_async_test.rb +305 -0
  19. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  20. data/test/activejob/helper.rb +15 -0
  21. data/test/assets/schema_dump_5_1.yml +345 -0
  22. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  23. data/test/cases/adapter_test.rb +432 -218
  24. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  25. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  27. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  30. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  31. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  33. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  34. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  35. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  36. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  37. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  38. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  39. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  40. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  41. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  42. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  43. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  44. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  45. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  46. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  47. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  48. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  50. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  52. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  55. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  56. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  57. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  58. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  59. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  60. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  61. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  62. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  63. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  64. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  65. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  66. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  67. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  68. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  69. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  70. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  71. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  72. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  73. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  74. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  75. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  76. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  77. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  78. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  79. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  80. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  81. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  83. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  84. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  85. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  86. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  87. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  88. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  89. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  90. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  91. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  92. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  93. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  94. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  95. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  96. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  97. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  98. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  99. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  100. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  101. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  102. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  103. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  104. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  106. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  107. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  108. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  109. data/test/cases/aggregations_test.rb +14 -12
  110. data/test/cases/annotate_test.rb +46 -0
  111. data/test/cases/ar_schema_test.rb +153 -86
  112. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  113. data/test/cases/arel/attributes/math_test.rb +83 -0
  114. data/test/cases/arel/attributes_test.rb +27 -0
  115. data/test/cases/arel/collectors/bind_test.rb +40 -0
  116. data/test/cases/arel/collectors/composite_test.rb +47 -0
  117. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  118. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  119. data/test/cases/arel/crud_test.rb +65 -0
  120. data/test/cases/arel/delete_manager_test.rb +53 -0
  121. data/test/cases/arel/factory_methods_test.rb +46 -0
  122. data/test/cases/arel/helper.rb +45 -0
  123. data/test/cases/arel/insert_manager_test.rb +241 -0
  124. data/test/cases/arel/nodes/and_test.rb +30 -0
  125. data/test/cases/arel/nodes/as_test.rb +36 -0
  126. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  127. data/test/cases/arel/nodes/bin_test.rb +35 -0
  128. data/test/cases/arel/nodes/binary_test.rb +29 -0
  129. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  130. data/test/cases/arel/nodes/case_test.rb +96 -0
  131. data/test/cases/arel/nodes/casted_test.rb +18 -0
  132. data/test/cases/arel/nodes/comment_test.rb +22 -0
  133. data/test/cases/arel/nodes/count_test.rb +35 -0
  134. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  135. data/test/cases/arel/nodes/descending_test.rb +46 -0
  136. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  137. data/test/cases/arel/nodes/equality_test.rb +62 -0
  138. data/test/cases/arel/nodes/extract_test.rb +43 -0
  139. data/test/cases/arel/nodes/false_test.rb +21 -0
  140. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  141. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  142. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  143. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  144. data/test/cases/arel/nodes/node_test.rb +22 -0
  145. data/test/cases/arel/nodes/not_test.rb +31 -0
  146. data/test/cases/arel/nodes/or_test.rb +36 -0
  147. data/test/cases/arel/nodes/over_test.rb +69 -0
  148. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  149. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  150. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  151. data/test/cases/arel/nodes/sum_test.rb +35 -0
  152. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  153. data/test/cases/arel/nodes/true_test.rb +21 -0
  154. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  155. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  156. data/test/cases/arel/nodes/window_test.rb +81 -0
  157. data/test/cases/arel/nodes_test.rb +34 -0
  158. data/test/cases/arel/select_manager_test.rb +1238 -0
  159. data/test/cases/arel/support/fake_record.rb +135 -0
  160. data/test/cases/arel/table_test.rb +216 -0
  161. data/test/cases/arel/update_manager_test.rb +126 -0
  162. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  163. data/test/cases/arel/visitors/dot_test.rb +90 -0
  164. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  165. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  166. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  167. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  168. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  169. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  170. data/test/cases/associations/callbacks_test.rb +56 -38
  171. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  172. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  173. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  174. data/test/cases/associations/eager_singularization_test.rb +21 -21
  175. data/test/cases/associations/eager_test.rb +559 -415
  176. data/test/cases/associations/extension_test.rb +18 -12
  177. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  178. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  179. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  180. data/test/cases/associations/has_one_associations_test.rb +294 -129
  181. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  182. data/test/cases/associations/inner_join_association_test.rb +114 -38
  183. data/test/cases/associations/inverse_associations_test.rb +606 -398
  184. data/test/cases/associations/join_model_test.rb +158 -148
  185. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  186. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  187. data/test/cases/associations/required_test.rb +35 -10
  188. data/test/cases/associations_test.rb +241 -110
  189. data/test/cases/attribute_methods/read_test.rb +11 -11
  190. data/test/cases/attribute_methods_test.rb +413 -298
  191. data/test/cases/attributes_test.rb +145 -27
  192. data/test/cases/autosave_association_test.rb +681 -436
  193. data/test/cases/base_prevent_writes_test.rb +229 -0
  194. data/test/cases/base_test.rb +599 -542
  195. data/test/cases/batches_test.rb +288 -82
  196. data/test/cases/binary_test.rb +26 -31
  197. data/test/cases/bind_parameter_test.rb +194 -21
  198. data/test/cases/boolean_test.rb +52 -0
  199. data/test/cases/cache_key_test.rb +110 -5
  200. data/test/cases/calculations_test.rb +740 -177
  201. data/test/cases/callbacks_test.rb +74 -207
  202. data/test/cases/clone_test.rb +15 -10
  203. data/test/cases/coders/json_test.rb +2 -0
  204. data/test/cases/coders/yaml_column_test.rb +16 -13
  205. data/test/cases/collection_cache_key_test.rb +177 -20
  206. data/test/cases/column_alias_test.rb +9 -7
  207. data/test/cases/column_definition_test.rb +10 -68
  208. data/test/cases/comment_test.rb +166 -107
  209. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  210. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  211. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  212. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  213. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  214. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  215. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  217. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  218. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  219. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  220. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  221. data/test/cases/connection_management_test.rb +13 -11
  222. data/test/cases/connection_pool_test.rb +316 -83
  223. data/test/cases/core_test.rb +82 -58
  224. data/test/cases/counter_cache_test.rb +204 -50
  225. data/test/cases/custom_locking_test.rb +5 -3
  226. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  227. data/test/cases/database_configurations/resolver_test.rb +150 -0
  228. data/test/cases/database_configurations_test.rb +145 -0
  229. data/test/cases/database_selector_test.rb +296 -0
  230. data/test/cases/database_statements_test.rb +18 -16
  231. data/test/cases/date_test.rb +8 -16
  232. data/test/cases/date_time_precision_test.rb +100 -78
  233. data/test/cases/date_time_test.rb +23 -8
  234. data/test/cases/defaults_test.rb +106 -71
  235. data/test/cases/delegated_type_test.rb +57 -0
  236. data/test/cases/dirty_test.rb +419 -223
  237. data/test/cases/disconnected_test.rb +6 -6
  238. data/test/cases/dup_test.rb +54 -27
  239. data/test/cases/enum_test.rb +461 -82
  240. data/test/cases/errors_test.rb +7 -7
  241. data/test/cases/explain_subscriber_test.rb +17 -15
  242. data/test/cases/explain_test.rb +11 -19
  243. data/test/cases/filter_attributes_test.rb +153 -0
  244. data/test/cases/finder_respond_to_test.rb +14 -14
  245. data/test/cases/finder_test.rb +669 -287
  246. data/test/cases/fixture_set/file_test.rb +34 -38
  247. data/test/cases/fixtures_test.rb +833 -176
  248. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  249. data/test/cases/habtm_destroy_order_test.rb +25 -25
  250. data/test/cases/helper.rb +78 -49
  251. data/test/cases/hot_compatibility_test.rb +33 -32
  252. data/test/cases/i18n_test.rb +18 -17
  253. data/test/cases/inheritance_test.rb +180 -115
  254. data/test/cases/insert_all_test.rb +489 -0
  255. data/test/cases/instrumentation_test.rb +101 -0
  256. data/test/cases/integration_test.rb +119 -31
  257. data/test/cases/invalid_connection_test.rb +18 -16
  258. data/test/cases/invertible_migration_test.rb +183 -43
  259. data/test/cases/json_attribute_test.rb +35 -0
  260. data/test/cases/json_serialization_test.rb +57 -58
  261. data/test/cases/json_shared_test_cases.rb +290 -0
  262. data/test/cases/locking_test.rb +413 -119
  263. data/test/cases/log_subscriber_test.rb +68 -26
  264. data/test/cases/marshal_serialization_test.rb +39 -0
  265. data/test/cases/migration/change_schema_test.rb +118 -72
  266. data/test/cases/migration/change_table_test.rb +138 -30
  267. data/test/cases/migration/check_constraint_test.rb +162 -0
  268. data/test/cases/migration/column_attributes_test.rb +45 -35
  269. data/test/cases/migration/column_positioning_test.rb +18 -6
  270. data/test/cases/migration/columns_test.rb +93 -77
  271. data/test/cases/migration/command_recorder_test.rb +121 -34
  272. data/test/cases/migration/compatibility_test.rb +578 -23
  273. data/test/cases/migration/create_join_table_test.rb +35 -25
  274. data/test/cases/migration/foreign_key_test.rb +503 -284
  275. data/test/cases/migration/helper.rb +4 -3
  276. data/test/cases/migration/index_test.rb +119 -70
  277. data/test/cases/migration/logger_test.rb +9 -6
  278. data/test/cases/migration/pending_migrations_test.rb +88 -34
  279. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  280. data/test/cases/migration/references_index_test.rb +38 -19
  281. data/test/cases/migration/references_statements_test.rb +15 -14
  282. data/test/cases/migration/rename_table_test.rb +53 -30
  283. data/test/cases/migration_test.rb +637 -269
  284. data/test/cases/migrator_test.rb +191 -135
  285. data/test/cases/mixin_test.rb +7 -11
  286. data/test/cases/modules_test.rb +36 -34
  287. data/test/cases/multi_db_migrator_test.rb +223 -0
  288. data/test/cases/multiparameter_attributes_test.rb +60 -33
  289. data/test/cases/multiple_db_test.rb +16 -22
  290. data/test/cases/nested_attributes_test.rb +341 -320
  291. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  292. data/test/cases/null_relation_test.rb +84 -0
  293. data/test/cases/numeric_data_test.rb +93 -0
  294. data/test/cases/persistence_test.rb +361 -269
  295. data/test/cases/pooled_connections_test.rb +18 -26
  296. data/test/cases/prepared_statement_status_test.rb +48 -0
  297. data/test/cases/primary_keys_test.rb +210 -104
  298. data/test/cases/query_cache_test.rb +610 -141
  299. data/test/cases/quoting_test.rb +132 -31
  300. data/test/cases/readonly_test.rb +49 -48
  301. data/test/cases/reaper_test.rb +146 -32
  302. data/test/cases/reflection_test.rb +167 -156
  303. data/test/cases/relation/delegation_test.rb +49 -36
  304. data/test/cases/relation/delete_all_test.rb +117 -0
  305. data/test/cases/relation/merging_test.rb +319 -42
  306. data/test/cases/relation/mutation_test.rb +55 -93
  307. data/test/cases/relation/or_test.rb +129 -29
  308. data/test/cases/relation/predicate_builder_test.rb +21 -6
  309. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  310. data/test/cases/relation/select_test.rb +67 -0
  311. data/test/cases/relation/update_all_test.rb +317 -0
  312. data/test/cases/relation/where_chain_test.rb +68 -32
  313. data/test/cases/relation/where_clause_test.rb +136 -61
  314. data/test/cases/relation/where_test.rb +155 -48
  315. data/test/cases/relation_test.rb +266 -112
  316. data/test/cases/relations_test.rb +969 -744
  317. data/test/cases/reload_models_test.rb +13 -9
  318. data/test/cases/reserved_word_test.rb +141 -0
  319. data/test/cases/result_test.rb +68 -17
  320. data/test/cases/sanitize_test.rb +87 -71
  321. data/test/cases/schema_dumper_test.rb +221 -128
  322. data/test/cases/schema_loading_test.rb +3 -2
  323. data/test/cases/scoping/default_scoping_test.rb +185 -144
  324. data/test/cases/scoping/named_scoping_test.rb +177 -89
  325. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  326. data/test/cases/secure_token_test.rb +18 -3
  327. data/test/cases/serialization_test.rb +30 -28
  328. data/test/cases/serialized_attribute_test.rb +133 -42
  329. data/test/cases/signed_id_test.rb +168 -0
  330. data/test/cases/statement_cache_test.rb +41 -24
  331. data/test/cases/statement_invalid_test.rb +42 -0
  332. data/test/cases/store_test.rb +180 -55
  333. data/test/cases/strict_loading_test.rb +473 -0
  334. data/test/cases/suppressor_test.rb +26 -12
  335. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  336. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  337. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  338. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  339. data/test/cases/test_case.rb +51 -40
  340. data/test/cases/test_databases_test.rb +79 -0
  341. data/test/cases/test_fixtures_test.rb +79 -19
  342. data/test/cases/time_precision_test.rb +98 -76
  343. data/test/cases/timestamp_test.rb +102 -99
  344. data/test/cases/touch_later_test.rb +12 -10
  345. data/test/cases/transaction_callbacks_test.rb +344 -90
  346. data/test/cases/transaction_isolation_test.rb +12 -12
  347. data/test/cases/transactions_test.rb +612 -162
  348. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  349. data/test/cases/type/date_time_test.rb +4 -2
  350. data/test/cases/type/integer_test.rb +4 -2
  351. data/test/cases/type/string_test.rb +10 -8
  352. data/test/cases/type/time_test.rb +28 -0
  353. data/test/cases/type/type_map_test.rb +29 -28
  354. data/test/cases/type/unsigned_integer_test.rb +19 -0
  355. data/test/cases/type_test.rb +2 -0
  356. data/test/cases/types_test.rb +3 -1
  357. data/test/cases/unconnected_test.rb +14 -1
  358. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  359. data/test/cases/validations/absence_validation_test.rb +19 -17
  360. data/test/cases/validations/association_validation_test.rb +30 -28
  361. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  362. data/test/cases/validations/i18n_validation_test.rb +22 -21
  363. data/test/cases/validations/length_validation_test.rb +34 -33
  364. data/test/cases/validations/numericality_validation_test.rb +181 -0
  365. data/test/cases/validations/presence_validation_test.rb +21 -19
  366. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  367. data/test/cases/validations_repair_helper.rb +2 -0
  368. data/test/cases/validations_test.rb +61 -26
  369. data/test/cases/view_test.rb +122 -116
  370. data/test/cases/yaml_serialization_test.rb +79 -34
  371. data/test/config.example.yml +19 -19
  372. data/test/config.rb +3 -1
  373. data/test/config.yml +16 -6
  374. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  375. data/test/fixtures/author_addresses.yml +1 -8
  376. data/test/fixtures/authors.yml +1 -7
  377. data/test/fixtures/binaries.yml +4 -0
  378. data/test/fixtures/books.yml +9 -2
  379. data/test/fixtures/categories_posts.yml +3 -0
  380. data/test/fixtures/citations.yml +5 -0
  381. data/test/fixtures/comments.yml +7 -0
  382. data/test/fixtures/companies.yml +5 -0
  383. data/test/fixtures/computers.yml +2 -0
  384. data/test/fixtures/customers.yml +10 -1
  385. data/test/fixtures/developers.yml +1 -1
  386. data/test/fixtures/essays.yml +10 -0
  387. data/test/fixtures/faces.yml +3 -3
  388. data/test/fixtures/humans.yml +5 -0
  389. data/test/fixtures/interests.yml +7 -7
  390. data/test/fixtures/memberships.yml +7 -0
  391. data/test/fixtures/minimalistics.yml +3 -0
  392. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  393. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  394. data/test/fixtures/naked/yml/parrots.yml +1 -0
  395. data/test/fixtures/other_books.yml +26 -0
  396. data/test/fixtures/other_posts.yml +1 -0
  397. data/test/fixtures/parrots.yml +7 -1
  398. data/test/fixtures/pirates.yml +3 -0
  399. data/test/fixtures/posts.yml +11 -3
  400. data/test/fixtures/readers.yml +6 -0
  401. data/test/fixtures/reserved_words/values.yml +2 -2
  402. data/test/fixtures/sponsors.yml +3 -0
  403. data/test/fixtures/strict_zines.yml +2 -0
  404. data/test/fixtures/subscribers.yml +1 -1
  405. data/test/fixtures/tasks.yml +1 -1
  406. data/test/fixtures/warehouse-things.yml +3 -0
  407. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  408. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  409. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  410. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  411. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  412. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  413. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  414. data/test/migrations/rename/1_we_need_things.rb +2 -0
  415. data/test/migrations/rename/2_rename_things.rb +2 -0
  416. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  417. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  418. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  419. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  420. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  421. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  424. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  425. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  426. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  427. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  428. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  429. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  431. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  432. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  434. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  435. data/test/models/account.rb +46 -0
  436. data/test/models/admin/account.rb +3 -1
  437. data/test/models/admin/randomly_named_c1.rb +2 -0
  438. data/test/models/admin/user.rb +16 -8
  439. data/test/models/admin.rb +4 -2
  440. data/test/models/aircraft.rb +3 -1
  441. data/test/models/arunit2_model.rb +2 -0
  442. data/test/models/author.rb +153 -102
  443. data/test/models/auto_id.rb +2 -0
  444. data/test/models/autoloadable/extra_firm.rb +2 -0
  445. data/test/models/binary.rb +3 -1
  446. data/test/models/binary_field.rb +6 -0
  447. data/test/models/bird.rb +13 -1
  448. data/test/models/book.rb +14 -4
  449. data/test/models/book_destroy_async.rb +24 -0
  450. data/test/models/boolean.rb +5 -0
  451. data/test/models/bulb.rb +13 -4
  452. data/test/models/cake_designer.rb +2 -0
  453. data/test/models/car.rb +17 -10
  454. data/test/models/carrier.rb +2 -0
  455. data/test/models/cart.rb +5 -0
  456. data/test/models/cat.rb +2 -0
  457. data/test/models/categorization.rb +8 -6
  458. data/test/models/category.rb +28 -16
  459. data/test/models/chef.rb +2 -0
  460. data/test/models/citation.rb +5 -1
  461. data/test/models/club.rb +13 -10
  462. data/test/models/college.rb +4 -2
  463. data/test/models/column.rb +2 -0
  464. data/test/models/column_name.rb +2 -0
  465. data/test/models/comment.rb +32 -10
  466. data/test/models/company.rb +102 -106
  467. data/test/models/company_in_module.rb +27 -26
  468. data/test/models/computer.rb +3 -1
  469. data/test/models/contact.rb +15 -13
  470. data/test/models/content.rb +5 -3
  471. data/test/models/contract.rb +21 -3
  472. data/test/models/country.rb +2 -4
  473. data/test/models/course.rb +3 -1
  474. data/test/models/customer.rb +10 -8
  475. data/test/models/customer_carrier.rb +2 -0
  476. data/test/models/dashboard.rb +2 -0
  477. data/test/models/default.rb +2 -0
  478. data/test/models/department.rb +2 -0
  479. data/test/models/destroy_async_parent.rb +15 -0
  480. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  481. data/test/models/developer.rb +152 -85
  482. data/test/models/dl_keyed_belongs_to.rb +13 -0
  483. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  484. data/test/models/dl_keyed_has_many.rb +5 -0
  485. data/test/models/dl_keyed_has_many_through.rb +5 -0
  486. data/test/models/dl_keyed_has_one.rb +5 -0
  487. data/test/models/dl_keyed_join.rb +10 -0
  488. data/test/models/dog.rb +2 -0
  489. data/test/models/dog_lover.rb +2 -0
  490. data/test/models/doubloon.rb +3 -1
  491. data/test/models/drink_designer.rb +17 -0
  492. data/test/models/edge.rb +4 -2
  493. data/test/models/electron.rb +2 -0
  494. data/test/models/engine.rb +3 -2
  495. data/test/models/entrant.rb +2 -0
  496. data/test/models/entry.rb +5 -0
  497. data/test/models/essay.rb +6 -3
  498. data/test/models/essay_destroy_async.rb +12 -0
  499. data/test/models/event.rb +3 -1
  500. data/test/models/eye.rb +5 -3
  501. data/test/models/face.rb +14 -6
  502. data/test/models/family.rb +6 -0
  503. data/test/models/family_tree.rb +6 -0
  504. data/test/models/friendship.rb +5 -3
  505. data/test/models/frog.rb +8 -0
  506. data/test/models/guid.rb +3 -1
  507. data/test/models/guitar.rb +2 -0
  508. data/test/models/hotel.rb +5 -3
  509. data/test/models/human.rb +39 -0
  510. data/test/models/image.rb +3 -1
  511. data/test/models/interest.rb +14 -3
  512. data/test/models/invoice.rb +4 -2
  513. data/test/models/item.rb +3 -1
  514. data/test/models/job.rb +5 -3
  515. data/test/models/joke.rb +4 -2
  516. data/test/models/keyboard.rb +3 -1
  517. data/test/models/legacy_thing.rb +2 -0
  518. data/test/models/lesson.rb +2 -0
  519. data/test/models/line_item.rb +3 -1
  520. data/test/models/liquid.rb +2 -0
  521. data/test/models/matey.rb +3 -1
  522. data/test/models/measurement.rb +4 -0
  523. data/test/models/member.rb +23 -20
  524. data/test/models/member_detail.rb +3 -0
  525. data/test/models/member_type.rb +2 -0
  526. data/test/models/membership.rb +4 -1
  527. data/test/models/mentor.rb +3 -1
  528. data/test/models/message.rb +5 -0
  529. data/test/models/minimalistic.rb +2 -0
  530. data/test/models/minivan.rb +3 -2
  531. data/test/models/mixed_case_monkey.rb +3 -1
  532. data/test/models/molecule.rb +2 -0
  533. data/test/models/mouse.rb +6 -0
  534. data/test/models/movie.rb +2 -0
  535. data/test/models/node.rb +4 -2
  536. data/test/models/non_primary_key.rb +2 -0
  537. data/test/models/notification.rb +2 -0
  538. data/test/models/numeric_data.rb +12 -0
  539. data/test/models/order.rb +4 -2
  540. data/test/models/organization.rb +9 -7
  541. data/test/models/other_dog.rb +3 -1
  542. data/test/models/owner.rb +6 -4
  543. data/test/models/parrot.rb +12 -4
  544. data/test/models/person.rb +59 -54
  545. data/test/models/personal_legacy_thing.rb +3 -1
  546. data/test/models/pet.rb +4 -2
  547. data/test/models/pet_treasure.rb +2 -0
  548. data/test/models/pirate.rb +67 -43
  549. data/test/models/possession.rb +3 -1
  550. data/test/models/post.rb +184 -86
  551. data/test/models/price_estimate.rb +11 -1
  552. data/test/models/professor.rb +3 -1
  553. data/test/models/project.rb +14 -12
  554. data/test/models/publisher/article.rb +2 -0
  555. data/test/models/publisher/magazine.rb +2 -0
  556. data/test/models/publisher.rb +2 -0
  557. data/test/models/randomly_named_c1.rb +2 -0
  558. data/test/models/rating.rb +5 -1
  559. data/test/models/reader.rb +7 -5
  560. data/test/models/recipe.rb +2 -0
  561. data/test/models/record.rb +2 -0
  562. data/test/models/reference.rb +6 -3
  563. data/test/models/reply.rb +39 -21
  564. data/test/models/room.rb +6 -0
  565. data/test/models/section.rb +6 -0
  566. data/test/models/seminar.rb +6 -0
  567. data/test/models/session.rb +6 -0
  568. data/test/models/ship.rb +12 -9
  569. data/test/models/ship_part.rb +5 -3
  570. data/test/models/shop.rb +4 -2
  571. data/test/models/shop_account.rb +2 -0
  572. data/test/models/speedometer.rb +2 -0
  573. data/test/models/sponsor.rb +8 -5
  574. data/test/models/squeak.rb +6 -0
  575. data/test/models/strict_zine.rb +7 -0
  576. data/test/models/string_key_object.rb +2 -0
  577. data/test/models/student.rb +2 -0
  578. data/test/models/subscriber.rb +4 -2
  579. data/test/models/subscription.rb +5 -1
  580. data/test/models/tag.rb +6 -3
  581. data/test/models/tagging.rb +13 -6
  582. data/test/models/task.rb +2 -0
  583. data/test/models/topic.rb +54 -19
  584. data/test/models/toy.rb +4 -0
  585. data/test/models/traffic_light.rb +2 -0
  586. data/test/models/treasure.rb +5 -3
  587. data/test/models/treaty.rb +2 -4
  588. data/test/models/tree.rb +2 -0
  589. data/test/models/tuning_peg.rb +2 -0
  590. data/test/models/tyre.rb +2 -0
  591. data/test/models/user.rb +12 -4
  592. data/test/models/uuid_child.rb +2 -0
  593. data/test/models/uuid_item.rb +2 -0
  594. data/test/models/uuid_parent.rb +2 -0
  595. data/test/models/vegetables.rb +12 -3
  596. data/test/models/vertex.rb +6 -4
  597. data/test/models/warehouse_thing.rb +2 -0
  598. data/test/models/wheel.rb +3 -1
  599. data/test/models/without_table.rb +3 -1
  600. data/test/models/zine.rb +3 -1
  601. data/test/schema/mysql2_specific_schema.rb +49 -35
  602. data/test/schema/oracle_specific_schema.rb +13 -15
  603. data/test/schema/postgresql_specific_schema.rb +51 -40
  604. data/test/schema/schema.rb +334 -154
  605. data/test/schema/sqlite_specific_schema.rb +9 -16
  606. data/test/support/config.rb +26 -26
  607. data/test/support/connection.rb +14 -8
  608. data/test/support/connection_helper.rb +3 -1
  609. data/test/support/ddl_helper.rb +2 -0
  610. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  620. data/test/support/schema_dumping_helper.rb +2 -0
  621. data/test/support/stubs/strong_parameters.rb +40 -0
  622. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  624. metadata +196 -11
@@ -1,85 +1,89 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/developer'
3
- require 'models/computer'
4
- require 'models/project'
5
- require 'models/company'
6
- require 'models/course'
7
- require 'models/customer'
8
- require 'models/order'
9
- require 'models/categorization'
10
- require 'models/category'
11
- require 'models/post'
12
- require 'models/author'
13
- require 'models/tag'
14
- require 'models/tagging'
15
- require 'models/parrot'
16
- require 'models/person'
17
- require 'models/pirate'
18
- require 'models/professor'
19
- require 'models/treasure'
20
- require 'models/price_estimate'
21
- require 'models/club'
22
- require 'models/user'
23
- require 'models/member'
24
- require 'models/membership'
25
- require 'models/sponsor'
26
- require 'models/country'
27
- require 'models/treaty'
28
- require 'models/vertex'
29
- require 'models/publisher'
30
- require 'models/publisher/article'
31
- require 'models/publisher/magazine'
32
- require 'active_support/core_ext/string/conversions'
4
+ require "models/developer"
5
+ require "models/computer"
6
+ require "models/project"
7
+ require "models/company"
8
+ require "models/course"
9
+ require "models/customer"
10
+ require "models/order"
11
+ require "models/categorization"
12
+ require "models/category"
13
+ require "models/post"
14
+ require "models/author"
15
+ require "models/tag"
16
+ require "models/tagging"
17
+ require "models/parrot"
18
+ require "models/person"
19
+ require "models/pirate"
20
+ require "models/professor"
21
+ require "models/treasure"
22
+ require "models/price_estimate"
23
+ require "models/club"
24
+ require "models/user"
25
+ require "models/member"
26
+ require "models/membership"
27
+ require "models/sponsor"
28
+ require "models/lesson"
29
+ require "models/student"
30
+ require "models/country"
31
+ require "models/treaty"
32
+ require "models/vertex"
33
+ require "models/publisher"
34
+ require "models/publisher/article"
35
+ require "models/publisher/magazine"
36
+ require "active_support/core_ext/string/conversions"
33
37
 
34
38
  class ProjectWithAfterCreateHook < ActiveRecord::Base
35
- self.table_name = 'projects'
39
+ self.table_name = "projects"
36
40
  has_and_belongs_to_many :developers,
37
- :class_name => "DeveloperForProjectWithAfterCreateHook",
38
- :join_table => "developers_projects",
39
- :foreign_key => "project_id",
40
- :association_foreign_key => "developer_id"
41
+ class_name: "DeveloperForProjectWithAfterCreateHook",
42
+ join_table: "developers_projects",
43
+ foreign_key: "project_id",
44
+ association_foreign_key: "developer_id"
41
45
 
42
46
  after_create :add_david
43
47
 
44
48
  def add_david
45
- david = DeveloperForProjectWithAfterCreateHook.find_by_name('David')
49
+ david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
46
50
  david.projects << self
47
51
  end
48
52
  end
49
53
 
50
54
  class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
51
- self.table_name = 'developers'
55
+ self.table_name = "developers"
52
56
  has_and_belongs_to_many :projects,
53
- :class_name => "ProjectWithAfterCreateHook",
54
- :join_table => "developers_projects",
55
- :association_foreign_key => "project_id",
56
- :foreign_key => "developer_id"
57
+ class_name: "ProjectWithAfterCreateHook",
58
+ join_table: "developers_projects",
59
+ association_foreign_key: "project_id",
60
+ foreign_key: "developer_id"
57
61
  end
58
62
 
59
63
  class ProjectWithSymbolsForKeys < ActiveRecord::Base
60
- self.table_name = 'projects'
64
+ self.table_name = "projects"
61
65
  has_and_belongs_to_many :developers,
62
- :class_name => "DeveloperWithSymbolsForKeys",
63
- :join_table => :developers_projects,
64
- :foreign_key => :project_id,
65
- :association_foreign_key => "developer_id"
66
+ class_name: "DeveloperWithSymbolsForKeys",
67
+ join_table: :developers_projects,
68
+ foreign_key: :project_id,
69
+ association_foreign_key: "developer_id"
66
70
  end
67
71
 
68
72
  class DeveloperWithSymbolsForKeys < ActiveRecord::Base
69
- self.table_name = 'developers'
73
+ self.table_name = "developers"
70
74
  has_and_belongs_to_many :projects,
71
- :class_name => "ProjectWithSymbolsForKeys",
72
- :join_table => :developers_projects,
73
- :association_foreign_key => :project_id,
74
- :foreign_key => "developer_id"
75
+ class_name: "ProjectWithSymbolsForKeys",
76
+ join_table: :developers_projects,
77
+ association_foreign_key: :project_id,
78
+ foreign_key: "developer_id"
75
79
  end
76
80
 
77
81
  class SubDeveloper < Developer
78
- self.table_name = 'developers'
82
+ self.table_name = "developers"
79
83
  has_and_belongs_to_many :special_projects,
80
- :join_table => 'developers_projects',
81
- :foreign_key => "project_id",
82
- :association_foreign_key => "developer_id"
84
+ join_table: "developers_projects",
85
+ foreign_key: "project_id",
86
+ association_foreign_key: "developer_id"
83
87
  end
84
88
 
85
89
  class DeveloperWithSymbolClassName < Developer
@@ -89,7 +93,7 @@ end
89
93
  class DeveloperWithExtendOption < Developer
90
94
  module NamedExtension
91
95
  def category
92
- 'sns'
96
+ "sns"
93
97
  end
94
98
  end
95
99
 
@@ -97,27 +101,42 @@ class DeveloperWithExtendOption < Developer
97
101
  end
98
102
 
99
103
  class ProjectUnscopingDavidDefaultScope < ActiveRecord::Base
100
- self.table_name = 'projects'
101
- has_and_belongs_to_many :developers, -> { unscope(where: 'name') },
104
+ self.table_name = "projects"
105
+ has_and_belongs_to_many :developers, -> { unscope(where: "name") },
102
106
  class_name: "LazyBlockDeveloperCalledDavid",
103
107
  join_table: "developers_projects",
104
108
  foreign_key: "project_id",
105
109
  association_foreign_key: "developer_id"
106
110
  end
107
111
 
112
+ class Kitchen < ActiveRecord::Base
113
+ has_one :sink
114
+ end
115
+
116
+ class Sink < ActiveRecord::Base
117
+ has_and_belongs_to_many :sources, join_table: :edges
118
+ belongs_to :kitchen
119
+ accepts_nested_attributes_for :kitchen
120
+ end
121
+
122
+ class Source < ActiveRecord::Base
123
+ self.table_name = "humans"
124
+ has_and_belongs_to_many :sinks, join_table: :edges
125
+ end
126
+
108
127
  class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
109
128
  fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
110
129
  :parrots, :pirates, :parrots_pirates, :treasures, :price_estimates, :tags, :taggings, :computers
111
130
 
112
131
  def setup_data_for_habtm_case
113
- ActiveRecord::Base.connection.execute('delete from countries_treaties')
132
+ ActiveRecord::Base.connection.execute("delete from countries_treaties")
114
133
 
115
- country = Country.new(:name => 'India')
116
- country.country_id = 'c1'
134
+ country = Country.new(name: "India")
135
+ country.country_id = "c1"
117
136
  country.save!
118
137
 
119
- treaty = Treaty.new(:name => 'peace')
120
- treaty.treaty_id = 't1'
138
+ treaty = Treaty.new(name: "peace")
139
+ treaty.treaty_id = "t1"
121
140
  country.treaties << treaty
122
141
  end
123
142
 
@@ -131,29 +150,29 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
131
150
  setup_data_for_habtm_case
132
151
 
133
152
  con = ActiveRecord::Base.connection
134
- sql = 'select * from countries_treaties'
153
+ sql = "select * from countries_treaties"
135
154
  record = con.select_rows(sql).last
136
- assert_equal 'c1', record[0]
137
- assert_equal 't1', record[1]
155
+ assert_equal "c1", record[0]
156
+ assert_equal "t1", record[1]
138
157
  end
139
158
 
140
159
  def test_proper_usage_of_primary_keys_and_join_table
141
160
  setup_data_for_habtm_case
142
161
 
143
- assert_equal 'country_id', Country.primary_key
144
- assert_equal 'treaty_id', Treaty.primary_key
162
+ assert_equal "country_id", Country.primary_key
163
+ assert_equal "treaty_id", Treaty.primary_key
145
164
 
146
165
  country = Country.first
147
166
  assert_equal 1, country.treaties.count
148
167
  end
149
168
 
150
169
  def test_join_table_composite_primary_key_should_not_warn
151
- country = Country.new(:name => 'India')
152
- country.country_id = 'c1'
170
+ country = Country.new(name: "India")
171
+ country.country_id = "c1"
153
172
  country.save!
154
173
 
155
- treaty = Treaty.new(:name => 'peace')
156
- treaty.treaty_id = 't1'
174
+ treaty = Treaty.new(name: "peace")
175
+ treaty.treaty_id = "t1"
157
176
  warning = capture(:stderr) do
158
177
  country.treaties << treaty
159
178
  end
@@ -163,13 +182,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
163
182
  def test_has_and_belongs_to_many
164
183
  david = Developer.find(1)
165
184
 
166
- assert !david.projects.empty?
185
+ assert_not_empty david.projects
167
186
  assert_equal 2, david.projects.size
168
187
 
169
188
  active_record = Project.find(1)
170
- assert !active_record.developers.empty?
189
+ assert_not_empty active_record.developers
171
190
  assert_equal 3, active_record.developers.size
172
- assert active_record.developers.include?(david)
191
+ assert_includes active_record.developers, david
173
192
  end
174
193
 
175
194
  def test_adding_single
@@ -245,12 +264,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
245
264
  no_of_projects = Project.count
246
265
  aredridel = Developer.new("name" => "Aredridel")
247
266
  aredridel.projects.concat([Project.find(1), p = Project.new("name" => "Projekt")])
248
- assert !aredridel.persisted?
249
- assert !p.persisted?
267
+ assert_not_predicate aredridel, :persisted?
268
+ assert_not_predicate p, :persisted?
250
269
  assert aredridel.save
251
- assert aredridel.persisted?
252
- assert_equal no_of_devels+1, Developer.count
253
- assert_equal no_of_projects+1, Project.count
270
+ assert_predicate aredridel, :persisted?
271
+ assert_equal no_of_devels + 1, Developer.count
272
+ assert_equal no_of_projects + 1, Project.count
254
273
  assert_equal 2, aredridel.projects.size
255
274
  assert_equal 2, aredridel.projects.reload.size
256
275
  end
@@ -258,7 +277,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
258
277
  def test_habtm_saving_multiple_relationships
259
278
  new_project = Project.new("name" => "Grimetime")
260
279
  amount_of_developers = 4
261
- developers = (0...amount_of_developers).collect {|i| Developer.create(:name => "JME #{i}") }.reverse
280
+ developers = (0...amount_of_developers).reverse_each.map { |i| Developer.create(name: "JME #{i}") }
262
281
 
263
282
  new_project.developer_ids = [developers[0].id, developers[1].id]
264
283
  new_project.developers_with_callback_ids = [developers[2].id, developers[3].id]
@@ -283,54 +302,55 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
283
302
  end
284
303
 
285
304
  def test_habtm_collection_size_from_params
286
- devel = Developer.new({
305
+ devel = Developer.new(
287
306
  projects_attributes: {
288
- '0' => {}
289
- }
290
- })
307
+ "0" => {}
308
+ })
291
309
 
292
310
  assert_equal 1, devel.projects.size
293
311
  end
294
312
 
295
313
  def test_build
296
314
  devel = Developer.find(1)
297
- proj = assert_no_queries(ignore_none: false) { devel.projects.build("name" => "Projekt") }
298
- assert !devel.projects.loaded?
315
+
316
+ proj = assert_queries(0) { devel.projects.build("name" => "Projekt") }
317
+ assert_not_predicate devel.projects, :loaded?
299
318
 
300
319
  assert_equal devel.projects.last, proj
301
- assert devel.projects.loaded?
320
+ assert_predicate devel.projects, :loaded?
302
321
 
303
- assert !proj.persisted?
322
+ assert_not_predicate proj, :persisted?
304
323
  devel.save
305
- assert proj.persisted?
324
+ assert_predicate proj, :persisted?
306
325
  assert_equal devel.projects.last, proj
307
326
  assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
308
327
  end
309
328
 
310
329
  def test_new_aliased_to_build
311
330
  devel = Developer.find(1)
312
- proj = assert_no_queries(ignore_none: false) { devel.projects.new("name" => "Projekt") }
313
- assert !devel.projects.loaded?
331
+
332
+ proj = assert_queries(0) { devel.projects.new("name" => "Projekt") }
333
+ assert_not_predicate devel.projects, :loaded?
314
334
 
315
335
  assert_equal devel.projects.last, proj
316
- assert devel.projects.loaded?
336
+ assert_predicate devel.projects, :loaded?
317
337
 
318
- assert !proj.persisted?
338
+ assert_not_predicate proj, :persisted?
319
339
  devel.save
320
- assert proj.persisted?
340
+ assert_predicate proj, :persisted?
321
341
  assert_equal devel.projects.last, proj
322
342
  assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
323
343
  end
324
344
 
325
345
  def test_build_by_new_record
326
- devel = Developer.new(:name => "Marcel", :salary => 75000)
327
- devel.projects.build(:name => "Make bed")
328
- proj2 = devel.projects.build(:name => "Lie in it")
346
+ devel = Developer.new(name: "Marcel", salary: 75000)
347
+ devel.projects.build(name: "Make bed")
348
+ proj2 = devel.projects.build(name: "Lie in it")
329
349
  assert_equal devel.projects.last, proj2
330
- assert !proj2.persisted?
350
+ assert_not_predicate proj2, :persisted?
331
351
  devel.save
332
- assert devel.persisted?
333
- assert proj2.persisted?
352
+ assert_predicate devel, :persisted?
353
+ assert_predicate proj2, :persisted?
334
354
  assert_equal devel.projects.last, proj2
335
355
  assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
336
356
  end
@@ -338,40 +358,27 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
338
358
  def test_create
339
359
  devel = Developer.find(1)
340
360
  proj = devel.projects.create("name" => "Projekt")
341
- assert !devel.projects.loaded?
361
+ assert_not_predicate devel.projects, :loaded?
342
362
 
343
363
  assert_equal devel.projects.last, proj
344
- assert !devel.projects.loaded?
364
+ assert_not_predicate devel.projects, :loaded?
345
365
 
346
- assert proj.persisted?
366
+ assert_predicate proj, :persisted?
347
367
  assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
348
368
  end
349
369
 
350
- def test_create_by_new_record
351
- devel = Developer.new(:name => "Marcel", :salary => 75000)
352
- devel.projects.build(:name => "Make bed")
353
- proj2 = devel.projects.build(:name => "Lie in it")
354
- assert_equal devel.projects.last, proj2
355
- assert !proj2.persisted?
356
- devel.save
357
- assert devel.persisted?
358
- assert proj2.persisted?
359
- assert_equal devel.projects.last, proj2
360
- assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
361
- end
362
-
363
370
  def test_creation_respects_hash_condition
364
371
  # in Oracle '' is saved as null therefore need to save ' ' in not null column
365
- post = categories(:general).post_with_conditions.build(:body => ' ')
372
+ post = categories(:general).post_with_conditions.build(body: " ")
366
373
 
367
- assert post.save
368
- assert_equal 'Yet Another Testing Title', post.title
374
+ assert post.save
375
+ assert_equal "Yet Another Testing Title", post.title
369
376
 
370
377
  # in Oracle '' is saved as null therefore need to save ' ' in not null column
371
- another_post = categories(:general).post_with_conditions.create(:body => ' ')
378
+ another_post = categories(:general).post_with_conditions.create(body: " ")
372
379
 
373
- assert another_post.persisted?
374
- assert_equal 'Yet Another Testing Title', another_post.title
380
+ assert_predicate another_post, :persisted?
381
+ assert_equal "Yet Another Testing Title", another_post.title
375
382
  end
376
383
 
377
384
  def test_distinct_after_the_fact
@@ -380,7 +387,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
380
387
  dev.projects << projects(:active_record)
381
388
 
382
389
  assert_equal 3, dev.projects.size
383
- assert_equal 1, dev.projects.distinct.size
390
+ assert_equal 1, dev.projects.uniq.size
384
391
  end
385
392
 
386
393
  def test_distinct_before_the_fact
@@ -438,10 +445,10 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
438
445
 
439
446
  def test_removing_associations_on_destroy
440
447
  david = DeveloperWithBeforeDestroyRaise.find(1)
441
- assert !david.projects.empty?
448
+ assert_not_empty david.projects
442
449
  david.destroy
443
- assert david.projects.empty?
444
- assert DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1").empty?
450
+ assert_empty david.projects
451
+ assert_empty DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1")
445
452
  end
446
453
 
447
454
  def test_destroying
@@ -456,7 +463,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
456
463
  end
457
464
 
458
465
  join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id} AND project_id = #{project.id}")
459
- assert join_records.empty?
466
+ assert_empty join_records
460
467
 
461
468
  assert_equal 1, david.reload.projects.size
462
469
  assert_equal 1, david.projects.reload.size
@@ -472,7 +479,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
472
479
  end
473
480
 
474
481
  join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
475
- assert join_records.empty?
482
+ assert_empty join_records
476
483
 
477
484
  assert_equal 0, david.reload.projects.size
478
485
  assert_equal 0, david.projects.reload.size
@@ -481,23 +488,23 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
481
488
  def test_destroy_all
482
489
  david = Developer.find(1)
483
490
  david.projects.reload
484
- assert !david.projects.empty?
491
+ assert_not_empty david.projects
485
492
 
486
493
  assert_no_difference "Project.count" do
487
494
  david.projects.destroy_all
488
495
  end
489
496
 
490
497
  join_records = Developer.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = #{david.id}")
491
- assert join_records.empty?
498
+ assert_empty join_records
492
499
 
493
- assert david.projects.empty?
494
- assert david.projects.reload.empty?
500
+ assert_empty david.projects
501
+ assert_empty david.projects.reload
495
502
  end
496
503
 
497
504
  def test_destroy_associations_destroys_multiple_associations
498
505
  george = parrots(:george)
499
- assert !george.pirates.empty?
500
- assert !george.treasures.empty?
506
+ assert_not_empty george.pirates
507
+ assert_not_empty george.treasures
501
508
 
502
509
  assert_no_difference "Pirate.count" do
503
510
  assert_no_difference "Treasure.count" do
@@ -506,12 +513,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
506
513
  end
507
514
 
508
515
  join_records = Parrot.connection.select_all("SELECT * FROM parrots_pirates WHERE parrot_id = #{george.id}")
509
- assert join_records.empty?
510
- assert george.pirates.reload.empty?
516
+ assert_empty join_records
517
+ assert_empty george.pirates.reload
511
518
 
512
519
  join_records = Parrot.connection.select_all("SELECT * FROM parrots_treasures WHERE parrot_id = #{george.id}")
513
- assert join_records.empty?
514
- assert george.treasures.reload.empty?
520
+ assert_empty join_records
521
+ assert_empty george.treasures.reload
515
522
  end
516
523
 
517
524
  def test_associations_with_conditions
@@ -543,9 +550,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
543
550
 
544
551
  developer = project.developers.first
545
552
 
546
- assert_no_queries(ignore_none: false) do
547
- assert project.developers.loaded?
548
- assert project.developers.include?(developer)
553
+ assert_queries(0) do
554
+ assert_predicate project.developers, :loaded?
555
+ assert_includes project.developers, developer
549
556
  end
550
557
  end
551
558
 
@@ -554,19 +561,19 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
554
561
  developer = project.developers.first
555
562
 
556
563
  project.reload
557
- assert ! project.developers.loaded?
564
+ assert_not_predicate project.developers, :loaded?
558
565
  assert_queries(1) do
559
- assert project.developers.include?(developer)
566
+ assert_includes project.developers, developer
560
567
  end
561
- assert ! project.developers.loaded?
568
+ assert_not_predicate project.developers, :loaded?
562
569
  end
563
570
 
564
571
  def test_include_returns_false_for_non_matching_record_to_verify_scoping
565
572
  project = projects(:active_record)
566
- developer = Developer.create :name => "Bryan", :salary => 50_000
573
+ developer = Developer.create name: "Bryan", salary: 50_000
567
574
 
568
- assert ! project.developers.loaded?
569
- assert ! project.developers.include?(developer)
575
+ assert_not_predicate project.developers, :loaded?
576
+ assert_not project.developers.include?(developer)
570
577
  end
571
578
 
572
579
  def test_find_with_merged_options
@@ -577,32 +584,32 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
577
584
 
578
585
  def test_dynamic_find_should_respect_association_order
579
586
  # Developers are ordered 'name DESC, id DESC'
580
- high_id_jamis = projects(:active_record).developers.create(:name => 'Jamis')
587
+ high_id_jamis = projects(:active_record).developers.create(name: "Jamis")
581
588
 
582
- assert_equal high_id_jamis, projects(:active_record).developers.merge(:where => "name = 'Jamis'").first
583
- assert_equal high_id_jamis, projects(:active_record).developers.find_by_name('Jamis')
589
+ assert_equal high_id_jamis, projects(:active_record).developers.merge(where: "name = 'Jamis'").first
590
+ assert_equal high_id_jamis, projects(:active_record).developers.find_by_name("Jamis")
584
591
  end
585
592
 
586
593
  def test_find_should_append_to_association_order
587
- ordered_developers = projects(:active_record).developers.order('projects.id')
588
- assert_equal ['developers.name desc, developers.id desc', 'projects.id'], ordered_developers.order_values
594
+ ordered_developers = projects(:active_record).developers.order("projects.id")
595
+ assert_equal ["developers.name desc, developers.id desc", "projects.id"], ordered_developers.order_values
589
596
  end
590
597
 
591
598
  def test_dynamic_find_all_should_respect_readonly_access
592
- projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid?}
599
+ projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid? }
593
600
  projects(:active_record).readonly_developers.each(&:readonly?)
594
601
  end
595
602
 
596
603
  def test_new_with_values_in_collection
597
- jamis = DeveloperForProjectWithAfterCreateHook.find_by_name('Jamis')
598
- david = DeveloperForProjectWithAfterCreateHook.find_by_name('David')
599
- project = ProjectWithAfterCreateHook.new(:name => "Cooking with Bertie")
604
+ jamis = DeveloperForProjectWithAfterCreateHook.find_by_name("Jamis")
605
+ david = DeveloperForProjectWithAfterCreateHook.find_by_name("David")
606
+ project = ProjectWithAfterCreateHook.new(name: "Cooking with Bertie")
600
607
  project.developers << jamis
601
608
  project.save!
602
609
  project.reload
603
610
 
604
- assert project.developers.include?(jamis)
605
- assert project.developers.include?(david)
611
+ assert_includes project.developers, jamis
612
+ assert_includes project.developers, david
606
613
  end
607
614
 
608
615
  def test_find_in_association_with_options
@@ -613,8 +620,8 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
613
620
  end
614
621
 
615
622
  def test_association_with_extend_option
616
- eponine = DeveloperWithExtendOption.create(name: 'Eponine')
617
- assert_equal 'sns', eponine.projects.category
623
+ eponine = DeveloperWithExtendOption.create(name: "Eponine")
624
+ assert_equal "sns", eponine.projects.category
618
625
  end
619
626
 
620
627
  def test_replace_with_less
@@ -629,7 +636,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
629
636
  david.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
630
637
  david.save
631
638
  assert_equal 2, david.projects.length
632
- assert !david.projects.include?(projects(:active_record))
639
+ assert_not_includes david.projects, projects(:active_record)
633
640
  end
634
641
 
635
642
  def test_replace_on_new_object
@@ -647,9 +654,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
647
654
  developer.special_projects << special_project
648
655
  developer.reload
649
656
 
650
- assert developer.projects.include?(special_project)
651
- assert developer.special_projects.include?(special_project)
652
- assert !developer.special_projects.include?(other_project)
657
+ assert_includes developer.projects, special_project
658
+ assert_includes developer.special_projects, special_project
659
+ assert_not_includes developer.special_projects, other_project
653
660
  end
654
661
 
655
662
  def test_symbol_join_table
@@ -659,7 +666,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
659
666
  assert_includes developer.sym_special_projects, sp
660
667
  end
661
668
 
662
- def test_update_attributes_after_push_without_duplicate_join_table_rows
669
+ def test_update_columns_after_push_without_duplicate_join_table_rows
663
670
  developer = Developer.new("name" => "Kano")
664
671
  project = SpecialProject.create("name" => "Special Project")
665
672
  assert developer.save
@@ -690,28 +697,24 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
690
697
  end
691
698
 
692
699
  def test_habtm_respects_select_query_method
693
- assert_equal ['id'], developers(:david).projects.select(:id).first.attributes.keys
700
+ assert_equal ["id"], developers(:david).projects.select(:id).first.attributes.keys
701
+ end
702
+
703
+ def test_join_middle_table_alias
704
+ assert_equal(
705
+ 2,
706
+ Project.includes(:developers_projects).where.not("developers_projects.joined_on": nil).to_a.size
707
+ )
694
708
  end
695
709
 
696
710
  def test_join_table_alias
697
- # FIXME: `references` has no impact on the aliases generated for the join
698
- # query. The fact that we pass `:developers_projects_join` to `references`
699
- # and that the SQL string contains `developers_projects_join` is merely a
700
- # coincidence.
701
711
  assert_equal(
702
712
  3,
703
- Developer.references(:developers_projects_join).merge(
704
- :includes => {:projects => :developers},
705
- :where => 'projects_developers_projects_join.joined_on IS NOT NULL'
706
- ).to_a.size
713
+ Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).to_a.size
707
714
  )
708
715
  end
709
716
 
710
717
  def test_join_with_group
711
- # FIXME: `references` has no impact on the aliases generated for the join
712
- # query. The fact that we pass `:developers_projects_join` to `references`
713
- # and that the SQL string contains `developers_projects_join` is merely a
714
- # coincidence.
715
718
  group = Developer.columns.inject([]) do |g, c|
716
719
  g << "developers.#{c.name}"
717
720
  g << "developers_projects_2.#{c.name}"
@@ -720,16 +723,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
720
723
 
721
724
  assert_equal(
722
725
  3,
723
- Developer.references(:developers_projects_join).merge(
724
- :includes => {:projects => :developers}, :where => 'projects_developers_projects_join.joined_on IS NOT NULL',
725
- :group => group.join(",")
726
- ).to_a.size
726
+ Developer.includes(projects: :developers).where.not("developers_projects_projects_join.joined_on": nil).group(group.join(",")).to_a.size
727
727
  )
728
728
  end
729
729
 
730
730
  def test_find_grouped
731
- all_posts_from_category1 = Post.all.merge!(:where => "category_id = 1", :joins => :categories).to_a
732
- grouped_posts_of_category1 = Post.all.merge!(:where => "category_id = 1", :group => "author_id", :select => 'count(posts.id) as posts_count', :joins => :categories).to_a
731
+ all_posts_from_category1 = Post.all.merge!(where: "category_id = 1", joins: :categories).to_a
732
+ grouped_posts_of_category1 = Post.all.merge!(where: "category_id = 1", group: "author_id", select: "count(posts.id) as posts_count", joins: :categories).to_a
733
733
  assert_equal 5, all_posts_from_category1.size
734
734
  assert_equal 2, grouped_posts_of_category1.size
735
735
  end
@@ -740,8 +740,8 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
740
740
  end
741
741
 
742
742
  def test_find_scoped_grouped_having
743
- assert_equal 2, projects(:active_record).well_payed_salary_groups.to_a.size
744
- assert projects(:active_record).well_payed_salary_groups.all? { |g| g.salary > 10000 }
743
+ assert_equal 2, projects(:active_record).well_paid_salary_groups.to_a.size
744
+ assert projects(:active_record).well_paid_salary_groups.all? { |g| g.salary > 10000 }
745
745
  end
746
746
 
747
747
  def test_get_ids
@@ -760,9 +760,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
760
760
 
761
761
  def test_get_ids_for_unloaded_associations_does_not_load_them
762
762
  developer = developers(:david)
763
- assert !developer.projects.loaded?
763
+ assert_not_predicate developer.projects, :loaded?
764
764
  assert_equal projects(:active_record, :action_controller).map(&:id).sort, developer.project_ids.sort
765
- assert !developer.projects.loaded?
765
+ assert_not_predicate developer.projects, :loaded?
766
766
  end
767
767
 
768
768
  def test_assign_ids
@@ -776,13 +776,23 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
776
776
 
777
777
  def test_assign_ids_ignoring_blanks
778
778
  developer = Developer.new("name" => "Joe")
779
- developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id, '']
779
+ developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id, ""]
780
780
  developer.save
781
781
  developer.reload
782
782
  assert_equal 2, developer.projects.length
783
783
  assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
784
784
  end
785
785
 
786
+ def test_singular_ids_are_reloaded_after_collection_concat
787
+ student = Student.create(name: "Alberto Almagro")
788
+ student.lesson_ids
789
+
790
+ lesson = Lesson.create(name: "DSI")
791
+ student.lessons << lesson
792
+
793
+ assert_includes student.lesson_ids, lesson.id
794
+ end
795
+
786
796
  def test_scoped_find_on_through_association_doesnt_return_read_only_records
787
797
  tag = Post.find(1).tags.find_by_name("General")
788
798
 
@@ -792,12 +802,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
792
802
  end
793
803
 
794
804
  def test_has_many_through_polymorphic_has_manys_works
795
- assert_equal [10, 20].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
805
+ assert_equal ["$10.00", "$20.00"].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
796
806
  end
797
807
 
798
808
  def test_symbols_as_keys
799
- developer = DeveloperWithSymbolsForKeys.new(:name => 'David')
800
- project = ProjectWithSymbolsForKeys.new(:name => 'Rails Testing')
809
+ developer = DeveloperWithSymbolsForKeys.new(name: "David")
810
+ project = ProjectWithSymbolsForKeys.new(name: "Rails Testing")
801
811
  project.developers << developer
802
812
  project.save!
803
813
 
@@ -810,7 +820,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
810
820
  def test_dynamic_find_should_respect_association_include
811
821
  # SQL error in sort clause if :include is not included
812
822
  # due to Unknown column 'authors.id'
813
- assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title('Welcome to the weblog')
823
+ assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title("Welcome to the weblog")
814
824
  end
815
825
 
816
826
  def test_count
@@ -842,12 +852,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
842
852
  end
843
853
 
844
854
  def test_attributes_are_being_set_when_initialized_from_habtm_association_with_where_clause
845
- new_developer = projects(:action_controller).developers.where(:name => "Marcelo").build
855
+ new_developer = projects(:action_controller).developers.where(name: "Marcelo").build
846
856
  assert_equal new_developer.name, "Marcelo"
847
857
  end
848
858
 
849
859
  def test_attributes_are_being_set_when_initialized_from_habtm_association_with_multiple_where_clauses
850
- new_developer = projects(:action_controller).developers.where(:name => "Marcelo").where(:salary => 90_000).build
860
+ new_developer = projects(:action_controller).developers.where(name: "Marcelo").where(salary: 90_000).build
851
861
  assert_equal new_developer.name, "Marcelo"
852
862
  assert_equal new_developer.salary, 90_000
853
863
  end
@@ -855,7 +865,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
855
865
  def test_include_method_in_has_and_belongs_to_many_association_should_return_true_for_instance_added_with_build
856
866
  project = Project.new
857
867
  developer = project.developers.build
858
- assert project.developers.include?(developer)
868
+ assert_includes project.developers, developer
859
869
  end
860
870
 
861
871
  def test_destruction_does_not_error_without_primary_key
@@ -870,9 +880,9 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
870
880
 
871
881
  def test_has_and_belongs_to_many_associations_on_new_records_use_null_relations
872
882
  projects = Developer.new.projects
873
- assert_no_queries(ignore_none: false) do
883
+ assert_queries(0) do
874
884
  assert_equal [], projects
875
- assert_equal [], projects.where(title: 'omg')
885
+ assert_equal [], projects.where(title: "omg")
876
886
  assert_equal [], projects.pluck(:title)
877
887
  assert_equal 0, projects.count
878
888
  end
@@ -886,7 +896,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
886
896
  treasure.valid?
887
897
 
888
898
  assert_equal 1, treasure.rich_people.size
889
- assert_nil rich_person.first_name, 'should not run associated person validation on create when validate: false'
899
+ assert_nil rich_person.first_name, "should not run associated person validation on create when validate: false"
890
900
  end
891
901
 
892
902
  def test_association_with_validate_false_does_not_run_associated_validation_callbacks_on_update
@@ -899,11 +909,11 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
899
909
  treasure.valid?
900
910
 
901
911
  assert_equal 1, treasure.rich_people.size
902
- assert_equal person_first_name, rich_person.first_name, 'should not run associated person validation on update when validate: false'
912
+ assert_equal person_first_name, rich_person.first_name, "should not run associated person validation on update when validate: false"
903
913
  end
904
914
 
905
915
  def test_custom_join_table
906
- assert_equal 'edges', Vertex.reflect_on_association(:sources).join_table
916
+ assert_equal "edges", Vertex.reflect_on_association(:sources).join_table
907
917
  end
908
918
 
909
919
  def test_has_and_belongs_to_many_in_a_namespaced_model_pointing_to_a_namespaced_model
@@ -927,29 +937,24 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
927
937
  def test_redefine_habtm
928
938
  child = SubDeveloper.new("name" => "Aredridel")
929
939
  child.special_projects << SpecialProject.new("name" => "Special Project")
930
- assert child.save, 'child object should be saved'
940
+ assert child.save, "child object should be saved"
931
941
  end
932
942
 
933
943
  def test_habtm_with_reflection_using_class_name_and_fixtures
934
- assert_not_nil Developer._reflections['shared_computers']
944
+ assert_not_nil Developer._reflections["shared_computers"]
935
945
  # Checking the fixture for named association is important here, because it's the only way
936
946
  # we've been able to reproduce this bug
937
- assert_not_nil File.read(File.expand_path("../../../fixtures/developers.yml", __FILE__)).index("shared_computers")
947
+ assert_not_nil File.read(File.expand_path("../../fixtures/developers.yml", __dir__)).index("shared_computers")
938
948
  assert_equal developers(:david).shared_computers.first, computers(:laptop)
939
949
  end
940
950
 
941
951
  def test_with_symbol_class_name
942
952
  assert_nothing_raised do
943
- DeveloperWithSymbolClassName.new
953
+ developer = DeveloperWithSymbolClassName.new
954
+ developer.projects
944
955
  end
945
956
  end
946
957
 
947
- def test_association_force_reload_with_only_true_is_deprecated
948
- developer = Developer.find(1)
949
-
950
- assert_deprecated { developer.projects(true) }
951
- end
952
-
953
958
  def test_alternate_database
954
959
  professor = Professor.create(name: "Plum")
955
960
  course = Course.create(name: "Forensics")
@@ -1001,4 +1006,20 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
1001
1006
  user = User.create!
1002
1007
  assert_nothing_raised { user.jobs_pool.clear }
1003
1008
  end
1009
+
1010
+ def test_has_and_belongs_to_many_while_partial_writes_false
1011
+ original_partial_writes = ActiveRecord::Base.partial_writes
1012
+ ActiveRecord::Base.partial_writes = false
1013
+ developer = Developer.new(name: "Mehmet Emin İNAÇ")
1014
+ developer.projects << Project.new(name: "Bounty")
1015
+
1016
+ assert developer.save
1017
+ ensure
1018
+ ActiveRecord::Base.partial_writes = original_partial_writes
1019
+ end
1020
+
1021
+ def test_has_and_belongs_to_many_with_belongs_to
1022
+ sink = Sink.create! kitchen: Kitchen.new, sources: [Source.new]
1023
+ assert_equal 1, sink.sources.count
1024
+ end
1004
1025
  end