From d5ea35445f9b42bc1bd780d9d67571f68a0e9263 Mon Sep 17 00:00:00 2001 From: Flaminel Date: Sun, 18 Oct 2026 13:02:25 +0300 Subject: [PATCH] fixed cycle searched count counting queued items --- .../Seeker/SearchStatsControllerTests.cs | 45 +++++++++++++++++-- .../Controllers/SearchStatsController.cs | 2 +- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/code/backend/Cleanuparr.Api.Tests/Features/Seeker/SearchStatsControllerTests.cs b/code/backend/Cleanuparr.Api.Tests/Features/Seeker/SearchStatsControllerTests.cs index b343a540..3c47e9f0 100644 --- a/code/backend/Cleanuparr.Api.Tests/Features/Seeker/SearchStatsControllerTests.cs +++ b/code/backend/Cleanuparr.Api.Tests/Features/Seeker/SearchStatsControllerTests.cs @@ -86,18 +86,55 @@ public class SearchStatsControllerTests : IDisposable var radarr = SeekerTestDataFactory.AddRadarrInstance(_dataContext); Guid currentCycleId = Guid.NewGuid(); AddInstanceConfig(radarr.Id, currentCycleId); - AddCycle(currentCycleId, radarr.Id, eligibleNow: 10, remainingUnits: 4, startedAt: Now.AddDays(-2)); + AddCycle(currentCycleId, radarr.Id, eligibleNow: 10, remainingUnits: 4, startedAt: Now.AddDays(-2), searchedUnits: 3); SearchStatsSummaryResponse summary = Summary(await _controller.GetSummary()); InstanceSearchStat stat = summary.PerInstanceStats.ShouldHaveSingleItem(); stat.CycleItemsTotal.ShouldBe(10); stat.CycleItemsRemaining.ShouldBe(4); - stat.CycleItemsSearched.ShouldBe(6); + stat.CycleItemsSearched.ShouldBe(3); stat.CycleStartedAt.ShouldBe(Now.AddDays(-2)); stat.CycleCompletedAt.ShouldBeNull(); } + [Fact] + public async Task GetSummary_PerInstanceStats_CycleItemsSearched_ExcludesQueuedItems() + { + var radarr = SeekerTestDataFactory.AddRadarrInstance(_dataContext); + Guid currentCycleId = Guid.NewGuid(); + AddInstanceConfig(radarr.Id, currentCycleId); + + // 5 eligible, 2 remaining, 1 actually searched: 2 are sitting in the download queue + AddCycle(currentCycleId, radarr.Id, eligibleNow: 5, remainingUnits: 2, startedAt: Now.AddDays(-1), searchedUnits: 1); + + SearchStatsSummaryResponse summary = Summary(await _controller.GetSummary()); + + InstanceSearchStat stat = summary.PerInstanceStats.ShouldHaveSingleItem(); + stat.CycleItemsSearched.ShouldBe(1); + } + + [Fact] + public async Task GetSummary_PerInstanceStats_DryRunOn_NoDryCycle_ValuesAreZeroOrNull() + { + var radarr = SeekerTestDataFactory.AddRadarrInstance(_dataContext); + (await _dataContext.GeneralConfigs.FirstAsync()).DryRun = true; + await _dataContext.SaveChangesAsync(); + + Guid currentCycleId = Guid.NewGuid(); + AddInstanceConfig(radarr.Id, currentCycleId); + AddCycle(currentCycleId, radarr.Id, eligibleNow: 10, remainingUnits: 4, startedAt: Now.AddDays(-2), isDryRun: false); + + SearchStatsSummaryResponse summary = Summary(await _controller.GetSummary()); + + InstanceSearchStat stat = summary.PerInstanceStats.ShouldHaveSingleItem(); + stat.CycleItemsSearched.ShouldBe(0); + stat.CycleItemsTotal.ShouldBe(0); + stat.CycleItemsRemaining.ShouldBe(0); + stat.CycleStartedAt.ShouldBeNull(); + stat.CycleCompletedAt.ShouldBeNull(); + } + [Fact] public async Task GetSummary_PerInstanceStats_LastCycle_IsTheNewestCompletedOtherCycle() { @@ -176,7 +213,8 @@ public class SearchStatsControllerTests : IDisposable int remainingUnits, DateTimeOffset startedAt, DateTimeOffset? completedAt = null, - bool isDryRun = false) + bool isDryRun = false, + int searchedUnits = 0) { _eventsContext.SeekerCycles.Add(new SeekerCycle { @@ -188,6 +226,7 @@ public class SearchStatsControllerTests : IDisposable EligibleAtStart = eligibleNow, EligibleNow = eligibleNow, RemainingUnits = remainingUnits, + SearchedUnits = searchedUnits, IsDryRun = isDryRun, }); _eventsContext.SaveChanges(); diff --git a/code/backend/Cleanuparr.Api/Features/Seeker/Controllers/SearchStatsController.cs b/code/backend/Cleanuparr.Api/Features/Seeker/Controllers/SearchStatsController.cs index 4d4d4b64..7b5f3e40 100644 --- a/code/backend/Cleanuparr.Api/Features/Seeker/Controllers/SearchStatsController.cs +++ b/code/backend/Cleanuparr.Api/Features/Seeker/Controllers/SearchStatsController.cs @@ -104,7 +104,7 @@ public sealed class SearchStatsController : ControllerBase LastSearchedAt = history?.LastSearchedAt, LastProcessedAt = ic.LastProcessedAt, CurrentCycleId = current?.Id ?? ic.CurrentCycleId, - CycleItemsSearched = current is null ? 0 : Math.Max(0, current.EligibleNow - current.RemainingUnits), + CycleItemsSearched = current?.SearchedUnits ?? 0, CycleItemsTotal = current?.EligibleNow ?? 0, CycleItemsRemaining = current?.RemainingUnits ?? 0, CycleStartedAt = current?.StartedAt,