Skip to content

Commit

Permalink
fix: Update generateEventData to handle daylight savings
Browse files Browse the repository at this point in the history
* Move generateEventData to its own file
* Add tests for generateEventData
Co-authored-by: danieldkim42 <danieldkim42@users.noreply.github.com>
  • Loading branch information
trillium committed Feb 10, 2024
1 parent 3179a9e commit cf0ba91
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 37 deletions.
37 changes: 0 additions & 37 deletions backend/workers/createRecurringEvents.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,43 +75,6 @@ module.exports = (cron, fetch) => {
};
};

function generateEventData(eventData, TODAY_DATE = new Date()) {
const eventDate = new Date(eventData.startTime);
// Create new event
const hours = eventDate.getHours();
const minutes = eventDate.getMinutes();
const seconds = eventDate.getSeconds();
const milliseconds = eventDate.getMilliseconds();

const yearToday = TODAY_DATE.getFullYear();
const monthToday = TODAY_DATE.getMonth();
const dateToday = TODAY_DATE.getDate();

const newEventDate = new Date(yearToday, monthToday, dateToday, hours, minutes, seconds, milliseconds);

const newEndTime = new Date(yearToday, monthToday, dateToday, hours + filteredEvent.hours, minutes, seconds, milliseconds)

const eventToCreate = {
name: eventData.name && eventData.name,
hacknight: eventData.hacknight && eventData.hacknight,
eventType: eventData.eventType && eventData.eventType,
description: eventData.eventDescription && eventData.eventDescription,
project: eventData.project && eventData.project,
date: eventData.date && newEventDate,
startTime: eventData.startTime && newEventDate,
endTime: eventData.endTime && newEndTime,
hours: eventData.hours && eventData.hours
}
if (eventData.hasOwnProperty("location")) {
eventToCreate.location = {
city: eventData.location.city ? eventData.location.city : 'REMOTE',
state: eventData.location.state ? eventData.location.state : 'REMOTE',
country: eventData.location.country ? eventData.location.country : 'REMOTE'
};
}
return eventToCreate
};

async function checkIfEventExists(eventName) {
const events = EVENTS;
// const today = new Date();
Expand Down
59 changes: 59 additions & 0 deletions backend/workers/lib/generateEventData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// grab the updatedDate
// get the timeZone offset
// if timeZone offset differs from the updatedDate to now
// normalize time to the updatedDate

function generateEventData(eventObj, TODAY_DATE = new Date()) {
/**
* Generates event data based on the provided event object and date.
* In the cron job this function normally runs in, it is expected that eventObj.date is the same as TODAY_DATE.
*/

const oldStartTime = new Date(eventObj.startTime);
// Create new event
const oldHours = oldStartTime.getHours();
const oldMinutes = oldStartTime.getMinutes();
const oldSeconds = oldStartTime.getSeconds();
const oldMilliseconds = oldStartTime.getMilliseconds();

const newYear = TODAY_DATE.getFullYear();
const newMonth = TODAY_DATE.getMonth();
const newDate = TODAY_DATE.getDate();

const oldTz = oldStartTime.getTimezoneOffset();
const newTz = TODAY_DATE.getTimezoneOffset();
const tzDiff = oldTz - newTz;

const newEventDate = new Date(newYear, newMonth, newDate, oldHours, oldMinutes, oldSeconds, oldMilliseconds);

const newEndTime = new Date(newYear, newMonth, newDate, oldHours + eventObj.hours, oldMinutes, oldSeconds, oldMilliseconds)

if (tzDiff != 0) {
newEventDate.setMinutes(newEventDate.getMinutes() + tzDiff)
newEndTime.setMinutes(newEndTime.getMinutes() + tzDiff)
}

const eventToCreate = {
name: eventObj.name && eventObj.name,
hacknight: eventObj.hacknight && eventObj.hacknight,
eventType: eventObj.eventType && eventObj.eventType,
description: eventObj.eventDescription && eventObj.eventDescription,
project: eventObj.project && eventObj.project,
date: eventObj.date && newEventDate,
startTime: eventObj.startTime && newEventDate,
endTime: eventObj.endTime && newEndTime,
hours: eventObj.hours && eventObj.hours
}

if (eventObj.hasOwnProperty("location")) {
eventToCreate.location = {
city: eventObj.location.city ? eventObj.location.city : 'REMOTE',
state: eventObj.location.state ? eventObj.location.state : 'REMOTE',
country: eventObj.location.country ? eventObj.location.country : 'REMOTE'
};
}

return eventToCreate
};

module.exports = { generateEventData };
97 changes: 97 additions & 0 deletions backend/workers/lib/generateEventData.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
const { generateEventData } = require('./generateEventData.js');

describe('generateEventData', () => {
test("generateEventData fn() generates expected startTime", () => {
const testDate = new Date('2024-02-07T10:00:00.000Z')
const testDate2nd = new Date('2024-02-07T10:00:00.000Z')

const mockData = {
name: 'Test Event',
date: new Date('2024-02-07T10:00:00.000Z'),
startTime: new Date('2024-02-07T10:00:00.000Z'),
endTime: new Date(testDate2nd.setHours(testDate2nd.getHours() + 3)),
updatedDate: testDate,
hours: 3,
};

const result = generateEventData(mockData, testDate);

// expect(result.startTime).toEqual(new Date('2024-02-07T12:00:00'));
expect(result.startTime).toEqual(mockData.startTime);
});

test("generateEventData fn() generates expected endTime (startTime + hours)", () => {
const testDate = new Date('2024-02-07T10:00:00.000Z')
const testDate2nd = new Date('2024-02-07T10:00:00.000Z')

const mockData = {
eventType: 'Workshop',
date: testDate,
startTime: new Date('2024-02-07T10:00:00.000Z'),
endTime: new Date(testDate2nd.setHours(testDate2nd.getHours() + 3)),
updatedDate: testDate,
hours: 3,
};

const result = generateEventData(mockData, testDate);
expect(result.endTime).toEqual(mockData.endTime);
});

test("generateEventData fn() creates proper times with data lifted from dev.db", () => {
const devDbData = {
date: "2023-03-23T03:00:00.706Z",
startTime: "2023-03-23T03:00:00.706Z",
endTime: "2023-03-23T04:00:00.706Z",
hours: 1,
createdDate: "2023-03-23T01:26:30.706Z",
updatedDate: "2023-03-23T01:26:30.706Z",
}

const newEndTime = new Date(devDbData.startTime);

const newEndTimePlusHours = new Date(newEndTime.setHours(newEndTime.getHours() + devDbData.hours))
const result = generateEventData(devDbData, new Date(devDbData.startTime));
expect(result.endTime).toEqual(newEndTimePlusHours);
});

test("Creates new time step with respect to daylight savings", () => {
const devDbData = {
date: "2023-03-23T03:00:00.706Z",
startTime: "2023-03-23T03:00:00.706Z",
endTime: "2023-03-23T04:00:00.706Z",
hours: 1,
createdDate: "2023-03-23T01:26:30.706Z",
updatedDate: "2023-03-23T01:26:30.706Z",
}

const newStartTime = new Date("2023-11-23T03:00:00.706Z");
const newEndTime = new Date("2023-11-23T03:00:00.706Z");
newEndTime.setHours(newStartTime.getHours() + 1)

const result = generateEventData(devDbData, newStartTime);

expect(result.startTime).toEqual(newStartTime);
expect(result.endTime).toEqual(newEndTime);
});

test("Creates new time step with respect to daylight savings", () => {
const devDbData = {
date: "2024-02-23T03:00:00.706Z",
startTime: "2024-02-23T03:00:00.706Z",
endTime: "2024-02-23T04:00:00.706Z",
hours: 1,
createdDate: "2023-03-23T01:26:30.706Z",
updatedDate: "2024-02-23T04:00:00.706Z",
}

const newStartTime = new Date("2024-04-23T03:00:00.706Z");
const newEndTime = new Date("2024-04-23T03:00:00.706Z");
newEndTime.setHours(newStartTime.getHours() + 1)

const result = generateEventData(devDbData, newStartTime);

expect(result.startTime).toEqual(newStartTime);
expect(result.endTime).toEqual(newEndTime);
});

})

0 comments on commit cf0ba91

Please sign in to comment.