react-day-picker
Version:
Customizable Date Picker for React
148 lines (134 loc) • 4.45 kB
text/typescript
import { addDays } from 'date-fns';
import { DayPickerContextValue } from 'contexts/DayPicker';
import { getDefaultContextValues } from 'contexts/DayPicker/defaultContextValues';
import { SelectRangeContextValue } from 'contexts/SelectRange';
import { InternalModifier, InternalModifiers } from 'types/Modifiers';
import { getInternalModifiers } from './getInternalModifiers';
const defaultDayPickerContext: DayPickerContextValue =
getDefaultContextValues();
const defaultSelectMultipleContext = {
selected: undefined,
modifiers: { disabled: [] }
};
const defaultSelectRangeContext = {
selected: undefined,
modifiers: {
disabled: [],
range_start: [],
range_end: [],
range_middle: []
}
};
const { Selected, Disabled, Hidden, Today, RangeEnd, RangeMiddle, RangeStart } =
InternalModifier;
const internalModifiers = [Selected, Disabled, Hidden, Today];
test.each(internalModifiers)(
'should transform to array the modifiers from the "%s" prop',
(propName) => {
const value = new Date();
const modifiers = getInternalModifiers(
{ ...defaultDayPickerContext, [propName]: value },
defaultSelectMultipleContext,
defaultSelectRangeContext
);
expect(modifiers[propName]).toStrictEqual([value]);
}
);
describe('when navigation is limited by "fromDate"', () => {
const fromDate = new Date();
const dayPickerContext: DayPickerContextValue = {
...defaultDayPickerContext,
fromDate
};
test('should add a "before" matcher to the "disabled" modifiers', () => {
const modifiers = getInternalModifiers(
dayPickerContext,
defaultSelectMultipleContext,
defaultSelectRangeContext
);
expect(modifiers.disabled).toStrictEqual([{ before: fromDate }]);
});
});
describe('when navigation is limited by "toDate"', () => {
const toDate = new Date();
const dayPickerContext: DayPickerContextValue = {
...defaultDayPickerContext,
toDate
};
test('should add an "after" matcher to the "disabled" modifiers', () => {
const modifiers = getInternalModifiers(
dayPickerContext,
defaultSelectMultipleContext,
defaultSelectRangeContext
);
expect(modifiers.disabled).toStrictEqual([{ after: toDate }]);
});
});
describe('when in multiple select mode', () => {
const disabledDate = new Date();
const dayPickerContext: DayPickerContextValue = {
...defaultDayPickerContext,
mode: 'multiple'
};
const selectMultipleContext = {
...defaultSelectMultipleContext,
modifiers: {
[Disabled]: [disabledDate]
}
};
test('should add the disabled modifier from the select multiple context', () => {
const modifiers = getInternalModifiers(
dayPickerContext,
selectMultipleContext,
defaultSelectRangeContext
);
expect(modifiers.disabled).toStrictEqual([disabledDate]);
});
});
describe('when in range select mode', () => {
const disabled = [new Date()];
const rangeStart = new Date();
const rangeMiddle = [addDays(rangeStart, 1), addDays(rangeStart, 2)];
const rangeEnd = [addDays(rangeStart, 3)];
const dayPickerContext: DayPickerContextValue = {
...defaultDayPickerContext,
mode: 'range'
};
const selectRangeContext: SelectRangeContextValue = {
...defaultSelectRangeContext,
modifiers: {
[Disabled]: [disabled],
[RangeStart]: [rangeStart],
[RangeEnd]: rangeEnd,
[RangeMiddle]: rangeMiddle
}
};
let internalModifiers: InternalModifiers;
beforeEach(() => {
internalModifiers = getInternalModifiers(
dayPickerContext,
defaultSelectMultipleContext,
selectRangeContext
);
});
test('should add the Disabled modifier from the SelectRange context', () => {
expect(internalModifiers[Disabled]).toStrictEqual(
selectRangeContext.modifiers[Disabled]
);
});
test('should add the RangeStart modifier from the SelectRange context', () => {
expect(internalModifiers[RangeStart]).toStrictEqual(
selectRangeContext.modifiers[RangeStart]
);
});
test('should add the RangeEnd modifier from the SelectRange context', () => {
expect(internalModifiers[RangeEnd]).toStrictEqual(
selectRangeContext.modifiers[RangeEnd]
);
});
test('should add the RangeMiddle modifier from the SelectRange context', () => {
expect(internalModifiers[RangeMiddle]).toStrictEqual(
selectRangeContext.modifiers[RangeMiddle]
);
});
});