• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict'
2var npm = require('../../lib/npm.js')
3var log = require('npmlog')
4var test = require('tap').test
5
6var mockLog = {
7  finish: function () {},
8  silly: function () {}
9}
10
11var actions
12test('setup', function (t) {
13  npm.load({ 'unsafe-perm': true }, function () {
14    log.disableProgress()
15    actions = require('../../lib/install/actions.js').actions
16    t.end()
17  })
18})
19
20test('->optdep:a->dep:b', function (t) {
21  var moduleA = {
22    name: 'a',
23    path: '/a',
24    package: {
25      scripts: {
26        postinstall: 'false'
27      },
28      dependencies: {
29        b: '*'
30      }
31    },
32    isTop: true
33  }
34  var moduleB = {
35    name: 'b',
36    path: '/b',
37    package: {},
38    requires: [],
39    requiredBy: [moduleA]
40  }
41  moduleA.requires = [moduleB]
42
43  var tree = {
44    path: '/',
45    package: {
46      optionalDependencies: {
47        a: '*'
48      }
49    },
50    children: [moduleA, moduleB],
51    requires: [moduleA],
52    isTop: true
53  }
54  moduleA.requiredBy = [tree]
55  moduleA.parent = tree
56  moduleB.parent = tree
57
58  t.plan(3)
59  return actions.postinstall('/', moduleA, mockLog).then(() => {
60    throw new Error('was not supposed to succeed')
61  }, (err) => {
62    t.is(err && err.code, 'ELIFECYCLE', 'Lifecycle failed')
63    t.ok(moduleA.failed, 'moduleA (optional dep) is marked failed')
64    t.ok(moduleB.failed, 'moduleB (direct dep of moduleA) is marked as failed')
65    t.end()
66  })
67})
68
69test('->dep:b,->optdep:a->dep:b', function (t) {
70  var moduleA = {
71    name: 'a',
72    path: '/',
73    package: {
74      scripts: {
75        postinstall: 'false'
76      },
77      dependencies: {
78        b: '*'
79      }
80    },
81    isTop: false
82  }
83  var moduleB = {
84    name: 'b',
85    path: '/',
86    package: {},
87    requires: [],
88    requiredBy: [moduleA],
89    isTop: false
90  }
91  moduleA.requires = [moduleB]
92
93  var tree = {
94    name: 'tree',
95    path: '/',
96    package: {
97      dependencies: {
98        b: '*'
99      },
100      optionalDependencies: {
101        a: '*'
102      }
103    },
104    children: [moduleA, moduleB],
105    requires: [moduleA, moduleB],
106    isTop: true
107  }
108  moduleA.requiredBy = [tree]
109  moduleB.requiredBy.push(tree)
110  moduleA.parent = tree
111  moduleB.parent = tree
112
113  return actions.postinstall('/', moduleA, mockLog).then(() => {
114    t.ok(moduleA.failed, 'moduleA (optional dep) is marked failed')
115    t.ok(!moduleB.failed, 'moduleB (direct dep of moduleA) is marked as failed')
116  })
117})
118