diff --git a/__mocks__/fs.js b/__mocks__/fs.js index b7b63a1..599cc35 100644 --- a/__mocks__/fs.js +++ b/__mocks__/fs.js @@ -1,5 +1,16 @@ const fs = jest.genMockFromModule('fs'); +let _files = []; + +/** + * Set files + * + * @param {String[]} + */ +fs.__setFiles = (files) => { + _files = files; +}; + // Mocks fs.link fs.link = (src, dest, callback) => { callback.call(null); @@ -10,4 +21,12 @@ fs.unlink = (dest, callback) => { callback.call(null); }; +/** + * Returns true if the file path exists in the _files list + * + * @param {String} filePath + * @return {Boolean} + */ +fs.existsSync = filePath => _files.indexOf(filePath) > -1; + module.exports = fs; diff --git a/__tests__/api/plugins.js b/__tests__/api/plugins.js new file mode 100644 index 0000000..75a2289 --- /dev/null +++ b/__tests__/api/plugins.js @@ -0,0 +1,16 @@ +import path from 'path'; +import plugins from '../../src/api/plugins'; +import { PLUGIN_PATH } from '../../src/utils/paths'; + +jest.mock('fs'); + +describe('plugins', () => { + it('should check if a plugin is installed', () => { + // eslint-disable-next-line global-require + require('fs').__setFiles([ + path.resolve(PLUGIN_PATH, 'foobar'), + ]); + expect(plugins.isInstalled('foobar')).toBeTruthy(); + expect(plugins.isInstalled('bazqux')).toBeFalsy(); + }); +}); diff --git a/src/api/plugins.js b/src/api/plugins.js index 6e3874e..e7a9067 100644 --- a/src/api/plugins.js +++ b/src/api/plugins.js @@ -1,4 +1,7 @@ +const path = require('path'); +const fs = require('fs'); const Conf = require('../utils/conf'); +const { PLUGIN_PATH } = require('../utils/paths'); // initialize a new config file const config = new Conf(); @@ -14,6 +17,14 @@ const getAll = () => config.get('plugins') || []; // eslint-disable-next-line no-bitwise const isEnabled = plugin => ~getAll().indexOf(plugin); +/** + * Checks if the plugin is installed + * + * @param {String} plugin - The plugin name + * @return {Boolean} + */ +const isInstalled = plugin => fs.existsSync(path.resolve(PLUGIN_PATH, plugin)); + /** * Enables the plugin by adding it to the config * @@ -39,6 +50,7 @@ const disable = (plugin) => { module.exports = { getAll, isEnabled, + isInstalled, enable, disable, };