refactor(config): base_url and api_key are required

recyclarr
Robert Dailey 4 years ago
parent 070a961ed0
commit 12ff259c09

@ -69,10 +69,10 @@ namespace Trash.Tests.Config
[Test] [Test]
public void LoadMany_CorrectNumberOfIterations() public void LoadMany_CorrectNumberOfIterations()
{ {
StreamReader MockYaml(params object[] args) static StreamReader MockYaml(params object[] args)
{ {
var str = new StringBuilder("sonarr:"); var str = new StringBuilder("sonarr:");
const string templateYaml = "\n - base_url: {0}"; const string templateYaml = "\n - base_url: {0}\n api_key: abc";
str.Append(args.Aggregate("", (current, p) => current + templateYaml.FormatWith(p))); str.Append(args.Aggregate("", (current, p) => current + templateYaml.FormatWith(p)));
return StreamBuilder.FromString(str.ToString()); return StreamBuilder.FromString(str.ToString());
} }
@ -99,9 +99,9 @@ namespace Trash.Tests.Config
var expected = new List<SonarrConfiguration> var expected = new List<SonarrConfiguration>
{ {
new() {BaseUrl = "1"}, new() {ApiKey = "abc", BaseUrl = "1"},
new() {BaseUrl = "2"}, new() {ApiKey = "abc", BaseUrl = "2"},
new() {BaseUrl = "3"} new() {ApiKey = "abc", BaseUrl = "3"}
}; };
var actual = loader.LoadMany(fakeFiles, "sonarr").ToList(); var actual = loader.LoadMany(fakeFiles, "sonarr").ToList();

@ -0,0 +1,66 @@
using System;
using System.IO;
using System.IO.Abstractions;
using FluentAssertions;
using JetBrains.Annotations;
using NSubstitute;
using NUnit.Framework;
using Trash.Config;
using YamlDotNet.Core;
using YamlDotNet.Serialization.ObjectFactories;
namespace Trash.Tests.Config
{
[TestFixture]
[Parallelizable(ParallelScope.All)]
public class ServiceConfigurationTest
{
// This test class must be public otherwise it cannot be deserialized by YamlDotNet
[UsedImplicitly]
public class TestServiceConfiguration : ServiceConfiguration
{
public const string ServiceName = "test_service";
public override string BuildUrl()
{
throw new NotImplementedException();
}
}
[Test]
public void Deserialize_BaseUrlMissing_Throw()
{
const string yaml = @"
test_service:
- api_key: b
";
var loader = new ConfigurationLoader<TestServiceConfiguration>(
Substitute.For<IConfigurationProvider<TestServiceConfiguration>>(),
Substitute.For<IFileSystem>(),
new DefaultObjectFactory());
Action act = () => loader.LoadFromStream(new StringReader(yaml), TestServiceConfiguration.ServiceName);
act.Should().Throw<YamlException>()
.WithMessage("*Property 'base_url' is required");
}
[Test]
public void Deserialize_ApiKeyMissing_Throw()
{
const string yaml = @"
test_service:
- base_url: a
";
var loader = new ConfigurationLoader<TestServiceConfiguration>(
Substitute.For<IConfigurationProvider<TestServiceConfiguration>>(),
Substitute.For<IFileSystem>(),
new DefaultObjectFactory());
Action act = () => loader.LoadFromStream(new StringReader(yaml), TestServiceConfiguration.ServiceName);
act.Should().Throw<YamlException>()
.WithMessage("*Property 'api_key' is required");
}
}
}

@ -1,8 +1,13 @@
namespace Trash.Config using System.ComponentModel.DataAnnotations;
namespace Trash.Config
{ {
public abstract class ServiceConfiguration public abstract class ServiceConfiguration
{ {
[Required(ErrorMessage = "Property 'base_url' is required")]
public string BaseUrl { get; init; } = ""; public string BaseUrl { get; init; } = "";
[Required(ErrorMessage = "Property 'api_key' is required")]
public string ApiKey { get; init; } = ""; public string ApiKey { get; init; } = "";
public abstract string BuildUrl(); public abstract string BuildUrl();

Loading…
Cancel
Save