From da1ded53449183f16cba122a45193b63b29de349 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Tue, 24 Oct 2017 13:50:07 +0200
Subject: [PATCH] refactor: move more package worker logic to manager

---
 lib/manager/docker/package.js                 |  4 +--
 lib/manager/index.js                          | 18 +++++++++++++
 lib/manager/npm/package.js                    |  4 +--
 lib/workers/package/index.js                  | 11 ++------
 .../docker/__snapshots__/package.spec.js.snap |  4 +--
 test/manager/docker/package.spec.js           | 16 ++++++------
 .../npm/__snapshots__/package.spec.js.snap    | 10 ++++----
 test/manager/npm/package.spec.js              | 14 +++++------
 .../package/__snapshots__/index.spec.js.snap  |  2 +-
 test/workers/package/index.spec.js            | 25 +++++++++++++------
 10 files changed, 65 insertions(+), 43 deletions(-)
 create mode 100644 lib/manager/index.js

diff --git a/lib/manager/docker/package.js b/lib/manager/docker/package.js
index 7d0a7f6a9c..6d8cbc8e45 100644
--- a/lib/manager/docker/package.js
+++ b/lib/manager/docker/package.js
@@ -4,10 +4,10 @@ const versions = require('../../workers/package/versions');
 const compareVersions = require('compare-versions');
 
 module.exports = {
-  renovateDockerImage,
+  getPackageUpdates,
 };
 
-async function renovateDockerImage(config) {
+async function getPackageUpdates(config) {
   const { currentFrom, currentTag, logger } = config;
   const upgrades = [];
   if (config.pinDigests) {
diff --git a/lib/manager/index.js b/lib/manager/index.js
new file mode 100644
index 0000000000..4c0f2cfe5d
--- /dev/null
+++ b/lib/manager/index.js
@@ -0,0 +1,18 @@
+const docker = require('./docker/package');
+const npm = require('./npm/package');
+
+module.exports = {
+  getPackageUpdates,
+};
+
+async function getPackageUpdates(config) {
+  if (config.packageFile.endsWith('Dockerfile')) {
+    return docker.getPackageUpdates(config);
+  } else if (config.packageFile.endsWith('package.json')) {
+    return npm.getPackageUpdates(config);
+  } else if (config.packageFile.endsWith('package.js')) {
+    return npm.getPackageUpdates(config);
+  }
+  config.logger.info(`Cannot find manager for ${config.packageFile}`);
+  throw new Error('Unsupported package manager');
+}
diff --git a/lib/manager/npm/package.js b/lib/manager/npm/package.js
index 2831aac70b..afa44d1255 100644
--- a/lib/manager/npm/package.js
+++ b/lib/manager/npm/package.js
@@ -2,10 +2,10 @@ const npmApi = require('./registry');
 const versions = require('../../workers/package/versions');
 
 module.exports = {
-  renovateNpmPackage,
+  getPackageUpdates,
 };
 
-async function renovateNpmPackage(config) {
+async function getPackageUpdates(config) {
   const { logger } = config;
   let results = [];
   if (!versions.isValidVersion(config.currentVersion)) {
diff --git a/lib/workers/package/index.js b/lib/workers/package/index.js
index 89908d3e89..dfabb56b83 100644
--- a/lib/workers/package/index.js
+++ b/lib/workers/package/index.js
@@ -1,6 +1,5 @@
 const configParser = require('../../config');
-const { renovateDockerImage } = require('../../manager/docker/package');
-const { renovateNpmPackage } = require('../../manager/npm/package');
+const { getPackageUpdates } = require('../../manager');
 
 module.exports = {
   renovatePackage,
@@ -14,13 +13,7 @@ async function renovatePackage(config) {
     logger.debug('package is disabled');
     return [];
   }
-  let results;
-  if (config.depType === 'Dockerfile') {
-    results = await renovateDockerImage(config);
-  } else {
-    // npm
-    results = await renovateNpmPackage(config);
-  }
+  const results = await getPackageUpdates(config);
   logger.debug({ results }, `${config.depName} lookup results`);
   // Flatten the result on top of config, add repositoryUrl
   return (
diff --git a/test/manager/docker/__snapshots__/package.spec.js.snap b/test/manager/docker/__snapshots__/package.spec.js.snap
index 6455d888bf..c17b7f4e05 100644
--- a/test/manager/docker/__snapshots__/package.spec.js.snap
+++ b/test/manager/docker/__snapshots__/package.spec.js.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/workers/package/docker renovateDockerImage adds digest 1`] = `
+exports[`lib/workers/package/docker getPackageUpdates adds digest 1`] = `
 Array [
   Object {
     "isPin": true,
@@ -23,7 +23,7 @@ Array [
 ]
 `;
 
-exports[`lib/workers/package/docker renovateDockerImage returns major and minor upgrades 1`] = `
+exports[`lib/workers/package/docker getPackageUpdates returns major and minor upgrades 1`] = `
 Array [
   Object {
     "currentVersion": "1.0.0",
diff --git a/test/manager/docker/package.spec.js b/test/manager/docker/package.spec.js
index cd34a2c0e3..6b963261c2 100644
--- a/test/manager/docker/package.spec.js
+++ b/test/manager/docker/package.spec.js
@@ -8,7 +8,7 @@ dockerApi.getDigest = jest.fn();
 dockerApi.getTags = jest.fn();
 
 describe('lib/workers/package/docker', () => {
-  describe('renovateDockerImage', () => {
+  describe('getPackageUpdates', () => {
     let config;
     beforeEach(() => {
       config = {
@@ -20,29 +20,29 @@ describe('lib/workers/package/docker', () => {
       };
     });
     it('returns empty if no digest', async () => {
-      expect(await docker.renovateDockerImage(config)).toEqual([]);
+      expect(await docker.getPackageUpdates(config)).toEqual([]);
     });
     it('returns empty if digest is same', async () => {
       dockerApi.getDigest.mockReturnValueOnce(config.currentDigest);
-      expect(await docker.renovateDockerImage(config)).toEqual([]);
+      expect(await docker.getPackageUpdates(config)).toEqual([]);
     });
     it('returns a digest', async () => {
       dockerApi.getDigest.mockReturnValueOnce('sha256:1234567890');
-      const res = await docker.renovateDockerImage(config);
+      const res = await docker.getPackageUpdates(config);
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('digest');
     });
     it('returns a pin', async () => {
       delete config.currentDigest;
       dockerApi.getDigest.mockReturnValueOnce('sha256:1234567890');
-      const res = await docker.renovateDockerImage(config);
+      const res = await docker.getPackageUpdates(config);
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('pin');
     });
     it('returns empty if current tag is not valid version', async () => {
       config.currentTag = 'some-text-tag';
       dockerApi.getDigest.mockReturnValueOnce(config.currentDigest);
-      expect(await docker.renovateDockerImage(config)).toEqual([]);
+      expect(await docker.getPackageUpdates(config)).toEqual([]);
     });
     it('returns major and minor upgrades', async () => {
       dockerApi.getDigest.mockReturnValueOnce(config.currentDigest);
@@ -55,7 +55,7 @@ describe('lib/workers/package/docker', () => {
         '2.0.0',
         '3.0.0',
       ]);
-      const res = await docker.renovateDockerImage(config);
+      const res = await docker.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(3);
       expect(res[0].type).toEqual('minor');
@@ -71,7 +71,7 @@ describe('lib/workers/package/docker', () => {
         '1.1.0-something',
         '1.2.0-otherthing',
       ]);
-      const res = await docker.renovateDockerImage(config);
+      const res = await docker.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(2);
       expect(res[1].type).toEqual('minor');
diff --git a/test/manager/npm/__snapshots__/package.spec.js.snap b/test/manager/npm/__snapshots__/package.spec.js.snap
index df7ce9d2cd..de45e88d21 100644
--- a/test/manager/npm/__snapshots__/package.spec.js.snap
+++ b/test/manager/npm/__snapshots__/package.spec.js.snap
@@ -1,12 +1,12 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`lib/workers/package/npm renovateNpmPackage returns array if upgrades found 1`] = `
+exports[`lib/workers/package/npm getPackageUpdates returns array if upgrades found 1`] = `
 Array [
   "repositoryUrl",
 ]
 `;
 
-exports[`lib/workers/package/npm renovateNpmPackage returns error if no npm scoped dep found 1`] = `
+exports[`lib/workers/package/npm getPackageUpdates returns error if no npm scoped dep found 1`] = `
 Array [
   Object {
     "message": "Failed to look up dependency. This will block *all* dependencies from being updated due to presence of lock file.",
@@ -16,7 +16,7 @@ Array [
 ]
 `;
 
-exports[`lib/workers/package/npm renovateNpmPackage returns warning if no npm dep found 1`] = `
+exports[`lib/workers/package/npm getPackageUpdates returns warning if no npm dep found 1`] = `
 Array [
   Object {
     "message": "Failed to look up dependency",
@@ -26,7 +26,7 @@ Array [
 ]
 `;
 
-exports[`lib/workers/package/npm renovateNpmPackage returns warning if no npm dep found and lock file 1`] = `
+exports[`lib/workers/package/npm getPackageUpdates returns warning if no npm dep found and lock file 1`] = `
 Array [
   Object {
     "message": "Failed to look up dependency. This will block *all* dependencies from being updated due to presence of lock file.",
@@ -36,7 +36,7 @@ Array [
 ]
 `;
 
-exports[`lib/workers/package/npm renovateNpmPackage returns warning if using invalid version 1`] = `
+exports[`lib/workers/package/npm getPackageUpdates returns warning if using invalid version 1`] = `
 Array [
   Object {
     "depName": "some-dep",
diff --git a/test/manager/npm/package.spec.js b/test/manager/npm/package.spec.js
index 0918b947a0..f93cc58972 100644
--- a/test/manager/npm/package.spec.js
+++ b/test/manager/npm/package.spec.js
@@ -8,7 +8,7 @@ jest.mock('../../../lib/manager/npm/registry');
 npmApi.getDependency = jest.fn();
 
 describe('lib/workers/package/npm', () => {
-  describe('renovateNpmPackage', () => {
+  describe('getPackageUpdates', () => {
     let config;
     beforeEach(() => {
       jest.resetAllMocks();
@@ -22,11 +22,11 @@ describe('lib/workers/package/npm', () => {
     it('returns warning if using invalid version', async () => {
       config.currentVersion =
         'git+ssh://git@github.com/joefraley/eslint-config-meridian.git';
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
     });
     it('returns warning if no npm dep found', async () => {
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('warning');
@@ -34,7 +34,7 @@ describe('lib/workers/package/npm', () => {
     });
     it('returns warning if no npm dep found and lock file', async () => {
       config.packageLock = 'some package lock';
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('warning');
@@ -43,7 +43,7 @@ describe('lib/workers/package/npm', () => {
     it('returns error if no npm scoped dep found', async () => {
       config.depName = '@foo/something';
       config.yarnLock = '# some yarn lock';
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res).toMatchSnapshot();
       expect(res).toHaveLength(1);
       expect(res[0].type).toEqual('warning');
@@ -56,13 +56,13 @@ describe('lib/workers/package/npm', () => {
           message: 'bad version',
         },
       ]);
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res[0].type).toEqual('warning');
     });
     it('returns array if upgrades found', async () => {
       npmApi.getDependency.mockReturnValueOnce({ repositoryUrl: 'some-url' });
       versions.determineUpgrades = jest.fn(() => [{}]);
-      const res = await npm.renovateNpmPackage(config);
+      const res = await npm.getPackageUpdates(config);
       expect(res).toHaveLength(1);
       expect(Object.keys(res[0])).toMatchSnapshot();
       expect(res[0].repositoryUrl).toBeDefined();
diff --git a/test/workers/package/__snapshots__/index.spec.js.snap b/test/workers/package/__snapshots__/index.spec.js.snap
index 7c82620c8d..1e74edc7b4 100644
--- a/test/workers/package/__snapshots__/index.spec.js.snap
+++ b/test/workers/package/__snapshots__/index.spec.js.snap
@@ -10,7 +10,6 @@ Object {
   "commitMessage": "Update dependency {{depName}} to v{{newVersion}}",
   "currentVersion": "1.0.0",
   "depName": "foo",
-  "depType": "npm",
   "description": Array [],
   "group": Object {
     "branchName": "{{branchPrefix}}{{groupSlug}}",
@@ -93,6 +92,7 @@ This {{#if isGitHub}}PR{{else}}MR{{/if}} has been generated by [Renovate Bot](ht
     "warn": [Function],
   },
   "npmrc": null,
+  "packageFile": "package.json",
   "packageFiles": Array [],
   "prBody": "This {{#if isGitHub}}Pull{{else}}Merge{{/if}} Request {{#if isRollback}}rolls back{{else}}updates{{/if}} dependency {{#if repositoryUrl}}[{{depName}}]({{repositoryUrl}}){{else}}\`{{depName}}\`{{/if}} from \`{{#unless isRange}}{{#unless isPin}}v{{/unless}}{{/unless}}{{currentVersion}}\` to \`{{#unless isRange}}v{{/unless}}{{newVersion}}\`{{#if isRollback}}. This is necessary and important because \`v{{currentVersion}}\` cannot be found in the npm registry - probably because of it being unpublished.{{/if}}
 {{#if releases.length}}
diff --git a/test/workers/package/index.spec.js b/test/workers/package/index.spec.js
index bdc0a19490..869a172427 100644
--- a/test/workers/package/index.spec.js
+++ b/test/workers/package/index.spec.js
@@ -23,21 +23,21 @@ describe('lib/workers/package/index', () => {
       expect(res).toMatchObject([]);
     });
     it('calls docker', async () => {
-      docker.renovateDockerImage.mockReturnValueOnce([]);
-      config.depType = 'Dockerfile';
+      docker.getPackageUpdates.mockReturnValueOnce([]);
+      config.packageFile = 'Dockerfile';
       const res = await pkgWorker.renovatePackage(config);
       expect(res).toMatchObject([]);
     });
-    it('calls npm', async () => {
-      npm.renovateNpmPackage.mockReturnValueOnce([]);
-      config.depType = 'npm';
+    it('calls meteor', async () => {
+      npm.getPackageUpdates.mockReturnValueOnce([]);
+      config.packageFile = 'package.js';
       const res = await pkgWorker.renovatePackage(config);
       expect(res).toMatchObject([]);
     });
     it('maps and filters type', async () => {
-      config.depType = 'npm';
+      config.packageFile = 'package.json';
       config.major.enabled = false;
-      npm.renovateNpmPackage.mockReturnValueOnce([
+      npm.getPackageUpdates.mockReturnValueOnce([
         { type: 'pin' },
         { type: 'major' },
         { type: 'minor', enabled: false },
@@ -47,5 +47,16 @@ describe('lib/workers/package/index', () => {
       expect(res[0]).toMatchSnapshot();
       expect(res[0].groupName).toEqual('Pin Dependencies');
     });
+    it('throws', async () => {
+      npm.getPackageUpdates.mockReturnValueOnce([]);
+      config.packageFile = 'something-else';
+      let e;
+      try {
+        await pkgWorker.renovatePackage(config);
+      } catch (err) {
+        e = err;
+      }
+      expect(e).toBeDefined();
+    });
   });
 });
-- 
GitLab