From 327b4beef6110f372804c1ac14a55c61eccbe238 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 25 Jan 2020 23:21:50 +0100 Subject: [PATCH] Validation for fallback languages. --- .../Apps/Commands/UpdateLanguage.cs | 2 +- .../Apps/Guards/GuardAppLanguages.cs | 5 +++++ .../Apps/AppLanguageUpdated.cs | 2 +- .../Commands/DomainObjectBase.cs | 2 +- .../Apps/Guards/GuardAppLanguagesTests.cs | 15 +++++++++++++-- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Commands/UpdateLanguage.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Commands/UpdateLanguage.cs index 52e40e5d0..07ee21cde 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Commands/UpdateLanguage.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Commands/UpdateLanguage.cs @@ -18,6 +18,6 @@ namespace Squidex.Domain.Apps.Entities.Apps.Commands public bool IsMaster { get; set; } - public List Fallback { get; set; } + public List? Fallback { get; set; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppLanguages.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppLanguages.cs index f924941dd..8bc8bc248 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppLanguages.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Guards/GuardAppLanguages.cs @@ -69,6 +69,11 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards e("Master language cannot be made optional.", nameof(command.IsMaster)); } + if ((languages.Master == config || command.IsMaster) && command.Fallback?.Count > 0) + { + e("Master language cannot have fallback languages.", nameof(command.Fallback)); + } + if (command.Fallback == null) { return; diff --git a/backend/src/Squidex.Domain.Apps.Events/Apps/AppLanguageUpdated.cs b/backend/src/Squidex.Domain.Apps.Events/Apps/AppLanguageUpdated.cs index b995902bd..a36e31055 100644 --- a/backend/src/Squidex.Domain.Apps.Events/Apps/AppLanguageUpdated.cs +++ b/backend/src/Squidex.Domain.Apps.Events/Apps/AppLanguageUpdated.cs @@ -20,6 +20,6 @@ namespace Squidex.Domain.Apps.Events.Apps public bool IsMaster { get; set; } - public List Fallback { get; set; } + public List? Fallback { get; set; } } } diff --git a/backend/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs b/backend/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs index 39ed02135..5cc52e8dd 100644 --- a/backend/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs +++ b/backend/src/Squidex.Infrastructure/Commands/DomainObjectBase.cs @@ -149,7 +149,7 @@ namespace Squidex.Infrastructure.Commands throw new DomainObjectVersionException(id.ToString(), GetType(), Version, command.ExpectedVersion); } - if (isUpdate == true && Version < 0) + if (isUpdate && Version < 0) { throw new DomainObjectNotFoundException(id.ToString(), GetType()); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppLanguagesTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppLanguagesTests.cs index cc1dda869..6bccc7603 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppLanguagesTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Guards/GuardAppLanguagesTests.cs @@ -105,10 +105,21 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards new ValidationError("Master language cannot be made optional.", "IsMaster")); } + [Fact] + public void CanUpdateLanguage_should_throw_exception_if_fallback_language_defined_and_master() + { + var command = new UpdateLanguage { Language = Language.DE, Fallback = new List { Language.EN } }; + + var languages_1 = languages_0.Set(new LanguageConfig(Language.EN)); + + ValidationAssert.Throws(() => GuardAppLanguages.CanUpdate(languages_1, command), + new ValidationError("Master language cannot have fallback languages.", "Fallback")); + } + [Fact] public void CanUpdateLanguage_should_throw_exception_if_language_has_invalid_fallback() { - var command = new UpdateLanguage { Language = Language.DE, Fallback = new List { Language.IT } }; + var command = new UpdateLanguage { Language = Language.EN, Fallback = new List { Language.IT } }; var languages_1 = languages_0.Set(new LanguageConfig(Language.EN)); @@ -129,7 +140,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Guards [Fact] public void CanUpdateLanguage_should_not_throw_exception_if_language_is_valid() { - var command = new UpdateLanguage { Language = Language.DE, Fallback = new List { Language.EN } }; + var command = new UpdateLanguage { Language = Language.EN, Fallback = new List { Language.EN } }; var languages_1 = languages_0.Set(new LanguageConfig(Language.EN));