Skip to content

Commit de2be13

Browse files
committed
添加TreeView拖拽功能测试
1 parent ab77b46 commit de2be13

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed

test/UnitTest/Components/TreeViewTest.cs

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6+
using Microsoft.AspNetCore.Components.Web;
7+
68
namespace UnitTest.Components;
79

810
public class TreeViewTest : BootstrapBlazorTestBase
@@ -1221,6 +1223,158 @@ public async Task ShowToolbar_Ok()
12211223
Assert.Contains("test-toolbar-template", cut.Markup);
12221224
}
12231225

1226+
[Fact]
1227+
public async Task Draggable_Basic_MoveAsLastChild()
1228+
{
1229+
// Arrange
1230+
var items = new List<TreeFoo>
1231+
{
1232+
new() { Text = "Root", Id = "1" },
1233+
new() { Text = "Child1", Id = "2", ParentId = "1" },
1234+
new() { Text = "Child2", Id = "3", ParentId = "1" },
1235+
new() { Text = "Root2", Id = "4" },
1236+
new() { Text = "Child3", Id = "5", ParentId = "4" }
1237+
};
1238+
var nodes = TreeFoo.CascadingTree(items);
1239+
nodes[0].IsExpand = true;
1240+
var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb =>
1241+
{
1242+
pb.Add(a => a.Items, nodes);
1243+
pb.Add(a => a.ItemDraggable, true);
1244+
});
1245+
1246+
var rows = cut.FindComponents<TreeViewRow<TreeFoo>>();
1247+
var dragSource = rows[1]; // Child1
1248+
var dragTarget = rows[3]; // Root2
1249+
1250+
var dragSourceElement = dragSource.Find(".tree-node");
1251+
var dragTargetDropZone = dragTarget.Find(".tree-drop-child-inside");
1252+
// 1. 触发 dragstart
1253+
await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs());
1254+
// 2. 触发 dragenter 到目标 drop zone
1255+
await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs());
1256+
// 3. 触发 drop 到目标 drop zone
1257+
await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs());
1258+
// 成功移动,原对象销毁,不触发dragend
1259+
1260+
// Assert
1261+
Assert.Equal("Root2", nodes[1].Text);
1262+
Assert.Equal(2, nodes[1].Items.Count);
1263+
Assert.Equal("Child1", nodes[1].Items[1].Text);
1264+
Assert.Equal(nodes[1], nodes[1].Items[1].Parent);
1265+
}
1266+
1267+
[Fact]
1268+
public async Task Draggable_Basic_MoveAsSiblingBelow()
1269+
{
1270+
// Arrange
1271+
var items = new List<TreeFoo>
1272+
{
1273+
new() { Text = "Root", Id = "1" },
1274+
new() { Text = "Child1", Id = "2", ParentId = "1" },
1275+
new() { Text = "Child2", Id = "3", ParentId = "1" }
1276+
};
1277+
var nodes = TreeFoo.CascadingTree(items);
1278+
nodes[0].IsExpand = true;
1279+
var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb =>
1280+
{
1281+
pb.Add(a => a.Items, nodes);
1282+
pb.Add(a => a.ItemDraggable, true);
1283+
});
1284+
1285+
var rows = cut.FindComponents<TreeViewRow<TreeFoo>>();
1286+
var dragSource = rows[1]; // Child1
1287+
var dragTarget = rows[2]; // Child2
1288+
1289+
// 获取可拖拽的 DOM 元素(DynamicElement)
1290+
var dragSourceElement = dragSource.Find(".tree-node");
1291+
var dragTargetDropZone = dragTarget.Find(".tree-drop-child-below");
1292+
// 1. 触发 dragstart
1293+
await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs());
1294+
// 2. 触发 dragenter 到目标 drop zone
1295+
await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs());
1296+
// 3. 触发 drop 到目标 drop zone
1297+
await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs());
1298+
// 成功移动,原对象销毁,不触发dragend
1299+
1300+
// Assert
1301+
var parent = nodes[0];
1302+
Assert.Equal(2, parent.Items.Count);
1303+
Assert.Equal("Child2", parent.Items[0].Text);
1304+
Assert.Equal("Child1", parent.Items[1].Text);
1305+
}
1306+
1307+
[Fact]
1308+
public async Task Draggable_OnDrop_Cancel()
1309+
{
1310+
// Arrange
1311+
var items = new List<TreeFoo>
1312+
{
1313+
new() { Text = "Root", Id = "1" },
1314+
new() { Text = "Child1", Id = "2", ParentId = "1" },
1315+
new() { Text = "Child2", Id = "3", ParentId = "1" }
1316+
};
1317+
var nodes = TreeFoo.CascadingTree(items);
1318+
nodes[0].IsExpand = true;
1319+
var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb =>
1320+
{
1321+
pb.Add(a => a.Items, nodes);
1322+
pb.Add(a => a.ItemDraggable, true);
1323+
pb.Add(a => a.OnDrop, args => Task.FromResult(false)); // 拒绝拖拽
1324+
});
1325+
1326+
var rows = cut.FindComponents<TreeViewRow<TreeFoo>>();
1327+
var dragSource = rows[1]; // Child1
1328+
var dragTarget = rows[2]; // Child2
1329+
1330+
// 获取可拖拽的 DOM 元素(DynamicElement)
1331+
var dragSourceElement = dragSource.Find(".tree-node");
1332+
var dragTargetDropZone = dragTarget.Find(".tree-drop-child-below");
1333+
// 1. 触发 dragstart
1334+
await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs());
1335+
// 2. 触发 dragenter 到目标 drop zone
1336+
await dragTargetDropZone.TriggerEventAsync("ondragenter", new DragEventArgs());
1337+
// 3. 触发 drop 到目标 drop zone
1338+
await dragTargetDropZone.TriggerEventAsync("ondrop", new DragEventArgs());
1339+
// 4. 触发 dragend
1340+
await dragSourceElement.TriggerEventAsync("ondragend", new DragEventArgs());
1341+
1342+
// Assert: 顺序未变
1343+
var parent = nodes[0];
1344+
Assert.Equal("Child1", parent.Items[0].Text);
1345+
Assert.Equal("Child2", parent.Items[1].Text);
1346+
}
1347+
1348+
[Fact]
1349+
public async Task Draggable_DragClassState()
1350+
{
1351+
// Arrange
1352+
var items = new List<TreeFoo>
1353+
{
1354+
new() { Text = "Root", Id = "1" }
1355+
};
1356+
var nodes = TreeFoo.CascadingTree(items);
1357+
var cut = Context.RenderComponent<TreeView<TreeFoo>>(pb =>
1358+
{
1359+
pb.Add(a => a.Items, nodes);
1360+
pb.Add(a => a.ItemDraggable, true);
1361+
});
1362+
1363+
var row = cut.FindComponent<TreeViewRow<TreeFoo>>();
1364+
var dragEvent = new DragEventArgs();
1365+
1366+
// 获取可拖拽的 DOM 元素
1367+
var dragSourceElement = row.Find(".tree-node");
1368+
1369+
// 触发拖拽开始
1370+
await dragSourceElement.TriggerEventAsync("ondragstart", new DragEventArgs());
1371+
Assert.Contains("tree-drop-pass", row.Markup);
1372+
1373+
// 触发拖拽结束
1374+
await dragSourceElement.TriggerEventAsync("ondragend", new DragEventArgs());
1375+
Assert.DoesNotContain("tree-drop-pass", row.Markup);
1376+
}
1377+
12241378
class MockTree<TItem> : TreeView<TItem> where TItem : class
12251379
{
12261380
public bool TestComparerItem(TItem? a, TItem? b) => base.Equals(a, b);

0 commit comments

Comments
 (0)