From cf697543032892c70170838795dfd3fc8649426e Mon Sep 17 00:00:00 2001 From: Chris0Jeky Date: Sun, 29 Mar 2026 05:27:34 +0100 Subject: [PATCH] Fix compatibility breaks for Dependabot dependency upgrades FluentAssertions v8 renamed BeLessOrEqualTo/BeGreaterOrEqualTo to BeLessThanOrEqualTo/BeGreaterThanOrEqualTo, and removed Execute.Assertion (replaced with a direct XunitException throw in the catch block). EF Core v9 added ExecuteDeleteAsync to EntityFrameworkQueryableExtensions alongside the existing RelationalQueryableExtensions, causing an ambiguous call in KnowledgeChunkRepository. Resolve by calling RelationalQueryableExtensions explicitly. --- .../Repositories/KnowledgeChunkRepository.cs | 6 +++--- backend/tests/Taskdeck.Api.Tests/ArchiveApiTests.cs | 2 +- backend/tests/Taskdeck.Api.Tests/HealthApiTests.cs | 4 ++-- backend/tests/Taskdeck.Api.Tests/LlmQuotaApiTests.cs | 2 +- .../tests/Taskdeck.Api.Tests/LlmQuotaIntegrationTests.cs | 8 ++++---- backend/tests/Taskdeck.Api.Tests/OpsCliApiTests.cs | 2 +- .../tests/Taskdeck.Api.Tests/Support/ApiTestHarness.cs | 8 ++------ 7 files changed, 14 insertions(+), 18 deletions(-) diff --git a/backend/src/Taskdeck.Infrastructure/Repositories/KnowledgeChunkRepository.cs b/backend/src/Taskdeck.Infrastructure/Repositories/KnowledgeChunkRepository.cs index 88d60f770..dd14c589a 100644 --- a/backend/src/Taskdeck.Infrastructure/Repositories/KnowledgeChunkRepository.cs +++ b/backend/src/Taskdeck.Infrastructure/Repositories/KnowledgeChunkRepository.cs @@ -25,8 +25,8 @@ public async Task DeleteByDocumentIdAsync( Guid documentId, CancellationToken cancellationToken = default) { - await _dbSet - .Where(c => c.DocumentId == documentId) - .ExecuteDeleteAsync(cancellationToken); + await RelationalQueryableExtensions.ExecuteDeleteAsync( + _dbSet.Where(c => c.DocumentId == documentId), + cancellationToken); } } diff --git a/backend/tests/Taskdeck.Api.Tests/ArchiveApiTests.cs b/backend/tests/Taskdeck.Api.Tests/ArchiveApiTests.cs index 793f20674..4dea0ed51 100644 --- a/backend/tests/Taskdeck.Api.Tests/ArchiveApiTests.cs +++ b/backend/tests/Taskdeck.Api.Tests/ArchiveApiTests.cs @@ -98,7 +98,7 @@ public async Task GetArchiveItems_WithLimit_ShouldRespectLimit() var items = await response.Content.ReadFromJsonAsync>(); items.Should().NotBeNull(); - items!.Count.Should().BeLessOrEqualTo(5); + items!.Count.Should().BeLessThanOrEqualTo(5); } [Fact] diff --git a/backend/tests/Taskdeck.Api.Tests/HealthApiTests.cs b/backend/tests/Taskdeck.Api.Tests/HealthApiTests.cs index a8e28ff5a..16cdc349d 100644 --- a/backend/tests/Taskdeck.Api.Tests/HealthApiTests.cs +++ b/backend/tests/Taskdeck.Api.Tests/HealthApiTests.cs @@ -73,7 +73,7 @@ public async Task Ready_ShouldExcludeCaptureBacklogFromAutomationQueueDepth() var payload = await response.Content.ReadFromJsonAsync(); var queue = payload.GetProperty("checks").GetProperty("queue"); queue.GetProperty("depth").GetInt32().Should().Be(0); - queue.GetProperty("captureDepth").GetInt32().Should().BeGreaterOrEqualTo(3); - queue.GetProperty("totalDepth").GetInt32().Should().BeGreaterOrEqualTo(3); + queue.GetProperty("captureDepth").GetInt32().Should().BeGreaterThanOrEqualTo(3); + queue.GetProperty("totalDepth").GetInt32().Should().BeGreaterThanOrEqualTo(3); } } diff --git a/backend/tests/Taskdeck.Api.Tests/LlmQuotaApiTests.cs b/backend/tests/Taskdeck.Api.Tests/LlmQuotaApiTests.cs index ecab93dde..a2a9dec2f 100644 --- a/backend/tests/Taskdeck.Api.Tests/LlmQuotaApiTests.cs +++ b/backend/tests/Taskdeck.Api.Tests/LlmQuotaApiTests.cs @@ -103,7 +103,7 @@ public async Task GetKillSwitch_ShouldReturnStatus() var json = JsonSerializer.Deserialize(body); json.TryGetProperty("globalKilled", out _).Should().BeTrue(); json.TryGetProperty("entries", out var entries).Should().BeTrue(); - entries.GetArrayLength().Should().BeGreaterOrEqualTo(1); + entries.GetArrayLength().Should().BeGreaterThanOrEqualTo(1); } [Fact] diff --git a/backend/tests/Taskdeck.Api.Tests/LlmQuotaIntegrationTests.cs b/backend/tests/Taskdeck.Api.Tests/LlmQuotaIntegrationTests.cs index 646e5b509..8d39540d7 100644 --- a/backend/tests/Taskdeck.Api.Tests/LlmQuotaIntegrationTests.cs +++ b/backend/tests/Taskdeck.Api.Tests/LlmQuotaIntegrationTests.cs @@ -306,9 +306,9 @@ public async Task UsageSummary_ShouldReflectRecordedUsage() var usage = await usageResponse.Content.ReadFromJsonAsync(); usage.GetProperty("totalRequests").GetInt64().Should().Be(messageCount); - usage.GetProperty("totalTokens").GetInt64().Should().BeGreaterOrEqualTo(0); - usage.GetProperty("totalInputTokens").GetInt64().Should().BeGreaterOrEqualTo(0); - usage.GetProperty("totalOutputTokens").GetInt64().Should().BeGreaterOrEqualTo(0); + usage.GetProperty("totalTokens").GetInt64().Should().BeGreaterThanOrEqualTo(0); + usage.GetProperty("totalInputTokens").GetInt64().Should().BeGreaterThanOrEqualTo(0); + usage.GetProperty("totalOutputTokens").GetInt64().Should().BeGreaterThanOrEqualTo(0); // Verify window boundaries are present usage.TryGetProperty("windowStart", out _).Should().BeTrue(); @@ -342,7 +342,7 @@ public async Task QuotaStatus_ShouldReturnCorrectRemainingCounts() afterResponse.StatusCode.Should().Be(HttpStatusCode.OK); var after = await afterResponse.Content.ReadFromJsonAsync(); after.GetProperty("requestsThisHour").GetInt64().Should().Be(1); - after.GetProperty("tokensUsedToday").GetInt64().Should().BeGreaterOrEqualTo(0); + after.GetProperty("tokensUsedToday").GetInt64().Should().BeGreaterThanOrEqualTo(0); } } diff --git a/backend/tests/Taskdeck.Api.Tests/OpsCliApiTests.cs b/backend/tests/Taskdeck.Api.Tests/OpsCliApiTests.cs index b5d14ff67..b9561890c 100644 --- a/backend/tests/Taskdeck.Api.Tests/OpsCliApiTests.cs +++ b/backend/tests/Taskdeck.Api.Tests/OpsCliApiTests.cs @@ -134,7 +134,7 @@ public async Task RunCommand_ShouldFallbackCorrelationId_WhenRequestCorrelationH var payload = await response.Content.ReadFromJsonAsync(); payload.Should().NotBeNull(); payload!.CorrelationId.Should().NotBe(invalidCorrelationId); - payload.CorrelationId.Length.Should().BeLessOrEqualTo(100); + payload.CorrelationId.Length.Should().BeLessThanOrEqualTo(100); response.Headers.TryGetValues("X-Request-Id", out var responseRequestIds).Should().BeTrue(); responseRequestIds!.Single().Should().Be(payload.CorrelationId); diff --git a/backend/tests/Taskdeck.Api.Tests/Support/ApiTestHarness.cs b/backend/tests/Taskdeck.Api.Tests/Support/ApiTestHarness.cs index 74159acbd..7e0f07283 100644 --- a/backend/tests/Taskdeck.Api.Tests/Support/ApiTestHarness.cs +++ b/backend/tests/Taskdeck.Api.Tests/Support/ApiTestHarness.cs @@ -102,12 +102,8 @@ public static async Task AssertErrorContractAsync( } catch (JsonException ex) { - Execute.Assertion.FailWith( - "Expected a JSON error contract body for {0}, but parsing failed: {1}. Body: {2}", - expectedStatus, - ex.Message, - rawBody); - return; + throw new XunitException( + $"Expected a JSON error contract body for {expectedStatus}, but parsing failed: {ex.Message}. Body: {rawBody}"); } payload.ValueKind.Should().Be(JsonValueKind.Object);