stitch-ui
Version:
240 lines (215 loc) • 7.14 kB
JavaScript
/* global it, describe, beforeAll, beforeEach, afterEach, expect */
import React from "react"; // eslint-disable-line no-unused-vars
import { Provider } from "react-redux";
import { JSDOM } from "jsdom";
import { mount } from "enzyme";
import {
testSetup,
noConsoleErrorsAllowed,
braceCompatShim,
stubConfirmation
} from "../../testutil";
import * as homeActions from "../../home/actions";
import * as actions from "../actions";
import NamedPipelines from "../components/NamedPipelines";
global.navigator = {
userAgent: "node.js"
};
const doc = new JSDOM("<!doctype html><html><body></body></html>");
global.document = doc;
global.window = doc.defaultView;
braceCompatShim(global.window);
describe("named pipelines", () => {
noConsoleErrorsAllowed();
let store;
let testApp;
let display;
let actionSub;
beforeAll(async () => {
const testHarness = await testSetup();
store = testHarness.store;
actionSub = testHarness.actionSub;
testApp = await store.dispatch(
homeActions.createApp(testHarness.groupId, "my-test-app")
);
await new Promise(resolve => {
display = mount(
<Provider store={store}>
<NamedPipelines app={testApp} />
</Provider>
);
// Wait for the component's onComponentDidMount() to be finished.
actionSub.subscribe(actions.loadPipelinesActions.rcv.getType(), resolve);
});
});
beforeEach(() => {
actionSub.reset();
});
afterEach(() => {
actionSub.reset();
});
it("renders the 'new named pipeline' correctly", () => {
expect.assertions(2);
expect(
display.find("button").findWhere(x => x.text() === "New Pipeline")
).toHaveLength(1);
expect(display.find("div.splitpanel-rightside")).toHaveLength(0);
});
it("opens the editor after 'new named pipeline' is clicked", () => {
expect.assertions(1);
display
.find("button")
.findWhere(x => x.text() === "New Pipeline")
.simulate("click");
expect(display.find("div.splitpanel-is-right")).toHaveLength(1);
});
it("gives an error if trying to save a pipeline without setting the name", async () => {
expect.assertions(1);
display.find("input[name='name']").node.value = "";
await display
.find("button")
.findWhere(x => x.text() === "Save")
.simulate("click");
expect(display.find(".banner-error").text()).toEqual(
"Name must not be blank"
);
});
it("gives an error if trying to save a pipeline with an invalid name", async () => {
expect.assertions(2);
display.find("input[name='name']").node.value = "names cannot have spaces";
try {
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
} catch (e) {
expect(e.message).toMatch("invalid pipeline name");
expect(display.find(".banner-error").text()).toMatch(
"invalid pipeline name"
);
}
});
const validTestName = "validname";
it("saves successfully when name is valid", async () => {
display.find("input[name='name']").node.value = validTestName;
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(display.find(".banner-error")).toHaveLength(0);
expect(display.find("h3.panel-header-title").text()).toEqual(validTestName);
expect(display.find(".edit-list-item-is-active").text()).toEqual(
validTestName
);
});
it("can set the pipeline to private", async () => {
display
.find("input[name='private']")
.simulate("change", { target: { checked: true } });
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(display.find(".banner-error")).toHaveLength(0);
expect(display.find("h3.panel-header-title").text()).toEqual(validTestName);
expect(display.find("div.edit-list-item-is-active").text()).toEqual(
validTestName
);
expect(
store.getState().namedPipelines.namedPipelines.get(validTestName).value
.private
).toBe(true);
});
it("can set skipRules", async () => {
display
.find("input[name='skipRules']")
.simulate("change", { target: { checked: true } });
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(
store.getState().namedPipelines.namedPipelines.get(validTestName).value
.skipRules
).toBe(true);
});
it("gets an error if canEvaluate text is invalid JSON", async () => {
display.find("ReactAce").at(0).props().onChange("this is not valid json");
await display
.find("button")
.findWhere(x => x.text() === "Save")
.simulate("click");
expect(store.getState().namedPipelines.editing.canEvaluate.error).toBe(
"Invalid JSON"
);
expect(display.find(".banner-error").text()).toEqual("Invalid JSON");
});
it("can set canEvaluate", async () => {
display.find("ReactAce").at(0).props().onChange("{'foo':'blah'}");
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(
store.getState().namedPipelines.namedPipelines.get(validTestName).value
.canEvaluate
).toEqual({ foo: "blah" });
});
it("can switch between pipelines being edited", async () => {
const testname = `${validTestName}2`;
display
.find("button")
.findWhere(x => x.text() === "New Pipeline")
.simulate("click");
expect(display.find("div.splitpanel-is-right")).toHaveLength(1);
display.find("input[name='name']").node.value = testname;
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(display.find(".banner-error")).toHaveLength(0);
expect(display.find("h3.panel-header-title").text()).toEqual(testname);
expect(display.find("div.edit-list-item-is-active").text()).toEqual(
testname
);
display
.find("div.edit-list-item-info-name")
.findWhere(x => x.text() === validTestName)
.simulate("click");
expect(display.find("h3.panel-header-title").text()).toEqual(validTestName);
});
it("can add a parameter", async () => {
display
.find("button")
.findWhere(x => x.text() === "+ Add Parameter")
.simulate("click");
display
.find("input[name='pipeline_param/0']")
.simulate("change", { target: { value: "testing" } });
await display
.find("button")
.findWhere(x => x.text() === "Save")
.props()
.onClick();
expect(display.find("input[name='pipeline_param/0']").node.value).toBe(
"testing"
);
});
it("can delete the named pipeline successfully", async () => {
stubConfirmation(true);
await display
.find("button")
.findWhere(x => x.text().trim() === "Delete")
.at(0)
.props()
.onClick();
expect(display.find(".banner-error")).toHaveLength(0);
expect(display.find("div.splitpanel-rightside")).toHaveLength(0);
});
});