tests: add mucho tests

This commit is contained in:
Stevan Freeborn
2026-02-06 06:53:20 -06:00
parent b2086d8185
commit 5b1a5f003e
26 changed files with 1983 additions and 18 deletions
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>FiscalOS.Core.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AwesomeAssertions" />
<PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" />
<PackageReference Include="Moq" />
<PackageReference Include="xunit.v3.mtp-v2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\FiscalOS.Core\FiscalOS.Core.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,36 @@
namespace FiscalOS.Core.Tests.Unit;
public class EncryptedDataKeyTests
{
[Fact]
public void From_WhenCalled_ItShouldReturnAnInstance()
{
var keyId = "key-id";
var encryptedKey = "encrypted-key";
var encryptedDataKey = EncryptedDataKey.From(keyId, encryptedKey);
encryptedDataKey.KeyIdUsed.Should().Be(keyId);
encryptedDataKey.EncryptedKey.Should().Be(encryptedKey);
}
[Fact]
public void From_WhenCalledWithNullKeyId_ItShouldThrowArgumentNullException()
{
var encryptedKey = "encrypted-key";
var creatingDataKeyWithNullKeyId = () => EncryptedDataKey.From(null!, encryptedKey);
creatingDataKeyWithNullKeyId.Should().Throw<ArgumentNullException>();
}
[Fact]
public void From_WhenCalledWithNullEncryptedKey_ItShouldThrowArgumentNullException()
{
var keyId = "key-id";
var creatingDataKeyWithNullEncryptedKey = () => EncryptedDataKey.From(keyId, null!);
creatingDataKeyWithNullEncryptedKey.Should().Throw<ArgumentNullException>();
}
}
@@ -0,0 +1,36 @@
namespace FiscalOS.Core.Tests.Unit;
public class KeyRingEntryTests
{
[Fact]
public void From_WhenCalled_ItShouldReturnAnInstance()
{
var keyId = "test-key-id";
var key = "key";
var keyRingEntry = KeyRingEntry.From(keyId, key);
keyRingEntry.KeyId.Should().Be(keyId);
keyRingEntry.Key.Should().Be(key);
}
[Fact]
public void From_WhenCalledWithNullKeyId_ItShouldThrowArgumentNullException()
{
var key = "key";
var createEntryWithNullKeyId = () => KeyRingEntry.From(null!, key);
createEntryWithNullKeyId.Should().Throw<ArgumentNullException>();
}
[Fact]
public void From_WhenCalledWithNullKey_ItShouldThrowArgumentNullException()
{
var keyId = "test-key-id";
var createEntryWithNullKey = () => KeyRingEntry.From(keyId, null!);
createEntryWithNullKey.Should().Throw<ArgumentNullException>();
}
}
@@ -0,0 +1,82 @@
namespace FiscalOS.Core.Tests.Unit;
public class RefreshTokenTests
{
[Fact]
public void From_WhenCalledWithUserId_ItShouldReturnARefreshTokenInstance()
{
var userId = Guid.NewGuid();
var token = "token";
var expiresAt = DateTime.UtcNow.AddDays(7);
var refreshToken = RefreshToken.From(userId, token, expiresAt);
refreshToken.UserId.Should().Be(userId);
refreshToken.User.Should().BeNull();
refreshToken.Token.Should().Be(token);
refreshToken.ExpiresAt.Should().Be(expiresAt);
refreshToken.Revoked.Should().BeFalse();
}
[Fact]
public void From_WhenCalledWithUser_ItShouldReturnARefreshTokenInstance()
{
var user = User.From(
"testuser",
"hashedpassword",
EncryptedDataKey.From("keyId", "encryptedKey")
);
var token = "token";
var expiresAt = DateTime.UtcNow.AddDays(7);
var refreshToken = RefreshToken.From(user, token, expiresAt);
refreshToken.UserId.Should().Be(user.Id);
refreshToken.User.Should().Be(user);
refreshToken.Token.Should().Be(token);
refreshToken.ExpiresAt.Should().Be(expiresAt);
refreshToken.Revoked.Should().BeFalse();
}
[Fact]
public void From_WhenCalledWithNullUser_ItShouldThrowArgumentNullException()
{
var token = "token";
var expiresAt = DateTime.UtcNow.AddDays(7);
var createRefreshTokenWithNullUser = () => RefreshToken.From(null!, token, expiresAt);
createRefreshTokenWithNullUser.Should().Throw<ArgumentNullException>();
}
[Fact]
public void Revoke_WhenCalled_ItShouldSetRevokedToTrue()
{
var refreshToken = RefreshToken.From(Guid.NewGuid(), "token", DateTime.UtcNow.AddDays(7));
refreshToken.Revoke();
refreshToken.Revoked.Should().BeTrue();
}
[Fact]
public void IsExpired_WhenCalledOnExpiredToken_ItShouldReturnTrue()
{
var refreshToken = RefreshToken.From(Guid.NewGuid(), "token", DateTime.UtcNow.AddDays(-1));
var isExpired = refreshToken.IsExpired(DateTimeOffset.UtcNow);
isExpired.Should().BeTrue();
}
[Fact]
public void IsExpired_WhenCalledOnNonExpiredToken_ItShouldReturnFalse()
{
var refreshToken = RefreshToken.From(Guid.NewGuid(), "token", DateTime.UtcNow.AddDays(1));
var isExpired = refreshToken.IsExpired(DateTimeOffset.UtcNow);
isExpired.Should().BeFalse();
}
}
@@ -0,0 +1,90 @@
namespace FiscalOS.Core.Tests.Unit;
public class UserTests
{
[Fact]
public void New_WhenCalled_ItShouldReturnNewUserInstance()
{
var user = User.New();
user.Should().NotBeNull();
user.Username.Should().BeEmpty();
user.HashedPassword.Should().BeEmpty();
user.EncryptionKeyId.Should().BeEmpty();
user.EncryptedDataKey.Should().BeEmpty();
user.RefreshTokens.Should().BeEmpty();
}
[Fact]
public void From_WhenCalledWithValidParameters_ItShouldReturnUserInstance()
{
var encryptedDataKey = EncryptedDataKey.From("keyId", "encryptedKey");
var user = User.From("testuser", "hashedpassword", encryptedDataKey);
user.Should().NotBeNull();
user.Username.Should().Be("testuser");
user.HashedPassword.Should().Be("hashedpassword");
user.EncryptionKeyId.Should().Be("keyId");
user.EncryptedDataKey.Should().Be("encryptedKey");
user.RefreshTokens.Should().BeEmpty();
}
[Fact]
public void From_WhenCalledWithNullParameters_ItShouldThrowArgumentNullException()
{
var encryptedDataKey = EncryptedDataKey.From("keyId", "encryptedKey");
var creatingUserWithNullUsername = () => User.From(null!, "hashedpassword", encryptedDataKey);
creatingUserWithNullUsername.Should().Throw<ArgumentNullException>();
var creatingUserWithNullHashedPassword = () => User.From("testuser", null!, encryptedDataKey);
creatingUserWithNullHashedPassword.Should().Throw<ArgumentNullException>();
var creatingUserWithNullDataKey = () => User.From("testuser", "hashedpassword", null!);
creatingUserWithNullDataKey.Should().Throw<ArgumentNullException>();
}
[Fact]
public void AddRefreshToken_WhenCalled_ItShouldAddRefreshTokenToUser()
{
var encryptedDataKey = EncryptedDataKey.From("keyId", "encryptedKey");
var user = User.From("testuser", "hashedpassword", encryptedDataKey);
var refreshToken = RefreshToken.From(user.Id, "tokenvalue", DateTimeOffset.UtcNow.AddDays(7));
user.AddRefreshToken(refreshToken);
user.RefreshTokens.Should().ContainSingle().Which.Should().Be(refreshToken);
}
[Fact]
public void AddRefreshToken_WhenCalledWithNull_ItShouldThrowArgumentNullException()
{
var user = User.New();
var addingNullRefreshToken = () => user.AddRefreshToken(null!);
addingNullRefreshToken.Should().Throw<ArgumentNullException>();
}
[Fact]
public void SetCreatedAt_WhenCalled_ItShouldSetCreatedAtProperty()
{
var user = User.New();
var createdAt = DateTimeOffset.UtcNow;
user.SetCreatedAt(createdAt);
user.CreatedAt.Should().Be(createdAt);
}
[Fact]
public void SetUpdatedAt_WhenCalled_ItShouldSetUpdatedAtProperty()
{
var user = User.New();
var updatedAt = DateTimeOffset.UtcNow;
user.SetUpdatedAt(updatedAt);
user.UpdatedAt.Should().Be(updatedAt);
}
}
+2
View File
@@ -0,0 +1,2 @@
global using FiscalOS.Core.Identity;
global using FiscalOS.Core.Security;
@@ -0,0 +1,3 @@
{
"$schema": "https://xunit.net/schema/current/xunit.runner.schema.json"
}