Remove EF query warnings from test runs

This commit is contained in:
2026-02-07 13:46:46 +01:00
parent 86310804fa
commit 47fbec4512
10 changed files with 37 additions and 36 deletions

View File

@@ -9,7 +9,7 @@ internal sealed class AdminWorkflowService(AppDbContext db)
{ {
public async Task<IResult> SetResultsOpenAsync(bool resultsOpen) public async Task<IResult> SetResultsOpenAsync(bool resultsOpen)
{ {
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = resultsOpen; state.ResultsOpen = resultsOpen;
state.UpdatedAt = DateTimeOffset.UtcNow; state.UpdatedAt = DateTimeOffset.UtcNow;
@@ -26,7 +26,7 @@ internal sealed class AdminWorkflowService(AppDbContext db)
await db.SaveChangesAsync(); await db.SaveChangesAsync();
await tx.CommitAsync(); await tx.CommitAsync();
var currentState = await db.AppState.AsNoTracking().FirstAsync(); var currentState = await db.AppState.AsNoTracking().SingleAsync();
return Results.Ok(new AdminResultsStateResponse(currentState.ResultsOpen, currentState.UpdatedAt)); return Results.Ok(new AdminResultsStateResponse(currentState.ResultsOpen, currentState.UpdatedAt));
} }
@@ -186,7 +186,7 @@ internal sealed class AdminWorkflowService(AppDbContext db)
await db.Suggestions.ExecuteDeleteAsync(); await db.Suggestions.ExecuteDeleteAsync();
await db.Players.ExecuteUpdateAsync(p => p.SetProperty(x => x.CurrentPhase, Phase.Suggest).SetProperty(x => x.VotesFinal, false).SetProperty(x => x.HasJoker, false)); await db.Players.ExecuteUpdateAsync(p => p.SetProperty(x => x.CurrentPhase, Phase.Suggest).SetProperty(x => x.VotesFinal, false).SetProperty(x => x.HasJoker, false));
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = false; state.ResultsOpen = false;
state.UpdatedAt = DateTimeOffset.UtcNow; state.UpdatedAt = DateTimeOffset.UtcNow;
await db.SaveChangesAsync(); await db.SaveChangesAsync();

View File

@@ -44,7 +44,7 @@ internal static class EndpointHelpers
if (playerPhase is null) if (playerPhase is null)
return Phase.Suggest; return Phase.Suggest;
var resultsOpen = await db.AppState.AsNoTracking().Select(s => s.ResultsOpen).FirstAsync(); var resultsOpen = await db.AppState.AsNoTracking().Select(s => s.ResultsOpen).SingleAsync();
return GetCurrentPhase(playerPhase.Value, resultsOpen); return GetCurrentPhase(playerPhase.Value, resultsOpen);
} }

View File

@@ -9,7 +9,7 @@ internal sealed class ResultsWorkflowService(AppDbContext db)
{ {
public async Task<IResult> GetResultsAsync(Guid playerId) public async Task<IResult> GetResultsAsync(Guid playerId)
{ {
var appState = await db.AppState.AsNoTracking().FirstAsync(); var appState = await db.AppState.AsNoTracking().SingleAsync();
if (!appState.ResultsOpen) if (!appState.ResultsOpen)
return EndpointHelpers.BadRequestError("Results are locked until the admin enables them."); return EndpointHelpers.BadRequestError("Results are locked until the admin enables them.");

View File

@@ -9,7 +9,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
{ {
public async Task<IResult> GetStateAsync(Player player) public async Task<IResult> GetStateAsync(Player player)
{ {
var state = await db.AppState.AsNoTracking().FirstAsync(); var state = await db.AppState.AsNoTracking().SingleAsync();
var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen); var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen);
var summary = new StateSummaryResponse( var summary = new StateSummaryResponse(
phase, phase,
@@ -26,7 +26,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
public async Task<IResult> GetMeAsync(Player player) public async Task<IResult> GetMeAsync(Player player)
{ {
var state = await db.AppState.AsNoTracking().FirstAsync(); var state = await db.AppState.AsNoTracking().SingleAsync();
var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen); var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen);
return Results.Ok(new MeResponse( return Results.Ok(new MeResponse(
player.Id, player.Id,
@@ -41,7 +41,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
public async Task<IResult> NextPhaseAsync(Player player) public async Task<IResult> NextPhaseAsync(Player player)
{ {
var appState = await db.AppState.FirstAsync(); var appState = await db.AppState.SingleAsync();
var shouldSave = EndpointHelpers.ReconcilePlayerPhase(player, appState.ResultsOpen); var shouldSave = EndpointHelpers.ReconcilePlayerPhase(player, appState.ResultsOpen);
try try
@@ -75,7 +75,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
if (!player.IsAdmin) if (!player.IsAdmin)
return EndpointHelpers.BadRequestError("Only admins can move backward."); return EndpointHelpers.BadRequestError("Only admins can move backward.");
var appState = await db.AppState.FirstAsync(); var appState = await db.AppState.SingleAsync();
_ = EndpointHelpers.ReconcilePlayerPhase(player, appState.ResultsOpen); _ = EndpointHelpers.ReconcilePlayerPhase(player, appState.ResultsOpen);
player.CurrentPhase = PrevPhase(player.CurrentPhase); player.CurrentPhase = PrevPhase(player.CurrentPhase);

View File

@@ -244,7 +244,7 @@ public class AdminTests
{ {
var p = await db.Players.FirstAsync(x => !x.IsAdmin); var p = await db.Players.FirstAsync(x => !x.IsAdmin);
p.VotesFinal = true; p.VotesFinal = true;
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.UpdatedAt = DateTimeOffset.UnixEpoch; state.UpdatedAt = DateTimeOffset.UnixEpoch;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -257,7 +257,7 @@ public class AdminTests
var p = await db.Players.FirstAsync(x => !x.IsAdmin); var p = await db.Players.FirstAsync(x => !x.IsAdmin);
Assert.Equal(Phase.Vote, p.CurrentPhase); Assert.Equal(Phase.Vote, p.CurrentPhase);
Assert.False(p.VotesFinal); Assert.False(p.VotesFinal);
var state = await db.AppState.AsNoTracking().FirstAsync(); var state = await db.AppState.AsNoTracking().SingleAsync();
Assert.False(state.ResultsOpen); Assert.False(state.ResultsOpen);
Assert.True(state.UpdatedAt > DateTimeOffset.UnixEpoch); Assert.True(state.UpdatedAt > DateTimeOffset.UnixEpoch);
}); });
@@ -433,7 +433,7 @@ public class AdminTests
var player = await db.Players.SingleAsync(x => x.Username == "flags"); var player = await db.Players.SingleAsync(x => x.Username == "flags");
Assert.False(player.HasJoker); Assert.False(player.HasJoker);
Assert.False(player.VotesFinal); Assert.False(player.VotesFinal);
var state = await db.AppState.AsNoTracking().FirstAsync(); var state = await db.AppState.AsNoTracking().SingleAsync();
Assert.False(state.ResultsOpen); Assert.False(state.ResultsOpen);
}); });
@@ -441,7 +441,7 @@ public class AdminTests
factoryReset.EnsureSuccessStatusCode(); factoryReset.EnsureSuccessStatusCode();
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var state = await db.AppState.AsNoTracking().FirstAsync(); var state = await db.AppState.AsNoTracking().SingleAsync();
Assert.False(state.ResultsOpen); Assert.False(state.ResultsOpen);
}); });
} }

View File

@@ -71,7 +71,7 @@ public class AuthTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
player.DisplayName = null; player.DisplayName = null;
player.LastLoginAt = DateTimeOffset.UnixEpoch; player.LastLoginAt = DateTimeOffset.UnixEpoch;
await db.SaveChangesAsync(); await db.SaveChangesAsync();

View File

@@ -91,7 +91,7 @@ public class FiltersTests
DisplayName = "User" DisplayName = "User"
}; };
db.Players.Add(player); db.Players.Add(player);
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = resultsOpen; state.ResultsOpen = resultsOpen;
await db.SaveChangesAsync(); await db.SaveChangesAsync();

View File

@@ -19,7 +19,7 @@ public class StateTests
await client.RegisterAsync("payload"); await client.RegisterAsync("payload");
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
player.HasJoker = true; player.HasJoker = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -55,7 +55,7 @@ public class StateTests
}; };
playerId = player.Id; playerId = player.Id;
db.Players.Add(player); db.Players.Add(player);
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = true; state.ResultsOpen = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -69,7 +69,7 @@ public class StateTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = false; state.ResultsOpen = false;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -95,7 +95,7 @@ public class StateTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
player.VotesFinal = true; player.VotesFinal = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -127,7 +127,7 @@ public class StateTests
await admin.PostAsJsonAsync("/api/me/phase/next", new { }); // Vote await admin.PostAsJsonAsync("/api/me/phase/next", new { }); // Vote
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
player.VotesFinal = true; player.VotesFinal = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -255,7 +255,7 @@ public class StateTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
db.Players.Remove(player); db.Players.Remove(player);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -284,10 +284,10 @@ public class StateTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.FirstAsync(); var player = await db.Players.SingleAsync();
player.CurrentPhase = Phase.Results; player.CurrentPhase = Phase.Results;
player.VotesFinal = true; player.VotesFinal = true;
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = false; state.ResultsOpen = false;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -300,7 +300,7 @@ public class StateTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var player = await db.Players.AsNoTracking().FirstAsync(); var player = await db.Players.AsNoTracking().SingleAsync();
Assert.Equal(Phase.Results, player.CurrentPhase); Assert.Equal(Phase.Results, player.CurrentPhase);
Assert.True(player.VotesFinal); Assert.True(player.VotesFinal);
}); });
@@ -323,17 +323,18 @@ public class StateTests
CurrentPhase = Phase.Vote CurrentPhase = Phase.Vote
}; };
db.Players.Add(player); db.Players.Add(player);
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = true; state.ResultsOpen = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
using var scope = factory.Services.CreateScope(); using var scope = factory.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var playerId = await db.Players.Select(p => p.Id).FirstAsync(); var playerId = await db.Players.Select(p => p.Id).SingleAsync();
var phase = await Endpoints.EndpointHelpers.GetCurrentPhaseAsync(db, playerId); var phase = await Endpoints.EndpointHelpers.GetCurrentPhaseAsync(db, playerId);
Assert.Equal(Phase.Results, phase); Assert.Equal(Phase.Results, phase);
} }
} }

View File

@@ -91,7 +91,7 @@ public class SuggestionTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync(x => x.Username == "joker");
p.HasJoker = true; p.HasJoker = true;
p.CurrentPhase = Domain.Phase.Vote; p.CurrentPhase = Domain.Phase.Vote;
var o = await db.Players.SingleAsync(x => x.Username == "other"); var o = await db.Players.SingleAsync(x => x.Username == "other");
@@ -114,7 +114,7 @@ public class SuggestionTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync(x => x.Username == "joker");
Assert.False(p.HasJoker); Assert.False(p.HasJoker);
Assert.False(p.VotesFinal); Assert.False(p.VotesFinal);
var o = await db.Players.SingleAsync(x => x.Username == "other"); var o = await db.Players.SingleAsync(x => x.Username == "other");
@@ -187,9 +187,9 @@ public class SuggestionTests
// Move everyone to Results // Move everyone to Results
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var state = await db.AppState.FirstAsync(); var state = await db.AppState.SingleAsync();
state.ResultsOpen = true; state.ResultsOpen = true;
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.CurrentPhase = Domain.Phase.Results; p.CurrentPhase = Domain.Phase.Results;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -267,7 +267,7 @@ public class SuggestionTests
await client.PostAsJsonAsync("/api/me/phase/next", new { }); await client.PostAsJsonAsync("/api/me/phase/next", new { });
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.HasJoker = true; p.HasJoker = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -288,7 +288,7 @@ public class SuggestionTests
// Grant another joker and add a seventh suggestion // Grant another joker and add a seventh suggestion
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.HasJoker = true; p.HasJoker = true;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -389,7 +389,7 @@ public class SuggestionTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.CurrentPhase = Domain.Phase.Vote; p.CurrentPhase = Domain.Phase.Vote;
p.DisplayName = null; p.DisplayName = null;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
@@ -410,7 +410,7 @@ public class SuggestionTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.CurrentPhase = Domain.Phase.Suggest; p.CurrentPhase = Domain.Phase.Suggest;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });
@@ -526,7 +526,7 @@ public class SuggestionTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var s = await db.Suggestions.AsNoTracking().FirstAsync(); var s = await db.Suggestions.AsNoTracking().SingleAsync();
Assert.Equal(50, s.Genre!.Length); Assert.Equal(50, s.Genre!.Length);
Assert.Equal(500, s.Description!.Length); Assert.Equal(500, s.Description!.Length);
Assert.Equal("http://example.com/img.png", s.ScreenshotUrl); Assert.Equal("http://example.com/img.png", s.ScreenshotUrl);

View File

@@ -98,7 +98,7 @@ public class VoteTests
await factory.WithDbContextAsync(async db => await factory.WithDbContextAsync(async db =>
{ {
var p = await db.Players.FirstAsync(); var p = await db.Players.SingleAsync();
p.DisplayName = null; p.DisplayName = null;
await db.SaveChangesAsync(); await db.SaveChangesAsync();
}); });