diff --git a/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs b/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs index 7cdee7fa4..ec4743d14 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/AssetsField.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.Schemas.Validators; @@ -16,7 +17,7 @@ namespace Squidex.Domain.Apps.Core.Schemas { public sealed class AssetsField : Field, IReferenceField { - private static readonly Guid[] EmptyIds = new Guid[0]; + private static readonly ImmutableList EmptyIds = ImmutableList.Empty; public AssetsField(long id, string name, Partitioning partitioning) : this(id, name, partitioning, new AssetsFieldProperties()) @@ -30,22 +31,27 @@ namespace Squidex.Domain.Apps.Core.Schemas protected override IEnumerable CreateValidators() { - yield return new AssetsValidator(Properties.IsRequired, Properties.MinItems, Properties.MaxItems); + if (Properties.IsRequired || Properties.MinItems.HasValue || Properties.MaxItems.HasValue) + { + yield return new CollectionValidator(Properties.IsRequired, Properties.MinItems, Properties.MaxItems); + } + + yield return new AssetsValidator(); } public IEnumerable GetReferencedIds(JToken value) { - Guid[] assetIds; + IEnumerable result = null; try { - assetIds = value?.ToObject() ?? EmptyIds; + result = value?.ToObject>(); } catch { - assetIds = EmptyIds; + result = EmptyIds; } - return assetIds; + return result ?? EmptyIds; } public JToken RemoveDeletedReferences(JToken value, ISet deletedReferencedIds) @@ -63,7 +69,7 @@ namespace Squidex.Domain.Apps.Core.Schemas public override object ConvertValue(JToken value) { - return new AssetsValue(value.ToObject()); + return value.ToObject>(); } public override T Visit(IFieldVisitor visitor) diff --git a/src/Squidex.Domain.Apps.Core/Schemas/AssetsValue.cs b/src/Squidex.Domain.Apps.Core/Schemas/AssetsValue.cs deleted file mode 100644 index 492c74548..000000000 --- a/src/Squidex.Domain.Apps.Core/Schemas/AssetsValue.cs +++ /dev/null @@ -1,25 +0,0 @@ -// ========================================================================== -// AssetsValue.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; - -namespace Squidex.Domain.Apps.Core.Schemas -{ - public sealed class AssetsValue - { - private static readonly List EmptyAssetIds = new List(); - - public IReadOnlyList AssetIds { get; } - - public AssetsValue(IReadOnlyList assetIds) - { - AssetIds = assetIds ?? EmptyAssetIds; - } - } -} diff --git a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs index b978c7273..6e108e0cb 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesField.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Linq; using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.Schemas.Validators; @@ -16,7 +17,7 @@ namespace Squidex.Domain.Apps.Core.Schemas { public sealed class ReferencesField : Field, IReferenceField { - private static readonly Guid[] EmptyIds = new Guid[0]; + private static readonly ImmutableList EmptyIds = ImmutableList.Empty; public ReferencesField(long id, string name, Partitioning partitioning) : this(id, name, partitioning, new ReferencesFieldProperties()) @@ -30,25 +31,30 @@ namespace Squidex.Domain.Apps.Core.Schemas protected override IEnumerable CreateValidators() { + if (Properties.IsRequired || Properties.MinItems.HasValue || Properties.MaxItems.HasValue) + { + yield return new CollectionValidator(Properties.IsRequired, Properties.MinItems, Properties.MaxItems); + } + if (Properties.SchemaId != Guid.Empty) { - yield return new ReferencesValidator(Properties.IsRequired, Properties.SchemaId, Properties.MinItems, Properties.MaxItems); + yield return new ReferencesValidator(Properties.SchemaId); } } public IEnumerable GetReferencedIds(JToken value) { - Guid[] referenceIds; + IEnumerable result = null; try { - referenceIds = value?.ToObject() ?? EmptyIds; + result = value?.ToObject>(); } catch { - referenceIds = EmptyIds; + result = EmptyIds; } - return referenceIds.Union(new[] { Properties.SchemaId }); + return (result ?? EmptyIds).Union(new[] { Properties.SchemaId }); } public JToken RemoveDeletedReferences(JToken value, ISet deletedReferencedIds) @@ -71,7 +77,7 @@ namespace Squidex.Domain.Apps.Core.Schemas public override object ConvertValue(JToken value) { - return new ReferencesValue(value.ToObject()); + return value.ToObject>(); } public override T Visit(IFieldVisitor visitor) diff --git a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesValue.cs b/src/Squidex.Domain.Apps.Core/Schemas/ReferencesValue.cs deleted file mode 100644 index de9b660c9..000000000 --- a/src/Squidex.Domain.Apps.Core/Schemas/ReferencesValue.cs +++ /dev/null @@ -1,25 +0,0 @@ -// ========================================================================== -// ReferencesValue.cs -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex Group -// All rights reserved. -// ========================================================================== - -using System; -using System.Collections.Generic; - -namespace Squidex.Domain.Apps.Core.Schemas -{ - public sealed class ReferencesValue - { - private static readonly List EmptyReferencedIds = new List(); - - public IReadOnlyList ContentIds { get; } - - public ReferencesValue(IReadOnlyList assetIds) - { - ContentIds = assetIds ?? EmptyReferencedIds; - } - } -} diff --git a/src/Squidex.Domain.Apps.Core/Schemas/Validators/AssetsValidator.cs b/src/Squidex.Domain.Apps.Core/Schemas/Validators/AssetsValidator.cs index 72eeecb9f..91c607f78 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/Validators/AssetsValidator.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/Validators/AssetsValidator.cs @@ -7,50 +7,23 @@ // ========================================================================== using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Squidex.Domain.Apps.Core.Schemas.Validators { public sealed class AssetsValidator : IValidator { - private readonly bool isRequired; - private readonly int? minItems; - private readonly int? maxItems; - - public AssetsValidator(bool isRequired, int? minItems = null, int? maxItems = null) - { - this.isRequired = isRequired; - this.minItems = minItems; - this.maxItems = maxItems; - } - public async Task ValidateAsync(object value, ValidationContext context, Action addError) { - if (!(value is AssetsValue assets) || assets.AssetIds.Count == 0) + if (value is ICollection assetIds) { - if (isRequired && !context.IsOptional) + var invalidIds = await context.GetInvalidAssetIdsAsync(assetIds); + + foreach (var invalidId in invalidIds) { - addError(" is required."); + addError($" contains invalid asset '{invalidId}'."); } - - return; - } - - if (minItems.HasValue && assets.AssetIds.Count < minItems.Value) - { - addError($" must have at least {minItems} asset(s)."); - } - - if (maxItems.HasValue && assets.AssetIds.Count > maxItems.Value) - { - addError($" must have not more than {maxItems} asset(s)."); - } - - var invalidIds = await context.GetInvalidAssetIdsAsync(assets.AssetIds); - - foreach (var invalidId in invalidIds) - { - addError($" contains invalid asset '{invalidId}'."); } } } diff --git a/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionItemValidator.cs b/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionItemValidator.cs new file mode 100644 index 000000000..5417166d0 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionItemValidator.cs @@ -0,0 +1,46 @@ +// ========================================================================== +// CollectionItemValidator.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.Schemas.Validators +{ + public sealed class CollectionItemValidator : IValidator + { + private readonly IValidator[] itemValidators; + + public CollectionItemValidator(params IValidator[] itemValidators) + { + Guard.NotNull(itemValidators, nameof(itemValidators)); + Guard.NotEmpty(itemValidators, nameof(itemValidators)); + + this.itemValidators = itemValidators; + } + + public async Task ValidateAsync(object value, ValidationContext context, Action addError) + { + if (value is ICollection items) + { + var index = 1; + + foreach (var item in items) + { + foreach (var itemValidator in itemValidators) + { + await itemValidator.ValidateAsync(item, context, e => addError(e.Replace("", $" item #{index}"))); + } + + index++; + } + } + } + } +} diff --git a/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionValidator.cs b/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionValidator.cs new file mode 100644 index 000000000..95de4d88b --- /dev/null +++ b/src/Squidex.Domain.Apps.Core/Schemas/Validators/CollectionValidator.cs @@ -0,0 +1,54 @@ +// ========================================================================== +// CollectionValidator.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Squidex.Infrastructure.Tasks; + +namespace Squidex.Domain.Apps.Core.Schemas.Validators +{ + public sealed class CollectionValidator : IValidator + { + private readonly bool isRequired; + private readonly int? minItems; + private readonly int? maxItems; + + public CollectionValidator(bool isRequired, int? minItems = null, int? maxItems = null) + { + this.isRequired = isRequired; + this.minItems = minItems; + this.maxItems = maxItems; + } + + public Task ValidateAsync(object value, ValidationContext context, Action addError) + { + if (!(value is ICollection items) || items.Count == 0) + { + if (isRequired && !context.IsOptional) + { + addError(" is required."); + } + + return TaskHelper.Done; + } + + if (minItems.HasValue && items.Count < minItems.Value) + { + addError($" must have at least {minItems} item(s)."); + } + + if (maxItems.HasValue && items.Count > maxItems.Value) + { + addError($" must have not more than {maxItems} item(s)."); + } + + return TaskHelper.Done; + } + } +} diff --git a/src/Squidex.Domain.Apps.Core/Schemas/Validators/RangeValidator.cs b/src/Squidex.Domain.Apps.Core/Schemas/Validators/RangeValidator.cs index 3d8dcca14..05132b2fc 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/Validators/RangeValidator.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/Validators/RangeValidator.cs @@ -39,12 +39,12 @@ namespace Squidex.Domain.Apps.Core.Schemas.Validators if (min.HasValue && typedValue.CompareTo(min.Value) < 0) { - addError($" must be greater than '{min}'."); + addError($" must be greater or equals than '{min}'."); } if (max.HasValue && typedValue.CompareTo(max.Value) > 0) { - addError($" must be less than '{max}'."); + addError($" must be less or equals than '{max}'."); } return TaskHelper.Done; diff --git a/src/Squidex.Domain.Apps.Core/Schemas/Validators/ReferencesValidator.cs b/src/Squidex.Domain.Apps.Core/Schemas/Validators/ReferencesValidator.cs index 54e583231..b5ddfaa47 100644 --- a/src/Squidex.Domain.Apps.Core/Schemas/Validators/ReferencesValidator.cs +++ b/src/Squidex.Domain.Apps.Core/Schemas/Validators/ReferencesValidator.cs @@ -7,52 +7,30 @@ // ========================================================================== using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace Squidex.Domain.Apps.Core.Schemas.Validators { public sealed class ReferencesValidator : IValidator { - private readonly bool isRequired; private readonly Guid schemaId; - private readonly int? minItems; - private readonly int? maxItems; - public ReferencesValidator(bool isRequired, Guid schemaId, int? minItems = null, int? maxItems = null) + public ReferencesValidator(Guid schemaId) { - this.isRequired = isRequired; this.schemaId = schemaId; - this.minItems = minItems; - this.maxItems = maxItems; } public async Task ValidateAsync(object value, ValidationContext context, Action addError) { - if (!(value is ReferencesValue references) || references.ContentIds.Count == 0) + if (value is ICollection contentIds) { - if (isRequired && !context.IsOptional) + var invalidIds = await context.GetInvalidContentIdsAsync(contentIds, schemaId); + + foreach (var invalidId in invalidIds) { - addError(" is required."); + addError($" contains invalid reference '{invalidId}'."); } - - return; - } - - if (minItems.HasValue && references.ContentIds.Count < minItems.Value) - { - addError($" must have at least {minItems} reference(s)."); - } - - if (maxItems.HasValue && references.ContentIds.Count > maxItems.Value) - { - addError($" must have not more than {maxItems} reference(s)."); - } - - var invalidIds = await context.GetInvalidContentIdsAsync(references.ContentIds, schemaId); - - foreach (var invalidId in invalidIds) - { - addError($" contains invalid reference '{invalidId}'."); } } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/ContentValidationTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/ContentValidationTests.cs index f15b60ea1..54f8f0d0f 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/ContentValidationTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/ContentValidationTests.cs @@ -56,7 +56,7 @@ namespace Squidex.Domain.Apps.Core errors.ShouldBeEquivalentTo( new List { - new ValidationError("my-field must be less than '100'.", "my-field") + new ValidationError("my-field must be less or equals than '100'.", "my-field") }); } @@ -212,7 +212,7 @@ namespace Squidex.Domain.Apps.Core errors.ShouldBeEquivalentTo( new List { - new ValidationError("my-field must be less than '100'.", "my-field") + new ValidationError("my-field must be less or equals than '100'.", "my-field") }); } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/AssetsFieldTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/AssetsFieldTests.cs index baa83cb62..3e293f939 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/AssetsFieldTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/AssetsFieldTests.cs @@ -99,7 +99,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(Guid.NewGuid(), Guid.NewGuid()), errors); errors.ShouldBeEquivalentTo( - new[] { " must have at least 3 asset(s)." }); + new[] { " must have at least 3 item(s)." }); } [Fact] @@ -110,7 +110,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(Guid.NewGuid(), Guid.NewGuid()), errors); errors.ShouldBeEquivalentTo( - new[] { " must have not more than 1 asset(s)." }); + new[] { " must have not more than 1 item(s)." }); } [Fact] @@ -206,14 +206,6 @@ namespace Squidex.Domain.Apps.Core.Schemas Assert.Same(token, result); } - [Fact] - public void Should_create_assets_value_with_empty_list_when_null() - { - var value = new AssetsValue(null); - - Assert.Equal(new List(), value.AssetIds); - } - private static JToken CreateValue(params Guid[] ids) { return ids == null ? JValue.CreateNull() : (JToken)new JArray(ids.OfType().ToArray()); diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/DateTimeFieldTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/DateTimeFieldTests.cs index 30c073a60..802cad054 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/DateTimeFieldTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/DateTimeFieldTests.cs @@ -65,7 +65,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(FutureDays(0)), errors); errors.ShouldBeEquivalentTo( - new[] { $" must be greater than '{FutureDays(10)}'." }); + new[] { $" must be greater or equals than '{FutureDays(10)}'." }); } [Fact] @@ -76,7 +76,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(FutureDays(20)), errors); errors.ShouldBeEquivalentTo( - new[] { $" must be less than '{FutureDays(10)}'." }); + new[] { $" must be less or equals than '{FutureDays(10)}'." }); } [Fact] diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/NumberFieldTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/NumberFieldTests.cs index 95cfa32c2..f631b0f64 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/NumberFieldTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/NumberFieldTests.cs @@ -64,7 +64,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(5), errors); errors.ShouldBeEquivalentTo( - new[] { " must be greater than '10'." }); + new[] { " must be greater or equals than '10'." }); } [Fact] @@ -75,7 +75,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(20), errors); errors.ShouldBeEquivalentTo( - new[] { " must be less than '10'." }); + new[] { " must be less or equals than '10'." }); } [Fact] diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/ReferencesFieldTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/ReferencesFieldTests.cs index 6864a0a4e..2a0ef8df8 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/ReferencesFieldTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/ReferencesFieldTests.cs @@ -100,7 +100,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(Guid.NewGuid(), Guid.NewGuid()), errors); errors.ShouldBeEquivalentTo( - new[] { " must have at least 3 reference(s)." }); + new[] { " must have at least 3 item(s)." }); } [Fact] @@ -111,7 +111,7 @@ namespace Squidex.Domain.Apps.Core.Schemas await sut.ValidateAsync(CreateValue(Guid.NewGuid(), Guid.NewGuid()), errors); errors.ShouldBeEquivalentTo( - new[] { " must have not more than 1 reference(s)." }); + new[] { " must have not more than 1 item(s)." }); } [Fact] @@ -220,14 +220,6 @@ namespace Squidex.Domain.Apps.Core.Schemas Assert.Same(token, result); } - [Fact] - public void Should_create_references_value_with_empty_list_when_null() - { - var value = new ReferencesValue(null); - - Assert.Equal(new List(), value.ContentIds); - } - private static JToken CreateValue(params Guid[] ids) { return ids == null ? JValue.CreateNull() : (JToken)new JArray(ids.OfType().ToArray()); diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionItemValidatorTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionItemValidatorTests.cs new file mode 100644 index 000000000..f0e64e2f3 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionItemValidatorTests.cs @@ -0,0 +1,55 @@ +// ========================================================================== +// CollectionValidatorTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Schemas.Validators +{ + public class CollectionItemValidatorTests + { + private readonly List errors = new List(); + + [Fact] + public async Task Should_not_add_error_if_value_is_wrong_type() + { + var sut = new CollectionItemValidator(new RangeValidator(2, 4)); + + await sut.ValidateAsync(true, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_all_values_are_valid() + { + var sut = new CollectionItemValidator(new RangeValidator(2, 4)); + + await sut.ValidateAsync(new List { 2, 3, 4 }, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_at_least_one_item_is_not_valid() + { + var sut = new CollectionItemValidator(new RangeValidator(2, 4)); + + await sut.ValidateAsync(new List { 2, 1, 4, 5 }, errors); + + errors.ShouldBeEquivalentTo( + new[] + { + " item #2 must be greater or equals than '2'.", + " item #4 must be less or equals than '4'." + }); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionValidatorTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionValidatorTests.cs new file mode 100644 index 000000000..07eac3007 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/CollectionValidatorTests.cs @@ -0,0 +1,73 @@ +// ========================================================================== +// CollectionValidatorTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Schemas.Validators +{ + public class CollectionValidatorTests + { + private readonly List errors = new List(); + + [Fact] + public async Task Should_not_add_error_if_value_is_valid() + { + var sut = new CollectionValidator(true, 1, 3); + + await sut.ValidateAsync(new List { 1, 2 }, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_not_add_error_if_optional() + { + var sut = new CollectionValidator(true, 1, 3); + + await sut.ValidateOptionalAsync(null, errors); + + Assert.Empty(errors); + } + + [Fact] + public async Task Should_add_error_if_value_is_null() + { + var sut = new CollectionValidator(true, 1, 3); + + await sut.ValidateAsync(null, errors); + + errors.ShouldBeEquivalentTo( + new[] { " is required." }); + } + + [Fact] + public async Task Should_add_error_if_collection_has_too_few_items() + { + var sut = new CollectionValidator(true, 2, 3); + + await sut.ValidateAsync(new List { 1 }, errors); + + errors.ShouldBeEquivalentTo( + new[] { " must have at least 2 item(s)." }); + } + + [Fact] + public async Task Should_add_error_if_collection_has_too_many_items() + { + var sut = new CollectionValidator(true, 2, 3); + + await sut.ValidateAsync(new List { 1, 2, 3, 4 }, errors); + + errors.ShouldBeEquivalentTo( + new[] { " must have not more than 3 item(s)." }); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/RangeValidatorTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/RangeValidatorTests.cs index 3eba5cbb5..fef036a4f 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/RangeValidatorTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Schemas/Validators/RangeValidatorTests.cs @@ -58,7 +58,7 @@ namespace Squidex.Domain.Apps.Core.Schemas.Validators await sut.ValidateAsync(1500, errors); errors.ShouldBeEquivalentTo( - new[] { " must be greater than '2000'." }); + new[] { " must be greater or equals than '2000'." }); } [Fact] @@ -69,7 +69,7 @@ namespace Squidex.Domain.Apps.Core.Schemas.Validators await sut.ValidateAsync(1500, errors); errors.ShouldBeEquivalentTo( - new[] { " must be less than '1000'." }); + new[] { " must be less or equals than '1000'." }); } } }