using Omika.Core.Observability.External; namespace Omika.Tests.Observability.External; /// Garde-fous de cardinalité des métriques externes (§36/§37). 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")); } }