From 3379a8269fc57567b5cd2751cf5cc98724178e12 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Fri, 17 May 2019 22:02:10 +0200 Subject: [PATCH] Tests for validators. --- .../Validators/AllowedValuesValidator.cs | 9 +-- .../Validators/NoValueValidator.cs | 2 +- .../Validators/RangeValidator.cs | 44 ++++++------- .../Validators/RequiredStringValidator.cs | 6 +- .../ValidateContent/UIFieldTests.cs | 65 +++++++++++++++++++ .../ValidationTestExtensions.cs | 19 ++++-- .../Validators/NoValueValidatorTests.cs | 53 +++++++++++++++ 7 files changed, 154 insertions(+), 44 deletions(-) create mode 100644 tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs create mode 100644 tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs diff --git a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs index cc1fcdfca..6f0d4a63a 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs @@ -31,14 +31,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators public Task ValidateAsync(object value, ValidationContext context, AddError addError) { - if (value == null) - { - return TaskHelper.Done; - } - - var typedValue = (T)value; - - if (!allowedValues.Contains(typedValue)) + if (value != null && value is T typedValue && !allowedValues.Contains(typedValue)) { addError(context.Path, "Not an allowed value."); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs index 52e857d5b..cf83164d4 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs @@ -21,7 +21,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators { if (value != null) { - addError(context.Path, "Field does not accept a value."); + addError(context.Path, "Value must not be defined."); } return Task.CompletedTask; diff --git a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs index 52a72ba4c..2209786f7 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs @@ -29,34 +29,30 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators public Task ValidateAsync(object value, ValidationContext context, AddError addError) { - if (value == null) + if (value != null && value is T typedValue) { - return TaskHelper.Done; - } - - var typedValue = (T)value; - - if (min.HasValue && max.HasValue) - { - if (Equals(min, max) && Equals(min.Value, max.Value)) - { - addError(context.Path, $"Must be exactly '{max}'."); - } - else if (typedValue.CompareTo(min.Value) < 0 || typedValue.CompareTo(max.Value) > 0) + if (min.HasValue && max.HasValue) { - addError(context.Path, $"Must be between '{min}' and '{max}'."); + if (Equals(min, max) && Equals(min.Value, max.Value)) + { + addError(context.Path, $"Must be exactly '{max}'."); + } + else if (typedValue.CompareTo(min.Value) < 0 || typedValue.CompareTo(max.Value) > 0) + { + addError(context.Path, $"Must be between '{min}' and '{max}'."); + } } - } - else - { - if (min.HasValue && typedValue.CompareTo(min.Value) < 0) - { - addError(context.Path, $"Must be greater or equal to '{min}'."); - } - - if (max.HasValue && typedValue.CompareTo(max.Value) > 0) + else { - addError(context.Path, $"Must be less or equal to '{max}'."); + if (min.HasValue && typedValue.CompareTo(min.Value) < 0) + { + addError(context.Path, $"Must be greater or equal to '{min}'."); + } + + if (max.HasValue && typedValue.CompareTo(max.Value) > 0) + { + addError(context.Path, $"Must be less or equal to '{max}'."); + } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs index eacbcdb79..022d2318f 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs @@ -21,14 +21,12 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators public Task ValidateAsync(object value, ValidationContext context, AddError addError) { - if (context.IsOptional || (value != null && !(value is string))) + if (context.IsOptional) { return TaskHelper.Done; } - var valueAsString = (string)value; - - if (valueAsString == null || (validateEmptyStrings && string.IsNullOrWhiteSpace(valueAsString))) + if (value == null || (value is string stringValue && validateEmptyStrings && string.IsNullOrWhiteSpace(stringValue))) { addError(context.Path, "Field is required."); } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs new file mode 100644 index 000000000..f7f46592e --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs @@ -0,0 +1,65 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Infrastructure.Json.Objects; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Operations.ValidateContent +{ + public class UIFieldTests + { + private readonly List errors = new List(); + + [Fact] + public void Should_instantiate_field() + { + var sut = Field(new UIFieldProperties()); + + Assert.Equal("my-ui", sut.Name); + } + + [Fact] + public async Task Should_not_add_error_if_value_is_null() + { + var sut = Field(new UIFieldProperties()); + + await sut.ValidateAsync(null, errors, ValidationTestExtensions.ValidContext); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_value_is_json_null() + { + var sut = Field(new UIFieldProperties()); + + await sut.ValidateAsync(JsonValue.Null, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_value_is_valid() + { + var sut = Field(new UIFieldProperties { IsRequired = true }); + + await sut.ValidateAsync(JsonValue.True, errors); + + errors.Should().BeEquivalentTo( + new[] { "Value must not be defined." }); + } + + private static RootField Field(UIFieldProperties properties) + { + return Fields.UI(1, "my-ui", Partitioning.Invariant, properties); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs index 38d111d7e..ccd2aa9ee 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs @@ -32,23 +32,28 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent public static Task ValidateOptionalAsync(this IValidator validator, object value, IList errors, ValidationContext context = null) { - return validator.ValidateAsync(value, + return validator.ValidateAsync( + value, CreateContext(context).Optional(true), CreateFormatter(errors)); } public static Task ValidateAsync(this IField field, IJsonValue value, IList errors, ValidationContext context = null) { - return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field).ValidateAsync(value, - CreateContext(context), - CreateFormatter(errors)); + return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field) + .ValidateAsync( + value, + CreateContext(context), + CreateFormatter(errors)); } public static Task ValidateOptionalAsync(this IField field, IJsonValue value, IList errors, ValidationContext context = null) { - return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field).ValidateAsync(value, - CreateContext(context).Optional(true), - CreateFormatter(errors)); + return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field) + .ValidateAsync( + value, + CreateContext(context).Optional(true), + CreateFormatter(errors)); } private static AddError CreateFormatter(IList errors) diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs new file mode 100644 index 000000000..428924d69 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs @@ -0,0 +1,53 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Squidex.Domain.Apps.Core.ValidateContent.Validators; +using Squidex.Infrastructure.Json.Objects; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators +{ + public class NoValueValidatorTests + { + private readonly List errors = new List(); + + [Fact] + public async Task Should_not_add_error_if_value_is_null() + { + var sut = NoValueValidator.Instance; + + await sut.ValidateAsync(null, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_value_is_json_null() + { + var sut = NoValueValidator.Instance; + + await sut.ValidateAsync(JsonValue.Null, errors); + + errors.Should().BeEquivalentTo( + new[] { "Value must not be defined." }); + } + + [Fact] + public async Task Should_add_error_if_value_is_valid() + { + var sut = NoValueValidator.Instance; + + await sut.ValidateAsync(JsonValue.True, errors); + + errors.Should().BeEquivalentTo( + new[] { "Value must not be defined." }); + } + } +}