available-slots
Version:
Find available time slots from your daily schedule with configurable chunks & breaks.
523 lines (522 loc) • 11.3 kB
JavaScript
"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