From ac13fdb8d4740863acfafa79dc707283f1094953 Mon Sep 17 00:00:00 2001 From: Pyves Date: Sat, 14 Apr 2018 08:35:47 +0100 Subject: [PATCH] [librariesio] Missing try/catch block and tests (#1644) --- server.js | 79 ++++++++++++---------- services/librariesio/librariesio.tester.js | 41 +++++++++++ services/test-validators.js | 5 +- 3 files changed, 87 insertions(+), 38 deletions(-) create mode 100644 services/librariesio/librariesio.tester.js diff --git a/server.js b/server.js index 6c19e46d53..d17e7fc90b 100644 --- a/server.js +++ b/server.js @@ -7062,59 +7062,64 @@ 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': + case 'github': { uri = 'https://libraries.io/api/github/' + project + '/dependencies'; break; - case 'release': - var v = version || 'latest'; + } + case 'release': { + 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); + if (checkErrorResponse(badgeData, err, res, 'not available')) { + sendBadge(format, badgeData); + return; } - 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'; + // 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'; + 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); } - - // 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); }); })); diff --git a/services/librariesio/librariesio.tester.js b/services/librariesio/librariesio.tester.js new file mode 100644 index 0000000000..db4a78b3ae --- /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 e21744316d..c990a2fc07 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 };