ibm_db 5.2.0-x86-mingw32 → 5.4.0-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 (625) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +9 -0
  3. data/LICENSE +55 -18
  4. data/README +1 -1
  5. data/debug.log +1 -0
  6. data/ext/Makefile +28 -24
  7. data/ext/ibm_db.c +66 -65
  8. data/ext/ibm_db.o +0 -0
  9. data/ext/ibm_db.so +0 -0
  10. data/ext/mkmf.log +26 -24
  11. data/ext/ruby_ibm_db_cli.c +1 -0
  12. data/ext/ruby_ibm_db_cli.o +0 -0
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +1520 -1282
  14. data/lib/ibm_db.so +1 -0
  15. data/lib/mswin32/ibm_db.rb +3 -1
  16. data/lib/mswin32/rb3x/i386/ruby30/ibm_db.so +0 -0
  17. data/lib/mswin32/rb3x/i386/ruby31/ibm_db.so +0 -0
  18. data/test/active_record/connection_adapters/fake_adapter.rb +5 -2
  19. data/test/activejob/destroy_association_async_test.rb +305 -0
  20. data/test/activejob/destroy_async_job_not_present_test.rb +31 -0
  21. data/test/activejob/helper.rb +15 -0
  22. data/test/assets/schema_dump_5_1.yml +345 -0
  23. data/test/cases/adapter_prevent_writes_test.rb +334 -0
  24. data/test/cases/adapter_test.rb +432 -218
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +85 -75
  26. data/test/cases/adapters/mysql2/auto_increment_test.rb +34 -0
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +5 -3
  28. data/test/cases/adapters/mysql2/boolean_test.rb +6 -4
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +26 -24
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +20 -17
  31. data/test/cases/adapters/mysql2/connection_test.rb +48 -50
  32. data/test/cases/adapters/mysql2/count_deleted_rows_with_lock_test.rb +28 -0
  33. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +23 -19
  34. data/test/cases/adapters/mysql2/enum_test.rb +32 -11
  35. data/test/cases/adapters/mysql2/explain_test.rb +13 -11
  36. data/test/cases/adapters/mysql2/json_test.rb +17 -188
  37. data/test/cases/adapters/mysql2/mysql2_adapter_prevent_writes_test.rb +208 -0
  38. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +183 -28
  39. data/test/cases/adapters/mysql2/nested_deadlock_test.rb +75 -0
  40. data/test/cases/adapters/mysql2/optimizer_hints_test.rb +69 -0
  41. data/test/cases/adapters/mysql2/schema_migrations_test.rb +26 -21
  42. data/test/cases/adapters/mysql2/schema_test.rb +24 -22
  43. data/test/cases/adapters/mysql2/set_test.rb +32 -0
  44. data/test/cases/adapters/mysql2/sp_test.rb +10 -8
  45. data/test/cases/adapters/mysql2/sql_types_test.rb +8 -6
  46. data/test/cases/adapters/mysql2/table_options_test.rb +93 -10
  47. data/test/cases/adapters/mysql2/transaction_test.rb +151 -0
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +11 -9
  49. data/test/cases/adapters/mysql2/virtual_column_test.rb +66 -0
  50. data/test/cases/adapters/postgresql/active_schema_test.rb +40 -25
  51. data/test/cases/adapters/postgresql/array_test.rb +118 -63
  52. data/test/cases/adapters/postgresql/bit_string_test.rb +12 -10
  53. data/test/cases/adapters/postgresql/bytea_test.rb +26 -25
  54. data/test/cases/adapters/postgresql/case_insensitive_test.rb +10 -9
  55. data/test/cases/adapters/postgresql/change_schema_test.rb +7 -5
  56. data/test/cases/adapters/postgresql/cidr_test.rb +2 -0
  57. data/test/cases/adapters/postgresql/citext_test.rb +58 -58
  58. data/test/cases/adapters/postgresql/collation_test.rb +17 -15
  59. data/test/cases/adapters/postgresql/composite_test.rb +25 -23
  60. data/test/cases/adapters/postgresql/connection_test.rb +73 -85
  61. data/test/cases/adapters/postgresql/create_unlogged_tables_test.rb +74 -0
  62. data/test/cases/adapters/postgresql/datatype_test.rb +19 -22
  63. data/test/cases/adapters/postgresql/date_test.rb +42 -0
  64. data/test/cases/adapters/postgresql/domain_test.rb +9 -7
  65. data/test/cases/adapters/postgresql/enum_test.rb +12 -10
  66. data/test/cases/adapters/postgresql/explain_test.rb +10 -8
  67. data/test/cases/adapters/postgresql/extension_migration_test.rb +13 -12
  68. data/test/cases/adapters/postgresql/foreign_table_test.rb +109 -0
  69. data/test/cases/adapters/postgresql/full_text_test.rb +8 -6
  70. data/test/cases/adapters/postgresql/geometric_test.rb +57 -63
  71. data/test/cases/adapters/postgresql/hstore_test.rb +288 -280
  72. data/test/cases/adapters/postgresql/infinity_test.rb +54 -15
  73. data/test/cases/adapters/postgresql/integer_test.rb +2 -0
  74. data/test/cases/adapters/postgresql/interval_test.rb +99 -0
  75. data/test/cases/adapters/postgresql/json_test.rb +16 -201
  76. data/test/cases/adapters/postgresql/ltree_test.rb +14 -16
  77. data/test/cases/adapters/postgresql/money_test.rb +47 -16
  78. data/test/cases/adapters/postgresql/network_test.rb +36 -28
  79. data/test/cases/adapters/postgresql/numbers_test.rb +7 -5
  80. data/test/cases/adapters/postgresql/optimizer_hints_test.rb +71 -0
  81. data/test/cases/adapters/postgresql/partitions_test.rb +22 -0
  82. data/test/cases/adapters/postgresql/postgresql_adapter_prevent_writes_test.rb +205 -0
  83. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +178 -136
  84. data/test/cases/adapters/postgresql/prepared_statements_disabled_test.rb +27 -0
  85. data/test/cases/adapters/postgresql/quoting_test.rb +12 -6
  86. data/test/cases/adapters/postgresql/range_test.rb +406 -292
  87. data/test/cases/adapters/postgresql/referential_integrity_test.rb +16 -15
  88. data/test/cases/adapters/postgresql/rename_table_test.rb +9 -8
  89. data/test/cases/adapters/postgresql/schema_authorization_test.rb +14 -23
  90. data/test/cases/adapters/postgresql/schema_test.rb +207 -91
  91. data/test/cases/adapters/postgresql/serial_test.rb +9 -7
  92. data/test/cases/adapters/postgresql/statement_pool_test.rb +26 -6
  93. data/test/cases/adapters/postgresql/timestamp_test.rb +17 -15
  94. data/test/cases/adapters/postgresql/transaction_nested_test.rb +114 -0
  95. data/test/cases/adapters/postgresql/transaction_test.rb +189 -0
  96. data/test/cases/adapters/postgresql/type_lookup_test.rb +12 -10
  97. data/test/cases/adapters/postgresql/utils_test.rb +11 -9
  98. data/test/cases/adapters/postgresql/uuid_test.rb +226 -109
  99. data/test/cases/adapters/postgresql/xml_test.rb +10 -14
  100. data/test/cases/adapters/sqlite3/collation_test.rb +26 -15
  101. data/test/cases/adapters/sqlite3/copy_table_test.rb +31 -28
  102. data/test/cases/adapters/sqlite3/explain_test.rb +13 -11
  103. data/test/cases/adapters/sqlite3/json_test.rb +29 -0
  104. data/test/cases/adapters/sqlite3/quoting_test.rb +35 -57
  105. data/test/cases/adapters/sqlite3/sqlite3_adapter_prevent_writes_test.rb +186 -0
  106. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +318 -131
  107. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +11 -11
  108. data/test/cases/adapters/sqlite3/statement_pool_test.rb +7 -6
  109. data/test/cases/adapters/sqlite3/transaction_test.rb +123 -0
  110. data/test/cases/aggregations_test.rb +14 -12
  111. data/test/cases/annotate_test.rb +46 -0
  112. data/test/cases/ar_schema_test.rb +153 -86
  113. data/test/cases/arel/attributes/attribute_test.rb +1145 -0
  114. data/test/cases/arel/attributes/math_test.rb +83 -0
  115. data/test/cases/arel/attributes_test.rb +27 -0
  116. data/test/cases/arel/collectors/bind_test.rb +40 -0
  117. data/test/cases/arel/collectors/composite_test.rb +47 -0
  118. data/test/cases/arel/collectors/sql_string_test.rb +41 -0
  119. data/test/cases/arel/collectors/substitute_bind_collector_test.rb +48 -0
  120. data/test/cases/arel/crud_test.rb +65 -0
  121. data/test/cases/arel/delete_manager_test.rb +53 -0
  122. data/test/cases/arel/factory_methods_test.rb +46 -0
  123. data/test/cases/arel/helper.rb +45 -0
  124. data/test/cases/arel/insert_manager_test.rb +241 -0
  125. data/test/cases/arel/nodes/and_test.rb +30 -0
  126. data/test/cases/arel/nodes/as_test.rb +36 -0
  127. data/test/cases/arel/nodes/ascending_test.rb +46 -0
  128. data/test/cases/arel/nodes/bin_test.rb +35 -0
  129. data/test/cases/arel/nodes/binary_test.rb +29 -0
  130. data/test/cases/arel/nodes/bind_param_test.rb +22 -0
  131. data/test/cases/arel/nodes/case_test.rb +96 -0
  132. data/test/cases/arel/nodes/casted_test.rb +18 -0
  133. data/test/cases/arel/nodes/comment_test.rb +22 -0
  134. data/test/cases/arel/nodes/count_test.rb +35 -0
  135. data/test/cases/arel/nodes/delete_statement_test.rb +36 -0
  136. data/test/cases/arel/nodes/descending_test.rb +46 -0
  137. data/test/cases/arel/nodes/distinct_test.rb +21 -0
  138. data/test/cases/arel/nodes/equality_test.rb +62 -0
  139. data/test/cases/arel/nodes/extract_test.rb +43 -0
  140. data/test/cases/arel/nodes/false_test.rb +21 -0
  141. data/test/cases/arel/nodes/grouping_test.rb +26 -0
  142. data/test/cases/arel/nodes/infix_operation_test.rb +42 -0
  143. data/test/cases/arel/nodes/insert_statement_test.rb +44 -0
  144. data/test/cases/arel/nodes/named_function_test.rb +48 -0
  145. data/test/cases/arel/nodes/node_test.rb +22 -0
  146. data/test/cases/arel/nodes/not_test.rb +31 -0
  147. data/test/cases/arel/nodes/or_test.rb +36 -0
  148. data/test/cases/arel/nodes/over_test.rb +69 -0
  149. data/test/cases/arel/nodes/select_core_test.rb +79 -0
  150. data/test/cases/arel/nodes/select_statement_test.rb +51 -0
  151. data/test/cases/arel/nodes/sql_literal_test.rb +75 -0
  152. data/test/cases/arel/nodes/sum_test.rb +35 -0
  153. data/test/cases/arel/nodes/table_alias_test.rb +29 -0
  154. data/test/cases/arel/nodes/true_test.rb +21 -0
  155. data/test/cases/arel/nodes/unary_operation_test.rb +41 -0
  156. data/test/cases/arel/nodes/update_statement_test.rb +60 -0
  157. data/test/cases/arel/nodes/window_test.rb +81 -0
  158. data/test/cases/arel/nodes_test.rb +34 -0
  159. data/test/cases/arel/select_manager_test.rb +1238 -0
  160. data/test/cases/arel/support/fake_record.rb +135 -0
  161. data/test/cases/arel/table_test.rb +216 -0
  162. data/test/cases/arel/update_manager_test.rb +126 -0
  163. data/test/cases/arel/visitors/dispatch_contamination_test.rb +78 -0
  164. data/test/cases/arel/visitors/dot_test.rb +90 -0
  165. data/test/cases/arel/visitors/mysql_test.rb +157 -0
  166. data/test/cases/arel/visitors/postgres_test.rb +366 -0
  167. data/test/cases/arel/visitors/sqlite_test.rb +75 -0
  168. data/test/cases/arel/visitors/to_sql_test.rb +750 -0
  169. data/test/cases/associations/belongs_to_associations_test.rb +510 -158
  170. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +4 -2
  171. data/test/cases/associations/callbacks_test.rb +56 -38
  172. data/test/cases/associations/cascaded_eager_loading_test.rb +118 -61
  173. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +138 -18
  174. data/test/cases/associations/eager_load_nested_include_test.rb +38 -37
  175. data/test/cases/associations/eager_singularization_test.rb +21 -21
  176. data/test/cases/associations/eager_test.rb +559 -415
  177. data/test/cases/associations/extension_test.rb +18 -12
  178. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +234 -213
  179. data/test/cases/associations/has_many_associations_test.rb +1038 -465
  180. data/test/cases/associations/has_many_through_associations_test.rb +558 -249
  181. data/test/cases/associations/has_one_associations_test.rb +294 -129
  182. data/test/cases/associations/has_one_through_associations_test.rb +121 -75
  183. data/test/cases/associations/inner_join_association_test.rb +114 -38
  184. data/test/cases/associations/inverse_associations_test.rb +606 -398
  185. data/test/cases/associations/join_model_test.rb +158 -148
  186. data/test/cases/associations/left_outer_join_association_test.rb +59 -24
  187. data/test/cases/associations/nested_through_associations_test.rb +166 -109
  188. data/test/cases/associations/required_test.rb +35 -10
  189. data/test/cases/associations_test.rb +241 -110
  190. data/test/cases/attribute_methods/read_test.rb +11 -11
  191. data/test/cases/attribute_methods_test.rb +413 -298
  192. data/test/cases/attributes_test.rb +145 -27
  193. data/test/cases/autosave_association_test.rb +681 -436
  194. data/test/cases/base_prevent_writes_test.rb +229 -0
  195. data/test/cases/base_test.rb +599 -542
  196. data/test/cases/batches_test.rb +288 -82
  197. data/test/cases/binary_test.rb +26 -31
  198. data/test/cases/bind_parameter_test.rb +194 -21
  199. data/test/cases/boolean_test.rb +52 -0
  200. data/test/cases/cache_key_test.rb +110 -5
  201. data/test/cases/calculations_test.rb +740 -177
  202. data/test/cases/callbacks_test.rb +74 -207
  203. data/test/cases/clone_test.rb +15 -10
  204. data/test/cases/coders/json_test.rb +2 -0
  205. data/test/cases/coders/yaml_column_test.rb +16 -13
  206. data/test/cases/collection_cache_key_test.rb +177 -20
  207. data/test/cases/column_alias_test.rb +9 -7
  208. data/test/cases/column_definition_test.rb +10 -68
  209. data/test/cases/comment_test.rb +166 -107
  210. data/test/cases/connection_adapters/adapter_leasing_test.rb +14 -10
  211. data/test/cases/connection_adapters/connection_handler_test.rb +358 -51
  212. data/test/cases/connection_adapters/connection_handlers_multi_db_test.rb +400 -0
  213. data/test/cases/connection_adapters/connection_handlers_multi_pool_config_test.rb +103 -0
  214. data/test/cases/connection_adapters/connection_handlers_sharding_db_test.rb +499 -0
  215. data/test/cases/connection_adapters/connection_swapping_nested_test.rb +457 -0
  216. data/test/cases/connection_adapters/legacy_connection_handlers_multi_db_test.rb +486 -0
  217. data/test/cases/connection_adapters/legacy_connection_handlers_sharding_db_test.rb +586 -0
  218. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +319 -138
  219. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +62 -50
  220. data/test/cases/connection_adapters/schema_cache_test.rb +259 -26
  221. data/test/cases/connection_adapters/type_lookup_test.rb +96 -95
  222. data/test/cases/connection_management_test.rb +13 -11
  223. data/test/cases/connection_pool_test.rb +316 -83
  224. data/test/cases/core_test.rb +82 -58
  225. data/test/cases/counter_cache_test.rb +204 -50
  226. data/test/cases/custom_locking_test.rb +5 -3
  227. data/test/cases/database_configurations/hash_config_test.rb +74 -0
  228. data/test/cases/database_configurations/resolver_test.rb +150 -0
  229. data/test/cases/database_configurations_test.rb +145 -0
  230. data/test/cases/database_selector_test.rb +296 -0
  231. data/test/cases/database_statements_test.rb +18 -16
  232. data/test/cases/date_test.rb +8 -16
  233. data/test/cases/date_time_precision_test.rb +100 -78
  234. data/test/cases/date_time_test.rb +23 -8
  235. data/test/cases/defaults_test.rb +106 -71
  236. data/test/cases/delegated_type_test.rb +57 -0
  237. data/test/cases/dirty_test.rb +419 -223
  238. data/test/cases/disconnected_test.rb +6 -6
  239. data/test/cases/dup_test.rb +54 -27
  240. data/test/cases/enum_test.rb +461 -82
  241. data/test/cases/errors_test.rb +7 -7
  242. data/test/cases/explain_subscriber_test.rb +17 -15
  243. data/test/cases/explain_test.rb +11 -19
  244. data/test/cases/filter_attributes_test.rb +153 -0
  245. data/test/cases/finder_respond_to_test.rb +14 -14
  246. data/test/cases/finder_test.rb +669 -287
  247. data/test/cases/fixture_set/file_test.rb +34 -38
  248. data/test/cases/fixtures_test.rb +833 -176
  249. data/test/cases/forbidden_attributes_protection_test.rb +32 -67
  250. data/test/cases/habtm_destroy_order_test.rb +25 -25
  251. data/test/cases/helper.rb +78 -49
  252. data/test/cases/hot_compatibility_test.rb +33 -32
  253. data/test/cases/i18n_test.rb +18 -17
  254. data/test/cases/inheritance_test.rb +180 -115
  255. data/test/cases/insert_all_test.rb +489 -0
  256. data/test/cases/instrumentation_test.rb +101 -0
  257. data/test/cases/integration_test.rb +119 -31
  258. data/test/cases/invalid_connection_test.rb +18 -16
  259. data/test/cases/invertible_migration_test.rb +183 -43
  260. data/test/cases/json_attribute_test.rb +35 -0
  261. data/test/cases/json_serialization_test.rb +57 -58
  262. data/test/cases/json_shared_test_cases.rb +290 -0
  263. data/test/cases/locking_test.rb +413 -119
  264. data/test/cases/log_subscriber_test.rb +68 -26
  265. data/test/cases/marshal_serialization_test.rb +39 -0
  266. data/test/cases/migration/change_schema_test.rb +118 -72
  267. data/test/cases/migration/change_table_test.rb +138 -30
  268. data/test/cases/migration/check_constraint_test.rb +162 -0
  269. data/test/cases/migration/column_attributes_test.rb +45 -35
  270. data/test/cases/migration/column_positioning_test.rb +18 -6
  271. data/test/cases/migration/columns_test.rb +93 -77
  272. data/test/cases/migration/command_recorder_test.rb +121 -34
  273. data/test/cases/migration/compatibility_test.rb +578 -23
  274. data/test/cases/migration/create_join_table_test.rb +35 -25
  275. data/test/cases/migration/foreign_key_test.rb +503 -284
  276. data/test/cases/migration/helper.rb +4 -3
  277. data/test/cases/migration/index_test.rb +119 -70
  278. data/test/cases/migration/logger_test.rb +9 -6
  279. data/test/cases/migration/pending_migrations_test.rb +88 -34
  280. data/test/cases/migration/references_foreign_key_test.rb +164 -150
  281. data/test/cases/migration/references_index_test.rb +38 -19
  282. data/test/cases/migration/references_statements_test.rb +15 -14
  283. data/test/cases/migration/rename_table_test.rb +53 -30
  284. data/test/cases/migration_test.rb +637 -269
  285. data/test/cases/migrator_test.rb +191 -135
  286. data/test/cases/mixin_test.rb +7 -11
  287. data/test/cases/modules_test.rb +36 -34
  288. data/test/cases/multi_db_migrator_test.rb +223 -0
  289. data/test/cases/multiparameter_attributes_test.rb +60 -33
  290. data/test/cases/multiple_db_test.rb +16 -22
  291. data/test/cases/nested_attributes_test.rb +341 -320
  292. data/test/cases/nested_attributes_with_callbacks_test.rb +26 -24
  293. data/test/cases/null_relation_test.rb +84 -0
  294. data/test/cases/numeric_data_test.rb +93 -0
  295. data/test/cases/persistence_test.rb +361 -269
  296. data/test/cases/pooled_connections_test.rb +18 -26
  297. data/test/cases/prepared_statement_status_test.rb +48 -0
  298. data/test/cases/primary_keys_test.rb +210 -104
  299. data/test/cases/query_cache_test.rb +610 -141
  300. data/test/cases/quoting_test.rb +132 -31
  301. data/test/cases/readonly_test.rb +49 -48
  302. data/test/cases/reaper_test.rb +146 -32
  303. data/test/cases/reflection_test.rb +167 -156
  304. data/test/cases/relation/delegation_test.rb +49 -36
  305. data/test/cases/relation/delete_all_test.rb +117 -0
  306. data/test/cases/relation/merging_test.rb +319 -42
  307. data/test/cases/relation/mutation_test.rb +55 -93
  308. data/test/cases/relation/or_test.rb +129 -29
  309. data/test/cases/relation/predicate_builder_test.rb +21 -6
  310. data/test/cases/relation/record_fetch_warning_test.rb +5 -3
  311. data/test/cases/relation/select_test.rb +67 -0
  312. data/test/cases/relation/update_all_test.rb +317 -0
  313. data/test/cases/relation/where_chain_test.rb +68 -32
  314. data/test/cases/relation/where_clause_test.rb +136 -61
  315. data/test/cases/relation/where_test.rb +155 -48
  316. data/test/cases/relation_test.rb +266 -112
  317. data/test/cases/relations_test.rb +969 -744
  318. data/test/cases/reload_models_test.rb +13 -9
  319. data/test/cases/reserved_word_test.rb +141 -0
  320. data/test/cases/result_test.rb +68 -17
  321. data/test/cases/sanitize_test.rb +87 -71
  322. data/test/cases/schema_dumper_test.rb +221 -128
  323. data/test/cases/schema_loading_test.rb +3 -2
  324. data/test/cases/scoping/default_scoping_test.rb +185 -144
  325. data/test/cases/scoping/named_scoping_test.rb +177 -89
  326. data/test/cases/scoping/relation_scoping_test.rb +197 -75
  327. data/test/cases/secure_token_test.rb +18 -3
  328. data/test/cases/serialization_test.rb +30 -28
  329. data/test/cases/serialized_attribute_test.rb +133 -42
  330. data/test/cases/signed_id_test.rb +168 -0
  331. data/test/cases/statement_cache_test.rb +41 -24
  332. data/test/cases/statement_invalid_test.rb +42 -0
  333. data/test/cases/store_test.rb +180 -55
  334. data/test/cases/strict_loading_test.rb +473 -0
  335. data/test/cases/suppressor_test.rb +26 -12
  336. data/test/cases/tasks/database_tasks_test.rb +1258 -194
  337. data/test/cases/tasks/mysql_rake_test.rb +370 -298
  338. data/test/cases/tasks/postgresql_rake_test.rb +481 -251
  339. data/test/cases/tasks/sqlite_rake_test.rb +225 -178
  340. data/test/cases/test_case.rb +51 -40
  341. data/test/cases/test_databases_test.rb +79 -0
  342. data/test/cases/test_fixtures_test.rb +79 -19
  343. data/test/cases/time_precision_test.rb +98 -76
  344. data/test/cases/timestamp_test.rb +102 -99
  345. data/test/cases/touch_later_test.rb +12 -10
  346. data/test/cases/transaction_callbacks_test.rb +344 -90
  347. data/test/cases/transaction_isolation_test.rb +12 -12
  348. data/test/cases/transactions_test.rb +612 -162
  349. data/test/cases/type/adapter_specific_registry_test.rb +14 -2
  350. data/test/cases/type/date_time_test.rb +4 -2
  351. data/test/cases/type/integer_test.rb +4 -2
  352. data/test/cases/type/string_test.rb +10 -8
  353. data/test/cases/type/time_test.rb +28 -0
  354. data/test/cases/type/type_map_test.rb +29 -28
  355. data/test/cases/type/unsigned_integer_test.rb +19 -0
  356. data/test/cases/type_test.rb +2 -0
  357. data/test/cases/types_test.rb +3 -1
  358. data/test/cases/unconnected_test.rb +14 -1
  359. data/test/cases/unsafe_raw_sql_test.rb +274 -0
  360. data/test/cases/validations/absence_validation_test.rb +19 -17
  361. data/test/cases/validations/association_validation_test.rb +30 -28
  362. data/test/cases/validations/i18n_generate_message_validation_test.rb +34 -16
  363. data/test/cases/validations/i18n_validation_test.rb +22 -21
  364. data/test/cases/validations/length_validation_test.rb +34 -33
  365. data/test/cases/validations/numericality_validation_test.rb +181 -0
  366. data/test/cases/validations/presence_validation_test.rb +21 -19
  367. data/test/cases/validations/uniqueness_validation_test.rb +156 -86
  368. data/test/cases/validations_repair_helper.rb +2 -0
  369. data/test/cases/validations_test.rb +61 -26
  370. data/test/cases/view_test.rb +122 -116
  371. data/test/cases/yaml_serialization_test.rb +79 -34
  372. data/test/config.example.yml +19 -19
  373. data/test/config.rb +3 -1
  374. data/test/config.yml +16 -6
  375. data/test/fixtures/all/namespaced/accounts.yml +2 -0
  376. data/test/fixtures/author_addresses.yml +1 -8
  377. data/test/fixtures/authors.yml +1 -7
  378. data/test/fixtures/binaries.yml +4 -0
  379. data/test/fixtures/books.yml +9 -2
  380. data/test/fixtures/categories_posts.yml +3 -0
  381. data/test/fixtures/citations.yml +5 -0
  382. data/test/fixtures/comments.yml +7 -0
  383. data/test/fixtures/companies.yml +5 -0
  384. data/test/fixtures/computers.yml +2 -0
  385. data/test/fixtures/customers.yml +10 -1
  386. data/test/fixtures/developers.yml +1 -1
  387. data/test/fixtures/essays.yml +10 -0
  388. data/test/fixtures/faces.yml +3 -3
  389. data/test/fixtures/humans.yml +5 -0
  390. data/test/fixtures/interests.yml +7 -7
  391. data/test/fixtures/memberships.yml +7 -0
  392. data/test/fixtures/minimalistics.yml +3 -0
  393. data/test/fixtures/mixed_case_monkeys.yml +2 -2
  394. data/test/fixtures/naked/yml/courses_with_invalid_key.yml +3 -0
  395. data/test/fixtures/naked/yml/parrots.yml +1 -0
  396. data/test/fixtures/other_books.yml +26 -0
  397. data/test/fixtures/other_posts.yml +1 -0
  398. data/test/fixtures/parrots.yml +7 -1
  399. data/test/fixtures/pirates.yml +3 -0
  400. data/test/fixtures/posts.yml +11 -3
  401. data/test/fixtures/readers.yml +6 -0
  402. data/test/fixtures/reserved_words/values.yml +2 -2
  403. data/test/fixtures/sponsors.yml +3 -0
  404. data/test/fixtures/strict_zines.yml +2 -0
  405. data/test/fixtures/subscribers.yml +1 -1
  406. data/test/fixtures/tasks.yml +1 -1
  407. data/test/fixtures/warehouse-things.yml +3 -0
  408. data/test/migrations/10_urban/9_add_expressions.rb +2 -0
  409. data/test/migrations/decimal/1_give_me_big_numbers.rb +6 -4
  410. data/test/migrations/magic/1_currencies_have_symbols.rb +3 -2
  411. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -0
  412. data/test/migrations/missing/1_people_have_last_names.rb +2 -0
  413. data/test/migrations/missing/3_we_need_reminders.rb +2 -0
  414. data/test/migrations/missing/4_innocent_jointable.rb +3 -1
  415. data/test/migrations/rename/1_we_need_things.rb +2 -0
  416. data/test/migrations/rename/2_rename_things.rb +2 -0
  417. data/test/migrations/to_copy/1_people_have_hobbies.rb +3 -1
  418. data/test/migrations/to_copy/2_people_have_descriptions.rb +3 -1
  419. data/test/migrations/to_copy2/1_create_articles.rb +2 -0
  420. data/test/migrations/to_copy2/2_create_comments.rb +3 -1
  421. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +3 -1
  422. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +3 -1
  423. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +3 -1
  424. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +2 -0
  425. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +2 -0
  426. data/test/migrations/valid/1_valid_people_have_last_names.rb +2 -0
  427. data/test/migrations/valid/2_we_need_reminders.rb +2 -0
  428. data/test/migrations/valid/3_innocent_jointable.rb +3 -1
  429. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +2 -0
  430. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -0
  431. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +3 -1
  432. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +2 -0
  433. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +2 -0
  434. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +3 -1
  435. data/test/migrations/version_check/20131219224947_migration_version_check.rb +2 -0
  436. data/test/models/account.rb +46 -0
  437. data/test/models/admin/account.rb +3 -1
  438. data/test/models/admin/randomly_named_c1.rb +2 -0
  439. data/test/models/admin/user.rb +16 -8
  440. data/test/models/admin.rb +4 -2
  441. data/test/models/aircraft.rb +3 -1
  442. data/test/models/arunit2_model.rb +2 -0
  443. data/test/models/author.rb +153 -102
  444. data/test/models/auto_id.rb +2 -0
  445. data/test/models/autoloadable/extra_firm.rb +2 -0
  446. data/test/models/binary.rb +3 -1
  447. data/test/models/binary_field.rb +6 -0
  448. data/test/models/bird.rb +13 -1
  449. data/test/models/book.rb +14 -4
  450. data/test/models/book_destroy_async.rb +24 -0
  451. data/test/models/boolean.rb +5 -0
  452. data/test/models/bulb.rb +13 -4
  453. data/test/models/cake_designer.rb +2 -0
  454. data/test/models/car.rb +17 -10
  455. data/test/models/carrier.rb +2 -0
  456. data/test/models/cart.rb +5 -0
  457. data/test/models/cat.rb +2 -0
  458. data/test/models/categorization.rb +8 -6
  459. data/test/models/category.rb +28 -16
  460. data/test/models/chef.rb +2 -0
  461. data/test/models/citation.rb +5 -1
  462. data/test/models/club.rb +13 -10
  463. data/test/models/college.rb +4 -2
  464. data/test/models/column.rb +2 -0
  465. data/test/models/column_name.rb +2 -0
  466. data/test/models/comment.rb +32 -10
  467. data/test/models/company.rb +102 -106
  468. data/test/models/company_in_module.rb +27 -26
  469. data/test/models/computer.rb +3 -1
  470. data/test/models/contact.rb +15 -13
  471. data/test/models/content.rb +5 -3
  472. data/test/models/contract.rb +21 -3
  473. data/test/models/country.rb +2 -4
  474. data/test/models/course.rb +3 -1
  475. data/test/models/customer.rb +10 -8
  476. data/test/models/customer_carrier.rb +2 -0
  477. data/test/models/dashboard.rb +2 -0
  478. data/test/models/default.rb +2 -0
  479. data/test/models/department.rb +2 -0
  480. data/test/models/destroy_async_parent.rb +15 -0
  481. data/test/models/destroy_async_parent_soft_delete.rb +20 -0
  482. data/test/models/developer.rb +152 -85
  483. data/test/models/dl_keyed_belongs_to.rb +13 -0
  484. data/test/models/dl_keyed_belongs_to_soft_delete.rb +19 -0
  485. data/test/models/dl_keyed_has_many.rb +5 -0
  486. data/test/models/dl_keyed_has_many_through.rb +5 -0
  487. data/test/models/dl_keyed_has_one.rb +5 -0
  488. data/test/models/dl_keyed_join.rb +10 -0
  489. data/test/models/dog.rb +2 -0
  490. data/test/models/dog_lover.rb +2 -0
  491. data/test/models/doubloon.rb +3 -1
  492. data/test/models/drink_designer.rb +17 -0
  493. data/test/models/edge.rb +4 -2
  494. data/test/models/electron.rb +2 -0
  495. data/test/models/engine.rb +3 -2
  496. data/test/models/entrant.rb +2 -0
  497. data/test/models/entry.rb +5 -0
  498. data/test/models/essay.rb +6 -3
  499. data/test/models/essay_destroy_async.rb +12 -0
  500. data/test/models/event.rb +3 -1
  501. data/test/models/eye.rb +5 -3
  502. data/test/models/face.rb +14 -6
  503. data/test/models/family.rb +6 -0
  504. data/test/models/family_tree.rb +6 -0
  505. data/test/models/friendship.rb +5 -3
  506. data/test/models/frog.rb +8 -0
  507. data/test/models/guid.rb +3 -1
  508. data/test/models/guitar.rb +2 -0
  509. data/test/models/hotel.rb +5 -3
  510. data/test/models/human.rb +39 -0
  511. data/test/models/image.rb +3 -1
  512. data/test/models/interest.rb +14 -3
  513. data/test/models/invoice.rb +4 -2
  514. data/test/models/item.rb +3 -1
  515. data/test/models/job.rb +5 -3
  516. data/test/models/joke.rb +4 -2
  517. data/test/models/keyboard.rb +3 -1
  518. data/test/models/legacy_thing.rb +2 -0
  519. data/test/models/lesson.rb +2 -0
  520. data/test/models/line_item.rb +3 -1
  521. data/test/models/liquid.rb +2 -0
  522. data/test/models/matey.rb +3 -1
  523. data/test/models/measurement.rb +4 -0
  524. data/test/models/member.rb +23 -20
  525. data/test/models/member_detail.rb +3 -0
  526. data/test/models/member_type.rb +2 -0
  527. data/test/models/membership.rb +4 -1
  528. data/test/models/mentor.rb +3 -1
  529. data/test/models/message.rb +5 -0
  530. data/test/models/minimalistic.rb +2 -0
  531. data/test/models/minivan.rb +3 -2
  532. data/test/models/mixed_case_monkey.rb +3 -1
  533. data/test/models/molecule.rb +2 -0
  534. data/test/models/mouse.rb +6 -0
  535. data/test/models/movie.rb +2 -0
  536. data/test/models/node.rb +4 -2
  537. data/test/models/non_primary_key.rb +2 -0
  538. data/test/models/notification.rb +2 -0
  539. data/test/models/numeric_data.rb +12 -0
  540. data/test/models/order.rb +4 -2
  541. data/test/models/organization.rb +9 -7
  542. data/test/models/other_dog.rb +3 -1
  543. data/test/models/owner.rb +6 -4
  544. data/test/models/parrot.rb +12 -4
  545. data/test/models/person.rb +59 -54
  546. data/test/models/personal_legacy_thing.rb +3 -1
  547. data/test/models/pet.rb +4 -2
  548. data/test/models/pet_treasure.rb +2 -0
  549. data/test/models/pirate.rb +67 -43
  550. data/test/models/possession.rb +3 -1
  551. data/test/models/post.rb +184 -86
  552. data/test/models/price_estimate.rb +11 -1
  553. data/test/models/professor.rb +3 -1
  554. data/test/models/project.rb +14 -12
  555. data/test/models/publisher/article.rb +2 -0
  556. data/test/models/publisher/magazine.rb +2 -0
  557. data/test/models/publisher.rb +2 -0
  558. data/test/models/randomly_named_c1.rb +2 -0
  559. data/test/models/rating.rb +5 -1
  560. data/test/models/reader.rb +7 -5
  561. data/test/models/recipe.rb +2 -0
  562. data/test/models/record.rb +2 -0
  563. data/test/models/reference.rb +6 -3
  564. data/test/models/reply.rb +39 -21
  565. data/test/models/room.rb +6 -0
  566. data/test/models/section.rb +6 -0
  567. data/test/models/seminar.rb +6 -0
  568. data/test/models/session.rb +6 -0
  569. data/test/models/ship.rb +12 -9
  570. data/test/models/ship_part.rb +5 -3
  571. data/test/models/shop.rb +4 -2
  572. data/test/models/shop_account.rb +2 -0
  573. data/test/models/speedometer.rb +2 -0
  574. data/test/models/sponsor.rb +8 -5
  575. data/test/models/squeak.rb +6 -0
  576. data/test/models/strict_zine.rb +7 -0
  577. data/test/models/string_key_object.rb +2 -0
  578. data/test/models/student.rb +2 -0
  579. data/test/models/subscriber.rb +4 -2
  580. data/test/models/subscription.rb +5 -1
  581. data/test/models/tag.rb +6 -3
  582. data/test/models/tagging.rb +13 -6
  583. data/test/models/task.rb +2 -0
  584. data/test/models/topic.rb +54 -19
  585. data/test/models/toy.rb +4 -0
  586. data/test/models/traffic_light.rb +2 -0
  587. data/test/models/treasure.rb +5 -3
  588. data/test/models/treaty.rb +2 -4
  589. data/test/models/tree.rb +2 -0
  590. data/test/models/tuning_peg.rb +2 -0
  591. data/test/models/tyre.rb +2 -0
  592. data/test/models/user.rb +12 -4
  593. data/test/models/uuid_child.rb +2 -0
  594. data/test/models/uuid_item.rb +2 -0
  595. data/test/models/uuid_parent.rb +2 -0
  596. data/test/models/vegetables.rb +12 -3
  597. data/test/models/vertex.rb +6 -4
  598. data/test/models/warehouse_thing.rb +2 -0
  599. data/test/models/wheel.rb +3 -1
  600. data/test/models/without_table.rb +3 -1
  601. data/test/models/zine.rb +3 -1
  602. data/test/schema/mysql2_specific_schema.rb +49 -35
  603. data/test/schema/oracle_specific_schema.rb +13 -15
  604. data/test/schema/postgresql_specific_schema.rb +51 -40
  605. data/test/schema/schema.rb +334 -154
  606. data/test/schema/sqlite_specific_schema.rb +9 -16
  607. data/test/support/config.rb +26 -26
  608. data/test/support/connection.rb +14 -8
  609. data/test/support/connection_helper.rb +3 -1
  610. data/test/support/ddl_helper.rb +2 -0
  611. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic.dump +0 -0
  612. data/test/support/marshal_compatibility_fixtures/IBM_DB/rails_6_0_topic_associations.dump +0 -0
  613. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic.dump +0 -0
  614. data/test/support/marshal_compatibility_fixtures/Mysql2/rails_6_0_topic_associations.dump +0 -0
  615. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic.dump +0 -0
  616. data/test/support/marshal_compatibility_fixtures/PostgreSQL/rails_6_0_topic_associations.dump +0 -0
  617. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic.dump +0 -0
  618. data/test/support/marshal_compatibility_fixtures/SQLite/rails_6_0_topic_associations.dump +0 -0
  619. data/test/support/marshal_compatibility_fixtures/legacy_6_0_record_mysql.dump +0 -0
  620. data/test/support/marshal_compatibility_fixtures/legacy_relation.dump +0 -0
  621. data/test/support/schema_dumping_helper.rb +2 -0
  622. data/test/support/stubs/strong_parameters.rb +40 -0
  623. data/test/support/yaml_compatibility_fixtures/rails_v1_mysql.yml +206 -0
  624. data/test/support/yaml_compatibility_fixtures/rails_v2.yml +55 -0
  625. metadata +192 -14
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "cases/helper"
2
- require 'models/post'
3
- require 'models/topic'
4
- require 'models/comment'
5
- require 'models/reply'
6
- require 'models/author'
7
- require 'models/developer'
8
- require 'models/computer'
4
+ require "models/post"
5
+ require "models/topic"
6
+ require "models/comment"
7
+ require "models/reply"
8
+ require "models/author"
9
+ require "models/developer"
10
+ require "models/computer"
9
11
 
10
12
  class NamedScopingTest < ActiveRecord::TestCase
11
13
  fixtures :posts, :authors, :topics, :comments, :author_addresses
12
14
 
13
15
  def test_implements_enumerable
14
- assert !Topic.all.empty?
16
+ assert_not_empty Topic.all
15
17
 
16
18
  assert_equal Topic.all.to_a, Topic.base
17
19
  assert_equal Topic.all.to_a, Topic.base.to_a
@@ -23,8 +25,8 @@ class NamedScopingTest < ActiveRecord::TestCase
23
25
  all_posts = Topic.base
24
26
 
25
27
  assert_queries(1) do
26
- all_posts.collect
27
- all_posts.collect
28
+ all_posts.collect { true }
29
+ all_posts.collect { true }
28
30
  end
29
31
  end
30
32
 
@@ -33,12 +35,12 @@ class NamedScopingTest < ActiveRecord::TestCase
33
35
  all_posts.to_a
34
36
 
35
37
  new_post = Topic.create!
36
- assert !all_posts.include?(new_post)
37
- assert all_posts.reload.include?(new_post)
38
+ assert_not_includes all_posts, new_post
39
+ assert_includes all_posts.reload, new_post
38
40
  end
39
41
 
40
42
  def test_delegates_finds_and_calculations_to_the_base_class
41
- assert !Topic.all.empty?
43
+ assert_not_empty Topic.all
42
44
 
43
45
  assert_equal Topic.all.to_a, Topic.base.to_a
44
46
  assert_equal Topic.first, Topic.base.first
@@ -46,26 +48,38 @@ class NamedScopingTest < ActiveRecord::TestCase
46
48
  assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
47
49
  end
48
50
 
51
+ def test_calling_merge_at_first_in_scope
52
+ Topic.class_eval do
53
+ scope :calling_merge_at_first_in_scope, Proc.new { merge(Topic.replied) }
54
+ end
55
+ assert_equal Topic.calling_merge_at_first_in_scope.to_a, Topic.replied.to_a
56
+ end
57
+
49
58
  def test_method_missing_priority_when_delegating
50
59
  klazz = Class.new(ActiveRecord::Base) do
51
60
  self.table_name = "topics"
52
- scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
53
- scope :to, Proc.new { where('written_on <= ?', Time.now) }
61
+ scope :since, Proc.new { where("written_on >= ?", Time.now - 1.day) }
62
+ scope :to, Proc.new { where("written_on <= ?", Time.now) }
54
63
  end
55
64
  assert_equal klazz.to.since.to_a, klazz.since.to.to_a
56
65
  end
57
66
 
67
+ def test_define_scope_for_reserved_words
68
+ assert Topic.true.all?(&:approved?), "all objects should be approved"
69
+ assert Topic.false.none?(&:approved?), "all objects should not be approved"
70
+ end
71
+
58
72
  def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
59
- assert Topic.approved.respond_to?(:limit)
60
- assert Topic.approved.respond_to?(:count)
61
- assert Topic.approved.respond_to?(:length)
73
+ assert_respond_to Topic.approved, :limit
74
+ assert_respond_to Topic.approved, :count
75
+ assert_respond_to Topic.approved, :length
62
76
  end
63
77
 
64
78
  def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
65
- assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
79
+ assert_not_empty Topic.all.merge!(where: { approved: true }).to_a
66
80
 
67
- assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
68
- assert_equal Topic.where(:approved => true).count, Topic.approved.count
81
+ assert_equal Topic.all.merge!(where: { approved: true }).to_a, Topic.approved
82
+ assert_equal Topic.where(approved: true).count, Topic.approved.count
69
83
  end
70
84
 
71
85
  def test_scopes_with_string_name_can_be_composed
@@ -75,17 +89,17 @@ class NamedScopingTest < ActiveRecord::TestCase
75
89
  end
76
90
 
77
91
  def test_scopes_are_composable
78
- assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
79
- assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
80
- assert !(approved == replied)
81
- assert !(approved & replied).empty?
92
+ assert_equal((approved = Topic.all.merge!(where: { approved: true }).to_a), Topic.approved)
93
+ assert_equal((replied = Topic.all.merge!(where: "replies_count > 0").to_a), Topic.replied)
94
+ assert_not (approved == replied)
95
+ assert_not_empty (approved & replied)
82
96
 
83
97
  assert_equal approved & replied, Topic.approved.replied
84
98
  end
85
99
 
86
100
  def test_procedural_scopes
87
- topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
88
- topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
101
+ topics_written_before_the_third = Topic.where("written_on < ?", topics(:third).written_on)
102
+ topics_written_before_the_second = Topic.where("written_on < ?", topics(:second).written_on)
89
103
  assert_not_equal topics_written_before_the_second, topics_written_before_the_third
90
104
 
91
105
  assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
@@ -98,34 +112,62 @@ class NamedScopingTest < ActiveRecord::TestCase
98
112
  assert_equal all_topics, Topic.written_before(nil)
99
113
  end
100
114
 
115
+ def test_positional_scope_method
116
+ stats = {}
117
+ topics = Topic.all.scope_stats(stats)
118
+
119
+ assert_equal topics.count, stats[:count]
120
+ end
121
+
122
+ def test_positional_klass_method
123
+ stats = {}
124
+ topics = Topic.all.klass_stats(stats)
125
+
126
+ assert_equal topics.count, stats[:count]
127
+ end
128
+
101
129
  def test_scope_with_object
102
130
  objects = Topic.with_object
103
131
  assert_operator objects.length, :>, 0
104
- assert objects.all?(&:approved?), 'all objects should be approved'
132
+ assert objects.all?(&:approved?), "all objects should be approved"
133
+ end
134
+
135
+ def test_scope_with_kwargs
136
+ # Explicit true
137
+ topics = Topic.with_kwargs(approved: true)
138
+ assert_operator topics.length, :>, 0
139
+ assert topics.all?(&:approved?), "all objects should be approved"
140
+
141
+ # No arguments
142
+ topics = Topic.with_kwargs()
143
+ assert_operator topics.length, :>, 0
144
+ assert topics.none?(&:approved?), "all objects should not be approved"
105
145
  end
106
146
 
107
147
  def test_has_many_associations_have_access_to_scopes
108
148
  assert_not_equal Post.containing_the_letter_a, authors(:david).posts
109
- assert !Post.containing_the_letter_a.empty?
149
+ assert_not_empty Post.containing_the_letter_a
110
150
 
111
- assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
151
+ expected = authors(:david).posts & Post.containing_the_letter_a
152
+ assert_equal expected.sort_by(&:id), authors(:david).posts.containing_the_letter_a.sort_by(&:id)
112
153
  end
113
154
 
114
155
  def test_scope_with_STI
115
- assert_equal 3,Post.containing_the_letter_a.count
116
- assert_equal 1,SpecialPost.containing_the_letter_a.count
156
+ assert_equal 3, Post.containing_the_letter_a.count
157
+ assert_equal 1, SpecialPost.containing_the_letter_a.count
117
158
  end
118
159
 
119
160
  def test_has_many_through_associations_have_access_to_scopes
120
161
  assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
121
- assert !Comment.containing_the_letter_e.empty?
162
+ assert_not_empty Comment.containing_the_letter_e
122
163
 
123
- assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
164
+ expected = authors(:david).comments & Comment.containing_the_letter_e
165
+ assert_equal expected.sort_by(&:id), authors(:david).comments.containing_the_letter_e.sort_by(&:id)
124
166
  end
125
167
 
126
168
  def test_scopes_honor_current_scopes_from_when_defined
127
- assert !Post.ranked_by_comments.limit_by(5).empty?
128
- assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
169
+ assert_not_empty Post.ranked_by_comments.limit_by(5)
170
+ assert_not_empty authors(:david).posts.ranked_by_comments.limit_by(5)
129
171
  assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
130
172
  assert_not_equal Post.top(5), authors(:david).posts.top(5)
131
173
  # Oracle sometimes sorts differently if WHERE condition is changed
@@ -140,27 +182,43 @@ class NamedScopingTest < ActiveRecord::TestCase
140
182
  assert_equal "The scope body needs to be callable.", e.message
141
183
  end
142
184
 
185
+ def test_scopes_name_is_relation_method
186
+ conflicts = [
187
+ :records,
188
+ :to_ary,
189
+ :to_sql,
190
+ :explain
191
+ ]
192
+
193
+ conflicts.each do |name|
194
+ e = assert_raises ArgumentError do
195
+ Class.new(Post).class_eval { scope name, -> { where(approved: true) } }
196
+ end
197
+ assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
198
+ end
199
+ end
200
+
143
201
  def test_active_records_have_scope_named__all__
144
- assert !Topic.all.empty?
202
+ assert_not_empty Topic.all
145
203
 
146
204
  assert_equal Topic.all.to_a, Topic.base
147
205
  end
148
206
 
149
207
  def test_active_records_have_scope_named__scoped__
150
208
  scope = Topic.where("content LIKE '%Have%'")
151
- assert !scope.empty?
209
+ assert_not_empty scope
152
210
 
153
211
  assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
154
212
  end
155
213
 
156
214
  def test_first_and_last_should_allow_integers_for_limit
157
- assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
215
+ assert_equal Topic.base.first(2), Topic.base.order("id").to_a.first(2)
158
216
  assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
159
217
  end
160
218
 
161
219
  def test_first_and_last_should_not_use_query_when_results_are_loaded
162
220
  topics = Topic.base
163
- topics.reload # force load
221
+ topics.load # force load
164
222
  assert_no_queries do
165
223
  topics.first
166
224
  topics.last
@@ -171,7 +229,7 @@ class NamedScopingTest < ActiveRecord::TestCase
171
229
  topics = Topic.base
172
230
  assert_queries(2) do
173
231
  topics.empty? # use count query
174
- topics.collect # force load
232
+ topics.load # force load
175
233
  topics.empty? # use loaded (no query)
176
234
  end
177
235
  end
@@ -180,7 +238,7 @@ class NamedScopingTest < ActiveRecord::TestCase
180
238
  topics = Topic.base
181
239
  assert_queries(2) do
182
240
  topics.any? # use count query
183
- topics.collect # force load
241
+ topics.load # force load
184
242
  topics.any? # use loaded (no query)
185
243
  end
186
244
  end
@@ -196,21 +254,21 @@ class NamedScopingTest < ActiveRecord::TestCase
196
254
 
197
255
  def test_any_should_not_fire_query_if_scope_loaded
198
256
  topics = Topic.base
199
- topics.collect # force load
257
+ topics.load # force load
200
258
  assert_no_queries { assert topics.any? }
201
259
  end
202
260
 
203
261
  def test_model_class_should_respond_to_any
204
- assert Topic.any?
262
+ assert_predicate Topic, :any?
205
263
  Topic.delete_all
206
- assert !Topic.any?
264
+ assert_not_predicate Topic, :any?
207
265
  end
208
266
 
209
267
  def test_many_should_not_load_results
210
268
  topics = Topic.base
211
269
  assert_queries(2) do
212
270
  topics.many? # use count query
213
- topics.collect # force load
271
+ topics.load # force load
214
272
  topics.many? # use loaded (no query)
215
273
  end
216
274
  end
@@ -226,28 +284,28 @@ class NamedScopingTest < ActiveRecord::TestCase
226
284
 
227
285
  def test_many_should_not_fire_query_if_scope_loaded
228
286
  topics = Topic.base
229
- topics.collect # force load
287
+ topics.load # force load
230
288
  assert_no_queries { assert topics.many? }
231
289
  end
232
290
 
233
291
  def test_many_should_return_false_if_none_or_one
234
- topics = Topic.base.where(:id => 0)
235
- assert !topics.many?
236
- topics = Topic.base.where(:id => 1)
237
- assert !topics.many?
292
+ topics = Topic.base.where(id: 0)
293
+ assert_not_predicate topics, :many?
294
+ topics = Topic.base.where(id: 1)
295
+ assert_not_predicate topics, :many?
238
296
  end
239
297
 
240
298
  def test_many_should_return_true_if_more_than_one
241
- assert Topic.base.many?
299
+ assert_predicate Topic.base, :many?
242
300
  end
243
301
 
244
302
  def test_model_class_should_respond_to_many
245
303
  Topic.delete_all
246
- assert !Topic.many?
304
+ assert_not_predicate Topic, :many?
247
305
  Topic.create!
248
- assert !Topic.many?
306
+ assert_not_predicate Topic, :many?
249
307
  Topic.create!
250
- assert Topic.many?
308
+ assert_predicate Topic, :many?
251
309
  end
252
310
 
253
311
  def test_should_build_on_top_of_scope
@@ -273,7 +331,7 @@ class NamedScopingTest < ActiveRecord::TestCase
273
331
  def test_should_build_on_top_of_chained_scopes
274
332
  topic = Topic.approved.by_lifo.build({})
275
333
  assert topic.approved
276
- assert_equal 'lifo', topic.author_name
334
+ assert_equal "lifo", topic.author_name
277
335
  end
278
336
 
279
337
  def test_reserved_scope_names
@@ -320,12 +378,12 @@ class NamedScopingTest < ActiveRecord::TestCase
320
378
 
321
379
  conflicts.each do |name|
322
380
  e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
323
- klass.class_eval { scope name, ->{ where(approved: true) } }
381
+ klass.class_eval { scope name, -> { where(approved: true) } }
324
382
  end
325
383
  assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
326
384
 
327
385
  e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
328
- subklass.class_eval { scope name, ->{ where(approved: true) } }
386
+ subklass.class_eval { scope name, -> { where(approved: true) } }
329
387
  end
330
388
  assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
331
389
  end
@@ -333,12 +391,12 @@ class NamedScopingTest < ActiveRecord::TestCase
333
391
  non_conflicts.each do |name|
334
392
  assert_nothing_raised do
335
393
  silence_warnings do
336
- klass.class_eval { scope name, ->{ where(approved: true) } }
394
+ klass.class_eval { scope name, -> { where(approved: true) } }
337
395
  end
338
396
  end
339
397
 
340
398
  assert_nothing_raised do
341
- subklass.class_eval { scope name, ->{ where(approved: true) } }
399
+ subklass.class_eval { scope name, -> { where(approved: true) } }
342
400
  end
343
401
  end
344
402
  end
@@ -349,11 +407,11 @@ class NamedScopingTest < ActiveRecord::TestCase
349
407
  def test_spaces_in_scope_names
350
408
  klass = Class.new(ActiveRecord::Base) do
351
409
  self.table_name = "topics"
352
- scope :"title containing space", -> { where("title LIKE '% %'") }
353
- scope :approved, -> { where(:approved => true) }
410
+ scope :"title containing space", ->(space: " ") { where("title LIKE '%#{space}%'") }
411
+ scope :approved, -> { where(approved: true) }
354
412
  end
355
- assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
356
- assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
413
+ assert_equal klass.where("title LIKE '% %'"), klass.public_send(:"title containing space", space: " ")
414
+ assert_equal klass.approved.where("title LIKE '% %'"), klass.approved.public_send(:"title containing space", space: " ")
357
415
  end
358
416
 
359
417
  def test_find_all_should_behave_like_select
@@ -365,7 +423,7 @@ class NamedScopingTest < ActiveRecord::TestCase
365
423
  end
366
424
 
367
425
  def test_should_use_where_in_query_for_scope
368
- assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
426
+ assert_equal Developer.where(name: "Jamis").to_set, Developer.where(id: Developer.jamises).to_set
369
427
  end
370
428
 
371
429
  def test_size_should_use_count_when_results_are_not_loaded
@@ -377,7 +435,7 @@ class NamedScopingTest < ActiveRecord::TestCase
377
435
 
378
436
  def test_size_should_use_length_when_results_are_loaded
379
437
  topics = Topic.base
380
- topics.reload # force load
438
+ topics.load # force load
381
439
  assert_no_queries do
382
440
  topics.size # use loaded (no query)
383
441
  end
@@ -396,16 +454,16 @@ class NamedScopingTest < ActiveRecord::TestCase
396
454
 
397
455
  def test_chaining_applies_last_conditions_when_creating
398
456
  post = Topic.rejected.new
399
- assert !post.approved?
457
+ assert_not_predicate post, :approved?
400
458
 
401
459
  post = Topic.rejected.approved.new
402
- assert post.approved?
460
+ assert_predicate post, :approved?
403
461
 
404
462
  post = Topic.approved.rejected.new
405
- assert !post.approved?
463
+ assert_not_predicate post, :approved?
406
464
 
407
465
  post = Topic.approved.rejected.approved.new
408
- assert post.approved?
466
+ assert_predicate post, :approved?
409
467
  end
410
468
 
411
469
  def test_chaining_combines_conditions_when_searching
@@ -420,16 +478,30 @@ class NamedScopingTest < ActiveRecord::TestCase
420
478
  assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
421
479
  end
422
480
 
481
+ def test_class_method_in_scope
482
+ assert_equal topics(:second, :fourth), topics(:first).approved_replies.ordered
483
+ end
484
+
485
+ def test_chaining_doesnt_leak_conditions_to_another_scopes
486
+ expected = Topic.where(approved: false).where(id: Topic.children.select(:parent_id))
487
+ assert_equal expected.to_a, Topic.rejected.has_children.to_a
488
+ end
489
+
490
+ def test_nested_scoping
491
+ expected = Reply.approved
492
+ assert_equal expected.to_a, Topic.rejected.nested_scoping(expected)
493
+ end
494
+
423
495
  def test_scopes_batch_finders
424
496
  assert_equal 4, Topic.approved.count
425
497
 
426
498
  assert_queries(5) do
427
- Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
499
+ Topic.approved.find_each(batch_size: 1) { |t| assert t.approved? }
428
500
  end
429
501
 
430
502
  assert_queries(3) do
431
- Topic.approved.find_in_batches(:batch_size => 2) do |group|
432
- group.each {|t| assert t.approved? }
503
+ Topic.approved.find_in_batches(batch_size: 2) do |group|
504
+ group.each { |t| assert t.approved? }
433
505
  end
434
506
  end
435
507
  end
@@ -454,14 +526,15 @@ class NamedScopingTest < ActiveRecord::TestCase
454
526
 
455
527
  [:public_method, :protected_method, :private_method].each do |reserved_method|
456
528
  assert Topic.respond_to?(reserved_method, true)
457
- ActiveRecord::Base.logger.expects(:warn)
458
- silence_warnings { Topic.scope(reserved_method, -> { }) }
529
+ assert_called(ActiveRecord::Base.logger, :warn) do
530
+ silence_warnings { Topic.scope(reserved_method, -> { }) }
531
+ end
459
532
  end
460
533
  end
461
534
 
462
535
  def test_scopes_on_relations
463
536
  # Topic.replied
464
- approved_topics = Topic.all.approved.order('id DESC')
537
+ approved_topics = Topic.all.approved.order("id DESC")
465
538
  assert_equal topics(:fifth), approved_topics.first
466
539
 
467
540
  replied_approved_topics = approved_topics.replied
@@ -469,9 +542,9 @@ class NamedScopingTest < ActiveRecord::TestCase
469
542
  end
470
543
 
471
544
  def test_index_on_scope
472
- approved = Topic.approved.order('id ASC')
545
+ approved = Topic.approved.order("id ASC")
473
546
  assert_equal topics(:second), approved[0]
474
- assert approved.loaded?
547
+ assert_predicate approved, :loaded?
475
548
  end
476
549
 
477
550
  def test_nested_scopes_queries_size
@@ -510,7 +583,7 @@ class NamedScopingTest < ActiveRecord::TestCase
510
583
  def test_scopes_to_get_newest
511
584
  post = posts(:welcome)
512
585
  old_last_comment = post.comments.newest
513
- new_comment = post.comments.create(:body => "My new comment")
586
+ new_comment = post.comments.create(body: "My new comment")
514
587
  assert_equal new_comment, post.comments.newest
515
588
  assert_not_equal old_last_comment, post.comments.newest
516
589
  end
@@ -520,8 +593,8 @@ class NamedScopingTest < ActiveRecord::TestCase
520
593
 
521
594
  [:destroy_all, :reset, :delete_all].each do |method|
522
595
  before = post.comments.containing_the_letter_e
523
- post.association(:comments).send(method)
524
- assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
596
+ post.association(:comments).public_send(method)
597
+ assert_not_same before, post.comments.containing_the_letter_e, "CollectionAssociation##{method} should reset the named scopes cache"
525
598
  end
526
599
  end
527
600
 
@@ -533,29 +606,44 @@ class NamedScopingTest < ActiveRecord::TestCase
533
606
 
534
607
  def test_eager_default_scope_relations_are_remove
535
608
  klass = Class.new(ActiveRecord::Base)
536
- klass.table_name = 'posts'
609
+ klass.table_name = "posts"
537
610
 
538
611
  assert_raises(ArgumentError) do
539
- klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
612
+ klass.send(:default_scope, klass.where(id: posts(:welcome).id))
540
613
  end
541
614
  end
542
615
 
543
616
  def test_subclass_merges_scopes_properly
544
- assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
617
+ assert_equal 1, SpecialComment.where(body: "go crazy").created.count
618
+ end
619
+
620
+ def test_model_class_should_respond_to_extending
621
+ assert_raises OopsError do
622
+ Comment.unscoped.oops_comments.destroy_all
623
+ end
545
624
  end
546
625
 
547
626
  def test_model_class_should_respond_to_none
548
- assert !Topic.none?
627
+ assert_not_predicate Topic, :none?
549
628
  Topic.delete_all
550
- assert Topic.none?
629
+ assert_predicate Topic, :none?
551
630
  end
552
631
 
553
632
  def test_model_class_should_respond_to_one
554
- assert !Topic.one?
633
+ assert_not_predicate Topic, :one?
555
634
  Topic.delete_all
556
- assert !Topic.one?
635
+ assert_not_predicate Topic, :one?
557
636
  Topic.create!
558
- assert Topic.one?
637
+ assert_predicate Topic, :one?
559
638
  end
560
639
 
640
+ def test_scope_with_annotation
641
+ Topic.class_eval do
642
+ scope :including_annotate_in_scope, Proc.new { annotate("from-scope") }
643
+ end
644
+
645
+ assert_sql(%r{/\* from-scope \*/}) do
646
+ assert Topic.including_annotate_in_scope.to_a, Topic.all.to_a
647
+ end
648
+ end
561
649
  end