import { describe, expect, it } from 'vitest' import { resolveDrop, shouldAllowMove } from './drag' function makeList(columnId?: string): HTMLElement { const element = document.createElement('div') if (columnId !== undefined) element.dataset.columnId = columnId return element } function makeItem(taskId?: string): HTMLElement { const element = document.createElement('article') if (taskId !== undefined) element.dataset.taskId = taskId return element } describe('resolveDrop', () => { it('解析出任务 id、目标列与下标', () => { const drop = resolveDrop({ item: makeItem('task-1'), to: makeList('doing'), newIndex: 2, }) expect(drop).toEqual({ taskId: 'task-1', toColumn: 'doing', toIndex: 2 }) }) it('下标为 0 是合法值', () => { expect(resolveDrop({ item: makeItem('t'), to: makeList('todo'), newIndex: 0 })).toEqual({ taskId: 't', toColumn: 'todo', toIndex: 0, }) }) it('缺少 taskId 时返回 null', () => { expect(resolveDrop({ item: makeItem(), to: makeList('todo'), newIndex: 0 })).toBeNull() }) it('目标列 id 非法时返回 null', () => { expect( resolveDrop({ item: makeItem('t'), to: makeList('archived'), newIndex: 0 }), ).toBeNull() expect(resolveDrop({ item: makeItem('t'), to: makeList(), newIndex: 0 })).toBeNull() }) it('下标缺失或非法时返回 null', () => { const item = makeItem('t') const to = makeList('todo') expect(resolveDrop({ item, to })).toBeNull() expect(resolveDrop({ item, to, newIndex: -1 })).toBeNull() expect(resolveDrop({ item, to, newIndex: 1.5 })).toBeNull() }) }) describe('shouldAllowMove', () => { it('列内为全量渲染时一律允许', () => { const a = makeList('todo') const b = makeList('doing') expect(shouldAllowMove(a, a, false)).toBe(true) expect(shouldAllowMove(a, b, false)).toBe(true) }) it('列内为子集时禁止列内排序', () => { const column = makeList('todo') expect(shouldAllowMove(column, column, true)).toBe(false) }) it('列内为子集时仍允许跨列移动', () => { expect(shouldAllowMove(makeList('todo'), makeList('doing'), true)).toBe(true) }) it('子集状态下元素信息缺失时保守拒绝', () => { expect(shouldAllowMove(null, makeList('todo'), true)).toBe(false) expect(shouldAllowMove(makeList('todo'), undefined, true)).toBe(false) }) })