1'use strict' 2var fs = require('fs') 3var path = require('path') 4var test = require('tap').test 5var requireInject = require('require-inject') 6var npm = require('../../lib/npm.js') 7 8// XXX update this when rpt's realpath.js is extracted out 9var rptRealpath = require.resolve('read-package-tree/realpath.js') 10 11const common = require('../common-tap.js') 12const pkg = common.pkg 13var packages = { 14 test: {package: {name: 'test'}, path: pkg, children: ['abc', 'def', 'ghi', 'jkl']}, 15 abc: {package: {name: 'abc'}, path: path.join(pkg, 'node_modules', 'abc')}, 16 def: {package: {name: 'def'}, path: path.join(pkg, 'node_modules', 'def')}, 17 ghi: {package: {name: 'ghi'}, path: path.join(pkg, 'node_modules', 'ghi')}, 18 jkl: {package: {name: 'jkl'}, path: path.join(pkg, 'node_modules', 'jkl')} 19} 20var dirs = {} 21var files = {} 22Object.keys(packages).forEach(function (name) { 23 dirs[path.join(packages[name].path, 'node_modules')] = packages[name].children || [] 24 files[path.join(packages[name].path, 'package.json')] = packages[name].package 25}) 26 27var mockReaddir = function (name, cb) { 28 if (dirs[name]) return cb(null, dirs[name]) 29 var er = new Error('No such mock: ' + name) 30 er.code = 'ENOENT' 31 cb(er) 32} 33var mockReadPackageJson = function (file, cb) { 34 if (files[file]) return cb(null, files[file]) 35 var er = new Error('No such mock: ' + file) 36 er.code = 'ENOENT' 37 cb(er) 38} 39var mockFs = Object.create(fs) 40mockFs.realpath = function (dir, cb) { 41 return cb(null, dir) 42} 43 44const mockRptRealpath = path => Promise.resolve(path) 45 46test('setup', function (t) { 47 npm.load(function () { 48 t.pass('npm loaded') 49 t.end() 50 }) 51}) 52 53test('installer', function (t) { 54 t.plan(1) 55 var installer = requireInject('../../lib/install.js', { 56 'fs': mockFs, 57 'readdir-scoped-modules': mockReaddir, 58 'read-package-json': mockReadPackageJson, 59 'mkdirp': function (path, cb) { cb() }, 60 [rptRealpath]: mockRptRealpath 61 }) 62 63 var Installer = installer.Installer 64 class TestInstaller extends Installer { 65 constructor (where, dryrun, args) { 66 super(where, dryrun, args) 67 this.global = true 68 } 69 loadArgMetadata (cb) { 70 this.args = this.args.map(function (arg) { return {name: arg} }) 71 cb() 72 } 73 } 74 75 var inst = new TestInstaller(pkg, false, ['def', 'abc']) 76 inst.loadCurrentTree(function () { 77 var kids = inst.currentTree.children.map(function (child) { return child.package.name }) 78 t.isDeeply(kids, ['abc', 'def']) 79 t.end() 80 }) 81}) 82 83test('uninstaller', function (t) { 84 t.plan(1) 85 var uninstaller = requireInject('../../lib/uninstall.js', { 86 'fs': mockFs, 87 'readdir-scoped-modules': mockReaddir, 88 'read-package-json': mockReadPackageJson, 89 'mkdirp': function (path, cb) { cb() }, 90 [rptRealpath]: mockRptRealpath 91 }) 92 93 var Uninstaller = uninstaller.Uninstaller 94 class TestUninstaller extends Uninstaller { 95 constructor (where, dryrun, args) { 96 super(where, dryrun, args) 97 this.global = true 98 } 99 } 100 101 var uninst = new TestUninstaller(pkg, false, ['ghi', 'jkl']) 102 uninst.loadCurrentTree(function () { 103 var kids = uninst.currentTree.children.map(function (child) { return child.package.name }) 104 t.isDeeply(kids, ['ghi', 'jkl']) 105 t.end() 106 }) 107}) 108