feat: implement secure config and machine id key generator
This commit is contained in:
+1
@@ -11,6 +11,7 @@
|
||||
<PackageReference Include="AwesomeAssertions" Version="9.4.0" />
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="Moq" Version="4.20.72" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4" />
|
||||
</ItemGroup>
|
||||
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
using Moq;
|
||||
|
||||
using StevanFreeborn.Extensions.Configuration.Secure.Configuration;
|
||||
using StevanFreeborn.Extensions.Configuration.Secure.Cryptography;
|
||||
using StevanFreeborn.Extensions.Configuration.Secure.Storage;
|
||||
|
||||
using System.Text.Json;
|
||||
|
||||
namespace StevanFreeborn.Extensions.Configuration.Secure.Tests.Unit.Configuration;
|
||||
|
||||
public class SecureConfigTests
|
||||
{
|
||||
private readonly Mock<ICryptoProvider> _mockCryptoProvider = new();
|
||||
private readonly Mock<ISecureStorageProvider> _mockStorageProvider = new();
|
||||
private readonly SecureConfig _sut;
|
||||
|
||||
public SecureConfigTests()
|
||||
{
|
||||
_sut = new(_mockStorageProvider.Object, _mockCryptoProvider.Object);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalledWithNullStorageProvider_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var act = () => new SecureConfig(null!, _mockCryptoProvider.Object);
|
||||
|
||||
act.Should().Throw<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalledWithNullCryptoProvider_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var act = () => new SecureConfig(_mockStorageProvider.Object, null!);
|
||||
|
||||
act.Should().Throw<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SetAsync_WhenCalledWithNullKey_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var act = async () => await _sut.SetAsync(null!, string.Empty);
|
||||
|
||||
await act.Should().ThrowAsync<ArgumentNullException>();
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public async Task SetAsync_WhenCalledWithNullValue_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var act = async () => await _sut.SetAsync<string>("Key", null!);
|
||||
|
||||
await act.Should().ThrowAsync<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SetAsync_WhenCalled_ItShouldSerializeGivenValueAndEncryptIt()
|
||||
{
|
||||
var key = "Database";
|
||||
var config = new DummyConfig("localhost", 9999);
|
||||
var encryptedString = "encryptedString";
|
||||
var json = JsonSerializer.Serialize(config);
|
||||
|
||||
_mockCryptoProvider.Setup(m => m.Encrypt(json)).Returns(encryptedString);
|
||||
|
||||
await _sut.SetAsync(key, config);
|
||||
|
||||
_mockStorageProvider.Verify(m => m.WriteAsync(key, encryptedString), Times.Once());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetAsync_WhenCalledWithNullKey_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var act = async () => await _sut.GetAsync<DummyConfig>(null!);
|
||||
|
||||
await act.Should().ThrowAsync<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetAsync_WhenKeyExists_ItShouldReadDecryptAndDeserializeTheValue()
|
||||
{
|
||||
var key = "Database";
|
||||
var expectedConfig = new DummyConfig("localhost", 9999);
|
||||
var encryptedString = "encryptedString";
|
||||
var json = JsonSerializer.Serialize(expectedConfig);
|
||||
|
||||
_mockStorageProvider.Setup(m => m.ReadAsync(key)).ReturnsAsync(encryptedString);
|
||||
_mockCryptoProvider.Setup(m => m.Decrypt(encryptedString)).Returns(json);
|
||||
|
||||
var result = await _sut.GetAsync<DummyConfig>(key);
|
||||
|
||||
result.Should().BeEquivalentTo(expectedConfig);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetAsync_WhenKeyDoesNotExist_ItShouldReturnDefaultValue()
|
||||
{
|
||||
var key = "Database";
|
||||
var expectedConfig = new DummyConfig("localhost", 9999);
|
||||
var json = JsonSerializer.Serialize(expectedConfig);
|
||||
|
||||
_mockStorageProvider.Setup(m => m.ReadAsync(key)).ReturnsAsync(string.Empty);
|
||||
|
||||
var result = await _sut.GetAsync<DummyConfig>(key);
|
||||
|
||||
result.Should().BeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task DeleteAsync_WhenCalled_ItShouldRemoveValue()
|
||||
{
|
||||
var key = "Database";
|
||||
|
||||
_mockStorageProvider.Setup(m => m.DeleteAsync(key)).ReturnsAsync(true);
|
||||
|
||||
var result = await _sut.DeleteAsync(key);
|
||||
|
||||
result.Should().BeTrue();
|
||||
_mockStorageProvider.Verify(m => m.DeleteAsync(key), Times.Once());
|
||||
}
|
||||
|
||||
private sealed record DummyConfig(string Host, int Port);
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using Moq;
|
||||
|
||||
using StevanFreeborn.Extensions.Configuration.Secure.Cryptography;
|
||||
|
||||
namespace StevanFreeborn.Extensions.Configuration.Secure.Tests.Unit.Cryptography;
|
||||
|
||||
public class MachineIdKeyGeneratorTests
|
||||
{
|
||||
private readonly Mock<ILogger<MachineIdKeyGenerator>> _mockLogger = new();
|
||||
private readonly MachineIdKeyGenerator _sut;
|
||||
|
||||
public MachineIdKeyGeneratorTests()
|
||||
{
|
||||
_sut = new(_mockLogger.Object);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetId_WhenCalled_ItShouldReturnNonEmptyString()
|
||||
{
|
||||
_sut.GetId().Should().NotBeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetId_WhenCalledMultipleTimes_ItShouldReturnConsistentId()
|
||||
{
|
||||
var resultOne = _sut.GetId();
|
||||
var resultTwo = _sut.GetId();
|
||||
|
||||
resultTwo.Should().Be(resultOne);
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
namespace StevanFreeborn.Extensions.Configuration.Secure.Tests.Unit.Cryptography;
|
||||
|
||||
public class MachineIdKeyProviderTests
|
||||
{
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user