Skip to content

Commit

Permalink
built support.ticketFields
Browse files Browse the repository at this point in the history
  • Loading branch information
androozka committed Sep 1, 2019
1 parent e3ccd73 commit ce6cce1
Show file tree
Hide file tree
Showing 3 changed files with 339 additions and 0 deletions.
116 changes: 116 additions & 0 deletions src/api/v2/routes/support/ticketFields.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
const validate = require('../../validators/support/ticketFields');

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

return {
list: (options = null) => {
if (options) throw new Error('no options are allowed');

return {
method: 'GET',
url: `${url}/api/v2/ticket_fields.json`,
headers
};
},

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

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

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

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

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

const { id, data } = options;
return {
method: 'PUT',
url: `${url}/api/v2/ticket_fields/${id}.json`,
headers,
data
};
},

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

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

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

const { field_id } = options;
return {
method: 'GET',
url: `${url}/api/v2/ticket_fields/${field_id}/options.json`,
headers
};
},

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

const { field_id, id } = options;
return {
method: 'GET',
url: `${url}/api/v2/ticket_fields/${field_id}/options/${id}.json`,
headers
};
},

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

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

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

const { field_id, id } = options;
return {
method: 'DELETE',
url: `${url}/api/v2/ticket_fields/${field_id}/options/${id}.json`,
headers
};
}
};
};
26 changes: 26 additions & 0 deletions src/api/v2/validators/support/ticketFields.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const Joi = require('@hapi/joi');

const id = Joi.number().min(1);
const field_id = Joi.number().min(1);
const data = Joi.object();

module.exports = {
list: null, // no options
show: options => Joi.validate(options, { id: id.required() }),
create: options => Joi.validate(options, { data: data.required() }),
update: options =>
Joi.validate(options, { id: id.required(), data: data.required() }),
delete: options => Joi.validate(options, { id: id.required() }),
listOptions: options =>
Joi.validate(options, { field_id: field_id.required() }),
showOption: options =>
Joi.validate(options, { field_id: field_id.required(), id: id.required() }),
createOrUpdateOption: options =>
Joi.validate(options, {
field_id: field_id.required(),
id: id.required(),
data: data.required()
}),
deleteOption: options =>
Joi.validate(options, { field_id: field_id.required(), id: id.required() })
};
197 changes: 197 additions & 0 deletions tests/src/api/v2/routes/support/ticketFields.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
const endpoint = require('../../../../../../src/api/v2/routes/support/ticketFields');

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

describe('ticket fields', () => {
let ticketFields;

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

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

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.list('invalid')).toThrowError();
});
});

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

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

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

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

describe('update ticket field', () => {
it('should process w/ valid input', () => {
expect(ticketFields.update({ id: 123, data: {} })).toEqual({
method: 'PUT',
url: `${url}/api/v2/ticket_fields/123.json`,
headers,
data: {}
});
});

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.update()).toThrowError();
expect(() => ticketFields.update('invalid')).toThrowError();
expect(() => ticketFields.update({})).toThrowError();
expect(() => ticketFields.update({ id: 'invalid' })).toThrowError();
expect(() =>
ticketFields.update({ id: 123, data: 'invalid' })
).toThrowError();
});
});

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

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

describe('list ticket field options', () => {
it('should process w/ valid input', () => {
expect(ticketFields.listOptions({ field_id: 123 })).toEqual({
method: 'GET',
url: `${url}/api/v2/ticket_fields/123/options.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.listOptions()).toThrowError();
expect(() => ticketFields.listOptions('invalid')).toThrowError();
expect(() => ticketFields.listOptions({})).toThrowError();
expect(() =>
ticketFields.listOptions({ field_id: 'invalid' })
).toThrowError();
});
});

describe('show a ticket field option', () => {
it('should process w/ valid input', () => {
expect(ticketFields.showOption({ field_id: 123, id: 456 })).toEqual({
method: 'GET',
url: `${url}/api/v2/ticket_fields/123/options/456.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.showOption()).toThrowError();
expect(() => ticketFields.showOption('invalid')).toThrowError();
expect(() => ticketFields.showOption({})).toThrowError();
expect(() =>
ticketFields.showOption({ field_id: 'invalid' })
).toThrowError();
expect(() =>
ticketFields.showOption({ field_id: 123, id: 'invalid' })
).toThrowError();
});
});

describe('create or update a ticket field option', () => {
it('should process w/ valid input', () => {
expect(
ticketFields.createOrUpdateOption({ field_id: 123, id: 456, data: {} })
).toEqual({
method: 'POST',
url: `${url}/api/v2/ticket_fields/123/options/456.json`,
headers,
data: {}
});
});

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.createOrUpdateOption()).toThrowError();
expect(() => ticketFields.createOrUpdateOption('invalid')).toThrowError();
expect(() => ticketFields.createOrUpdateOption({})).toThrowError();
expect(() =>
ticketFields.createOrUpdateOption({ field_id: 'invalid' })
).toThrowError();
expect(() =>
ticketFields.createOrUpdateOption({ field_id: 123, id: 'invalid' })
).toThrowError();
expect(() =>
ticketFields.createOrUpdateOption({
field_id: 123,
id: 456,
data: 'invalid'
})
).toThrowError();
});
});

describe('delete ticket field option', () => {
it('should process w/ valid input', () => {
expect(ticketFields.deleteOption({ field_id: 123, id: 456 })).toEqual({
method: 'DELETE',
url: `${url}/api/v2/ticket_fields/123/options/456.json`,
headers
});
});

it('should throw error w/ invalid input', () => {
expect(() => ticketFields.deleteOption()).toThrowError();
expect(() => ticketFields.deleteOption('invalid')).toThrowError();
expect(() => ticketFields.deleteOption({})).toThrowError();
expect(() =>
ticketFields.deleteOption({ field_id: 'invalid' })
).toThrowError();
expect(() =>
ticketFields.deleteOption({ field_id: 123, id: 'invalid' })
).toThrowError();
});
});
});

0 comments on commit ce6cce1

Please sign in to comment.