using System; using System.Collections.Generic; using System.IO; using System.IO.Abstractions; using System.Linq; using System.Text; using FluentAssertions; using NSubstitute; using NUnit.Framework; using TestLibrary; using Trash.Config; using Trash.Extensions; using Trash.Sonarr; using Trash.Sonarr.ReleaseProfile; using YamlDotNet.Serialization.ObjectFactories; namespace Trash.Tests.Config { [TestFixture] public class ConfigurationLoaderTest { private TextReader GetResourceData(string file) { var testData = new TestData(); if (testData == null) { throw new InvalidOperationException("TestData object has not been created yet"); } return new StringReader(testData.GetResourceData(file)); } [Test] public void Load_UsingStream_CorrectParsing() { var configLoader = new ConfigurationLoader( Substitute.For>(), Substitute.For(), new DefaultObjectFactory()); var configs = configLoader.LoadFromStream(GetResourceData("Load_UsingStream_CorrectParsing.yml"), "sonarr"); configs.Should() .BeEquivalentTo(new List { new() { ApiKey = "95283e6b156c42f3af8a9b16173f876b", BaseUrl = "http://localhost:8989", ReleaseProfiles = new List { new() { Type = ReleaseProfileType.Anime, StrictNegativeScores = true, Tags = new List {"anime"} }, new() { Type = ReleaseProfileType.Series, StrictNegativeScores = false, Tags = new List { "tv", "series" } } } } }); } [Test] public void LoadMany_CorrectNumberOfIterations() { StreamReader MockYaml(params object[] args) { var str = new StringBuilder("sonarr:"); const string templateYaml = "\n - base_url: {0}"; str.Append(args.Aggregate("", (current, p) => current + templateYaml.FormatWith(p))); return StreamBuilder.FromString(str.ToString()); } var fs = Substitute.For(); fs.File.OpenText(Arg.Any()) .Returns(MockYaml(1, 2), MockYaml(3)); var provider = Substitute.For>(); // var objectFactory = Substitute.For(); // objectFactory.Create(Arg.Any()) // .Returns(t => Substitute.For(new[] {(Type)t[0]}, Array.Empty())); var actualActiveConfigs = new List(); provider.ActiveConfiguration = Arg.Do(a => actualActiveConfigs.Add(a)); var loader = new ConfigurationLoader(provider, fs, new DefaultObjectFactory()); var fakeFiles = new List { "config1.yml", "config2.yml" }; var expected = new List { new() {BaseUrl = "1"}, new() {BaseUrl = "2"}, new() {BaseUrl = "3"} }; var actual = loader.LoadMany(fakeFiles, "sonarr").ToList(); actual.Should().BeEquivalentTo(expected); actualActiveConfigs.Should().BeEquivalentTo(expected); } } }