From 885650e8b8e87ac51424cbf452bd3ec7ed0eea38 Mon Sep 17 00:00:00 2001 From: Philipp Czora Date: Tue, 31 Jul 2018 13:49:46 +0200 Subject: [PATCH] Added create group functionality --- scm-ui/src/groups/modules/groups.js | 39 ++++++++++++++-- scm-ui/src/groups/modules/groups.test.js | 59 ++++++++++++++++++------ 2 files changed, 80 insertions(+), 18 deletions(-) diff --git a/scm-ui/src/groups/modules/groups.js b/scm-ui/src/groups/modules/groups.js index 5b97fae3a2..cea91f4b8e 100644 --- a/scm-ui/src/groups/modules/groups.js +++ b/scm-ui/src/groups/modules/groups.js @@ -5,7 +5,7 @@ import * as types from "../../modules/types"; import { combineReducers, Dispatch } from "redux"; import type { Action } from "../../types/Action"; import type { PagedCollection } from "../../types/Collection"; -import type {Groups} from "../types/Groups"; +import type { Groups } from "../types/Groups"; export const FETCH_GROUPS = "scm/groups/FETCH_GROUPS"; export const FETCH_GROUPS_PENDING = `${FETCH_GROUPS}_${types.PENDING_SUFFIX}`; @@ -34,6 +34,7 @@ export const DELETE_GROUP_SUCCESS = `${DELETE_GROUP}_${types.SUCCESS_SUFFIX}`; export const DELETE_GROUP_FAILURE = `${DELETE_GROUP}_${types.FAILURE_SUFFIX}`; const GROUPS_URL = "groups"; +const CONTENT_TYPE_GROUP = "application/vnd.scmm-group+json;v=2"; // fetch groups @@ -85,6 +86,40 @@ export function fetchGroupsFailure(url: string, error: Error): Action { }; } +export function createGroup(group: Group) { + return function(dispatch: Dispatch) { + dispatch(createGroupPending()); + return apiClient + .postWithContentType(GROUPS_URL, group, CONTENT_TYPE_GROUP) + .then(() => dispatch(createGroupSuccess())) + .catch(error => { + dispatch( + createGroupFailure( + new Error(`Failed to create group ${group.name}: ${error.message}`) + ) + ); + }); + }; +} + +export function createGroupPending() { + return { + type: CREATE_GROUP_PENDING + }; +} + +export function createGroupSuccess() { + return { + type: CREATE_GROUP_SUCCESS + }; +} + +export function createGroupFailure(error: Error) { + return { + type: CREATE_GROUP_FAILURE, + payload: error + }; +} //reducer function extractGroupsByNames( @@ -104,7 +139,6 @@ function extractGroupsByNames( return groupsByNames; } - const reducerByName = (state: any, groupname: string, newGroupState: any) => { const newGroupsByNames = { ...state, @@ -156,7 +190,6 @@ export default combineReducers({ byNames: byNamesReducer }); - // selectors const selectList = (state: Object) => { diff --git a/scm-ui/src/groups/modules/groups.test.js b/scm-ui/src/groups/modules/groups.test.js index fa671bef87..22d26ba3b1 100644 --- a/scm-ui/src/groups/modules/groups.test.js +++ b/scm-ui/src/groups/modules/groups.test.js @@ -14,13 +14,16 @@ import reducer, { getGroupsFromState, getFetchGroupsFailure, isFetchGroupsPending, - selectListAsCollection -} from "./groups" + selectListAsCollection, + createGroup, + CREATE_GROUP_SUCCESS, + CREATE_GROUP_PENDING, + CREATE_GROUP_FAILURE +} from "./groups"; const GROUPS_URL = "/scm/api/rest/v2/groups"; const error = new Error("You have an error!"); - const groupZaphod = { creationDate: "2018-07-31T08:39:07.860Z", description: "This is a group", @@ -36,18 +39,20 @@ const groupZaphod = { href: "http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup" }, update: { - href:"http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup" + href: "http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup" } }, _embedded: { - members: [{ - name:"userZaphod", - _links: { - self :{ - href: "http://localhost:3000/scm/api/rest/v2/users/userZaphod" + members: [ + { + name: "userZaphod", + _links: { + self: { + href: "http://localhost:3000/scm/api/rest/v2/users/userZaphod" + } } } - }] + ] } }; @@ -66,7 +71,7 @@ const groupFord = { href: "http://localhost:3000/scm/api/rest/v2/groups/fordGroup" }, update: { - href:"http://localhost:3000/scm/api/rest/v2/groups/fordGroup" + href: "http://localhost:3000/scm/api/rest/v2/groups/fordGroup" } }, _embedded: { @@ -139,10 +144,37 @@ describe("groups fetch()", () => { expect(actions[1].payload).toBeDefined(); }); }); + + it("should successfully create group", () => { + fetchMock.postOnce(GROUPS_URL, { + status: 201 + }); + + const store = mockStore({}); + return store.dispatch(createGroup(groupZaphod)).then(() => { + const actions = store.getActions(); + expect(actions[0].type).toEqual(CREATE_GROUP_PENDING); + expect(actions[1].type).toEqual(CREATE_GROUP_SUCCESS); + }); + }); + + it("should fail creating group on HTTP 500", () => { + fetchMock.postOnce(GROUPS_URL, { + status: 500 + }); + + const store = mockStore({}); + return store.dispatch(createGroup(groupZaphod)).then(() => { + const actions = store.getActions(); + expect(actions[0].type).toEqual(CREATE_GROUP_PENDING); + expect(actions[1].type).toEqual(CREATE_GROUP_FAILURE); + expect(actions[1].payload).toBeDefined(); + expect(actions[1].payload instanceof Error).toBeTruthy(); + }); + }); }); describe("groups reducer", () => { - it("should update state correctly according to FETCH_USERS_SUCCESS action", () => { const newState = reducer({}, fetchGroupsSuccess(responseBody)); @@ -192,9 +224,7 @@ describe("groups reducer", () => { }); }); - describe("selector tests", () => { - it("should return an empty object", () => { expect(selectListAsCollection({})).toEqual({}); expect(selectListAsCollection({ groups: { a: "a" } })).toEqual({}); @@ -281,5 +311,4 @@ describe("selector tests", () => { it("should return undefined when fetch users did not fail", () => { expect(getFetchGroupsFailure({})).toBe(undefined); }); - });