Skip to content

Commit

Permalink
built support-group-memberships
Browse files Browse the repository at this point in the history
closes #19
  • Loading branch information
androozka committed Sep 6, 2019
1 parent 993c974 commit 9c69aa0
Show file tree
Hide file tree
Showing 5 changed files with 358 additions and 0 deletions.
125 changes: 125 additions & 0 deletions src/v2/support/group_memberships/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
const validate = require('./validate');

module.exports = ({ instance, headers }) => {
const url = `https://${instance}.zendesk.com`;

return {
list: (options = {}) => {
const { error } = validate.list(options);
if (error) throw new Error(error.details[0].message);

const { user_id, group_id } = options;
if (user_id && group_id)
throw new Error('either "user_id" or "group_id" may be set, not both');

return {
method: 'GET',
url: `${url}/api/v2/${
user_id
? `users/${user_id}/group_memberships.json`
: group_id
? `groups/${group_id}/memberships.json`
: `group_memberships.json`
}`,
headers
};
},

assignable: (options = {}) => {
const { error } = validate.assignable(options);
if (error) throw new Error(error.details[0].message);

const { group_id } = options;

return {
method: 'GET',
url: `${url}/api/v2/${
group_id
? `groups/${group_id}/memberships/assignable.json`
: `group_memberships/assignable.json`
}`,
headers
};
},

show: (options = {}) => {
const { error } = validate.show(options);
if (error) throw new Error(error.details[0].message);

const { id, user_id = '' } = options;
return {
method: 'GET',
url: `${url}/api/v2${
user_id ? `/users/${user_id}` : ''
}/group_memberships/${id}.json`,
headers
};
},

create: (options = {}) => {
const { error } = validate.create(options);
if (error) throw new Error(error.details[0].message);

const { user_id = '', data } = options;
return {
method: 'POST',
url: `${url}/api/v2${
user_id ? `/users/${user_id}` : ''
}/group_memberships.json`,
headers,
data
};
},

create_many: (options = {}) => {
const { error } = validate.create_many(options);
if (error) throw new Error(error.details[0].message);

const { data } = options;
return {
method: 'POST',
url: `${url}/api/v2/group_memberships/create_many.json`,
headers,
data
};
},

delete: (options = {}) => {
const { error } = validate.delete(options);
if (error) throw new Error(error.details[0].message);

const { id, user_id = '' } = options;
return {
method: 'DELETE',
url: `${url}/api/v2${
user_id ? `/users/${user_id}` : ''
}/group_memberships/${id}.json`,
headers
};
},

delete_many: (options = {}) => {
const { error } = validate.delete_many(options);
if (error) throw new Error(error.details[0].message);

const { ids } = options;
return {
method: 'DELETE',
url: `${url}/api/v2/group_memberships/destroy_many.json?ids=${ids}`,
headers
};
},

default: (options = {}) => {
const { error } = validate.default(options);
if (error) throw new Error(error.details[0].message);

const { user_id, membership_id } = options;
return {
method: 'PUT',
url: `${url}/api/v2/users/${user_id}/group_memberships/${membership_id}/make_default.json`,
headers
};
}
};
};
23 changes: 23 additions & 0 deletions src/v2/support/group_memberships/validate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const Joi = require('@hapi/joi');

const id = Joi.number().min(1);
const ids = Joi.string().min(3);
const user_id = Joi.number().min(1);
const group_id = Joi.number().min(1);
const membership_id = Joi.number().min(1);
const data = Joi.object();

module.exports = {
list: options => Joi.validate(options, { user_id, group_id }),
assignable: options => Joi.validate(options, { group_id }),
show: options => Joi.validate(options, { id: id.required(), user_id }),
create: options => Joi.validate(options, { user_id, data: data.required() }),
create_many: options => Joi.validate(options, { data: data.required() }),
delete: options => Joi.validate(options, { id: id.required(), user_id }),
delete_many: options => Joi.validate(options, { ids: ids.required() }),
default: options =>
Joi.validate(options, {
user_id: user_id.required(),
membership_id: membership_id.required()
})
};
1 change: 1 addition & 0 deletions src/v2/support/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module.exports = ({ instance, headers }) => ({
end_users: require('./end_users')({ instance, headers }),
group_memberships: require('./group_memberships')({ instance, headers }),
groups: require('./groups')({ instance, headers }),
organizations: require('./organizations')({ instance, headers }),
organization_fields: require('./organization_fields')({ instance, headers }),
Expand Down
1 change: 1 addition & 0 deletions tests/src/v2/support.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ describe('support api', () => {
afterEach(() => (support = null));

test('end_users', () => check(support.end_users));
test('group_memberships', () => check(support.group_memberships));
test('groups', () => check(support.groups));
test('organizations', () => check(support.organizations));
test('organization_fields', () => check(support.organization_fields));
Expand Down
208 changes: 208 additions & 0 deletions tests/src/v2/support/group_memberships.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
const endpoint = require('../../../../src/v2/support/group_memberships');

const instance = 'instance';
const url = `https://${instance}.zendesk.com`;
const headers = {
'Content-Type': 'application/json',
Authorization: 'Basic <64bit_encoded_credentials>'
};

describe('group memberships', () => {
let groupMemberships;

beforeEach(() => (groupMemberships = endpoint({ instance, headers })));
afterEach(() => (groupMemberships = null));

describe('list memberships', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.list()).toEqual({
method: 'GET',
url: `${url}/api/v2/group_memberships.json`,
headers
});

expect(groupMemberships.list({ user_id: 123 })).toEqual({
method: 'GET',
url: `${url}/api/v2/users/123/group_memberships.json`,
headers
});

expect(groupMemberships.list({ group_id: 456 })).toEqual({
method: 'GET',
url: `${url}/api/v2/groups/456/memberships.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.list('invalid')).toThrowError();
expect(() =>
groupMemberships.list({ user_id: 'invalid' })
).toThrowError();
expect(() =>
groupMemberships.list({ group_id: 'invalid' })
).toThrowError();
expect(() =>
groupMemberships.list({ user_id: 123, group_id: 456 })
).toThrowError();
});
});

describe('list assignable memberships', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.assignable()).toEqual({
method: 'GET',
url: `${url}/api/v2/group_memberships/assignable.json`,
headers
});

expect(groupMemberships.assignable({ group_id: 456 })).toEqual({
method: 'GET',
url: `${url}/api/v2/groups/456/memberships/assignable.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.assignable('invalid')).toThrowError();
expect(() =>
groupMemberships.assignable({ group_id: 'invalid' })
).toThrowError();
});
});

describe('show membership', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.show({ id: 123 })).toEqual({
method: 'GET',
url: `${url}/api/v2/group_memberships/123.json`,
headers
});

expect(groupMemberships.show({ id: 123, user_id: 456 })).toEqual({
method: 'GET',
url: `${url}/api/v2/users/456/group_memberships/123.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.show()).toThrowError();
expect(() => groupMemberships.show('invalid')).toThrowError();
expect(() => groupMemberships.show({})).toThrowError();
expect(() =>
groupMemberships.show({ user_id: 'invalid' })
).toThrowError();
});
});

describe('create membership', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.create({ data: {} })).toEqual({
method: 'POST',
url: `${url}/api/v2/group_memberships.json`,
headers,
data: {}
});

expect(groupMemberships.create({ user_id: 123, data: {} })).toEqual({
method: 'POST',
url: `${url}/api/v2/users/123/group_memberships.json`,
headers,
data: {}
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.create()).toThrowError();
expect(() => groupMemberships.create('invalid')).toThrowError();
expect(() => groupMemberships.create({})).toThrowError();
expect(() => groupMemberships.create({ data: 'invalid' })).toThrowError();
expect(() =>
groupMemberships.create({ user_id: 'invalid', data: {} })
).toThrowError();
});
});

describe('bulk create memberships', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.create_many({ data: {} })).toEqual({
method: 'POST',
url: `${url}/api/v2/group_memberships/create_many.json`,
headers,
data: {}
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.create_many()).toThrowError();
expect(() => groupMemberships.create_many('invalid')).toThrowError();
expect(() => groupMemberships.create_many({})).toThrowError();
expect(() =>
groupMemberships.create_many({ data: 'invalid' })
).toThrowError();
});
});

describe('delete membership', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.delete({ id: 123 })).toEqual({
method: 'DELETE',
url: `${url}/api/v2/group_memberships/123.json`,
headers
});

expect(groupMemberships.delete({ id: 123, user_id: 456 })).toEqual({
method: 'DELETE',
url: `${url}/api/v2/users/456/group_memberships/123.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.delete()).toThrowError();
expect(() => groupMemberships.delete('invalid')).toThrowError();
expect(() => groupMemberships.delete({})).toThrowError();
expect(() => groupMemberships.delete({ id: 'invalid' })).toThrowError();
expect(() =>
groupMemberships.delete({ id: 123, user_id: 'invalid' })
).toThrowError();
});
});

describe('bulk delete memberships', () => {
it('should process w/ valid input', () => {
expect(groupMemberships.delete_many({ ids: '1,2,3' })).toEqual({
method: 'DELETE',
url: `${url}/api/v2/group_memberships/destroy_many.json?ids=1,2,3`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.delete_many()).toThrowError();
expect(() => groupMemberships.delete_many('invalid')).toThrowError();
expect(() => groupMemberships.delete_many({})).toThrowError();
expect(() => groupMemberships.delete_many({ ids: 0 })).toThrowError();
});
});

describe('set membership as default', () => {
it('should process w/ valid input', () => {
expect(
groupMemberships.default({ user_id: 123, membership_id: 456 })
).toEqual({
method: 'PUT',
url: `${url}/api/v2/users/123/group_memberships/456/make_default.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => groupMemberships.default()).toThrowError();
expect(() => groupMemberships.default('invalid')).toThrowError();
expect(() => groupMemberships.default({})).toThrowError();
expect(() => groupMemberships.default({ ids: 0 })).toThrowError();
});
});
});

0 comments on commit 9c69aa0

Please sign in to comment.