Files
2026-10-23 18:46:50 +02:00

63 lines
2.2 KiB
C#

using Omika.Core.Observability.External;
namespace Omika.Tests.Observability.External;
/// <summary>Garde-fous de cardinalité des métriques externes (§36/§37).</summary>
public class ExternalCardinalityTests
{
[Theory]
[InlineData("component")]
[InlineData("status_class")]
[InlineData("method")]
[InlineData("route_template")]
[InlineData("event_priority")]
[InlineData("level")]
[InlineData("result")]
public void MetricLabels_AllowLowCardinality(string key)
{
Assert.True(ExternalAttributePolicy.IsAllowedMetricLabel(key));
}
[Theory]
[InlineData("traceid")]
[InlineData("trace_id")]
[InlineData("sessionid")]
[InlineData("eventid")]
[InlineData("operationid")]
[InlineData("userid")]
[InlineData("clientid")]
[InlineData("collaborateurid")]
[InlineData("email")]
[InlineData("url")]
public void MetricLabels_RejectHighCardinality(string key)
{
Assert.False(ExternalAttributePolicy.IsAllowedMetricLabel(key));
Assert.True(ExternalAttributePolicy.IsForbiddenMetricLabel(key));
}
[Fact]
public void ForbiddenMetricLabel_DetectsSubstringCaseInsensitive()
{
Assert.True(ExternalAttributePolicy.IsForbiddenMetricLabel("SessionId"));
Assert.True(ExternalAttributePolicy.IsForbiddenMetricLabel("some_OperationId_suffix"));
Assert.False(ExternalAttributePolicy.IsForbiddenMetricLabel("component"));
}
[Fact]
public void LogAttributes_RejectForbiddenKeys()
{
Assert.False(ExternalAttributePolicy.IsAllowedLogAttribute("password"));
Assert.False(ExternalAttributePolicy.IsAllowedLogAttribute("Authorization"));
Assert.False(ExternalAttributePolicy.IsAllowedLogAttribute("connectionString"));
Assert.True(ExternalAttributePolicy.IsAllowedLogAttribute("route_template"));
}
[Fact]
public void ForbiddenValues_AreDetected()
{
Assert.True(ExternalAttributePolicy.ContainsForbiddenValue("Bearer token abc"));
Assert.True(ExternalAttributePolicy.ContainsForbiddenValue("password=123"));
Assert.False(ExternalAttributePolicy.ContainsForbiddenValue("une valeur ordinaire"));
}
}