feat: initial cli implementation

This commit is contained in:
Stevan Freeborn
2026-04-17 15:28:59 -05:00
parent ab57ac5a13
commit ba927c0e18
41 changed files with 1124 additions and 17 deletions
@@ -1,4 +1,3 @@
using System.Security.Cryptography;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Configuration;
@@ -1,4 +1,3 @@
using System.Security.Cryptography;
using System.Text.Json.Serialization;
using Microsoft.Extensions.Configuration;
@@ -13,8 +13,12 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
<PackageReference Include="coverlet.msbuild" Version="8.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
@@ -23,6 +27,18 @@
</PackageReference>
</ItemGroup>
<PropertyGroup>
<CollectCoverage>true</CollectCoverage>
<CoverletOutput>./TestResults/Coverage/</CoverletOutput>
<CoverletOutputFormat>cobertura</CoverletOutputFormat>
<Include>[StevanFreeborn.Extensions.Configuration.Secure]*</Include>
<ExcludeByFile>**/Program.cs</ExcludeByFile>
</PropertyGroup>
<Target Name="GenerateHtmlCoverageReport" AfterTargets="GenerateCoverageResultAfterTest">
<Exec Command="reportgenerator -reports:./TestResults/Coverage/*.xml -targetdir:./TestResults/Coverage/Report/ -reporttypes:Html_Dark" />
</Target>
<ItemGroup>
<Using Include="Xunit" />
<Using Include="AwesomeAssertions" />
@@ -84,8 +84,7 @@ public class SecureConfigBuilderTests
{
var act = () => _sut.UseJsonFileStorage((Action<JsonStorageOptions>)null!);
act.Should().Throw<ArgumentNullException>()
.WithParameterName("configure");
act.Should().Throw<ArgumentNullException>().WithParameterName("configure");
}
[Fact]
@@ -104,8 +103,7 @@ public class SecureConfigBuilderTests
{
var act = () => _sut.AddJsonAotContext(null!);
act.Should().Throw<ArgumentNullException>()
.WithParameterName("context");
act.Should().Throw<ArgumentNullException>().WithParameterName("context");
}
[Fact]
@@ -24,8 +24,7 @@ public class SecureConfigSourceTests
loggerFactory: _mockLoggerFactory.Object
);
act.Should().Throw<ArgumentNullException>()
.WithParameterName("storageProvider");
act.Should().Throw<ArgumentNullException>().WithParameterName("storageProvider");
}
[Fact]
@@ -37,8 +36,7 @@ public class SecureConfigSourceTests
loggerFactory: _mockLoggerFactory.Object
);
act.Should().Throw<ArgumentNullException>()
.WithParameterName("cryptoProvider");
act.Should().Throw<ArgumentNullException>().WithParameterName("cryptoProvider");
}
[Fact]
@@ -50,8 +48,7 @@ public class SecureConfigSourceTests
loggerFactory: null!
);
act.Should().Throw<ArgumentNullException>()
.WithParameterName("loggerFactory");
act.Should().Throw<ArgumentNullException>().WithParameterName("loggerFactory");
}
[Fact]
@@ -87,6 +84,7 @@ public class SecureConfigSourceTests
public void Build_WhenCalled_ItShouldCreateLoggerFromFactory()
{
var mockLogger = new Mock<ILogger<SecureConfigProvider>>();
_mockLoggerFactory
.Setup(f => f.CreateLogger(typeof(SecureConfigProvider).FullName!))
.Returns(mockLogger.Object);
@@ -1,4 +1,3 @@
using System.Runtime.CompilerServices;
using System.Text.Json;
using System.Text.Json.Serialization;