- JobQueue takes an optional scope, so a test's worker leases and reaps only its own jobs. - The dead-host delivery test runs alone (Exclusive), on its own jobs, and cleans up the breaker rows it trips; the breaker has tests of its own on unique hosts. - Index and migration tests run alone: they drop indexes and rewrite every post. - DomainBlocks.Load replaces reflection and a database-wide block in tests. - Harness.Outgoing sees only deliveries queued since the harness started: Peer ports are reused within a run, which made the circle test flaky. - Two pure-logic tests leave Mongo-gated classes, so CI runs them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ELjqpznMFMNrJoJUj6K5p2
38 lines
1.1 KiB
C#
38 lines
1.1 KiB
C#
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
using PrivaPub.Federation.Moderation;
|
|
using PrivaPub.Models.Federation;
|
|
|
|
namespace PrivaPub.Tests.Federation
|
|
{
|
|
public class DomainBlocksTests
|
|
{
|
|
[Fact]
|
|
public void A_block_covers_subdomains_but_not_lookalikes()
|
|
{
|
|
var blocks = new DomainBlocks(NullLogger<DomainBlocks>.Instance);
|
|
blocks.Load(new[] { new DomainBlock { Domain = "evil.example", Severity = DomainBlockSeverity.Silence } });
|
|
|
|
Assert.NotNull(blocks.Find("evil.example"));
|
|
Assert.NotNull(blocks.Find("A.Evil.Example."));
|
|
Assert.Null(blocks.Find("notevil.example"));
|
|
Assert.False(blocks.IsSuspended("evil.example"));
|
|
}
|
|
|
|
[Fact]
|
|
public void A_suspension_is_found_from_any_subdomain()
|
|
{
|
|
var blocks = new DomainBlocks(NullLogger<DomainBlocks>.Instance);
|
|
blocks.Load(new[]
|
|
{
|
|
new DomainBlock { Domain = " Spam.Example. ", Severity = DomainBlockSeverity.Suspend },
|
|
new DomainBlock { Domain = "", Severity = DomainBlockSeverity.Suspend }
|
|
});
|
|
|
|
Assert.True(blocks.IsSuspended("deep.inside.spam.example"));
|
|
Assert.False(blocks.IsSuspended("example"));
|
|
Assert.Null(blocks.Find(default));
|
|
}
|
|
}
|
|
}
|