using System.IO.Abstractions; using Recyclarr.Config; using Recyclarr.Config.Parsing; using Recyclarr.TrashGuide; namespace Recyclarr.IntegrationTests; [TestFixture] public class ConfigurationLoaderSecretsTest : IntegrationTestFixture { [Test] public void Test_secret_loading() { var configLoader = Resolve(); const string testYml = """ sonarr: instance1: api_key: !secret api_key base_url: !secret 123GARBAGE_ custom_formats: - trash_ids: - !secret secret_rp """; const string secretsYml = """ api_key: 95283e6b156c42f3af8a9b16173f876b 123GARBAGE_: 'https://radarr:7878' secret_rp: 1234567 """; Fs.AddFile( Paths.AppDataDirectory.File("secrets.yml").FullName, new MockFileData(secretsYml) ); var expected = new[] { new { InstanceName = "instance1", ApiKey = "95283e6b156c42f3af8a9b16173f876b", BaseUrl = new Uri("https://radarr:7878"), CustomFormats = new[] { new { TrashIds = new[] { "1234567" } } }, }, }; configLoader .Load(() => new StringReader(testYml)) .GetConfigsOfType(SupportedServices.Sonarr) .Should() .BeEquivalentTo(expected); } [Test] public void Throw_when_referencing_invalid_secret() { var configLoader = Resolve(); const string testYml = """ sonarr: instance2: api_key: !secret api_key base_url: fake_url """; const string secretsYml = "no_api_key: 95283e6b156c42f3af8a9b16173f876b"; Fs.AddFile( Paths.AppDataDirectory.File("recyclarr.yml").FullName, new MockFileData(secretsYml) ); configLoader .Load(() => new StringReader(testYml)) .GetConfigsOfType(SupportedServices.Sonarr) .Should() .BeEmpty(); } [Test] public void Throw_when_referencing_secret_without_secrets_file() { var configLoader = Resolve(); const string testYml = """ sonarr: instance3: api_key: !secret api_key base_url: fake_url """; configLoader .Load(() => new StringReader(testYml)) .GetConfigsOfType(SupportedServices.Sonarr) .Should() .BeEmpty(); } [Test] public void No_config_loaded_when_secret_value_is_not_scalar() { var configLoader = Resolve(); const string testYml = """ sonarr: instance4: api_key: !secret { property: value } base_url: fake_url """; configLoader .Load(() => new StringReader(testYml)) .GetConfigsOfType(SupportedServices.Sonarr) .Should() .BeEmpty(); } [Test] public void No_config_loaded_when_resolved_value_is_not_correct() { var configLoader = Resolve(); const string testYml = """ sonarr: instance5: api_key: fake_key base_url: fake_url custom_formats: !secret bogus_profile """; const string secretsYml = "bogus_profile: 95283e6b156c42f3af8a9b16173f876b"; Fs.AddFile( Paths.AppDataDirectory.File("recyclarr.yml").FullName, new MockFileData(secretsYml) ); configLoader .Load(() => new StringReader(testYml)) .GetConfigsOfType(SupportedServices.Sonarr) .Should() .BeEmpty(); } }