From a11f39bac54aaa9fd3e499ab33a5fffbd4e35952 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Mon, 26 Sep 2016 22:42:11 -0300 Subject: [PATCH 01/22] Create gear config file --- config/config.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 config/config.json diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..766d8df --- /dev/null +++ b/config/config.json @@ -0,0 +1,17 @@ +[ + { + "id": 1, + "question": "Qual sua url do Jenkins?" + }, + + { + "id": 2, + "question": "Você utiliza CRFS no seu Jenkins?", + "expectedResponses": ["Sim", "Não"] + }, + + { + "id": 3, + "question": "Tudo certo. Jenkins configurado" + } +] From 50a670a0acf4af9bd521abb3d679335b17419bb2 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Mon, 26 Sep 2016 22:42:38 -0300 Subject: [PATCH 02/22] Create handler to configs. Just start --- src/configHandler/configHandler.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/configHandler/configHandler.js diff --git a/src/configHandler/configHandler.js b/src/configHandler/configHandler.js new file mode 100644 index 0000000..bbbdb2b --- /dev/null +++ b/src/configHandler/configHandler.js @@ -0,0 +1,7 @@ +'use strict'; + +exports.handle = handle; + +function handle(configs) { + console.log(configs); +} From 7b493b9d4ba9342cfe12083d4d299bf9d4f286f5 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Mon, 26 Sep 2016 22:46:32 -0300 Subject: [PATCH 03/22] Add gear configuration feature to changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17138f0..c72607f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# [v2.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/2.0.0) (2016-) + +### Features + +* Gear Jenkins is now configurable by the Slack # [v1.0.1](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.1) (2016-08-26) From 1b4e414bcd154fb167a4f40b3af566001f43eaee Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Mon, 3 Oct 2016 22:31:24 -0300 Subject: [PATCH 04/22] Refactory to use talk instead postMessage --- src/handlers/start-job.js | 8 +++----- test/handlers/start-job.js | 12 ++++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/handlers/start-job.js b/src/handlers/start-job.js index 91ab309..3af074e 100644 --- a/src/handlers/start-job.js +++ b/src/handlers/start-job.js @@ -9,16 +9,14 @@ function handle(hubot, message, task, params) { } function start(hubot, message, task, job) { - var recipient = hubot.getRecipient(message); - return jenkins.callJob(job).then(function() { - hubot.postMessage(recipient, task.options.message, {as_user: true}); + hubot.talk(message, task.options.message); }, function(error) { if (error.notFound) { - hubot.postMessage(recipient, `Sorry I could not find the job *${job}*`, {as_user: true}); + hubot.talk(message, `Sorry I could not find the job *${job}*`); } else { hubot.detailedError('Error on call Jenkins', error); - hubot.postMessage(recipient, `Sorry I could not start the job *${job}*. See the error in the logs.`, {as_user: true}); + hubot.talk(message, `Sorry I could not start the job *${job}*. See the error in the logs.`); } }); }; diff --git a/test/handlers/start-job.js b/test/handlers/start-job.js index 5bbbbd3..f29860a 100644 --- a/test/handlers/start-job.js +++ b/test/handlers/start-job.js @@ -5,7 +5,7 @@ require('sinon-as-promised'); describe('Call job', function() { var hubot; - var postMessageSpy; + var talkSpy; var message; var task; var authUrl = 'http://jenkins.test.com:8080'; @@ -16,13 +16,13 @@ describe('Call job', function() { task = { "options": { "message": "Hello World" } }; hubot = { - postMessage: function () {}, + talk: function () {}, detailedError: function() {}, _isPrivateConversation: function () {}, getRecipient: function() { return message.channel } }; - postMessageSpy = sinon.spy(hubot, "postMessage"); + talkSpy = sinon.spy(hubot, "talk"); detailedErrorSpy = sinon.spy(hubot, "detailedError"); }); @@ -46,7 +46,7 @@ describe('Call job', function() { var startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(postMessageSpy.calledWith(message.channel, task.options.message, {as_user: true})).to.be.true; + expect(talkSpy.calledWith(message, task.options.message)).to.be.true; }); }); @@ -61,7 +61,7 @@ describe('Call job', function() { var startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(postMessageSpy.calledWith(message.channel, 'Sorry I could not find the job *deploy-job*', {as_user: true})).to.be.true; + expect(talkSpy.calledWith(message, 'Sorry I could not find the job *deploy-job*')).to.be.true; }); }); @@ -74,7 +74,7 @@ describe('Call job', function() { var startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(postMessageSpy.calledWith(message.channel, 'Sorry I could not start the job *deploy-job*. See the error in the logs.', {as_user: true})).to.be.true; + expect(talkSpy.calledWith(message, 'Sorry I could not start the job *deploy-job*. See the error in the logs.')).to.be.true; }); }); From a5e1894b681ee03671a31b542ea2d60f8a5a13d0 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Fri, 7 Oct 2016 15:18:05 -0300 Subject: [PATCH 05/22] Save and read configs from database --- .gitignore | 76 +++++++++++++++--------------- migrations/001-initial-schema.sql | 6 +++ package.json | 3 +- src/configHandler/configHandler.js | 24 +++++++++- src/db.js | 28 +++++++++++ src/jenkins.js | 28 +++++------ test/db.js | 63 +++++++++++++++++++++++++ test/jenkins.js | 70 ++++++++++++++++++++------- 8 files changed, 226 insertions(+), 72 deletions(-) create mode 100644 migrations/001-initial-schema.sql create mode 100644 src/db.js create mode 100644 test/db.js diff --git a/.gitignore b/.gitignore index 5148e52..dfdb1a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,39 @@ -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +.vscode diff --git a/migrations/001-initial-schema.sql b/migrations/001-initial-schema.sql new file mode 100644 index 0000000..acf395f --- /dev/null +++ b/migrations/001-initial-schema.sql @@ -0,0 +1,6 @@ +-- Up +CREATE TABLE config (id INTEGER, url TEXT, useCSRF TEXT); +INSERT INTO config (id) VALUES (1); + +-- Down +DROP TABLE config diff --git a/package.json b/package.json index 8a12cdf..704fb54 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ }, "homepage": "https://github.com/hubot-js/gear-jenkins#readme", "dependencies": { - "jenkins": "^0.18.0" + "jenkins": "^0.18.0", + "sqlite": "^2.2.0" }, "devDependencies": { "chai": "^3.5.0", diff --git a/src/configHandler/configHandler.js b/src/configHandler/configHandler.js index bbbdb2b..c3ef015 100644 --- a/src/configHandler/configHandler.js +++ b/src/configHandler/configHandler.js @@ -2,6 +2,28 @@ exports.handle = handle; +var db = require('../../src/db').getDb(); + function handle(configs) { - console.log(configs); + db.run('UPDATE config SET url = ?, useCSRF = ?', getUrl(configs), getUseCSRF(configs)); +} + +function getUrl(configs) { + let url = answer(configs, 1); + + if (url.includes('|')) { + url = url.replace('<', '').substring(0, url.indexOf('|') - 1); + } else { + url = url.replace('<', '').replace('>', ''); + } + + return url; +} + +function getUseCSRF(configs) { + return answer(configs, 2) === 'Sim'; +} + +function answer(configs, id) { + return configs.find(c => c.id === id).answer; } diff --git a/src/db.js b/src/db.js new file mode 100644 index 0000000..68ae64a --- /dev/null +++ b/src/db.js @@ -0,0 +1,28 @@ +'use strict'; + +let db = require('sqlite'); +let path = require('path'); + +exports.getDb = getDb; + +function getDb() { + let gearPath = path.resolve(process.cwd(), 'node_modules/gear-jenkins/'); + let dbFile = gearPath + '/gear-jenkins.sqlite'; + let migrations = gearPath + '/migrations'; + + function open(dbFile) { + return db.open(dbFile); + } + + function migrate(db) { + return db.migrate({migrationsPath: migrations}); + } + + open(dbFile) + .then(migrate) + .catch(function() { + //do nothing + }) + + return db; +} diff --git a/src/jenkins.js b/src/jenkins.js index 99b050d..fdf39dc 100644 --- a/src/jenkins.js +++ b/src/jenkins.js @@ -2,24 +2,18 @@ exports.callJob = callJob; -var authUrl = process.env.JENKINS_AUTH_URL; +var db = require('./db').getDb(); function callJob(jobName) { - var jenkins = buildJenkins(); + return db.get('SELECT * FROM config').then(function(result) { + var jenkinsOptions = { + baseUrl: result.url, + promisify: true, + crumbIssuer: result.useCSRF == 1 + } - return jenkins.job.build(jobName); -} - -function buildJenkins() { - var jenkinsOptions = { - baseUrl: authUrl, - promisify: true, - crumbIssuer: useCrumb() - } - - return require('jenkins')(jenkinsOptions); -} - -function useCrumb() { - return process.env.CRUMB_ISSUER === 'true'; + var jenkins = require('jenkins')(jenkinsOptions); + + return jenkins.job.build(jobName); + }); } diff --git a/test/db.js b/test/db.js new file mode 100644 index 0000000..fec2fc1 --- /dev/null +++ b/test/db.js @@ -0,0 +1,63 @@ +var proxyquire = require('proxyquire').noPreserveCache(); +var expect = require('chai').expect; +var sinon = require('sinon'); +require('sinon-as-promised'); + +describe('Data base creation', function() { + it("should open db and run migrations scripts", function() { + var openStub = sinon.stub(); + var migrateStub = sinon.stub().resolves(); + + var openSpy = sinon.spy(openStub); + var migrateSpy = sinon.spy(migrateStub); + + var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + + var db = buildDb(sqlite); + openStub.resolves(sqlite); + + db.getDb(); + expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; + + migrateSpy().then(function() { + expect(migrateSpy.calledWithMatch( { migrationsPath: process.cwd() + '/node_modules/gear-jenkins/migrations' } )).to.be.true; + }); + }); + + it("do nothing when error occurs on open", function() { + var openStub = sinon.stub(); + var migrateStub = sinon.stub().resolves(); + + var openSpy = sinon.spy(openStub); + var migrateSpy = sinon.spy(migrateStub); + + var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + + var db = buildDb(sqlite); + openStub.rejects(); + + db.getDb(); + + expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; + expect(migrateSpy.calledWithMatch( { migrationsPath: process.cwd() + '/node_modules/gear-jenkins/migrations' } )).to.be.false; + }); + + it("do nothing when error occurs on migration", function() { + var openStub = sinon.stub(); + var migrateStub = sinon.stub().rejects(); + + var openSpy = sinon.spy(openStub); + var migrateSpy = sinon.spy(migrateStub); + + var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + + var db = buildDb(sqlite); + openStub.resolves(sqlite); + + db.getDb(); + }); +}); + +function buildDb(sqlite) { + return proxyquire('../src/db', { 'sqlite': sqlite } ); +} diff --git a/test/jenkins.js b/test/jenkins.js index 2a3722a..9436529 100644 --- a/test/jenkins.js +++ b/test/jenkins.js @@ -1,44 +1,82 @@ +var proxyquire = require('proxyquire').noPreserveCache(); var chai = require('chai'); var expect = chai.expect; +var sinon = require('sinon'); var chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); -var sinon = require('sinon'); - var authUrl = 'http://jenkins-test.com/token'; -process.env.JENKINS_AUTH_URL = authUrl; - -var jenkins = require('../src/jenkins'); describe('Jenkins call job return', function() { it("error because url doesn't exists", function() { - var promisse = jenkins.callJob(authUrl, 'test'); + var config = { url: authUrl }; + + var dbStub = getDbStub(config); + + var jenkins = getJenkins(dbStub); + + var promisse = jenkins.callJob('test'); + return expect(promisse). to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); }); - it("with crumbIssuer when CRUMB_ISSUER process env is true", function() { - process.env.CRUMB_ISSUER = 'true'; - var promisse = jenkins.callJob(authUrl, 'test'); + it("error because url is null", function() { + var config = { url: null }; + + var dbStub = getDbStub(config); + + var jenkins = getJenkins(dbStub); + + var promisse = jenkins.callJob('test'); return expect(promisse). - to.be.rejectedWith('Error: jenkins: job.build: jenkins: crumbIssuer.get: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); + to.be.rejectedWith('Error: baseUrl required'); }); - it("without crumbIssuer when CRUMB_ISSUER process env is false", function() { - process.env.CRUMB_ISSUER = 'false'; - var promisse = jenkins.callJob(authUrl, 'test'); + it("with crumbIssuer when useCSRF is true", function() { + var config = { url: authUrl, useCSRF: 1 }; + + var dbStub = getDbStub(config); + + var jenkins = getJenkins(dbStub); + + var promisse = jenkins.callJob('test'); return expect(promisse). - to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); + to.be.rejectedWith('Error: jenkins: job.build: jenkins: crumbIssuer.get: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); }); - it("without crumbIssuer when CRUMB_ISSUER process env does not exists", function() { - var promisse = jenkins.callJob(authUrl, 'test'); + it("without crumbIssuer when CRUMB_ISSUER process env is false", function() { + var config = { url: authUrl, useCSRF: 0 }; + + var dbStub = getDbStub(config); + + var jenkins = getJenkins(dbStub); + + var promisse = jenkins.callJob('test'); return expect(promisse). to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); }); }); + +function getDbStub(config) { + var db = { + get: function() {} + }; + + sinon.stub(db, "get").resolves( config ); + + var dbStub = function() { + return db; + } + + return dbStub; +} + +function getJenkins(dbStub) { + return proxyquire('../src/jenkins', { './db': { 'getDb': dbStub } } ); +} From 3f64f42a9298af079455e4e26f2e2e4cab08042c Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Fri, 7 Oct 2016 15:32:26 -0300 Subject: [PATCH 06/22] Update node to version 6.7 on travis ci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 33208a5..2977c32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "5.11" + - "6.7" after_success: - 'npm run coveralls' From cdbb47e1b4eaed3fa59e92f48ea1ca1c24a27501 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Fri, 7 Oct 2016 15:35:53 -0300 Subject: [PATCH 07/22] Remove unnecessary variable --- test/handlers/start-job.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/handlers/start-job.js b/test/handlers/start-job.js index f29860a..d138f1a 100644 --- a/test/handlers/start-job.js +++ b/test/handlers/start-job.js @@ -8,9 +8,7 @@ describe('Call job', function() { var talkSpy; var message; var task; - var authUrl = 'http://jenkins.test.com:8080'; - process.env.JENKINS_AUTH_URL = authUrl; - + beforeEach(function() { message = { "user": "hubot", "channel": "myChannel" }; task = { "options": { "message": "Hello World" } }; From 52f30b7f25d24941dca99da4c580bc91a9658a5d Mon Sep 17 00:00:00 2001 From: Robson Date: Mon, 10 Oct 2016 14:52:32 -0300 Subject: [PATCH 08/22] Fix #10 Improve configuration --- config/config.json | 37 +++++++++--- config/tasks.json | 1 - package.json | 4 +- src/configHandler/configHandler.js | 29 ---------- src/configHandler/csrf-handler.js | 25 ++++++++ src/configHandler/url-handler.js | 43 ++++++++++++++ test/configHandlers/csrf-handler.js | 53 +++++++++++++++++ test/configHandlers/url-handler.js | 89 +++++++++++++++++++++++++++++ 8 files changed, 243 insertions(+), 38 deletions(-) delete mode 100644 src/configHandler/configHandler.js create mode 100644 src/configHandler/csrf-handler.js create mode 100644 src/configHandler/url-handler.js create mode 100644 test/configHandlers/csrf-handler.js create mode 100644 test/configHandlers/url-handler.js diff --git a/config/config.json b/config/config.json index 766d8df..9060a48 100644 --- a/config/config.json +++ b/config/config.json @@ -1,17 +1,40 @@ [ { - "id": 1, - "question": "Qual sua url do Jenkins?" + "speak": "Ok, vou lhe fazer algumas perguntas então. Se precisar de mais detalhes ." + }, + + { + "speak": "_*Você utiliza o Jenkins com autenticação?*_", + "expectedResponses": [ + { + "response": "Sim", + "iteration": { + "speak": "_*Qual é a url do Jenkins?*_ A url deve ter este formato: http://user:authToken@jenkinsUrl. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "handler": "src/configHandler/url-handler" + } + }, + + { + "response": "Não", + "iteration": { + "speak": "_*Qual é a url do Jenkins?*_ Simplesmente utilize a url de acesso ao Jenkins. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "handler": "src/configHandler/url-handler" + } + } + ] }, { - "id": 2, - "question": "Você utiliza CRFS no seu Jenkins?", - "expectedResponses": ["Sim", "Não"] + "speak": "_*Você utiliza CRFS no Jenkins?*_ \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "expectedResponses": [ + { "response": "Sim" }, + { "response": "Não" }, + { "response": "pular" } + ], + "handler": "src/configHandler/csrf-handler" }, { - "id": 3, - "question": "Tudo certo. Jenkins configurado" + "speak": "Tudo certo. Jenkins configurado" } ] diff --git a/config/tasks.json b/config/tasks.json index e6aa796..197b59b 100644 --- a/config/tasks.json +++ b/config/tasks.json @@ -8,5 +8,4 @@ "message": " Alright. I'll start the job" } } - ] diff --git a/package.json b/package.json index 704fb54..654a4cd 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,9 @@ "homepage": "https://github.com/hubot-js/gear-jenkins#readme", "dependencies": { "jenkins": "^0.18.0", - "sqlite": "^2.2.0" + "sqlite": "^2.2.0", + "q": "^1.4.1", + "request-promise": "^4.1.1" }, "devDependencies": { "chai": "^3.5.0", diff --git a/src/configHandler/configHandler.js b/src/configHandler/configHandler.js deleted file mode 100644 index c3ef015..0000000 --- a/src/configHandler/configHandler.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict'; - -exports.handle = handle; - -var db = require('../../src/db').getDb(); - -function handle(configs) { - db.run('UPDATE config SET url = ?, useCSRF = ?', getUrl(configs), getUseCSRF(configs)); -} - -function getUrl(configs) { - let url = answer(configs, 1); - - if (url.includes('|')) { - url = url.replace('<', '').substring(0, url.indexOf('|') - 1); - } else { - url = url.replace('<', '').replace('>', ''); - } - - return url; -} - -function getUseCSRF(configs) { - return answer(configs, 2) === 'Sim'; -} - -function answer(configs, id) { - return configs.find(c => c.id === id).answer; -} diff --git a/src/configHandler/csrf-handler.js b/src/configHandler/csrf-handler.js new file mode 100644 index 0000000..635aa5d --- /dev/null +++ b/src/configHandler/csrf-handler.js @@ -0,0 +1,25 @@ +'use strict'; + +exports.handle = handle; + +let Q = require('q'); +var db = require('../../src/db').getDb(); + +function handle(awnser) { + let deferred = Q.defer(); + + if (awnser === 'pular') { + deferred.resolve(); + return deferred.promise; + } + + db.run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); + + deferred.resolve(); + + return deferred.promise; +} + +function getUseCSRF(awnser) { + return awnser === 'Sim'; +} diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js new file mode 100644 index 0000000..0f79036 --- /dev/null +++ b/src/configHandler/url-handler.js @@ -0,0 +1,43 @@ +'use strict'; + +exports.handle = handle; + +let Q = require('q'); +var db = require('../../src/db').getDb(); +var request = require('request-promise'); + +function handle(awnser) { + let deferred = Q.defer(); + + if (awnser === 'pular') { + deferred.resolve(); + return deferred.promise; + } + + let url = getUrl(awnser); + let successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + let errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + + db.run('UPDATE config SET url = ?', url); + + request.get(url) + .then(function() { + deferred.resolve(successMessage); + }).catch(function() { + deferred.reject(errorMessage); + }); + + return deferred.promise; +} + +function getUrl(awnser) { + let url = awnser; + + if (url.includes('|')) { + url = url.replace('<', '').substring(0, url.indexOf('|') - 1); + } else { + url = url.replace('<', '').replace('>', ''); + } + + return url; +} diff --git a/test/configHandlers/csrf-handler.js b/test/configHandlers/csrf-handler.js new file mode 100644 index 0000000..a333d6f --- /dev/null +++ b/test/configHandlers/csrf-handler.js @@ -0,0 +1,53 @@ +var proxyquire = require('proxyquire').noPreserveCache(); +var chai = require('chai'); +var expect = chai.expect; +var sinon = require('sinon'); + +var chaiAsPromised = require('chai-as-promised'); +chai.use(chaiAsPromised); + +describe('Handle with csrf configuration', function() { + var runSpy; + var dbStub; + + beforeEach(function() { + var runStub = sinon.stub().resolves(); + runSpy = sinon.spy(runStub); + var db = { run: runSpy }; + dbStub = function() { return db; } + }); + + describe("Save option", function() { + it("with true when csrf is used", function() { + var csrfHandler = getCsrfHandler(dbStub); + + return csrfHandler.handle('Sim').then(function() { + expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', true)).to.be.true; + }); + }); + + it("with false when csrf is not used", function() { + var csrfHandler = getCsrfHandler(dbStub); + + return csrfHandler.handle('Não').then(function() { + expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', false)).to.be.true; + }); + }); + }); + + describe("Skip configuration", function() { + it("when get skip word and do not save config", function() { + var csrfHandler = getCsrfHandler(dbStub); + + var promise = csrfHandler.handle('pular').then(function() { + expect(runSpy.called).to.be.false; + }); + + return expect(promise).to.be.fulfilled; + }); + }); +}); + +function getCsrfHandler(dbStub) { + return proxyquire('../../src/configHandler/csrf-handler', { '../../src/db': { 'getDb': dbStub } } ); +} diff --git a/test/configHandlers/url-handler.js b/test/configHandlers/url-handler.js new file mode 100644 index 0000000..b283c54 --- /dev/null +++ b/test/configHandlers/url-handler.js @@ -0,0 +1,89 @@ +var proxyquire = require('proxyquire').noPreserveCache(); +var chai = require('chai'); +var expect = chai.expect; +var sinon = require('sinon'); + +var chaiAsPromised = require('chai-as-promised'); +chai.use(chaiAsPromised); + +describe('Handle with url configuration', function() { + var runSpy; + var dbStub; + var requestStub; + + beforeEach(function() { + var runStub = sinon.stub().resolves(); + runSpy = sinon.spy(runStub); + var db = { run: runSpy }; + dbStub = function() { return db; }; + requestStub = sinon.stub().resolves(); + }); + + describe("Save option", function() { + it("with first part when url have a pipe", function() { + var urlHandler = getUrlHandler(dbStub, requestStub); + var url = ''; + + return urlHandler.handle(url).then(function() { + expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://www.jenkins.com')).to.be.true; + }); + }); + + it("remove arrows when url do not have a pipe", function() { + var urlHandler = getUrlHandler(dbStub, requestStub); + var url = ''; + + return urlHandler.handle(url).then(function() { + expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://jenkins.com')).to.be.true; + }); + }); + }); + + describe("Verify informed url", function() { + it("and return error message when url do not respond", function() { + var errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + requestStub = sinon.stub().rejects(errorMessage); + + var urlHandler = getUrlHandler(dbStub, requestStub); + + var promise = urlHandler.handle('url'); + + return expect(promise).to.be.rejectedWith(errorMessage); + }); + + it("and return success message when url respond", function() { + var successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + requestStub = sinon.stub().resolves(successMessage); + + var urlHandler = getUrlHandler(dbStub, requestStub); + + var promise = urlHandler.handle('url'); + + return expect(promise).to.be.eventually.equal(successMessage); + }); + }); + + describe("Skip configuration", function() { + it("when get skip word and do not save config", function() { + var csrfHandler = getUrlHandler(dbStub, requestStub); + + var promise = csrfHandler.handle('pular').then(function() { + expect(runSpy.called).to.be.false; + }); + + return expect(promise).to.be.fulfilled; + }); + }); +}); + +function getUrlHandler(dbStub, requestStub) { + let db = { 'getDb': dbStub }; + let request = { 'get': requestStub}; + + let stubs = { + '../../src/db': db, + 'request-promise': request + } + + return proxyquire('../../src/configHandler/url-handler', stubs); +} From 8ed2a8dabcf1fde38e7971db8123f5f7a8f99ee6 Mon Sep 17 00:00:00 2001 From: Robson Date: Wed, 12 Oct 2016 21:55:56 -0300 Subject: [PATCH 09/22] Adapt to new hubot methods --- migrations/001-initial-schema.sql | 2 +- src/configHandler/csrf-handler.js | 10 ++--- src/configHandler/url-handler.js | 18 ++++---- src/db.js | 29 +++++++----- src/handlers/start-job.js | 12 ++--- src/jenkins.js | 11 ++--- test/configHandlers/csrf-handler.js | 26 +++++------ test/configHandlers/url-handler.js | 50 ++++++++++----------- test/db.js | 70 ++++++++++++++++++----------- test/handlers/start-job.js | 56 +++++++++++------------ 10 files changed, 155 insertions(+), 129 deletions(-) diff --git a/migrations/001-initial-schema.sql b/migrations/001-initial-schema.sql index acf395f..e1bd490 100644 --- a/migrations/001-initial-schema.sql +++ b/migrations/001-initial-schema.sql @@ -3,4 +3,4 @@ CREATE TABLE config (id INTEGER, url TEXT, useCSRF TEXT); INSERT INTO config (id) VALUES (1); -- Down -DROP TABLE config +DROP TABLE config; diff --git a/src/configHandler/csrf-handler.js b/src/configHandler/csrf-handler.js index 635aa5d..fa9234e 100644 --- a/src/configHandler/csrf-handler.js +++ b/src/configHandler/csrf-handler.js @@ -1,19 +1,19 @@ 'use strict'; -exports.handle = handle; +const Q = require('q'); +const db = require('../../src/db'); -let Q = require('q'); -var db = require('../../src/db').getDb(); +exports.handle = handle; function handle(awnser) { - let deferred = Q.defer(); + const deferred = Q.defer(); if (awnser === 'pular') { deferred.resolve(); return deferred.promise; } - db.run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); + db.getDb().run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); deferred.resolve(); diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js index 0f79036..414ee9c 100644 --- a/src/configHandler/url-handler.js +++ b/src/configHandler/url-handler.js @@ -1,24 +1,24 @@ 'use strict'; -exports.handle = handle; +const Q = require('q'); +const db = require('../../src/db'); +const request = require('request-promise'); -let Q = require('q'); -var db = require('../../src/db').getDb(); -var request = require('request-promise'); +exports.handle = handle; function handle(awnser) { - let deferred = Q.defer(); + const deferred = Q.defer(); if (awnser === 'pular') { deferred.resolve(); return deferred.promise; } - let url = getUrl(awnser); - let successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; - let errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + const url = getUrl(awnser); + const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; - db.run('UPDATE config SET url = ?', url); + db.getDb().run('UPDATE config SET url = ?', url); request.get(url) .then(function() { diff --git a/src/db.js b/src/db.js index 68ae64a..538826e 100644 --- a/src/db.js +++ b/src/db.js @@ -1,28 +1,35 @@ 'use strict'; -let db = require('sqlite'); -let path = require('path'); - +exports.startDb = startDb; exports.getDb = getDb; -function getDb() { - let gearPath = path.resolve(process.cwd(), 'node_modules/gear-jenkins/'); - let dbFile = gearPath + '/gear-jenkins.sqlite'; - let migrations = gearPath + '/migrations'; +const db = require('sqlite'); +const path = require('path'); + +let database; + +function startDb() { + const gearPath = path.resolve(process.cwd(), 'node_modules/gear-jenkins/'); + const dbFile = gearPath + '/gear-jenkins.sqlite'; + const migrations = gearPath + '/migrations'; function open(dbFile) { return db.open(dbFile); } function migrate(db) { - return db.migrate({migrationsPath: migrations}); + return db.migrate({migrationsPath: migrations}).then(function(result) { + database = result; + }); } - open(dbFile) + return open(dbFile) .then(migrate) .catch(function() { //do nothing - }) + }); +} - return db; +function getDb() { + return database; } diff --git a/src/handlers/start-job.js b/src/handlers/start-job.js index 3af074e..b396ec1 100644 --- a/src/handlers/start-job.js +++ b/src/handlers/start-job.js @@ -1,8 +1,8 @@ 'use strict'; -exports.handle = handle; +const jenkins = require('../../src/jenkins'); -var jenkins = require('../../src/jenkins'); +exports.handle = handle; function handle(hubot, message, task, params) { return start(hubot, message, task, params[0]); @@ -10,13 +10,13 @@ function handle(hubot, message, task, params) { function start(hubot, message, task, job) { return jenkins.callJob(job).then(function() { - hubot.talk(message, task.options.message); + hubot.speak(message, task.options.message); }, function(error) { if (error.notFound) { - hubot.talk(message, `Sorry I could not find the job *${job}*`); + hubot.speak(message, `Sorry I could not find the job *${job}*`); } else { - hubot.detailedError('Error on call Jenkins', error); - hubot.talk(message, `Sorry I could not start the job *${job}*. See the error in the logs.`); + hubot.logDetailedError('Error on call Jenkins', error); + hubot.speak(message, `Sorry I could not start the job *${job}*. See the error in the logs.`); } }); }; diff --git a/src/jenkins.js b/src/jenkins.js index fdf39dc..4d63650 100644 --- a/src/jenkins.js +++ b/src/jenkins.js @@ -1,18 +1,19 @@ 'use strict'; -exports.callJob = callJob; +require('./db').startDb(); +const db = require('./db'); -var db = require('./db').getDb(); +exports.callJob = callJob; function callJob(jobName) { - return db.get('SELECT * FROM config').then(function(result) { - var jenkinsOptions = { + return db.getDb().get('SELECT * FROM config').then(function(result) { + const jenkinsOptions = { baseUrl: result.url, promisify: true, crumbIssuer: result.useCSRF == 1 } - var jenkins = require('jenkins')(jenkinsOptions); + const jenkins = require('jenkins')(jenkinsOptions); return jenkins.job.build(jobName); }); diff --git a/test/configHandlers/csrf-handler.js b/test/configHandlers/csrf-handler.js index a333d6f..32939a1 100644 --- a/test/configHandlers/csrf-handler.js +++ b/test/configHandlers/csrf-handler.js @@ -1,25 +1,25 @@ -var proxyquire = require('proxyquire').noPreserveCache(); -var chai = require('chai'); -var expect = chai.expect; -var sinon = require('sinon'); +const proxyquire = require('proxyquire').noPreserveCache(); +const chai = require('chai'); +const expect = chai.expect; +const sinon = require('sinon'); -var chaiAsPromised = require('chai-as-promised'); +const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); describe('Handle with csrf configuration', function() { - var runSpy; - var dbStub; + let runSpy; + let dbStub; beforeEach(function() { - var runStub = sinon.stub().resolves(); + const runStub = sinon.stub().resolves(); runSpy = sinon.spy(runStub); - var db = { run: runSpy }; + const db = { run: runSpy }; dbStub = function() { return db; } }); describe("Save option", function() { it("with true when csrf is used", function() { - var csrfHandler = getCsrfHandler(dbStub); + const csrfHandler = getCsrfHandler(dbStub); return csrfHandler.handle('Sim').then(function() { expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', true)).to.be.true; @@ -27,7 +27,7 @@ describe('Handle with csrf configuration', function() { }); it("with false when csrf is not used", function() { - var csrfHandler = getCsrfHandler(dbStub); + const csrfHandler = getCsrfHandler(dbStub); return csrfHandler.handle('Não').then(function() { expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', false)).to.be.true; @@ -37,9 +37,9 @@ describe('Handle with csrf configuration', function() { describe("Skip configuration", function() { it("when get skip word and do not save config", function() { - var csrfHandler = getCsrfHandler(dbStub); + const csrfHandler = getCsrfHandler(dbStub); - var promise = csrfHandler.handle('pular').then(function() { + const promise = csrfHandler.handle('pular').then(function() { expect(runSpy.called).to.be.false; }); diff --git a/test/configHandlers/url-handler.js b/test/configHandlers/url-handler.js index b283c54..cf93a13 100644 --- a/test/configHandlers/url-handler.js +++ b/test/configHandlers/url-handler.js @@ -1,28 +1,28 @@ -var proxyquire = require('proxyquire').noPreserveCache(); -var chai = require('chai'); -var expect = chai.expect; -var sinon = require('sinon'); +const proxyquire = require('proxyquire').noPreserveCache(); +const chai = require('chai'); +const expect = chai.expect; +const sinon = require('sinon'); -var chaiAsPromised = require('chai-as-promised'); +const chaiAsPromised = require('chai-as-promised'); chai.use(chaiAsPromised); describe('Handle with url configuration', function() { - var runSpy; - var dbStub; - var requestStub; + let runSpy; + let dbStub; + let requestStub; beforeEach(function() { - var runStub = sinon.stub().resolves(); + const runStub = sinon.stub().resolves(); runSpy = sinon.spy(runStub); - var db = { run: runSpy }; + const db = { run: runSpy }; dbStub = function() { return db; }; requestStub = sinon.stub().resolves(); }); describe("Save option", function() { it("with first part when url have a pipe", function() { - var urlHandler = getUrlHandler(dbStub, requestStub); - var url = ''; + const urlHandler = getUrlHandler(dbStub, requestStub); + const url = ''; return urlHandler.handle(url).then(function() { expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://www.jenkins.com')).to.be.true; @@ -30,8 +30,8 @@ describe('Handle with url configuration', function() { }); it("remove arrows when url do not have a pipe", function() { - var urlHandler = getUrlHandler(dbStub, requestStub); - var url = ''; + const urlHandler = getUrlHandler(dbStub, requestStub); + const url = ''; return urlHandler.handle(url).then(function() { expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://jenkins.com')).to.be.true; @@ -41,23 +41,23 @@ describe('Handle with url configuration', function() { describe("Verify informed url", function() { it("and return error message when url do not respond", function() { - var errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; requestStub = sinon.stub().rejects(errorMessage); - var urlHandler = getUrlHandler(dbStub, requestStub); + const urlHandler = getUrlHandler(dbStub, requestStub); - var promise = urlHandler.handle('url'); + const promise = urlHandler.handle('url'); return expect(promise).to.be.rejectedWith(errorMessage); }); it("and return success message when url respond", function() { - var successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; requestStub = sinon.stub().resolves(successMessage); - var urlHandler = getUrlHandler(dbStub, requestStub); + const urlHandler = getUrlHandler(dbStub, requestStub); - var promise = urlHandler.handle('url'); + const promise = urlHandler.handle('url'); return expect(promise).to.be.eventually.equal(successMessage); }); @@ -65,9 +65,9 @@ describe('Handle with url configuration', function() { describe("Skip configuration", function() { it("when get skip word and do not save config", function() { - var csrfHandler = getUrlHandler(dbStub, requestStub); + const csrfHandler = getUrlHandler(dbStub, requestStub); - var promise = csrfHandler.handle('pular').then(function() { + const promise = csrfHandler.handle('pular').then(function() { expect(runSpy.called).to.be.false; }); @@ -77,10 +77,10 @@ describe('Handle with url configuration', function() { }); function getUrlHandler(dbStub, requestStub) { - let db = { 'getDb': dbStub }; - let request = { 'get': requestStub}; + const db = { 'getDb': dbStub }; + const request = { 'get': requestStub}; - let stubs = { + const stubs = { '../../src/db': db, 'request-promise': request } diff --git a/test/db.js b/test/db.js index fec2fc1..07916c9 100644 --- a/test/db.js +++ b/test/db.js @@ -1,22 +1,24 @@ -var proxyquire = require('proxyquire').noPreserveCache(); -var expect = require('chai').expect; -var sinon = require('sinon'); +const proxyquire = require('proxyquire').noPreserveCache(); +const expect = require('chai').expect; +const sinon = require('sinon'); require('sinon-as-promised'); describe('Data base creation', function() { it("should open db and run migrations scripts", function() { - var openStub = sinon.stub(); - var migrateStub = sinon.stub().resolves(); + const database = sinon.stub(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().resolves(database); - var openSpy = sinon.spy(openStub); - var migrateSpy = sinon.spy(migrateStub); + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); - var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - var db = buildDb(sqlite); + const db = buildDb(sqlite); openStub.resolves(sqlite); - db.getDb(); + db.startDb(); + expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; migrateSpy().then(function() { @@ -25,39 +27,57 @@ describe('Data base creation', function() { }); it("do nothing when error occurs on open", function() { - var openStub = sinon.stub(); - var migrateStub = sinon.stub().resolves(); + const openStub = sinon.stub().rejects(); - var openSpy = sinon.spy(openStub); - var migrateSpy = sinon.spy(migrateStub); + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(); - var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - var db = buildDb(sqlite); - openStub.rejects(); + const db = buildDb(sqlite); - db.getDb(); + db.startDb(); expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; expect(migrateSpy.calledWithMatch( { migrationsPath: process.cwd() + '/node_modules/gear-jenkins/migrations' } )).to.be.false; }); it("do nothing when error occurs on migration", function() { - var openStub = sinon.stub(); - var migrateStub = sinon.stub().rejects(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().rejects(); - var openSpy = sinon.spy(openStub); - var migrateSpy = sinon.spy(migrateStub); + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); - var sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - var db = buildDb(sqlite); + const db = buildDb(sqlite); openStub.resolves(sqlite); - db.getDb(); + db.startDb(); }); }); +describe('Get data base', function() { + it("when call getDb", function() { + const database = sinon.stub(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().resolves(database); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); + + const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; + + const db = buildDb(sqlite); + openStub.resolves(sqlite); + + return db.startDb().then(function() { + expect(db.getDb()).to.be.deep.equal(database); + }); + }); +}); + function buildDb(sqlite) { return proxyquire('../src/db', { 'sqlite': sqlite } ); } diff --git a/test/handlers/start-job.js b/test/handlers/start-job.js index d138f1a..cd43e36 100644 --- a/test/handlers/start-job.js +++ b/test/handlers/start-job.js @@ -1,35 +1,33 @@ -var proxyquire = require('proxyquire').noPreserveCache(); -var expect = require('chai').expect; -var sinon = require('sinon'); +const proxyquire = require('proxyquire').noPreserveCache(); +const expect = require('chai').expect; +const sinon = require('sinon'); require('sinon-as-promised'); describe('Call job', function() { - var hubot; - var talkSpy; - var message; - var task; + let hubot; + let speakSpy; + let message; + let task; beforeEach(function() { message = { "user": "hubot", "channel": "myChannel" }; task = { "options": { "message": "Hello World" } }; hubot = { - talk: function () {}, - detailedError: function() {}, - _isPrivateConversation: function () {}, - getRecipient: function() { return message.channel } + speak: function () {}, + logDetailedError: function() {} }; - talkSpy = sinon.spy(hubot, "talk"); - detailedErrorSpy = sinon.spy(hubot, "detailedError"); + speakSpy = sinon.spy(hubot, "speak"); + logDetailedErrorSpy = sinon.spy(hubot, "logDetailedError"); }); describe('with correct parameter', function() { it("job name", function() { - var callJobStub = sinon.stub().resolves(); - var callJobSpy = sinon.spy(callJobStub); + const callJobStub = sinon.stub().resolves(); + const callJobSpy = sinon.spy(callJobStub); - var startJob = getStartJob(callJobSpy); + const startJob = getStartJob(callJobSpy); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { expect(callJobSpy.calledWith('deploy-job')).to.be.true; @@ -40,11 +38,11 @@ describe('Call job', function() { describe('with success', function() { it("post message with task message", function() { - var callJobStub = sinon.stub().resolves(); - var startJob = getStartJob(callJobStub); + const callJobStub = sinon.stub().resolves(); + const startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(talkSpy.calledWith(message, task.options.message)).to.be.true; + expect(speakSpy.calledWith(message, task.options.message)).to.be.true; }); }); @@ -55,11 +53,11 @@ describe('Call job', function() { describe('job does not exists', function() { it("post message with job not found message", function() { - var callJobStub = sinon.stub().rejects( { notFound: true } ); - var startJob = getStartJob(callJobStub); + const callJobStub = sinon.stub().rejects( { notFound: true } ); + const startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(talkSpy.calledWith(message, 'Sorry I could not find the job *deploy-job*')).to.be.true; + expect(speakSpy.calledWith(message, 'Sorry I could not find the job *deploy-job*')).to.be.true; }); }); @@ -68,21 +66,21 @@ describe('Call job', function() { describe('not known', function() { it("post message with general error message", function() { - var callJobStub = sinon.stub().rejects( { } ); - var startJob = getStartJob(callJobStub); + const callJobStub = sinon.stub().rejects( { } ); + const startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(talkSpy.calledWith(message, 'Sorry I could not start the job *deploy-job*. See the error in the logs.')).to.be.true; + expect(speakSpy.calledWith(message, 'Sorry I could not start the job *deploy-job*. See the error in the logs.')).to.be.true; }); }); it("and log error", function() { - var error = {}; - var callJobStub = sinon.stub().rejects(error); - var startJob = getStartJob(callJobStub); + const error = {}; + const callJobStub = sinon.stub().rejects(error); + const startJob = getStartJob(callJobStub); return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(detailedErrorSpy.calledWith('Error on call Jenkins', error)).to.be.true; + expect(logDetailedErrorSpy.calledWith('Error on call Jenkins', error)).to.be.true; }); }); From 4ae572488ab695dde441a897af7aa39adcd2fdc2 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Thu, 13 Oct 2016 21:56:19 -0300 Subject: [PATCH 10/22] Include all files in test coverage metric --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 654a4cd..56530a1 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "A Hubot Gear for handle Jenkins tasks", "main": "/src/jenkins.js", "scripts": { - "test": "istanbul cover _mocha -- --recursive --reporter spec", + "test": "istanbul cover --include-all-sources _mocha -- --recursive --reporter spec", "coveralls": "cat ./coverage/lcov.info | coveralls" }, "repository": { From 0b633a2a3432d1b9f351dd7f66bc9960c04860b0 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Thu, 13 Oct 2016 21:57:21 -0300 Subject: [PATCH 11/22] Update node version to 6.8.0 in travis config file --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2977c32..93d6ea0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "6.7" + - "6.8.0" after_success: - 'npm run coveralls' From beb66246ab641791ec91b4d508d8733d9b6d3ae7 Mon Sep 17 00:00:00 2001 From: Robson Date: Tue, 18 Oct 2016 21:44:06 -0200 Subject: [PATCH 12/22] Fix #14 Add eslint e fix issues --- .editorconfig | 4 +- .eslintignore | 1 + .eslintrc.json | 30 +++++ .gitignore | 78 ++++++------ .travis.yml | 15 ++- CHANGELOG.md | 42 +++---- LICENSE | 42 +++---- README.md | 142 ++++++++++----------- package.json | 90 ++++++------- src/configHandler/csrf-handler.js | 50 ++++---- src/configHandler/url-handler.js | 83 ++++++------ src/db.js | 71 +++++------ src/handlers/start-job.js | 44 +++---- src/jenkins.js | 41 +++--- test/configHandlers/csrf-handler.js | 110 ++++++++-------- test/configHandlers/url-handler.js | 184 ++++++++++++++------------- test/db.js | 172 +++++++++++++------------ test/handlers/start-job.js | 188 ++++++++++++++-------------- test/jenkins.js | 169 +++++++++++++------------ 19 files changed, 807 insertions(+), 749 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json diff --git a/.editorconfig b/.editorconfig index f97d33c..00e7b24 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,5 +4,5 @@ root = true charset = utf-8 insert_final_newline = true indent_style = space -indent_size = 3 -end_of_line = crlf +indent_size = 2 +end_of_line = lf diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..f8a648f --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +coverage diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..56cc158 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,30 @@ +//Extends from airbnb configs: https://github.com/airbnb/javascript +{ + "extends": "airbnb", + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "script" + }, + "rules": { + "class-methods-use-this": 0, + "comma-dangle": ["error", "never"], + "global-require": 0, + "import/no-dynamic-require": 0, + "import/no-extraneous-dependencies": 0, + "max-len": ["error", { "code": 120 }], + "new-cap": 0, + "newline-per-chained-call": 0, + "no-param-reassign": 0, + "no-plusplus": 0, + "no-underscore-dangle": 0, + "no-use-before-define": ["error", { "functions": false, "classes": false }], + "quotes": ["error", "single", { "avoidEscape": true }], + "space-before-function-paren": 0, + "strict": ["error", "global"] + } +} diff --git a/.gitignore b/.gitignore index dfdb1a0..7c3b9d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,39 @@ -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history - -.vscode +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +.vscode diff --git a/.travis.yml b/.travis.yml index 93d6ea0..ddef5d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,9 @@ -language: node_js -node_js: - - "6.8.0" - -after_success: - - 'npm run coveralls' +language: node_js +node_js: + - "6.8.0" + +script: + - npm run lint + +after_success: + - 'npm run coveralls' diff --git a/CHANGELOG.md b/CHANGELOG.md index c72607f..f370bbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,21 @@ -# [v2.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/2.0.0) (2016-) - -### Features - -* Gear Jenkins is now configurable by the Slack - -# [v1.0.1](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.1) (2016-08-26) - -### Features - -* log when unknow error occurs ([38a2343](https://github.com/hubot-js/gear-jenkins/commit/38a2343)) -* included crumbissuer option ([85e6773](https://github.com/hubot-js/gear-jenkins/commit/85e6773)) -* add MIT license ([3cf1383](https://github.com/hubot-js/gear-jenkins/commit/3cf1383)) -* improve readme ([a729921](https://github.com/hubot-js/gear-jenkins/commit/a729921)), close [#1](https://github.com/hubot-js/gear-jenkins/issues/1) -* create changelog file - -# [v1.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.0) (2016-08-22) - -### Features - -* Call Jenkins job by name +# [v2.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/2.0.0) (2016-) + +### Features + +* Gear Jenkins is now configurable by the Slack + +# [v1.0.1](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.1) (2016-08-26) + +### Features + +* log when unknow error occurs ([38a2343](https://github.com/hubot-js/gear-jenkins/commit/38a2343)) +* included crumbissuer option ([85e6773](https://github.com/hubot-js/gear-jenkins/commit/85e6773)) +* add MIT license ([3cf1383](https://github.com/hubot-js/gear-jenkins/commit/3cf1383)) +* improve readme ([a729921](https://github.com/hubot-js/gear-jenkins/commit/a729921)), close [#1](https://github.com/hubot-js/gear-jenkins/issues/1) +* create changelog file + +# [v1.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.0) (2016-08-22) + +### Features + +* Call Jenkins job by name diff --git a/LICENSE b/LICENSE index 5e6410e..bd94ef7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,21 @@ -The MIT License (MIT) - -Copyright (c) 2016 Robson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2016 Robson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 350fe51..671a2a3 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,71 @@ -# gear-jenkins -[![Build Status](https://travis-ci.org/hubot-js/gear-jenkins.svg?branch=master)](https://travis-ci.org/hubot-js/gear-jenkins) [![npm](https://img.shields.io/npm/v/gear-jenkins.svg)](https://www.npmjs.com/package/gear-jenkins) [![Coverage Status](https://coveralls.io/repos/github/hubot-js/gear-jenkins/badge.svg?branch=master)](https://coveralls.io/github/hubot-js/gear-jenkins?branch=master) [![Code Climate](https://img.shields.io/codeclimate/github/hubot-js/gear-jenkins.svg)](https://codeclimate.com/github/hubot-js/gear-jenkins) [![dependencies Status](https://david-dm.org/hubot-js/gear-jenkins/status.svg)](https://david-dm.org/hubot-js/gear-jenkins) [![devDependencies Status](https://david-dm.org/hubot-js/gear-jenkins/dev-status.svg)](https://david-dm.org/hubot-js/gear-jenkins?type=dev) - -> A Hubot Gear for handle Jenkins tasks - -This is a gear to add to [hubot.js](https://github.com/hubot-js/hubot.js) the ability to interact with [Jenkins](https://jenkins.io/). If you do not know the hubot.js or do not know what they are gears like this [click here](https://github.com/hubot-js/hubot.js/blob/master/README.md) for more details. - -![start-deploy-gif](https://s10.postimg.org/jl5ptldnt/hubot_start_deploy2.gif) - -## Starting - -By using this gear you should inform your Jenkins url to start hubot.js. Something like the example below. - -``` -docker run -d -e BOT_API_KEY=your_slack_api_key \ - -e BOT_NAME=name_of_your_bot \ - -e JENKINS_AUTH_URL=your_jenkins_auth_url \ - --restart="unless-stopped" \ - --name=hubot \ - robsonbittencourt/hubot.js -``` - -Examples without using Docker you can find [here](https://github.com/hubot-js/hubot.js/blob/master/README.md). - -## Jenkins url - -If you use Jenkins without security (authentication) the authorization link is simply the access url. For example: `http://your.jenkins.com:8080` - -If you use the Jenkins authentication, you need to find your access token. It can be obtained from `yourJenkinsUrl/me/configure`. See more details [here](https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients). In this case your authorization link should be in this format: `http://your_user:your_token@your_jenkins_url` - -After that, you can ask me to do your jobs. - -## CSRF Protection - -If you use the Jenkins secure option ["Prevent Cross Site Request Forgery exploits"](https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API) you should pass the CRUMB_ISSUER parameter. - -``` -docker run -d -e BOT_API_KEY=your_slack_api_key \ - -e BOT_NAME=name_of_your_bot \ - -e JENKINS_AUTH_URL=your_jenkins_auth_url \ - -e CRUMB_ISSUER=true \ - --restart="unless-stopped" \ - --name=hubot \ - robsonbittencourt/hubot.js -``` - -In this case inform the parameter to true is required. If you don't use this option isn't not necessary. By default the parameter it's false. - - -## Usage - -When hubot.js starts you can call Jenkins of jobs writing the following sentence. Replace "my-deploy" with the name of your job. - -``` -hubot start job my-deploy -``` - -![start-deploy](https://s9.postimg.org/g9dt1se9b/hubot_job.png) - -## Development setup -- Fork and clone this project -- In the main directory run ```npm install```to install dependencies. -- Write your code. More Jenkins functions can be found [here](https://github.com/silas/node-jenkins). -- To run tests use ```npm test``` command - -## Meta -Robson Bittencourt - @rluizv - robson.luizv@gmail.com - -Distributed under the MIT license. See [LICENSE](LICENSE) for more information. - -https://github.com/robsonbittencourt/gear-jenkins +# gear-jenkins +[![Build Status](https://travis-ci.org/hubot-js/gear-jenkins.svg?branch=master)](https://travis-ci.org/hubot-js/gear-jenkins) [![npm](https://img.shields.io/npm/v/gear-jenkins.svg)](https://www.npmjs.com/package/gear-jenkins) [![Coverage Status](https://coveralls.io/repos/github/hubot-js/gear-jenkins/badge.svg?branch=master)](https://coveralls.io/github/hubot-js/gear-jenkins?branch=master) [![Code Climate](https://img.shields.io/codeclimate/github/hubot-js/gear-jenkins.svg)](https://codeclimate.com/github/hubot-js/gear-jenkins) [![dependencies Status](https://david-dm.org/hubot-js/gear-jenkins/status.svg)](https://david-dm.org/hubot-js/gear-jenkins) [![devDependencies Status](https://david-dm.org/hubot-js/gear-jenkins/dev-status.svg)](https://david-dm.org/hubot-js/gear-jenkins?type=dev) + +> A Hubot Gear for handle Jenkins tasks + +This is a gear to add to [hubot.js](https://github.com/hubot-js/hubot.js) the ability to interact with [Jenkins](https://jenkins.io/). If you do not know the hubot.js or do not know what they are gears like this [click here](https://github.com/hubot-js/hubot.js/blob/master/README.md) for more details. + +![start-deploy-gif](https://s10.postimg.org/jl5ptldnt/hubot_start_deploy2.gif) + +## Starting + +By using this gear you should inform your Jenkins url to start hubot.js. Something like the example below. + +``` +docker run -d -e BOT_API_KEY=your_slack_api_key \ + -e BOT_NAME=name_of_your_bot \ + -e JENKINS_AUTH_URL=your_jenkins_auth_url \ + --restart="unless-stopped" \ + --name=hubot \ + robsonbittencourt/hubot.js +``` + +Examples without using Docker you can find [here](https://github.com/hubot-js/hubot.js/blob/master/README.md). + +## Jenkins url + +If you use Jenkins without security (authentication) the authorization link is simply the access url. For example: `http://your.jenkins.com:8080` + +If you use the Jenkins authentication, you need to find your access token. It can be obtained from `yourJenkinsUrl/me/configure`. See more details [here](https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients). In this case your authorization link should be in this format: `http://your_user:your_token@your_jenkins_url` + +After that, you can ask me to do your jobs. + +## CSRF Protection + +If you use the Jenkins secure option ["Prevent Cross Site Request Forgery exploits"](https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API) you should pass the CRUMB_ISSUER parameter. + +``` +docker run -d -e BOT_API_KEY=your_slack_api_key \ + -e BOT_NAME=name_of_your_bot \ + -e JENKINS_AUTH_URL=your_jenkins_auth_url \ + -e CRUMB_ISSUER=true \ + --restart="unless-stopped" \ + --name=hubot \ + robsonbittencourt/hubot.js +``` + +In this case inform the parameter to true is required. If you don't use this option isn't not necessary. By default the parameter it's false. + + +## Usage + +When hubot.js starts you can call Jenkins of jobs writing the following sentence. Replace "my-deploy" with the name of your job. + +``` +hubot start job my-deploy +``` + +![start-deploy](https://s9.postimg.org/g9dt1se9b/hubot_job.png) + +## Development setup +- Fork and clone this project +- In the main directory run ```npm install```to install dependencies. +- Write your code. More Jenkins functions can be found [here](https://github.com/silas/node-jenkins). +- To run tests use ```npm test``` command + +## Meta +Robson Bittencourt - @rluizv - robson.luizv@gmail.com + +Distributed under the MIT license. See [LICENSE](LICENSE) for more information. + +https://github.com/robsonbittencourt/gear-jenkins diff --git a/package.json b/package.json index 56530a1..1d67fa1 100644 --- a/package.json +++ b/package.json @@ -1,42 +1,48 @@ -{ - "name": "gear-jenkins", - "version": "1.0.1", - "description": "A Hubot Gear for handle Jenkins tasks", - "main": "/src/jenkins.js", - "scripts": { - "test": "istanbul cover --include-all-sources _mocha -- --recursive --reporter spec", - "coveralls": "cat ./coverage/lcov.info | coveralls" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/hubot-js/gear-jenkins.git" - }, - "keywords": [ - "hubot-gear", - "hubot", - "slack", - "jenkins" - ], - "author": "robsonbittencourt", - "license": "MIT", - "bugs": { - "url": "https://github.com/hubot-js/gear-jenkins/issues" - }, - "homepage": "https://github.com/hubot-js/gear-jenkins#readme", - "dependencies": { - "jenkins": "^0.18.0", - "sqlite": "^2.2.0", - "q": "^1.4.1", - "request-promise": "^4.1.1" - }, - "devDependencies": { - "chai": "^3.5.0", - "chai-as-promised": "^5.3.0", - "sinon": "^1.17.5", - "sinon-as-promised": "4.0.2", - "mocha": "^3.0.2", - "proxyquire": "^1.7.10", - "istanbul": "^0.4.4", - "coveralls": "^2.11.12" - } -} +{ + "name": "gear-jenkins", + "version": "1.0.1", + "description": "A Hubot Gear for handle Jenkins tasks", + "main": "/src/jenkins.js", + "scripts": { + "test": "istanbul cover --include-all-sources _mocha -- --recursive --reporter spec", + "coveralls": "cat ./coverage/lcov.info | coveralls", + "lint": "eslint ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/hubot-js/gear-jenkins.git" + }, + "keywords": [ + "hubot-gear", + "hubot", + "slack", + "jenkins" + ], + "author": "robsonbittencourt", + "license": "MIT", + "bugs": { + "url": "https://github.com/hubot-js/gear-jenkins/issues" + }, + "homepage": "https://github.com/hubot-js/gear-jenkins#readme", + "dependencies": { + "jenkins": "^0.18.0", + "sqlite": "^2.2.0", + "q": "^1.4.1", + "request-promise": "^4.1.1" + }, + "devDependencies": { + "chai": "^3.5.0", + "chai-as-promised": "^5.3.0", + "sinon": "^1.17.5", + "sinon-as-promised": "4.0.2", + "mocha": "^3.0.2", + "proxyquire": "^1.7.10", + "istanbul": "^0.4.4", + "coveralls": "^2.11.12", + "eslint": "^3.8.0", + "eslint-config-airbnb": "^12.0.0", + "eslint-plugin-import": "^1.16.0", + "eslint-plugin-jsx-a11y": "^2.2.3", + "eslint-plugin-react": "^6.4.1" + } +} diff --git a/src/configHandler/csrf-handler.js b/src/configHandler/csrf-handler.js index fa9234e..94e6834 100644 --- a/src/configHandler/csrf-handler.js +++ b/src/configHandler/csrf-handler.js @@ -1,25 +1,25 @@ -'use strict'; - -const Q = require('q'); -const db = require('../../src/db'); - -exports.handle = handle; - -function handle(awnser) { - const deferred = Q.defer(); - - if (awnser === 'pular') { - deferred.resolve(); - return deferred.promise; - } - - db.getDb().run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); - - deferred.resolve(); - - return deferred.promise; -} - -function getUseCSRF(awnser) { - return awnser === 'Sim'; -} +'use strict'; + +const Q = require('q'); +const db = require('../../src/db'); + +exports.handle = handle; + +function handle(awnser) { + const deferred = Q.defer(); + + if (awnser === 'pular') { + deferred.resolve(); + return deferred.promise; + } + + db.getDb().run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); + + deferred.resolve(); + + return deferred.promise; +} + +function getUseCSRF(awnser) { + return awnser === 'Sim'; +} diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js index 414ee9c..fed2ff1 100644 --- a/src/configHandler/url-handler.js +++ b/src/configHandler/url-handler.js @@ -1,43 +1,40 @@ -'use strict'; - -const Q = require('q'); -const db = require('../../src/db'); -const request = require('request-promise'); - -exports.handle = handle; - -function handle(awnser) { - const deferred = Q.defer(); - - if (awnser === 'pular') { - deferred.resolve(); - return deferred.promise; - } - - const url = getUrl(awnser); - const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; - const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; - - db.getDb().run('UPDATE config SET url = ?', url); - - request.get(url) - .then(function() { - deferred.resolve(successMessage); - }).catch(function() { - deferred.reject(errorMessage); - }); - - return deferred.promise; -} - -function getUrl(awnser) { - let url = awnser; - - if (url.includes('|')) { - url = url.replace('<', '').substring(0, url.indexOf('|') - 1); - } else { - url = url.replace('<', '').replace('>', ''); - } - - return url; -} +'use strict'; + +const Q = require('q'); +const db = require('../../src/db'); +const request = require('request-promise'); + +exports.handle = handle; + +function handle(awnser) { + const deferred = Q.defer(); + + if (awnser === 'pular') { + deferred.resolve(); + return deferred.promise; + } + + const url = getUrl(awnser); + const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + + db.getDb().run('UPDATE config SET url = ?', url); + + request.get(url) + .then(() => deferred.resolve(successMessage)) + .catch(() => deferred.reject(errorMessage)); + + return deferred.promise; +} + +function getUrl(awnser) { + let url = awnser; + + if (url.includes('|')) { + url = url.replace('<', '').substring(0, url.indexOf('|') - 1); + } else { + url = url.replace('<', '').replace('>', ''); + } + + return url; +} diff --git a/src/db.js b/src/db.js index 538826e..4cae76f 100644 --- a/src/db.js +++ b/src/db.js @@ -1,35 +1,36 @@ -'use strict'; - -exports.startDb = startDb; -exports.getDb = getDb; - -const db = require('sqlite'); -const path = require('path'); - -let database; - -function startDb() { - const gearPath = path.resolve(process.cwd(), 'node_modules/gear-jenkins/'); - const dbFile = gearPath + '/gear-jenkins.sqlite'; - const migrations = gearPath + '/migrations'; - - function open(dbFile) { - return db.open(dbFile); - } - - function migrate(db) { - return db.migrate({migrationsPath: migrations}).then(function(result) { - database = result; - }); - } - - return open(dbFile) - .then(migrate) - .catch(function() { - //do nothing - }); -} - -function getDb() { - return database; -} +'use strict'; + +exports.startDb = startDb; +exports.getDb = getDb; + +const sqlite = require('sqlite'); +const path = require('path'); + +let database; + +function startDb() { + return open() + .then(migrate) + .catch(() => { }); // do nothing +} + +function open() { + const dbFile = `${gearPath()}/gear-jenkins.sqlite`; + + return sqlite.open(dbFile); +} + +function migrate(sqliteDb) { + const migrations = `${gearPath()}/migrations`; + + return sqliteDb.migrate({ migrationsPath: migrations }) + .then((result) => { database = result; }); +} + +function getDb() { + return database; +} + +function gearPath() { + return path.resolve(process.cwd(), 'node_modules/gear-jenkins/'); +} diff --git a/src/handlers/start-job.js b/src/handlers/start-job.js index b396ec1..b854825 100644 --- a/src/handlers/start-job.js +++ b/src/handlers/start-job.js @@ -1,22 +1,22 @@ -'use strict'; - -const jenkins = require('../../src/jenkins'); - -exports.handle = handle; - -function handle(hubot, message, task, params) { - return start(hubot, message, task, params[0]); -} - -function start(hubot, message, task, job) { - return jenkins.callJob(job).then(function() { - hubot.speak(message, task.options.message); - }, function(error) { - if (error.notFound) { - hubot.speak(message, `Sorry I could not find the job *${job}*`); - } else { - hubot.logDetailedError('Error on call Jenkins', error); - hubot.speak(message, `Sorry I could not start the job *${job}*. See the error in the logs.`); - } - }); -}; +'use strict'; + +const jenkins = require('../../src/jenkins'); + +exports.handle = handle; + +function handle(hubot, message, task, params) { + return start(hubot, message, task, params[0]); +} + +function start(hubot, message, task, job) { + return jenkins.callJob(job).then(() => { + hubot.speak(message, task.options.message); + }, (error) => { + if (error.notFound) { + hubot.speak(message, `Sorry I could not find the job *${job}*`); + } else { + hubot.logDetailedError('Error on call Jenkins', error); + hubot.speak(message, `Sorry I could not start the job *${job}*. See the error in the logs.`); + } + }); +} diff --git a/src/jenkins.js b/src/jenkins.js index 4d63650..57e5bba 100644 --- a/src/jenkins.js +++ b/src/jenkins.js @@ -1,20 +1,21 @@ -'use strict'; - -require('./db').startDb(); -const db = require('./db'); - -exports.callJob = callJob; - -function callJob(jobName) { - return db.getDb().get('SELECT * FROM config').then(function(result) { - const jenkinsOptions = { - baseUrl: result.url, - promisify: true, - crumbIssuer: result.useCSRF == 1 - } - - const jenkins = require('jenkins')(jenkinsOptions); - - return jenkins.job.build(jobName); - }); -} +'use strict'; + +const db = require('./db'); + +db.startDb(); + +exports.callJob = callJob; + +function callJob(jobName) { + return db.getDb().get('SELECT * FROM config').then((result) => { + const jenkinsOptions = { + baseUrl: result.url, + promisify: true, + crumbIssuer: result.useCSRF === 1 + }; + + const jenkins = require('jenkins')(jenkinsOptions); + + return jenkins.job.build(jobName); + }); +} diff --git a/test/configHandlers/csrf-handler.js b/test/configHandlers/csrf-handler.js index 32939a1..9215bd3 100644 --- a/test/configHandlers/csrf-handler.js +++ b/test/configHandlers/csrf-handler.js @@ -1,53 +1,57 @@ -const proxyquire = require('proxyquire').noPreserveCache(); -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); - -const chaiAsPromised = require('chai-as-promised'); -chai.use(chaiAsPromised); - -describe('Handle with csrf configuration', function() { - let runSpy; - let dbStub; - - beforeEach(function() { - const runStub = sinon.stub().resolves(); - runSpy = sinon.spy(runStub); - const db = { run: runSpy }; - dbStub = function() { return db; } - }); - - describe("Save option", function() { - it("with true when csrf is used", function() { - const csrfHandler = getCsrfHandler(dbStub); - - return csrfHandler.handle('Sim').then(function() { - expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', true)).to.be.true; - }); - }); - - it("with false when csrf is not used", function() { - const csrfHandler = getCsrfHandler(dbStub); - - return csrfHandler.handle('Não').then(function() { - expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', false)).to.be.true; - }); - }); - }); - - describe("Skip configuration", function() { - it("when get skip word and do not save config", function() { - const csrfHandler = getCsrfHandler(dbStub); - - const promise = csrfHandler.handle('pular').then(function() { - expect(runSpy.called).to.be.false; - }); - - return expect(promise).to.be.fulfilled; - }); - }); -}); - -function getCsrfHandler(dbStub) { - return proxyquire('../../src/configHandler/csrf-handler', { '../../src/db': { 'getDb': dbStub } } ); -} +/* eslint-disable no-unused-expressions */ + +'use strict'; + +const sinon = require('sinon'); +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const proxyquire = require('proxyquire').noPreserveCache(); + +const expect = chai.expect; +chai.use(chaiAsPromised); + +describe('Handle with csrf configuration', () => { + let runSpy; + let dbStub; + + beforeEach(() => { + const runStub = sinon.stub().resolves(); + runSpy = sinon.spy(runStub); + const db = { run: runSpy }; + dbStub = function getDbStub() { return db; }; + }); + + describe('Save option', () => { + it('with true when csrf is used', () => { + const csrfHandler = getCsrfHandler(dbStub); + + return csrfHandler.handle('Sim').then(() => { + expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', true)).to.be.true; + }); + }); + + it('with false when csrf is not used', () => { + const csrfHandler = getCsrfHandler(dbStub); + + return csrfHandler.handle('Não').then(() => { + expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', false)).to.be.true; + }); + }); + }); + + describe('Skip configuration', () => { + it('when get skip word and do not save config', () => { + const csrfHandler = getCsrfHandler(dbStub); + + const promise = csrfHandler.handle('pular').then(() => { + expect(runSpy.called).to.be.false; + }); + + return expect(promise).to.be.fulfilled; + }); + }); +}); + +function getCsrfHandler(dbStub) { + return proxyquire('../../src/configHandler/csrf-handler', { '../../src/db': { getDb: dbStub } }); +} diff --git a/test/configHandlers/url-handler.js b/test/configHandlers/url-handler.js index cf93a13..912c25f 100644 --- a/test/configHandlers/url-handler.js +++ b/test/configHandlers/url-handler.js @@ -1,89 +1,95 @@ -const proxyquire = require('proxyquire').noPreserveCache(); -const chai = require('chai'); -const expect = chai.expect; -const sinon = require('sinon'); - -const chaiAsPromised = require('chai-as-promised'); -chai.use(chaiAsPromised); - -describe('Handle with url configuration', function() { - let runSpy; - let dbStub; - let requestStub; - - beforeEach(function() { - const runStub = sinon.stub().resolves(); - runSpy = sinon.spy(runStub); - const db = { run: runSpy }; - dbStub = function() { return db; }; - requestStub = sinon.stub().resolves(); - }); - - describe("Save option", function() { - it("with first part when url have a pipe", function() { - const urlHandler = getUrlHandler(dbStub, requestStub); - const url = ''; - - return urlHandler.handle(url).then(function() { - expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://www.jenkins.com')).to.be.true; - }); - }); - - it("remove arrows when url do not have a pipe", function() { - const urlHandler = getUrlHandler(dbStub, requestStub); - const url = ''; - - return urlHandler.handle(url).then(function() { - expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://jenkins.com')).to.be.true; - }); - }); - }); - - describe("Verify informed url", function() { - it("and return error message when url do not respond", function() { - const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; - requestStub = sinon.stub().rejects(errorMessage); - - const urlHandler = getUrlHandler(dbStub, requestStub); - - const promise = urlHandler.handle('url'); - - return expect(promise).to.be.rejectedWith(errorMessage); - }); - - it("and return success message when url respond", function() { - const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; - requestStub = sinon.stub().resolves(successMessage); - - const urlHandler = getUrlHandler(dbStub, requestStub); - - const promise = urlHandler.handle('url'); - - return expect(promise).to.be.eventually.equal(successMessage); - }); - }); - - describe("Skip configuration", function() { - it("when get skip word and do not save config", function() { - const csrfHandler = getUrlHandler(dbStub, requestStub); - - const promise = csrfHandler.handle('pular').then(function() { - expect(runSpy.called).to.be.false; - }); - - return expect(promise).to.be.fulfilled; - }); - }); -}); - -function getUrlHandler(dbStub, requestStub) { - const db = { 'getDb': dbStub }; - const request = { 'get': requestStub}; - - const stubs = { - '../../src/db': db, - 'request-promise': request - } - - return proxyquire('../../src/configHandler/url-handler', stubs); -} +/* eslint-disable no-unused-expressions */ + +'use strict'; + +const sinon = require('sinon'); +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const proxyquire = require('proxyquire').noPreserveCache(); + +const expect = chai.expect; +chai.use(chaiAsPromised); + +describe('Handle with url configuration', () => { + let runSpy; + let dbStub; + let requestStub; + + beforeEach(() => { + const runStub = sinon.stub().resolves(); + runSpy = sinon.spy(runStub); + const db = { run: runSpy }; + dbStub = function getDbStub() { return db; }; + requestStub = sinon.stub().resolves(); + }); + + describe('Save option', () => { + it('with first part when url have a pipe', () => { + const urlHandler = getUrlHandler(dbStub, requestStub); + const url = ''; + + return urlHandler.handle(url).then(() => { + expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://www.jenkins.com')).to.be.true; + }); + }); + + it('remove arrows when url do not have a pipe', () => { + const urlHandler = getUrlHandler(dbStub, requestStub); + const url = ''; + + return urlHandler.handle(url).then(() => { + expect(runSpy.calledWithExactly('UPDATE config SET url = ?', 'http://jenkins.com')).to.be.true; + }); + }); + }); + + describe('Verify informed url', () => { + it('and return error message when url do not respond', () => { + const errorMessage = 'Não consegui verificar a url, algo está errado.' + + ' :disappointed: Confira se a url está correta.'; + + requestStub = sinon.stub().rejects(errorMessage); + + const urlHandler = getUrlHandler(dbStub, requestStub); + + const promise = urlHandler.handle('url'); + + return expect(promise).to.be.rejectedWith(errorMessage); + }); + + it('and return success message when url respond', () => { + const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + requestStub = sinon.stub().resolves(successMessage); + + const urlHandler = getUrlHandler(dbStub, requestStub); + + const promise = urlHandler.handle('url'); + + return expect(promise).to.be.eventually.equal(successMessage); + }); + }); + + describe('Skip configuration', () => { + it('when get skip word and do not save config', () => { + const csrfHandler = getUrlHandler(dbStub, requestStub); + + const promise = csrfHandler.handle('pular').then(() => { + expect(runSpy.called).to.be.false; + }); + + return expect(promise).to.be.fulfilled; + }); + }); +}); + +function getUrlHandler(dbStub, requestStub) { + const db = { getDb: dbStub }; + const request = { get: requestStub }; + + const stubs = { + '../../src/db': db, + 'request-promise': request + }; + + return proxyquire('../../src/configHandler/url-handler', stubs); +} diff --git a/test/db.js b/test/db.js index 07916c9..0c5660d 100644 --- a/test/db.js +++ b/test/db.js @@ -1,83 +1,89 @@ -const proxyquire = require('proxyquire').noPreserveCache(); -const expect = require('chai').expect; -const sinon = require('sinon'); -require('sinon-as-promised'); - -describe('Data base creation', function() { - it("should open db and run migrations scripts", function() { - const database = sinon.stub(); - const openStub = sinon.stub(); - const migrateStub = sinon.stub().resolves(database); - - const openSpy = sinon.spy(openStub); - const migrateSpy = sinon.spy(migrateStub); - - const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - - const db = buildDb(sqlite); - openStub.resolves(sqlite); - - db.startDb(); - - expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; - - migrateSpy().then(function() { - expect(migrateSpy.calledWithMatch( { migrationsPath: process.cwd() + '/node_modules/gear-jenkins/migrations' } )).to.be.true; - }); - }); - - it("do nothing when error occurs on open", function() { - const openStub = sinon.stub().rejects(); - - const openSpy = sinon.spy(openStub); - const migrateSpy = sinon.spy(); - - const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - - const db = buildDb(sqlite); - - db.startDb(); - - expect(openSpy.calledWith(process.cwd() + '/node_modules/gear-jenkins/gear-jenkins.sqlite')).to.be.true; - expect(migrateSpy.calledWithMatch( { migrationsPath: process.cwd() + '/node_modules/gear-jenkins/migrations' } )).to.be.false; - }); - - it("do nothing when error occurs on migration", function() { - const openStub = sinon.stub(); - const migrateStub = sinon.stub().rejects(); - - const openSpy = sinon.spy(openStub); - const migrateSpy = sinon.spy(migrateStub); - - const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - - const db = buildDb(sqlite); - openStub.resolves(sqlite); - - db.startDb(); - }); -}); - -describe('Get data base', function() { - it("when call getDb", function() { - const database = sinon.stub(); - const openStub = sinon.stub(); - const migrateStub = sinon.stub().resolves(database); - - const openSpy = sinon.spy(openStub); - const migrateSpy = sinon.spy(migrateStub); - - const sqlite = { 'open': openSpy, 'migrate': migrateSpy }; - - const db = buildDb(sqlite); - openStub.resolves(sqlite); - - return db.startDb().then(function() { - expect(db.getDb()).to.be.deep.equal(database); - }); - }); -}); - -function buildDb(sqlite) { - return proxyquire('../src/db', { 'sqlite': sqlite } ); -} +/* eslint-disable no-unused-expressions */ + +'use strict'; + +require('sinon-as-promised'); +const sinon = require('sinon'); +const expect = require('chai').expect; +const proxyquire = require('proxyquire').noPreserveCache(); + +describe('Data base creation', () => { + it('should open db and run migrations scripts', () => { + const database = sinon.stub(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().resolves(database); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); + + const sqlite = { open: openSpy, migrate: migrateSpy }; + + const db = buildDb(sqlite); + openStub.resolves(sqlite); + + db.startDb(); + + expect(openSpy.calledWith(`${process.cwd()}/node_modules/gear-jenkins/gear-jenkins.sqlite`)).to.be.true; + + migrateSpy().then(() => { + expect(migrateSpy.calledWithMatch( + { migrationsPath: `${process.cwd()}/node_modules/gear-jenkins/migrations` })).to.be.true; + }); + }); + + it('do nothing when error occurs on open', () => { + const openStub = sinon.stub().rejects(); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(); + + const sqlite = { open: openSpy, migrate: migrateSpy }; + + const db = buildDb(sqlite); + + db.startDb(); + + expect(openSpy.calledWith(`${process.cwd()}/node_modules/gear-jenkins/gear-jenkins.sqlite`)).to.be.true; + expect(migrateSpy.calledWithMatch( + { migrationsPath: `${process.cwd()}/node_modules/gear-jenkins/migrations` })).to.be.false; + }); + + it('do nothing when error occurs on migration', () => { + const openStub = sinon.stub(); + const migrateStub = sinon.stub().rejects(); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); + + const sqlite = { open: openSpy, migrate: migrateSpy }; + + const db = buildDb(sqlite); + openStub.resolves(sqlite); + + db.startDb(); + }); +}); + +describe('Get data base', () => { + it('when call getDb', () => { + const database = sinon.stub(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().resolves(database); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); + + const sqlite = { open: openSpy, migrate: migrateSpy }; + + const db = buildDb(sqlite); + openStub.resolves(sqlite); + + return db.startDb().then(() => { + expect(db.getDb()).to.be.deep.equal(database); + }); + }); +}); + +function buildDb(sqlite) { + return proxyquire('../src/db', { sqlite }); +} diff --git a/test/handlers/start-job.js b/test/handlers/start-job.js index cd43e36..df8bf62 100644 --- a/test/handlers/start-job.js +++ b/test/handlers/start-job.js @@ -1,95 +1,93 @@ -const proxyquire = require('proxyquire').noPreserveCache(); -const expect = require('chai').expect; -const sinon = require('sinon'); -require('sinon-as-promised'); - -describe('Call job', function() { - let hubot; - let speakSpy; - let message; - let task; - - beforeEach(function() { - message = { "user": "hubot", "channel": "myChannel" }; - task = { "options": { "message": "Hello World" } }; - - hubot = { - speak: function () {}, - logDetailedError: function() {} - }; - - speakSpy = sinon.spy(hubot, "speak"); - logDetailedErrorSpy = sinon.spy(hubot, "logDetailedError"); - }); - - describe('with correct parameter', function() { - it("job name", function() { - const callJobStub = sinon.stub().resolves(); - const callJobSpy = sinon.spy(callJobStub); - - const startJob = getStartJob(callJobSpy); - - return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(callJobSpy.calledWith('deploy-job')).to.be.true; - }); - }); - }) - - describe('with success', function() { - - it("post message with task message", function() { - const callJobStub = sinon.stub().resolves(); - const startJob = getStartJob(callJobStub); - - return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(speakSpy.calledWith(message, task.options.message)).to.be.true; - }); - }); - - }); - - describe('with error', function() { - - describe('job does not exists', function() { - - it("post message with job not found message", function() { - const callJobStub = sinon.stub().rejects( { notFound: true } ); - const startJob = getStartJob(callJobStub); - - return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(speakSpy.calledWith(message, 'Sorry I could not find the job *deploy-job*')).to.be.true; - }); - }); - - }); - - describe('not known', function() { - - it("post message with general error message", function() { - const callJobStub = sinon.stub().rejects( { } ); - const startJob = getStartJob(callJobStub); - - return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(speakSpy.calledWith(message, 'Sorry I could not start the job *deploy-job*. See the error in the logs.')).to.be.true; - }); - }); - - it("and log error", function() { - const error = {}; - const callJobStub = sinon.stub().rejects(error); - const startJob = getStartJob(callJobStub); - - return startJob.handle(hubot, message, task, ['deploy-job']).then(function() { - expect(logDetailedErrorSpy.calledWith('Error on call Jenkins', error)).to.be.true; - }); - }); - - }); - - }); - - function getStartJob(callJobStub) { - return proxyquire('../../src/handlers/start-job', { '../../src/jenkins': { 'callJob': callJobStub} } ); - } - -}); +/* eslint-disable no-unused-expressions */ + +'use strict'; + +const chai = require('chai'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noPreserveCache(); + +const expect = chai.expect; + +describe('Call job', () => { + let hubot; + let speakSpy; + let logDetailedErrorSpy; + let message; + let task; + + beforeEach(() => { + message = { user: 'hubot', channel: 'myChannel' }; + task = { options: { message: 'Hello World' } }; + + hubot = { + speak () {}, + logDetailedError() {} + }; + + speakSpy = sinon.spy(hubot, 'speak'); + logDetailedErrorSpy = sinon.spy(hubot, 'logDetailedError'); + }); + + describe('with correct parameter', () => { + it('job name', () => { + const callJobStub = sinon.stub().resolves(); + const callJobSpy = sinon.spy(callJobStub); + + const startJob = getStartJob(callJobSpy); + + return startJob.handle(hubot, message, task, ['deploy-job']).then(() => { + expect(callJobSpy.calledWith('deploy-job')).to.be.true; + }); + }); + }); + + describe('with success', () => { + it('post message with task message', () => { + const callJobStub = sinon.stub().resolves(); + const startJob = getStartJob(callJobStub); + + return startJob.handle(hubot, message, task, ['deploy-job']).then(() => { + expect(speakSpy.calledWith(message, task.options.message)).to.be.true; + }); + }); + }); + + describe('with error', () => { + describe('job does not exists', () => { + it('post message with job not found message', () => { + const callJobStub = sinon.stub().rejects({ notFound: true }); + const startJob = getStartJob(callJobStub); + + return startJob.handle(hubot, message, task, ['deploy-job']).then(() => { + expect(speakSpy.calledWith(message, 'Sorry I could not find the job *deploy-job*')).to.be.true; + }); + }); + }); + + describe('not known', () => { + it('post message with general error message', () => { + const callJobStub = sinon.stub().rejects({ }); + const startJob = getStartJob(callJobStub); + + return startJob.handle(hubot, message, task, ['deploy-job']).then(() => { + expect(speakSpy.calledWith(message, + 'Sorry I could not start the job *deploy-job*. See the error in the logs.')).to.be.true; + }); + }); + + it('and log error', () => { + const error = {}; + const callJobStub = sinon.stub().rejects(error); + const startJob = getStartJob(callJobStub); + + return startJob.handle(hubot, message, task, ['deploy-job']).then(() => { + expect(logDetailedErrorSpy.calledWith('Error on call Jenkins', error)).to.be.true; + }); + }); + }); + }); + + function getStartJob(callJobStub) { + return proxyquire('../../src/handlers/start-job', { '../../src/jenkins': { callJob: callJobStub } }); + } +}); diff --git a/test/jenkins.js b/test/jenkins.js index 9436529..49df5f7 100644 --- a/test/jenkins.js +++ b/test/jenkins.js @@ -1,82 +1,87 @@ -var proxyquire = require('proxyquire').noPreserveCache(); -var chai = require('chai'); -var expect = chai.expect; -var sinon = require('sinon'); - -var chaiAsPromised = require('chai-as-promised'); -chai.use(chaiAsPromised); - -var authUrl = 'http://jenkins-test.com/token'; - -describe('Jenkins call job return', function() { - it("error because url doesn't exists", function() { - var config = { url: authUrl }; - - var dbStub = getDbStub(config); - - var jenkins = getJenkins(dbStub); - - var promisse = jenkins.callJob('test'); - - return expect(promisse). - to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); - - it("error because url is null", function() { - var config = { url: null }; - - var dbStub = getDbStub(config); - - var jenkins = getJenkins(dbStub); - - var promisse = jenkins.callJob('test'); - - return expect(promisse). - to.be.rejectedWith('Error: baseUrl required'); - }); - - it("with crumbIssuer when useCSRF is true", function() { - var config = { url: authUrl, useCSRF: 1 }; - - var dbStub = getDbStub(config); - - var jenkins = getJenkins(dbStub); - - var promisse = jenkins.callJob('test'); - - return expect(promisse). - to.be.rejectedWith('Error: jenkins: job.build: jenkins: crumbIssuer.get: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); - - it("without crumbIssuer when CRUMB_ISSUER process env is false", function() { - var config = { url: authUrl, useCSRF: 0 }; - - var dbStub = getDbStub(config); - - var jenkins = getJenkins(dbStub); - - var promisse = jenkins.callJob('test'); - - return expect(promisse). - to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); - -}); - -function getDbStub(config) { - var db = { - get: function() {} - }; - - sinon.stub(db, "get").resolves( config ); - - var dbStub = function() { - return db; - } - - return dbStub; -} - -function getJenkins(dbStub) { - return proxyquire('../src/jenkins', { './db': { 'getDb': dbStub } } ); -} +/* eslint-disable no-unused-expressions */ + +'use strict'; + +require('sinon-as-promised'); +const sinon = require('sinon'); +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); +const proxyquire = require('proxyquire').noPreserveCache(); + +const expect = chai.expect; +chai.use(chaiAsPromised); + +const authUrl = 'http://jenkins-test.com/token'; + +describe('Jenkins call job return', () => { + it("error because url doesn't exists", () => { + const config = { url: authUrl }; + + const dbStub = getDbStub(config); + + const jenkins = getJenkins(dbStub); + + const promisse = jenkins.callJob('test'); + + return expect(promisse) + .to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); + }); + + it('error because url is null', () => { + const config = { url: null }; + + const dbStub = getDbStub(config); + + const jenkins = getJenkins(dbStub); + + const promisse = jenkins.callJob('test'); + + return expect(promisse) + .to.be.rejectedWith('Error: baseUrl required'); + }); + + it('with crumbIssuer when useCSRF is true', () => { + const config = { url: authUrl, useCSRF: 1 }; + + const dbStub = getDbStub(config); + + const jenkins = getJenkins(dbStub); + + const promisse = jenkins.callJob('test'); + + return expect(promisse) + .to.be.rejectedWith('Error: jenkins: job.build: jenkins: crumbIssuer.get: getaddrinfo' + + ' ENOTFOUND jenkins-test.com jenkins-test.com:80'); + }); + + it('without crumbIssuer when CRUMB_ISSUER process env is false', () => { + const config = { url: authUrl, useCSRF: 0 }; + + const dbStub = getDbStub(config); + + const jenkins = getJenkins(dbStub); + + const promisse = jenkins.callJob('test'); + + return expect(promisse) + .to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); + }); +}); + +function getDbStub(config) { + const db = { + get() {} + }; + + sinon.stub(db, 'get').resolves(config); + + const dbStub = function buildDbStub() { + return db; + }; + + return dbStub; +} + +function getJenkins(dbStub) { + return proxyquire('../src/jenkins', { './db': { getDb: dbStub } }); +} From d5f06a6424e8aede777a9f4c8fe142b7357df980 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Sat, 22 Oct 2016 15:48:18 -0200 Subject: [PATCH 13/22] Change eslint config to eslint-config-hubot-js --- .eslintrc.json | 33 +++------------------------------ package.json | 5 +---- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 56cc158..6f41a38 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,30 +1,3 @@ -//Extends from airbnb configs: https://github.com/airbnb/javascript -{ - "extends": "airbnb", - "env": { - "es6": true, - "node": true, - "mocha": true - }, - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "script" - }, - "rules": { - "class-methods-use-this": 0, - "comma-dangle": ["error", "never"], - "global-require": 0, - "import/no-dynamic-require": 0, - "import/no-extraneous-dependencies": 0, - "max-len": ["error", { "code": 120 }], - "new-cap": 0, - "newline-per-chained-call": 0, - "no-param-reassign": 0, - "no-plusplus": 0, - "no-underscore-dangle": 0, - "no-use-before-define": ["error", { "functions": false, "classes": false }], - "quotes": ["error", "single", { "avoidEscape": true }], - "space-before-function-paren": 0, - "strict": ["error", "global"] - } -} +{ + "extends": "hubot-js" +} diff --git a/package.json b/package.json index 1d67fa1..2783baa 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,6 @@ "istanbul": "^0.4.4", "coveralls": "^2.11.12", "eslint": "^3.8.0", - "eslint-config-airbnb": "^12.0.0", - "eslint-plugin-import": "^1.16.0", - "eslint-plugin-jsx-a11y": "^2.2.3", - "eslint-plugin-react": "^6.4.1" + "eslint-config-hubot-js": "^1.0.2" } } From cfddcd365af2f96589a83175d7e7a09bc6f66994 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Sun, 20 Nov 2016 22:14:43 -0200 Subject: [PATCH 14/22] Change strategy to start database --- src/configHandler/csrf-handler.js | 2 +- src/configHandler/url-handler.js | 2 +- src/db.js | 18 ++++++++++++------ src/jenkins.js | 20 ++++++++++---------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/configHandler/csrf-handler.js b/src/configHandler/csrf-handler.js index 94e6834..b00460b 100644 --- a/src/configHandler/csrf-handler.js +++ b/src/configHandler/csrf-handler.js @@ -13,7 +13,7 @@ function handle(awnser) { return deferred.promise; } - db.getDb().run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser)); + db.getDb().then((database) => database.run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser))); deferred.resolve(); diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js index fed2ff1..03c54e1 100644 --- a/src/configHandler/url-handler.js +++ b/src/configHandler/url-handler.js @@ -18,7 +18,7 @@ function handle(awnser) { const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; - db.getDb().run('UPDATE config SET url = ?', url); + db.getDb().then((database) => database.run('UPDATE config SET url = ?', url)); request.get(url) .then(() => deferred.resolve(successMessage)) diff --git a/src/db.js b/src/db.js index 4cae76f..652a5be 100644 --- a/src/db.js +++ b/src/db.js @@ -1,6 +1,5 @@ 'use strict'; -exports.startDb = startDb; exports.getDb = getDb; const sqlite = require('sqlite'); @@ -8,6 +7,14 @@ const path = require('path'); let database; +function getDb() { + if (database) { + return Promise.resolve(database); + } + + return startDb(); +} + function startDb() { return open() .then(migrate) @@ -24,11 +31,10 @@ function migrate(sqliteDb) { const migrations = `${gearPath()}/migrations`; return sqliteDb.migrate({ migrationsPath: migrations }) - .then((result) => { database = result; }); -} - -function getDb() { - return database; + .then((result) => { + database = result; + return database; + }); } function gearPath() { diff --git a/src/jenkins.js b/src/jenkins.js index 57e5bba..319d3df 100644 --- a/src/jenkins.js +++ b/src/jenkins.js @@ -2,20 +2,20 @@ const db = require('./db'); -db.startDb(); - exports.callJob = callJob; function callJob(jobName) { - return db.getDb().get('SELECT * FROM config').then((result) => { - const jenkinsOptions = { - baseUrl: result.url, - promisify: true, - crumbIssuer: result.useCSRF === 1 - }; + return db.getDb().then((dataBase) => { + dataBase.get('SELECT * FROM config').then((result) => { + const jenkinsOptions = { + baseUrl: result.url, + promisify: true, + crumbIssuer: result.useCSRF === 1 + }; - const jenkins = require('jenkins')(jenkinsOptions); + const jenkins = require('jenkins')(jenkinsOptions); - return jenkins.job.build(jobName); + return jenkins.job.build(jobName); + }); }); } From 62a816df66a2d14c9956569e1235eb8c3eb27fd1 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Sun, 27 Nov 2016 15:24:03 -0200 Subject: [PATCH 15/22] No longer necessary to report whether you are using CRFS --- config/config.json | 70 +++++++++++++---------------- migrations/001-initial-schema.sql | 12 ++--- src/configHandler/csrf-handler.js | 25 ----------- src/configHandler/url-handler.js | 2 +- src/db.js | 2 +- src/jenkins.js | 42 +++++++++++------ test/configHandlers/csrf-handler.js | 57 ----------------------- test/configHandlers/url-handler.js | 2 +- test/db.js | 10 ++--- test/jenkins.js | 31 +------------ 10 files changed, 75 insertions(+), 178 deletions(-) delete mode 100644 src/configHandler/csrf-handler.js delete mode 100644 test/configHandlers/csrf-handler.js diff --git a/config/config.json b/config/config.json index 9060a48..8679b66 100644 --- a/config/config.json +++ b/config/config.json @@ -1,40 +1,30 @@ -[ - { - "speak": "Ok, vou lhe fazer algumas perguntas então. Se precisar de mais detalhes ." - }, - - { - "speak": "_*Você utiliza o Jenkins com autenticação?*_", - "expectedResponses": [ - { - "response": "Sim", - "iteration": { - "speak": "_*Qual é a url do Jenkins?*_ A url deve ter este formato: http://user:authToken@jenkinsUrl. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", - "handler": "src/configHandler/url-handler" - } - }, - - { - "response": "Não", - "iteration": { - "speak": "_*Qual é a url do Jenkins?*_ Simplesmente utilize a url de acesso ao Jenkins. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", - "handler": "src/configHandler/url-handler" - } - } - ] - }, - - { - "speak": "_*Você utiliza CRFS no Jenkins?*_ \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", - "expectedResponses": [ - { "response": "Sim" }, - { "response": "Não" }, - { "response": "pular" } - ], - "handler": "src/configHandler/csrf-handler" - }, - - { - "speak": "Tudo certo. Jenkins configurado" - } -] +[ + { + "speak": "Ok, vou lhe fazer algumas perguntas então. Se precisar de mais detalhes ." + }, + + { + "speak": "_*Você utiliza o Jenkins com autenticação?*_", + "expectedResponses": [ + { + "response": "Sim", + "iteration": { + "speak": "_*Qual é a url do Jenkins?*_ A url deve ter este formato: http://user:authToken@jenkinsUrl. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "handler": "src/configHandler/url-handler" + } + }, + + { + "response": "Não", + "iteration": { + "speak": "_*Qual é a url do Jenkins?*_ Simplesmente utilize a url de acesso ao Jenkins. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "handler": "src/configHandler/url-handler" + } + } + ] + }, + + { + "speak": "Tudo certo. Jenkins configurado" + } +] diff --git a/migrations/001-initial-schema.sql b/migrations/001-initial-schema.sql index e1bd490..7a2ea9f 100644 --- a/migrations/001-initial-schema.sql +++ b/migrations/001-initial-schema.sql @@ -1,6 +1,6 @@ --- Up -CREATE TABLE config (id INTEGER, url TEXT, useCSRF TEXT); -INSERT INTO config (id) VALUES (1); - --- Down -DROP TABLE config; +-- Up +CREATE TABLE config (id INTEGER, url TEXT); +INSERT INTO config (id) VALUES (1); + +-- Down +DROP TABLE config; diff --git a/src/configHandler/csrf-handler.js b/src/configHandler/csrf-handler.js deleted file mode 100644 index b00460b..0000000 --- a/src/configHandler/csrf-handler.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -const Q = require('q'); -const db = require('../../src/db'); - -exports.handle = handle; - -function handle(awnser) { - const deferred = Q.defer(); - - if (awnser === 'pular') { - deferred.resolve(); - return deferred.promise; - } - - db.getDb().then((database) => database.run('UPDATE config SET useCSRF = ?', getUseCSRF(awnser))); - - deferred.resolve(); - - return deferred.promise; -} - -function getUseCSRF(awnser) { - return awnser === 'Sim'; -} diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js index 03c54e1..8906e4f 100644 --- a/src/configHandler/url-handler.js +++ b/src/configHandler/url-handler.js @@ -18,7 +18,7 @@ function handle(awnser) { const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; - db.getDb().then((database) => database.run('UPDATE config SET url = ?', url)); + db.getDb().then(database => database.run('UPDATE config SET url = ?', url)); request.get(url) .then(() => deferred.resolve(successMessage)) diff --git a/src/db.js b/src/db.js index 652a5be..e57057b 100644 --- a/src/db.js +++ b/src/db.js @@ -31,7 +31,7 @@ function migrate(sqliteDb) { const migrations = `${gearPath()}/migrations`; return sqliteDb.migrate({ migrationsPath: migrations }) - .then((result) => { + .then((result) => { database = result; return database; }); diff --git a/src/jenkins.js b/src/jenkins.js index 319d3df..a3f854b 100644 --- a/src/jenkins.js +++ b/src/jenkins.js @@ -5,17 +5,33 @@ const db = require('./db'); exports.callJob = callJob; function callJob(jobName) { - return db.getDb().then((dataBase) => { - dataBase.get('SELECT * FROM config').then((result) => { - const jenkinsOptions = { - baseUrl: result.url, - promisify: true, - crumbIssuer: result.useCSRF === 1 - }; - - const jenkins = require('jenkins')(jenkinsOptions); - - return jenkins.job.build(jobName); - }); - }); + const p1 = db.getDb(); + const p2 = p1.then(getConfig); + const p3 = p2.then(getJenkinsInfo); + + return Promise.all([p1, p2, p3]).then(params => build(jobName, params[1], params[2])); +} + +function getConfig(dataBase) { + return dataBase.get('SELECT * FROM config'); +} + +function getJenkinsInfo(config) { + const jenkins = requireJenkins(config.url); + return jenkins.info(); +} + +function build(jobName, config, info) { + const jenkins = requireJenkins(config.url, info.useCrumbs); + return jenkins.job.build(jobName); +} + +function requireJenkins(url, useCrumbs) { + const jenkinsOptions = { + baseUrl: url, + promisify: true, + crumbIssuer: useCrumbs + }; + + return require('jenkins')(jenkinsOptions); } diff --git a/test/configHandlers/csrf-handler.js b/test/configHandlers/csrf-handler.js deleted file mode 100644 index 9215bd3..0000000 --- a/test/configHandlers/csrf-handler.js +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable no-unused-expressions */ - -'use strict'; - -const sinon = require('sinon'); -const chai = require('chai'); -const chaiAsPromised = require('chai-as-promised'); -const proxyquire = require('proxyquire').noPreserveCache(); - -const expect = chai.expect; -chai.use(chaiAsPromised); - -describe('Handle with csrf configuration', () => { - let runSpy; - let dbStub; - - beforeEach(() => { - const runStub = sinon.stub().resolves(); - runSpy = sinon.spy(runStub); - const db = { run: runSpy }; - dbStub = function getDbStub() { return db; }; - }); - - describe('Save option', () => { - it('with true when csrf is used', () => { - const csrfHandler = getCsrfHandler(dbStub); - - return csrfHandler.handle('Sim').then(() => { - expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', true)).to.be.true; - }); - }); - - it('with false when csrf is not used', () => { - const csrfHandler = getCsrfHandler(dbStub); - - return csrfHandler.handle('Não').then(() => { - expect(runSpy.calledWithExactly('UPDATE config SET useCSRF = ?', false)).to.be.true; - }); - }); - }); - - describe('Skip configuration', () => { - it('when get skip word and do not save config', () => { - const csrfHandler = getCsrfHandler(dbStub); - - const promise = csrfHandler.handle('pular').then(() => { - expect(runSpy.called).to.be.false; - }); - - return expect(promise).to.be.fulfilled; - }); - }); -}); - -function getCsrfHandler(dbStub) { - return proxyquire('../../src/configHandler/csrf-handler', { '../../src/db': { getDb: dbStub } }); -} diff --git a/test/configHandlers/url-handler.js b/test/configHandlers/url-handler.js index 912c25f..fa9afde 100644 --- a/test/configHandlers/url-handler.js +++ b/test/configHandlers/url-handler.js @@ -19,7 +19,7 @@ describe('Handle with url configuration', () => { const runStub = sinon.stub().resolves(); runSpy = sinon.spy(runStub); const db = { run: runSpy }; - dbStub = function getDbStub() { return db; }; + dbStub = function getDbStub() { return Promise.resolve(db); }; requestStub = sinon.stub().resolves(); }); diff --git a/test/db.js b/test/db.js index 0c5660d..debd3f0 100644 --- a/test/db.js +++ b/test/db.js @@ -21,7 +21,7 @@ describe('Data base creation', () => { const db = buildDb(sqlite); openStub.resolves(sqlite); - db.startDb(); + db.getDb(); expect(openSpy.calledWith(`${process.cwd()}/node_modules/gear-jenkins/gear-jenkins.sqlite`)).to.be.true; @@ -41,7 +41,7 @@ describe('Data base creation', () => { const db = buildDb(sqlite); - db.startDb(); + db.getDb(); expect(openSpy.calledWith(`${process.cwd()}/node_modules/gear-jenkins/gear-jenkins.sqlite`)).to.be.true; expect(migrateSpy.calledWithMatch( @@ -60,7 +60,7 @@ describe('Data base creation', () => { const db = buildDb(sqlite); openStub.resolves(sqlite); - db.startDb(); + db.getDb(); }); }); @@ -78,8 +78,8 @@ describe('Get data base', () => { const db = buildDb(sqlite); openStub.resolves(sqlite); - return db.startDb().then(() => { - expect(db.getDb()).to.be.deep.equal(database); + return db.getDb().then((result) => { + expect(result).to.be.deep.equal(database); }); }); }); diff --git a/test/jenkins.js b/test/jenkins.js index 49df5f7..6d4e154 100644 --- a/test/jenkins.js +++ b/test/jenkins.js @@ -24,7 +24,7 @@ describe('Jenkins call job return', () => { const promisse = jenkins.callJob('test'); return expect(promisse) - .to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); + .to.be.rejectedWith('Error: jenkins: info: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); }); it('error because url is null', () => { @@ -39,33 +39,6 @@ describe('Jenkins call job return', () => { return expect(promisse) .to.be.rejectedWith('Error: baseUrl required'); }); - - it('with crumbIssuer when useCSRF is true', () => { - const config = { url: authUrl, useCSRF: 1 }; - - const dbStub = getDbStub(config); - - const jenkins = getJenkins(dbStub); - - const promisse = jenkins.callJob('test'); - - return expect(promisse) - .to.be.rejectedWith('Error: jenkins: job.build: jenkins: crumbIssuer.get: getaddrinfo' + - ' ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); - - it('without crumbIssuer when CRUMB_ISSUER process env is false', () => { - const config = { url: authUrl, useCSRF: 0 }; - - const dbStub = getDbStub(config); - - const jenkins = getJenkins(dbStub); - - const promisse = jenkins.callJob('test'); - - return expect(promisse) - .to.be.rejectedWith('Error: jenkins: job.build: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); }); function getDbStub(config) { @@ -76,7 +49,7 @@ function getDbStub(config) { sinon.stub(db, 'get').resolves(config); const dbStub = function buildDbStub() { - return db; + return Promise.resolve(db); }; return dbStub; From 6bb7617aa70facdf22b5a6c5e6049170294312ce Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Sun, 27 Nov 2016 15:37:47 -0200 Subject: [PATCH 16/22] Remove portugueses sentences --- config/config.json | 14 +++++++------- src/configHandler/url-handler.js | 6 +++--- test/configHandlers/url-handler.js | 7 +++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/config/config.json b/config/config.json index 8679b66..e09806c 100644 --- a/config/config.json +++ b/config/config.json @@ -1,23 +1,23 @@ [ { - "speak": "Ok, vou lhe fazer algumas perguntas então. Se precisar de mais detalhes ." + "speak": "Okay, I'll ask you some questions. If you need more details ." }, { - "speak": "_*Você utiliza o Jenkins com autenticação?*_", + "speak": "_*Do you use Jenkins with authentication?*_", "expectedResponses": [ { - "response": "Sim", + "response": "Yes", "iteration": { - "speak": "_*Qual é a url do Jenkins?*_ A url deve ter este formato: http://user:authToken@jenkinsUrl. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "speak": "_*What is the Jenkins url?*_ The url should have this format: http://user:authToken@jenkinsUrl. \nIf you do not want to make this setting now, keeping the current value, type *skip*.", "handler": "src/configHandler/url-handler" } }, { - "response": "Não", + "response": "No", "iteration": { - "speak": "_*Qual é a url do Jenkins?*_ Simplesmente utilize a url de acesso ao Jenkins. \nSe não quiser fazer esta configuração agora, mantendo o valor atual, digite *pular*.", + "speak": "_*What is the Jenkins url?*_ Just use the Jenkins access url. \nIf you do not want to make this setting now, keeping the current value, type *skip*.", "handler": "src/configHandler/url-handler" } } @@ -25,6 +25,6 @@ }, { - "speak": "Tudo certo. Jenkins configurado" + "speak": "All right. Jenkins configured." } ] diff --git a/src/configHandler/url-handler.js b/src/configHandler/url-handler.js index 8906e4f..86bc59d 100644 --- a/src/configHandler/url-handler.js +++ b/src/configHandler/url-handler.js @@ -9,14 +9,14 @@ exports.handle = handle; function handle(awnser) { const deferred = Q.defer(); - if (awnser === 'pular') { + if (awnser === 'skip') { deferred.resolve(); return deferred.promise; } const url = getUrl(awnser); - const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; - const errorMessage = 'Não consegui verificar a url, algo está errado. :disappointed: Confira se a url está correta.'; + const successMessage = 'Url responds. Apparently everything is alright. :champagne:'; + const errorMessage = 'I could not check the url. Something is wrong. :disappointed: Check if the url is correct.'; db.getDb().then(database => database.run('UPDATE config SET url = ?', url)); diff --git a/test/configHandlers/url-handler.js b/test/configHandlers/url-handler.js index fa9afde..e7cf7cf 100644 --- a/test/configHandlers/url-handler.js +++ b/test/configHandlers/url-handler.js @@ -45,8 +45,7 @@ describe('Handle with url configuration', () => { describe('Verify informed url', () => { it('and return error message when url do not respond', () => { - const errorMessage = 'Não consegui verificar a url, algo está errado.' + - ' :disappointed: Confira se a url está correta.'; + const errorMessage = 'I could not check the url. Something is wrong. :disappointed: Check if the url is correct.'; requestStub = sinon.stub().rejects(errorMessage); @@ -58,7 +57,7 @@ describe('Handle with url configuration', () => { }); it('and return success message when url respond', () => { - const successMessage = 'A url responde, aparentemente está tudo certo. :champagne:'; + const successMessage = 'Url responds. Apparently everything is alright. :champagne:'; requestStub = sinon.stub().resolves(successMessage); const urlHandler = getUrlHandler(dbStub, requestStub); @@ -73,7 +72,7 @@ describe('Handle with url configuration', () => { it('when get skip word and do not save config', () => { const csrfHandler = getUrlHandler(dbStub, requestStub); - const promise = csrfHandler.handle('pular').then(() => { + const promise = csrfHandler.handle('skip').then(() => { expect(runSpy.called).to.be.false; }); From ccbd43e9721f713004c5b72336a589f0bbf1689d Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Sun, 27 Nov 2016 19:19:16 -0200 Subject: [PATCH 17/22] Improve test coverge --- test/db.js | 20 ++++++++++++++++++++ test/jenkins.js | 48 +++++++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/test/db.js b/test/db.js index debd3f0..cc89e76 100644 --- a/test/db.js +++ b/test/db.js @@ -84,6 +84,26 @@ describe('Get data base', () => { }); }); +describe('Get opened data base', () => { + it('when already exist a opened database', () => { + const database = sinon.stub(); + const openStub = sinon.stub(); + const migrateStub = sinon.stub().resolves(database); + + const openSpy = sinon.spy(openStub); + const migrateSpy = sinon.spy(migrateStub); + + const sqlite = { open: openSpy, migrate: migrateSpy }; + + const db = buildDb(sqlite); + openStub.resolves(sqlite); + + return db.getDb().then(() => db.getDb()).then(() => { + expect(openSpy.calledOnce).to.be.true; + }); + }); +}); + function buildDb(sqlite) { return proxyquire('../src/db', { sqlite }); } diff --git a/test/jenkins.js b/test/jenkins.js index 6d4e154..8d62e60 100644 --- a/test/jenkins.js +++ b/test/jenkins.js @@ -13,38 +13,26 @@ chai.use(chaiAsPromised); const authUrl = 'http://jenkins-test.com/token'; -describe('Jenkins call job return', () => { - it("error because url doesn't exists", () => { +describe('Jenkins call job', () => { + it('with the the correct job name', () => { const config = { url: authUrl }; const dbStub = getDbStub(config); + const buildStub = sinon.stub().resolves(); + const buildSpy = sinon.spy(buildStub); + const jobStub = { build: buildSpy }; + const infoStub = sinon.stub().resolves({ useCrumbs: true }); - const jenkins = getJenkins(dbStub); + const jenkins = getJenkins(dbStub, jobStub, infoStub); - const promisse = jenkins.callJob('test'); - - return expect(promisse) - .to.be.rejectedWith('Error: jenkins: info: getaddrinfo ENOTFOUND jenkins-test.com jenkins-test.com:80'); - }); - - it('error because url is null', () => { - const config = { url: null }; - - const dbStub = getDbStub(config); - - const jenkins = getJenkins(dbStub); - - const promisse = jenkins.callJob('test'); - - return expect(promisse) - .to.be.rejectedWith('Error: baseUrl required'); + return jenkins.callJob('build-test').then(() => { + expect(buildSpy.calledWith('build-test')).to.be.true; + }); }); }); function getDbStub(config) { - const db = { - get() {} - }; + const db = { get() {} }; sinon.stub(db, 'get').resolves(config); @@ -55,6 +43,16 @@ function getDbStub(config) { return dbStub; } -function getJenkins(dbStub) { - return proxyquire('../src/jenkins', { './db': { getDb: dbStub } }); +function getJenkins(dbStub, jobStub, infoStub) { + function jenkinsStub() { + return { + job: jobStub, + info: infoStub + }; + } + + return proxyquire('../src/jenkins', { + './db': { getDb: dbStub }, + jenkins: jenkinsStub + }); } From f627b15340ccc29515b9a57e0c74d29fc7eb2105 Mon Sep 17 00:00:00 2001 From: Robson Date: Mon, 28 Nov 2016 00:21:31 -0200 Subject: [PATCH 18/22] Fix #8 Update README --- .gitignore | 26 +------- .npmignore | 17 +++++ README.md | 130 ++++++++++++++++++--------------------- media/activate-gear.gif | Bin 0 -> 38469 bytes media/configure-gear.gif | Bin 0 -> 184186 bytes media/start-job.gif | Bin 0 -> 40154 bytes media/start-job.png | Bin 0 -> 17392 bytes 7 files changed, 77 insertions(+), 96 deletions(-) create mode 100644 .npmignore create mode 100644 media/activate-gear.gif create mode 100644 media/configure-gear.gif create mode 100644 media/start-job.gif create mode 100644 media/start-job.png diff --git a/.gitignore b/.gitignore index 7c3b9d6..698e752 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,5 @@ # Logs -logs *.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov @@ -14,26 +7,9 @@ lib-cov # Coverage directory used by tools like istanbul coverage -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - # Dependency directories node_modules -jspm_packages - -# Optional npm cache directory -.npm -# Optional REPL history -.node_repl_history +*.db .vscode diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..7b3b62f --- /dev/null +++ b/.npmignore @@ -0,0 +1,17 @@ +# Logs +*.log + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Dependency directories +node_modules + +*.db + +.vscode + +/media diff --git a/README.md b/README.md index 671a2a3..8ad7c5e 100644 --- a/README.md +++ b/README.md @@ -1,71 +1,59 @@ -# gear-jenkins -[![Build Status](https://travis-ci.org/hubot-js/gear-jenkins.svg?branch=master)](https://travis-ci.org/hubot-js/gear-jenkins) [![npm](https://img.shields.io/npm/v/gear-jenkins.svg)](https://www.npmjs.com/package/gear-jenkins) [![Coverage Status](https://coveralls.io/repos/github/hubot-js/gear-jenkins/badge.svg?branch=master)](https://coveralls.io/github/hubot-js/gear-jenkins?branch=master) [![Code Climate](https://img.shields.io/codeclimate/github/hubot-js/gear-jenkins.svg)](https://codeclimate.com/github/hubot-js/gear-jenkins) [![dependencies Status](https://david-dm.org/hubot-js/gear-jenkins/status.svg)](https://david-dm.org/hubot-js/gear-jenkins) [![devDependencies Status](https://david-dm.org/hubot-js/gear-jenkins/dev-status.svg)](https://david-dm.org/hubot-js/gear-jenkins?type=dev) - -> A Hubot Gear for handle Jenkins tasks - -This is a gear to add to [hubot.js](https://github.com/hubot-js/hubot.js) the ability to interact with [Jenkins](https://jenkins.io/). If you do not know the hubot.js or do not know what they are gears like this [click here](https://github.com/hubot-js/hubot.js/blob/master/README.md) for more details. - -![start-deploy-gif](https://s10.postimg.org/jl5ptldnt/hubot_start_deploy2.gif) - -## Starting - -By using this gear you should inform your Jenkins url to start hubot.js. Something like the example below. - -``` -docker run -d -e BOT_API_KEY=your_slack_api_key \ - -e BOT_NAME=name_of_your_bot \ - -e JENKINS_AUTH_URL=your_jenkins_auth_url \ - --restart="unless-stopped" \ - --name=hubot \ - robsonbittencourt/hubot.js -``` - -Examples without using Docker you can find [here](https://github.com/hubot-js/hubot.js/blob/master/README.md). - -## Jenkins url - -If you use Jenkins without security (authentication) the authorization link is simply the access url. For example: `http://your.jenkins.com:8080` - -If you use the Jenkins authentication, you need to find your access token. It can be obtained from `yourJenkinsUrl/me/configure`. See more details [here](https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients). In this case your authorization link should be in this format: `http://your_user:your_token@your_jenkins_url` - -After that, you can ask me to do your jobs. - -## CSRF Protection - -If you use the Jenkins secure option ["Prevent Cross Site Request Forgery exploits"](https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API) you should pass the CRUMB_ISSUER parameter. - -``` -docker run -d -e BOT_API_KEY=your_slack_api_key \ - -e BOT_NAME=name_of_your_bot \ - -e JENKINS_AUTH_URL=your_jenkins_auth_url \ - -e CRUMB_ISSUER=true \ - --restart="unless-stopped" \ - --name=hubot \ - robsonbittencourt/hubot.js -``` - -In this case inform the parameter to true is required. If you don't use this option isn't not necessary. By default the parameter it's false. - - -## Usage - -When hubot.js starts you can call Jenkins of jobs writing the following sentence. Replace "my-deploy" with the name of your job. - -``` -hubot start job my-deploy -``` - -![start-deploy](https://s9.postimg.org/g9dt1se9b/hubot_job.png) - -## Development setup -- Fork and clone this project -- In the main directory run ```npm install```to install dependencies. -- Write your code. More Jenkins functions can be found [here](https://github.com/silas/node-jenkins). -- To run tests use ```npm test``` command - -## Meta -Robson Bittencourt - @rluizv - robson.luizv@gmail.com - -Distributed under the MIT license. See [LICENSE](LICENSE) for more information. - -https://github.com/robsonbittencourt/gear-jenkins +# gear-jenkins +[![Build Status](https://travis-ci.org/hubot-js/gear-jenkins.svg?branch=master)](https://travis-ci.org/hubot-js/gear-jenkins) [![npm](https://img.shields.io/npm/v/gear-jenkins.svg)](https://www.npmjs.com/package/gear-jenkins) [![Coverage Status](https://coveralls.io/repos/github/hubot-js/gear-jenkins/badge.svg?branch=master)](https://coveralls.io/github/hubot-js/gear-jenkins?branch=master) [![Code Climate](https://img.shields.io/codeclimate/github/hubot-js/gear-jenkins.svg)](https://codeclimate.com/github/hubot-js/gear-jenkins) [![dependencies Status](https://david-dm.org/hubot-js/gear-jenkins/status.svg)](https://david-dm.org/hubot-js/gear-jenkins) [![devDependencies Status](https://david-dm.org/hubot-js/gear-jenkins/dev-status.svg)](https://david-dm.org/hubot-js/gear-jenkins?type=dev) + +> A Hubot Gear for handle Jenkins tasks + +This is a gear to add to [hubot.js](https://github.com/hubot-js/hubot.js) the ability to interact with [Jenkins](https://jenkins.io/). If you do not know the hubot.js or do not know what they are gears like this [click here](https://github.com/hubot-js/hubot.js/blob/master/README.md) for more details. + +![start-job](media/start-job.gif) + +## Starting + +To use this gear you must first activate it with the command: + +``` +activate jenkins +``` +![activate](media/activate-gear.gif) + +## Configurations + +Some settings are required. They can be made by Slack using the following command: + +``` +configure jenkins +``` +![configure](media/configure-gear.gif) + +These settings are stored, so you just need to do them once. But if necessary can make them again. + +Below are the details about each setting: + +### Jenkins url + +If you use Jenkins without security (authentication) the authorization link is simply the access url. For example: `http://your.jenkins.com:8080` + +If you use the Jenkins authentication, you need to find your access token. It can be obtained from `yourJenkinsUrl/me/configure`. See more details [here](https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients). In this case your authorization link should be in this format: `http://your_user:your_token@your_jenkins_url` + +## Usage + +When hubot.js starts you can call Jenkins of jobs writing the following sentence. Replace "my-deploy" with the name of your job. + +``` +hubot start job my-deploy +``` + +![start-job](media/start-job.png) + +## Development setup +- Fork and clone this project +- In the main directory run ```npm install```to install dependencies. +- Write your code. More Jenkins functions can be found [here](https://github.com/silas/node-jenkins). +- To run tests use ```npm test``` command + +## Meta +Robson Bittencourt - @rluizv - robson.luizv@gmail.com + +Distributed under the MIT license. See [LICENSE](LICENSE) for more information. + +https://github.com/hubot-js/gear-jenkins diff --git a/media/activate-gear.gif b/media/activate-gear.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb3d3f2acd058f55b2a5ed80f621481a224df677 GIT binary patch literal 38469 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 BlVJb= literal 0 HcmV?d00001 diff --git a/media/configure-gear.gif b/media/configure-gear.gif new file mode 100644 index 0000000000000000000000000000000000000000..d16c9e927a29a41e19b9cec1cbae9a9e5d14b141 GIT binary patch literal 184186 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 ck{`(snuN?YEQByWIZ5ZR3ZhkcVA+4 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 z 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 literal 0 HcmV?d00001 From fe1a14129f667d7e1c176af8f89748179098312d Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Mon, 28 Nov 2016 23:51:26 -0200 Subject: [PATCH 19/22] Fix #7 Update dependencies --- package.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2783baa..032fea4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gear-jenkins", - "version": "1.0.1", + "version": "2.0.0", "description": "A Hubot Gear for handle Jenkins tasks", "main": "/src/jenkins.js", "scripts": { @@ -25,21 +25,21 @@ }, "homepage": "https://github.com/hubot-js/gear-jenkins#readme", "dependencies": { - "jenkins": "^0.18.0", - "sqlite": "^2.2.0", + "jenkins": "^0.20.0", + "sqlite": "^2.2.3", "q": "^1.4.1", "request-promise": "^4.1.1" }, "devDependencies": { "chai": "^3.5.0", - "chai-as-promised": "^5.3.0", - "sinon": "^1.17.5", + "chai-as-promised": "^6.0.0", + "sinon": "^1.17.6", "sinon-as-promised": "4.0.2", - "mocha": "^3.0.2", + "mocha": "^3.2.0", "proxyquire": "^1.7.10", - "istanbul": "^0.4.4", - "coveralls": "^2.11.12", - "eslint": "^3.8.0", - "eslint-config-hubot-js": "^1.0.2" + "istanbul": "^0.4.5", + "coveralls": "^2.11.15", + "eslint": "^3.11.1", + "eslint-config-hubot-js": "^1.0.4" } } From d09be853c0bd692d39b8cf784414af3f77c455ab Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Tue, 29 Nov 2016 00:01:41 -0200 Subject: [PATCH 20/22] Adjust travis file --- .travis.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ddef5d0..be0db56 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,18 @@ language: node_js + node_js: - - "6.8.0" + - 7.1.0 script: - npm run lint after_success: - - 'npm run coveralls' + - npm run coveralls + +deploy: + provider: npm + email: robson.luizv@gmail.com + api_key: + secure: DitKAhj07lrVL6QVjA5jlmtx9wr7aocDYiO3bhdIRMFHSZczKzt0iG9Eqyb0C8e6dLl4E9NUWB/qF+9oIoL/uzTOvk81M4nkFHfs2LsrLse4il5aZWd+aJGzhtUfLa3avYNZ4Ihh1l9oUilTUeip1ytWYgp3PSskQ13mEMrydRp7k7KXzDrnBHnsOPBGFE6ikwop66DylfFEMOZd7tDD63ZpcDF0UM0vLsgVJbUpimxU3/ck8vJGQTpShc0DSFHJM2oke9oqKGMVJxgPk/lwxJmQChE2TXrFlusE21ApZwm9RWaP7j2X7ZaLSXugfiSpu8w6nlyLH2leQ8gDXhIDwOhuWutXuT4I+xVKIjlhjlMXv/lVkeXvdsrlgsuVvhZaP+oxvbcUFSykAj6SU3gIpuPPV4v9SoWw5HbiMWn4eQbl6DssKjZQJuowLgak0BpxTfe2ceRxNrKBcUT4xPzVcueMRL697aqP0VufB4Ql2fUsMBFMt05jeLqIHgIl3OHPU8bwqalr5vahlGg9NxUqOOSj2MkoXJOM04hknu5OS0JMHgqkh+Pukb5Xa/QrQNeyQKGU73Q5PxblIptaM7wFHB2LfktCM0RLN4WANJV+qGSwL5lwSTkogYIDWQc8ZQi5LApiDriDlbO1bPT8GchhCFo6OvHhCQE5VI2Z41QdLFs= + on: + branch: master From 0cc733821c590c66f4e5d70c589fcf427fba7a64 Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Tue, 29 Nov 2016 00:41:34 -0200 Subject: [PATCH 21/22] Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f370bbf..aaa12b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ -# [v2.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/2.0.0) (2016-) +# [v2.0.0](https://github.com/hubot-js/gear-jenkins/releases/tag/2.0.0) (2016-11-29) ### Features +[Project](https://github.com/hubot-js/gear-jenkins/projects/1) + * Gear Jenkins is now configurable by the Slack # [v1.0.1](https://github.com/hubot-js/gear-jenkins/releases/tag/1.0.1) (2016-08-26) From cc036e8b134e22efd7300a5a6348bd870572ca9e Mon Sep 17 00:00:00 2001 From: robsonbittencourt Date: Tue, 29 Nov 2016 00:44:32 -0200 Subject: [PATCH 22/22] Add codeclimate config file --- .codeclimate.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .codeclimate.yml diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000..7183799 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,18 @@ +--- +engines: + duplication: + enabled: true + config: + languages: + javascript: + mass_threshold: 70 + + fixme: + enabled: true +ratings: + paths: + - "**.js" + - "**.module" +exclude_paths: +- config/ +- test/