UNPKG

optimizely-oui

Version:

Optimizely's Component Library.

307 lines (300 loc) 11.5 kB
"use strict"; var _react = _interopRequireDefault(require("react")); var _enzyme = require("enzyme"); var _Dropdown = _interopRequireDefault(require("../../Dropdown")); var _index = _interopRequireDefault(require("../index")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } describe("components/SelectDropdown", function () { var component; var onChange; var items = [{ label: "label 1", value: "value 1", description: "description 1" }, { label: "label 2", value: "value 2", description: "description 2" }]; var multiSelectItems = [{ label: "label 1", value: "value 1", description: "description 1" }, { label: "label 2", value: "value 2", description: "description 2", isSelected: true }]; beforeEach(function () { onChange = jest.fn(); }); it("should render all items in dropdown", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); var listItems = component.find(_Dropdown["default"].ListItem); expect(listItems).toHaveLength(2); var item1 = listItems.at(0); expect(item1.text()).toContain("label 1"); expect(item1.text()).toContain("description 1"); expect(item1.find(_Dropdown["default"].BlockLink).props().isLink).toEqual(true); var item2 = listItems.at(1); expect(item2.text()).toContain("label 2"); expect(item2.text()).toContain("description 2"); expect(item2.find(_Dropdown["default"].BlockLink).props().isLink).toEqual(false); }); it("should call onChange when another item is selected", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); var listItems = component.find("DropdownBlockLink"); var item1 = listItems.at(0).find('[data-test-section="dropdown-block-link-value 1"]'); item1.simulate("click"); expect(onChange).toHaveBeenCalled(); expect(onChange).toHaveBeenCalledWith("value 1"); }); it("should set the width of the activator", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange, width: "400px" })); expect(component.find("Dropdown").find("div.oui-dropdown-group__activator").props().style).toEqual({ width: "400px" }); }); it("should pass fullWidth prop to Dropdown", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange, fullWidth: true })); expect(component.find("Dropdown").prop("fullWidth")).toEqual(true); }); it("should set the maxWidth of the activator", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange, maxWidth: "100px" })); expect(component.find("Dropdown").find("div.oui-dropdown-group__activator").props().style).toEqual({ maxWidth: "100px", width: "100%" }); }); it("should contain error class", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange, displayError: true })); expect(component.find(".oui-form-bad-news").length).toBe(1); }); it("should set the width of the content", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, value: "value 2", onChange: onChange, minDropdownWidth: "400px" })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find("DropdownContents").prop("minWidth")).toEqual("400px"); }); it("should not render DropdownContents when isDisabled is true", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, isDisabled: true, value: "value 2", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find("Dropdown").prop("isDisabled")).toEqual(true); expect(component.find("DropdownContents").length).toEqual(0); }); it("should display activatorLabel if provided", function () { var itemsWithActivatorLabel = [{ activatorLabel: "Production", label: "Production (50%)", value: "Production" }, { activatorLabel: "Staging", label: "Staging (100%)", value: "Staging" }]; component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: itemsWithActivatorLabel, value: "Production", onChange: onChange })); var activator = component.find("Button"); expect(activator.text()).toBe("Production"); }); it("should display initialPlaceholder if provided", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: items, initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); expect(activator.text()).toBe("Select a value..."); }); it("should display items with checkboxes if isMultiSelect is true", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { isMultiSelect: true, items: items, initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find('input[type="checkbox"]').length).toBe(2); }); it("should display items with checked checkboxes if item's isSelected is true", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { isMultiSelect: true, items: multiSelectItems, initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find("Checkbox").length).toBe(2); expect(component.find("Checkbox").last().prop("checked")).toBe(true); }); it("should add a label when the buttonContent specifies one", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { buttonContent: { label: "date", content: "test" }, items: items, initialPlaceholder: "Select a value...", onChange: onChange })); expect(component.find(".oui-assistive-text").length).toBe(1); }); it("should add a label when label specifies one", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { label: "date", items: items, initialPlaceholder: "Select a value...", onChange: onChange })); expect(component.find(".oui-label").length).toBe(1); }); it("should add a note when note specifies one", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { note: "You have an error", items: items, initialPlaceholder: "Select a value...", onChange: onChange })); expect(component.find(".oui-form-note").length).toBe(1); }); describe("links", function () { describe("if linkURL and linkText are provided", function () { beforeEach(function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { isMultiSelect: true, items: [{ label: "label0", value: "value0", description: "description0", linkURL: "#", linkText: "some link" }].concat(items), initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); }); it("should display text and link", function () { expect(component.find("DropdownListItem").at(0).find("Link").length).toBe(1); expect(component.find("DropdownListItem").at(0).find("Link").text()).toBe("some link"); expect(component.find("DropdownListItem").at(0).find("Link").props().href).toBe("#"); }); it("should not close the dropdown if clicked", function () { var link = component.find("DropdownListItem").at(0).find("Link"); link.simulate("click"); // clicking on the link shouldn't close the dropdown // check that the dropdown contents box doesn't close on link click var dropdownContents = component.find("DropdownContents"); expect(dropdownContents.length).toBe(1); }); }); describe("if linkURL is not provided", function () { it("should not display text and link", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: [{ label: "label0", value: "value0", description: "description0", linkURL: "#" }].concat(items), initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find("DropdownListItem").at(0).find("Link").length).toBe(0); }); }); describe("if linkText is not provided", function () { it("should not display text and link", function () { component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], { items: [{ label: "label0", value: "value0", description: "description0", linkText: "some link" }].concat(items), initialPlaceholder: "Select a value...", onChange: onChange })); var activator = component.find("Button"); activator.simulate("click"); expect(component.find("DropdownListItem").at(0).find("Link").length).toBe(0); }); }); }); describe("when given a className", function () { it("appends it to the input element", function () { var component = (0, _enzyme.shallow)(_react["default"].createElement(_index["default"], { className: "extra-class", items: items, value: "value 2", onChange: onChange })); expect(component.prop("className").includes("extra-class")).toBe(true); }); }); describe("when given an unknown prop", function () { it("passes it to the input element", function () { // @ts-ignore: `unknownProps` is not part of any typed interface and therefore a good test value. var component = (0, _enzyme.shallow)(_react["default"].createElement(_index["default"], { unknownProp: "some value", items: items, value: "value 2", onChange: onChange })); expect(component).toHaveProp({ unknownProp: "some value" }); }); }); });