Enhance world simulation and API functionality; implement clock management improvements, ensure proper handling of world states during updates, and refine data persistence methods to prevent resurrecting deleted worlds.

This commit is contained in:
Leonid Pershin
2026-08-16 22:02:45 +03:00
parent 9d1e3c29c7
commit 3610ee8051
12 changed files with 352 additions and 80 deletions
@@ -47,6 +47,39 @@ public sealed class WorldStoreTests : IDisposable
Assert.Equal(1, await _store.CountAsync());
}
[Fact]
public async Task TryUpdateSummaryAsync_writes_over_an_existing_state_file()
{
var summary = Summary("alpha-11111111", "Alpha");
await _store.SaveSummaryAsync(summary);
Assert.True(await _store.TryUpdateSummaryAsync(summary with { Name = "Renamed" }));
Assert.Equal("Renamed", (await _store.GetSummaryAsync(summary.Id))?.Name);
}
[Fact]
public async Task TryUpdateSummaryAsync_refuses_to_recreate_a_deleted_world()
{
var summary = Summary("alpha-11111111", "Alpha");
await _store.SaveSummaryAsync(summary);
Assert.True(_store.Delete(summary.Id));
Assert.False(await _store.TryUpdateSummaryAsync(summary));
Assert.False(Directory.Exists(Path.Combine(_root, summary.Id)));
Assert.Equal(0, await _store.CountAsync());
}
[Fact]
public async Task SaveSummaryAsync_leaves_no_scratch_files_behind()
{
var summary = Summary("alpha-11111111", "Alpha");
await _store.SaveSummaryAsync(summary);
await _store.SaveSummaryAsync(summary with { Name = "Alpha again" });
var files = Directory.GetFiles(Path.Combine(_root, summary.Id));
Assert.Equal(["state.json"], files.Select(static path => Path.GetFileName(path)).Order().ToArray()!);
}
private static WorldSummaryDto Summary(string id, string name) => new()
{
Id = id,