From 8fc32553074d0746e7c3aaea958a5af07ecda152 Mon Sep 17 00:00:00 2001 From: Chris0Jeky Date: Sat, 5 Sep 2026 05:17:17 +0100 Subject: [PATCH] test: cover archived board skip recovery --- .../AutomationProposalServiceEdgeCaseTests.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceEdgeCaseTests.cs b/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceEdgeCaseTests.cs index 01d003da7..d67a9338d 100644 --- a/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceEdgeCaseTests.cs +++ b/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceEdgeCaseTests.cs @@ -285,6 +285,51 @@ public async Task ExpireProposalsAsync_ShouldLogArchivedBoardSkipOnlyOnCountTran entry => entry.Level == LogLevel.Debug && entry.Message.Contains("Still skipping")); } + [Fact] + public async Task ExpireProposalsAsync_ShouldLogWhenArchivedBoardSkipCountReturnsToZero() + { + var logger = new InMemoryLogger(); + var service = new AutomationProposalService( + _unitOfWorkMock.Object, + _notificationServiceMock.Object, + provenanceRepository: null, + policyEngine: null, + logger: logger); + var expirable = CreatePendingProposal(); + + _proposalRepoMock + .SetupSequence(r => r.GetExpiredAsync(It.IsAny())) + .ReturnsAsync(new ExpiredProposalSweep( + Array.Empty(), + SkippedArchivedBoardCount: 2)) + .ReturnsAsync(new ExpiredProposalSweep( + new[] { expirable }, + SkippedArchivedBoardCount: 0)); + + await service.ExpireProposalsAsync(); + var result = await service.ExpireProposalsAsync(); + + result.IsSuccess.Should().BeTrue(); + result.Value.Should().Be(1); + expirable.Status.Should().Be(ProposalStatus.Expired); + _unitOfWorkMock.Verify( + u => u.SaveChangesAsync(It.IsAny()), + Times.Once()); + _notificationServiceMock.Verify( + s => s.PublishAsync(It.IsAny(), It.IsAny()), + Times.Once()); + + logger.Entries.Should().ContainSingle( + entry => entry.Level == LogLevel.Information + && entry.Message.Contains("No stale proposals are being withheld")); + logger.Entries.Should().ContainSingle( + entry => entry.Level == LogLevel.Information + && entry.Message.Contains("Skipped expiring") + && entry.Message.Contains("2")); + logger.Entries.Should().NotContain( + entry => entry.Level == LogLevel.Debug && entry.Message.Contains("Still skipping")); + } + [Fact] public async Task ExpireProposalsAsync_ShouldReturnZero_WhenNoneExpired() {