• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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