diff --git a/scm-ui/src/tests/enzyme.js b/scm-ui/src/tests/enzyme.js new file mode 100644 index 0000000000..f3d2609d92 --- /dev/null +++ b/scm-ui/src/tests/enzyme.js @@ -0,0 +1,13 @@ +import "raf/polyfill"; + +// Temporary hack to suppress error +// https://github.com/facebook/create-react-app/issues/3199#issuecomment-345024029 +window.requestAnimationFrame = function(callback) { + setTimeout(callback, 0); + return 0; +}; + +import { configure } from "enzyme"; +import Adapter from "enzyme-adapter-react-16"; + +configure({ adapter: new Adapter() }); diff --git a/scm-ui/src/users/containers/DeleteUserButton.test.js b/scm-ui/src/users/containers/DeleteUserButton.test.js index 915ef46828..fd0965c9ef 100644 --- a/scm-ui/src/users/containers/DeleteUserButton.test.js +++ b/scm-ui/src/users/containers/DeleteUserButton.test.js @@ -1,15 +1,11 @@ import React from "react"; -import { configure, mount, shallow } from "enzyme"; +import { mount, shallow } from "enzyme"; +import "../../tests/enzyme"; import DeleteUserButton from "./DeleteUserButton"; -import Adapter from "enzyme-adapter-react-16"; import { confirmAlert } from "../../components/ConfirmAlert"; jest.mock("../../components/ConfirmAlert"); -import "raf/polyfill"; - -configure({ adapter: new Adapter() }); - describe("DeleteUserButton", () => { it("should render nothing, if the delete link is missing", () => { const entry = { @@ -38,9 +34,6 @@ describe("DeleteUserButton", () => { const button = mount( {}} /> ); - - console.log(button); - expect(button.text()).not.toBe(""); }); diff --git a/scm-ui/src/users/containers/EditUserButton.test.js b/scm-ui/src/users/containers/EditUserButton.test.js index a5148d82c6..e02779143a 100644 --- a/scm-ui/src/users/containers/EditUserButton.test.js +++ b/scm-ui/src/users/containers/EditUserButton.test.js @@ -1,11 +1,7 @@ import React from "react"; import { configure, shallow } from "enzyme"; +import "../../tests/enzyme"; import EditUserButton from "./EditUserButton"; -import Adapter from "enzyme-adapter-react-16"; - -import "raf/polyfill"; - -configure({ adapter: new Adapter() }); it("should render nothing, if the edit link is missing", () => { const entry = { diff --git a/scm-ui/src/users/containers/Users.js b/scm-ui/src/users/containers/Users.js index 5959254a3c..eb91b14866 100644 --- a/scm-ui/src/users/containers/Users.js +++ b/scm-ui/src/users/containers/Users.js @@ -11,6 +11,7 @@ import { getUsersFromState } from "../modules/users"; import Loading from "../../components/Loading"; +import ErrorNotification from "../../components/ErrorNotification"; import UserForm from "./UserForm"; import UserTable from "./UserTable"; import type { User } from "../types/User"; @@ -68,10 +69,11 @@ class Users extends React.Component { } renderContent() { - const { userEntries, deleteUser, editUser, userToEdit } = this.props; + const { userEntries, deleteUser, editUser, userToEdit, error } = this.props; if (userEntries) { return (
+ { } return { userEntries, - userToEdit + userToEdit, + error: state.users.error }; }; diff --git a/scm-ui/src/users/modules/users.test.js b/scm-ui/src/users/modules/users.test.js index 5069888a2f..56e2a9e0de 100644 --- a/scm-ui/src/users/modules/users.test.js +++ b/scm-ui/src/users/modules/users.test.js @@ -1,7 +1,4 @@ //@flow -import React from "react"; -import { configure, shallow } from "enzyme"; -import Adapter from "enzyme-adapter-react-16"; import configureMockStore from "redux-mock-store"; import thunk from "redux-thunk"; import fetchMock from "fetch-mock"; @@ -21,15 +18,15 @@ import { UPDATE_USER_SUCCESS, EDIT_USER, requestDeleteUser, - deleteUserFailure + deleteUserFailure, + DELETE_USER, + DELETE_USER_SUCCESS, + DELETE_USER_FAILURE, + deleteUser } from "./users"; import reducer from "./users"; -import "raf/polyfill"; - -configure({ adapter: new Adapter() }); - const userZaphod = { active: true, admin: true, @@ -165,15 +162,20 @@ describe("users fetch()", () => { }); it("should add a user successfully", () => { + // unmatched fetchMock.postOnce("/scm/api/rest/v2/users", { status: 204 }); + // after create, the users are fetched again + fetchMock.getOnce("/scm/api/rest/v2/users", response); + const store = mockStore({}); return store.dispatch(addUser(userZaphod)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(ADD_USER); expect(actions[1].type).toEqual(ADD_USER_SUCCESS); + expect(actions[2].type).toEqual(FETCH_USERS); }); }); @@ -195,12 +197,15 @@ describe("users fetch()", () => { fetchMock.putOnce("http://localhost:8081/scm/api/rest/v2/users/zaphod", { status: 204 }); + // after update, the users are fetched again + fetchMock.getOnce("/scm/api/rest/v2/users", response); const store = mockStore({}); return store.dispatch(updateUser(userZaphod)).then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(UPDATE_USER); expect(actions[1].type).toEqual(UPDATE_USER_SUCCESS); + expect(actions[2].type).toEqual(FETCH_USERS); }); }); @@ -217,6 +222,38 @@ describe("users fetch()", () => { expect(actions[1].payload).toBeDefined(); }); }); + + it("should delete successfully user zaphod", () => { + fetchMock.deleteOnce("http://localhost:8081/scm/api/rest/v2/users/zaphod", { + status: 204 + }); + // after update, the users are fetched again + fetchMock.getOnce("/scm/api/rest/v2/users", response); + + const store = mockStore({}); + return store.dispatch(deleteUser(userZaphod)).then(() => { + const actions = store.getActions(); + expect(actions[0].type).toEqual(DELETE_USER); + expect(actions[0].payload).toBe(userZaphod); + expect(actions[1].type).toEqual(DELETE_USER_SUCCESS); + expect(actions[2].type).toEqual(FETCH_USERS); + }); + }); + + it("should fail to delete user zaphod", () => { + fetchMock.deleteOnce("http://localhost:8081/scm/api/rest/v2/users/zaphod", { + status: 500 + }); + + const store = mockStore({}); + return store.dispatch(deleteUser(userZaphod)).then(() => { + const actions = store.getActions(); + expect(actions[0].type).toEqual(DELETE_USER); + expect(actions[0].payload).toBe(userZaphod); + expect(actions[1].type).toEqual(DELETE_USER_FAILURE); + expect(actions[1].payload).toBeDefined(); + }); + }); }); describe("users reducer", () => { @@ -288,8 +325,7 @@ describe("users reducer", () => { const state = { usersByNames: { zaphod: { - loading: false, - error: null, + loading: true, entry: userZaphod } }