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,16 +1,19 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/developer'
5
- require 'models/computer'
6
- require 'models/vehicle'
7
- require 'models/cat'
1
+ # frozen_string_literal: true
2
+
3
+ require "cases/helper"
4
+ require "models/post"
5
+ require "models/comment"
6
+ require "models/developer"
7
+ require "models/project"
8
+ require "models/computer"
9
+ require "models/cat"
10
+ require "concurrent/atomic/cyclic_barrier"
8
11
 
9
12
  class DefaultScopingTest < ActiveRecord::TestCase
10
13
  fixtures :developers, :posts, :comments
11
14
 
12
15
  def test_default_scope
13
- expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect(&:salary)
16
+ expected = Developer.all.merge!(order: "salary DESC").to_a.collect(&:salary)
14
17
  received = DeveloperOrderedBySalary.all.collect(&:salary)
15
18
  assert_equal expected, received
16
19
  end
@@ -49,59 +52,48 @@ class DefaultScopingTest < ActiveRecord::TestCase
49
52
  end
50
53
 
51
54
  def test_default_scope_with_conditions_string
52
- assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
53
- assert_equal nil, DeveloperCalledDavid.create!.name
55
+ assert_equal Developer.where(name: "David").map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
56
+ assert_nil DeveloperCalledDavid.create!.name
54
57
  end
55
58
 
56
59
  def test_default_scope_with_conditions_hash
57
- assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
58
- assert_equal 'Jamis', DeveloperCalledJamis.create!.name
59
- end
60
-
61
- unless in_memory_db?
62
- def test_default_scoping_with_threads
63
- 2.times do
64
- Thread.new {
65
- assert DeveloperOrderedBySalary.all.to_sql.include?('salary DESC')
66
- DeveloperOrderedBySalary.connection.close
67
- }.join
68
- end
69
- end
60
+ assert_equal Developer.where(name: "Jamis").map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
61
+ assert_equal "Jamis", DeveloperCalledJamis.create!.name
70
62
  end
71
63
 
72
64
  def test_default_scope_with_inheritance
73
65
  wheres = InheritedPoorDeveloperCalledJamis.all.where_values_hash
74
- assert_equal "Jamis", wheres['name']
75
- assert_equal 50000, wheres['salary']
66
+ assert_equal "Jamis", wheres["name"]
67
+ assert_equal 50000, wheres["salary"]
76
68
  end
77
69
 
78
70
  def test_default_scope_with_module_includes
79
71
  wheres = ModuleIncludedPoorDeveloperCalledJamis.all.where_values_hash
80
- assert_equal "Jamis", wheres['name']
81
- assert_equal 50000, wheres['salary']
72
+ assert_equal "Jamis", wheres["name"]
73
+ assert_equal 50000, wheres["salary"]
82
74
  end
83
75
 
84
76
  def test_default_scope_with_multiple_calls
85
77
  wheres = MultiplePoorDeveloperCalledJamis.all.where_values_hash
86
- assert_equal "Jamis", wheres['name']
87
- assert_equal 50000, wheres['salary']
78
+ assert_equal "Jamis", wheres["name"]
79
+ assert_equal 50000, wheres["salary"]
88
80
  end
89
81
 
90
82
  def test_scope_overwrites_default
91
- expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect(&:name)
83
+ expected = Developer.all.merge!(order: "salary DESC, name DESC").to_a.collect(&:name)
92
84
  received = DeveloperOrderedBySalary.by_name.to_a.collect(&:name)
93
85
  assert_equal expected, received
94
86
  end
95
87
 
96
88
  def test_reorder_overrides_default_scope_order
97
- expected = Developer.order('name DESC').collect(&:name)
98
- received = DeveloperOrderedBySalary.reorder('name DESC').collect(&:name)
89
+ expected = Developer.order("name DESC").collect(&:name)
90
+ received = DeveloperOrderedBySalary.reorder("name DESC").collect(&:name)
99
91
  assert_equal expected, received
100
92
  end
101
93
 
102
94
  def test_order_after_reorder_combines_orders
103
- expected = Developer.order('name DESC, id DESC').collect { |dev| [dev.name, dev.id] }
104
- received = Developer.order('name ASC').reorder('name DESC').order('id DESC').collect { |dev| [dev.name, dev.id] }
95
+ expected = Developer.order("name DESC, id DESC").collect { |dev| [dev.name, dev.id] }
96
+ received = Developer.order("name ASC").reorder("name DESC").order("id DESC").collect { |dev| [dev.name, dev.id] }
105
97
  assert_equal expected, received
106
98
  end
107
99
 
@@ -112,107 +104,107 @@ class DefaultScopingTest < ActiveRecord::TestCase
112
104
  end
113
105
 
114
106
  def test_unscope_after_reordering_and_combining
115
- expected = Developer.order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
116
- received = DeveloperOrderedBySalary.reorder('name DESC').unscope(:order).order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
107
+ expected = Developer.order("id DESC, name DESC").collect { |dev| [dev.name, dev.id] }
108
+ received = DeveloperOrderedBySalary.reorder("name DESC").unscope(:order).order("id DESC, name DESC").collect { |dev| [dev.name, dev.id] }
117
109
  assert_equal expected, received
118
110
 
119
111
  expected_2 = Developer.all.collect { |dev| [dev.name, dev.id] }
120
- received_2 = Developer.order('id DESC, name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
112
+ received_2 = Developer.order("id DESC, name DESC").unscope(:order).collect { |dev| [dev.name, dev.id] }
121
113
  assert_equal expected_2, received_2
122
114
 
123
115
  expected_3 = Developer.all.collect { |dev| [dev.name, dev.id] }
124
- received_3 = Developer.reorder('name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
116
+ received_3 = Developer.reorder("name DESC").unscope(:order).collect { |dev| [dev.name, dev.id] }
125
117
  assert_equal expected_3, received_3
126
118
  end
127
119
 
128
120
  def test_unscope_with_where_attributes
129
- expected = Developer.order('salary DESC').collect(&:name)
130
- received = DeveloperOrderedBySalary.where(name: 'David').unscope(where: :name).collect(&:name)
131
- assert_equal expected, received
121
+ expected = Developer.order("salary DESC").collect(&:name)
122
+ received = DeveloperOrderedBySalary.where(name: "David").unscope(where: :name).collect(&:name)
123
+ assert_equal expected.sort, received.sort
132
124
 
133
- expected_2 = Developer.order('salary DESC').collect(&:name)
134
- received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({:where => :name}, :select).collect(&:name)
135
- assert_equal expected_2, received_2
125
+ expected_2 = Developer.order("salary DESC").collect(&:name)
126
+ received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({ where: :name }, :select).collect(&:name)
127
+ assert_equal expected_2.sort, received_2.sort
136
128
 
137
- expected_3 = Developer.order('salary DESC').collect(&:name)
129
+ expected_3 = Developer.order("salary DESC").collect(&:name)
138
130
  received_3 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope(:select, :where).collect(&:name)
139
- assert_equal expected_3, received_3
131
+ assert_equal expected_3.sort, received_3.sort
140
132
 
141
- expected_4 = Developer.order('salary DESC').collect(&:name)
133
+ expected_4 = Developer.order("salary DESC").collect(&:name)
142
134
  received_4 = DeveloperOrderedBySalary.where.not("name" => "Jamis").unscope(where: :name).collect(&:name)
143
- assert_equal expected_4, received_4
135
+ assert_equal expected_4.sort, received_4.sort
144
136
 
145
- expected_5 = Developer.order('salary DESC').collect(&:name)
137
+ expected_5 = Developer.order("salary DESC").collect(&:name)
146
138
  received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
147
- assert_equal expected_5, received_5
139
+ assert_equal expected_5.sort, received_5.sort
148
140
 
149
- expected_6 = Developer.order('salary DESC').collect(&:name)
150
- received_6 = DeveloperOrderedBySalary.where(Developer.arel_table['name'].eq('David')).unscope(where: :name).collect(&:name)
151
- assert_equal expected_6, received_6
141
+ expected_6 = Developer.order("salary DESC").collect(&:name)
142
+ received_6 = DeveloperOrderedBySalary.where(Developer.arel_table["name"].eq("David")).unscope(where: :name).collect(&:name)
143
+ assert_equal expected_6.sort, received_6.sort
152
144
 
153
- expected_7 = Developer.order('salary DESC').collect(&:name)
154
- received_7 = DeveloperOrderedBySalary.where(Developer.arel_table[:name].eq('David')).unscope(where: :name).collect(&:name)
155
- assert_equal expected_7, received_7
145
+ expected_7 = Developer.order("salary DESC").collect(&:name)
146
+ received_7 = DeveloperOrderedBySalary.where(Developer.arel_table[:name].eq("David")).unscope(where: :name).collect(&:name)
147
+ assert_equal expected_7.sort, received_7.sort
156
148
  end
157
149
 
158
150
  def test_unscope_comparison_where_clauses
159
151
  # unscoped for WHERE (`developers`.`id` <= 2)
160
- expected = Developer.order('salary DESC').collect(&:name)
152
+ expected = Developer.order("salary DESC").collect(&:name)
161
153
  received = DeveloperOrderedBySalary.where(id: -Float::INFINITY..2).unscope(where: :id).collect { |dev| dev.name }
162
- assert_equal expected, received
154
+ assert_equal expected.sort, received.sort
163
155
 
164
156
  # unscoped for WHERE (`developers`.`id` < 2)
165
- expected = Developer.order('salary DESC').collect(&:name)
157
+ expected = Developer.order("salary DESC").collect(&:name)
166
158
  received = DeveloperOrderedBySalary.where(id: -Float::INFINITY...2).unscope(where: :id).collect { |dev| dev.name }
167
- assert_equal expected, received
159
+ assert_equal expected.sort, received.sort
168
160
  end
169
161
 
170
162
  def test_unscope_multiple_where_clauses
171
- expected = Developer.order('salary DESC').collect(&:name)
172
- received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect(&:name)
173
- assert_equal expected, received
163
+ expected = Developer.order("salary DESC").collect(&:name)
164
+ received = DeveloperOrderedBySalary.where(name: "Jamis").where(id: 1).unscope(where: [:name, :id]).collect(&:name)
165
+ assert_equal expected.sort, received.sort
174
166
  end
175
167
 
176
168
  def test_unscope_string_where_clauses_involved
177
- dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
169
+ dev_relation = Developer.order("salary DESC").where("legacy_created_at > ?", 1.year.ago)
178
170
  expected = dev_relation.collect(&:name)
179
171
 
180
- dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
172
+ dev_ordered_relation = DeveloperOrderedBySalary.where(name: "Jamis").where("legacy_created_at > ?", 1.year.ago)
181
173
  received = dev_ordered_relation.unscope(where: [:name]).collect(&:name)
182
174
 
183
- assert_equal expected, received
175
+ assert_equal expected.sort, received.sort
184
176
  end
185
177
 
186
178
  def test_unscope_with_grouping_attributes
187
- expected = Developer.order('salary DESC').collect(&:name)
179
+ expected = Developer.order("salary DESC").collect(&:name)
188
180
  received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect(&:name)
189
- assert_equal expected, received
181
+ assert_equal expected.sort, received.sort
190
182
 
191
- expected_2 = Developer.order('salary DESC').collect(&:name)
183
+ expected_2 = Developer.order("salary DESC").collect(&:name)
192
184
  received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect(&:name)
193
- assert_equal expected_2, received_2
185
+ assert_equal expected_2.sort, received_2.sort
194
186
  end
195
187
 
196
188
  def test_unscope_with_limit_in_query
197
- expected = Developer.order('salary DESC').collect(&:name)
189
+ expected = Developer.order("salary DESC").collect(&:name)
198
190
  received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect(&:name)
199
- assert_equal expected, received
191
+ assert_equal expected.sort, received.sort
200
192
  end
201
193
 
202
194
  def test_order_to_unscope_reordering
203
- scope = DeveloperOrderedBySalary.order('salary DESC, name ASC').reverse_order.unscope(:order)
204
- assert !(scope.to_sql =~ /order/i)
195
+ scope = DeveloperOrderedBySalary.order("salary DESC, name ASC").reverse_order.unscope(:order)
196
+ assert_no_match(/order/i, scope.to_sql)
205
197
  end
206
198
 
207
199
  def test_unscope_reverse_order
208
200
  expected = Developer.all.collect(&:name)
209
- received = Developer.order('salary DESC').reverse_order.unscope(:order).collect(&:name)
201
+ received = Developer.order("salary DESC").reverse_order.unscope(:order).collect(&:name)
210
202
  assert_equal expected, received
211
203
  end
212
204
 
213
205
  def test_unscope_select
214
- expected = Developer.order('salary ASC').collect(&:name)
215
- received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect(&:name)
206
+ expected = Developer.order("salary ASC").collect(&:name)
207
+ received = Developer.order("salary DESC").reverse_order.select(:name).unscope(:select).collect(&:name)
216
208
  assert_equal expected, received
217
209
 
218
210
  expected_2 = Developer.all.collect(&:id)
@@ -228,7 +220,19 @@ class DefaultScopingTest < ActiveRecord::TestCase
228
220
 
229
221
  def test_unscope_joins_and_select_on_developers_projects
230
222
  expected = Developer.all.collect(&:name)
231
- received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect(&:name)
223
+ received = Developer.joins("JOIN developers_projects ON id = developer_id").select(:id).unscope(:joins, :select).collect(&:name)
224
+ assert_equal expected, received
225
+ end
226
+
227
+ def test_unscope_left_outer_joins
228
+ expected = Developer.all.collect(&:name)
229
+ received = Developer.left_outer_joins(:projects).select(:id).unscope(:left_outer_joins, :select).collect(&:name)
230
+ assert_equal expected, received
231
+ end
232
+
233
+ def test_unscope_left_joins
234
+ expected = Developer.all.collect(&:name)
235
+ received = Developer.left_joins(:projects).select(:id).unscope(:left_joins, :select).collect(&:name)
232
236
  assert_equal expected, received
233
237
  end
234
238
 
@@ -249,8 +253,8 @@ class DefaultScopingTest < ActiveRecord::TestCase
249
253
  scope :by_name, -> name { unscope(where: :name).where(name: name) }
250
254
  end
251
255
 
252
- expected = developer_klass.where(name: 'Jamis').collect { |dev| [dev.name, dev.id] }
253
- received = developer_klass.where(name: 'David').by_name('Jamis').collect { |dev| [dev.name, dev.id] }
256
+ expected = developer_klass.where(name: "Jamis").collect { |dev| [dev.name, dev.id] }
257
+ received = developer_klass.where(name: "David").by_name("Jamis").collect { |dev| [dev.name, dev.id] }
254
258
  assert_equal expected, received
255
259
  end
256
260
 
@@ -264,11 +268,11 @@ class DefaultScopingTest < ActiveRecord::TestCase
264
268
  end
265
269
 
266
270
  assert_raises(ArgumentError) do
267
- Developer.order('name DESC').reverse_order.unscope(:reverse_order)
271
+ Developer.order("name DESC").reverse_order.unscope(:reverse_order)
268
272
  end
269
273
 
270
274
  assert_raises(ArgumentError) do
271
- Developer.order('name DESC').where(name: "Jamis").unscope()
275
+ Developer.order("name DESC").where(name: "Jamis").unscope()
272
276
  end
273
277
  end
274
278
 
@@ -298,40 +302,40 @@ class DefaultScopingTest < ActiveRecord::TestCase
298
302
 
299
303
  def test_unscope_merging
300
304
  merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
301
- assert merged.where_clause.empty?
302
- assert !merged.where(name: "Jon").where_clause.empty?
305
+ assert_empty merged.where_clause
306
+ assert_not_empty merged.where(name: "Jon").where_clause
303
307
  end
304
308
 
305
309
  def test_order_in_default_scope_should_not_prevail
306
- expected = Developer.all.merge!(order: 'salary desc').to_a.collect(&:salary)
307
- received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect(&:salary)
310
+ expected = Developer.all.merge!(order: "salary desc").to_a.collect(&:salary)
311
+ received = DeveloperOrderedBySalary.all.merge!(order: "salary").to_a.collect(&:salary)
308
312
  assert_equal expected, received
309
313
  end
310
314
 
311
315
  def test_create_attribute_overwrites_default_scoping
312
- assert_equal 'David', PoorDeveloperCalledJamis.create!(:name => 'David').name
313
- assert_equal 200000, PoorDeveloperCalledJamis.create!(:name => 'David', :salary => 200000).salary
316
+ assert_equal "David", PoorDeveloperCalledJamis.create!(name: "David").name
317
+ assert_equal 200000, PoorDeveloperCalledJamis.create!(name: "David", salary: 200000).salary
314
318
  end
315
319
 
316
320
  def test_create_attribute_overwrites_default_values
317
- assert_equal nil, PoorDeveloperCalledJamis.create!(:salary => nil).salary
318
- assert_equal 50000, PoorDeveloperCalledJamis.create!(:name => 'David').salary
321
+ assert_nil PoorDeveloperCalledJamis.create!(salary: nil).salary
322
+ assert_equal 50000, PoorDeveloperCalledJamis.create!(name: "David").salary
319
323
  end
320
324
 
321
325
  def test_default_scope_attribute
322
- jamis = PoorDeveloperCalledJamis.new(:name => 'David')
326
+ jamis = PoorDeveloperCalledJamis.new(name: "David")
323
327
  assert_equal 50000, jamis.salary
324
328
  end
325
329
 
326
330
  def test_where_attribute
327
- aaron = PoorDeveloperCalledJamis.where(:salary => 20).new(:name => 'Aaron')
331
+ aaron = PoorDeveloperCalledJamis.where(salary: 20).new(name: "Aaron")
328
332
  assert_equal 20, aaron.salary
329
- assert_equal 'Aaron', aaron.name
333
+ assert_equal "Aaron", aaron.name
330
334
  end
331
335
 
332
336
  def test_where_attribute_merge
333
- aaron = PoorDeveloperCalledJamis.where(:name => 'foo').new(:name => 'Aaron')
334
- assert_equal 'Aaron', aaron.name
337
+ aaron = PoorDeveloperCalledJamis.where(name: "foo").new(name: "Aaron")
338
+ assert_equal "Aaron", aaron.name
335
339
  end
336
340
 
337
341
  def test_scope_composed_by_limit_and_then_offset_is_equal_to_scope_composed_by_offset_and_then_limit
@@ -341,33 +345,53 @@ class DefaultScopingTest < ActiveRecord::TestCase
341
345
  end
342
346
 
343
347
  def test_create_with_merge
344
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).merge(
345
- PoorDeveloperCalledJamis.create_with(:name => 'Aaron')).new
348
+ aaron = PoorDeveloperCalledJamis.create_with(name: "foo", salary: 20).merge(
349
+ PoorDeveloperCalledJamis.create_with(name: "Aaron")).new
346
350
  assert_equal 20, aaron.salary
347
- assert_equal 'Aaron', aaron.name
351
+ assert_equal "Aaron", aaron.name
348
352
 
349
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).
350
- create_with(:name => 'Aaron').new
353
+ aaron = PoorDeveloperCalledJamis.create_with(name: "foo", salary: 20).
354
+ create_with(name: "Aaron").new
351
355
  assert_equal 20, aaron.salary
352
- assert_equal 'Aaron', aaron.name
356
+ assert_equal "Aaron", aaron.name
357
+ end
358
+
359
+ def test_create_with_using_both_string_and_symbol
360
+ jamis = PoorDeveloperCalledJamis.create_with(name: "foo").create_with("name" => "Aaron").new
361
+ assert_equal "Aaron", jamis.name
353
362
  end
354
363
 
355
364
  def test_create_with_reset
356
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with(nil).new
357
- assert_equal 'Jamis', jamis.name
365
+ jamis = PoorDeveloperCalledJamis.create_with(name: "Aaron").create_with(nil).new
366
+ assert_equal "Jamis", jamis.name
367
+ end
368
+
369
+ def test_create_with_takes_precedence_over_where
370
+ developer = Developer.where(name: nil).create_with(name: "Aaron").new
371
+ assert_equal "Aaron", developer.name
372
+ end
373
+
374
+ def test_create_with_nested_attributes
375
+ assert_difference("Project.count", 1) do
376
+ Developer.create_with(
377
+ projects_attributes: [{ name: "p1" }]
378
+ ).scoping do
379
+ Developer.create!(name: "Aaron")
380
+ end
381
+ end
358
382
  end
359
383
 
360
384
  # FIXME: I don't know if this is *desired* behavior, but it is *today's*
361
385
  # behavior.
362
386
  def test_create_with_empty_hash_will_not_reset
363
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with({}).new
364
- assert_equal 'Aaron', jamis.name
387
+ jamis = PoorDeveloperCalledJamis.create_with(name: "Aaron").create_with({}).new
388
+ assert_equal "Aaron", jamis.name
365
389
  end
366
390
 
367
391
  def test_unscoped_with_named_scope_should_not_have_default_scope
368
392
  assert_equal [DeveloperCalledJamis.find(developers(:poor_jamis).id)], DeveloperCalledJamis.poor
369
393
 
370
- assert DeveloperCalledJamis.unscoped.poor.include?(developers(:david).becomes(DeveloperCalledJamis))
394
+ assert_includes DeveloperCalledJamis.unscoped.poor, developers(:david).becomes(DeveloperCalledJamis)
371
395
 
372
396
  assert_equal 11, DeveloperCalledJamis.unscoped.length
373
397
  assert_equal 1, DeveloperCalledJamis.poor.length
@@ -383,18 +407,18 @@ class DefaultScopingTest < ActiveRecord::TestCase
383
407
  end
384
408
 
385
409
  def test_joins_not_affected_by_scope_other_than_default_or_unscoped
386
- without_scope_on_post = Comment.joins(:post).to_a
410
+ without_scope_on_post = Comment.joins(:post).sort_by(&:id)
387
411
  with_scope_on_post = nil
388
412
  Post.where(id: [1, 5, 6]).scoping do
389
- with_scope_on_post = Comment.joins(:post).to_a
413
+ with_scope_on_post = Comment.joins(:post).sort_by(&:id)
390
414
  end
391
415
 
392
- assert_equal with_scope_on_post, without_scope_on_post
416
+ assert_equal without_scope_on_post, with_scope_on_post
393
417
  end
394
418
 
395
419
  def test_unscoped_with_joins_should_not_have_default_scope
396
- assert_equal SpecialPostWithDefaultScope.unscoped { Comment.joins(:special_post_with_default_scope).to_a },
397
- Comment.joins(:post).to_a
420
+ assert_equal Comment.joins(:post).sort_by(&:id),
421
+ SpecialPostWithDefaultScope.unscoped { Comment.joins(:special_post_with_default_scope).sort_by(&:id) }
398
422
  end
399
423
 
400
424
  def test_sti_association_with_unscoped_not_affected_by_default_scope
@@ -420,7 +444,7 @@ class DefaultScopingTest < ActiveRecord::TestCase
420
444
  end
421
445
 
422
446
  def test_default_scope_select_ignored_by_grouped_aggregations
423
- assert_equal Hash[Developer.all.group_by(&:salary).map { |s, d| [s, d.count] }],
447
+ assert_equal Developer.all.group_by(&:salary).transform_values(&:count),
424
448
  DeveloperWithSelect.group(:salary).count
425
449
  end
426
450
 
@@ -437,9 +461,9 @@ class DefaultScopingTest < ActiveRecord::TestCase
437
461
 
438
462
  def test_default_scope_include_with_count
439
463
  d = DeveloperWithIncludes.create!
440
- d.audit_logs.create! :message => 'foo'
464
+ d.audit_logs.create! message: "foo"
441
465
 
442
- assert_equal 1, DeveloperWithIncludes.where(:audit_logs => { :message => 'foo' }).count
466
+ assert_equal 1, DeveloperWithIncludes.where(audit_logs: { message: "foo" }).count
443
467
  end
444
468
 
445
469
  def test_default_scope_with_references_works_through_collection_association
@@ -460,24 +484,6 @@ class DefaultScopingTest < ActiveRecord::TestCase
460
484
  assert_equal comment, CommentWithDefaultScopeReferencesAssociation.find_by(id: comment.id)
461
485
  end
462
486
 
463
- unless in_memory_db?
464
- def test_default_scope_is_threadsafe
465
- threads = []
466
- assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
467
-
468
- threads << Thread.new do
469
- Thread.current[:long_default_scope] = true
470
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
471
- ThreadsafeDeveloper.connection.close
472
- end
473
- threads << Thread.new do
474
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
475
- ThreadsafeDeveloper.connection.close
476
- end
477
- threads.each(&:join)
478
- end
479
- end
480
-
481
487
  test "additional conditions are ANDed with the default scope" do
482
488
  scope = DeveloperCalledJamis.where(name: "David")
483
489
  assert_equal 2, scope.where_clause.ast.children.length
@@ -492,19 +498,19 @@ class DefaultScopingTest < ActiveRecord::TestCase
492
498
 
493
499
  test "a scope can remove the condition from the default scope" do
494
500
  scope = DeveloperCalledJamis.david2
495
- assert_equal 1, scope.where_clause.ast.children.length
496
- assert_equal Developer.where(name: "David"), scope
501
+ assert_instance_of Arel::Nodes::Equality, scope.where_clause.ast
502
+ assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
497
503
  end
498
504
 
499
505
  def test_with_abstract_class_where_clause_should_not_be_duplicated
500
- scope = Bus.all
501
- assert_equal scope.where_clause.ast.children.length, 1
506
+ scope = Lion.all
507
+ assert_instance_of Arel::Nodes::Equality, scope.where_clause.ast
502
508
  end
503
509
 
504
510
  def test_sti_conditions_are_not_carried_in_default_scope
505
- ConditionalStiPost.create! body: ''
506
- SubConditionalStiPost.create! body: ''
507
- SubConditionalStiPost.create! title: 'Hello world', body: ''
511
+ ConditionalStiPost.create! body: ""
512
+ SubConditionalStiPost.create! body: ""
513
+ SubConditionalStiPost.create! title: "Hello world", body: ""
508
514
 
509
515
  assert_equal 2, ConditionalStiPost.count
510
516
  assert_equal 2, ConditionalStiPost.all.to_a.size
@@ -516,13 +522,48 @@ class DefaultScopingTest < ActiveRecord::TestCase
516
522
  end
517
523
 
518
524
  def test_with_abstract_class_scope_should_be_executed_in_correct_context
519
- vegetarian_pattern, gender_pattern = if current_adapter?(:Mysql2Adapter)
520
- [/`lions`.`is_vegetarian`/, /`lions`.`gender`/]
521
- else
522
- [/"lions"."is_vegetarian"/, /"lions"."gender"/]
523
- end
525
+ vegetarian_pattern = /#{Regexp.escape(Lion.connection.quote_table_name("lions.is_vegetarian"))}/i
526
+ gender_pattern = /#{Regexp.escape(Lion.connection.quote_table_name("lions.gender"))}/i
524
527
 
525
528
  assert_match vegetarian_pattern, Lion.all.to_sql
526
529
  assert_match gender_pattern, Lion.female.to_sql
527
530
  end
528
531
  end
532
+
533
+ class DefaultScopingWithThreadTest < ActiveRecord::TestCase
534
+ self.use_transactional_tests = false
535
+
536
+ def test_default_scoping_with_threads
537
+ 2.times do
538
+ Thread.new {
539
+ assert_includes DeveloperOrderedBySalary.all.to_sql, "salary DESC"
540
+ DeveloperOrderedBySalary.connection.close
541
+ }.join
542
+ end
543
+ end
544
+
545
+ def test_default_scope_is_threadsafe
546
+ 2.times { ThreadsafeDeveloper.unscoped.create! }
547
+
548
+ threads = []
549
+ assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
550
+
551
+ barrier_1 = Concurrent::CyclicBarrier.new(2)
552
+ barrier_2 = Concurrent::CyclicBarrier.new(2)
553
+
554
+ threads << Thread.new do
555
+ Thread.current[:default_scope_delay] = -> { barrier_1.wait; barrier_2.wait }
556
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
557
+ ThreadsafeDeveloper.connection.close
558
+ end
559
+ threads << Thread.new do
560
+ Thread.current[:default_scope_delay] = -> { barrier_2.wait }
561
+ barrier_1.wait
562
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
563
+ ThreadsafeDeveloper.connection.close
564
+ end
565
+ threads.each(&:join)
566
+ ensure
567
+ ThreadsafeDeveloper.unscoped.destroy_all
568
+ end
569
+ end unless in_memory_db?