Added unit tests for configuration validators.

This commit is contained in:
Andy Butland
2020-09-20 23:18:04 +02:00
parent bae4f2fb53
commit 8aadbe02d6
21 changed files with 474 additions and 34 deletions

View File

@@ -4,7 +4,7 @@ using System.Linq;
namespace Umbraco.Core.Configuration.Models.Validation
{
public abstract class ConfigurationValidationBase
public abstract class ConfigurationValidatorBase
{
public bool ValidateStringIsOneOfValidValues(string configPath, string value, IEnumerable<string> validValues, out string message)
{

View File

@@ -1,12 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Extensions.Options;
using Umbraco.Core.Macros;
namespace Umbraco.Core.Configuration.Models.Validation
{
public class ContentSettingsValidation : ConfigurationValidationBase, IValidateOptions<ContentSettings>
public class ContentSettingsValidator : ConfigurationValidatorBase, IValidateOptions<ContentSettings>
{
public ValidateOptionsResult Validate(string name, ContentSettings options)
{

View File

@@ -2,7 +2,8 @@
namespace Umbraco.Core.Configuration.Models.Validation
{
public class GlobalSettingsValidation : ConfigurationValidationBase, IValidateOptions<GlobalSettings>
public class GlobalSettingsValidator
: ConfigurationValidatorBase, IValidateOptions<GlobalSettings>
{
public ValidateOptionsResult Validate(string name, GlobalSettings options)
{

View File

@@ -2,7 +2,7 @@
namespace Umbraco.Core.Configuration.Models.Validation
{
public class HostingSettingsValidation : ConfigurationValidationBase, IValidateOptions<HostingSettings>
public class HostingSettingsValidator : ConfigurationValidatorBase, IValidateOptions<HostingSettings>
{
public ValidateOptionsResult Validate(string name, HostingSettings options)
{

View File

@@ -2,7 +2,7 @@
namespace Umbraco.Core.Configuration.Models.Validation
{
public class ModelsBuilderSettingsValidation : ConfigurationValidationBase, IValidateOptions<ModelsBuilderSettings>
public class ModelsBuilderSettingsValidator : ConfigurationValidatorBase, IValidateOptions<ModelsBuilderSettings>
{
public ValidateOptionsResult Validate(string name, ModelsBuilderSettings options)
{

View File

@@ -2,7 +2,7 @@
namespace Umbraco.Core.Configuration.Models.Validation
{
public class RequestHandlerSettingsValidation : ConfigurationValidationBase, IValidateOptions<RequestHandlerSettings>
public class RequestHandlerSettingsValidator : ConfigurationValidatorBase, IValidateOptions<RequestHandlerSettings>
{
public ValidateOptionsResult Validate(string name, RequestHandlerSettings options)
{

View File

@@ -0,0 +1,65 @@
using System;
using Umbraco.Core.Configuration.Models;
namespace Umbraco.Tests.Common.Builders
{
public class ContentErrorPageBuilder : ContentErrorPageBuilder<object>
{
public ContentErrorPageBuilder() : base(null)
{
}
}
public class ContentErrorPageBuilder<TParent>
: ChildBuilderBase<TParent, ContentErrorPage>
{
private int? _contentId;
private Guid? _contentKey;
private string _contentXPath;
private string _culture;
public ContentErrorPageBuilder(TParent parentBuilder) : base(parentBuilder)
{
}
public ContentErrorPageBuilder<TParent> WithContentId(int contentId)
{
_contentId = contentId;
return this;
}
public ContentErrorPageBuilder<TParent> WithContentKey(Guid contentKey)
{
_contentKey = contentKey;
return this;
}
public ContentErrorPageBuilder<TParent> WithContentXPath(string contentXPath)
{
_contentXPath = contentXPath;
return this;
}
public ContentErrorPageBuilder<TParent> WithCulture(string culture)
{
_culture = culture;
return this;
}
public override ContentErrorPage Build()
{
var contentId = _contentId ?? 0;
var contentKey = _contentKey ?? Guid.Empty;
var contentXPath = _contentXPath ?? string.Empty;
var culture = _culture ?? "en-US";
return new ContentErrorPage
{
ContentId = contentId,
ContentKey = contentKey,
ContentXPath = contentXPath,
Culture = culture,
};
}
}
}

View File

@@ -0,0 +1,41 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Configuration.Models;
namespace Umbraco.Tests.Common.Builders
{
public class ContentImagingSettingsBuilder : ContentImagingSettingsBuilder<object>
{
public ContentImagingSettingsBuilder() : base(null)
{
}
}
public class ContentImagingSettingsBuilder<TParent>
: ChildBuilderBase<TParent, ContentImagingSettings>
{
private readonly List<ImagingAutoFillUploadFieldBuilder<ContentImagingSettingsBuilder<TParent>>> _imagingAutoFillUploadFieldBuilder = new List<ImagingAutoFillUploadFieldBuilder<ContentImagingSettingsBuilder<TParent>>>();
public ContentImagingSettingsBuilder(TParent parentBuilder) : base(parentBuilder)
{
}
public ImagingAutoFillUploadFieldBuilder<ContentImagingSettingsBuilder<TParent>> AddAutoFillImageProperty()
{
var builder = new ImagingAutoFillUploadFieldBuilder<ContentImagingSettingsBuilder<TParent>>(this);
_imagingAutoFillUploadFieldBuilder.Add(builder);
return builder;
}
public override ContentImagingSettings Build()
{
var imagingAutoFillUploadFields = _imagingAutoFillUploadFieldBuilder.Select(x => x.Build()).ToArray();
return new ContentImagingSettings
{
AutoFillImageProperties = imagingAutoFillUploadFields,
};
}
}
}

View File

@@ -1,12 +1,56 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Configuration.Models;
using Umbraco.Core.Macros;
namespace Umbraco.Tests.Common.Builders
{
public class ContentSettingsBuilder : BuilderBase<ContentSettings>
public class ContentSettingsBuilder : ContentSettingsBuilder<object>
{
public ContentSettingsBuilder() : base(null)
{
}
}
public class ContentSettingsBuilder<TParent> : ChildBuilderBase<TParent, ContentSettings>
{
private string _macroErrors;
private readonly ContentImagingSettingsBuilder<ContentSettingsBuilder<TParent>> _contentImagingSettingsBuilder;
private readonly List<ContentErrorPageBuilder<ContentSettingsBuilder<TParent>>> _contentErrorPageBuilders = new List<ContentErrorPageBuilder<ContentSettingsBuilder<TParent>>>();
public ContentSettingsBuilder(TParent parentBuilder) : base(parentBuilder)
{
_contentImagingSettingsBuilder = new ContentImagingSettingsBuilder<ContentSettingsBuilder<TParent>>(this);
_contentErrorPageBuilders = new List<ContentErrorPageBuilder<ContentSettingsBuilder<TParent>>>();
}
public ContentImagingSettingsBuilder<ContentSettingsBuilder<TParent>> AddImaging() => _contentImagingSettingsBuilder;
public ContentErrorPageBuilder<ContentSettingsBuilder<TParent>> AddErrorPage()
{
var builder = new ContentErrorPageBuilder<ContentSettingsBuilder<TParent>>(this);
_contentErrorPageBuilders.Add(builder);
return builder;
}
public ContentSettingsBuilder<TParent> WithMacroErrors(string macroErrors)
{
_macroErrors = macroErrors;
return this;
}
public override ContentSettings Build()
{
return new ContentSettings();
var macroErrors = _macroErrors ?? MacroErrorBehaviour.Inline.ToString();
var contentImagingSettings = _contentImagingSettingsBuilder.Build();
var contentErrorPages = _contentErrorPageBuilders.Select(x => x.Build()).ToArray();
return new ContentSettings
{
MacroErrors = _macroErrors,
Imaging = contentImagingSettings,
Error404Collection = contentErrorPages,
};
}
}
}

View File

@@ -199,9 +199,5 @@ namespace Umbraco.Tests.Common.Builders
NoNodesViewPath = noNodesViewPath,
};
}
private string _iconsPath;
public string IconsPath{ get; set; }
}
}

View File

@@ -27,6 +27,12 @@ namespace Umbraco.Tests.Common.Builders
return this;
}
public HostingSettingsBuilder WithLocalTempStorageLocation(string localTempStorageLocation)
{
_localTempStorageLocation = localTempStorageLocation;
return this;
}
public override HostingSettings Build()
{
var debug = _debug ?? false;

View File

@@ -0,0 +1,73 @@
using Umbraco.Core.Configuration.Models;
namespace Umbraco.Tests.Common.Builders
{
public class ImagingAutoFillUploadFieldBuilder : ImagingAutoFillUploadFieldBuilder<object>
{
public ImagingAutoFillUploadFieldBuilder() : base(null)
{
}
}
public class ImagingAutoFillUploadFieldBuilder<TParent>
: ChildBuilderBase<TParent, ImagingAutoFillUploadField>
{
private string _alias;
private string _widthFieldAlias;
private string _heightFieldAlias;
private string _lengthFieldAlias;
private string _extensionFieldAlias;
public ImagingAutoFillUploadFieldBuilder(TParent parentBuilder) : base(parentBuilder)
{
}
public ImagingAutoFillUploadFieldBuilder<TParent> WithAlias(string alias)
{
_alias = alias;
return this;
}
public ImagingAutoFillUploadFieldBuilder<TParent> WithWidthFieldAlias(string widthFieldAlias)
{
_widthFieldAlias = widthFieldAlias;
return this;
}
public ImagingAutoFillUploadFieldBuilder<TParent> WithHeightFieldAlias(string heightFieldAlias)
{
_heightFieldAlias = heightFieldAlias;
return this;
}
public ImagingAutoFillUploadFieldBuilder<TParent> WithLengthFieldAlias(string lengthFieldAlias)
{
_lengthFieldAlias = lengthFieldAlias;
return this;
}
public ImagingAutoFillUploadFieldBuilder<TParent> WithExtensionFieldAlias(string extensionFieldAlias)
{
_extensionFieldAlias = extensionFieldAlias;
return this;
}
public override ImagingAutoFillUploadField Build()
{
var alias = _alias ?? "testAlias";
var widthFieldAlias = _widthFieldAlias ?? "testWidthFieldAlias";
var heightFieldAlias = _heightFieldAlias ?? "testHeightFieldAlias";
var lengthFieldAlias = _lengthFieldAlias ?? "testLengthFieldAlias";
var extensionFieldAlias = _extensionFieldAlias ?? "testExtensionFieldAlias";
return new ImagingAutoFillUploadField
{
Alias = alias,
WidthFieldAlias = widthFieldAlias,
HeightFieldAlias = heightFieldAlias,
LengthFieldAlias = lengthFieldAlias,
ExtensionFieldAlias = extensionFieldAlias,
};
}
}
}

View File

@@ -0,0 +1,26 @@
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.Models;
namespace Umbraco.Tests.Common.Builders
{
public class ModelsBuilderSettingsBuilder : BuilderBase<ModelsBuilderSettings>
{
private string _modelsMode;
public ModelsBuilderSettingsBuilder WithModelsMode(string modelsMode)
{
_modelsMode = modelsMode;
return this;
}
public override ModelsBuilderSettings Build()
{
var modelsMode = _modelsMode ?? ModelsMode.Nothing.ToString();
return new ModelsBuilderSettings
{
ModelsMode = modelsMode,
};
}
}
}

View File

@@ -91,8 +91,6 @@ namespace Umbraco.Tests.Common.Builders
return this;
}
public UserBuilder<TParent> WithSessionTimeout(int sessionTimeout)
{
_sessionTimeout = sessionTimeout;
@@ -122,6 +120,13 @@ namespace Umbraco.Tests.Common.Builders
return this;
}
public UserGroupBuilder<UserBuilder<TParent>> AddUserGroup()
{
var builder = new UserGroupBuilder<UserBuilder<TParent>>(this);
_userGroupBuilders.Add(builder);
return builder;
}
public override User Build()
{
var id = _id ?? 0;
@@ -175,20 +180,9 @@ namespace Umbraco.Tests.Common.Builders
result.AddGroup(readOnlyUserGroup.ToReadOnlyGroup());
}
return result;
}
public UserGroupBuilder<UserBuilder<TParent>> AddUserGroup()
{
var builder = new UserGroupBuilder<UserBuilder<TParent>>(this);
_userGroupBuilders.Add(builder);
return builder;
}
int? IWithIdBuilder.Id
{
get => _id;

View File

@@ -0,0 +1,74 @@
using NUnit.Framework;
using Umbraco.Core.Configuration.Models;
using Umbraco.Core.Configuration.Models.Validation;
using Umbraco.Core.Macros;
using Umbraco.Tests.Common.Builders;
namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Validation
{
[TestFixture]
public class ContentSettingsValidationTests
{
[Test]
public void ReturnsSuccessResponseForValidConfiguration()
{
var validator = new ContentSettingsValidator();
var options = BuildContentSettings();
var result = validator.Validate("settings", options);
Assert.True(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidMacroErrorsField()
{
var validator = new ContentSettingsValidator();
var options = BuildContentSettings(macroErrors: "invalid");
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidError404CollectionDueToDuplicateId()
{
var validator = new ContentSettingsValidator();
var options = BuildContentSettings(contentXPath: "/aaa/bbb");
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidError404CollectionDueToEmptyCulture()
{
var validator = new ContentSettingsValidator();
var options = BuildContentSettings(culture: string.Empty);
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidAutoFillImagePropertiesCollection()
{
var validator = new ContentSettingsValidator();
var options = BuildContentSettings(culture: string.Empty);
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
private static ContentSettings BuildContentSettings(string macroErrors = "inline", string culture = "en-US", string contentXPath = "", string autoFillImagePropertyAlias = "testAlias")
{
return new ContentSettingsBuilder()
.WithMacroErrors(macroErrors)
.AddErrorPage()
.WithCulture(culture)
.WithContentId(1)
.WithContentXPath(contentXPath)
.Done()
.AddImaging()
.AddAutoFillImageProperty()
.WithAlias(autoFillImagePropertyAlias)
.Done()
.Done()
.Build();
}
}
}

View File

@@ -0,0 +1,38 @@
using NUnit.Framework;
using Umbraco.Core.Configuration.Models;
using Umbraco.Core.Configuration.Models.Validation;
using Umbraco.Tests.Common.Builders;
namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Validation
{
[TestFixture]
public class GlobalSettingsValidationTests
{
[Test]
public void ReturnsSuccessResponseForValidConfiguration()
{
var validator = new GlobalSettingsValidator();
var options = BuildGlobalSettings("test@test.com");
var result = validator.Validate("settings", options);
Assert.True(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidSmtpFromField()
{
var validator = new GlobalSettingsValidator();
var options = BuildGlobalSettings("invalid");
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
private static GlobalSettings BuildGlobalSettings(string smtpEmail)
{
return new GlobalSettingsBuilder()
.AddSmtpSettings()
.WithFrom(smtpEmail)
.Done()
.Build();
}
}
}

View File

@@ -0,0 +1,28 @@
using NUnit.Framework;
using Umbraco.Core.Configuration.Models.Validation;
using Umbraco.Tests.Common.Builders;
namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Validation
{
[TestFixture]
public class HostingSettingsValidatorTests
{
[Test]
public void ReturnsSuccessResponseForValidConfiguration()
{
var validator = new HostingSettingsValidator();
var options = new HostingSettingsBuilder().Build();
var result = validator.Validate("settings", options);
Assert.True(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidLocalTempStorageLocationField()
{
var validator = new HostingSettingsValidator();
var options = new HostingSettingsBuilder().WithLocalTempStorageLocation("invalid").Build();
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
}
}

View File

@@ -0,0 +1,28 @@
using NUnit.Framework;
using Umbraco.Core.Configuration.Models.Validation;
using Umbraco.Tests.Common.Builders;
namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Validation
{
[TestFixture]
public class ModelsBuilderSettingsValidatorTests
{
[Test]
public void ReturnsSuccessResponseForValidConfiguration()
{
var validator = new ModelsBuilderSettingsValidator();
var options = new ModelsBuilderSettingsBuilder().Build();
var result = validator.Validate("settings", options);
Assert.True(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidModelsModeField()
{
var validator = new ModelsBuilderSettingsValidator();
var options = new ModelsBuilderSettingsBuilder().WithModelsMode("invalid").Build();
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
}
}

View File

@@ -0,0 +1,28 @@
using NUnit.Framework;
using Umbraco.Core.Configuration.Models.Validation;
using Umbraco.Tests.Common.Builders;
namespace Umbraco.Tests.UnitTests.Umbraco.Core.Configuration.Models.Validation
{
[TestFixture]
public class RequestHandlerSettingsValidatorTests
{
[Test]
public void ReturnsSuccessResponseForValidConfiguration()
{
var validator = new RequestHandlerSettingsValidator();
var options = new RequestHandlerSettingsBuilder().Build();
var result = validator.Validate("settings", options);
Assert.True(result.Succeeded);
}
[Test]
public void ReturnsFailResponseForConfigurationWithInvalidConvertUrlsToAsciiField()
{
var validator = new RequestHandlerSettingsValidator();
var options = new RequestHandlerSettingsBuilder().WithConvertUrlsToAscii("invalid").Build();
var result = validator.Validate("settings", options);
Assert.False(result.Succeeded);
}
}
}

View File

@@ -24,7 +24,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Tests.Common.Builders
// Assert
Assert.AreEqual(debugMode, hostingSettings.Debug);
Assert.AreEqual(localTempStorageLocation, hostingSettings.LocalTempStorageLocation);
Assert.AreEqual(localTempStorageLocation, hostingSettings.LocalTempStorageLocationValue);
}
}
}

View File

@@ -127,11 +127,11 @@ namespace Umbraco.Extensions
{
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
services.AddSingleton<IValidateOptions<ContentSettings>, ContentSettingsValidation>();
services.AddSingleton<IValidateOptions<GlobalSettings>, GlobalSettingsValidation>();
services.AddSingleton<IValidateOptions<HostingSettings>, HostingSettingsValidation>();
services.AddSingleton<IValidateOptions<ModelsBuilderSettings>, ModelsBuilderSettingsValidation>();
services.AddSingleton<IValidateOptions<RequestHandlerSettings>, RequestHandlerSettingsValidation>();
services.AddSingleton<IValidateOptions<ContentSettings>, ContentSettingsValidator>();
services.AddSingleton<IValidateOptions<GlobalSettings>, GlobalSettingsValidator>();
services.AddSingleton<IValidateOptions<HostingSettings>, HostingSettingsValidator>();
services.AddSingleton<IValidateOptions<ModelsBuilderSettings>, ModelsBuilderSettingsValidator>();
services.AddSingleton<IValidateOptions<RequestHandlerSettings>, RequestHandlerSettingsValidator>();
services.Configure<ActiveDirectorySettings>(configuration.GetSection(Constants.Configuration.ConfigPrefix + "ActiveDirectory"));
services.Configure<ConnectionStrings>(configuration.GetSection("ConnectionStrings"), o => o.BindNonPublicProperties = true);