@tictuk/item-availability
Version:
Provides functions to check availability
113 lines (99 loc) • 3.04 kB
text/typescript
import Item from './item';
import { isAvailableNow, isItemAvailable } from '.';
const noExceptionsAvailability = { weekly: [] };
const emptyAvailability = {
weekly: [],
exceptions: [],
};
const alwaysAvailable = {
weekly: [{ minuteOfWeek: 0, durationMins: 1440 * 7 }],
exceptions: [],
};
const regularItem: Item = {
condition: {
conditions: [
{},
{},
{},
{
type: 'n/a',
availability: {
weekly: [
{ minuteOfWeek: 0, durationMins: 120 },
{ minuteOfWeek: 1440, durationMins: 60 },
{ minuteOfWeek: 1600, durationMins: 120 },
],
exceptions: [
{
start: {
year: 2022,
month: 12,
day: 20,
hour: 0,
minute: 0,
},
end: {
year: 2023,
month: 1,
day: 1,
hour: 0,
minute: 0,
},
available: true,
},
{
start: {
year: 2023,
month: 1,
day: 1,
hour: 0,
minute: 0,
},
end: {
year: 2023,
month: 1,
day: 10,
hour: 0,
minute: 0,
},
available: false,
},
],
},
},
],
},
};
test('Item without exceptions and empty weekly availability is available', () => {
expect(isAvailableNow(noExceptionsAvailability)).toBeTruthy();
});
test('Always available item is available now', () => {
expect(isAvailableNow(alwaysAvailable)).toBeTruthy();
});
test('Item with empty availability is available now', () => {
expect(isAvailableNow(emptyAvailability)).toBeTruthy();
});
test('Item available without exceptions', () => {
expect(isItemAvailable(regularItem, new Date(2022, 4, 15, 1))).toBeTruthy();
});
test('Item unavailable without exceptions between weekly groups', () => {
expect(isItemAvailable(regularItem, new Date(2022, 4, 19, 4))).toBeFalsy();
});
test('Item unavailable without exceptions after weekly groups', () => {
expect(isItemAvailable(regularItem, new Date(2022, 4, 21, 0))).toBeFalsy();
});
test('Item unavailable but overwritten by exception', () => {
expect(isItemAvailable(regularItem, new Date(2022, 11, 31, 2))).toBeTruthy();
});
test('Item available but overwritten by exception', () => {
expect(isItemAvailable(regularItem, new Date(2023, 0, 1, 1))).toBeFalsy();
});
test('Item unavailable with and without exception', () => {
expect(isItemAvailable(regularItem, new Date(2023, 0, 1, 4))).toBeFalsy();
});
test('Item available with and without exception', () => {
expect(isItemAvailable(regularItem, new Date(2022, 11, 25, 1))).toBeTruthy();
});
test('Item without an availability object', () => {
expect(isItemAvailable({}, new Date())).toBeTruthy();
});