From dc2037ee7532f614996d614efee8a191aaea2926 Mon Sep 17 00:00:00 2001 From: SeinopSys Date: Sun, 3 Apr 2022 02:13:15 +0200 Subject: [PATCH] fix coverage for draggable utils --- assets/js/utils/__tests__/draggable.spec.ts | 24 ++++++++++++++++++++- assets/js/utils/draggable.ts | 10 ++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/assets/js/utils/__tests__/draggable.spec.ts b/assets/js/utils/__tests__/draggable.spec.ts index 9c3cd858..2dea124b 100644 --- a/assets/js/utils/__tests__/draggable.spec.ts +++ b/assets/js/utils/__tests__/draggable.spec.ts @@ -1,4 +1,4 @@ -import { initDraggables } from '../draggable'; +import { clearDragSource, initDraggables } from '../draggable'; import { fireEvent } from '@testing-library/dom'; import { getRandomArrayItem } from '../../../test/randomness'; @@ -115,6 +115,14 @@ describe('Draggable Utilities', () => { expect(mockEvent.dataTransfer?.effectAllowed).toEqual('move'); }); + + it('should not throw if the event has no dataTransfer property', () => { + initDraggables(); + + const mockEvent = createDragEvent('dragstart'); + delete (mockEvent as Record).dataTransfer; + expect(() => fireEvent(mockDraggable, mockEvent)).not.toThrow(); + }); }); describe('dragOver', () => { @@ -228,6 +236,20 @@ describe('Draggable Utilities', () => { boundingBoxSpy.mockRestore(); } }); + + it('should not throw if drag source element is not set', () => { + clearDragSource(); + initDraggables(); + + const mockSecondDraggable = createDraggableElement(); + mockDragContainer.appendChild(mockSecondDraggable); + + const mockDropEvent = createDragEvent('drop'); + fireEvent(mockDraggable, mockDropEvent); + + expect(() => fireEvent(mockDraggable, mockDropEvent)).not.toThrow(); + expect(mockDropEvent.defaultPrevented).toBe(true); + }); }); describe('dragEnd', () => { diff --git a/assets/js/utils/draggable.ts b/assets/js/utils/draggable.ts index f4676dcc..f1920a75 100644 --- a/assets/js/utils/draggable.ts +++ b/assets/js/utils/draggable.ts @@ -53,7 +53,7 @@ function drop(event: DragEvent, target: HTMLElement) { } function dragEnd(event: DragEvent, target: HTMLElement) { - dragSrcEl?.classList.remove('dragging'); + clearDragSource(); if (target.parentNode) { $$('.over', target.parentNode).forEach(t => t.classList.remove('over')); @@ -78,3 +78,11 @@ export function initDraggables() { document.addEventListener('dragend', wrapper(dragEnd)); document.addEventListener('drop', wrapper(drop)); } + +export function clearDragSource() { + if (!dragSrcEl) return; + + dragSrcEl.classList.remove('dragging'); + // eslint-disable-next-line no-undefined + dragSrcEl = undefined; +}