UNPKG

buddyworks-cli

Version:

Command line tool for managing pipelines in Buddy Works

492 lines (489 loc) 16.2 kB
const mocha = require('mocha'); const sinon = require('sinon'); const output = require('../src/output'); const ls = require('../src/cmds/pipeline/ls'); const cancel = require('../src/cmds/pipeline/cancel'); const execution = require('../src/cmds/pipeline/execution'); const executions = require('../src/cmds/pipeline/executions'); const inspect = require('../src/cmds/pipeline/inspect'); const retry = require('../src/cmds/pipeline/retry'); const run = require('../src/cmds/pipeline/run'); const config = require('../src/config'); const api = require('../src/api'); const { expect } = require('chai'); const { describe } = mocha; const { it } = mocha; describe('pipeline', () => { describe('ls', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'getPipelines'); ls.request({}, () => {}); stub.restore(); expect(stub.called).equal(true); }); }); describe('.transform()', () => { it('should return array', () => { const list = [{ id: 1, name: 'a', last_execution_status: 'b', }, { id: 2, name: 'c', last_execution_status: 'd', }]; const args = { json: true }; let res = ls.transform(args, list); expect(res).be.an('array'); expect(res.length).equal(2); expect(res[0]).deep.equal({ id: list[0].id, display_name: list[0].name, status: list[0].last_execution_status, }); expect(res[1]).deep.equal({ id: list[1].id, display_name: list[1].name, status: list[1].last_execution_status, }); args.json = false; res = ls.transform(args, list); expect(res).be.an('array'); expect(res.length).equal(3); expect(res[0]).be.an('array'); expect(res[0].length).equal(3); expect(res[0][0]).equal('ID'); expect(res[0][1]).equal('DISPLAY NAME'); expect(res[0][2]).equal('STATUS'); expect(res[1]).be.an('array'); expect(res[1].length).equal(3); expect(res[1][0]).equal(list[0].id); expect(res[1][1]).equal(list[0].name); expect(res[1][2]).equal(list[0].last_execution_status); expect(res[2][0]).equal(list[1].id); expect(res[2][1]).equal(list[1].name); expect(res[2][2]).equal(list[1].last_execution_status); }); }); describe('.render()', () => { it('should render the same as output.table', () => { const stub = sinon.stub(output, 'table'); const table = [[], []]; ls.render({ json: true }, table); expect(stub.called).equal(true); expect(stub.calledWith(true, table)).equal(true); ls.render({ json: false }, table); expect(stub.calledTwice).equal(true); expect(stub.calledWith(false, table)).equal(true); stub.restore(); }); }); }); describe('inspect', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'getPipeline'); inspect.request({}, () => {}); stub.restore(); expect(stub.called).equal(true); }); }); describe('.transform()', () => { it('should return proper object', () => { const obj = { id: 1, name: 'a', html_url: 'b', trigger_mode: 'c', last_execution_status: 'd', create_date: 'e', ref_name: 'f', active: true, }; expect(inspect.transform({}, obj)).deep.equal({ id: obj.id, display_name: obj.name, url: obj.html_url, mode: obj.trigger_mode, status: obj.last_execution_status, created: obj.create_date, branch: obj.ref_name, active: obj.active, }); }); }); describe('.render()', () => { it('should render the same as output.props', () => { const stub = sinon.stub(output, 'props'); const o = { a: 'b', c: 'd', }; inspect.render({ json: true }, o); expect(stub.called).equal(true); expect(stub.calledWith(true, o)).equal(true); inspect.render({ json: false }, o); expect(stub.calledTwice).equal(true); expect(stub.calledWith(false, o)).equal(true); stub.restore(); }); }); }); describe('run', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'runPipeline'); run.request({}, () => {}); stub.restore(); expect(stub.called).equal(true); }); }); describe('.render()', () => { it('should render proper msg', () => { const stub = sinon.stub(output, 'ok'); let msg = 'Running pipeline\n'; msg += 'Check its status by running:\n\n'; msg += `buddy-cli pl i ${config.get(config.KEY_PIPELINE)}`; const args = { json: true }; run.render(args); expect(stub.called).equal(true); expect(stub.calledWith(args, msg)); args.json = false; run.render(args); expect(stub.calledTwice).equal(true); expect(stub.calledWith(args, msg)); stub.restore(); }); }); }); describe('retry', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'getLastExecution'); retry.request({}, () => {}); expect(stub.called).equal(true); stub.restore(); }); it('should return error when getLastExecution return error', (testDone) => { const er = new Error('mine'); const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(er); }); retry.request({}, (err) => { stub.restore(); expect(err).deep.equal(er); testDone(); }); }); it('should return error when no executions', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(); }); retry.request({}, (err) => { stub.restore(); expect(err).be.an('error'); expect(err.message).equal('Pipeline has no executions yet'); testDone(); }); }); it('should return error when last execution has wrong status', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(null, { status: 'INPROGRESS', }); }); retry.request({}, (err) => { stub.restore(); expect(err).be.an('error'); expect(err.message).equal('Pipeline last execution is not failed or terminated'); testDone(); }); }); it('should retry pipeline when last execution has proper status', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); const stub2 = sinon.stub(api, 'retryPipeline'); stub.callsFake((args, done) => { done(null, { id: 'a', status: 'FAILED', }); }); stub2.callsFake((id, args, done) => { done(); }); retry.request({}, () => { stub.restore(); stub2.restore(); expect(stub.called).equal(true); expect(stub2.called).equal(true); expect(stub2.calledWith('a')); testDone(); }); }); }); describe('.render()', () => { it('should render proper msg', () => { const stub = sinon.stub(output, 'ok'); let msg = 'Retrying pipeline\n'; msg += 'Check its status by running:\n\n'; msg += `buddy-cli pl i ${config.get(config.KEY_PIPELINE)}`; const args = { json: true }; retry.render(args); expect(stub.called).equal(true); expect(stub.calledWith(args, msg)); args.json = false; retry.render(args); expect(stub.calledTwice).equal(true); expect(stub.calledWith(args, msg)); stub.restore(); }); }); }); describe('cancel', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'getLastExecution'); cancel.request({}, () => {}); expect(stub.called).equal(true); stub.restore(); }); it('should return error when getLastExecution return error', (testDone) => { const er = new Error('mine'); const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(er); }); cancel.request({}, (err) => { stub.restore(); expect(err).deep.equal(er); testDone(); }); }); it('should return error when no executions', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(); }); cancel.request({}, (err) => { stub.restore(); expect(err).be.an('error'); expect(err.message).equal('Pipeline has no executions yet'); testDone(); }); }); it('should return error when last execution has wrong status', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); stub.callsFake((args, done) => { done(null, { status: 'FAILED', }); }); cancel.request({}, (err) => { stub.restore(); expect(err).be.an('error'); expect(err.message).equal('Pipeline is not running right now'); testDone(); }); }); it('should cancel pipeline when last execution has proper status', (testDone) => { const stub = sinon.stub(api, 'getLastExecution'); const stub2 = sinon.stub(api, 'cancelPipeline'); stub.callsFake((args, done) => { done(null, { id: 'a', status: 'INPROGRESS', }); }); stub2.callsFake((id, args, done) => { done(); }); cancel.request({}, () => { stub.restore(); stub2.restore(); expect(stub.called).equal(true); expect(stub2.called).equal(true); expect(stub2.calledWith('a')); testDone(); }); }); }); describe('.render()', () => { it('should render proper msg', () => { const stub = sinon.stub(output, 'ok'); let msg = 'Stopping pipeline\n'; msg += 'Check its status by running:\n\n'; msg += `buddy-cli pl i ${config.get(config.KEY_PIPELINE)}`; const args = { json: true }; cancel.render(args); expect(stub.called).equal(true); expect(stub.calledWith(args, msg)); args.json = false; cancel.render(args); expect(stub.calledTwice).equal(true); expect(stub.calledWith(args, msg)); stub.restore(); }); }); }); describe('executions', () => { describe('.request()', () => { it('should make proper api request', () => { const stub = sinon.stub(api, 'getExecutions'); executions.request({}, () => {}); expect(stub.called).equal(true); stub.restore(); }); }); describe('.render()', () => { it('should render the same as output.table', () => { const stub = sinon.stub(output, 'table'); const table = [[], []]; executions.render({ json: true }, table); expect(stub.called).equal(true); expect(stub.calledWith(true, table)).equal(true); executions.render({ json: false }, table); expect(stub.calledTwice).equal(true); expect(stub.calledWith(false, table)).equal(true); stub.restore(); }); }); describe('.transform()', () => { it('should return proper object', () => { const list = [{ branch: { name: 'a', }, to_revision: { revision: 'b', }, from_revision: { revision: 'c', }, creator: { name: 'd', }, id: 1, html_url: 'e', start_date: 'f', finish_date: 'g', mode: 'h', refresh: true, status: 'i', comment: 'j', }]; const args = { json: true }; let res = executions.transform(args, list); expect(res).be.an('array'); expect(res.length).equal(1); expect(res[0]).deep.equal({ id: list[0].id, url: list[0].html_url, start_date: list[0].start_date, finish_date: list[0].finish_date, mode: list[0].mode, refresh: list[0].refresh, status: list[0].status, comment: list[0].comment, branch: list[0].branch.name, to_revision: list[0].to_revision.revision, from_revision: list[0].from_revision.revision, creator: list[0].creator.name, }); args.json = false; res = executions.transform(args, list); expect(res).be.an('array'); expect(res.length).equal(2); expect(res[0]).be.an('array'); expect(res[0].length).equal(4); expect(res[0][0]).equal('ID'); expect(res[0][1]).equal('TO REVISION'); expect(res[0][2]).equal('STATUS'); expect(res[0][3]).equal('FINISHED'); expect(res[1]).be.an('array'); expect(res[1].length).equal(4); expect(res[1][0]).equal(list[0].id); expect(res[1][1]).equal(list[0].to_revision.revision); expect(res[1][2]).equal(list[0].status); expect(res[1][3]).equal(list[0].finish_date); }); }); }); describe('execution', () => { describe('.request()', () => { it('should make proper api request', () => { const s1 = sinon.stub(api, 'getLastExecution'); const s2 = sinon.stub(api, 'getExecution'); const args = {}; execution.request(args, () => {}); expect(s1.called).equal(true); args.execution = 'a'; execution.request(args, () => {}); expect(s2.called).equal(true); expect(s2.calledWith(args)).equal(true); s1.restore(); s2.restore(); }); }); describe('.render()', () => { it('should render the same as output.props', () => { const stub = sinon.stub(output, 'props'); const o = { a: 'b', c: 'd', }; execution.render({ json: true }, o); expect(stub.called).equal(true); expect(stub.calledWith(true, o)).equal(true); execution.render({ json: false }, o); expect(stub.calledTwice).equal(true); expect(stub.calledWith(false, o)).equal(true); stub.restore(); }); }); describe('.transform()', () => { it('should return proper object', () => { const obj = { branch: { name: 'a', }, to_revision: { revision: 'b', }, from_revision: { revision: 'c', }, creator: { name: 'd', }, id: 1, html_url: 'e', start_date: 'f', finish_date: 'g', mode: 'h', refresh: true, status: 'i', comment: 'j', }; expect(execution.transform({}, obj)).deep.equal({ id: obj.id, url: obj.html_url, start_date: obj.start_date, finish_date: obj.finish_date, mode: obj.mode, refresh: obj.refresh, status: obj.status, comment: obj.comment, branch: obj.branch.name, to_revision: obj.to_revision.revision, from_revision: obj.from_revision.revision, creator: obj.creator.name, }); }); }); }); });