react-native-easy-calendar
Version:
Customizable, easy-to-use, performant calendar components for React Native
319 lines (297 loc) • 10.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.testTheme = exports.MonthsPage = void 0;
var _react = _interopRequireDefault(require("react"));
var _dayjs = _interopRequireDefault(require("dayjs"));
var _reactNative = require("react-native");
var _reactNative2 = require("@testing-library/react-native");
var _Contexts = require("../Contexts");
var _Themes = require("../Themes");
var _Months = _interopRequireDefault(require("./Months"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const getDisabledMonths = month => month.props.accessibilityState.disabled;
const getSelectedMonths = month => month.props.accessibilityState.selected;
test('Months renders without error', () => {
const months = new MonthsPage({});
expect(months.component).toBeTruthy();
});
test('Renders the correct number of months', () => {
const months = new MonthsPage({});
expect(months.monthArray.length).toBe(12);
});
test('Component passes onPressMonth callback to Month children', () => {
const onPressMonth = jest.fn();
const months = new MonthsPage({
onPressMonth
});
months.firstMonth && _reactNative2.fireEvent.press(months.firstMonth);
expect(onPressMonth).toHaveBeenCalledTimes(1);
});
describe('Generates correct set of selected months', () => {
test('None selected, undefined', () => {
const months = new MonthsPage({
dateProperties: {}
});
const selectedMonths = months.monthArray.filter(getSelectedMonths);
expect(selectedMonths.length).toBe(0);
});
test('None selected, false', () => {
const months = new MonthsPage({
dateProperties: {
'2020-04-01': {
isSelected: false
}
}
});
const selectedMonths = months.monthArray.filter(getSelectedMonths);
expect(selectedMonths.length).toBe(0);
});
test('Date selection', () => {
const dateProperties = {
'2019-01-01': {
isSelected: true
},
'2020-01-01': {
isSelected: true
},
'2020-01-05': {
isSelected: true
},
'2020-04-23': {
isSelected: true
}
};
const months = new MonthsPage({
dateProperties
});
const selectedMonths = months.monthArray.filter(getSelectedMonths);
expect(selectedMonths.length).toBe(2);
expect(selectedMonths[0]).toHaveTextContent('Jan');
expect(selectedMonths[1]).toHaveTextContent('Apr');
});
});
describe('Disables the correct months', () => {
describe('due to min date', () => {
test('works for start-of-year date', () => {
const months = new MonthsPage({
minDate: '2020-01-01'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(0);
});
test('works for middle-of-the-year dates', () => {
const months = new MonthsPage({
minDate: '2020-04-01'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(3);
expect(disabledMonths[0]).toHaveTextContent('Jan');
expect(disabledMonths[1]).toHaveTextContent('Feb');
expect(disabledMonths[2]).toHaveTextContent('Mar');
});
test('works for end-of-year date', () => {
const months = new MonthsPage({
minDate: '2020-12-31'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(11);
});
});
describe('due to max date', () => {
test('works for start-of-year date', () => {
const months = new MonthsPage({
maxDate: '2020-01-01'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(11);
});
test('works for middle-of-the-year date', () => {
const months = new MonthsPage({
maxDate: '2020-10-15'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(2);
expect(disabledMonths[0]).toHaveTextContent('Nov');
expect(disabledMonths[1]).toHaveTextContent('Dec');
});
test('works for end-of-year date', () => {
const months = new MonthsPage({
maxDate: '2020-12-31'
});
const disabledMonths = months.monthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(0);
});
});
});
describe('Theme context', () => {
test('Months container applies monthsContainer theme', () => {
const months = new MonthsPage({
theme: testTheme
});
expect(months.component).toHaveStyle(testTheme.monthsContainer);
});
});
describe('Custom month component', () => {
const MonthComponent = ({
date,
onPress,
isSelected,
isDisabled
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
testID: 'custom-month',
accessibilityState: {
disabled: isDisabled,
selected: isSelected
},
onPress: () => onPress(date)
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, (0, _dayjs.default)(date).format('MMM')));
test('custom month receives onPress prop', () => {
const onPressMonth = jest.fn();
const months = new MonthsPage({
MonthComponent,
onPressMonth
});
months.firstCustomMonth && _reactNative2.fireEvent.press(months.firstCustomMonth);
expect(onPressMonth).toHaveBeenCalledTimes(1);
});
describe('custom month receives isSelected prop', () => {
test('None selected', () => {
const months = new MonthsPage({
MonthComponent,
dateProperties: {}
});
const selectedMonths = months.customMonthArray.filter(getSelectedMonths);
expect(selectedMonths.length).toBe(0);
});
test('Date selection', () => {
const dateProperties = {
'2019-01-01': {
isSelected: true
},
'2020-01-01': {
isSelected: true
},
'2020-01-05': {
isSelected: true
},
'2020-04-23': {
isSelected: true
}
};
const months = new MonthsPage({
MonthComponent,
dateProperties
});
const selectedMonths = months.customMonthArray.filter(getSelectedMonths);
expect(selectedMonths.length).toBe(2);
});
});
describe('custom month component receives isDisabled prop', () => {
describe('disable months due to min date', () => {
test('works for start-of-year date', () => {
const minDate = '2020-01-01';
const months = new MonthsPage({
MonthComponent,
minDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(0);
});
test('works for middle-of-the-year dates', () => {
const minDate = '2020-04-01';
const months = new MonthsPage({
MonthComponent,
minDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(3);
});
test('works for end-of-year date', () => {
const minDate = '2020-12-31';
const months = new MonthsPage({
MonthComponent,
minDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(11);
});
});
describe('disable months due to max date', () => {
test('works for start-of-year date', () => {
const maxDate = '2020-01-01';
const months = new MonthsPage({
MonthComponent,
maxDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(11);
});
test('works for middle-of-the-year dates', () => {
const maxDate = '2020-10-15';
const months = new MonthsPage({
MonthComponent,
maxDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(2);
});
test('works for end-of-year date', () => {
const maxDate = '2020-12-31';
const months = new MonthsPage({
MonthComponent,
maxDate
});
const disabledMonths = months.customMonthArray.filter(getDisabledMonths);
expect(disabledMonths.length).toBe(0);
});
});
});
});
class MonthsPage {
constructor({
onPressMonth = () => {},
dateProperties = {},
visibleDate = (0, _dayjs.default)('2020-05-01'),
MonthComponent,
minDate,
maxDate,
theme = _Themes.DefaultTheme
}) {
_defineProperty(this, "component", void 0);
_defineProperty(this, "firstMonth", void 0);
_defineProperty(this, "firstCustomMonth", void 0);
_defineProperty(this, "monthArray", void 0);
_defineProperty(this, "customMonthArray", void 0);
const {
getAllByRole,
getByTestId,
getAllByTestId
} = (0, _reactNative2.render)( /*#__PURE__*/_react.default.createElement(_Contexts.ThemeContext.Provider, {
value: theme
}, /*#__PURE__*/_react.default.createElement(_Months.default, {
MonthComponent,
onPressMonth,
dateProperties,
visibleDate,
minDate,
maxDate
})));
this.component = getByTestId('months-container');
this.monthArray = !MonthComponent ? getAllByRole('button') : [];
this.customMonthArray = MonthComponent ? getAllByTestId('custom-month') : [];
this.firstMonth = this.monthArray.length ? this.monthArray[0] : undefined;
this.firstCustomMonth = this.customMonthArray.length ? this.customMonthArray[0] : undefined;
}
}
exports.MonthsPage = MonthsPage;
const testTheme = { ..._Themes.DefaultTheme,
monthsContainer: {
marginTop: 10,
backgroundColor: 'black'
}
};
exports.testTheme = testTheme;
//# sourceMappingURL=Months.test.js.map