perf(centralui): load template stubs/analysis projections instead of the full tracked graph (review 2026-10-21 07/P-1, 08/P1)

This commit is contained in:
Joseph Doherty
2026-10-22 08:40:49 -04:00
parent 0ebfafa98b
commit c429fb374b
12 changed files with 103 additions and 28 deletions
@@ -69,7 +69,7 @@ public class TemplatesPageTests : BunitContext
[Fact]
public void Renders_EmptyState_WhenNoTemplatesOrFolders()
{
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template>()));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder>()));
@@ -85,7 +85,7 @@ public class TemplatesPageTests : BunitContext
{
var folder = new TemplateFolder("Dev") { Id = 1 };
var template = new Template("TestMachine") { Id = 5, FolderId = 1 };
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template> { template }));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder> { folder }));
@@ -114,7 +114,7 @@ public class TemplatesPageTests : BunitContext
new TemplateComposition("DelmiaReceiver") { Id = 10, ComposedTemplateId = 99 });
var composed = new Template("Other") { Id = 99 };
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template> { template, composed }));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder>()));
@@ -153,7 +153,7 @@ public class TemplatesPageTests : BunitContext
cvdReactor.Compositions.Add(
new TemplateComposition("LeftReactorSide") { Id = 200, TemplateId = 1, ComposedTemplateId = 8 });
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(
new List<Template> { cvdReactor, reactorSide, leftReactorSide, leakTest }));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
@@ -191,7 +191,7 @@ public class TemplatesPageTests : BunitContext
var alpha = new Template("AlphaDevice") { Id = 10, FolderId = 1 };
var beta = new Template("BetaDevice") { Id = 20, FolderId = 1 };
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template> { alpha, beta }));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder> { folder }));
@@ -243,7 +243,7 @@ public class TemplatesPageTests : BunitContext
var beta = new TemplateFolder("Beta") { Id = 2, ParentFolderId = null, SortOrder = 1 };
var all = new List<TemplateFolder> { alpha, beta };
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template>()));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(_ => Task.FromResult<IReadOnlyList<TemplateFolder>>(all));
@@ -307,7 +307,7 @@ public class TemplatesPageTests : BunitContext
// Tree reloaded after the mutation: LoadTemplatesAsync re-fetched (initial
// load + post-reorder reload). GetAllTemplatesAsync is only touched by the
// page's load path, never by ReorderFolderAsync, so 2 calls == one reload.
_repo.Received(2).GetAllTemplatesAsync(Arg.Any<CancellationToken>());
_repo.Received(2).GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>());
}
/// <summary>Verifies that choosing move up dispatches a reorder up and reloads the tree.</summary>
@@ -333,7 +333,7 @@ public class TemplatesPageTests : BunitContext
Assert.Equal(1, alpha.SortOrder);
// Tree reloaded after the mutation (one reload == GetAllTemplatesAsync twice).
_repo.Received(2).GetAllTemplatesAsync(Arg.Any<CancellationToken>());
_repo.Received(2).GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>());
}
/// <summary>Verifies that move up is disabled for the first sibling folder.</summary>
@@ -372,7 +372,7 @@ public class TemplatesPageTests : BunitContext
[Fact]
public void RootContextMenu_OffersNewFolderAndNewTemplate()
{
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template>()));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder>()));
@@ -392,7 +392,7 @@ public class TemplatesPageTests : BunitContext
[Fact]
public void RootContextMenu_NewTemplate_NavigatesToRootCreate()
{
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template>()));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder>()));
@@ -417,7 +417,7 @@ public class TemplatesPageTests : BunitContext
private void SeedOneTemplate(int id, string name)
{
_repo.GetAllTemplatesAsync(Arg.Any<CancellationToken>())
_repo.GetAllTemplatesForAnalysisAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<Template>>(new List<Template> { new(name) { Id = id } }));
_repo.GetAllFoldersAsync(Arg.Any<CancellationToken>())
.Returns(Task.FromResult<IReadOnlyList<TemplateFolder>>(new List<TemplateFolder>()));