|
| 1 | +'use strict' |
| 2 | +const path = require('path') |
| 3 | +const fs = require('fs') |
| 4 | +const test = require('tap').test |
| 5 | +const Tacks = require('tacks') |
| 6 | +const File = Tacks.File |
| 7 | +const Dir = Tacks.Dir |
| 8 | +const common = require('../common-tap.js') |
| 9 | + |
| 10 | +const basedir = path.join(__dirname, path.basename(__filename, '.js')) |
| 11 | +const testdir = path.join(basedir, 'testdir') |
| 12 | +const cachedir = path.join(basedir, 'cache') |
| 13 | +const globaldir = path.join(basedir, 'global') |
| 14 | +const tmpdir = path.join(basedir, 'tmp') |
| 15 | + |
| 16 | +const conf = { |
| 17 | + cwd: testdir, |
| 18 | + env: common.newEnv().extend({ |
| 19 | + npm_config_cache: cachedir, |
| 20 | + npm_config_tmp: tmpdir, |
| 21 | + npm_config_prefix: globaldir, |
| 22 | + npm_config_registry: common.registry, |
| 23 | + npm_config_loglevel: 'warn' |
| 24 | + }) |
| 25 | +} |
| 26 | + |
| 27 | +const fixture = new Tacks(Dir({ |
| 28 | + cache: Dir(), |
| 29 | + global: Dir(), |
| 30 | + tmp: Dir(), |
| 31 | + testdir: Dir({ |
| 32 | + package: Dir({ |
| 33 | + 'package.json': File({ |
| 34 | + name: 'package', |
| 35 | + version: '1.0.0', |
| 36 | + dependencies: { |
| 37 | + 'base-dep': '../packages/base-dep-1.0.0.tgz', |
| 38 | + 'plugin-dep': '../packages/plugin-dep-1.0.0.tgz' |
| 39 | + } |
| 40 | + }) |
| 41 | + }), |
| 42 | + 'package.json': File({ |
| 43 | + version: '1.0.0', |
| 44 | + dependencies: { |
| 45 | + package: 'file:./package', |
| 46 | + 'base-dep': './packages/base-dep-2.0.0.tgz' |
| 47 | + } |
| 48 | + }), |
| 49 | + // file: dependencies do not work as they are symlinked and behave |
| 50 | + // differently. Instead installation from tgz files is used. |
| 51 | + packages: Dir({ |
| 52 | + 'base-dep-1.0.0.tgz': File(Buffer.from( |
| 53 | + '1f8b080000000000000a2b484cce4e4c4fd52f80d07a59c5f9790c540606' + |
| 54 | + '06066666660ad8c4c1c0d45c81c1d8d4ccc0d0d0ccccc0448101c8303505' + |
| 55 | + 'd1d4760836505a5c925804740aa5e640bca200a78708a8e6525050ca4bcc' + |
| 56 | + '4d55b252504a4a2c4ed54d492d50d2018996a5161567e6e781240cf50cf4' + |
| 57 | + '0c94b86ab906dab9a360148c8251300aa80400a44d97d100080000', |
| 58 | + 'hex' |
| 59 | + )), |
| 60 | + 'base-dep-2.0.0.tgz': File(Buffer.from( |
| 61 | + '1f8b080000000000000a2b484cce4e4c4fd52f80d07a59c5f9790c540606' + |
| 62 | + '06066666660ad8c4c1c0d45c81c1d8d4ccc0d0d0ccccc0448101c8303505' + |
| 63 | + 'd1d4760836505a5c925804740aa5e640bca200a78708a8e6525050ca4bcc' + |
| 64 | + '4d55b252504a4a2c4ed54d492d50d2018996a5161567e6e781248cf40cf4' + |
| 65 | + '0c94b86ab906dab9a360148c8251300aa80400aebbeeba00080000', |
| 66 | + 'hex' |
| 67 | + )), |
| 68 | + 'plugin-dep-1.0.0.tgz': File(Buffer.from( |
| 69 | + '1f8b080000000000000aed8f3d0e83300c8599394594b904476d3274e622' + |
| 70 | + '295888fe8488408756dcbd0e513bb115a9aa946f79ce7bb1653b535f4c8b' + |
| 71 | + 'a58b2acebeb7d9c60080d69aadf90119b2bdd220a98203cba8504a916ebd' + |
| 72 | + 'c81a931fcd40ab7c3b27dec23efa273c73c6b83537e447c6dd756a3b5b34' + |
| 73 | + 'e8f82ef8771c7cd7db10490102a2eb10870a1dda066ddda1a7384ca1e464' + |
| 74 | + '3c2eddd42044f97e164bb318db07a77f733ee7bfbe3a914824122f4e04e9' + |
| 75 | + '2e00080000', |
| 76 | + 'hex' |
| 77 | + )) |
| 78 | + }) |
| 79 | + }) |
| 80 | +})) |
| 81 | + |
| 82 | +function setup () { |
| 83 | + cleanup() |
| 84 | + fixture.create(basedir) |
| 85 | +} |
| 86 | + |
| 87 | +function cleanup () { |
| 88 | + fixture.remove(basedir) |
| 89 | +} |
| 90 | + |
| 91 | +test('setup', t => { |
| 92 | + setup() |
| 93 | + return common.fakeRegistry.listen() |
| 94 | +}) |
| 95 | + |
| 96 | +test('example', t => { |
| 97 | + return common.npm(['install'], conf).then(([code, stdout, stderr]) => { |
| 98 | + t.is(code, 0, 'command ran ok') |
| 99 | + t.comment(stdout.trim()) |
| 100 | + t.comment(stderr.trim()) |
| 101 | + t.ok(fs.existsSync(path.join(testdir, 'node_modules')), 'did install') |
| 102 | + var packageLock = JSON.parse(fs.readFileSync(path.join(testdir, 'package-lock.json'), 'utf8')) |
| 103 | + t.similar(packageLock, { |
| 104 | + dependencies: { |
| 105 | + 'base-dep': { |
| 106 | + version: 'file:packages/base-dep-2.0.0.tgz' |
| 107 | + }, |
| 108 | + 'package': { |
| 109 | + version: 'file:package', |
| 110 | + dependencies: { |
| 111 | + 'base-dep': { |
| 112 | + version: 'file:packages/base-dep-1.0.0.tgz' |
| 113 | + }, |
| 114 | + // plugin-dep must not placed on top-level |
| 115 | + 'plugin-dep': { |
| 116 | + version: 'file:packages/plugin-dep-1.0.0.tgz' |
| 117 | + } |
| 118 | + } |
| 119 | + } |
| 120 | + } |
| 121 | + }, 'locks dependencies as unhoisted') |
| 122 | + t.similar(Object.keys(packageLock.dependencies), ['base-dep', 'package'], 'has correct packages on top-level') |
| 123 | + }) |
| 124 | +}) |
| 125 | + |
| 126 | +test('cleanup', t => { |
| 127 | + common.fakeRegistry.close() |
| 128 | + cleanup() |
| 129 | + t.done() |
| 130 | +}) |
0 commit comments