diff --git a/bin/configure-fastly.js b/bin/configure-fastly.js index c6f76411d..c3eb4cca2 100644 --- a/bin/configure-fastly.js +++ b/bin/configure-fastly.js @@ -24,7 +24,7 @@ var routes = routeJson.map(function (route) { async.auto({ version: function (cb) { - fastly.getLatestVersion(function (err, response) { + fastly.getLatestActiveVersion(function (err, response) { if (err) return cb(err); // Validate latest version before continuing if (response.active || response.locked) { diff --git a/bin/lib/fastly-extended.js b/bin/lib/fastly-extended.js index 0e4467221..fbad130d5 100644 --- a/bin/lib/fastly-extended.js +++ b/bin/lib/fastly-extended.js @@ -24,11 +24,11 @@ module.exports = function (apiKey, serviceId) { }; /* - * getLatestVersion: Get the most recent version for the configured service + * getLatestActiveVersion: Get the most recent version for the configured service * * @param {callback} Callback with signature *err, latestVersion) */ - fastly.getLatestVersion = function (cb) { + fastly.getLatestActiveVersion = function (cb) { if (!this.serviceId) { return cb('Failed to get latest version. No serviceId configured'); } @@ -39,7 +39,14 @@ module.exports = function (apiKey, serviceId) { } var latestVersion = versions.reduce(function (lateVersion, version) { if (!lateVersion) return version; - if (version.number > lateVersion.number) return version; + // if versions we're comparing are both active, or both inactive, prefer + // whichever has a higher version number + if (lateVersion.active === version.active) { + if (version.number > lateVersion.number) return version; + return lateVersion; + } + // if only one of the versions is active, prefer that one + if (version.active === true) return version; return lateVersion; }); return cb(null, latestVersion); diff --git a/test/unit/lib/fastly-extended.test.js b/test/unit/lib/fastly-extended.test.js new file mode 100644 index 000000000..edc5e78f1 --- /dev/null +++ b/test/unit/lib/fastly-extended.test.js @@ -0,0 +1,44 @@ +describe('fastly library', () => { + test('getLatestActiveVersion returns largest active VCL number', done => { + + const mockedFastlyRequest = jest.fn((method, url, cb) => { + cb(null, [ + { + number: 4, + active: false + }, + { + number: 1, + active: true + }, + { + number: 2, + active: true + }, + { + number: 3, + active: false + } + ]); + }); + + jest.mock('fastly', () => (() => ({ + request: mockedFastlyRequest + }))); + + const fastlyExtended = require('../../../bin/lib/fastly-extended'); // eslint-disable-line global-require + const fastlyInstance = fastlyExtended('api_key', 'service_id'); + + fastlyInstance.getLatestActiveVersion((err, response) => { + expect(err).toBe(null); + expect(response).toEqual({ + number: 2, + active: true + }); + expect(mockedFastlyRequest).toHaveBeenCalledWith( + 'GET', '/service/service_id/version', expect.any(Function) + ); + done(); + }); + }); +});