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)
{
var state = await db.AppState.FirstAsync();
var state = await db.AppState.SingleAsync();
state.ResultsOpen = resultsOpen;
state.UpdatedAt = DateTimeOffset.UtcNow;
@@ -26,7 +26,7 @@ internal sealed class AdminWorkflowService(AppDbContext db)
await db.SaveChangesAsync();
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));
}
@@ -186,7 +186,7 @@ internal sealed class AdminWorkflowService(AppDbContext db)
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));
var state = await db.AppState.FirstAsync();
var state = await db.AppState.SingleAsync();
state.ResultsOpen = false;
state.UpdatedAt = DateTimeOffset.UtcNow;
await db.SaveChangesAsync();

View File

@@ -44,7 +44,7 @@ internal static class EndpointHelpers
if (playerPhase is null)
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);
}

View File

@@ -9,7 +9,7 @@ internal sealed class ResultsWorkflowService(AppDbContext db)
{
public async Task<IResult> GetResultsAsync(Guid playerId)
{
var appState = await db.AppState.AsNoTracking().FirstAsync();
var appState = await db.AppState.AsNoTracking().SingleAsync();
if (!appState.ResultsOpen)
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)
{
var state = await db.AppState.AsNoTracking().FirstAsync();
var state = await db.AppState.AsNoTracking().SingleAsync();
var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen);
var summary = new StateSummaryResponse(
phase,
@@ -26,7 +26,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
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);
return Results.Ok(new MeResponse(
player.Id,
@@ -41,7 +41,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
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);
try
@@ -75,7 +75,7 @@ internal sealed class StateWorkflowService(AppDbContext db)
if (!player.IsAdmin)
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);
player.CurrentPhase = PrevPhase(player.CurrentPhase);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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