import React from "react";
import { mount } from "enzyme";
import { noop } from "lodash";
import { fillInFormInput } from "test/helpers";
import targetMock from "test/target_mock";
import QueryForm from "./index";
const query = {
id: 1,
name: "All users",
description: "Query to get all users",
query: "SELECT * FROM users",
};
const queryText = "SELECT * FROM users";
const defaultProps = {
handleSubmit: noop,
onTargetSelect: noop,
onOsqueryTableSelect: noop,
onRunQuery: noop,
onUpdate: noop,
};
describe("QueryForm - component", () => {
beforeEach(targetMock);
it("renders the base error", () => {
const baseError = "Unable to authenticate the current user";
const formWithError = mount(
);
const formWithoutError = mount();
expect(formWithError.text()).toContain(baseError);
expect(formWithoutError.text()).not.toContain(baseError);
});
it("renders InputFields for the query name and description", () => {
const form = mount(
);
const inputFields = form.find("InputField");
expect(inputFields.length).toEqual(2);
expect(inputFields.find({ name: "name" }).length).toBeGreaterThan(0);
expect(inputFields.find({ name: "description" }).length).toBeGreaterThan(0);
});
it("validates the query name before saving changes", () => {
const updateSpy = jest.fn();
const form = mount(
);
const inputFields = form.find("InputField");
const nameInput = inputFields.find({ name: "name" });
fillInFormInput(nameInput, "");
const saveDropButton = form.find(".query-form__save").hostNodes();
saveDropButton.simulate("click");
form.find("li").first().find("Button").simulate("click");
expect(updateSpy).not.toHaveBeenCalled();
});
it("calls the handleSubmit prop when the form is valid", () => {
const spy = jest.fn();
const form = mount(
);
const inputFields = form.find("InputField");
const nameInput = inputFields.find({ name: "name" });
fillInFormInput(nameInput, "New query name");
const saveDropButton = form.find(".query-form__save").hostNodes();
saveDropButton.simulate("click");
form.find("li").first().find("Button").simulate("click");
expect(spy).toHaveBeenCalledWith({
description: query.description,
name: "New query name",
query: queryText,
});
});
it("enables the Save Changes button when the name input changes", () => {
const form = mount(
);
const inputFields = form.find("InputField");
const nameInput = inputFields.find('input[name="name"]');
let saveChangesOption = form
.find("li.dropdown-button__option")
.first()
.find("Button");
expect(saveChangesOption.props()).toMatchObject({
disabled: true,
});
fillInFormInput(nameInput, "New query name");
nameInput.simulate("change", { target: { value: "New query name" } });
saveChangesOption = form
.find("li.dropdown-button__option")
.first()
.find("Button");
expect(saveChangesOption.props()).not.toMatchObject({
disabled: true,
});
});
it("enables the Save Changes button when the description input changes", () => {
const form = mount(
);
const inputFields = form.find("InputField");
const descriptionInput = inputFields.find({ name: "description" });
let saveChangesOption = form
.find("li.dropdown-button__option")
.first()
.find("Button");
expect(saveChangesOption.props()).toMatchObject({
disabled: true,
});
fillInFormInput(descriptionInput, "New query description");
saveChangesOption = form
.find("li.dropdown-button__option")
.first()
.find("Button");
expect(saveChangesOption.props()).not.toMatchObject({
disabled: true,
});
});
it('calls the onSaveAsNew prop when "Save As New" is clicked and the form is valid', () => {
const onSaveAsNewSpy = jest.fn();
const form = mount(
);
const inputFields = form.find("InputField");
const nameInput = inputFields.find({ name: "name" });
const saveAsNewOption = form
.find("li.dropdown-button__option")
.last()
.find("Button");
fillInFormInput(nameInput, "New query name");
saveAsNewOption.simulate("click");
expect(onSaveAsNewSpy).toHaveBeenCalled();
expect(onSaveAsNewSpy).toHaveBeenCalledWith({
...query,
name: "New query name",
query: queryText,
});
});
it('does not call the onSaveAsNew prop when "Save As New" is clicked and the form is not valid', () => {
const onSaveAsNewSpy = jest.fn();
const form = mount(
);
const inputFields = form.find("InputField");
const nameInput = inputFields.find({ name: "name" });
const saveAsNewOption = form
.find("li.dropdown-button__option")
.last()
.find("Button");
fillInFormInput(nameInput, "");
saveAsNewOption.simulate("click");
expect(onSaveAsNewSpy).not.toHaveBeenCalled();
expect(form.state()).toMatchObject({
errors: {
name: "Title must be present",
},
});
});
});