diff --git a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor
index 84b8ad0..c664f4f 100644
--- a/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor
+++ b/src/ScadaLink.CentralUI/Components/Pages/Design/Templates.razor
@@ -144,7 +144,8 @@
-
())
+ .Returns(Task.FromResult>(new List { template }));
+ _repo.GetAllFoldersAsync(Arg.Any())
+ .Returns(Task.FromResult>(new List()));
+ _repo.GetTemplateByIdAsync(5, Arg.Any())
+ .Returns(Task.FromResult(template));
+
+ var cut = Render();
+
+ // Act: fire ondragstart on the template's draggable (RenderNodeLabel
+ // emits draggable="true" for template/folder nodes), then ondrop on the
+ // root wrapper marked with the test-affordance class added to the page.
+ var templateNode = cut.Find("div[draggable='true']");
+ await templateNode.TriggerEventAsync("ondragstart", new DragEventArgs());
+
+ var rootDropZone = cut.Find("div.templates-root-dropzone");
+ await rootDropZone.TriggerEventAsync("ondrop", new DragEventArgs());
+
+ // Assert: TemplateService.MoveTemplateAsync delegates to the repository's
+ // UpdateTemplateAsync with FolderId set to null.
+ await _repo.Received(1).UpdateTemplateAsync(
+ Arg.Is(t => t.Id == 5 && t.FolderId == null),
+ Arg.Any());
+ }
}
internal sealed class TestAuthStateProvider : AuthenticationStateProvider