// tests/SpamGuard.Tests/State/TrustedSenderStoreTests.cs namespace SpamGuard.Tests.State; using SpamGuard.State; public class TrustedSenderStoreTests : IDisposable { private readonly string _tempDir; private readonly TrustedSenderStore _store; public TrustedSenderStoreTests() { _tempDir = Path.Combine(Path.GetTempPath(), $"spamguard-test-{Guid.NewGuid()}"); Directory.CreateDirectory(_tempDir); _store = new TrustedSenderStore(_tempDir); } public void Dispose() { if (Directory.Exists(_tempDir)) Directory.Delete(_tempDir, true); } [Fact] public void IsTrusted_ReturnsFalse_WhenEmpty() { Assert.False(_store.IsTrusted("someone@example.com")); } [Fact] public void IsTrusted_ReturnsTrue_AfterAdd() { _store.Add("someone@example.com"); Assert.True(_store.IsTrusted("someone@example.com")); } [Fact] public void IsTrusted_IsCaseInsensitive() { _store.Add("Someone@Example.COM"); Assert.True(_store.IsTrusted("someone@example.com")); } [Fact] public void IsTrusted_TrimsWhitespace() { _store.Add(" someone@example.com "); Assert.True(_store.IsTrusted("someone@example.com")); } [Fact] public void AddRange_AddsMultiple() { _store.AddRange(["a@b.com", "c@d.com", "e@f.com"]); Assert.True(_store.IsTrusted("a@b.com")); Assert.True(_store.IsTrusted("c@d.com")); Assert.True(_store.IsTrusted("e@f.com")); } [Fact] public void Save_And_Load_RoundTrips() { _store.Add("a@b.com"); _store.Add("c@d.com"); _store.Save(); var loaded = new TrustedSenderStore(_tempDir); Assert.True(loaded.IsTrusted("a@b.com")); Assert.True(loaded.IsTrusted("c@d.com")); Assert.False(loaded.IsTrusted("x@y.com")); } [Fact] public void Count_ReturnsCorrectValue() { _store.AddRange(["a@b.com", "c@d.com"]); Assert.Equal(2, _store.Count); } }