import configureMockStore from "redux-mock-store"; import thunk from "redux-thunk"; import fetchMock from "fetch-mock"; import reducer, { FETCH_PLUGINS, FETCH_PLUGINS_PENDING, FETCH_PLUGINS_SUCCESS, FETCH_PLUGINS_FAILURE, FETCH_PLUGIN, FETCH_PLUGIN_PENDING, FETCH_PLUGIN_SUCCESS, FETCH_PLUGIN_FAILURE, fetchPluginsByLink, fetchPluginsSuccess, getPluginCollection, isFetchPluginsPending, getFetchPluginsFailure, fetchPluginByLink, fetchPluginByName, fetchPluginSuccess, getPlugin, isFetchPluginPending, getFetchPluginFailure } from "./plugins"; import { Plugin, PluginCollection } from "@scm-manager/ui-types"; const groupManagerPlugin: Plugin = { name: "scm-groupmanager-plugin", bundles: ["/scm/groupmanager-plugin.bundle.js"], type: "Administration", version: "2.0.0-SNAPSHOT", author: "Sebastian Sdorra", description: "Notify a remote webserver whenever a plugin is pushed to.", _links: { self: { href: "http://localhost:8081/api/v2/ui/plugins/scm-groupmanager-plugin" } } }; const scriptPlugin: Plugin = { name: "scm-script-plugin", bundles: ["/scm/script-plugin.bundle.js"], type: "Miscellaneous", version: "2.0.0-SNAPSHOT", author: "Sebastian Sdorra", description: "Script support for scm-manager.", _links: { self: { href: "http://localhost:8081/api/v2/ui/plugins/scm-script-plugin" } } }; const branchwpPlugin: Plugin = { name: "scm-branchwp-plugin", bundles: ["/scm/branchwp-plugin.bundle.js"], type: "Miscellaneous", version: "2.0.0-SNAPSHOT", author: "Sebastian Sdorra", description: "This plugin adds branch write protection for plugins.", _links: { self: { href: "http://localhost:8081/api/v2/ui/plugins/scm-branchwp-plugin" } } }; const pluginCollectionWithNames: PluginCollection = { _links: { self: { href: "http://localhost:8081/api/v2/ui/plugins" } }, _embedded: { plugins: [groupManagerPlugin.name, scriptPlugin.name, branchwpPlugin.name] } }; const pluginCollection: PluginCollection = { _links: { self: { href: "http://localhost:8081/api/v2/ui/plugins" } }, _embedded: { plugins: [groupManagerPlugin, scriptPlugin, branchwpPlugin] } }; describe("plugins fetch", () => { const URL = "ui/plugins"; const PLUGINS_URL = "/api/v2/ui/plugins"; const mockStore = configureMockStore([thunk]); afterEach(() => { fetchMock.reset(); fetchMock.restore(); }); it("should successfully fetch plugins from link", () => { fetchMock.getOnce(PLUGINS_URL, pluginCollection); const expectedActions = [ { type: FETCH_PLUGINS_PENDING }, { type: FETCH_PLUGINS_SUCCESS, payload: pluginCollection } ]; const store = mockStore({}); return store.dispatch(fetchPluginsByLink(URL)).then(() => { expect(store.getActions()).toEqual(expectedActions); }); }); it("should dispatch FETCH_PLUGINS_FAILURE if request fails", () => { fetchMock.getOnce(PLUGINS_URL, { status: 500 }); const store = mockStore({}); return store.dispatch(fetchPluginsByLink(URL)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_PLUGINS_PENDING); expect(actions[1].type).toEqual(FETCH_PLUGINS_FAILURE); expect(actions[1].payload).toBeDefined(); }); }); it("should successfully fetch scm-groupmanager-plugin by name", () => { fetchMock.getOnce( PLUGINS_URL + "/scm-groupmanager-plugin", groupManagerPlugin ); const expectedActions = [ { type: FETCH_PLUGIN_PENDING, payload: { name: "scm-groupmanager-plugin" }, itemId: "scm-groupmanager-plugin" }, { type: FETCH_PLUGIN_SUCCESS, payload: groupManagerPlugin, itemId: "scm-groupmanager-plugin" } ]; const store = mockStore({}); return store .dispatch(fetchPluginByName(URL, "scm-groupmanager-plugin")) .then(() => { expect(store.getActions()).toEqual(expectedActions); }); }); it("should dispatch FETCH_PLUGIN_FAILURE, if the request for scm-groupmanager-plugin by name fails", () => { fetchMock.getOnce(PLUGINS_URL + "/scm-groupmanager-plugin", { status: 500 }); const store = mockStore({}); return store .dispatch(fetchPluginByName(URL, "scm-groupmanager-plugin")) .then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_PLUGIN_PENDING); expect(actions[1].type).toEqual(FETCH_PLUGIN_FAILURE); expect(actions[1].payload.name).toBe("scm-groupmanager-plugin"); expect(actions[1].payload.error).toBeDefined(); expect(actions[1].itemId).toBe("scm-groupmanager-plugin"); }); }); it("should successfully fetch scm-groupmanager-plugin", () => { fetchMock.getOnce( "http://localhost:8081/api/v2/ui/plugins/scm-groupmanager-plugin", groupManagerPlugin ); const expectedActions = [ { type: FETCH_PLUGIN_PENDING, payload: { name: "scm-groupmanager-plugin" }, itemId: "scm-groupmanager-plugin" }, { type: FETCH_PLUGIN_SUCCESS, payload: groupManagerPlugin, itemId: "scm-groupmanager-plugin" } ]; const store = mockStore({}); return store.dispatch(fetchPluginByLink(groupManagerPlugin)).then(() => { expect(store.getActions()).toEqual(expectedActions); }); }); it("should dispatch FETCH_PLUGIN_FAILURE, it the request for scm-groupmanager-plugin fails", () => { fetchMock.getOnce( "http://localhost:8081/api/v2/ui/plugins/scm-groupmanager-plugin", { status: 500 } ); const store = mockStore({}); return store.dispatch(fetchPluginByLink(groupManagerPlugin)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_PLUGIN_PENDING); expect(actions[1].type).toEqual(FETCH_PLUGIN_FAILURE); expect(actions[1].payload.name).toBe("scm-groupmanager-plugin"); expect(actions[1].payload.error).toBeDefined(); expect(actions[1].itemId).toBe("scm-groupmanager-plugin"); }); }); }); describe("plugins reducer", () => { it("should return empty object, if state and action is undefined", () => { expect(reducer()).toEqual({}); }); it("should return the same state, if the action is undefined", () => { const state = { x: true }; expect(reducer(state)).toBe(state); }); it("should return the same state, if the action is unknown to the reducer", () => { const state = { x: true }; expect( reducer(state, { type: "EL_SPECIALE" }) ).toBe(state); }); it("should store the plugins by it's type and name on FETCH_PLUGINS_SUCCESS", () => { const newState = reducer({}, fetchPluginsSuccess(pluginCollection)); expect(newState.list._embedded.plugins).toEqual([ "scm-groupmanager-plugin", "scm-script-plugin", "scm-branchwp-plugin" ]); expect(newState.byNames["scm-groupmanager-plugin"]).toBe( groupManagerPlugin ); expect(newState.byNames["scm-script-plugin"]).toBe(scriptPlugin); expect(newState.byNames["scm-branchwp-plugin"]).toBe(branchwpPlugin); }); it("should store the plugin at byNames", () => { const newState = reducer({}, fetchPluginSuccess(groupManagerPlugin)); expect(newState.byNames["scm-groupmanager-plugin"]).toBe( groupManagerPlugin ); }); }); describe("plugins selectors", () => { const error = new Error("something went wrong"); it("should return the plugins collection", () => { const state = { plugins: { list: pluginCollectionWithNames, byNames: { "scm-groupmanager-plugin": groupManagerPlugin, "scm-script-plugin": scriptPlugin, "scm-branchwp-plugin": branchwpPlugin } } }; const collection = getPluginCollection(state); expect(collection).toEqual(pluginCollection); }); it("should return true, when fetch plugins is pending", () => { const state = { pending: { [FETCH_PLUGINS]: true } }; expect(isFetchPluginsPending(state)).toEqual(true); }); it("should return false, when fetch plugins is not pending", () => { expect(isFetchPluginsPending({})).toEqual(false); }); it("should return error when fetch plugins did fail", () => { const state = { failure: { [FETCH_PLUGINS]: error } }; expect(getFetchPluginsFailure(state)).toEqual(error); }); it("should return undefined when fetch plugins did not fail", () => { expect(getFetchPluginsFailure({})).toBe(undefined); }); it("should return the plugin collection", () => { const state = { plugins: { byNames: { "scm-groupmanager-plugin": groupManagerPlugin } } }; const plugin = getPlugin(state, "scm-groupmanager-plugin"); expect(plugin).toEqual(groupManagerPlugin); }); it("should return true, when fetch plugin is pending", () => { const state = { pending: { [FETCH_PLUGIN + "/scm-groupmanager-plugin"]: true } }; expect(isFetchPluginPending(state, "scm-groupmanager-plugin")).toEqual( true ); }); it("should return false, when fetch plugin is not pending", () => { expect(isFetchPluginPending({}, "scm-groupmanager-plugin")).toEqual(false); }); it("should return error when fetch plugin did fail", () => { const state = { failure: { [FETCH_PLUGIN + "/scm-groupmanager-plugin"]: error } }; expect(getFetchPluginFailure(state, "scm-groupmanager-plugin")).toEqual( error ); }); it("should return undefined when fetch plugin did not fail", () => { expect(getFetchPluginFailure({}, "scm-groupmanager-plugin")).toBe( undefined ); }); });