2024-12-16 17:24:37 +03:00

782 lines
28 KiB
JavaScript

/**
* @copyright Copyright (c) 2019 Georg Ehrke
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import eventDrop from "../../../../../src/fullcalendar/interaction/eventDrop.js";
import { getDurationValueFromFullCalendarDuration} from "../../../../../src/fullcalendar/duration.js";
import getTimezoneManager from '../../../../../src/services/timezoneDataProviderService.js'
import {getObjectAtRecurrenceId} from "../../../../../src/utils/calendarObject.js";
jest.mock("../../../../../src/fullcalendar/duration.js")
jest.mock('../../../../../src/services/timezoneDataProviderService.js')
jest.mock("../../../../../src/utils/calendarObject.js")
describe('fullcalendar/eventDrop test suite', () => {
beforeEach(() => {
getDurationValueFromFullCalendarDuration.mockClear()
getTimezoneManager.mockClear()
getObjectAtRecurrenceId.mockClear()
})
it('should properly drop a non-recurring event', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch
.mockResolvedValueOnce(calendarObject) // getEventByObjectId
.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(2)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(store.dispatch).toHaveBeenNthCalledWith(2, 'updateCalendarObject', { calendarObject })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(1)
expect(eventComponent.shiftByDuration).toHaveBeenNthCalledWith(1, { calendarJsDurationValue: true, hours: 5 }, false, { calendarJsTimezone: true, tzid: 'America/New_York' }, { calendarJsDurationValue: true, days: 1 }, { calendarJsDurationValue: true, hours: 2 })
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(1)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(0)
})
it('should properly drop a non-recurring event - unknown timezone', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce(null)
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'UTC' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(getTimezoneForId).toHaveBeenCalledTimes(2)
expect(getTimezoneForId).toHaveBeenNthCalledWith(1, 'America/New_York')
expect(getTimezoneForId).toHaveBeenNthCalledWith(2, 'UTC')
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(2)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(store.dispatch).toHaveBeenNthCalledWith(2, 'updateCalendarObject', { calendarObject })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(1)
expect(eventComponent.shiftByDuration).toHaveBeenNthCalledWith(1, { calendarJsDurationValue: true, hours: 5 }, false, { calendarJsTimezone: true, tzid: 'UTC' }, { calendarJsDurationValue: true, days: 1 }, { calendarJsDurationValue: true, hours: 2 })
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(1)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(0)
})
it('should properly drop a recurring event', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(true),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(2)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(store.dispatch).toHaveBeenNthCalledWith(2, 'updateCalendarObject', { calendarObject })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(1)
expect(eventComponent.shiftByDuration).toHaveBeenNthCalledWith(1, { calendarJsDurationValue: true, hours: 5 }, false, { calendarJsTimezone: true, tzid: 'America/New_York' }, { calendarJsDurationValue: true, days: 1 }, { calendarJsDurationValue: true, hours: 2 })
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(1)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(1)
expect(eventComponent.createRecurrenceException).toHaveBeenNthCalledWith(1)
expect(revert).toHaveBeenCalledTimes(0)
})
it('should revert if delta duration could not be parsed', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce(false)
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(0)
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(0)
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(0)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert if default allday duration could not be parsed', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce(false)
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(0)
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(0)
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(0)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert if default timed duration could not be parsed', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce(false)
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(0)
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(0)
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(0)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert the action when the object was not found', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockRejectedValueOnce({ message: 'error message' }) // getEventByObjectId
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(1)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(0)
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(0)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert the action when the recurrence was not found', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(null)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(1)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert the action when shiftByDuration throws an exception', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn().mockImplementation(() => {
throw new Error();
}),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockResolvedValueOnce() // updateCalendarObject
store.commit = jest.fn()
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(1)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(store.commit).toHaveBeenCalledTimes(1)
expect(store.commit).toHaveBeenNthCalledWith(1, 'resetCalendarObjectToDav', { calendarObject: calendarObject })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(1)
expect(eventComponent.shiftByDuration).toHaveBeenNthCalledWith(1, { calendarJsDurationValue: true, hours: 5 }, false, { calendarJsTimezone: true, tzid: 'America/New_York' }, { calendarJsDurationValue: true, days: 1 }, { calendarJsDurationValue: true, hours: 2 })
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(0)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
it('should revert the action when there was an error updating the event', async () => {
const store = {
dispatch: jest.fn()
}
const fcAPI = {
getOption: jest.fn()
.mockReturnValueOnce({ days: 1 })
.mockReturnValueOnce({ hours: 2 })
.mockReturnValueOnce('America/New_York'),
}
const event = {
allDay: false,
extendedProps: {
objectId: 'object123',
recurrenceId: '1573554842'
}
}
const delta = {
hours: 5
}
const revert = jest.fn()
getDurationValueFromFullCalendarDuration
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 5 })
.mockReturnValueOnce({ calendarJsDurationValue: true, days: 1 })
.mockReturnValueOnce({ calendarJsDurationValue: true, hours: 2 })
const getTimezoneForId = jest.fn()
.mockReturnValueOnce({ calendarJsTimezone: true, tzid: 'America/New_York' })
getTimezoneManager
.mockReturnValue({
getTimezoneForId
})
const eventComponent = {
shiftByDuration: jest.fn(),
canCreateRecurrenceExceptions: jest.fn().mockReturnValue(false),
createRecurrenceException: jest.fn(),
}
const calendarObject = {
_isCalendarObject: true,
}
getObjectAtRecurrenceId
.mockReturnValue(eventComponent)
store.dispatch.mockResolvedValueOnce(calendarObject) // getEventByObjectId
store.dispatch.mockImplementationOnce(() => {
throw new Error()
}) // updateCalendarObject
store.commit = jest.fn()
const eventDropFunction = eventDrop(store, fcAPI)
await eventDropFunction({ event, delta, revert })
expect(fcAPI.getOption).toHaveBeenCalledTimes(3)
expect(fcAPI.getOption).toHaveBeenNthCalledWith(1, 'defaultAllDayEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(2, 'defaultTimedEventDuration')
expect(fcAPI.getOption).toHaveBeenNthCalledWith(3, 'timeZone')
expect(getDurationValueFromFullCalendarDuration).toHaveBeenCalledTimes(3)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(1, delta)
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(2, { days: 1})
expect(getDurationValueFromFullCalendarDuration).toHaveBeenNthCalledWith(3, { hours: 2 })
expect(store.dispatch).toHaveBeenCalledTimes(2)
expect(store.dispatch).toHaveBeenNthCalledWith(1, 'getEventByObjectId', { objectId: 'object123' })
expect(store.dispatch).toHaveBeenNthCalledWith(2, 'updateCalendarObject', { calendarObject })
expect(store.commit).toHaveBeenCalledTimes(1)
expect(store.commit).toHaveBeenNthCalledWith(1, 'resetCalendarObjectToDav', { calendarObject: calendarObject })
expect(eventComponent.shiftByDuration).toHaveBeenCalledTimes(1)
expect(eventComponent.shiftByDuration).toHaveBeenNthCalledWith(1, { calendarJsDurationValue: true, hours: 5 }, false, { calendarJsTimezone: true, tzid: 'America/New_York' }, { calendarJsDurationValue: true, days: 1 }, { calendarJsDurationValue: true, hours: 2 })
expect(eventComponent.canCreateRecurrenceExceptions).toHaveBeenCalledTimes(1)
expect(eventComponent.createRecurrenceException).toHaveBeenCalledTimes(0)
expect(revert).toHaveBeenCalledTimes(1)
})
})