• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1var test = require('tap').test
2var path = require('path')
3var fs = require('fs')
4var rimraf = require('rimraf')
5var common = require('../common-tap.js')
6var Tacks = require('tacks')
7var unixFormatPath = require('../../lib/utils/unix-format-path.js')
8var File = Tacks.File
9var Dir = Tacks.Dir
10
11var testdir = common.pkg
12var cachedir = common.cache
13var config = ['--cache=' + cachedir, '--loglevel=error']
14
15var shrinkwrap = {
16  name: 'shrinkwrap-local-dependency',
17  version: '1.0.0',
18  dependencies: {
19    mod2: {
20      version: 'file:' + unixFormatPath(path.join('mods', 'mod2')),
21      dependencies: {
22        mod1: {
23          version: 'file:' + unixFormatPath(path.join('mods', 'mod1'))
24        }
25      }
26    }
27  }
28}
29
30var fixture = new Tacks(
31  Dir({
32    cache: Dir(),
33    mods: Dir({
34      mod1: Dir({
35        'package.json': File({
36          name: 'mod1',
37          version: '1.0.0'
38        })
39      }),
40      mod2: Dir({
41        'package.json': File({
42          name: 'mod2',
43          version: '1.0.0',
44          dependencies: {
45            mod1: 'file:' + path.join('..', 'mod1')
46          }
47        })
48      })
49    }),
50    'package.json': File({
51      name: 'shrinkwrap-local-dependency',
52      version: '1.0.0',
53      dependencies: {
54        mod2: 'file:' + path.join('mods', 'mod2')
55      }
56    })
57  })
58)
59
60function setup () {
61  cleanup()
62  fixture.create(testdir)
63}
64
65function cleanNodeModules () {
66  rimraf.sync(path.resolve(testdir, 'node_modules'))
67}
68
69function cleanup () {
70  fixture.remove(testdir)
71}
72
73test('shrinkwrap uses resolved with file: on local deps', function (t) {
74  setup()
75
76  common.npm(config.concat(['install', '--legacy']), {cwd: testdir}, function (err, code, stdout, stderr) {
77    if (err) throw err
78    t.comment(stdout.trim())
79    t.comment(stderr.trim())
80    t.equal(code, 0, 'npm exited normally')
81
82    common.npm(config.concat('shrinkwrap'), {cwd: testdir}, function (err, code, stdout, stderr) {
83      if (err) throw err
84      t.comment(stdout.trim())
85      t.comment(stderr.trim())
86      t.equal(code, 0, 'npm exited normally')
87      var data = fs.readFileSync(path.join(testdir, 'npm-shrinkwrap.json'), { encoding: 'utf8' })
88      t.like(
89        JSON.parse(data).dependencies,
90        shrinkwrap.dependencies,
91        'shrinkwrap looks correct'
92      )
93      t.end()
94    })
95  })
96})
97
98function exists (file) {
99  try {
100    fs.statSync(file)
101    return true
102  } catch (ex) {
103    return false
104  }
105}
106
107test("'npm install' should install local packages from shrinkwrap", function (t) {
108  cleanNodeModules()
109
110  common.npm(config.concat(['install']), {cwd: testdir}, function (err, code, stdout, stderr) {
111    if (err) throw err
112    t.comment(stdout.trim())
113    t.comment(stderr.trim())
114    t.equal(code, 0, 'npm exited normally')
115    t.ok(exists(path.join(testdir, 'node_modules', 'mod2')), 'mod2 exists')
116    t.ok(exists(path.join(testdir, 'node_modules', 'mod2', 'node_modules', 'mod1')), 'mod1 exists')
117    t.end()
118  })
119})
120
121test('cleanup', function (t) {
122  cleanup()
123  t.end()
124})
125