using FrameProcessor.Domain; namespace FrameProcessor.Tests; public class ApiKeyTests { [Fact] public void Matches_ReturnsTrue_ForIdenticalKey() { var key = new ApiKey("s3cret-value"); Assert.True(key.Matches("s3cret-value")); } [Fact] public void Matches_ReturnsFalse_ForDifferentKey() { var key = new ApiKey("s3cret-value"); Assert.False(key.Matches("wrong")); } [Fact] public void Matches_ReturnsFalse_ForKeyOfDifferentLength() { var key = new ApiKey("s3cret"); Assert.False(key.Matches("s3cret-value")); Assert.False(key.Matches("s3cre")); } [Fact] public void Matches_ReturnsFalse_ForNull() { var key = new ApiKey("s3cret"); Assert.False(key.Matches(null)); } [Fact] public void Matches_ReturnsFalse_ForEmptyCandidate_WhenKeyIsNotEmpty() { var key = new ApiKey("s3cret"); Assert.False(key.Matches(string.Empty)); } [Fact] public void Matches_IsCaseSensitive() { var key = new ApiKey("Secret"); Assert.False(key.Matches("secret")); Assert.False(key.Matches("SECRET")); } [Fact] public void Matches_HandlesMultiByteUtf8() { var key = new ApiKey("nyckel-äöå"); Assert.True(key.Matches("nyckel-äöå")); Assert.False(key.Matches("nyckel-aoa")); } [Fact] public void Constructor_ThrowsOnNull() { Assert.Throws(() => new ApiKey(null!)); } [Fact] public void Value_ReturnsConfiguredString() { var key = new ApiKey("abc"); Assert.Equal("abc", key.Value); } [Fact] public void DefaultStruct_Value_IsEmpty() { var key = default(ApiKey); Assert.Equal(string.Empty, key.Value); } }