import { fromJS } from "immutable" import React from "react" import expect from "expect" import { configure, mount } from "enzyme" import Adapter from "enzyme-adapter-react-15" import AddForm from "src/standalone/topbar-insert/forms/components/AddForm" import FormChild from "src/standalone/topbar-insert/forms/components/FormChild" import FormDropdown from "src/standalone/topbar-insert/forms/components/FormDropdown" import FormInput from "src/standalone/topbar-insert/forms/components/FormInput" import FormInputWrapper from "src/standalone/topbar-insert/forms/components/FormInputWrapper" import FormMap from "src/standalone/topbar-insert/forms/components/FormMap" import InsertForm from "src/standalone/topbar-insert/forms/components/InsertForm" import InsertFormInput from "src/standalone/topbar-insert/forms/components/InsertFormInput" import InsertFormList from "src/standalone/topbar-insert/forms/components/InsertFormList" configure({ adapter: new Adapter() }) describe("editor topbar insert form UI generation", function() { this.timeout(10 * 1000) let components, props beforeEach(() => { components = { FormDropdown, AddForm, FormChild, FormInput, FormInputWrapper, FormMap, InsertForm, InsertFormInput, InsertFormList } props = { getComponent: (c) => components[c] } }) it("should produce a valid form UI for a simple form object", () => { const form = fromJS({ fielda: { value: "test value", isRequired: true, name: "field a", updateForm: () => null } }) const element = const wrapper = mount(element) expect(wrapper.find("input").length).toEqual(1) }) it("should produce a form ui with a dropdown", () => { const form = fromJS({ fielda: { value: "", isRequired: true, name: "field a", options: ["optiona", "optionb"], updateForm: () => null } }) const element = const wrapper = mount(element) expect(wrapper.find("select").length).toEqual(1) }) it("should produce a form ui with a list control", () => { const listControlItem = (updateForm, path) => fromJS({ listItem: { value: "list item value", name: "List Item", updateForm: newForm => updateForm(newForm, path.concat(["listItem"])) } }) let path = [] const form = fromJS({ fielda: { value: [listControlItem(() => null, path.concat(["fielda", "value", 0]))], isRequired: true, name: "field a", updateForm: () => null, defaultItem: i => listControlItem(() => null, path.concat(["fielda", "value", i]) ) } }) const element = const wrapper = mount(element) expect(wrapper.find("input").length).toEqual(1) expect(wrapper.find("a").length).toEqual(1) }) it("should produce a form ui with a map", () => { const form = fromJS({ fielda: { keyValue: "", value: { fieldb: { value: "test value", isRequired: true, name: "field b", updateForm: () => null } }, isRequired: true, name: "field a", updateForm: () => null } }) const element = const wrapper = mount(element) expect(wrapper.find("input").length).toEqual(2) }) it("should not render an input that depends on an input with no value", () => { const form = fromJS({ fielda: { value: "", isRequired: true, name: "field a", options: ["optiona", "optionb"], updateForm: () => null }, fieldb: { dependsOn: ["fielda", "value"], updateOptions: () => { return ["option c", "option d"] }, value: "", isRequired: true, name: "field a", options: [], updateForm: () => null }, }) const element = const wrapper = mount(element) expect(wrapper.find("select").length).toEqual(1) }) it("should render an input that depends on an input with a value", () => { const form = fromJS({ fielda: { value: "optiona", isRequired: true, name: "field a", options: ["optiona", "optionb"], updateForm: () => null }, fieldb: { dependsOn: ["fielda", "value"], updateOptions: () => { return ["option c", "option d"] }, value: "", isRequired: true, name: "field a", options: [], updateForm: () => null }, }) const element = const wrapper = mount(element) expect(wrapper.find("select").length).toEqual(2) }) })