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,52 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "ValidatesAssociated plugin" do
4
- before do
5
- @db = Sequel.mock(:autoid=>1, :numrows=>1, :fetch=>{:id=>1, :name=>'a', :c_id=>nil})
6
- @c = Class.new(Sequel::Model(@db[:cs]))
7
- @c.plugin :validate_associated
8
- @c.columns :id, :name, :c_id
9
- @c.one_to_many :cs, :class=>@c, :key=>:c_id
10
- @o = @c.load(:id=>1, :name=>'a')
11
- @db.sqls
12
- end
13
-
14
- it "should return nil when saving if the associated object is invalid when raise_on_save_failure is false" do
15
- @c.raise_on_save_failure = false
16
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
17
- o = @c.load(:id=>2, :name=>'b')
18
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
19
- @o.save.must_be_nil
20
- @o.errors[:cs].must_equal ["name is b"]
21
- o.errors[:name].must_equal ['is b']
22
- end
23
-
24
- it "should support creating new one_to_many and one_to_one objects with presence validations on the foreign key" do
25
- @c.class_eval do
26
- plugin :validation_helpers
27
- def validate
28
- validates_integer :c_id
29
- super
30
- end
31
- end
32
- @o.c_id = 5
33
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), @c.load(:id=>2, :name=>'b', :c_id=>2))
34
- @o.valid?.must_equal true
35
- end
36
-
37
- it "should should not remove existing values from object when validating" do
38
- o = @c.load(:id=>2, :name=>'b', :c_id=>3)
39
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
40
- @o.valid?.must_equal true
41
- o.c_id.must_equal 3
42
- end
43
-
44
- it "should not attempt to validate associated_object if the :validate=>false option is passed to save" do
45
- @c.one_to_many :cs, :class=>@c, :key=>:c_id
46
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
47
- o = @c.load(:id=>2, :name=>'b', :c_id=>3)
48
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
49
- @o.save(:validate=>false).must_equal @o
50
- @db.sqls.must_equal ["UPDATE cs SET name = 'a' WHERE (id = 1)"]
51
- end
52
- end
@@ -1,1040 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- model_class = proc do |klass, &block|
4
- c = Class.new(klass)
5
- c.plugin :validation_class_methods
6
- c.class_eval(&block) if block
7
- c
8
- end
9
-
10
- describe Sequel::Model do
11
- before do
12
- @c = model_class.call Sequel::Model do
13
- def self.validates_coolness_of(attr)
14
- validates_each(attr) {|o, a, v| o.errors.add(a, 'is not cool') if v != :cool}
15
- end
16
- end
17
- end
18
-
19
- it "should freeze validation metadata when freezing model class" do
20
- @c.validates_acceptance_of(:a)
21
- @c.freeze
22
- @c.validations.frozen?.must_equal true
23
- @c.validations.values.all?(&:frozen?).must_equal true
24
- @c.validation_reflections.frozen?.must_equal true
25
- @c.validation_reflections.values.all? do |vs|
26
- vs.frozen? && vs.all? do |v|
27
- v.frozen? && v.last.frozen?
28
- end
29
- end.must_equal true
30
- end
31
-
32
- it "should respond to validations, has_validations?, and validation_reflections" do
33
- @c.must_respond_to(:validations)
34
- @c.must_respond_to(:has_validations?)
35
- @c.must_respond_to(:validation_reflections)
36
- end
37
-
38
- it "should be able to reflect on validations" do
39
- @c.validation_reflections.must_equal({})
40
- @c.validates_acceptance_of(:a)
41
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
42
- @c.validates_presence_of(:a)
43
- @c.validation_reflections[:a].length.must_equal 2
44
- @c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
45
- end
46
-
47
- it "should handle validation reflections correctly when subclassing" do
48
- @c.validates_acceptance_of(:a)
49
- c = Class.new(@c)
50
- c.validation_reflections.map{|k,v| k}.must_equal [:a]
51
- c.validates_presence_of(:a)
52
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
53
- c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
54
- end
55
-
56
- it "should acccept validation definitions using validates_each" do
57
- @c.validates_each(:xx, :yy) {|o, a, v| o.errors.add(a, 'too low') if v < 50}
58
- o = @c.new
59
- def o.xx; 40; end
60
- def o.yy; 60; end
61
- o.valid?.must_equal false
62
- o.errors.full_messages.must_equal ['xx too low']
63
- end
64
-
65
- it "should return true/false for has_validations?" do
66
- @c.has_validations?.must_equal false
67
- @c.validates_each(:xx) {1}
68
- @c.has_validations?.must_equal true
69
- end
70
-
71
- it "should validate multiple attributes at once" do
72
- o = @c.new
73
- def o.xx
74
- 1
75
- end
76
- def o.yy
77
- 2
78
- end
79
- vals = nil
80
- atts = nil
81
- @c.validates_each([:xx, :yy]){|obj,a,v| atts=a; vals=v}
82
- o.valid?
83
- vals.must_equal [1,2]
84
- atts.must_equal [:xx, :yy]
85
- end
86
-
87
- it "should respect allow_missing option when using multiple attributes" do
88
- o = @c.new
89
- def o.xx
90
- self[:xx]
91
- end
92
- def o.yy
93
- self[:yy]
94
- end
95
- vals = nil
96
- atts = nil
97
- @c.validates_each([:xx, :yy], :allow_missing=>true){|obj,a,v| atts=a; vals=v}
98
-
99
- o.values[:xx] = 1
100
- o.valid?
101
- vals.must_equal [1,nil]
102
- atts.must_equal [:xx, :yy]
103
-
104
- vals = nil
105
- atts = nil
106
- o.values.clear
107
- o.values[:yy] = 2
108
- o.valid?
109
- vals.must_equal [nil, 2]
110
- atts.must_equal [:xx, :yy]
111
-
112
- vals = nil
113
- atts = nil
114
- o.values.clear
115
- o.valid?.must_equal true
116
- vals.must_be_nil
117
- atts.must_be_nil
118
- end
119
-
120
- it "should overwrite existing validation with the same tag and attribute" do
121
- @c.validates_each(:xx, :xx, :tag=>:low) {|o, a, v| o.xxx; o.errors.add(a, 'too low') if v < 50}
122
- @c.validates_each(:yy, :yy) {|o, a, v| o.yyy; o.errors.add(a, 'too low') if v < 50}
123
- @c.validates_presence_of(:zz, :zz)
124
- @c.validates_length_of(:aa, :aa, :tag=>:blah)
125
- o = @c.new
126
- def o.zz
127
- @a ||= 0
128
- @a += 1
129
- end
130
- def o.aa
131
- @b ||= 0
132
- @b += 1
133
- end
134
- def o.xx; 40; end
135
- def o.yy; 60; end
136
- def o.xxx; end
137
- def o.yyy; end
138
- o.valid?.must_equal false
139
- o.zz.must_equal 2
140
- o.aa.must_equal 2
141
- o.errors.full_messages.must_equal ['xx too low']
142
- end
143
-
144
- it "should provide a validates method that takes block with validation definitions" do
145
- @c.validates do
146
- coolness_of :blah
147
- end
148
- @c.validations[:blah].wont_be :empty?
149
- o = @c.new
150
- def o.blah; end
151
- o.valid?.must_equal false
152
- o.errors.full_messages.must_equal ['blah is not cool']
153
- end
154
-
155
- it "should have the validates block have appropriate respond_to?" do
156
- c = nil
157
- @c.validates{c = respond_to?(:foo)}
158
- c.must_equal false
159
- @c.validates{c = respond_to?(:length_of)}
160
- c.must_equal true
161
- end
162
- end
163
-
164
- describe Sequel::Model do
165
- before do
166
- @c = model_class.call Sequel::Model do
167
- columns :score
168
- validates_each :score do |o, a, v|
169
- o.errors.add(a, 'too low') if v < 87
170
- end
171
- end
172
-
173
- @o = @c.new
174
- end
175
-
176
- it "should supply a #valid? method that returns true if validations pass" do
177
- @o.score = 50
178
- @o.wont_be :valid?
179
- @o.score = 100
180
- @o.must_be :valid?
181
- end
182
-
183
- it "should provide an errors object" do
184
- @o.score = 100
185
- @o.must_be :valid?
186
- @o.errors.must_be :empty?
187
-
188
- @o.score = 86
189
- @o.wont_be :valid?
190
- @o.errors[:score].must_equal ['too low']
191
- @o.errors.on(:blah).must_be_nil
192
- end
193
- end
194
-
195
- describe "Sequel::Plugins::ValidationClassMethods::ClassMethods::Generator" do
196
- before do
197
- @testit = testit = []
198
-
199
- @c = model_class.call Sequel::Model do
200
- singleton_class.send(:define_method, :validates_blah) do
201
- testit << 1324
202
- end
203
- end
204
- end
205
-
206
- it "should instance_eval the block, sending everything to its receiver" do
207
- @c.validates do
208
- blah
209
- end
210
- @testit.must_equal [1324]
211
- end
212
- end
213
-
214
- describe Sequel::Model do
215
- before do
216
- @c = model_class.call Sequel::Model do
217
- columns :value
218
-
219
- def self.where(*args)
220
- o = Object.new
221
- def o.count; 2; end
222
- o
223
- end
224
-
225
- def skip; false; end
226
- def dont_skip; true; end
227
- end
228
- @m = @c.new
229
- end
230
-
231
- it "should validate acceptance_of" do
232
- @c.validates_acceptance_of :value
233
- @m.must_be :valid?
234
- @m.value = '1'
235
- @m.must_be :valid?
236
- end
237
-
238
- it "should validate acceptance_of with accept" do
239
- @c.validates_acceptance_of :value, :accept => 'true'
240
- @m.value = '1'
241
- @m.wont_be :valid?
242
- @m.value = 'true'
243
- @m.must_be :valid?
244
- end
245
-
246
- it "should validate acceptance_of with allow_nil => false" do
247
- @c.validates_acceptance_of :value, :allow_nil => false
248
- @m.wont_be :valid?
249
- end
250
-
251
- it "should validate acceptance_of with allow_missing => true" do
252
- @c.validates_acceptance_of :value, :allow_missing => true
253
- @m.must_be :valid?
254
- end
255
-
256
- it "should validate acceptance_of with allow_missing => true and allow_nil => false" do
257
- @c.validates_acceptance_of :value, :allow_missing => true, :allow_nil => false
258
- @m.must_be :valid?
259
- @m.value = nil
260
- @m.wont_be :valid?
261
- end
262
-
263
- it "should validate acceptance_of with if => true" do
264
- @c.validates_acceptance_of :value, :if => :dont_skip
265
- @m.value = '0'
266
- @m.wont_be :valid?
267
- end
268
-
269
- it "should validate acceptance_of with if => false" do
270
- @c.validates_acceptance_of :value, :if => :skip
271
- @m.value = '0'
272
- @m.must_be :valid?
273
- end
274
-
275
- it "should validate acceptance_of with if proc that evaluates to true" do
276
- @c.validates_acceptance_of :value, :if => proc{true}
277
- @m.value = '0'
278
- @m.wont_be :valid?
279
- end
280
-
281
- it "should validate acceptance_of with if proc that evaluates to false" do
282
- @c.validates_acceptance_of :value, :if => proc{false}
283
- @m.value = '0'
284
- @m.must_be :valid?
285
- end
286
-
287
- it "should raise an error if :if option is not a Symbol, Proc, or nil" do
288
- @c.validates_acceptance_of :value, :if => 1
289
- @m.value = '0'
290
- proc{@m.valid?}.must_raise(Sequel::Error)
291
- end
292
-
293
- it "should validate confirmation_of" do
294
- @c.send(:attr_accessor, :value_confirmation)
295
- @c.validates_confirmation_of :value
296
-
297
- @m.value = 'blah'
298
- @m.wont_be :valid?
299
-
300
- @m.value_confirmation = 'blah'
301
- @m.must_be :valid?
302
- end
303
-
304
- it "should validate confirmation_of with if => true" do
305
- @c.send(:attr_accessor, :value_confirmation)
306
- @c.validates_confirmation_of :value, :if => :dont_skip
307
-
308
- @m.value = 'blah'
309
- @m.wont_be :valid?
310
- end
311
-
312
- it "should validate confirmation_of with if => false" do
313
- @c.send(:attr_accessor, :value_confirmation)
314
- @c.validates_confirmation_of :value, :if => :skip
315
-
316
- @m.value = 'blah'
317
- @m.must_be :valid?
318
- end
319
-
320
- it "should validate confirmation_of with allow_missing => true" do
321
- @c.send(:attr_accessor, :value_confirmation)
322
- @c.validates_acceptance_of :value, :allow_missing => true
323
- @m.must_be :valid?
324
- @m.value_confirmation = 'blah'
325
- @m.must_be :valid?
326
- @m.value = nil
327
- @m.wont_be :valid?
328
- end
329
-
330
- it "should validate format_of" do
331
- @c.validates_format_of :value, :with => /.+_.+/
332
- @m.value = 'abc_'
333
- @m.wont_be :valid?
334
- @m.value = 'abc_def'
335
- @m.must_be :valid?
336
- end
337
-
338
- it "should raise for validate_format_of without regexp" do
339
- proc {@c.validates_format_of :value}.must_raise(ArgumentError)
340
- proc {@c.validates_format_of :value, :with => :blah}.must_raise(ArgumentError)
341
- end
342
-
343
- it "should validate format_of with if => true" do
344
- @c.validates_format_of :value, :with => /_/, :if => :dont_skip
345
-
346
- @m.value = 'a'
347
- @m.wont_be :valid?
348
- end
349
-
350
- it "should validate format_of with if => false" do
351
- @c.validates_format_of :value, :with => /_/, :if => :skip
352
-
353
- @m.value = 'a'
354
- @m.must_be :valid?
355
- end
356
-
357
- it "should validate format_of with allow_missing => true" do
358
- @c.validates_format_of :value, :allow_missing => true, :with=>/./
359
- @m.must_be :valid?
360
- @m.value = nil
361
- @m.wont_be :valid?
362
- end
363
-
364
- it "should validate length_of with maximum" do
365
- @c.validates_length_of :value, :maximum => 5
366
- @m.wont_be :valid?
367
- @m.value = '12345'
368
- @m.must_be :valid?
369
- @m.value = '123456'
370
- @m.wont_be :valid?
371
- @m.errors[:value].must_equal ['is too long']
372
- @m.value = nil
373
- @m.wont_be :valid?
374
- @m.errors[:value].must_equal ['is not present']
375
- end
376
-
377
- it "should validate length_of with maximum using customized error messages" do
378
- @c.validates_length_of :value, :maximum => 5, :too_long=>'tl', :nil_message=>'np'
379
- @m.value = '123456'
380
- @m.wont_be :valid?
381
- @m.errors[:value].must_equal ['tl']
382
- @m.value = nil
383
- @m.wont_be :valid?
384
- @m.errors[:value].must_equal ['np']
385
- end
386
-
387
- it "should validate length_of with minimum" do
388
- @c.validates_length_of :value, :minimum => 5
389
- @m.wont_be :valid?
390
- @m.value = '12345'
391
- @m.must_be :valid?
392
- @m.value = '1234'
393
- @m.wont_be :valid?
394
- end
395
-
396
- it "should validate length_of with within" do
397
- @c.validates_length_of :value, :within => 2..5
398
- @m.wont_be :valid?
399
- @m.value = '12345'
400
- @m.must_be :valid?
401
- @m.value = '1'
402
- @m.wont_be :valid?
403
- @m.value = '123456'
404
- @m.wont_be :valid?
405
- end
406
-
407
- it "should validate length_of with is" do
408
- @c.validates_length_of :value, :is => 3
409
- @m.wont_be :valid?
410
- @m.value = '123'
411
- @m.must_be :valid?
412
- @m.value = '12'
413
- @m.wont_be :valid?
414
- @m.value = '1234'
415
- @m.wont_be :valid?
416
- end
417
-
418
- it "should validate length_of with allow_nil" do
419
- @c.validates_length_of :value, :is => 3, :allow_nil => true
420
- @m.must_be :valid?
421
- end
422
-
423
- it "should validate length_of with if => true" do
424
- @c.validates_length_of :value, :is => 3, :if => :dont_skip
425
-
426
- @m.value = 'a'
427
- @m.wont_be :valid?
428
- end
429
-
430
- it "should validate length_of with if => false" do
431
- @c.validates_length_of :value, :is => 3, :if => :skip
432
-
433
- @m.value = 'a'
434
- @m.must_be :valid?
435
- end
436
-
437
- it "should validate length_of with allow_missing => true" do
438
- @c.validates_length_of :value, :allow_missing => true, :minimum => 5
439
- @m.must_be :valid?
440
- @m.value = nil
441
- @m.wont_be :valid?
442
- end
443
-
444
- it "should allow multiple calls to validates_length_of with different options without overwriting" do
445
- @c.validates_length_of :value, :maximum => 5
446
- @c.validates_length_of :value, :minimum => 5
447
- @m.wont_be :valid?
448
- @m.value = '12345'
449
- @m.must_be :valid?
450
- @m.value = '123456'
451
- @m.wont_be :valid?
452
- @m.value = '12345'
453
- @m.must_be :valid?
454
- @m.value = '1234'
455
- @m.wont_be :valid?
456
- end
457
-
458
- it "should validate numericality_of" do
459
- @c.validates_numericality_of :value
460
- @m.value = 'blah'
461
- @m.wont_be :valid?
462
- @m.value = '123'
463
- @m.must_be :valid?
464
- @m.value = '123.1231'
465
- @m.must_be :valid?
466
- @m.value = '+1'
467
- @m.must_be :valid?
468
- @m.value = '-1'
469
- @m.must_be :valid?
470
- @m.value = '+1.123'
471
- @m.must_be :valid?
472
- @m.value = '-0.123'
473
- @m.must_be :valid?
474
- @m.value = '-0.123E10'
475
- @m.must_be :valid?
476
- @m.value = '32.123e10'
477
- @m.must_be :valid?
478
- @m.value = '+32.123E10'
479
- @m.must_be :valid?
480
- @m.must_be :valid?
481
- @m.value = '.0123'
482
- end
483
-
484
- it "should validate numericality_of with only_integer" do
485
- @c.validates_numericality_of :value, :only_integer => true
486
- @m.value = 'blah'
487
- @m.wont_be :valid?
488
- @m.value = '123'
489
- @m.must_be :valid?
490
- @m.value = '123.1231'
491
- @m.wont_be :valid?
492
- end
493
-
494
- it "should validate numericality_of with if => true" do
495
- @c.validates_numericality_of :value, :if => :dont_skip
496
-
497
- @m.value = 'a'
498
- @m.wont_be :valid?
499
- end
500
-
501
- it "should validate numericality_of with if => false" do
502
- @c.validates_numericality_of :value, :if => :skip
503
-
504
- @m.value = 'a'
505
- @m.must_be :valid?
506
- end
507
-
508
- it "should validate numericality_of with allow_missing => true" do
509
- @c.validates_numericality_of :value, :allow_missing => true
510
- @m.must_be :valid?
511
- @m.value = nil
512
- @m.wont_be :valid?
513
- end
514
-
515
- it "should validate presence_of" do
516
- @c.validates_presence_of :value
517
- @m.wont_be :valid?
518
- @m.value = ''
519
- @m.wont_be :valid?
520
- @m.value = 1234
521
- @m.must_be :valid?
522
- @m.value = nil
523
- @m.wont_be :valid?
524
- @m.value = true
525
- @m.must_be :valid?
526
- @m.value = false
527
- @m.must_be :valid?
528
- end
529
-
530
- it "should validate inclusion_of with an array" do
531
- @c.validates_inclusion_of :value, :in => [1,2]
532
- @m.wont_be :valid?
533
- @m.value = 1
534
- @m.must_be :valid?
535
- @m.value = 1.5
536
- @m.wont_be :valid?
537
- @m.value = 2
538
- @m.must_be :valid?
539
- @m.value = 3
540
- @m.wont_be :valid?
541
- end
542
-
543
- it "should validate inclusion_of with a range" do
544
- @c.validates_inclusion_of :value, :in => 1..4
545
- @m.wont_be :valid?
546
- @m.value = 1
547
- @m.must_be :valid?
548
- @m.value = 1.5
549
- @m.must_be :valid?
550
- @m.value = 0
551
- @m.wont_be :valid?
552
- @m.value = 5
553
- @m.wont_be :valid?
554
- end
555
-
556
- it "should raise an error if inclusion_of doesn't receive a valid :in option" do
557
- lambda{@c.validates_inclusion_of :value}.must_raise(ArgumentError)
558
- lambda{@c.validates_inclusion_of :value, :in => 1}.must_raise(ArgumentError)
559
- end
560
-
561
- it "should raise an error if inclusion_of handles :allow_nil too" do
562
- @c.validates_inclusion_of :value, :in => 1..4, :allow_nil => true
563
- @m.value = nil
564
- @m.must_be :valid?
565
- @m.value = 0
566
- @m.wont_be :valid?
567
- end
568
-
569
- it "should validate presence_of with if => true" do
570
- @c.validates_presence_of :value, :if => :dont_skip
571
- @m.wont_be :valid?
572
- end
573
-
574
- it "should validate presence_of with if => false" do
575
- @c.validates_presence_of :value, :if => :skip
576
- @m.must_be :valid?
577
- end
578
-
579
- it "should validate presence_of with allow_missing => true" do
580
- @c.validates_presence_of :value, :allow_missing => true
581
- @m.must_be :valid?
582
- @m.value = nil
583
- @m.wont_be :valid?
584
- end
585
-
586
- it "should validate uniqueness_of with if => true" do
587
- @c.validates_uniqueness_of :value, :if => :dont_skip
588
-
589
- @m.value = 'a'
590
- @m.wont_be :valid?
591
- end
592
-
593
- it "should validate uniqueness_of with if => false" do
594
- @c.validates_uniqueness_of :value, :if => :skip
595
- @m.value = 'a'
596
- @m.must_be :valid?
597
- end
598
-
599
- it "should validate uniqueness_of with allow_missing => true" do
600
- @c.validates_uniqueness_of :value, :allow_missing => true
601
- @m.must_be :valid?
602
- @m.value = 1
603
- @m.wont_be :valid?
604
- end
605
- end
606
-
607
- describe "Superclass validations" do
608
- before do
609
- @c1 = model_class.call Sequel::Model do
610
- columns :value
611
- validates_length_of :value, :minimum => 5
612
- end
613
-
614
- @c2 = Class.new(@c1)
615
- @c2.class_eval do
616
- columns :value
617
- validates_format_of :value, :with => /^[a-z]+$/
618
- end
619
- end
620
-
621
- it "should be checked when validating" do
622
- o = @c2.new
623
- o.value = 'ab'
624
- o.valid?.must_equal false
625
- o.errors.full_messages.must_equal ['value is too short']
626
-
627
- o.value = '12'
628
- o.valid?.must_equal false
629
- o.errors.full_messages.must_equal ['value is too short', 'value is invalid']
630
-
631
- o.value = 'abcde'
632
- o.valid?.must_equal true
633
- end
634
-
635
- it "should have skip_superclass_validations? return whether superclass validations were skipped" do
636
- @c2.skip_superclass_validations?.must_be_nil
637
- @c2.skip_superclass_validations
638
- @c2.skip_superclass_validations?.must_equal true
639
- end
640
-
641
- it "should be skipped if skip_superclass_validations is called" do
642
- @c2.skip_superclass_validations
643
-
644
- o = @c2.new
645
- o.value = 'ab'
646
- o.valid?.must_equal true
647
-
648
- o.value = '12'
649
- o.valid?.must_equal false
650
- o.errors.full_messages.must_equal ['value is invalid']
651
-
652
- o.value = 'abcde'
653
- o.valid?.must_equal true
654
- end
655
- end
656
-
657
- describe ".validates with block" do
658
- it "should support calling .each" do
659
- @c = model_class.call Sequel::Model do
660
- columns :vvv
661
- validates do
662
- each :vvv do |o, a, v|
663
- o.errors.add(a, "is less than zero") if v.to_i < 0
664
- end
665
- end
666
- end
667
-
668
- o = @c.new
669
- o.vvv = 1
670
- o.must_be :valid?
671
- o.vvv = -1
672
- o.wont_be :valid?
673
- end
674
- end
675
-
676
- describe Sequel::Model, "Validations" do
677
- before do
678
- class ::Person < Sequel::Model
679
- plugin :validation_class_methods
680
- columns :id,:name,:first_name,:last_name,:middle_name,:initials,:age, :terms
681
- end
682
-
683
- class ::Smurf < Person
684
- end
685
-
686
- class ::Can < Sequel::Model
687
- plugin :validation_class_methods
688
- columns :id, :name
689
- end
690
-
691
- class ::Cow < Sequel::Model
692
- plugin :validation_class_methods
693
- columns :id, :name, :got_milk
694
- end
695
-
696
- class ::User < Sequel::Model
697
- plugin :validation_class_methods
698
- columns :id, :username, :password
699
- end
700
-
701
- class ::Address < Sequel::Model
702
- plugin :validation_class_methods
703
- columns :id, :zip_code
704
- end
705
- end
706
- after do
707
- [:Person, :Smurf, :Cow, :User, :Address].each{|c| Object.send(:remove_const, c)}
708
- end
709
-
710
- it "should validate the acceptance of a column" do
711
- class ::Cow < Sequel::Model
712
- validations.clear
713
- validates_acceptance_of :got_milk, :accept => 'blah', :allow_nil => false
714
- end
715
-
716
- @cow = Cow.new
717
- @cow.wont_be :valid?
718
- @cow.errors.full_messages.must_equal ["got_milk is not accepted"]
719
-
720
- @cow.got_milk = "blah"
721
- @cow.must_be :valid?
722
- end
723
-
724
- it "should validate the confirmation of a column" do
725
- class ::User < Sequel::Model
726
- def password_confirmation
727
- "test"
728
- end
729
-
730
- validations.clear
731
- validates_confirmation_of :password
732
- end
733
-
734
- @user = User.new
735
- @user.wont_be :valid?
736
- @user.errors.full_messages.must_equal ["password is not confirmed"]
737
-
738
- @user.password = "test"
739
- @user.must_be :valid?
740
- end
741
-
742
- it "should validate format of column" do
743
- class ::Person < Sequel::Model
744
- validates_format_of :first_name, :with => /^[a-zA-Z]+$/
745
- end
746
-
747
- @person = Person.new :first_name => "Lancelot99"
748
- @person.valid?.must_equal false
749
- @person = Person.new :first_name => "Anita"
750
- @person.valid?.must_equal true
751
- end
752
-
753
- it "should validate length of column" do
754
- class ::Person < Sequel::Model
755
- validations.clear
756
- validates_length_of :first_name, :maximum => 30
757
- validates_length_of :last_name, :minimum => 30
758
- validates_length_of :middle_name, :within => 1..5
759
- validates_length_of :initials, :is => 2
760
- end
761
-
762
- @person = Person.new(
763
- :first_name => "Anamethatiswaytofreakinglongandwayoverthirtycharacters",
764
- :last_name => "Alastnameunderthirtychars",
765
- :initials => "LGC",
766
- :middle_name => "danger"
767
- )
768
-
769
- @person.wont_be :valid?
770
- @person.errors.full_messages.size.must_equal 4
771
- @person.errors.full_messages.sort.must_equal [
772
- 'first_name is too long',
773
- 'initials is the wrong length',
774
- 'last_name is too short',
775
- 'middle_name is the wrong length'
776
- ]
777
-
778
- @person.first_name = "Lancelot"
779
- @person.last_name = "1234567890123456789012345678901"
780
- @person.initials = "LC"
781
- @person.middle_name = "Will"
782
- @person.must_be :valid?
783
- end
784
-
785
- it "should validate that a column has the correct type for the schema column" do
786
- p = model_class.call Sequel::Model do
787
- columns :age, :d
788
- self.raise_on_typecast_failure = false
789
- validates_schema_type :age
790
- validates_schema_type :d, :message=>'is a bad choice'
791
- @db_schema = {:age=>{:type=>:integer}, :d=>{:type=>:date}}
792
- end
793
-
794
- @person = p.new
795
- @person.must_be :valid?
796
-
797
- @person.age = 'a'
798
- @person.wont_be :valid?
799
- @person.errors.full_messages.must_equal ['age is not a valid integer']
800
- @person.age = 1
801
- @person.must_be :valid?
802
-
803
- @person.d = 'a'
804
- @person.wont_be :valid?
805
- @person.errors.full_messages.must_equal ['d is a bad choice']
806
- @person.d = Date.today
807
- @person.must_be :valid?
808
- end
809
-
810
- it "should validate numericality of column" do
811
- class ::Person < Sequel::Model
812
- validations.clear
813
- validates_numericality_of :age
814
- end
815
-
816
- @person = Person.new :age => "Twenty"
817
- @person.wont_be :valid?
818
- @person.errors.full_messages.must_equal ['age is not a number']
819
-
820
- @person.age = 20
821
- @person.must_be :valid?
822
- end
823
-
824
- it "should validate the presence of a column" do
825
- class ::Cow < Sequel::Model
826
- validations.clear
827
- validates_presence_of :name
828
- end
829
-
830
- @cow = Cow.new
831
- @cow.wont_be :valid?
832
- @cow.errors.full_messages.must_equal ['name is not present']
833
-
834
- @cow.name = "Betsy"
835
- @cow.must_be :valid?
836
- end
837
-
838
- it "should validate the uniqueness of a column" do
839
- class ::User < Sequel::Model
840
- validations.clear
841
- validates do
842
- uniqueness_of :username
843
- end
844
- end
845
- User.dataset = User.dataset.with_fetch(proc do |sql|
846
- case sql
847
- when /count.*username = '0records'/
848
- {:v => 0}
849
- when /count.*username = '2records'/
850
- {:v => 2}
851
- when /count.*username = '1record'/
852
- {:v => 1}
853
- when /username = '1record'/
854
- {:id => 3, :username => "1record", :password => "test"}
855
- end
856
- end)
857
-
858
- @user = User.new(:username => "2records", :password => "anothertest")
859
- @user.wont_be :valid?
860
- @user.errors.full_messages.must_equal ['username is already taken']
861
-
862
- @user = User.new(:username => "1record", :password => "anothertest")
863
- @user.wont_be :valid?
864
- @user.errors.full_messages.must_equal ['username is already taken']
865
-
866
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
867
- @user.wont_be :valid?
868
- @user.errors.full_messages.must_equal ['username is already taken']
869
-
870
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
871
- @user.must_be :valid?
872
- @user.errors.full_messages.must_equal []
873
-
874
- @user = User.new(:username => "0records", :password => "anothertest")
875
- @user.must_be :valid?
876
- @user.errors.full_messages.must_equal []
877
-
878
- User.db.sqls
879
- @user = User.new(:password => "anothertest")
880
- @user.must_be :valid?
881
- @user.errors.full_messages.must_equal []
882
- User.db.sqls.must_equal []
883
- end
884
-
885
- it "should validate the uniqueness of multiple columns" do
886
- class ::User < Sequel::Model
887
- validations.clear
888
- validates do
889
- uniqueness_of [:username, :password]
890
- end
891
- end
892
- User.dataset = User.dataset.with_fetch(proc do |sql|
893
- case sql
894
- when /count.*username = '0records'/
895
- {:v => 0}
896
- when /count.*username = '2records'/
897
- {:v => 2}
898
- when /count.*username = '1record'/
899
- {:v => 1}
900
- when /username = '1record'/
901
- if sql =~ /password = 'anothertest'/
902
- {:id => 3, :username => "1record", :password => "anothertest"}
903
- else
904
- {:id => 4, :username => "1record", :password => "test"}
905
- end
906
- end
907
- end)
908
-
909
- @user = User.new(:username => "2records", :password => "anothertest")
910
- @user.wont_be :valid?
911
- @user.errors.full_messages.must_equal ['username and password is already taken']
912
-
913
- @user = User.new(:username => "1record", :password => "anothertest")
914
- @user.wont_be :valid?
915
- @user.errors.full_messages.must_equal ['username and password is already taken']
916
-
917
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
918
- @user.wont_be :valid?
919
- @user.errors.full_messages.must_equal ['username and password is already taken']
920
-
921
- @user = User.load(:id=>3, :username => "1record", :password => "test")
922
- @user.wont_be :valid?
923
- @user.errors.full_messages.must_equal ['username and password is already taken']
924
-
925
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
926
- @user.must_be :valid?
927
- @user.errors.full_messages.must_equal []
928
-
929
- @user = User.new(:username => "0records", :password => "anothertest")
930
- @user.must_be :valid?
931
- @user.errors.full_messages.must_equal []
932
-
933
- User.db.sqls
934
- @user = User.new(:password => "anothertest")
935
- @user.must_be :valid?
936
- @user.errors.full_messages.must_equal []
937
- @user = User.new(:username => "0records")
938
- @user.must_be :valid?
939
- @user.errors.full_messages.must_equal []
940
- @user = User.new
941
- @user.must_be :valid?
942
- @user.errors.full_messages.must_equal []
943
- User.db.sqls.must_equal []
944
- end
945
-
946
- it "should have a validates block that contains multiple validations" do
947
- class ::Person < Sequel::Model
948
- validations.clear
949
- validates do
950
- format_of :first_name, :with => /^[a-zA-Z]+$/
951
- length_of :first_name, :maximum => 30
952
- end
953
- end
954
-
955
- Person.validations[:first_name].size.must_equal 2
956
-
957
- @person = Person.new :first_name => "Lancelot99"
958
- @person.valid?.must_equal false
959
-
960
- @person2 = Person.new :first_name => "Wayne"
961
- @person2.valid?.must_equal true
962
- end
963
-
964
- it "should allow 'longhand' validations direcly within the model." do
965
- class ::Person < Sequel::Model
966
- validations.clear
967
- validates_length_of :first_name, :maximum => 30
968
- end
969
- Person.validations.length.must_equal(1)
970
- end
971
-
972
- it "should define a has_validations? method which returns true if the model has validations, false otherwise" do
973
- class ::Person < Sequel::Model
974
- validations.clear
975
- validates do
976
- format_of :first_name, :with => /\w+/
977
- length_of :first_name, :maximum => 30
978
- end
979
- end
980
-
981
- class ::Smurf < Person
982
- validations.clear
983
- end
984
-
985
- Person.validations.wont_be :empty?
986
- Smurf.validations.must_be :empty?
987
- end
988
-
989
- it "should validate correctly instances initialized with string keys" do
990
- class ::Can < Sequel::Model
991
- validates_length_of :name, :minimum => 4
992
- end
993
-
994
- Can.new('name' => 'ab').wont_be :valid?
995
- Can.new('name' => 'abcd').must_be :valid?
996
- end
997
-
998
- end
999
-
1000
- describe "Model#save" do
1001
- before do
1002
- @c = model_class.call Sequel::Model(:people) do
1003
- columns :id, :x
1004
-
1005
- validates_each :x do |o, a, v|
1006
- o.errors.add(a, 'blah') unless v == 7
1007
- end
1008
- end
1009
- @m = @c.load(:id => 4, :x=>6)
1010
- DB.reset
1011
- end
1012
-
1013
- it "should save only if validations pass" do
1014
- @m.raise_on_save_failure = false
1015
- @m.wont_be :valid?
1016
- @m.save
1017
- DB.sqls.must_be :empty?
1018
-
1019
- @m.x = 7
1020
- @m.must_be :valid?
1021
- @m.save.wont_equal false
1022
- DB.sqls.must_equal ['UPDATE people SET x = 7 WHERE (id = 4)']
1023
- end
1024
-
1025
- it "should skip validations if the :validate=>false option is used" do
1026
- @m.raise_on_save_failure = false
1027
- @m.wont_be :valid?
1028
- @m.save(:validate=>false)
1029
- DB.sqls.must_equal ['UPDATE people SET x = 6 WHERE (id = 4)']
1030
- end
1031
-
1032
- it "should raise error if validations fail and raise_on_save_faiure is true" do
1033
- proc{@m.save}.must_raise(Sequel::ValidationFailed)
1034
- end
1035
-
1036
- it "should return nil if validations fail and raise_on_save_faiure is false" do
1037
- @m.raise_on_save_failure = false
1038
- @m.save.must_be_nil
1039
- end
1040
- end