From 1bc85b2fad2ca7e705d798bc245416331a6680ce Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 3 Nov 2020 21:06:46 +0100 Subject: [PATCH] Tests improved and fixed. --- .../Assets/AssetCommandMiddleware.cs | 4 +- .../Validators/AssetsValidatorTests.cs | 13 +++-- .../Validators/ReferencesValidatorTests.cs | 46 +++++++++++------- .../Validators/UniqueValidatorTests.cs | 48 +++++++++++++------ .../Apps/DefaultAppLogStoreTests.cs | 5 +- .../Assets/AssetCommandMiddlewareTests.cs | 2 +- .../Contents/Queries/ConvertDataTests.cs | 4 +- frontend/package-lock.json | 10 ++-- 8 files changed, 83 insertions(+), 49 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetCommandMiddleware.cs index 2e3e23dea..63d202b64 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetCommandMiddleware.cs @@ -58,12 +58,10 @@ namespace Squidex.Domain.Apps.Entities.Assets { await EnrichWithHashAndUploadAsync(createAsset, tempFile); - var ctx = contextProvider.Context.Clone().WithoutAssetEnrichment(); - if (!createAsset.Duplicate) { var existing = - await assetQuery.FindByHashAsync(ctx, + await assetQuery.FindByHashAsync(contextProvider.Context, createAsset.FileHash, createAsset.File.FileName, createAsset.File.FileSize); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/AssetsValidatorTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/AssetsValidatorTests.cs index 823a3e805..e5eee4b04 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/AssetsValidatorTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/AssetsValidatorTests.cs @@ -286,10 +286,17 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators private IValidator Validator(AssetsFieldProperties properties) { - return new AssetsValidator(properties.IsRequired, properties, ids => + return new AssetsValidator(properties.IsRequired, properties, FoundAssets()); + } + + private CheckAssets FoundAssets() + { + return ids => { - return Task.FromResult>(new List { document, image1, image2 }); - }); + var result = new List { document, image1, image2 }; + + return Task.FromResult>(result); + }; } } } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/ReferencesValidatorTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/ReferencesValidatorTests.cs index 9d83e82e4..09477bd87 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/ReferencesValidatorTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/ReferencesValidatorTests.cs @@ -32,7 +32,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { SchemaId = schemaId1 }; - var sut = Validator(properties, FoundReferences((schemaId2, ref2, Status.Published))); + var sut = Validator(properties, schemaId2, (ref2, Status.Published)); await sut.ValidateAsync(CreateValue(ref2), errors, action: ValidationAction.Publish); @@ -44,7 +44,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties(); - var sut = Validator(properties, FoundReferences((schemaId2, ref2, Status.Published))); + var sut = Validator(properties, schemaId2, (ref2, Status.Published)); await sut.ValidateAsync(CreateValue(ref2), errors); @@ -56,7 +56,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { SchemaId = schemaId1 }; - var sut = Validator(properties, FoundReferences((schemaId1, ref2, Status.Published))); + var sut = Validator(properties, schemaId1, (ref2, Status.Published)); await sut.ValidateAsync(CreateValue(ref2), errors); @@ -68,7 +68,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties(); - var sut = Validator(properties, FoundReferences()); + var sut = Validator(properties); await sut.ValidateAsync(null, errors); @@ -80,7 +80,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties(); - var sut = Validator(properties, FoundReferences()); + var sut = Validator(properties); await sut.ValidateAsync(CreateValue(), errors); @@ -92,7 +92,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { AllowDuplicates = true }; - var sut = Validator(properties, FoundReferences((schemaId1, ref1, Status.Published))); + var sut = Validator(properties, schemaId1, (ref1, Status.Published)); await sut.ValidateAsync(CreateValue(ref1, ref1), errors); @@ -104,7 +104,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { IsRequired = true }; - var sut = Validator(properties, FoundReferences()); + var sut = Validator(properties, schemaId1); await sut.ValidateAsync(CreateValue(), errors); @@ -117,7 +117,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { MustBePublished = true, IsRequired = true }; - var sut = Validator(properties, FoundReferences((schemaId1, ref1, Status.Published))); + var sut = Validator(properties, schemaId1, (ref1, Status.Published)); await sut.ValidateAsync(CreateValue(), errors); @@ -130,7 +130,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties(); - var sut = Validator(properties, FoundReferences()); + var sut = Validator(properties); await sut.ValidateAsync(CreateValue(ref1), errors); @@ -143,7 +143,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { SchemaId = schemaId1 }; - var sut = Validator(properties, FoundReferences((schemaId2, ref2, Status.Draft))); + var sut = Validator(properties, schemaId2, (ref2, Status.Draft)); await sut.ValidateAsync(CreateValue(ref2), errors); @@ -156,7 +156,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { MinItems = 2 }; - var sut = Validator(properties, FoundReferences((schemaId2, ref2, Status.Draft))); + var sut = Validator(properties, schemaId2, (ref2, Status.Draft)); await sut.ValidateAsync(CreateValue(ref2), errors); @@ -169,7 +169,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { MinItems = 2, MustBePublished = true }; - var sut = Validator(properties, FoundReferences((schemaId1, ref1, Status.Published), (schemaId1, ref2, Status.Draft))); + var sut = Validator(properties, schemaId1, (ref1, Status.Published), (ref2, Status.Draft)); await sut.ValidateAsync(CreateValue(ref1, ref2), errors); @@ -182,7 +182,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties { MaxItems = 1 }; - var sut = Validator(properties, FoundReferences((schemaId1, ref1, Status.Published), (schemaId1, ref2, Status.Draft))); + var sut = Validator(properties, schemaId1, (ref1, Status.Published), (ref2, Status.Draft)); await sut.ValidateAsync(CreateValue(ref1, ref2), errors); @@ -195,7 +195,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { var properties = new ReferencesFieldProperties(); - var sut = Validator(properties, FoundReferences((schemaId1, ref1, Status.Published))); + var sut = Validator(properties, schemaId1, (ref1, Status.Published)); await sut.ValidateAsync(CreateValue(ref1, ref1), errors); @@ -208,14 +208,24 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators return ids.ToList(); } - private static CheckContentsByIds FoundReferences(params (DomainId SchemaId, DomainId Id, Status Status)[] references) + private IValidator Validator(ReferencesFieldProperties properties) { - return x => Task.FromResult>(references.ToList()); + return new ReferencesValidator(properties.IsRequired, properties, FoundReferences(schemaId1)); } - private IValidator Validator(ReferencesFieldProperties properties, CheckContentsByIds found) + private IValidator Validator(ReferencesFieldProperties properties, DomainId schemaId, params (DomainId Id, Status Status)[] references) { - return new ReferencesValidator(properties.IsRequired, properties, found); + return new ReferencesValidator(properties.IsRequired, properties, FoundReferences(schemaId, references)); + } + + private static CheckContentsByIds FoundReferences(DomainId schemaId, params (DomainId Id, Status Status)[] references) + { + return x => + { + var result = references.Select(x => (schemaId, x.Id, x.Status)).ToList(); + + return Task.FromResult>(result); + }; } } } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValidatorTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValidatorTests.cs index 76b0cade2..d1e8ede07 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValidatorTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/UniqueValidatorTests.cs @@ -19,15 +19,14 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators { public class UniqueValidatorTests : IClassFixture { - private readonly DomainId schemaId = DomainId.NewGuid(); private readonly List errors = new List(); [Fact] - public async Task Should_add_error_if_string_value_not_found() + public async Task Should_add_error_if_other_content_with_string_value_found() { var filter = string.Empty; - var sut = new UniqueValidator(Check(DomainId.NewGuid(), f => filter = f)); + var sut = new UniqueValidator(FoundDuplicates(DomainId.NewGuid(), f => filter = f)); await sut.ValidateAsync("hi", errors, updater: c => c.Nested("property").Nested("iv")); @@ -38,11 +37,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators } [Fact] - public async Task Should_add_error_if_double_value_not_found() + public async Task Should_add_error_if_other_content_with_double_value_found() { var filter = string.Empty; - var sut = new UniqueValidator(Check(DomainId.NewGuid(), f => filter = f)); + var sut = new UniqueValidator(FoundDuplicates(DomainId.NewGuid(), f => filter = f)); await sut.ValidateAsync(12.5, errors, updater: c => c.Nested("property").Nested("iv")); @@ -53,9 +52,23 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators } [Fact] - public async Task Should_not_add_error_if_string_value_not_found_but_in_optimized_mode() + public async Task Should_not_check_uniqueness_if_localized_string() { - var sut = new UniqueValidator(Check(DomainId.NewGuid())); + var filter = string.Empty; + + var sut = new UniqueValidator(FoundDuplicates(DomainId.NewGuid(), f => filter = f)); + + await sut.ValidateAsync(12.5, errors, updater: c => c.Nested("property").Nested("de")); + + Assert.Empty(errors); + + Assert.Empty(filter); + } + + [Fact] + public async Task Should_not_add_error_if_value_is_null() + { + var sut = new UniqueValidator(FoundDuplicates(DomainId.NewGuid())); await sut.ValidateAsync(null, errors); @@ -63,11 +76,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators } [Fact] - public async Task Should_not_add_error_if_string_value_found_with_same_content_id() + public async Task Should_not_add_error_if_same_content_with_string_value_found() { - var ctx = ValidationTestExtensions.CreateContext(); + var ctx = ValidationTestExtensions.CreateContext().Nested("property").Nested("iv"); - var sut = new UniqueValidator(Check(ctx.ContentId)); + var sut = new UniqueValidator(FoundDuplicates(ctx.ContentId)); await sut.ValidateAsync("hi", ctx, ValidationTestExtensions.CreateFormatter(errors)); @@ -75,24 +88,29 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators } [Fact] - public async Task Should_not_add_error_if_double_value_found_with_same_content_id() + public async Task Should_not_add_error_if_same_content_with_double_value_found() { - var ctx = ValidationTestExtensions.CreateContext(); + var ctx = ValidationTestExtensions.CreateContext().Nested("property").Nested("iv"); - var sut = new UniqueValidator(Check(ctx.ContentId)); + var sut = new UniqueValidator(FoundDuplicates(ctx.ContentId)); await sut.ValidateAsync(12.5, ctx, ValidationTestExtensions.CreateFormatter(errors)); Assert.Empty(errors); } - private CheckUniqueness Check(DomainId id, Action? filter = null) + private CheckUniqueness FoundDuplicates(DomainId id, Action? filter = null) { return filterNode => { filter?.Invoke(filterNode.ToString()); - return Task.FromResult>(new List<(DomainId, DomainId, Status)> { (schemaId, id, Status.Published) }); + var foundIds = new List<(DomainId, DomainId, Status)> + { + (id, id, Status.Draft) + }; + + return Task.FromResult>(foundIds); }; } } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DefaultAppLogStoreTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DefaultAppLogStoreTests.cs index 153e0ffa8..b52c5d83e 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DefaultAppLogStoreTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/DefaultAppLogStoreTests.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Threading.Tasks; using FakeItEasy; @@ -48,8 +49,8 @@ namespace Squidex.Domain.Apps.Entities.Apps Assert.NotNull(recordedRequest); - Assert.Contains(request.Bytes.ToString(), recordedRequest!.Properties.Values); - Assert.Contains(request.Costs.ToString(), recordedRequest!.Properties.Values); + Assert.Contains(request.Bytes.ToString(CultureInfo.InvariantCulture), recordedRequest!.Properties.Values); + Assert.Contains(request.Costs.ToString(CultureInfo.InvariantCulture), recordedRequest!.Properties.Values); Assert.Contains(request.ElapsedMs.ToString(), recordedRequest!.Properties.Values); Assert.Contains(request.RequestMethod, recordedRequest!.Properties.Values); Assert.Contains(request.RequestPath, recordedRequest!.Properties.Values); diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs index b392c8199..1beb04c49 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs @@ -291,7 +291,7 @@ namespace Squidex.Domain.Apps.Entities.Assets FileSize = fileSize }; - A.CallTo(() => assetQuery.FindByHashAsync(A.That.Matches(x => x.ShouldEnrichAsset()), A._, A._, A._)) + A.CallTo(() => assetQuery.FindByHashAsync(requestContext, A._, fileName, fileSize)) .Returns(duplicate); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs index ca6f55c1b..19c790b7b 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ConvertDataTests.cs @@ -90,7 +90,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries .Returns(new List { id2 }); A.CallTo(() => contentRepository.QueryIdsAsync(appId.Id, A>.That.Is(id1, id2), SearchScope.All)) - .Returns(new List<(DomainId, DomainId)> { (id2, id2) }); + .Returns(new List<(DomainId, DomainId, Status)> { (id2, id2, Status.Published) }); var ctx = new Context(Mocks.FrontendUser(), Mocks.App(appId)); @@ -128,7 +128,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries .Returns(new List()); A.CallTo(() => contentRepository.QueryIdsAsync(appId.Id, A>.That.Is(id1, id2), SearchScope.All)) - .Returns(new List<(DomainId, DomainId)>()); + .Returns(new List<(DomainId, DomainId, Status)>()); var ctx = new Context(Mocks.FrontendUser(), Mocks.App(appId)); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2ebc89a0e..fedce4a33 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1342,7 +1342,7 @@ "dependencies": { "jsesc": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true } @@ -2848,7 +2848,7 @@ }, "css-color-names": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, @@ -8547,7 +8547,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, @@ -12322,7 +12322,7 @@ }, "rgba-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", "dev": true }, @@ -14267,7 +14267,7 @@ "dependencies": { "json5": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": {