react-native-timer-picker
Version:
A simple, flexible, performant duration picker for React Native apps 🔥 Great for timers, alarms and duration inputs ⏰🕰️⏳ Includes iOS-style haptic and audio feedback 🍏
276 lines (275 loc) • 11.9 kB
JavaScript
"use strict";
var _react = _interopRequireDefault(require("react"));
var _reactNative = require("react-native");
var _reactNative2 = require("@testing-library/react-native");
var _TimerPickerModal = _interopRequireDefault(require("../components/TimerPickerModal"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
describe("TimerPickerModal", () => {
const mockOnConfirm = jest.fn();
const mockOnCancel = jest.fn();
beforeEach(() => {
jest.useFakeTimers();
});
afterEach(() => {
jest.runOnlyPendingTimers();
jest.useRealTimers();
(0, _reactNative2.cleanup)();
});
const defaultProps = {
visible: true,
setIsVisible: jest.fn(),
onConfirm: mockOnConfirm,
onCancel: mockOnCancel
};
it("renders without crashing", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
const component = getByTestId("timer-picker-modal");
expect(component).toBeDefined();
});
it("calls onConfirm when Confirm button is pressed", () => {
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
const confirmButton = getByText("Confirm");
_reactNative2.fireEvent.press(confirmButton);
expect(mockOnConfirm).toHaveBeenCalled();
});
it("calls onCancel when Cancel button is pressed", () => {
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
const cancelButton = getByText("Cancel");
_reactNative2.fireEvent.press(cancelButton);
expect(mockOnCancel).toHaveBeenCalled();
});
it("hides the modal when Cancel button is pressed", () => {
const setIsVisibleMock = jest.fn();
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
setIsVisible: setIsVisibleMock
})));
const cancelButton = getByText("Cancel");
_reactNative2.fireEvent.press(cancelButton);
expect(setIsVisibleMock).toHaveBeenCalledWith(false);
});
it("hides the modal when overlay is pressed", () => {
const setIsVisibleMock = jest.fn();
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
closeOnOverlayPress: true,
setIsVisible: setIsVisibleMock
})));
const overlay = getByTestId("modal-backdrop");
_reactNative2.fireEvent.press(overlay);
expect(setIsVisibleMock).toHaveBeenCalledWith(false);
});
it("calls onConfirm with selected duration when Confirm button is pressed", () => {
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, defaultProps));
// Select duration in TimerPicker, assuming its interaction is tested separately
const confirmButton = getByText("Confirm");
_reactNative2.fireEvent.press(confirmButton);
expect(mockOnConfirm).toHaveBeenCalledWith(expect.objectContaining({}));
});
it("renders but is not visible when visible prop is false", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
visible: false
})));
const modal = getByTestId("timer-picker-modal");
expect(modal).toBeDefined();
// Modal component still renders but with visible={false}
expect(modal.props.visible).toBe(false);
});
it("renders with custom button labels", () => {
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
confirmButtonText: "OK",
cancelButtonText: "Dismiss"
})));
expect(getByText("OK")).toBeDefined();
expect(getByText("Dismiss")).toBeDefined();
});
it("renders with custom modal title", () => {
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
modalTitle: "Select Time"
})));
expect(getByText("Select Time")).toBeDefined();
});
it("does not close on overlay press when closeOnOverlayPress is false", () => {
const setIsVisibleMock = jest.fn();
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
closeOnOverlayPress: false,
setIsVisible: setIsVisibleMock
})));
const overlay = getByTestId("modal-backdrop");
_reactNative2.fireEvent.press(overlay);
expect(setIsVisibleMock).not.toHaveBeenCalled();
});
it("hides Cancel button when hideCancelButton is true", () => {
const {
queryByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
hideCancelButton: true
})));
expect(queryByText("Cancel")).toBeNull();
});
it("renders with initial value", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
initialValue: {
hours: 2,
minutes: 30,
seconds: 0
}
})));
expect(getByTestId("timer-picker-modal")).toBeDefined();
});
it("renders with custom intervals", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
hourInterval: 2,
minuteInterval: 15,
secondInterval: 5
})));
expect(getByTestId("timer-picker-modal")).toBeDefined();
});
it("calls both onCancel and setIsVisible when Cancel is pressed", () => {
const setIsVisibleMock = jest.fn();
const onCancelMock = jest.fn();
const {
getByText
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
onCancel: onCancelMock,
setIsVisible: setIsVisibleMock
})));
const cancelButton = getByText("Cancel");
_reactNative2.fireEvent.press(cancelButton);
expect(onCancelMock).toHaveBeenCalled();
expect(setIsVisibleMock).toHaveBeenCalledWith(false);
});
it("hides specific time units when respective hide props are provided", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
hideHours: true,
hideSeconds: true
})));
expect(getByTestId("timer-picker-modal")).toBeDefined();
// Note: The specific duration scroll test IDs would be in the TimerPicker component
});
it("renders without crashing with all optional props", () => {
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
modalTitle: "Pick Duration",
confirmButtonText: "Done",
cancelButtonText: "Close",
hourLabel: "h",
minuteLabel: "m",
secondLabel: "s",
hideHours: false,
hideMinutes: false,
hideSeconds: false,
hideDays: false
})));
expect(getByTestId("timer-picker-modal")).toBeDefined();
});
it("renders custom cancel button when provided", () => {
const CustomButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-cancel-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Cancel"));
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
cancelButton: /*#__PURE__*/_react.default.createElement(CustomButton, null)
})));
expect(getByTestId("custom-cancel-button")).toBeDefined();
});
it("renders custom confirm button when provided", () => {
const CustomButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-confirm-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Confirm"));
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
confirmButton: /*#__PURE__*/_react.default.createElement(CustomButton, null)
})));
expect(getByTestId("custom-confirm-button")).toBeDefined();
});
it("calls onCancel when custom cancel button is pressed", () => {
const CustomButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-cancel-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Cancel"));
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
cancelButton: /*#__PURE__*/_react.default.createElement(CustomButton, null)
})));
const customCancelButton = getByTestId("custom-cancel-button");
_reactNative2.fireEvent.press(customCancelButton);
expect(mockOnCancel).toHaveBeenCalled();
});
it("calls onConfirm when custom confirm button is pressed", () => {
const CustomButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-confirm-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Confirm"));
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
confirmButton: /*#__PURE__*/_react.default.createElement(CustomButton, null)
})));
const customConfirmButton = getByTestId("custom-confirm-button");
_reactNative2.fireEvent.press(customConfirmButton);
expect(mockOnConfirm).toHaveBeenCalled();
});
it("renders both custom cancel and confirm buttons when provided", () => {
const CustomCancelButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-cancel-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Cancel"));
const CustomConfirmButton = ({
onPress
}) => /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
onPress: onPress,
testID: "custom-confirm-button"
}, /*#__PURE__*/_react.default.createElement(_reactNative.Text, null, "Custom Confirm"));
const {
getByTestId
} = (0, _reactNative2.render)(/*#__PURE__*/_react.default.createElement(_TimerPickerModal.default, _extends({}, defaultProps, {
cancelButton: /*#__PURE__*/_react.default.createElement(CustomCancelButton, null),
confirmButton: /*#__PURE__*/_react.default.createElement(CustomConfirmButton, null)
})));
expect(getByTestId("custom-cancel-button")).toBeDefined();
expect(getByTestId("custom-confirm-button")).toBeDefined();
});
});
//# sourceMappingURL=TimerPickerModal.test.js.map