UNPKG

@vimeo/iris

Version:
366 lines (364 loc) 17.9 kB
import { g as __awaiter, c as __assign, h as __generator } from '../../../tslib.es6-7f0e734f.js'; import React__default from 'react'; import { s as screen, r as render, f as fireEvent } from '../../../react.esm-edf204b5.js'; import { u as userEvent } from '../../../index-cff9b439.js'; import { ColorSelect } from './ColorSelect.esm.js'; import { ThemeProvider } from 'styled-components'; import { themes } from '../../../themes/index.esm.js'; import '../../../es.typed-array.set-c204e812.js'; import 'os'; import 'tty'; import 'react-dom'; import 'util'; import 'polished'; import './ColorSelect.style.esm.js'; import './ColorSelect.state.esm.js'; import '../../../color/colorUtils.esm.js'; import './Slider.esm.js'; import './Slider.style.esm.js'; import '../../../color/colors.esm.js'; import './Inputs.esm.js'; import '../Input/Input.esm.js'; import '../Input/Text.esm.js'; import '../Input/Input.style.esm.js'; import '../Shared.esm.js'; import '../Input/useSuggestions.esm.js'; import '../../../typography/Header/Header.esm.js'; import '../../../typography/Header/Header.style.esm.js'; import '../../../typography/typography.esm.js'; import '../../../typography/Text/Text.esm.js'; import '../../../typography/Text/Text.style.esm.js'; import '../../../tokens/core.esm.js'; import '../../../tokens/color/index.esm.js'; import '../../../tokens/color/background/background.esm.js'; import '../../../tokens/util/readToken.esm.js'; import '../../../tokens/util/clamp.esm.js'; import '../../../tokens/color/format/format.esm.js'; import '../../../tokens/color/format/primary.esm.js'; import '../../../tokens/color/format/secondary.esm.js'; import '../../../tokens/color/format/tertiary.esm.js'; import '../../../tokens/color/rainbow/rainbow.esm.js'; import '../../../tokens/color/rainbow/conic/index.esm.js'; import '../../../tokens/color/rainbow/conic/sm.esm.js'; import '../../../tokens/color/rainbow/conic/xl.esm.js'; import '../../../tokens/color/rainbow/linear/index.esm.js'; import '../../../tokens/color/rainbow/linear/sm.esm.js'; import '../../../tokens/color/rainbow/linear/xl.esm.js'; import '../../../tokens/color/livestream/livestream.esm.js'; import '../../../tokens/color/status/status.esm.js'; import '../../../tokens/color/status/caution.esm.js'; import '../../../tokens/color/status/negative.esm.js'; import '../../../tokens/color/status/positive.esm.js'; import '../../../tokens/color/stroke/stroke.esm.js'; import '../../../tokens/color/surface/surface.esm.js'; import '../../../tokens/color/text/text.esm.js'; import '../../../tokens/util/round.esm.js'; import '../../../tokens/color/upsell/upsell.esm.js'; import '../../../tokens/color/upsell/sm.esm.js'; import '../../../tokens/color/upsell/xl.esm.js'; import '../../../tokens/color/upsell/new.esm.js'; import '../../../tokens/edge/edge.esm.js'; import '../../../tokens/space/space.esm.js'; import '../../../tokens/typography/index.esm.js'; import '../../../tokens/typography/size/size.esm.js'; import '../../../typography/Text/EditableText.esm.js'; import '../../../utils/HOCs/withIris.esm.js'; import '../../../utils/hooks/useLayoutStyles.esm.js'; import '../../../utils/DOM/geometry.esm.js'; import '../../../utils/css.esm.js'; import '../Wrapper/Wrapper.esm.js'; import '../../../typography/Paragraph/Paragraph.esm.js'; import '../../../typography/Paragraph/Paragraph.style.esm.js'; import '../../PopOver/PopOver.esm.js'; import '../../PopOver/PopOver.style.esm.js'; import '../../PopOver/PopOver.error.esm.js'; import '../../../utils/hooks/usePortal_DEPRECATED/usePortal_DEPRECATED.esm.js'; import '../../../utils/hooks/usePortal_DEPRECATED/usePortal_DEPRECATED.style.esm.js'; import '../../../utils/hooks/usePortal_DEPRECATED/useMountAnimations.esm.js'; import '../../../utils/hooks/useIsomorphicEffect.esm.js'; import '../../../utils/DOM/getComputedStyles.esm.js'; import '../../../utils/DOM/animate.esm.js'; import '../../../utils/events/onEvent.esm.js'; import '../../../utils/hooks/usePortal_DEPRECATED/coordinates.esm.js'; import '../../../utils/hooks/usePortal_DEPRECATED/Anchor.esm.js'; import '../../../utils/hooks/useOutsideClick.esm.js'; import '../../../utils/DOM/SSR.esm.js'; import '../../../utils/DOM/createPortalOutlet.esm.js'; import '../../../utils/DOM/createElement.esm.js'; import '../Input/Mark.esm.js'; import '../../../utils/general/generateUID.esm.js'; import '../../Button/Button.esm.js'; import '../../Button/Button.style.esm.js'; import '../../Button/Button.config.esm.js'; import '../../Button/FeaturedIcon.esm.js'; import '../../LoaderCircular/LoaderCircular.esm.js'; import '../../LoaderCircular/LoaderCircular.style.esm.js'; import '../../../utils/hooks/useDeprecate.esm.js'; import '../../../utils/general/mergeReactRefs.esm.js'; import './ColorSelectInput.esm.js'; import '../InnerButton.esm.js'; import '../../Tip/Tip.esm.js'; import '../../Tip/Tip.settings.esm.js'; import '../../Tip/Tip.style.esm.js'; import '../../../utils/hooks/useIrisError.esm.js'; import '../../../icons/ui/History.esm.js'; import './ColorSelectSpectrum.esm.js'; import '../../../utils/general/throttle.esm.js'; import './Presets.esm.js'; var Provider = function (_a) { var children = _a.children; return (React__default.createElement(ThemeProvider, { theme: themes['light'] }, children)); }; var renderWithThemeProvider = function (ui, options) { return render(ui, __assign({ wrapper: Provider }, options)); }; var TEST_COLOR = '#CCCCCC'; describe('ColorSelect', function () { it('Renders ColorSelect input', function () { renderWithThemeProvider(React__default.createElement(ColorSelect, null)); var input = screen.getByLabelText('color'); expect(input).toBeInTheDocument(); }); it('Renders ColorSelect picker using input', function () { return __awaiter(void 0, void 0, void 0, function () { var input, picker; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, null)); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); picker = screen.getByLabelText('color picker'); expect(picker).toBeInTheDocument(); return [2 /*return*/]; } }); }); }); it('Renders ColorSelect picker using children', function () { return __awaiter(void 0, void 0, void 0, function () { var trigger, picker; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, null, React__default.createElement("button", { "data-testid": "trigger" }))); trigger = screen.getByTestId('trigger'); return [4 /*yield*/, userEvent.click(trigger)]; case 1: _a.sent(); picker = screen.getByLabelText('color picker'); expect(picker).toBeInTheDocument(); return [2 /*return*/]; } }); }); }); it('Set ColorSelect color using value prop', function () { return __awaiter(void 0, void 0, void 0, function () { var input, selectedColor, selectedColorValue; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, { value: TEST_COLOR })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); selectedColor = screen.getByLabelText('color preview'); selectedColorValue = selectedColor.getAttribute('color'); expect(selectedColorValue).toBe(TEST_COLOR); return [2 /*return*/]; } }); }); }); it('Change ColorSelect color using input', function () { return __awaiter(void 0, void 0, void 0, function () { var input, selectedColor, selectedColorValue; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, null)); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); fireEvent.change(input, { target: { value: TEST_COLOR } }); selectedColor = screen.getByLabelText('color preview'); selectedColorValue = selectedColor.getAttribute('color'); expect(selectedColorValue).toBe(TEST_COLOR); return [2 /*return*/]; } }); }); }); it('Fires onChange callback', function () { return __awaiter(void 0, void 0, void 0, function () { var mockFn, input; return __generator(this, function (_a) { switch (_a.label) { case 0: mockFn = jest.fn(); renderWithThemeProvider(React__default.createElement(ColorSelect, { onChange: mockFn })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); fireEvent.change(input, { target: { value: TEST_COLOR } }); expect(mockFn).toBeCalledWith(TEST_COLOR); return [2 /*return*/]; } }); }); }); it('Fires onClose callback', function () { return __awaiter(void 0, void 0, void 0, function () { var mockFn, input; return __generator(this, function (_a) { switch (_a.label) { case 0: mockFn = jest.fn(); renderWithThemeProvider(React__default.createElement(ColorSelect, { onClose: mockFn })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); return [4 /*yield*/, userEvent.click(input)]; case 2: _a.sent(); // Another click to close the picker expect(mockFn).toBeCalled(); return [2 /*return*/]; } }); }); }); it('Resets ColorSelect color using reset button', function () { return __awaiter(void 0, void 0, void 0, function () { var reset, input, resetButton, selectedColor, selectedColorValue; return __generator(this, function (_a) { switch (_a.label) { case 0: reset = { color: '#FFFFFF', label: 'My Reset' }; renderWithThemeProvider(React__default.createElement(ColorSelect, { reset: reset })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); fireEvent.change(input, { target: { value: TEST_COLOR } }); resetButton = screen.getByLabelText('reset'); return [4 /*yield*/, userEvent.click(resetButton)]; case 2: _a.sent(); selectedColor = screen.getByLabelText('color preview'); selectedColorValue = selectedColor.getAttribute('color'); expect(selectedColorValue).toBe(reset.color); return [2 /*return*/]; } }); }); }); it('Change size', function () { return __awaiter(void 0, void 0, void 0, function () { var rerender, label; return __generator(this, function (_a) { rerender = renderWithThemeProvider(React__default.createElement(ColorSelect, { size: "sm" })).rerender; label = screen.getByLabelText('color'); expect(label).toHaveStyle({ 'font-size': '0.75rem' }); rerender(React__default.createElement(ColorSelect, { size: "md" })); expect(label).toHaveStyle({ 'font-size': '1rem' }); rerender(React__default.createElement(ColorSelect, { size: "lg" })); expect(label).toHaveStyle({ 'font-size': '1.5rem' }); rerender(React__default.createElement(ColorSelect, { size: "xl" })); expect(label).toHaveStyle({ 'font-size': '1.75rem' }); return [2 /*return*/]; }); }); }); it('Make ColorSelect required', function () { return __awaiter(void 0, void 0, void 0, function () { var input, picker, pickerInner; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, { required: true })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); picker = screen.getByLabelText('color picker'); pickerInner = picker.querySelector('div'); expect(pickerInner).toHaveAttribute('required'); return [2 /*return*/]; } }); }); }); it('Has a name', function () { return __awaiter(void 0, void 0, void 0, function () { var name, input, picker, pickerInner, nameAttribute; return __generator(this, function (_a) { switch (_a.label) { case 0: name = 'hello'; renderWithThemeProvider(React__default.createElement(ColorSelect, { name: name })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); picker = screen.getByLabelText('color picker'); pickerInner = picker.querySelector('div'); nameAttribute = pickerInner.getAttribute('name'); expect(nameAttribute).toBe(name); return [2 /*return*/]; } }); }); }); it('Render a label for ColorSelect', function () { return __awaiter(void 0, void 0, void 0, function () { var label, renderedLabel; return __generator(this, function (_a) { label = 'My Label'; renderWithThemeProvider(React__default.createElement(ColorSelect, { label: label })); renderedLabel = document.querySelector('label'); expect(renderedLabel.innerHTML).toBe(label); return [2 /*return*/]; }); }); }); it('Render with initial color', function () { return __awaiter(void 0, void 0, void 0, function () { var initial, input; return __generator(this, function (_a) { initial = { color: TEST_COLOR }; renderWithThemeProvider(React__default.createElement(ColorSelect, { initial: initial })); input = screen.getByLabelText('color'); expect(input.value).toBe(TEST_COLOR); return [2 /*return*/]; }); }); }); it('Render ColorSelect without hue slider', function () { return __awaiter(void 0, void 0, void 0, function () { var input, hueSlider; return __generator(this, function (_a) { switch (_a.label) { case 0: renderWithThemeProvider(React__default.createElement(ColorSelect, { showHueSlider: false })); input = screen.getByLabelText('color'); return [4 /*yield*/, userEvent.click(input)]; case 1: _a.sent(); hueSlider = document.querySelector('[kind=hue]'); expect(hueSlider).not.toBeInTheDocument(); return [2 /*return*/]; } }); }); }); it('Select color from presets', function () { return __awaiter(void 0, void 0, void 0, function () { var palette, mockFn, preset; return __generator(this, function (_a) { switch (_a.label) { case 0: palette = ['#909CDC', '#7BD8DB', '#78DD89', '#CCE190']; mockFn = jest.fn(); renderWithThemeProvider(React__default.createElement(ColorSelect.Presets, { palette: palette, label: "Presets", onColorClick: mockFn })); preset = screen.getByLabelText(palette[1]); return [4 /*yield*/, userEvent.click(preset)]; case 1: _a.sent(); expect(mockFn).toBeCalledWith(palette[1]); return [2 /*return*/]; } }); }); }); it('Render a label for presets', function () { return __awaiter(void 0, void 0, void 0, function () { var palette, label, renderedLabel; return __generator(this, function (_a) { palette = ['#909CDC', '#7BD8DB', '#78DD89', '#CCE190']; label = 'My Label'; renderWithThemeProvider(React__default.createElement(ColorSelect.Presets, { palette: palette, label: label, onColorClick: function () { console.log('click '); } })); renderedLabel = document.querySelector('h6'); expect(renderedLabel.innerHTML).toBe(label); return [2 /*return*/]; }); }); }); });