describe('dndDraggable', function() { var SIMPLE_HTML = '
'; describe('constructor', function() { it('sets the draggable attribute', function() { var element = compileAndLink(SIMPLE_HTML); expect(element.attr('draggable')).toBe('true'); }); it('watches and handles the dnd-disabled-if expression', function() { var element = compileAndLink(''); expect(element.attr('draggable')).toBe('true'); element.scope().disabled = true; element.scope().$digest(); expect(element.attr('draggable')).toBe('false'); element.scope().disabled = false; element.scope().$digest(); expect(element.attr('draggable')).toBe('true'); }); }); describe('dragstart handler', function() { var element, event; beforeEach(function() { element = compileAndLink(SIMPLE_HTML); event = createEvent('dragstart'); }); it('calls setData with serialized data', function() { event._triggerOn(element); expect(event._data).toEqual({'Text': '{"hello":"world"}'}); }); it('stops propagation', function() { event._triggerOn(element); expect(event._propagationStopped).toBe(true); }); it('sets effectAllowed to move by default', function() { event._triggerOn(element); expect(event._dt.effectAllowed).toBe('move'); }); it('sets effectAllowed from dnd-effect-allowed', function() { element = compileAndLink(''); event._triggerOn(element); expect(event._dt.effectAllowed).toBe('copyMove'); }); it('adds CSS classes to element', inject(function($timeout) { event._triggerOn(element); expect(element.hasClass('dndDragging')).toBe(true); expect(element.hasClass('dndDraggingSource')).toBe(false); $timeout.flush(0); expect(element.hasClass('dndDraggingSource')).toBe(true); })); it('invokes dnd-dragstart callback', function() { element = compileAndLink(''); event._triggerOn(element); expect(element.scope().ev).toBe(event.originalEvent); }); it('initializes workarounds', inject(function(dndDropEffectWorkaround, dndDragTypeWorkaround) { event._triggerOn(element); expect(dndDragTypeWorkaround.isDragging).toBe(true); expect(dndDragTypeWorkaround.dragType).toBeUndefined(); expect(dndDropEffectWorkaround.dropEffect).toBe('none'); })); it('initializes workarounds respecting dnd-type', inject(function(dndDragTypeWorkaround) { element = compileAndLink(''); event._triggerOn(element); expect(dndDragTypeWorkaround.dragType).toEqual(4); })); it('does not start dragging if dnd-disable-if is true', function() { element = compileAndLink(''); expect(event._triggerOn(element)).toBe(true); expect(event._defaultPrevented).toBe(false); expect(event._propagationStopped).toBe(false); }); it('sets the dragImage if event was triggered on a dnd-handle', function() { var dragImage; event._dt.setDragImage = function(img) { dragImage = img; }; event.originalEvent._dndHandle = true; event._triggerOn(element); expect(dragImage).toBe(element[0]); }); }); describe('dragend handler', function() { var element, event; beforeEach(function() { element = compileAndLink(SIMPLE_HTML); event = createEvent('dragend'); }); it('stops propagation', function() { event._triggerOn(element); expect(event._propagationStopped).toBe(true); }); it('removes CSS classes from element', inject(function($timeout) { element.addClass('dndDragging'); element.addClass('dndDraggingSource'); event._triggerOn(element); expect(element.hasClass('dndDragging')).toBe(false); expect(element.hasClass('dndDraggingSource')).toBe(true); $timeout.flush(0); expect(element.hasClass('dndDraggingSource')).toBe(false); })); it('resets workarounds', inject(function(dndDragTypeWorkaround) { event._triggerOn(element); expect(dndDragTypeWorkaround.isDragging).toBe(false); })); var dropEffects = {move: 'moved', copy: 'copied', none: 'canceled'}; angular.forEach(dropEffects, function(callback, dropEffect) { it('calls callbacks for dropEffect ' + dropEffect, inject(function(dndDropEffectWorkaround) { var html = ''; element = compileAndLink(html); dndDropEffectWorkaround.dropEffect = dropEffect; event._triggerOn(element); expect(element.scope().ev).toBe(event.originalEvent); expect(element.scope().de).toBe(dropEffect); })); }); }); describe('click handler', function() { it('does nothing if dnd-selected is not set', function() { var element = compileAndLink(SIMPLE_HTML); var event = createEvent('click'); event._triggerOn(element); expect(event._propagationStopped).toBe(false); }); it('invokes dnd-selected callback and stops propagation', function() { var element = compileAndLink(''); var event = createEvent('click'); event._triggerOn(element); expect(event._propagationStopped).toBe(true); expect(element.scope().selected).toBe(true); }); }); });