sequel 5.29.0 → 5.30.0

Sign up to get free protection for your applications and to get access to all the features.
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