const mockDevice = { registerGpio: jest.fn(() => Promise.resolve()), unregisterGpio: jest.fn(() => Promise.resolve()), }; jest.mock("../../../device", () => ({ getDevice: () => mockDevice })); jest.mock("../../../api/crud", () => ({ initSave: jest.fn() })); import * as React from "react"; import { mount, shallow } from "enzyme"; import { buildResourceIndex } from "../../../__test_support__/resource_index_builder"; import { TaggedSequence } from "farmbot"; import { fakeSequence } from "../../../__test_support__/fake_state/resources"; import { initSave } from "../../../api/crud"; import { PinBindingInputGroupProps } from "../interfaces"; import { PinBindingInputGroup, PinNumberInputGroup, BindingTypeDropDown, ActionTargetDropDown, SequenceTargetDropDown } from "../pin_binding_input_group"; import { fakeResourceIndex } from "../../../sequences/locals_list/test_helpers"; import { PinBindingType, PinBindingSpecialAction } from "farmbot/dist/resources/api_resources"; import { error, warning } from "../../../toast/toast"; const AVAILABLE_PIN = 18; describe("", () => { function fakeProps(): PinBindingInputGroupProps { const fakeResources: TaggedSequence[] = [fakeSequence(), fakeSequence()]; fakeResources[0].body.id = 1; fakeResources[0].body.name = "Sequence 1"; fakeResources[1].body.id = 2; fakeResources[1].body.name = "Sequence 2"; const resources = buildResourceIndex(fakeResources).index; return { pinBindings: [ { pin_number: 4, sequence_id: 1 }, { pin_number: 5, sequence_id: 2 }, ], dispatch: jest.fn(), resources: resources, }; } it("renders", () => { const wrapper = mount(); const buttons = wrapper.find("button"); expect(buttons.length).toBe(4); }); it("no pin selected", () => { const wrapper = mount(); const buttons = wrapper.find("button"); expect(buttons.last().text()).toEqual("BIND"); buttons.last().simulate("click"); expect(error).toHaveBeenCalledWith("Pin number cannot be blank."); }); it("no target selected", () => { const wrapper = mount(); const buttons = wrapper.find("button"); expect(buttons.last().text()).toEqual("BIND"); wrapper.setState({ pinNumberInput: AVAILABLE_PIN }); buttons.last().simulate("click"); expect(error).toHaveBeenCalledWith("Please select a sequence or action."); }); it("registers pin: api", () => { const p = fakeProps(); p.dispatch = jest.fn(); const wrapper = mount(); const buttons = wrapper.find("button"); expect(buttons.last().text()).toEqual("BIND"); wrapper.setState({ pinNumberInput: 1, sequenceIdInput: 2 }); buttons.last().simulate("click"); expect(mockDevice.registerGpio).not.toHaveBeenCalled(); expect(initSave).toHaveBeenCalledWith("PinBinding", { pin_num: 1, sequence_id: 2, binding_type: PinBindingType.standard }); }); it("registers pin: api (special action)", () => { const p = fakeProps(); p.dispatch = jest.fn(); const wrapper = mount(); const buttons = wrapper.find("button"); expect(buttons.last().text()).toEqual("BIND"); wrapper.setState({ pinNumberInput: 0, bindingType: PinBindingType.special, sequenceIdInput: undefined, specialActionInput: PinBindingSpecialAction.emergency_lock }); buttons.last().simulate("click"); expect(mockDevice.registerGpio).not.toHaveBeenCalled(); expect(initSave).toHaveBeenCalledWith("PinBinding", { pin_num: 0, binding_type: PinBindingType.special, special_action: PinBindingSpecialAction.emergency_lock }); }); it("sets sequence id", () => { const p = fakeProps(); const key = Object.keys(p.resources.byKind.Sequence)[0]; const s = p.resources.references[key]; const id = s?.body.id; const wrapper = mount(); expect(wrapper.instance().state.sequenceIdInput).toEqual(undefined); wrapper.instance().setSequenceIdInput({ label: "label", value: "" + id }); expect(wrapper.instance().state.sequenceIdInput).toEqual(id); }); it("sets pin", () => { const p = fakeProps(); const wrapper = mount(); expect(wrapper.instance().state.pinNumberInput).toEqual(undefined); const { pin_number } = p.pinBindings[0]; wrapper.instance().setSelectedPin(pin_number); // pin already bound expect(wrapper.instance().state.pinNumberInput).toEqual(undefined); wrapper.instance().setSelectedPin(99); // invalid pin expect(wrapper.instance().state.pinNumberInput).toEqual(undefined); wrapper.instance().setSelectedPin(AVAILABLE_PIN); // available pin expect(wrapper.instance().state.pinNumberInput).toEqual(AVAILABLE_PIN); wrapper.instance().setSelectedPin(1); // reserved pin expect(wrapper.instance().state.pinNumberInput).toEqual(1); expect(warning).toHaveBeenCalledWith( "Reserved Raspberry Pi pin may not work as expected."); }); it("changes pin number", () => { const wrapper = shallow(); expect(wrapper.instance().state.pinNumberInput).toEqual(undefined); wrapper.instance().setSelectedPin(AVAILABLE_PIN); expect(wrapper.instance().state.pinNumberInput).toEqual(AVAILABLE_PIN); }); it("changes binding type", () => { const wrapper = shallow(); expect(wrapper.instance().state.bindingType).toEqual(PinBindingType.standard); wrapper.instance().setBindingType({ label: "", value: PinBindingType.special }); expect(wrapper.instance().state.bindingType).toEqual(PinBindingType.special); }); it("changes special action", () => { const wrapper = shallow(); wrapper.setState({ bindingType: PinBindingType.special }); expect(wrapper.instance().state.specialActionInput).toEqual(undefined); wrapper.instance().setSpecialAction({ label: "", value: PinBindingSpecialAction.sync }); expect(wrapper.instance().state.specialActionInput) .toEqual(PinBindingSpecialAction.sync); }); }); describe("", () => { it("sets pin", () => { const setSelectedPin = jest.fn(); const wrapper = shallow(); wrapper.find("FBSelect").simulate("change", { label: "", value: AVAILABLE_PIN }); expect(setSelectedPin).toHaveBeenCalledWith(AVAILABLE_PIN); }); }); describe("", () => { it("sets binding type", () => { const setBindingType = jest.fn(); const wrapper = shallow(); const ddi = { label: "", value: PinBindingType.special }; wrapper.find("FBSelect").simulate("change", ddi); expect(setBindingType).toHaveBeenCalledWith(ddi); }); }); describe("", () => { it("sets action", () => { const setSpecialAction = jest.fn(); const wrapper = shallow(); const ddi = { label: "", value: PinBindingSpecialAction.sync }; wrapper.find("FBSelect").simulate("change", ddi); expect(setSpecialAction).toHaveBeenCalledWith(ddi); }); }); describe("", () => { it("sets sequence ID", () => { const setSequenceIdInput = jest.fn(); const wrapper = shallow(); const ddi = { label: "", value: 1 }; wrapper.find("SequenceSelectBox").simulate("change", ddi); expect(setSequenceIdInput).toHaveBeenCalledWith(ddi); }); });