Skip to content
File

Blob: tests/client/components/editor/extensions/block-drag-drop.test.ts

typescript47 lines
1import { describe, expect, it } from "vitest";
2import {
3 resolveMovedTopLevelDropTarget,
4 resolveTopLevelDropTarget,
5 type TopLevelBlockRect,
6} from "@/client/components/editor/extensions/block-drag-drop";
7 
8describe("drag-drop boundary resolution", () => {
9 const blocks: TopLevelBlockRect[] = [
10 { pos: 0, end: 3, top: 100, bottom: 140, left: 40, right: 640 },
11 { pos: 3, end: 6, top: 152, bottom: 192, left: 40, right: 640 },
12 { pos: 6, end: 9, top: 204, bottom: 244, left: 40, right: 640 },
13 ];
14 
15 it("drops before the first block when hovering above it", () => {
16 expect(resolveTopLevelDropTarget(blocks, 90)).toBe(0);
17 });
18 
19 it("uses the top half of a block for the boundary before it", () => {
20 expect(resolveTopLevelDropTarget(blocks, 110)).toBe(0);
21 expect(resolveTopLevelDropTarget(blocks, 160)).toBe(3);
22 });
23 
24 it("uses the bottom half of a block for the boundary after it", () => {
25 expect(resolveTopLevelDropTarget(blocks, 135)).toBe(3);
26 expect(resolveTopLevelDropTarget(blocks, 185)).toBe(6);
27 });
28 
29 it("maps the visual gap before the next block to the boundary before that block", () => {
30 expect(resolveTopLevelDropTarget(blocks, 146)).toBe(3);
31 expect(resolveTopLevelDropTarget(blocks, 198)).toBe(6);
32 });
33 
34 it("drops after the last block when hovering below it", () => {
35 expect(resolveTopLevelDropTarget(blocks, 260)).toBe(9);
36 });
37 
38 it("keeps the first slot sticky for internal block moves until the pointer clears the first block", () => {
39 expect(resolveMovedTopLevelDropTarget(blocks, 138, 0)).toBe(0);
40 expect(resolveMovedTopLevelDropTarget(blocks, 141, 0)).toBe(3);
41 });
42 
43 it("does not make later slots sticky", () => {
44 expect(resolveMovedTopLevelDropTarget(blocks, 186, 3)).toBe(6);
45 });
46});