diff --git a/scm-ui/src/users/containers/UserForm.js b/scm-ui/src/users/containers/UserForm.js index 8c002b1da9..23df3c568f 100644 --- a/scm-ui/src/users/containers/UserForm.js +++ b/scm-ui/src/users/containers/UserForm.js @@ -33,7 +33,6 @@ class UserForm extends React.Component { } render() { - const { submitForm } = this.props; const user = this.state; return (
diff --git a/scm-ui/src/users/containers/UserRow.js b/scm-ui/src/users/containers/UserRow.js index c55af67d58..f4b5788bc3 100644 --- a/scm-ui/src/users/containers/UserRow.js +++ b/scm-ui/src/users/containers/UserRow.js @@ -26,7 +26,7 @@ export default class UserRow extends React.Component { - + ); diff --git a/scm-ui/src/users/containers/UserTable.js b/scm-ui/src/users/containers/UserTable.js index 23be3b9845..7afc57fc05 100644 --- a/scm-ui/src/users/containers/UserTable.js +++ b/scm-ui/src/users/containers/UserTable.js @@ -1,11 +1,11 @@ // @flow import React from "react"; import UserRow from "./UserRow"; -import { editUser } from "../modules/users"; import type { User } from "../types/User"; +import type { UserEntry } from "../types/UserEntry"; type Props = { - entries: [{ loading: boolean, error: Error, user: User }], + entries: Array, deleteUser: string => void, editUser: User => void }; diff --git a/scm-ui/src/users/containers/Users.js b/scm-ui/src/users/containers/Users.js index 9a91b90cf3..a68058eb6b 100644 --- a/scm-ui/src/users/containers/Users.js +++ b/scm-ui/src/users/containers/Users.js @@ -6,19 +6,14 @@ import { fetchUsers, addUser, updateUser, - editUser, deleteUser, + editUser, getUsersFromState } from "../modules/users"; import UserForm from "./UserForm"; import UserTable from "./UserTable"; import type { User } from "../types/User"; - -type UserEntry = { - loading: boolean, - error: Error, - user: User -}; +import type { UserEntry } from "../types/UserEntry"; type Props = { login: boolean, @@ -60,7 +55,7 @@ class Users extends React.Component { }; render() { - const { userEntries, deleteUser, editUser } = this.props; + const { userEntries, deleteUser, editUser, userToEdit } = this.props; if (userEntries) { return (
@@ -70,13 +65,11 @@ class Users extends React.Component { { - this.props.editUser(user); - }} + editUser={user => editUser(user)} /> this.submitUser(user)} - user={this.props.userToEdit} + user={userToEdit} />
diff --git a/scm-ui/src/users/modules/users.js b/scm-ui/src/users/modules/users.js index e4227176ac..27e1052604 100644 --- a/scm-ui/src/users/modules/users.js +++ b/scm-ui/src/users/modules/users.js @@ -1,7 +1,7 @@ // @flow import { apiClient, NOT_FOUND_ERROR } from "../../apiclient"; import type { User } from "../types/User"; -import { ThunkDispatch } from "redux-thunk"; +import type { UserEntry } from "../types/UserEntry"; import { Dispatch } from "redux"; export const FETCH_USERS = "scm/users/FETCH"; @@ -148,19 +148,6 @@ function updateUserFailure(user: User, error: Error) { }; } -export function editUser(user: User) { - return function(dispatch: ThunkDispatch) { - dispatch(requestAddUser(user)); - return apiClient - .putWithContentType(USERS_URL + "/" + user.name, user, CONTENT_TYPE_USER) - .then(() => { - dispatch(addUserSuccess()); - dispatch(fetchUsers()); - }) - .catch(err => dispatch(addUserFailure(user, err))); - }; -} - function requestDeleteUser(url: string) { return { type: DELETE_USER, @@ -203,7 +190,7 @@ export function getUsersFromState(state) { if (!userNames) { return null; } - var userEntries = new Array(); + var userEntries: Array = []; for (let userName of userNames) { userEntries.push(state.users.usersByNames[userName]); @@ -231,7 +218,7 @@ function extractUsersByNames( return usersByNames; } -function editUser(user: User) { +export function editUser(user: User) { return { type: EDIT_USER, user diff --git a/scm-ui/src/users/modules/users.test.js b/scm-ui/src/users/modules/users.test.js index 4f4073e7a9..bef47ade79 100644 --- a/scm-ui/src/users/modules/users.test.js +++ b/scm-ui/src/users/modules/users.test.js @@ -10,7 +10,12 @@ import { FETCH_USERS, FETCH_USERS_SUCCESS, fetchUsers, - FETCH_USERS_FAILURE + FETCH_USERS_FAILURE, + updateUser, + UPDATE_USER, + UPDATE_USER_FAILURE, + UPDATE_USER_SUCCESS, + EDIT_USER } from "./users"; import reducer from "./users"; @@ -152,6 +157,33 @@ describe("fetch tests", () => { expect(actions[1].payload).toBeDefined(); }); }); + + test("successful user update", () => { + fetchMock.putOnce("http://localhost:8081/scm/api/rest/v2/users/zaphod", { + status: 204 + }); + + 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); + }); + }); + + test("user update failed", () => { + fetchMock.putOnce("http://localhost:8081/scm/api/rest/v2/users/zaphod", { + status: 500 + }); + + 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_FAILURE); + expect(actions[1].payload).toBeDefined(); + }); + }); }); describe("reducer tests", () => { @@ -199,4 +231,15 @@ describe("reducer tests", () => { expect(newState.usersByNames["zaphod"]).toBeDefined(); expect(newState.usersByNames["ford"]).toBeDefined(); }); + + test("edit user", () => { + const newState = reducer( + {}, + { + type: EDIT_USER, + user: userZaphod + } + ); + expect(newState.editUser).toEqual(userZaphod); + }); });