sequel 5.29.0 → 5.30.0

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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +8 -1922
  3. data/doc/release_notes/5.30.0.txt +20 -0
  4. data/lib/sequel/adapters/shared/sqlite.rb +7 -1
  5. data/lib/sequel/database/transactions.rb +5 -9
  6. data/lib/sequel/version.rb +1 -1
  7. metadata +4 -368
  8. data/Rakefile +0 -151
  9. data/doc/release_notes/4.0.0.txt +0 -262
  10. data/doc/release_notes/4.1.0.txt +0 -85
  11. data/doc/release_notes/4.10.0.txt +0 -226
  12. data/doc/release_notes/4.11.0.txt +0 -147
  13. data/doc/release_notes/4.12.0.txt +0 -105
  14. data/doc/release_notes/4.13.0.txt +0 -169
  15. data/doc/release_notes/4.14.0.txt +0 -68
  16. data/doc/release_notes/4.15.0.txt +0 -56
  17. data/doc/release_notes/4.16.0.txt +0 -36
  18. data/doc/release_notes/4.17.0.txt +0 -38
  19. data/doc/release_notes/4.18.0.txt +0 -36
  20. data/doc/release_notes/4.19.0.txt +0 -45
  21. data/doc/release_notes/4.2.0.txt +0 -129
  22. data/doc/release_notes/4.20.0.txt +0 -79
  23. data/doc/release_notes/4.21.0.txt +0 -94
  24. data/doc/release_notes/4.22.0.txt +0 -72
  25. data/doc/release_notes/4.23.0.txt +0 -65
  26. data/doc/release_notes/4.24.0.txt +0 -99
  27. data/doc/release_notes/4.25.0.txt +0 -181
  28. data/doc/release_notes/4.26.0.txt +0 -44
  29. data/doc/release_notes/4.27.0.txt +0 -78
  30. data/doc/release_notes/4.28.0.txt +0 -57
  31. data/doc/release_notes/4.29.0.txt +0 -41
  32. data/doc/release_notes/4.3.0.txt +0 -40
  33. data/doc/release_notes/4.30.0.txt +0 -37
  34. data/doc/release_notes/4.31.0.txt +0 -57
  35. data/doc/release_notes/4.32.0.txt +0 -132
  36. data/doc/release_notes/4.33.0.txt +0 -88
  37. data/doc/release_notes/4.34.0.txt +0 -86
  38. data/doc/release_notes/4.35.0.txt +0 -130
  39. data/doc/release_notes/4.36.0.txt +0 -116
  40. data/doc/release_notes/4.37.0.txt +0 -50
  41. data/doc/release_notes/4.38.0.txt +0 -67
  42. data/doc/release_notes/4.39.0.txt +0 -127
  43. data/doc/release_notes/4.4.0.txt +0 -92
  44. data/doc/release_notes/4.40.0.txt +0 -179
  45. data/doc/release_notes/4.41.0.txt +0 -77
  46. data/doc/release_notes/4.42.0.txt +0 -221
  47. data/doc/release_notes/4.43.0.txt +0 -87
  48. data/doc/release_notes/4.44.0.txt +0 -125
  49. data/doc/release_notes/4.45.0.txt +0 -370
  50. data/doc/release_notes/4.46.0.txt +0 -404
  51. data/doc/release_notes/4.47.0.txt +0 -56
  52. data/doc/release_notes/4.48.0.txt +0 -293
  53. data/doc/release_notes/4.49.0.txt +0 -222
  54. data/doc/release_notes/4.5.0.txt +0 -34
  55. data/doc/release_notes/4.6.0.txt +0 -30
  56. data/doc/release_notes/4.7.0.txt +0 -103
  57. data/doc/release_notes/4.8.0.txt +0 -175
  58. data/doc/release_notes/4.9.0.txt +0 -190
  59. data/spec/adapter_spec.rb +0 -4
  60. data/spec/adapters/db2_spec.rb +0 -170
  61. data/spec/adapters/mssql_spec.rb +0 -828
  62. data/spec/adapters/mysql_spec.rb +0 -1060
  63. data/spec/adapters/oracle_spec.rb +0 -371
  64. data/spec/adapters/postgres_spec.rb +0 -4476
  65. data/spec/adapters/spec_helper.rb +0 -44
  66. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  67. data/spec/adapters/sqlite_spec.rb +0 -652
  68. data/spec/bin_spec.rb +0 -278
  69. data/spec/core/connection_pool_spec.rb +0 -1250
  70. data/spec/core/database_spec.rb +0 -2915
  71. data/spec/core/dataset_spec.rb +0 -5544
  72. data/spec/core/deprecated_spec.rb +0 -70
  73. data/spec/core/expression_filters_spec.rb +0 -1498
  74. data/spec/core/mock_adapter_spec.rb +0 -722
  75. data/spec/core/object_graph_spec.rb +0 -336
  76. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  77. data/spec/core/schema_generator_spec.rb +0 -214
  78. data/spec/core/schema_spec.rb +0 -1844
  79. data/spec/core/spec_helper.rb +0 -24
  80. data/spec/core/version_spec.rb +0 -14
  81. data/spec/core_extensions_spec.rb +0 -763
  82. data/spec/core_model_spec.rb +0 -2
  83. data/spec/core_spec.rb +0 -1
  84. data/spec/deprecation_helper.rb +0 -30
  85. data/spec/extensions/accessed_columns_spec.rb +0 -51
  86. data/spec/extensions/active_model_spec.rb +0 -99
  87. data/spec/extensions/after_initialize_spec.rb +0 -28
  88. data/spec/extensions/any_not_empty_spec.rb +0 -23
  89. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  90. data/spec/extensions/association_dependencies_spec.rb +0 -125
  91. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  92. data/spec/extensions/association_pks_spec.rb +0 -423
  93. data/spec/extensions/association_proxies_spec.rb +0 -100
  94. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  95. data/spec/extensions/auto_validations_spec.rb +0 -229
  96. data/spec/extensions/blacklist_security_spec.rb +0 -95
  97. data/spec/extensions/blank_spec.rb +0 -69
  98. data/spec/extensions/boolean_readers_spec.rb +0 -93
  99. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  100. data/spec/extensions/caching_spec.rb +0 -273
  101. data/spec/extensions/caller_logging_spec.rb +0 -52
  102. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  103. data/spec/extensions/column_conflicts_spec.rb +0 -75
  104. data/spec/extensions/column_select_spec.rb +0 -129
  105. data/spec/extensions/columns_introspection_spec.rb +0 -90
  106. data/spec/extensions/columns_updated_spec.rb +0 -35
  107. data/spec/extensions/composition_spec.rb +0 -248
  108. data/spec/extensions/connection_expiration_spec.rb +0 -151
  109. data/spec/extensions/connection_validator_spec.rb +0 -144
  110. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  111. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  112. data/spec/extensions/constraint_validations_spec.rb +0 -439
  113. data/spec/extensions/core_refinements_spec.rb +0 -528
  114. data/spec/extensions/csv_serializer_spec.rb +0 -183
  115. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  116. data/spec/extensions/dataset_associations_spec.rb +0 -365
  117. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  118. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  119. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  120. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  121. data/spec/extensions/defaults_setter_spec.rb +0 -150
  122. data/spec/extensions/delay_add_association_spec.rb +0 -73
  123. data/spec/extensions/dirty_spec.rb +0 -222
  124. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  125. data/spec/extensions/eager_each_spec.rb +0 -62
  126. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  127. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  128. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  129. data/spec/extensions/error_splitter_spec.rb +0 -18
  130. data/spec/extensions/error_sql_spec.rb +0 -20
  131. data/spec/extensions/escaped_like_spec.rb +0 -40
  132. data/spec/extensions/eval_inspect_spec.rb +0 -81
  133. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  134. data/spec/extensions/finder_spec.rb +0 -260
  135. data/spec/extensions/force_encoding_spec.rb +0 -126
  136. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  137. data/spec/extensions/graph_each_spec.rb +0 -113
  138. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  139. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  140. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  141. data/spec/extensions/index_caching_spec.rb +0 -66
  142. data/spec/extensions/inflector_spec.rb +0 -183
  143. data/spec/extensions/input_transformer_spec.rb +0 -69
  144. data/spec/extensions/insert_conflict_spec.rb +0 -103
  145. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  146. data/spec/extensions/instance_filters_spec.rb +0 -79
  147. data/spec/extensions/instance_hooks_spec.rb +0 -246
  148. data/spec/extensions/integer64_spec.rb +0 -22
  149. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  150. data/spec/extensions/json_serializer_spec.rb +0 -346
  151. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  152. data/spec/extensions/list_spec.rb +0 -291
  153. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  154. data/spec/extensions/many_through_many_spec.rb +0 -2177
  155. data/spec/extensions/migration_spec.rb +0 -864
  156. data/spec/extensions/modification_detection_spec.rb +0 -93
  157. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  158. data/spec/extensions/named_timezones_spec.rb +0 -218
  159. data/spec/extensions/nested_attributes_spec.rb +0 -815
  160. data/spec/extensions/null_dataset_spec.rb +0 -85
  161. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  162. data/spec/extensions/pagination_spec.rb +0 -116
  163. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  164. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  165. data/spec/extensions/pg_array_spec.rb +0 -398
  166. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  167. data/spec/extensions/pg_enum_spec.rb +0 -118
  168. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  169. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  170. data/spec/extensions/pg_hstore_spec.rb +0 -219
  171. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  172. data/spec/extensions/pg_inet_spec.rb +0 -72
  173. data/spec/extensions/pg_interval_spec.rb +0 -103
  174. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  175. data/spec/extensions/pg_json_spec.rb +0 -451
  176. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  177. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  178. data/spec/extensions/pg_range_spec.rb +0 -600
  179. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  180. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  181. data/spec/extensions/pg_row_spec.rb +0 -363
  182. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  183. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  184. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  185. data/spec/extensions/prepared_statements_spec.rb +0 -177
  186. data/spec/extensions/pretty_table_spec.rb +0 -123
  187. data/spec/extensions/query_spec.rb +0 -94
  188. data/spec/extensions/rcte_tree_spec.rb +0 -387
  189. data/spec/extensions/round_timestamps_spec.rb +0 -39
  190. data/spec/extensions/s_spec.rb +0 -60
  191. data/spec/extensions/schema_caching_spec.rb +0 -64
  192. data/spec/extensions/schema_dumper_spec.rb +0 -870
  193. data/spec/extensions/select_remove_spec.rb +0 -38
  194. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  195. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  196. data/spec/extensions/serialization_spec.rb +0 -365
  197. data/spec/extensions/server_block_spec.rb +0 -135
  198. data/spec/extensions/server_logging_spec.rb +0 -45
  199. data/spec/extensions/sharding_spec.rb +0 -197
  200. data/spec/extensions/shared_caching_spec.rb +0 -151
  201. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  202. data/spec/extensions/singular_table_names_spec.rb +0 -22
  203. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  204. data/spec/extensions/spec_helper.rb +0 -70
  205. data/spec/extensions/split_array_nil_spec.rb +0 -24
  206. data/spec/extensions/split_values_spec.rb +0 -57
  207. data/spec/extensions/sql_comments_spec.rb +0 -33
  208. data/spec/extensions/sql_expr_spec.rb +0 -59
  209. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  210. data/spec/extensions/static_cache_spec.rb +0 -471
  211. data/spec/extensions/string_agg_spec.rb +0 -90
  212. data/spec/extensions/string_date_time_spec.rb +0 -95
  213. data/spec/extensions/string_stripper_spec.rb +0 -68
  214. data/spec/extensions/subclasses_spec.rb +0 -79
  215. data/spec/extensions/subset_conditions_spec.rb +0 -38
  216. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  217. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  218. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  219. data/spec/extensions/table_select_spec.rb +0 -83
  220. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  221. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  222. data/spec/extensions/throw_failures_spec.rb +0 -74
  223. data/spec/extensions/timestamps_spec.rb +0 -209
  224. data/spec/extensions/to_dot_spec.rb +0 -153
  225. data/spec/extensions/touch_spec.rb +0 -226
  226. data/spec/extensions/tree_spec.rb +0 -334
  227. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  228. data/spec/extensions/unlimited_update_spec.rb +0 -21
  229. data/spec/extensions/update_or_create_spec.rb +0 -83
  230. data/spec/extensions/update_primary_key_spec.rb +0 -105
  231. data/spec/extensions/update_refresh_spec.rb +0 -59
  232. data/spec/extensions/uuid_spec.rb +0 -101
  233. data/spec/extensions/validate_associated_spec.rb +0 -52
  234. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  235. data/spec/extensions/validation_contexts_spec.rb +0 -31
  236. data/spec/extensions/validation_helpers_spec.rb +0 -525
  237. data/spec/extensions/whitelist_security_spec.rb +0 -157
  238. data/spec/extensions/xml_serializer_spec.rb +0 -213
  239. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  240. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  241. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  242. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  243. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  244. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  245. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  246. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  247. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  248. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  249. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  250. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  251. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  252. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  253. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  254. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  255. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  256. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  257. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  258. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  259. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  260. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  261. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  262. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  263. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  264. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  265. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  266. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  267. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  268. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  269. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  270. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  271. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  272. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  273. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  274. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  275. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  276. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  277. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  278. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  279. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  280. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  281. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  282. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  283. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  284. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  285. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  286. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  287. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  288. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  289. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  290. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  291. data/spec/guards_helper.rb +0 -59
  292. data/spec/integration/associations_test.rb +0 -2597
  293. data/spec/integration/database_test.rb +0 -113
  294. data/spec/integration/dataset_test.rb +0 -2037
  295. data/spec/integration/eager_loader_test.rb +0 -687
  296. data/spec/integration/migrator_test.rb +0 -262
  297. data/spec/integration/model_test.rb +0 -203
  298. data/spec/integration/plugin_test.rb +0 -2423
  299. data/spec/integration/prepared_statement_test.rb +0 -405
  300. data/spec/integration/schema_test.rb +0 -903
  301. data/spec/integration/spec_helper.rb +0 -71
  302. data/spec/integration/timezone_test.rb +0 -86
  303. data/spec/integration/transaction_test.rb +0 -603
  304. data/spec/integration/type_test.rb +0 -127
  305. data/spec/model/association_reflection_spec.rb +0 -803
  306. data/spec/model/associations_spec.rb +0 -4738
  307. data/spec/model/base_spec.rb +0 -875
  308. data/spec/model/class_dataset_methods_spec.rb +0 -146
  309. data/spec/model/dataset_methods_spec.rb +0 -198
  310. data/spec/model/eager_loading_spec.rb +0 -2377
  311. data/spec/model/hooks_spec.rb +0 -370
  312. data/spec/model/inflector_spec.rb +0 -26
  313. data/spec/model/model_spec.rb +0 -956
  314. data/spec/model/plugins_spec.rb +0 -429
  315. data/spec/model/record_spec.rb +0 -2118
  316. data/spec/model/spec_helper.rb +0 -46
  317. data/spec/model/validations_spec.rb +0 -220
  318. data/spec/model_no_assoc_spec.rb +0 -1
  319. data/spec/model_spec.rb +0 -1
  320. data/spec/plugin_spec.rb +0 -1
  321. data/spec/sequel_coverage.rb +0 -15
  322. data/spec/sequel_warning.rb +0 -5
  323. data/spec/spec_config.rb +0 -12
@@ -1,205 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Dataset#where" do
4
- before do
5
- @dataset = Sequel.mock[:test].extension(:auto_literal_strings)
6
- end
7
-
8
- it "should work with a string with placeholders and arguments for those placeholders" do
9
- @dataset.where('price < ? AND id in ?', 100, [1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
10
- end
11
-
12
- it "should use default behavior for array of conditions" do
13
- @dataset.where([[:a, 1], [:b, 2]]).sql.must_equal 'SELECT * FROM test WHERE ((a = 1) AND (b = 2))'
14
- end
15
-
16
- it "should not modify passed array with placeholders" do
17
- a = ['price < ? AND id in ?', 100, 1, 2, 3]
18
- b = a.dup
19
- @dataset.where(a)
20
- b.must_equal a
21
- end
22
-
23
- it "should work with strings (custom SQL expressions)" do
24
- @dataset.where('(a = 1 AND b = 2)').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1 AND b = 2))"
25
- end
26
-
27
- it "should work with a string with named placeholders and a hash of placeholder value arguments" do
28
- @dataset.where('price < :price AND id in :ids', :price=>100, :ids=>[1, 2, 3]).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in (1, 2, 3))"
29
- end
30
-
31
- it "should not modify passed array with named placeholders" do
32
- a = ['price < :price AND id in :ids', {:price=>100}]
33
- b = a.dup
34
- @dataset.where(a)
35
- b.must_equal a
36
- end
37
-
38
- it "should not replace named placeholders that don't exist in the hash" do
39
- @dataset.where('price < :price AND id in :ids', :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id in :ids)"
40
- end
41
-
42
- it "should raise an error for a mismatched number of placeholders" do
43
- proc{@dataset.where('price < ? AND id in ?', 100).select_sql}.must_raise(Sequel::Error)
44
- proc{@dataset.where('price < ? AND id in ?', 100, [1, 2, 3], 4).select_sql}.must_raise(Sequel::Error)
45
- end
46
-
47
- it "should handle partial names" do
48
- @dataset.where('price < :price AND id = :p', :p=>2, :price=>100).select_sql.must_equal "SELECT * FROM test WHERE (price < 100 AND id = 2)"
49
- end
50
-
51
- it "should handle ::cast syntax when no parameters are supplied" do
52
- @dataset.where('price::float = 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float = 10)"
53
- @dataset.where('price::float ? 10', {}).select_sql.must_equal "SELECT * FROM test WHERE (price::float ? 10)"
54
- end
55
-
56
- it "should affect select, delete and update statements when using strings" do
57
- @d2 = @dataset.where('region = ?', 'Asia')
58
- @d2.select_sql.must_equal "SELECT * FROM test WHERE (region = 'Asia')"
59
- @d2.delete_sql.must_equal "DELETE FROM test WHERE (region = 'Asia')"
60
- @d2.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (region = 'Asia')"
61
-
62
- @d3 = @dataset.where("a = 1")
63
- @d3.select_sql.must_equal "SELECT * FROM test WHERE (a = 1)"
64
- @d3.delete_sql.must_equal "DELETE FROM test WHERE (a = 1)"
65
- @d3.update_sql(:GDP => 0).must_equal "UPDATE test SET GDP = 0 WHERE (a = 1)"
66
- end
67
-
68
- it "should be composable using AND operator (for scoping) when using strings" do
69
- @d2 = @dataset.where('region = ?', 'Asia')
70
- @d2.where('GDP > ?', 1000).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > 1000))"
71
- @d2.where(:name => ['Japan', 'China']).select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (name IN ('Japan', 'China')))"
72
- @d2.where('GDP > ?').select_sql.must_equal "SELECT * FROM test WHERE ((region = 'Asia') AND (GDP > ?))"
73
-
74
- @d3 = @dataset.where("a = 1")
75
- @d3.where('b = 2').select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (b = 2))"
76
- @d3.where(:c => 3).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (c = 3))"
77
- @d3.where('d = ?', 4).select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (d = 4))"
78
- end
79
-
80
- it "should be composable using AND operator (for scoping) with block and string" do
81
- @dataset.where("a = 1").where{e < 5}.select_sql.must_equal "SELECT * FROM test WHERE ((a = 1) AND (e < 5))"
82
- end
83
- end
84
-
85
- describe "Dataset #first and #last" do
86
- before do
87
- @d = Sequel.mock(:fetch=>proc{|s| {:s=>s}})[:test].extension(:auto_literal_strings)
88
- end
89
-
90
- it "should combine block and standard argument filters if argument is not an Integer" do
91
- ds = @d.order(:name).freeze
92
- 5.times do
93
- @d.first('y = 25'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
94
- ds.last('y = 16'){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
95
- @d.first('y = ?', 25){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 25) AND (z > 26)) LIMIT 1')
96
- ds.last('y = ?', 16){z > 26}.must_equal(:s=>'SELECT * FROM test WHERE ((y = 16) AND (z > 26)) ORDER BY name DESC LIMIT 1')
97
- end
98
- end
99
- end
100
-
101
- describe "Dataset#exclude" do
102
- before do
103
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
104
- end
105
-
106
- it "should parenthesize a single string condition correctly" do
107
- @dataset.exclude("region = 'Asia' AND name = 'Japan'").select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
108
- end
109
-
110
- it "should parenthesize an array condition correctly" do
111
- @dataset.exclude('region = ? AND name = ?', 'Asia', 'Japan').select_sql.must_equal "SELECT * FROM test WHERE NOT (region = 'Asia' AND name = 'Japan')"
112
- end
113
- end
114
-
115
- describe "Dataset#or" do
116
- before do
117
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
118
- @d1 = @dataset.where(:x => 1)
119
- end
120
-
121
- it "should accept string filters" do
122
- @d1.or('y > ?', 2).sql.must_equal 'SELECT * FROM test WHERE ((x = 1) OR (y > 2))'
123
- end
124
- end
125
-
126
- describe "Dataset#having" do
127
- before do
128
- @dataset = Sequel.mock.dataset.from(:test).extension(:auto_literal_strings)
129
- @grouped = @dataset.group(:region).select(:region, Sequel.function(:sum, :population), Sequel.function(:avg, :gdp))
130
- end
131
-
132
- it "should handle string arguments" do
133
- @grouped.having('sum(population) > 10').select_sql.must_equal "SELECT region, sum(population), avg(gdp) FROM test GROUP BY region HAVING (sum(population) > 10)"
134
- end
135
- end
136
-
137
- describe "Dataset#join_table" do
138
- before do
139
- @d = Sequel.mock.dataset.from(:items).with_quote_identifiers(true).extension(:auto_literal_strings)
140
- end
141
-
142
- it "should support using a string as the join condition" do
143
- @d.join(:categories, "c.item_id = items.id", :table_alias=>:c).sql.must_equal 'SELECT * FROM "items" INNER JOIN "categories" AS "c" ON (c.item_id = items.id)'
144
- end
145
- end
146
-
147
- describe "Dataset prepared statements and bound variables " do
148
- before do
149
- @db = Sequel.mock
150
- @ds = @db[:items].with_extend{def insert_select_sql(*v) "#{insert_sql(*v)} RETURNING *" end}.extension(:auto_literal_strings)
151
- end
152
-
153
- it "should handle literal strings" do
154
- @ds.filter("num = ?", :$n).call(:select, :n=>1)
155
- @db.sqls.must_equal ['SELECT * FROM items WHERE (num = 1)']
156
- end
157
-
158
- it "should handle subselects with strings" do
159
- @ds.filter(:$b).filter(:num=>@ds.select(:num).filter("num = ?", :$n)).call(:select, :n=>1, :b=>0)
160
- @db.sqls.must_equal ['SELECT * FROM items WHERE (0 AND (num IN (SELECT num FROM items WHERE (num = 1))))']
161
- end
162
- end
163
-
164
- describe "Dataset#update_sql" do
165
- before do
166
- @ds = Sequel.mock.dataset.from(:items).extension(:auto_literal_strings)
167
- end
168
-
169
- it "should accept strings" do
170
- @ds.update_sql("a = b").must_equal "UPDATE items SET a = b"
171
- end
172
-
173
- it "should accept literal strings" do
174
- @ds.update_sql(Sequel.lit("a = b")).must_equal "UPDATE items SET a = b"
175
- end
176
-
177
- it "should accept hash" do
178
- @ds.update_sql(:c => 'd').must_equal "UPDATE items SET c = 'd'"
179
- end
180
- end
181
-
182
- describe "Dataset::PlaceholderLiteralizer" do
183
- before do
184
- @c = Sequel::Dataset::PlaceholderLiteralizer
185
- @db = Sequel.mock
186
- @ds = @db[:items].extension(:auto_literal_strings)
187
- @h = {:id=>1}
188
- @ds.db.fetch = @h
189
- end
190
-
191
- it "should handle calls with a placeholders used as filter arguments" do
192
- loader = @c.loader(@ds){|pl, ds| ds.where(pl.arg)}
193
- loader.first(:id=>1).must_equal @h
194
- loader.first(Sequel.expr{a(b)}).must_equal @h
195
- loader.first("a = 1").must_equal @h
196
- @db.sqls.must_equal ["SELECT * FROM items WHERE (id = 1)", "SELECT * FROM items WHERE a(b)", "SELECT * FROM items WHERE (a = 1)"]
197
- end
198
-
199
- it "should handle calls with a placeholder used multiple times in different capacities" do
200
- loader = @c.loader(@ds){|pl, ds| a = pl.arg; ds.where(a).where(:b=>a)}
201
- loader.first("a = 1").must_equal @h
202
- loader.first(["a = ?", 2]).must_equal @h
203
- @db.sqls.must_equal ["SELECT * FROM items WHERE ((a = 1) AND (b = 'a = 1'))", "SELECT * FROM items WHERE ((a = 2) AND (b IN ('a = ?', 2)))"]
204
- end
205
- end
@@ -1,229 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::AutoValidations" do
4
- before do
5
- db = Sequel.mock(:fetch=>proc{|sql| sql =~ /a{51}/ ? {:v=>0} : {:v=>1}})
6
- def db.schema_parse_table(*) true; end
7
- def db.schema(t, *)
8
- t = t.first_source if t.is_a?(Sequel::Dataset)
9
- return [] if t != :test
10
- [[:id, {:primary_key=>true, :type=>:integer, :allow_null=>false}],
11
- [:name, {:primary_key=>false, :type=>:string, :allow_null=>false, :max_length=>50}],
12
- [:num, {:primary_key=>false, :type=>:integer, :allow_null=>true}],
13
- [:d, {:primary_key=>false, :type=>:date, :allow_null=>false}],
14
- [:nnd, {:primary_key=>false, :type=>:string, :allow_null=>false, :default=>'nnd'}]]
15
- end
16
- def db.supports_index_parsing?() true end
17
- def db.indexes(t, *)
18
- raise if t.is_a?(Sequel::Dataset)
19
- return [] if t != :test
20
- {:a=>{:columns=>[:name, :num], :unique=>true}, :b=>{:columns=>[:num], :unique=>false}}
21
- end
22
- @c = Class.new(Sequel::Model(db[:test]))
23
- @c.send(:def_column_accessor, :id, :name, :num, :d, :nnd)
24
- @c.raise_on_typecast_failure = false
25
- @c.plugin :auto_validations
26
- @m = @c.new
27
- db.sqls
28
- end
29
-
30
- it "should have automatically created validations" do
31
- @m.valid?.must_equal false
32
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
33
-
34
- @m.name = ''
35
- @m.valid?.must_equal false
36
- @m.errors.must_equal(:d=>["is not present"])
37
-
38
- @m.set(:d=>'/', :num=>'a', :name=>'1')
39
- @m.valid?.must_equal false
40
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
41
-
42
- @m.set(:d=>Date.today, :num=>1)
43
- @m.valid?.must_equal false
44
- @m.errors.must_equal([:name, :num]=>["is already taken"])
45
-
46
- @m.set(:name=>'a'*51)
47
- @m.valid?.must_equal false
48
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
49
- end
50
-
51
- it "should handle simple unique indexes correctly" do
52
- def (@c.db).indexes(t, *)
53
- raise if t.is_a?(Sequel::Dataset)
54
- return [] if t != :test
55
- {:a=>{:columns=>[:name], :unique=>true}}
56
- end
57
- @c.plugin :auto_validations
58
- @m.set(:name=>'foo', :d=>Date.today)
59
- @m.valid?.must_equal false
60
- @m.errors.must_equal(:name=>["is already taken"])
61
- end
62
-
63
- it "should validate using the underlying column values" do
64
- @c.send(:define_method, :name){super() * 2}
65
- @c.db.fetch = {:v=>0}
66
- @m.set(:d=>Date.today, :num=>1, :name=>'b'*26)
67
- @m.valid?.must_equal true
68
- end
69
-
70
- it "should handle databases that don't support index parsing" do
71
- def (@m.db).supports_index_parsing?() false end
72
- @m.model.send(:setup_auto_validations)
73
- @m.set(:d=>Date.today, :num=>1, :name=>'1')
74
- @m.valid?.must_equal true
75
- end
76
-
77
- it "should handle models that select from subqueries" do
78
- @c.set_dataset @c.dataset.from_self
79
- @c.send(:setup_auto_validations)
80
- end
81
-
82
- it "should support :not_null=>:presence option" do
83
- @c.plugin :auto_validations, :not_null=>:presence
84
- @m.set(:d=>Date.today, :num=>'')
85
- @m.valid?.must_equal false
86
- @m.errors.must_equal(:name=>["is not present"])
87
- end
88
-
89
- it "should automatically validate explicit nil values for columns with not nil defaults" do
90
- @m.set(:d=>Date.today, :name=>1, :nnd=>nil)
91
- @m.id = nil
92
- @m.valid?.must_equal false
93
- @m.errors.must_equal(:id=>["is not present"], :nnd=>["is not present"])
94
- end
95
-
96
- it "should allow skipping validations by type" do
97
- @c = Class.new(@c)
98
- @m = @c.new
99
- @m.skip_auto_validations(:not_null) do
100
- @m.valid?.must_equal true
101
- @m.nnd = nil
102
- @m.valid?.must_equal true
103
- end
104
- @m.set(:nnd => 'nnd')
105
- @c.skip_auto_validations(:not_null)
106
- @m.valid?.must_equal true
107
- @m.nnd = nil
108
- @m.valid?.must_equal true
109
-
110
- @m.set(:d=>'/', :num=>'a', :name=>'1')
111
- @m.valid?.must_equal false
112
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
113
-
114
- @m.skip_auto_validations(:types, :unique) do
115
- @m.valid?.must_equal true
116
- end
117
- @m.skip_auto_validations(:types) do
118
- @m.valid?.must_equal false
119
- @m.errors.must_equal([:name, :num]=>["is already taken"])
120
- end
121
- @c.skip_auto_validations(:types)
122
- @m.valid?.must_equal false
123
- @m.errors.must_equal([:name, :num]=>["is already taken"])
124
-
125
- @m.skip_auto_validations(:unique) do
126
- @m.valid?.must_equal true
127
- end
128
- @c.skip_auto_validations(:unique)
129
- @m.valid?.must_equal true
130
-
131
- @m.set(:name=>'a'*51)
132
- @m.valid?.must_equal false
133
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
134
-
135
- @m.skip_auto_validations(:max_length) do
136
- @m.valid?.must_equal true
137
- end
138
- @c.skip_auto_validations(:max_length)
139
- @m.valid?.must_equal true
140
- end
141
-
142
- it "should allow skipping all auto validations" do
143
- @c = Class.new(@c)
144
- @m = @c.new
145
- @m.skip_auto_validations(:all) do
146
- @m.valid?.must_equal true
147
- @m.set(:d=>'/', :num=>'a', :name=>'1')
148
- @m.valid?.must_equal true
149
- @m.set(:name=>'a'*51)
150
- @m.valid?.must_equal true
151
- end
152
- @m = @c.new
153
- @c.skip_auto_validations(:all)
154
- @m.valid?.must_equal true
155
- @m.set(:d=>'/', :num=>'a', :name=>'1')
156
- @m.valid?.must_equal true
157
- @m.set(:name=>'a'*51)
158
- @m.valid?.must_equal true
159
- end
160
-
161
- it "should work correctly in subclasses" do
162
- @c = Class.new(@c)
163
- @m = @c.new
164
- @m.valid?.must_equal false
165
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
166
-
167
- @m.set(:d=>'/', :num=>'a', :name=>'1')
168
- @m.valid?.must_equal false
169
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
170
-
171
- @m.set(:d=>Date.today, :num=>1)
172
- @m.valid?.must_equal false
173
- @m.errors.must_equal([:name, :num]=>["is already taken"])
174
-
175
- @m.set(:name=>'a'*51)
176
- @m.valid?.must_equal false
177
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
178
- end
179
-
180
- it "should work correctly in STI subclasses" do
181
- @c.plugin(:single_table_inheritance, :num, :model_map=>{1=>@c}, :key_map=>proc{[1, 2]})
182
- sc = Class.new(@c)
183
- @m = sc.new
184
- @m.valid?.must_equal false
185
- @m.errors.must_equal(:d=>["is not present"], :name=>["is not present"])
186
-
187
- @m.set(:d=>'/', :num=>'a', :name=>'1')
188
- @m.valid?.must_equal false
189
- @m.errors.must_equal(:d=>["is not a valid date"], :num=>["is not a valid integer"])
190
-
191
- @m.db.sqls
192
- @m.set(:d=>Date.today, :num=>1)
193
- @m.valid?.must_equal false
194
- @m.errors.must_equal([:name, :num]=>["is already taken"])
195
- @m.db.sqls.must_equal ["SELECT count(*) AS count FROM test WHERE ((name = '1') AND (num = 1)) LIMIT 1"]
196
-
197
- @m.set(:name=>'a'*51)
198
- @m.valid?.must_equal false
199
- @m.errors.must_equal(:name=>["is longer than 50 characters"])
200
- end
201
-
202
- it "should work correctly when changing the dataset" do
203
- @c.set_dataset(@c.db[:foo])
204
- @c.new.valid?.must_equal true
205
- end
206
-
207
- it "should support setting validator options" do
208
- sc = Class.new(@c)
209
- sc.plugin :auto_validations, :max_length_opts=> {:message=> 'ml_message'}, :schema_types_opts=> {:message=> 'st_message'}, :explicit_not_null_opts=> {:message=> 'enn_message'}, :unique_opts=> {:message=> 'u_message'}
210
-
211
- @m = sc.new
212
- @m.set(:name=>'a'*51, :d => '/', :nnd => nil, :num=>1)
213
- @m.valid?.must_equal false
214
- @m.errors.must_equal(:name=>["ml_message"], :d=>["st_message"], :nnd=>["enn_message"])
215
-
216
- @m = sc.new
217
- @m.set(:name=>1, :num=>1, :d=>Date.today)
218
- @m.valid?.must_equal false
219
- @m.errors.must_equal([:name, :num]=>["u_message"])
220
- end
221
-
222
- it "should not allow modifying auto validation information for frozen model classes" do
223
- @c.freeze
224
- @c.auto_validate_not_null_columns.frozen?.must_equal true
225
- @c.auto_validate_explicit_not_null_columns.frozen?.must_equal true
226
- @c.auto_validate_max_length_columns.frozen?.must_equal true
227
- @c.auto_validate_unique_columns.frozen?.must_equal true
228
- end
229
- end
@@ -1,95 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model, "#(set|update)_except" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items))
6
- @c.class_eval do
7
- plugin :blacklist_security
8
- set_primary_key :id
9
- columns :x, :y, :z, :id
10
- set_restricted_columns :y
11
- end
12
- @c.strict_param_setting = false
13
- @o1 = @c.new
14
- DB.reset
15
- end
16
-
17
- it "should raise errors if not all hash fields can be set and strict_param_setting is true" do
18
- @c.strict_param_setting = true
19
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, :x, :y)}.must_raise(Sequel::MassAssignmentRestriction)
20
- proc{@c.new.set_except({:x => 1, :y => 2, :z=>3}, :x, :y)}.must_raise(Sequel::MassAssignmentRestriction)
21
- (o = @c.new).set_except({:z => 3}, :x, :y)
22
- o.values.must_equal(:z=>3)
23
- end
24
-
25
- it "#set_except should not set given attributes or the primary key" do
26
- @o1.set_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
27
- @o1.values.must_equal(:x => 1)
28
- @o1.set_except({:x => 4, :y => 2, :z=>3, :id=>4}, :y, :z)
29
- @o1.values.must_equal(:x => 4)
30
- end
31
-
32
- it "#update_except should not update given attributes" do
33
- @o1.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
34
- DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
35
- @c.new.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, :y, :z)
36
- DB.sqls.must_equal ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE id = 10"]
37
- end
38
- end
39
-
40
- describe Sequel::Model, ".restricted_columns " do
41
- before do
42
- @c = Class.new(Sequel::Model(:blahblah))
43
- @c.class_eval do
44
- plugin :blacklist_security
45
- columns :x, :y, :z
46
- end
47
- @c.strict_param_setting = false
48
- @c.instance_variable_set(:@columns, [:x, :y, :z])
49
- DB.sqls
50
- end
51
-
52
- it "should set the restricted columns correctly" do
53
- @c.restricted_columns.must_be_nil
54
- @c.set_restricted_columns :x
55
- @c.restricted_columns.must_equal [:x]
56
- @c.set_restricted_columns :x, :y
57
- @c.restricted_columns.must_equal [:x, :y]
58
- end
59
-
60
- it "should not set restricted columns by default" do
61
- @c.set_restricted_columns :z
62
- i = @c.new(:x => 1, :y => 2, :z => 3)
63
- i.values.must_equal(:x => 1, :y => 2)
64
- i.set(:x => 4, :y => 5, :z => 6)
65
- i.values.must_equal(:x => 4, :y => 5)
66
-
67
- @c.dataset = @c.dataset.with_fetch(:x => 7)
68
- i = @c.new
69
- i.update(:x => 7, :z => 9)
70
- i.values.must_equal(:x => 7)
71
- DB.sqls.must_equal ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE id = 10"]
72
- end
73
-
74
- it "should have allowed take precedence over restricted" do
75
- @c.plugin :whitelist_security
76
- @c.set_allowed_columns :x, :y
77
- @c.set_restricted_columns :y, :z
78
- i = @c.new(:x => 1, :y => 2, :z => 3)
79
- i.values.must_equal(:x => 1, :y => 2)
80
- i.set(:x => 4, :y => 5, :z => 6)
81
- i.values.must_equal(:x => 4, :y => 5)
82
-
83
- @c.dataset = @c.dataset.with_fetch(:y => 7)
84
- i = @c.new
85
- i.update(:y => 7, :z => 9)
86
- i.values.must_equal(:y => 7)
87
- DB.sqls.must_equal ["INSERT INTO blahblah (y) VALUES (7)", "SELECT * FROM blahblah WHERE id = 10"]
88
- end
89
-
90
- it "should freeze restricted_columns when freezing class" do
91
- @c.set_restricted_columns :z
92
- @c.freeze
93
- @c.restricted_columns.frozen?.must_equal true
94
- end
95
- end