Skip to content

Commit

Permalink
Refactor create hook command
Browse files Browse the repository at this point in the history
  • Loading branch information
Rémi committed Aug 11, 2017
1 parent 2d62aab commit 81022f2
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 91 deletions.
2 changes: 1 addition & 1 deletion src/bin/barracks-hook
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const pjson = require('../../package.json');

const barracks = program
.version(pjson.version)
.command('create [cmd]', 'Manage hooks creation')
.command('create', 'Manage hooks creation')
.command('get', 'Display detailed information of a hook')
.command('update', 'Update a hook')
.command('ls', 'List the hooks')
Expand Down
40 changes: 19 additions & 21 deletions src/commands/hook/CreateHookCommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,26 @@ const Validator = require('../../utils/Validator');
const ObjectReader = require('../../utils/ObjectReader');

function getHookType(program) {
if (program.web) {
if (program.hookType === 'web') {
return 'web';
} else if (program.googleAnalytics) {
} else if (program.hookType === 'googleAnalytics') {
return 'google_analytics';
} else if (program.bigquery) {
} else if (program.hookType === 'bigQuery') {
return 'bigquery';
}
}

function getEventType(program) {
if (program.ping) {
if (program.event === 'ping') {
return 'PING';
}
if (program.enrollment) {
if (program.event === 'enrollment') {
return 'ENROLLMENT';
}
if(program.deviceDataChange) {
if(program.event === 'deviceDataChange') {
return 'DEVICE_DATA_CHANGE';
}
if(program.devicePackageChange) {
if(program.event === 'devicePackageChange') {
return 'DEVICE_PACKAGE_CHANGE';
}
}
Expand All @@ -32,29 +32,27 @@ function getGoogleClientSecret(program) {
}

function hasValidEventType(program) {
return (!program.ping && program.enrollment && !program.deviceDataChange && !program.devicePackageChange ||
program.ping && !program.enrollment && !program.deviceDataChange && !program.devicePackageChange ||
!program.ping && !program.enrollment && program.deviceDataChange && !program.devicePackageChange ||
!program.ping && !program.enrollment && !program.deviceDataChange && program.devicePackageChange);
return (program.event && program.event !== true &&
['ping', 'enrollment', 'deviceDataChange', 'devicePackageChange'].indexOf(program.event) > -1);
}

function hasValidHookTypeAndArguments(program) {
return (program.web && !program.googleAnalytics && !program.bigquery && program.url && program.url !== true ||
!program.web && program.googleAnalytics && !program.bigquery && program.gaTrackingId && program.gaTrackingId !== true ||
!program.web && !program.googleAnalytics && program.bigquery && program.googleClientSecret && Validator.fileExists(program.googleClientSecret));

var handlers = {
web: (program) => program.url && program.url !== true,
googleAnalytics: (program) => program.gaTrackingId && program.gaTrackingId !== true,
bigQuery: (program) => program.googleClientSecret && program.googleClientSecret !== true && Validator.fileExists(program.googleClientSecret)
}

return (['web', 'googleAnalytics', 'bigQuery'].indexOf(program.hookType) > -1) && handlers[program.hookType](program)
}

class CreateHookCommand extends BarracksCommand {

configureCommand(program) {
return program
.option('--ping', 'To create a hook triggered by the ping of a device.')
.option('--enrollment', 'To create a hook for the first ping of a device.')
.option('--deviceDataChange', 'To create a hook triggered when a device pings with new custom client data.')
.option('--devicePackageChange', 'To create a hook triggered when a device pings with new packages.')
.option('--web', 'To create a web hook')
.option('--googleAnalytics', 'To create a Google Analytics hook')
.option('--bigquery', 'To create a BigQuery hook')
.option('--event', 'To specify the type of event that triggers the hook (ping, enrollment, deviceDataChange or devicePackageChange).')
.option('--hookType', 'To specify the type of hook we want to create (web, googleAnalytics or bigQuery)')
.option('--name [value]', 'The unique name of the webhook')
.option('--gaTrackingId [value]', 'The trackingId for the Google Analytics account')
.option('--googleClientSecret [path/to/file]', 'The path to the file with the Google client secret json used to authenticate to BigQuery.')
Expand Down
90 changes: 21 additions & 69 deletions tests/commands/hook/CreateHookCommand.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,15 @@ describe('CreateHookCommand', () => {
'../../utils/ObjectReader': {
readObjectFromFile: (file) => {
return proxyReadObjectFromFile(file);
},
readObjectFromStdin: () => {
return proxyReadObjectFromStdin();
}
}
});

const file = 'path/to/file.json';
const token = 'i8uhkj.token.65ryft';
const programWithValidOptions = {
ping: true,
web: true,
event: 'ping',
hookType: 'web',
name: 'HookName',
url: 'https://not.barracks.io'
};
Expand Down Expand Up @@ -84,7 +81,7 @@ describe('CreateHookCommand', () => {

it('should return false when type is missing', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web: false });
const program = Object.assign({}, programWithValidOptions, { event: false });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -102,7 +99,7 @@ describe('CreateHookCommand', () => {

it('should return true when event type is ping', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: true });
const program = Object.assign({}, programWithValidOptions, { event: 'ping' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -111,7 +108,7 @@ describe('CreateHookCommand', () => {

it('should return true when event type is enrollment', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, enrollment: true });
const program = Object.assign({}, programWithValidOptions, { event: 'enrollment' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -120,7 +117,7 @@ describe('CreateHookCommand', () => {

it('should return true when event type is deviceDataChange', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, deviceDataChange:true });
const program = Object.assign({}, programWithValidOptions, { event: 'deviceDataChange' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -129,7 +126,7 @@ describe('CreateHookCommand', () => {

it('should return true when event type is devicePackageChange', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, devicePackageChange:true });
const program = Object.assign({}, programWithValidOptions, { event: 'devicePackageChange' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -139,43 +136,16 @@ describe('CreateHookCommand', () => {

it('should return false when event type is missing', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: undefined });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when ping and enrollment', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: true, enrollment:true });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when ping and deviceDataChange', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: true, deviceDataChange:true });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when enrollment and deviceDataChange', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping:false, enrollment: true, deviceDataChange:true });
const program = Object.assign({}, programWithValidOptions, { event: undefined });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when devicePackageChange and deviceDataChange', () => {
it('should return false when event type is not recognised', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping:false, deviceDataChange: true, devicePackageChange:true });
const program = Object.assign({}, programWithValidOptions, { event: 'wrongEvent' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -184,25 +154,7 @@ describe('CreateHookCommand', () => {

it('should return false when web and GA', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:true, googleAnalytics: true });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when web and BQ', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:true, bigquery: true });
// When
const result = createHookCommand.validateCommand(program);
// Then
expect(result).to.be.false;
});

it('should return false when GA and BQ', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:false, googleAnalytics:true, bigquery: true });
const program = Object.assign({}, programWithValidOptions, { hookType: 'wrongType' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -211,7 +163,7 @@ describe('CreateHookCommand', () => {

it('should return true when googleAnalytics hook with all arguments', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:false, url:undefined, googleAnalytics:true, gaTrackingId:'UA-12453453-23' });
const program = Object.assign({}, programWithValidOptions, { url:undefined, hookType: 'googleAnalytics', gaTrackingId:'UA-12453453-23' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -220,7 +172,7 @@ describe('CreateHookCommand', () => {

it('should return false when googleAnalytics without trackingId', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:false, url:undefined, googleAnalytics:true });
const program = Object.assign({}, programWithValidOptions, { url:undefined, hookType: 'googleAnalytics' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -234,7 +186,7 @@ describe('CreateHookCommand', () => {
spyFileExists(file);
return true;
};
const program = Object.assign({}, programWithValidOptions, { web:false, url:undefined, bigquery:true, googleClientSecret: file });
const program = Object.assign({}, programWithValidOptions, { url:undefined, hookType: 'bigQuery', googleClientSecret: file });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -250,7 +202,7 @@ describe('CreateHookCommand', () => {
spyFileExists(file);
return false;
};
const program = Object.assign({}, programWithValidOptions, { web:false, url:undefined, bigquery:true, googleClientSecret: file });
const program = Object.assign({}, programWithValidOptions, { url:undefined, hookType: 'bigQuery', googleClientSecret: file });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand All @@ -261,7 +213,7 @@ describe('CreateHookCommand', () => {

it('should return false when bigquery without googleClientSecret', () => {
// Given
const program = Object.assign({}, programWithValidOptions, { web:false, url:undefined, bigquery:true });
const program = Object.assign({}, programWithValidOptions, { url:undefined, hookType: 'bigQuery' });
// When
const result = createHookCommand.validateCommand(program);
// Then
Expand Down Expand Up @@ -301,7 +253,7 @@ describe('CreateHookCommand', () => {

it('should return the created hook when the request was successful and event type is enrollment', done => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, enrollment:true });
const program = Object.assign({}, programWithValidOptions, { event: 'enrollment' });
createHookCommand.getAuthenticationToken = sinon.stub().returns(Promise.resolve(token));
createHookCommand.barracks = {
createHook: sinon.stub().returns(Promise.resolve(createdHook))
Expand Down Expand Up @@ -329,7 +281,7 @@ describe('CreateHookCommand', () => {

it('should return the created hook when the request was successful and event type is deviceDataChange', done => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, deviceDataChange:true });
const program = Object.assign({}, programWithValidOptions, { event: 'deviceDataChange' });
createHookCommand.getAuthenticationToken = sinon.stub().returns(Promise.resolve(token));
createHookCommand.barracks = {
createHook: sinon.stub().returns(Promise.resolve(createdHook))
Expand Down Expand Up @@ -357,7 +309,7 @@ describe('CreateHookCommand', () => {

it('should return the created hook when the request was successful and event type is devicePackageChange', done => {
// Given
const program = Object.assign({}, programWithValidOptions, { ping: false, devicePackageChange:true });
const program = Object.assign({}, programWithValidOptions, { event: 'devicePackageChange' });
createHookCommand.getAuthenticationToken = sinon.stub().returns(Promise.resolve(token));
createHookCommand.barracks = {
createHook: sinon.stub().returns(Promise.resolve(createdHook))
Expand Down Expand Up @@ -385,7 +337,7 @@ describe('CreateHookCommand', () => {

it('should return the created hook when the request was successful and hook type is google analytics', done => {
// Given
const program = Object.assign({}, programWithValidOptions, { web: false, googleAnalytics: true, gaTrackingId: 'UA-12453453-23' });
const program = Object.assign({}, programWithValidOptions, { hookType: 'googleAnalytics', gaTrackingId: 'UA-12453453-23' });
createHookCommand.getAuthenticationToken = sinon.stub().returns(Promise.resolve(token));
createHookCommand.barracks = {
createHook: sinon.stub().returns(Promise.resolve(createdHook))
Expand Down Expand Up @@ -419,7 +371,7 @@ describe('CreateHookCommand', () => {
return validSecret;
};

const program = Object.assign({}, programWithValidOptions, { web: false, bigquery: true, googleClientSecret: file });
const program = Object.assign({}, programWithValidOptions, { hookType: 'bigQuery', googleClientSecret: file });
createHookCommand.getAuthenticationToken = sinon.stub().returns(Promise.resolve(token));
createHookCommand.barracks = {
createHook: sinon.stub().returns(Promise.resolve(createdHook))
Expand Down

0 comments on commit 81022f2

Please sign in to comment.