optimizely-oui
Version:
Optimizely's Component Library.
319 lines (310 loc) • 11.3 kB
JavaScript
;
var _react = _interopRequireDefault(require("react"));
var _lodash = require("lodash");
var _enzyme = require("enzyme");
var _index = _interopRequireDefault(require("../index"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var SAMPLE_DATA = [{
name: "error",
style: "error"
}, {
name: "no-style"
}, {
name: "primary",
style: "primary"
}, {
name: "secondary",
style: "secondary"
}, {
name: "tertiary",
style: "tertiary"
}];
describe("components/TokensInput", function () {
var component;
var mockOnChange;
var mockOnInputBlur;
var mockOnInputChange;
var mockOnInputFocus;
afterEach(function () {
if (component) {
component.unmount();
}
});
describe("rendering tokens", function () {
beforeEach(function () {
mockOnChange = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
});
function assertTokenRender(comp, style, font, text) {
expect(comp.find("[data-test-section=\"token-".concat(text, "\"]")).hasClass("oui-token-wrap--snug")).toBe(true);
expect(comp.find("[data-test-section=\"token-".concat(text, "\"] div.oui-token--").concat(style)).length).toBe(1);
expect(comp.find("[data-test-section=\"token-".concat(text, "\"] div.oui-token--").concat(font)).length).toBe(1);
expect(comp.find("[data-test-section=\"token-".concat(text, "\"] div.oui-token--").concat(font)).text()).toBe(text);
}
it("should render with 5 tokens", function () {
expect(component.find("Token").length).toBe(5);
});
it("should render tokens with errors correctly", function () {
var errorToken = component.find("Token").at(0);
assertTokenRender(errorToken, "error", "font-light", "error");
});
it("should render tokens with primary style correctly", function () {
var primaryToken = component.find("Token").at(2);
assertTokenRender(primaryToken, "primary", "font-light", "primary");
});
it("should render tokens with secondary style correctly", function () {
var secondaryToken = component.find("Token").at(3);
assertTokenRender(secondaryToken, "secondary", "font-light", "secondary");
});
it("should render tokens with tertiary style correctly", function () {
var tertiaryToken = component.find("Token").at(4);
assertTokenRender(tertiaryToken, "tertiary", "font-dark", "tertiary");
});
it("should render tokens with DismissButton correctly", function () {
expect(component.find("DismissButton").length).toBe(5);
});
});
describe("when rendering tokens with optional props", function () {
describe("when optional prop is placeholder", function () {
var inputCSS = ".flex.flex--1.min-width--150.no-border.soft-half--ends.soft--sides.border-radius.push-half--left";
beforeEach(function () {
mockOnChange = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
placeholder: "keywords",
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
});
it("should SHOW input has custom placeholder", function () {
expect(component.find("Token").length).toBe(5);
expect(component.find(inputCSS).props().readOnly).toBe(false);
expect(component.find(inputCSS).props().placeholder).toBe("keywords");
});
});
describe("when optional prop is maxTags", function () {
var inputCSS = ".flex.flex--1.no-border.soft-half--ends.soft--sides.border-radius.push-half--left";
beforeEach(function () {
mockOnChange = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
maxTags: 5,
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
});
it("should SHOW input is readonly if the number of tokens is not less than the value of maxTags", function () {
expect(component.find("Token").length).toBe(5);
expect(component.find(inputCSS).props().readOnly).toBe(true);
expect(component.find(inputCSS).props().placeholder).toBe("");
});
});
describe("when optional prop is isDisabled", function () {
beforeEach(function () {
mockOnChange = jest.fn();
});
it("should render DismissButton when isDisabled is false", function () {
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
isDisabled: false,
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
expect(component.find("DismissButton").length).toBe(5);
});
it("should not render DismissButton when isDisabled is true", function () {
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
isDisabled: true,
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
expect(component.find("DismissButton").length).toBe(0);
});
});
});
describe("entering tokens", function () {
describe("with the default addKeys", function () {
beforeEach(function () {
mockOnChange = jest.fn();
mockOnInputBlur = jest.fn();
mockOnInputChange = jest.fn();
mockOnInputFocus = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
onChange: mockOnChange,
onInputBlur: mockOnInputBlur,
onInputChange: mockOnInputChange,
onInputFocus: mockOnInputFocus,
tokens: SAMPLE_DATA
}));
});
it("should invoke onChange with the updated token list", function () {
var input = component.find("input");
input.simulate("change", {
target: {
value: "newtokenval"
}
});
input.simulate("keyDown", {
keyCode: 13,
key: "Enter"
});
component.update();
var expectedTokens = (0, _lodash.cloneDeep)(SAMPLE_DATA).concat({
name: "newtokenval"
});
expect(mockOnChange).toBeCalled();
expect(mockOnChange).toHaveBeenCalledWith(expectedTokens);
});
it("should not allow duplicates", function () {
var input = component.find("input");
input.simulate("change", {
target: {
value: "primary"
}
});
input.simulate("keyDown", {
keyCode: 13,
key: "Enter"
});
component.update();
expect(mockOnChange).toBeCalled();
expect(mockOnChange).toHaveBeenCalledWith(SAMPLE_DATA);
});
it("should call onInputChange when input is changed", function () {
var input = component.find("input");
input.simulate("change", {
target: {
value: "primary"
}
});
component.update();
expect(mockOnInputChange).toBeCalled();
});
it("should call onInputFocus when input is focused", function () {
var input = component.find("input");
input.simulate("focus");
expect(mockOnInputFocus).toBeCalled();
});
it("should call onInputBlur when input is blur", function () {
var input = component.find("input");
input.simulate("blur");
expect(mockOnInputBlur).toBeCalled();
});
});
describe("with extra addKeys allowed", function () {
beforeEach(function () {
mockOnChange = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
onChange: mockOnChange,
tokens: SAMPLE_DATA,
extraAddKeys: [" ", ".", "_", ","]
}));
});
it("should respect additional addKeys", function () {
var input = component.find("input");
input.simulate("change", {
target: {
value: "new-token-val"
}
});
input.simulate("keyDown", {
keyCode: 191,
key: "/"
});
component.update();
expect(mockOnChange).not.toBeCalled();
input.simulate("keyDown", {
keyCode: 13,
key: "Enter"
});
component.update();
var expectedTokens = (0, _lodash.cloneDeep)(SAMPLE_DATA).concat({
name: "new-token-val"
});
expect(mockOnChange).toBeCalled();
expect(mockOnChange).toHaveBeenCalledWith(expectedTokens);
});
it("should break up pasted strings based on the extra add keys", function () {
var input = component.find("input");
input.simulate("paste", {
clipboardData: {
getData: function getData() {
return "balloons_banana-smoothie hotdogs";
}
}
});
component.update();
var expectedTokens = (0, _lodash.cloneDeep)(SAMPLE_DATA).concat([{
name: "balloons"
}, {
name: "banana-smoothie"
}, {
name: "hotdogs"
}]);
expect(mockOnChange).toBeCalled();
expect(mockOnChange).toHaveBeenCalledWith(expectedTokens);
});
it("should break up pasted strings that contain tabs and newlines", function () {
var input = component.find("input");
/* eslint-disable no-tabs */
var testString = "\n\n some\n \ttokens\n \t\twith\n \t\t\ttabs and spaces\n \tone.two\n \tthree,\n \tfour_five\n\n ";
input.simulate("paste", {
clipboardData: {
getData: function getData() {
return testString;
}
}
});
component.update();
var expectedTokens = (0, _lodash.cloneDeep)(SAMPLE_DATA).concat([{
name: "some"
}, {
name: "tokens"
}, {
name: "with"
}, {
name: "tabs"
}, {
name: "and"
}, {
name: "spaces"
}, {
name: "one"
}, {
name: "two"
}, {
name: "three"
}, {
name: "four"
}, {
name: "five"
}]);
expect(mockOnChange).toBeCalled();
expect(mockOnChange).toHaveBeenCalledWith(expectedTokens);
});
});
});
describe("when given a className", function () {
it("appends it to the root element", function () {
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
className: "extra-class",
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
expect(component.prop("className").includes("extra-class")).toBe(true);
});
});
describe("when given an unknown prop", function () {
it("passes it to the root element", function () {
// @ts-ignore: `unknownProps` is not part of any typed interface and therefore a good test value.
component = (0, _enzyme.mount)(_react["default"].createElement(_index["default"], {
unknownProp: "some value",
onChange: mockOnChange,
tokens: SAMPLE_DATA
}));
expect(component).toHaveProp({
unknownProp: "some value"
});
});
});
});