Added create group functionality

This commit is contained in:
Philipp Czora
2018-07-31 13:49:46 +02:00
parent 52ce2a6de1
commit 885650e8b8
2 changed files with 80 additions and 18 deletions

View File

@@ -5,7 +5,7 @@ import * as types from "../../modules/types";
import { combineReducers, Dispatch } from "redux"; import { combineReducers, Dispatch } from "redux";
import type { Action } from "../../types/Action"; import type { Action } from "../../types/Action";
import type { PagedCollection } from "../../types/Collection"; 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 = "scm/groups/FETCH_GROUPS";
export const FETCH_GROUPS_PENDING = `${FETCH_GROUPS}_${types.PENDING_SUFFIX}`; 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}`; export const DELETE_GROUP_FAILURE = `${DELETE_GROUP}_${types.FAILURE_SUFFIX}`;
const GROUPS_URL = "groups"; const GROUPS_URL = "groups";
const CONTENT_TYPE_GROUP = "application/vnd.scmm-group+json;v=2";
// fetch groups // 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 //reducer
function extractGroupsByNames( function extractGroupsByNames(
@@ -104,7 +139,6 @@ function extractGroupsByNames(
return groupsByNames; return groupsByNames;
} }
const reducerByName = (state: any, groupname: string, newGroupState: any) => { const reducerByName = (state: any, groupname: string, newGroupState: any) => {
const newGroupsByNames = { const newGroupsByNames = {
...state, ...state,
@@ -156,7 +190,6 @@ export default combineReducers({
byNames: byNamesReducer byNames: byNamesReducer
}); });
// selectors // selectors
const selectList = (state: Object) => { const selectList = (state: Object) => {

View File

@@ -14,13 +14,16 @@ import reducer, {
getGroupsFromState, getGroupsFromState,
getFetchGroupsFailure, getFetchGroupsFailure,
isFetchGroupsPending, isFetchGroupsPending,
selectListAsCollection selectListAsCollection,
} from "./groups" createGroup,
CREATE_GROUP_SUCCESS,
CREATE_GROUP_PENDING,
CREATE_GROUP_FAILURE
} from "./groups";
const GROUPS_URL = "/scm/api/rest/v2/groups"; const GROUPS_URL = "/scm/api/rest/v2/groups";
const error = new Error("You have an error!"); const error = new Error("You have an error!");
const groupZaphod = { const groupZaphod = {
creationDate: "2018-07-31T08:39:07.860Z", creationDate: "2018-07-31T08:39:07.860Z",
description: "This is a group", description: "This is a group",
@@ -36,18 +39,20 @@ const groupZaphod = {
href: "http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup" href: "http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup"
}, },
update: { update: {
href:"http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup" href: "http://localhost:3000/scm/api/rest/v2/groups/zaphodGroup"
} }
}, },
_embedded: { _embedded: {
members: [{ members: [
name:"userZaphod", {
_links: { name: "userZaphod",
self :{ _links: {
href: "http://localhost:3000/scm/api/rest/v2/users/userZaphod" 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" href: "http://localhost:3000/scm/api/rest/v2/groups/fordGroup"
}, },
update: { update: {
href:"http://localhost:3000/scm/api/rest/v2/groups/fordGroup" href: "http://localhost:3000/scm/api/rest/v2/groups/fordGroup"
} }
}, },
_embedded: { _embedded: {
@@ -139,10 +144,37 @@ describe("groups fetch()", () => {
expect(actions[1].payload).toBeDefined(); 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", () => { describe("groups reducer", () => {
it("should update state correctly according to FETCH_USERS_SUCCESS action", () => { it("should update state correctly according to FETCH_USERS_SUCCESS action", () => {
const newState = reducer({}, fetchGroupsSuccess(responseBody)); const newState = reducer({}, fetchGroupsSuccess(responseBody));
@@ -192,9 +224,7 @@ describe("groups reducer", () => {
}); });
}); });
describe("selector tests", () => { describe("selector tests", () => {
it("should return an empty object", () => { it("should return an empty object", () => {
expect(selectListAsCollection({})).toEqual({}); expect(selectListAsCollection({})).toEqual({});
expect(selectListAsCollection({ groups: { a: "a" } })).toEqual({}); expect(selectListAsCollection({ groups: { a: "a" } })).toEqual({});
@@ -281,5 +311,4 @@ describe("selector tests", () => {
it("should return undefined when fetch users did not fail", () => { it("should return undefined when fetch users did not fail", () => {
expect(getFetchGroupsFailure({})).toBe(undefined); expect(getFetchGroupsFailure({})).toBe(undefined);
}); });
}); });