From b5675fdfea2adf8c89bc45046a5034d0de17a182 Mon Sep 17 00:00:00 2001 From: PyvesB Date: Fri, 13 Apr 2018 19:16:14 +0100 Subject: [PATCH 1/3] Added missing try/catch block and implemented tests --- server.js | 65 +++++++++++----------- services/librariesio/librariesio.tester.js | 41 ++++++++++++++ services/test-validators.js | 5 +- 3 files changed, 79 insertions(+), 32 deletions(-) create mode 100644 services/librariesio/librariesio.tester.js diff --git a/server.js b/server.js index 6c19e46d53947..7cc2306d412fb 100644 --- a/server.js +++ b/server.js @@ -7062,59 +7062,62 @@ cache(function(data, match, sendBadge, request) { // Libraries.io integration. camp.route(/^\/librariesio\/(github|release)\/([\w\-_]+\/[\w\-_]+)\/?([\w\-_.]+)?\.(svg|png|gif|jpg|json)$/, cache(function(data, match, sendBadge, request) { + const resource = match[1]; + const project = match[2]; + const version = match[3]; + const format = match[4]; - var resource = match[1]; - var project = match[2]; - var version = match[3]; - var format = match[4]; - - var uri; + let uri; switch (resource) { case 'github': uri = 'https://libraries.io/api/github/' + project + '/dependencies'; break; case 'release': - var v = version || 'latest'; + const v = version || 'latest'; uri = 'https://libraries.io/api/' + project + '/' + v + '/dependencies'; break; } - var options = {method: 'GET', json: true, uri: uri}; - var badgeData = getBadgeData('dependencies', data); + const options = {method: 'GET', json: true, uri: uri}; + const badgeData = getBadgeData('dependencies', data); request(options, function(err, res, json) { - if (err || res.statusCode !== 200) { badgeData.text[1] = 'not available'; return sendBadge(format, badgeData); } - var deprecated = json.dependencies.filter(function(dep) { - return dep.deprecated; - }); + try { + const deprecated = json.dependencies.filter(function(dep) { + return dep.deprecated; + }); - var outofdate = json.dependencies.filter(function(dep) { - return dep.outdated; - }); + const outofdate = json.dependencies.filter(function(dep) { + return dep.outdated; + }); - // Deprecated dependencies are really bad - if (deprecated.length > 0) { - badgeData.colorscheme = 'red'; - badgeData.text[1] = deprecated.length + ' deprecated'; - return sendBadge(format, badgeData); - } + // Deprecated dependencies are really bad + if (deprecated.length > 0) { + badgeData.colorscheme = 'red'; + badgeData.text[1] = deprecated.length + ' deprecated'; + return sendBadge(format, badgeData); + } - // Out of date dependencies are pretty bad - if (outofdate.length > 0) { - badgeData.colorscheme = 'orange'; - badgeData.text[1] = outofdate.length + ' out of date'; + // Out of date dependencies are pretty bad + if (outofdate.length > 0) { + badgeData.colorscheme = 'orange'; + badgeData.text[1] = outofdate.length + ' out of date'; + return sendBadge(format, badgeData); + } + + // Up to date dependencies are good! + badgeData.colorscheme = 'brightgreen'; + badgeData.text[1] = 'up to date'; return sendBadge(format, badgeData); + } catch (e) { + badgeData.text[1] = 'invalid'; + sendBadge(format, badgeData); } - - // Up to date dependencies are good! - badgeData.colorscheme = 'brightgreen'; - badgeData.text[1] = 'up to date'; - return sendBadge(format, badgeData); }); })); diff --git a/services/librariesio/librariesio.tester.js b/services/librariesio/librariesio.tester.js new file mode 100644 index 0000000000000..db4a78b3ae821 --- /dev/null +++ b/services/librariesio/librariesio.tester.js @@ -0,0 +1,41 @@ +'use strict'; + +const Joi = require('joi'); +const ServiceTester = require('../service-tester'); +const { + isDependencyState +} = require('../test-validators'); + +const t = new ServiceTester({ id: 'librariesio', title: 'Libraries.io' }); +module.exports = t; + +t.create('dependencies for releases') + .get('/release/hex/phoenix/1.0.3.json') + .expectJSONTypes(Joi.object().keys({ + name: 'dependencies', + value: isDependencyState, + })); + +t.create('dependencies for github') + .get('/github/pyvesb/notepad4e.json') + .expectJSONTypes(Joi.object().keys({ + name: 'dependencies', + value: isDependencyState, + })); + +t.create('release not found') + .get('/release/hex/invalid/4.0.4.json') + .expectJSON({ + name: 'dependencies', + value: 'not available', + }); + +t.create('no response data') + .get('/github/phoenixframework/phoenix.json') + .intercept(nock => nock('https://libraries.io') + .get('/api/github/phoenixframework/phoenix/dependencies') + .reply(200)) + .expectJSON({ + name: 'dependencies', + value: 'invalid', + }); diff --git a/services/test-validators.js b/services/test-validators.js index e21744316d9f6..c990a2fc07120 100644 --- a/services/test-validators.js +++ b/services/test-validators.js @@ -67,6 +67,8 @@ const isFormattedDate = Joi.alternatives().try( Joi.string().regex(/^last (sun|mon|tues|wednes|thurs|fri|satur)day$/), Joi.string().regex(/^(january|february|march|april|may|june|july|august|september|october|november|december)( \d{4})?$/)); +const isDependencyState = withRegex(/^(\d+ out of date|\d+ deprecated|up to date)$/); + module.exports = { isSemver, isVPlusTripleDottedVersion, @@ -83,5 +85,6 @@ module.exports = { isIntegerPercentage, isDecimalPercentage, isFileSize, - isFormattedDate + isFormattedDate, + isDependencyState }; From d28bd1f24845aa0d23709feb055e89440f0d0f00 Mon Sep 17 00:00:00 2001 From: PyvesB Date: Fri, 13 Apr 2018 19:28:07 +0100 Subject: [PATCH 2/3] Fixed lexical declaration in case block --- server.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 7cc2306d412fb..b618de19da222 100644 --- a/server.js +++ b/server.js @@ -7069,13 +7069,15 @@ cache(function(data, match, sendBadge, request) { let uri; switch (resource) { - case 'github': + case 'github': { uri = 'https://libraries.io/api/github/' + project + '/dependencies'; break; - case 'release': + } + case 'release': { const v = version || 'latest'; uri = 'https://libraries.io/api/' + project + '/' + v + '/dependencies'; break; + } } const options = {method: 'GET', json: true, uri: uri}; From cec3db79ccac3a15745f5954e198854e6c94add4 Mon Sep 17 00:00:00 2001 From: PyvesB Date: Fri, 13 Apr 2018 20:33:47 +0100 Subject: [PATCH 3/3] Improved error handling --- server.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server.js b/server.js index b618de19da222..d17e7fc90b50d 100644 --- a/server.js +++ b/server.js @@ -7084,9 +7084,9 @@ cache(function(data, match, sendBadge, request) { const badgeData = getBadgeData('dependencies', data); request(options, function(err, res, json) { - if (err || res.statusCode !== 200) { - badgeData.text[1] = 'not available'; - return sendBadge(format, badgeData); + if (checkErrorResponse(badgeData, err, res, 'not available')) { + sendBadge(format, badgeData); + return; } try {