From 2b9a5bc4dfaa934f9f4bcb5ed1f89d080bfe1739 Mon Sep 17 00:00:00 2001 From: Chris0Jeky Date: Sun, 6 Sep 2026 05:29:42 +0100 Subject: [PATCH] Prove scoped expiry transition state --- .../AutomationProposalServiceTests.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceTests.cs b/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceTests.cs index 1d4ad98d3..ae9e8cc8e 100644 --- a/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceTests.cs +++ b/backend/tests/Taskdeck.Application.Tests/Services/AutomationProposalServiceTests.cs @@ -1,4 +1,5 @@ using FluentAssertions; +using Microsoft.Extensions.Logging; using Moq; using Taskdeck.Application.DTOs; using Taskdeck.Application.Interfaces; @@ -8,6 +9,7 @@ using Taskdeck.Domain.Entities; using Taskdeck.Domain.Enums; using Taskdeck.Domain.Exceptions; +using Taskdeck.Tests.Support; using Xunit; namespace Taskdeck.Application.Tests.Services; @@ -2059,6 +2061,50 @@ public async Task MarkAsFailedAsync_ShouldReturnSuccess_WhenApproved() #region ExpireProposalsAsync Tests + [Fact] + public async Task ExpireProposalsAsync_ShouldKeepSkipTransitionStatePerServiceInstance() + { + var logger = new InMemoryLogger(); + var firstScopeService = new AutomationProposalService( + _unitOfWorkMock.Object, + _notificationServiceMock.Object, + provenanceRepository: null, + policyEngine: null, + logger: logger); + var secondScopeService = new AutomationProposalService( + _unitOfWorkMock.Object, + _notificationServiceMock.Object, + provenanceRepository: null, + policyEngine: null, + logger: logger); + + _proposalRepoMock + .SetupSequence(r => r.GetExpiredAsync(It.IsAny())) + .ReturnsAsync(new ExpiredProposalSweep( + Array.Empty(), + SkippedArchivedBoardCount: 2)) + .ReturnsAsync(new ExpiredProposalSweep( + Array.Empty(), + SkippedArchivedBoardCount: 2)) + .ReturnsAsync(new ExpiredProposalSweep( + Array.Empty(), + SkippedArchivedBoardCount: 2)); + + await firstScopeService.ExpireProposalsAsync(); + await firstScopeService.ExpireProposalsAsync(); + await secondScopeService.ExpireProposalsAsync(); + + logger.Entries.Count( + entry => entry.Level == LogLevel.Information + && entry.Message.Contains("Skipped expiring") + && entry.Message.Contains("2")) + .Should().Be(2); + logger.Entries.Should().ContainSingle( + entry => entry.Level == LogLevel.Debug + && entry.Message.Contains("Still skipping") + && entry.Message.Contains("2")); + } + [Fact] public async Task ExpireProposalsAsync_ShouldExpireAllStaleProposals() {