Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding flexible day calendar #379

Merged
merged 2 commits into from
Oct 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
263 changes: 263 additions & 0 deletions __tests__/__renderer__/classes/FlexibleDayCalendar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
/* eslint-disable no-undef */

const Store = require('electron-store');
const { defaultPreferences } = require('../../../js/user-preferences');
const { CalendarFactory } = require('../../../js/classes/CalendarFactory');

window.$ = window.jQuery = require('jquery');

window.$.fn.extend({
mousewheel: function() {
/*mocked empty function*/
},

unmousewheel: function() {
/*mocked empty function*/
}
});

describe('FlexibleDayCalendar class Tests', () => {
process.env.NODE_ENV = 'test';

const flexibleStore = new Store({name: 'flexible-store'});
const waivedWorkdays = new Store({name: 'waived-workdays'});

flexibleStore.clear();
const regularEntries = {
'2020-3-1': {'values': ['08:00', '12:00', '13:00', '17:00']},
'2020-3-2': {'values': ['10:00', '18:00']}
};
flexibleStore.set(regularEntries);

waivedWorkdays.clear();
const waivedEntries = {
'2019-12-31': { reason: 'New Year\'s eve', hours: '08:00' },
'2020-01-01': { reason: 'New Year\'s Day', hours: '08:00' },
'2020-04-10': { reason: 'Good Friday', hours: '08:00' }
};
waivedWorkdays.set(waivedEntries);

const today = new Date();
let testPreferences = defaultPreferences;
testPreferences['number-of-entries'] = 'flexible';
araujoarthur0 marked this conversation as resolved.
Show resolved Hide resolved
testPreferences['view'] = 'day';
let calendar = CalendarFactory.getInstance(testPreferences);

test('FlexibleDayCalendar starts with today\'s date', () => {
expect(calendar.constructor.name).toBe('FlexibleDayCalendar');
expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarYear()).toBe(today.getFullYear());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
});

test('FlexibleDayCalendar "today" methods return today\'s date', () => {
expect(calendar._getTodayDate()).toBe(today.getDate());
expect(calendar._getTodayYear()).toBe(today.getFullYear());
expect(calendar._getTodayMonth()).toBe(today.getMonth());
});

test('FlexibleDayCalendar internal storage correct loading', () => {
expect(calendar._internalStore['2020-3-1']).toStrictEqual(regularEntries['2020-3-1']);
expect(calendar._getStore('2020-3-1')).toStrictEqual(regularEntries['2020-3-1']['values']);
expect(calendar._internalStore['2010-3-1']).toBe(undefined);
expect(calendar._getStore('2010-3-1')).toStrictEqual([]);

expect(Object.keys(calendar._internalStore).length).toStrictEqual(2);
expect(flexibleStore.size).toStrictEqual(2);

calendar._setStore('2010-3-1', ['05:00']);
expect(calendar._internalStore['2010-3-1']).toStrictEqual({'values': ['05:00']});
expect(calendar._getStore('2010-3-1')).toStrictEqual(['05:00']);

expect(Object.keys(calendar._internalStore).length).toStrictEqual(3);
expect(flexibleStore.size).toStrictEqual(3);

calendar._removeStore('2010-3-1');
expect(calendar._internalStore['2010-3-1']).toBe(undefined);
expect(calendar._getStore('2010-3-1')).toStrictEqual([]);

// remove just sets the value as undefined in internal store, if it existed
expect(Object.keys(calendar._internalStore).length).toStrictEqual(3);
expect(flexibleStore.size).toStrictEqual(2);
});

test('FlexibleDayCalendar internal waiver storage correct loading', () => {
// Waiver Store internally saves the human month index, but the calendar methods use JS month index
expect(calendar._internalWaiverStore['2019-12-31']).toStrictEqual({ reason: 'New Year\'s eve', hours: '08:00' });
expect(calendar._getWaiverStore(31, 11, 2019)).toStrictEqual({ reason: 'New Year\'s eve', hours: '08:00' });
expect(calendar._internalWaiverStore['2010-12-31']).toStrictEqual(undefined);
expect(calendar._getWaiverStore(31, 11, 2010)).toStrictEqual(undefined);

expect(waivedWorkdays.size).toStrictEqual(3);
expect(Object.keys(calendar._internalWaiverStore).length).toStrictEqual(3);

const newWaivedEntry = {
'2010-12-31': { reason: 'New Year\'s eve', hours: '08:00' }
};
waivedWorkdays.set(newWaivedEntry);

expect(calendar._internalWaiverStore['2010-12-31']).toStrictEqual(undefined);
expect(calendar._getWaiverStore(31, 11, 2010)).toStrictEqual(undefined);

calendar.loadInternalWaiveStore();

expect(Object.keys(calendar._internalWaiverStore).length).toStrictEqual(4);

expect(calendar._internalWaiverStore['2010-12-31']).toStrictEqual({ reason: 'New Year\'s eve', hours: '08:00' });
expect(calendar._getWaiverStore(31, 11, 2010)).toStrictEqual({ reason: 'New Year\'s eve', hours: '08:00' });
});

test('FlexibleDayCalendar Day Changes', () => {
expect(calendar._getCalendarDate()).toBe(today.getDate());

let expectedNextDay = new Date(today);
expectedNextDay.setDate(expectedNextDay.getDate() + 1);
let expectedPrevDay = new Date(today);
expectedPrevDay.setDate(expectedPrevDay.getDate() - 1);

calendar._nextDay();
expect(calendar._getCalendarDate()).toBe(expectedNextDay.getDate());
expect(calendar._isCalendarOnDate(expectedNextDay)).toBeTruthy();
expect(calendar._isCalendarOnDate(expectedPrevDay)).not.toBeTruthy();

calendar._prevDay();
expect(calendar._getCalendarDate()).toBe(today.getDate());

calendar._prevDay();
expect(calendar._getCalendarDate()).toBe(expectedPrevDay.getDate());
expect(calendar._isCalendarOnDate(expectedNextDay)).not.toBeTruthy();
expect(calendar._isCalendarOnDate(expectedPrevDay)).toBeTruthy();

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());

calendar._changeDay(1);
expect(calendar._getCalendarDate()).toBe(expectedNextDay.getDate());

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());
});

test('FlexibleDayCalendar Month Changes', () => {
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
const expectedNextMonth = today.getMonth() + 1 === 12 ? 0 : (today.getMonth() + 1);
const expectedPrevMonth = today.getMonth() === 0 ? 11 : (today.getMonth() - 1);

// The Distance to next month is the amount of days in the month minus the current day, plust 2
// The plus 2 accounts for "finishing" today and moving to the next day (of the next month)
const distToNextMonth = (new Date(today.getFullYear(), today.getMonth(), 0)).getDate() - today.getDate() + 2;
const distToPrevMonth = today.getDate() + 1;

for (let i = 0; i < distToNextMonth; i++) {
calendar._nextDay();
}

expect(calendar._getCalendarMonth()).toBe(expectedNextMonth);

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());

for (let i = 0; i < distToPrevMonth; i++) {
calendar._prevDay();
}

expect(calendar._getCalendarMonth()).toBe(expectedPrevMonth);

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
});

test('FlexibleDayCalendar Year Changes', () => {
expect(calendar._getCalendarYear()).toBe(today.getFullYear());
const expectedNextYear = today.getFullYear() + 1;
const expectedPrevYear = today.getFullYear() - 1;

for (let i = 0; i < 365; i++) {
calendar._nextDay();
}

expect(calendar._getCalendarYear()).toBe(expectedNextYear);

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
expect(calendar._getCalendarYear()).toBe(today.getFullYear());

for (let i = 0; i < 365; i++) {
calendar._prevDay();
}

expect(calendar._getCalendarYear()).toBe(expectedPrevYear);

calendar._goToCurrentDate();
expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
expect(calendar._getCalendarYear()).toBe(today.getFullYear());
});

describe('FlexibleDayCalendar RefreshOnDayChange', () => {
test('FlexibleDayCalendar refresh set correctly', () => {
// Calendar is set as if someone was looking at previous day
calendar._prevDay();
let prevDayDate = calendar._calendarDate;

// Refreshing with the date being looked at should push it to today
calendar.refreshOnDayChange(prevDayDate.getDate(), prevDayDate.getMonth(), prevDayDate.getFullYear());

expect(calendar._getCalendarDate()).toBe(today.getDate());
expect(calendar._getCalendarYear()).toBe(today.getFullYear());
expect(calendar._getCalendarMonth()).toBe(today.getMonth());
});

test('FlexibleDayCalendar refresh set to another day', () => {
// Calendar is set as if someone was looking at previous day
calendar._prevDay();

// Refreshing with a date not being looked at should not push it to today
calendar.refreshOnDayChange(today.getDate(), today.getMonth(), today.getFullYear());

expect(calendar._getCalendarDate()).not.toBe(today.getDate());
});
});

test('Calendar to FlexibleDayCalendar', () => {
let testPreferences = defaultPreferences;
testPreferences['view'] = 'month';
testPreferences['number-of-entries'] = 'fixed';
let calendar = CalendarFactory.getInstance(testPreferences);
expect(calendar.constructor.name).toBe('Calendar');

testPreferences['view'] = 'day';
testPreferences['number-of-entries'] = 'flexible';
calendar = CalendarFactory.getInstance(testPreferences, calendar);
expect(calendar.constructor.name).toBe('FlexibleDayCalendar');
});

test('FixedDayCalendar to FlexibleDayCalendar', () => {
let testPreferences = defaultPreferences;
testPreferences['view'] = 'day';
testPreferences['number-of-entries'] = 'fixed';
let calendar = CalendarFactory.getInstance(testPreferences);
expect(calendar.constructor.name).toBe('FixedDayCalendar');

testPreferences['view'] = 'day';
testPreferences['number-of-entries'] = 'flexible';
calendar = CalendarFactory.getInstance(testPreferences, calendar);
expect(calendar.constructor.name).toBe('FlexibleDayCalendar');
});

test('FlexibleMonthCalendar to FlexibleDayCalendar', () => {
let testPreferences = defaultPreferences;
testPreferences['view'] = 'month';
testPreferences['number-of-entries'] = 'flexible';
let calendar = CalendarFactory.getInstance(testPreferences);
expect(calendar.constructor.name).toBe('FlexibleMonthCalendar');

testPreferences['view'] = 'day';
testPreferences['number-of-entries'] = 'flexible';
calendar = CalendarFactory.getInstance(testPreferences, calendar);
expect(calendar.constructor.name).toBe('FlexibleDayCalendar');
});
});
2 changes: 1 addition & 1 deletion changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
- Enhancement: [#328] Swap position for overall and month balance on day view
- Enhancement: [#333] Adding start date for overall balance on preferences
- Enhancement: [#357] Adding flexible table format for month calendar with variable number of entries per day
- Enhancement: [#369] Adding flexible table format for day calendar as well
- Enhancement: [#383] Add system default theme that auto-detect if dark or light mode is set


Who built 1.5.6:

- thamara
Expand Down
Loading