UNPKG

available-slots

Version:

Find available time slots from your daily schedule with configurable chunks & breaks.

523 lines (522 loc) 11.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const _nodetest = /*#__PURE__*/ _interop_require_default(require("node:test")); const _nodeassert = /*#__PURE__*/ _interop_require_default(require("node:assert")); const _index = /*#__PURE__*/ _interop_require_default(require("./index.js")); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } (0, _nodetest.default)('basic usage - 30min chunks, no breaks', ()=>{ const result = (0, _index.default)({ busy: [ { start: '09:00', end: '10:30' }, { start: '14:00', end: '15:30' } ] }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:30', end: '09:00' }, { start: '10:30', end: '11:00' }, { start: '11:00', end: '11:30' }, { start: '11:30', end: '12:00' }, { start: '12:00', end: '12:30' }, { start: '12:30', end: '13:00' }, { start: '13:00', end: '13:30' }, { start: '13:30', end: '14:00' }, { start: '15:30', end: '16:00' }, { start: '16:00', end: '16:30' }, { start: '16:30', end: '17:00' }, { start: '17:00', end: '17:30' }, { start: '17:30', end: '18:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('custom slot size and breaks', ()=>{ const result = (0, _index.default)({ busy: [ { start: '09:00', end: '10:30' }, { start: '14:00', end: '15:30' } ], slotSize: 45, breakTime: 15, startTime: '08:00', endTime: '18:00' }); const expected = [ { start: '08:00', end: '08:45' }, { start: '10:30', end: '11:15' }, { start: '11:30', end: '12:15' }, { start: '12:30', end: '13:15' }, { start: '15:30', end: '16:15' }, { start: '16:30', end: '17:15' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('no busy slots - full day available', ()=>{ const result = (0, _index.default)({ busy: [], startTime: '09:00', endTime: '12:00' }); const expected = [ { start: '09:00', end: '09:30' }, { start: '09:30', end: '10:00' }, { start: '10:00', end: '10:30' }, { start: '10:30', end: '11:00' }, { start: '11:00', end: '11:30' }, { start: '11:30', end: '12:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('overlapping busy slots are merged', ()=>{ const result = (0, _index.default)({ busy: [ { start: '09:00', end: '10:30' }, { start: '10:00', end: '11:00' }, { start: '10:45', end: '12:00' } ], startTime: '08:00', endTime: '13:00' }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:30', end: '09:00' }, { start: '12:00', end: '12:30' }, { start: '12:30', end: '13:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('adjacent busy slots are merged', ()=>{ const result = (0, _index.default)({ busy: [ { start: '09:00', end: '10:00' }, { start: '10:00', end: '11:00' } ], startTime: '08:00', endTime: '12:00' }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:30', end: '09:00' }, { start: '11:00', end: '11:30' }, { start: '11:30', end: '12:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('fully booked day returns empty array', ()=>{ const result = (0, _index.default)({ busy: [ { start: '08:00', end: '18:00' } ] }); _nodeassert.default.deepStrictEqual(result, []); }); (0, _nodetest.default)('busy slots outside work hours are ignored', ()=>{ const result = (0, _index.default)({ busy: [ { start: '07:00', end: '08:30' }, { start: '17:30', end: '19:00' } ], startTime: '08:00', endTime: '18:00' }); const expected = [ { start: '08:30', end: '09:00' }, { start: '09:00', end: '09:30' }, { start: '09:30', end: '10:00' }, { start: '10:00', end: '10:30' }, { start: '10:30', end: '11:00' }, { start: '11:00', end: '11:30' }, { start: '11:30', end: '12:00' }, { start: '12:00', end: '12:30' }, { start: '12:30', end: '13:00' }, { start: '13:00', end: '13:30' }, { start: '13:30', end: '14:00' }, { start: '14:00', end: '14:30' }, { start: '14:30', end: '15:00' }, { start: '15:00', end: '15:30' }, { start: '15:30', end: '16:00' }, { start: '16:00', end: '16:30' }, { start: '16:30', end: '17:00' }, { start: '17:00', end: '17:30' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('break time creates gaps between slots', ()=>{ const result = (0, _index.default)({ busy: [ { start: '10:00', end: '10:30' } ], slotSize: 30, breakTime: 15, startTime: '08:00', endTime: '12:00' }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:45', end: '09:15' }, { start: '09:30', end: '10:00' }, { start: '10:30', end: '11:00' }, { start: '11:15', end: '11:45' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('small work window with large slots', ()=>{ const result = (0, _index.default)({ busy: [], slotSize: 60, startTime: '10:00', endTime: '11:30' }); const expected = [ { start: '10:00', end: '11:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('unordered busy slots are handled correctly', ()=>{ const result = (0, _index.default)({ busy: [ { start: '14:00', end: '15:00' }, { start: '09:00', end: '10:00' }, { start: '11:30', end: '12:30' } ], startTime: '08:00', endTime: '16:00' }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:30', end: '09:00' }, { start: '10:00', end: '10:30' }, { start: '10:30', end: '11:00' }, { start: '11:00', end: '11:30' }, { start: '12:30', end: '13:00' }, { start: '13:00', end: '13:30' }, { start: '13:30', end: '14:00' }, { start: '15:00', end: '15:30' }, { start: '15:30', end: '16:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('edge case: slot exactly fits at end of day', ()=>{ const result = (0, _index.default)({ busy: [], slotSize: 30, startTime: '17:30', endTime: '18:00' }); const expected = [ { start: '17:30', end: '18:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); (0, _nodetest.default)('complex overlapping scenario', ()=>{ const result = (0, _index.default)({ busy: [ { start: '11:00', end: '12:00' }, { start: '13:00', end: '14:00' }, { start: '09:30', end: '11:30' }, { start: '13:30', end: '15:30' }, { start: '09:00', end: '10:00' } ], startTime: '08:00', endTime: '16:00' }); const expected = [ { start: '08:00', end: '08:30' }, { start: '08:30', end: '09:00' }, { start: '12:00', end: '12:30' }, { start: '12:30', end: '13:00' }, { start: '15:30', end: '16:00' } ]; _nodeassert.default.deepStrictEqual(result, expected); }); //# sourceMappingURL=index.test.js.map