UNPKG

stitch-ui

Version:

240 lines (215 loc) 7.14 kB
/* 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); }); });