sequel 5.29.0 → 5.34.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.
- checksums.yaml +4 -4
- data/CHANGELOG +70 -1922
- data/README.rdoc +1 -1
- data/doc/advanced_associations.rdoc +4 -4
- data/doc/association_basics.rdoc +3 -3
- data/doc/code_order.rdoc +12 -2
- data/doc/model_dataset_method_design.rdoc +1 -1
- data/doc/postgresql.rdoc +71 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/testing.rdoc +1 -1
- data/lib/sequel/adapters/shared/access.rb +6 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -5
- data/lib/sequel/adapters/shared/mysql.rb +9 -9
- data/lib/sequel/adapters/shared/oracle.rb +16 -16
- data/lib/sequel/adapters/shared/postgres.rb +169 -14
- data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
- data/lib/sequel/adapters/shared/sqlite.rb +32 -5
- data/lib/sequel/connection_pool/sharded_single.rb +4 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
- data/lib/sequel/connection_pool/single.rb +1 -1
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/core.rb +318 -314
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/misc.rb +16 -10
- data/lib/sequel/database/query.rb +3 -1
- data/lib/sequel/database/schema_generator.rb +0 -1
- data/lib/sequel/database/schema_methods.rb +15 -16
- data/lib/sequel/database/transactions.rb +12 -13
- data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
- data/lib/sequel/dataset/query.rb +4 -3
- data/lib/sequel/deprecated.rb +2 -0
- data/lib/sequel/exceptions.rb +2 -0
- data/lib/sequel/extensions/connection_expiration.rb +2 -2
- data/lib/sequel/extensions/connection_validator.rb +2 -2
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/index_caching.rb +9 -7
- data/lib/sequel/extensions/integer64.rb +2 -0
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/pg_enum.rb +5 -2
- data/lib/sequel/extensions/pg_hstore.rb +6 -0
- data/lib/sequel/extensions/pg_inet.rb +13 -5
- data/lib/sequel/extensions/pg_interval.rb +2 -0
- data/lib/sequel/extensions/pg_range.rb +2 -0
- data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/schema_dumper.rb +10 -4
- data/lib/sequel/extensions/server_block.rb +3 -3
- data/lib/sequel/model.rb +2 -0
- data/lib/sequel/model/associations.rb +30 -18
- data/lib/sequel/model/base.rb +64 -55
- data/lib/sequel/model/plugins.rb +3 -3
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
- data/lib/sequel/plugins/association_pks.rb +57 -16
- data/lib/sequel/plugins/association_proxies.rb +2 -0
- data/lib/sequel/plugins/boolean_subsets.rb +4 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
- data/lib/sequel/plugins/dirty.rb +13 -13
- data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
- data/lib/sequel/plugins/json_serializer.rb +3 -7
- data/lib/sequel/plugins/rcte_tree.rb +2 -2
- data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/subclasses.rb +2 -0
- data/lib/sequel/timezones.rb +6 -4
- data/lib/sequel/version.rb +1 -1
- metadata +17 -368
- data/Rakefile +0 -151
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.37.0.txt +0 -50
- data/doc/release_notes/4.38.0.txt +0 -67
- data/doc/release_notes/4.39.0.txt +0 -127
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.40.0.txt +0 -179
- data/doc/release_notes/4.41.0.txt +0 -77
- data/doc/release_notes/4.42.0.txt +0 -221
- data/doc/release_notes/4.43.0.txt +0 -87
- data/doc/release_notes/4.44.0.txt +0 -125
- data/doc/release_notes/4.45.0.txt +0 -370
- data/doc/release_notes/4.46.0.txt +0 -404
- data/doc/release_notes/4.47.0.txt +0 -56
- data/doc/release_notes/4.48.0.txt +0 -293
- data/doc/release_notes/4.49.0.txt +0 -222
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -170
- data/spec/adapters/mssql_spec.rb +0 -828
- data/spec/adapters/mysql_spec.rb +0 -1060
- data/spec/adapters/oracle_spec.rb +0 -371
- data/spec/adapters/postgres_spec.rb +0 -4476
- data/spec/adapters/spec_helper.rb +0 -44
- data/spec/adapters/sqlanywhere_spec.rb +0 -97
- data/spec/adapters/sqlite_spec.rb +0 -652
- data/spec/bin_spec.rb +0 -278
- data/spec/core/connection_pool_spec.rb +0 -1250
- data/spec/core/database_spec.rb +0 -2915
- data/spec/core/dataset_spec.rb +0 -5544
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1498
- data/spec/core/mock_adapter_spec.rb +0 -722
- data/spec/core/object_graph_spec.rb +0 -336
- data/spec/core/placeholder_literalizer_spec.rb +0 -166
- data/spec/core/schema_generator_spec.rb +0 -214
- data/spec/core/schema_spec.rb +0 -1844
- data/spec/core/spec_helper.rb +0 -24
- data/spec/core/version_spec.rb +0 -14
- data/spec/core_extensions_spec.rb +0 -763
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/deprecation_helper.rb +0 -30
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -99
- data/spec/extensions/after_initialize_spec.rb +0 -28
- data/spec/extensions/any_not_empty_spec.rb +0 -23
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -125
- data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
- data/spec/extensions/association_pks_spec.rb +0 -423
- data/spec/extensions/association_proxies_spec.rb +0 -100
- data/spec/extensions/auto_literal_strings_spec.rb +0 -205
- data/spec/extensions/auto_validations_spec.rb +0 -229
- data/spec/extensions/blacklist_security_spec.rb +0 -95
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -273
- data/spec/extensions/caller_logging_spec.rb +0 -52
- data/spec/extensions/class_table_inheritance_spec.rb +0 -750
- data/spec/extensions/column_conflicts_spec.rb +0 -75
- data/spec/extensions/column_select_spec.rb +0 -129
- data/spec/extensions/columns_introspection_spec.rb +0 -90
- data/spec/extensions/columns_updated_spec.rb +0 -35
- data/spec/extensions/composition_spec.rb +0 -248
- data/spec/extensions/connection_expiration_spec.rb +0 -151
- data/spec/extensions/connection_validator_spec.rb +0 -144
- data/spec/extensions/constant_sql_override_spec.rb +0 -24
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
- data/spec/extensions/constraint_validations_spec.rb +0 -439
- data/spec/extensions/core_refinements_spec.rb +0 -528
- data/spec/extensions/csv_serializer_spec.rb +0 -183
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -365
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -181
- data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
- data/spec/extensions/def_dataset_method_spec.rb +0 -100
- data/spec/extensions/defaults_setter_spec.rb +0 -150
- data/spec/extensions/delay_add_association_spec.rb +0 -73
- data/spec/extensions/dirty_spec.rb +0 -222
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
- data/spec/extensions/eager_each_spec.rb +0 -62
- data/spec/extensions/eager_graph_eager_spec.rb +0 -100
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/escaped_like_spec.rb +0 -40
- data/spec/extensions/eval_inspect_spec.rb +0 -81
- data/spec/extensions/exclude_or_null_spec.rb +0 -15
- data/spec/extensions/finder_spec.rb +0 -260
- data/spec/extensions/force_encoding_spec.rb +0 -126
- data/spec/extensions/freeze_datasets_spec.rb +0 -31
- data/spec/extensions/graph_each_spec.rb +0 -113
- data/spec/extensions/hook_class_methods_spec.rb +0 -402
- data/spec/extensions/identifier_mangling_spec.rb +0 -201
- data/spec/extensions/implicit_subquery_spec.rb +0 -58
- data/spec/extensions/index_caching_spec.rb +0 -66
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -69
- data/spec/extensions/insert_conflict_spec.rb +0 -103
- data/spec/extensions/insert_returning_select_spec.rb +0 -72
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -246
- data/spec/extensions/integer64_spec.rb +0 -22
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -346
- data/spec/extensions/lazy_attributes_spec.rb +0 -183
- data/spec/extensions/list_spec.rb +0 -291
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2177
- data/spec/extensions/migration_spec.rb +0 -864
- data/spec/extensions/modification_detection_spec.rb +0 -93
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
- data/spec/extensions/named_timezones_spec.rb +0 -218
- data/spec/extensions/nested_attributes_spec.rb +0 -815
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -127
- data/spec/extensions/pagination_spec.rb +0 -116
- data/spec/extensions/pg_array_associations_spec.rb +0 -802
- data/spec/extensions/pg_array_ops_spec.rb +0 -144
- data/spec/extensions/pg_array_spec.rb +0 -398
- data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
- data/spec/extensions/pg_enum_spec.rb +0 -118
- data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
- data/spec/extensions/pg_hstore_spec.rb +0 -219
- data/spec/extensions/pg_inet_ops_spec.rb +0 -102
- data/spec/extensions/pg_inet_spec.rb +0 -72
- data/spec/extensions/pg_interval_spec.rb +0 -103
- data/spec/extensions/pg_json_ops_spec.rb +0 -356
- data/spec/extensions/pg_json_spec.rb +0 -451
- data/spec/extensions/pg_loose_count_spec.rb +0 -23
- data/spec/extensions/pg_range_ops_spec.rb +0 -60
- data/spec/extensions/pg_range_spec.rb +0 -600
- data/spec/extensions/pg_row_ops_spec.rb +0 -61
- data/spec/extensions/pg_row_plugin_spec.rb +0 -60
- data/spec/extensions/pg_row_spec.rb +0 -363
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
- data/spec/extensions/pg_timestamptz_spec.rb +0 -17
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
- data/spec/extensions/prepared_statements_spec.rb +0 -177
- data/spec/extensions/pretty_table_spec.rb +0 -123
- data/spec/extensions/query_spec.rb +0 -94
- data/spec/extensions/rcte_tree_spec.rb +0 -387
- data/spec/extensions/round_timestamps_spec.rb +0 -39
- data/spec/extensions/s_spec.rb +0 -60
- data/spec/extensions/schema_caching_spec.rb +0 -64
- data/spec/extensions/schema_dumper_spec.rb +0 -870
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -365
- data/spec/extensions/server_block_spec.rb +0 -135
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/sharding_spec.rb +0 -197
- data/spec/extensions/shared_caching_spec.rb +0 -151
- data/spec/extensions/single_table_inheritance_spec.rb +0 -347
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -18
- data/spec/extensions/spec_helper.rb +0 -70
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -57
- data/spec/extensions/sql_comments_spec.rb +0 -33
- data/spec/extensions/sql_expr_spec.rb +0 -59
- data/spec/extensions/static_cache_cache_spec.rb +0 -35
- data/spec/extensions/static_cache_spec.rb +0 -471
- data/spec/extensions/string_agg_spec.rb +0 -90
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -79
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
- data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
- data/spec/extensions/synchronize_sql_spec.rb +0 -124
- data/spec/extensions/table_select_spec.rb +0 -83
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/throw_failures_spec.rb +0 -74
- data/spec/extensions/timestamps_spec.rb +0 -209
- data/spec/extensions/to_dot_spec.rb +0 -153
- data/spec/extensions/touch_spec.rb +0 -226
- data/spec/extensions/tree_spec.rb +0 -334
- data/spec/extensions/typecast_on_load_spec.rb +0 -86
- data/spec/extensions/unlimited_update_spec.rb +0 -21
- data/spec/extensions/update_or_create_spec.rb +0 -83
- data/spec/extensions/update_primary_key_spec.rb +0 -105
- data/spec/extensions/update_refresh_spec.rb +0 -59
- data/spec/extensions/uuid_spec.rb +0 -101
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1040
- data/spec/extensions/validation_contexts_spec.rb +0 -31
- data/spec/extensions/validation_helpers_spec.rb +0 -525
- data/spec/extensions/whitelist_security_spec.rb +0 -157
- data/spec/extensions/xml_serializer_spec.rb +0 -213
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -59
- data/spec/integration/associations_test.rb +0 -2597
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -2037
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -203
- data/spec/integration/plugin_test.rb +0 -2423
- data/spec/integration/prepared_statement_test.rb +0 -405
- data/spec/integration/schema_test.rb +0 -903
- data/spec/integration/spec_helper.rb +0 -71
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -603
- data/spec/integration/type_test.rb +0 -127
- data/spec/model/association_reflection_spec.rb +0 -803
- data/spec/model/associations_spec.rb +0 -4738
- data/spec/model/base_spec.rb +0 -875
- data/spec/model/class_dataset_methods_spec.rb +0 -146
- data/spec/model/dataset_methods_spec.rb +0 -198
- data/spec/model/eager_loading_spec.rb +0 -2377
- data/spec/model/hooks_spec.rb +0 -370
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -956
- data/spec/model/plugins_spec.rb +0 -429
- data/spec/model/record_spec.rb +0 -2118
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -220
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/sequel_warning.rb +0 -5
- 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
|