generated from hackforla/.github-hackforla-base-repo-template
-
-
Notifications
You must be signed in to change notification settings - Fork 78
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: Update generateEventData to handle daylight savings
* Move generateEventData to its own file * Add tests for generateEventData Co-authored-by: danieldkim42 <danieldkim42@users.noreply.github.com>
- Loading branch information
Showing
3 changed files
with
156 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); | ||
|
||
}) |