From 037506a0233227c7d3b44bb518b2deeaa24fc3f9 Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Wed, 11 Jun 2014 23:01:17 -0700 Subject: [PATCH] improve event dnd/resize tests by type-checking for all arguments --- tests/automated/event-dnd.js | 321 +++++++++++++++++--------------- tests/automated/event-resize.js | 200 +++++++++++--------- 2 files changed, 282 insertions(+), 239 deletions(-) diff --git a/tests/automated/event-dnd.js b/tests/automated/event-dnd.js index ab4fc72..f1f3110 100644 --- a/tests/automated/event-dnd.js +++ b/tests/automated/event-dnd.js @@ -1,5 +1,4 @@ describe('eventDrop', function() { - var options; beforeEach(function() { @@ -26,9 +25,9 @@ describe('eventDrop', function() { start: '2014-06-11', allDay: true } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -39,33 +38,23 @@ describe('eventDrop', function() { duration: 100 } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.asDays()).toBe(9); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-20'); + expect(event.end).toBeNull(); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - // only type-check arguments for basic view once here - expect(typeof event).toBe('object'); // TODO: discriminate more - expect(moment.isDuration(delta)).toBe(true); - expect(typeof revertFunc).toBe('function'); - expect(typeof jsEvent).toBe('object'); // TODO: discriminate more - expect(typeof uiEvent).toBe('object'); // " - expect(typeof view).toBe('object'); // " - - expect(delta.asDays()).toBe(9); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-20'); - expect(event.end).toBeNull(); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toBeNull(); - - done(); - }; - $('#cal').fullCalendar(options); + ); }); }); @@ -76,9 +65,9 @@ describe('eventDrop', function() { start: '2014-06-11T06:00:00', allDay: false } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -89,25 +78,23 @@ describe('eventDrop', function() { duration: 100 } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.asDays()).toBe(5); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-16T06:00:00'); + expect(event.end).toBeNull(); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11T06:00:00'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(delta.asDays()).toBe(5); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-16T06:00:00'); - expect(event.end).toBeNull(); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11T06:00:00'); - expect(event.end).toBeNull(); - - done(); - }; - $('#cal').fullCalendar(options); + ); }); }); }); @@ -124,9 +111,9 @@ describe('eventDrop', function() { start: '2014-06-11T06:00:00', allDay: false } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -138,32 +125,23 @@ describe('eventDrop', function() { } }); called = true; + }, + function(event, delta, revertFunc) { + expect(delta.days()).toBe(1); + expect(delta.hours()).toBe(1); + expect(delta.minutes()).toBe(30); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-12T07:30:00'); + expect(event.end).toBeNull(); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11T06:00:00'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - // only type-check arguments for agenda view once here - expect(typeof event).toBe('object'); // TODO: discriminate more - expect(moment.isDuration(delta)).toBe(true); - expect(typeof revertFunc).toBe('function'); - expect(typeof jsEvent).toBe('object'); // TODO: discriminate more - expect(typeof uiEvent).toBe('object'); // " - expect(typeof view).toBe('object'); // " - - expect(delta.days()).toBe(1); - expect(delta.hours()).toBe(1); - expect(delta.minutes()).toBe(30); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-12T07:30:00'); - expect(event.end).toBeNull(); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11T06:00:00'); - expect(event.end).toBeNull(); - - done(); - }; - $('#cal').fullCalendar(options); + ); }); }); @@ -174,9 +152,9 @@ describe('eventDrop', function() { start: '2014-06-11', allDay: true } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -187,24 +165,23 @@ describe('eventDrop', function() { } }); called = true; + }, + function(event, delta, revertFunc) { + expect(delta.days()).toBe(2); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-13'); + expect(event.end).toBeNull(); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(delta.days()).toBe(2); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-13'); - expect(event.end).toBeNull(); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toBeNull(); - - done(); - }; - $('#cal').fullCalendar(options); + ); }); }); @@ -216,9 +193,9 @@ describe('eventDrop', function() { start: '2014-06-11', allDay: true } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -230,43 +207,41 @@ describe('eventDrop', function() { } }); called = true; + }, + function(event, delta, revertFunc) { + expect(delta.days()).toBe(-1); + expect(delta.hours()).toBe(1); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-10T01:00:00'); + expect(event.end).toBeNull(); + expect(event.allDay).toBe(false); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toBeNull(); + expect(event.allDay).toBe(true); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(delta.days()).toBe(-1); - expect(delta.hours()).toBe(1); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-10T01:00:00'); - expect(event.end).toBeNull(); - expect(event.allDay).toBe(false); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toBeNull(); - expect(event.allDay).toBe(true); - - done(); - }; - setTimeout(function() { // hack. scroll state was messed up or something - $('#cal').fullCalendar(options); - },0); + ); }); }); describe('when dragging a timed event to an all-day slot on a different day', function() { it('should be given correct arguments, with whole-day delta', function(done) { + var eventElm; + options.scrollTime = '01:00:00'; options.events = [ { title: 'timed event', start: '2014-06-11T01:00:00', allDay: false } ]; - var called = false; - var eventElm; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen upon drop + + init( + function() { eventElm = $('.fc-event') .simulate('mouseover') // for our dumb optimization .simulate('drag', { @@ -293,30 +268,78 @@ describe('eventDrop', function() { }, 100); } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.days()).toBe(-1); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-10'); + expect(event.end).toBeNull(); + expect(event.allDay).toBe(true); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11T01:00:00'); + expect(event.end).toBeNull(); + expect(event.allDay).toBe(false); + + done(); } - }; - options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(delta.days()).toBe(-1); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-10'); - expect(event.end).toBeNull(); - expect(event.allDay).toBe(true); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11T01:00:00'); - expect(event.end).toBeNull(); - expect(event.allDay).toBe(false); - - done(); - }; - setTimeout(function() { // hack. scroll state was messed up or something - $('#cal').fullCalendar(options); - },0); + ); }); }); }); + + // Initialize a calendar, run a drag, and do type-checking of all arguments for all handlers. + // TODO: more descrimination instead of just checking for 'object' + function init(dragFunc, dropHandler) { + var eventsRendered = false; + + options.eventAfterAllRender = function() { + if (!eventsRendered) { // because event rerendering will happen upon drop + dragFunc(); + eventsRendered = true; + } + }; + options.eventDragStart = function(event, jsEvent, uiEvent, view) { + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); + expect(typeof view).toBe('object'); + }; + options.eventDragStop = function(event, jsEvent, uiEvent, view) { + expect(options.eventDragStart).toHaveBeenCalled(); + + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); + expect(typeof view).toBe('object'); + }; + options.eventDrop = function(event, delta, revertFunc, jsEvent, uiEvent, view) { + expect(options.eventDragStop).toHaveBeenCalled(); + + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(moment.isDuration(delta)).toBe(true); + expect(typeof revertFunc).toBe('function'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); + expect(typeof view).toBe('object'); + + dropHandler.apply(this, arguments); + }; + + spyOn(options, 'eventDragStart').and.callThrough(); + spyOn(options, 'eventDragStop').and.callThrough(); + + setTimeout(function() { // hack. agenda view scroll state would get messed up between tests + $('#cal').fullCalendar(options); + }, 0); + } }); \ No newline at end of file diff --git a/tests/automated/event-resize.js b/tests/automated/event-resize.js index f4335c4..57e2b66 100644 --- a/tests/automated/event-resize.js +++ b/tests/automated/event-resize.js @@ -1,5 +1,4 @@ -describe('eventDrop', function() { - +describe('eventResize', function() { var options; beforeEach(function() { @@ -26,9 +25,9 @@ describe('eventDrop', function() { start: '2014-06-11', allDay: true } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen when resize is over + + init( + function() { $('.fc-event .ui-resizable-handle') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -39,32 +38,23 @@ describe('eventDrop', function() { duration: 100 } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.asDays()).toBe(5); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toEqualMoment('2014-06-17'); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventResize = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(typeof event).toBe('object'); // TODO: discriminate more - expect(moment.isDuration(delta)).toBe(true); - expect(typeof revertFunc).toBe('function'); - expect(typeof jsEvent).toBe('object'); // TODO: discriminate more - expect(typeof view).toBe('object'); // " - ////expect(typeof uiEvent).toBe('object'); // we actually don't even leverage jqui here - - expect(delta.asDays()).toBe(5); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toEqualMoment('2014-06-17'); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toBeNull(); - - done(); - }; - $('#cal').fullCalendar(options); + ); }); }); @@ -96,9 +86,9 @@ describe('eventDrop', function() { start: '2014-06-11', allDay: true } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen when resize is over + + init( + function() { $('.fc-event .ui-resizable-handle') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -108,34 +98,23 @@ describe('eventDrop', function() { duration: 100 } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.asDays()).toBe(2); + expect(delta.hours()).toBe(0); + expect(delta.minutes()).toBe(0); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toEqualMoment('2014-06-14'); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11'); + expect(event.end).toBeNull(); + + done(); } - }; - options.eventResize = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(typeof event).toBe('object'); // TODO: discriminate more - expect(moment.isDuration(delta)).toBe(true); - expect(typeof revertFunc).toBe('function'); - expect(typeof jsEvent).toBe('object'); // TODO: discriminate more - expect(typeof view).toBe('object'); // " - ////expect(typeof uiEvent).toBe('object'); // we actually don't even leverage jqui here - - expect(delta.asDays()).toBe(2); - expect(delta.hours()).toBe(0); - expect(delta.minutes()).toBe(0); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toEqualMoment('2014-06-14'); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11'); - expect(event.end).toBeNull(); - - done(); - }; - setTimeout(function() { // idk - $('#cal').fullCalendar(options); - }, 0); + ); }); }); @@ -147,9 +126,9 @@ describe('eventDrop', function() { end: '2014-06-11T07:00:00', allDay: false } ]; - var called = false; - options.eventAfterAllRender = function() { - if (!called) { // because event rerendering will happen when resize is over + + init( + function() { $('.fc-event .ui-resizable-handle') .simulate('mouseover') // for our dumb optimization .simulate('drag-n-drop', { @@ -159,35 +138,76 @@ describe('eventDrop', function() { duration: 100 } }); - called = true; + }, + function(event, delta, revertFunc) { + expect(delta.days()).toBe(0); + expect(delta.hours()).toBe(2); + expect(delta.minutes()).toBe(30); + expect(delta.seconds()).toBe(0); + expect(delta.milliseconds()).toBe(0); + + expect(event.start).toEqualMoment('2014-06-11T05:00:00'); + expect(event.end).toEqualMoment('2014-06-11T09:30:00'); + revertFunc(); + expect(event.start).toEqualMoment('2014-06-11T05:00:00'); + expect(event.end).toEqualMoment('2014-06-11T07:00:00'); + + done(); } - }; - options.eventResize = function(event, delta, revertFunc, jsEvent, uiEvent, view) { - expect(typeof event).toBe('object'); // TODO: discriminate more - expect(moment.isDuration(delta)).toBe(true); - expect(typeof revertFunc).toBe('function'); - expect(typeof jsEvent).toBe('object'); // TODO: discriminate more - expect(typeof uiEvent).toBe('object'); // " - expect(typeof view).toBe('object'); // " - - expect(delta.days()).toBe(0); - expect(delta.hours()).toBe(2); - expect(delta.minutes()).toBe(30); - expect(delta.seconds()).toBe(0); - expect(delta.milliseconds()).toBe(0); - - expect(event.start).toEqualMoment('2014-06-11T05:00:00'); - expect(event.end).toEqualMoment('2014-06-11T09:30:00'); - revertFunc(); - expect(event.start).toEqualMoment('2014-06-11T05:00:00'); - expect(event.end).toEqualMoment('2014-06-11T07:00:00'); - - done(); - }; - setTimeout(function() { // idk - $('#cal').fullCalendar(options); - }, 0); + ); }); }); }); + + // Initialize a calendar, run a resize, and do type-checking of all arguments for all handlers. + // TODO: more descrimination instead of just checking for 'object' + function init(resizeStartFunc, resizeDoneFunc) { + var eventsRendered = false; + + options.eventAfterAllRender = function() { + if (!eventsRendered) { // because event rerendering will happen when resize is over + resizeStartFunc(); + eventsRendered = true; + } + }; + options.eventResizeStart = function(event, jsEvent, uiEvent, view) { + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); + expect(typeof view).toBe('object'); + }; + options.eventResizeStop = function(event, jsEvent, uiEvent, view) { + expect(options.eventResizeStart).toHaveBeenCalled(); + + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); + expect(typeof view).toBe('object'); + }; + options.eventResize = function(event, delta, revertFunc, jsEvent, uiEvent, view) { + expect(options.eventResizeStop).toHaveBeenCalled(); + + expect(this instanceof Element).toBe(true); + expect(this).toHaveClass('fc-event'); + expect(typeof event).toBe('object'); + expect(moment.isDuration(delta)).toBe(true); + expect(typeof revertFunc).toBe('function'); + expect(typeof jsEvent).toBe('object'); + expect(typeof uiEvent).toBe('object'); // might be a non-jqui dummy object + expect(typeof view).toBe('object'); + + resizeDoneFunc.apply(this, arguments); + }; + + spyOn(options, 'eventResizeStart').and.callThrough(); + spyOn(options, 'eventResizeStop').and.callThrough(); + + setTimeout(function() { // hack. agenda view scroll state would get messed up between tests + $('#cal').fullCalendar(options); + }, 0); + } }); \ No newline at end of file