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