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