optimizely-oui
Version:
Optimizely's Component Library.
277 lines (266 loc) • 10.8 kB
JavaScript
;
var _react = _interopRequireDefault(require("react"));
var _enzyme = require("enzyme");
var _enzymeToJson = require("enzyme-to-json");
var _mock_api = require("../mock_api");
var _mock_data = _interopRequireDefault(require("../mock_api/mock_data"));
var _ = _interopRequireDefault(require("../"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var MOCK_API_DELAY = 100;
var searchFunction = (0, _mock_api.getSearchFunction)(MOCK_API_DELAY);
var getDelayedPromise = function getDelayedPromise() {
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
return new Promise(function (r) {
return setTimeout(r, delay);
});
};
describe("components/SearchPicker", function () {
var component;
var renderedData;
var onItemSelectedStub;
describe("default case", function () {
beforeEach(function () {
onItemSelectedStub = jest.fn();
component = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
onItemSelected: onItemSelectedStub,
searchFunction: searchFunction,
supportedTypes: ["feature"]
}, function (data) {
renderedData = data;
return _react["default"].createElement("div", null, data.renderInput(), _react["default"].createElement("p", null, "A list of entities"));
}));
});
it("should render component same as snapshot", function () {
expect((0, _enzymeToJson.mountToJson)(component)).toMatchSnapshot();
});
it("should pass a default list of items on creation", function () {
return getDelayedPromise().then(function () {
component.find("input").simulate("click");
}).then(function () {
return getDelayedPromise(MOCK_API_DELAY);
}).then(function () {
component.update();
expect(renderedData.availableEntities).toHaveLength(5);
});
});
it("should update the list when a search term is entered", function () {
return getDelayedPromise().then(function () {
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: "123"
}
});
}) // Account for our mock API delay and the debounce delay
.then(function () {
return getDelayedPromise(MOCK_API_DELAY + 10);
}).then(function () {
component.update();
expect(renderedData.availableEntities).toHaveLength(1);
expect(renderedData.availableEntities[0].name).toContain("My feature 123");
});
});
it("should pass isLoading, searchQuery, and availableEntities correctly", function () {
expect(renderedData.isLoading).toBe(true);
return getDelayedPromise(MOCK_API_DELAY + 10).then(function () {
expect(renderedData.searchQuery).toBe("");
expect(renderedData.isLoading).toBe(false);
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: "123"
}
});
}) // Wait for debounce
.then(function () {
return getDelayedPromise(10);
}).then(function () {
expect(renderedData.searchQuery).toBe("123");
expect(renderedData.isLoading).toBe(true);
}) // Account for our mock API delay and the debounce delay
.then(function () {
return getDelayedPromise(MOCK_API_DELAY + 10);
}).then(function () {
component.update();
expect(renderedData.isLoading).toBe(false);
expect(renderedData.availableEntities).toEqual([_mock_data["default"][0]]);
});
});
it("should wait to show results until all queries are completed", function () {
expect(renderedData.isLoading).toBe(true);
return getDelayedPromise(MOCK_API_DELAY + 10).then(function () {
expect(renderedData.resultsText).toEqual({
summary: "Recently created features"
});
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: "123"
}
});
}) // Wait for debounce
.then(function () {
return getDelayedPromise(10);
}).then(function () {
expect(renderedData.searchQuery).toBe("123");
expect(renderedData.isLoading).toBe(true);
component.update();
expect(renderedData.resultsText).toEqual({
summary: 'Searching for "features" matching "123"'
});
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: "202"
}
});
}).then(function () {
return getDelayedPromise(MOCK_API_DELAY);
}).then(function () {
component.update();
expect(renderedData.resultsText).toEqual({
summary: 'Searching for "features" matching "202"'
});
}) // Account for our mock API delay and the debounce delay
.then(function () {
return getDelayedPromise(MOCK_API_DELAY + 10);
}).then(function () {
component.update();
expect(renderedData.isLoading).toBe(false);
expect(renderedData.resultsText).toEqual({
summary: 'Found 1 features matching "202"'
});
});
});
it("should render the number of available entities in the results text", function () {
// We need to pass in selected entities to properly test this
component.setProps({
selectedEntityIds: [202, 205, 207]
});
component.update();
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: "audience 20"
}
});
return getDelayedPromise(MOCK_API_DELAY + 10).then(function () {
component.update();
expect(renderedData.resultsText).toEqual({
summary: 'Found 4 features matching "audience 20"'
});
});
});
});
describe("Custom search result filtering with filterAvailableEntities", function () {
beforeEach(function () {
function customSearchResultsFilter(searchResults) {
return searchResults.filter(function (result) {
return result.id === 123;
});
}
component = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
filterAvailableEntities: customSearchResultsFilter,
onItemSelected: jest.fn(),
searchFunction: searchFunction,
supportedTypes: ["feature"]
}, function (data) {
renderedData = data;
return _react["default"].createElement("div", null, data.renderInput(), _react["default"].createElement("p", null, "A list of entities"));
}));
});
it("should filter based on the criteria defined in the filterAvailableEntities function", function () {
component.find("input").simulate("mouseenter");
component.find("input").simulate("click");
component.find("input").simulate("change", {
target: {
value: ""
}
});
return getDelayedPromise(MOCK_API_DELAY + 10).then(function () {
component.update();
var _renderedData = renderedData,
availableEntities = _renderedData.availableEntities;
expect(availableEntities).toHaveLength(1);
expect(availableEntities[0].id).toEqual(123);
});
});
});
describe("searchFunction responses", function () {
it("should update state when an Array is returned from searchFunction", function () {
onItemSelectedStub = jest.fn();
var allGoodSearchFn = jest.fn(function () {
return new Promise(function (resolve) {
return resolve([{
id: 123,
name: "My feature 123",
type: "feature",
description: "A very cool feature"
}]);
});
});
component = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
onItemSelected: onItemSelectedStub,
searchFunction: allGoodSearchFn,
supportedTypes: ["feature"]
}, function (data) {
renderedData = data;
return _react["default"].createElement("div", null, data.renderInput(), _react["default"].createElement("p", null, "A list of entities"));
}));
return allGoodSearchFn().then(function () {
var defaultResultsState = component.children().instance().state.defaultResults;
expect(defaultResultsState).toEqual([{
id: 123,
name: "My feature 123",
type: "feature",
description: "A very cool feature"
}]);
});
});
it("should not update state when an object is returned from searchFunction", function () {
onItemSelectedStub = jest.fn();
var notGoodSearchFn = jest.fn(function () {
return new Promise(function (resolve) {
return resolve({});
});
});
component = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
onItemSelected: onItemSelectedStub,
searchFunction: notGoodSearchFn,
supportedTypes: ["feature"]
}, function (data) {
renderedData = data;
return _react["default"].createElement("div", null, data.renderInput(), _react["default"].createElement("p", null, "A list of entities"));
}));
return notGoodSearchFn().then(function () {
var defaultResultsState = component.children().instance().state.defaultResults;
expect(defaultResultsState).toEqual([]);
});
});
it("should not update state when undefined is returned from searchFunction", function () {
onItemSelectedStub = jest.fn();
var notGoodSearchFn = jest.fn(function () {
return new Promise(function (resolve) {
return resolve(undefined);
});
});
component = (0, _enzyme.mount)(_react["default"].createElement(_["default"], {
onItemSelected: onItemSelectedStub,
searchFunction: notGoodSearchFn,
supportedTypes: ["feature"]
}, function (data) {
renderedData = data;
return _react["default"].createElement("div", null, data.renderInput(), _react["default"].createElement("p", null, "A list of entities"));
}));
return notGoodSearchFn().then(function () {
var defaultResultsState = component.children().instance().state.defaultResults;
expect(defaultResultsState).toEqual([]);
});
});
});
});