Files
Omika/tests/Omika.Diagnostics.Tests/DiagnosticApiKeyGeneratorTests.cs
T
2026-10-23 18:46:50 +02:00

86 lines
2.7 KiB
C#

using Omika.Diagnostics.Security;
namespace Omika.Diagnostics.Tests;
/// <summary>Tests de la génération/hachage de la clé d'accès serveur client (T19, §27-§32).</summary>
public class DiagnosticApiKeyGeneratorTests
{
[Fact]
public void GenerateKey_HasPrefix_AndDecodesTo32Bytes()
{
string key = DiagnosticApiKeyGenerator.GenerateKey();
Assert.StartsWith(DiagnosticApiKeyGenerator.KeyPrefix, key);
string base64Url = key[DiagnosticApiKeyGenerator.KeyPrefix.Length..];
byte[] bytes = DecodeBase64Url(base64Url);
Assert.Equal(DiagnosticApiKeyGenerator.KeyBytes, bytes.Length);
}
[Fact]
public void GenerateKey_ProducesUniqueKeys()
{
HashSet<string> keys = Enumerable.Range(0, 100).Select(_ => DiagnosticApiKeyGenerator.GenerateKey()).ToHashSet();
Assert.Equal(100, keys.Count);
}
[Fact]
public void Hash_IsDeterministic_And64HexChars()
{
string hash1 = DiagnosticApiKeyGenerator.Hash("omkdiag_test");
string hash2 = DiagnosticApiKeyGenerator.Hash("omkdiag_test");
Assert.Equal(hash1, hash2);
Assert.Equal(64, hash1.Length);
Assert.Matches("^[0-9A-F]{64}$", hash1);
}
[Fact]
public void Verify_ReturnsTrue_ForMatchingKey()
{
string key = DiagnosticApiKeyGenerator.GenerateKey();
string hash = DiagnosticApiKeyGenerator.Hash(key);
Assert.True(DiagnosticApiKeyGenerator.Verify(key, hash));
}
[Fact]
public void Verify_ReturnsFalse_ForWrongKey()
{
string hash = DiagnosticApiKeyGenerator.Hash("omkdiag_real_key");
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_other_key", hash));
}
[Fact]
public void Verify_ReturnsFalse_ForMalformedHash()
{
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_x", "not-a-hex-hash"));
}
[Fact]
public void Verify_ReturnsFalse_ForEmptyInputs()
{
Assert.False(DiagnosticApiKeyGenerator.Verify("", "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"));
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_x", ""));
}
[Fact]
public void DisplayPrefix_ReturnsFirst8Chars()
{
string prefix = DiagnosticApiKeyGenerator.DisplayPrefix("omkdiag_abcdefgh", 8);
Assert.Equal("omkdiag_", prefix);
Assert.Equal(8, prefix.Length);
}
private static byte[] DecodeBase64Url(string value)
{
string base64 = value.Replace('-', '+').Replace('_', '/');
switch (base64.Length % 4)
{
case 2: base64 += "=="; break;
case 3: base64 += "="; break;
}
return Convert.FromBase64String(base64);
}
}