summaryrefslogtreecommitdiff
path: root/deps/npm/test/tap/shrinkwrap-resolve-conflict.js
blob: 146d1191bf5aef0d9d5780bc50c60b4e015e715f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
'use strict'

const BB = require('bluebird')

const common = require('../common-tap.js')
const fs = BB.promisifyAll(require('fs'))
const path = require('path')
const rimraf = BB.promisify(require('rimraf'))
const test = require('tap').test
const Tacks = require('tacks')

const File = Tacks.File
const Dir = Tacks.Dir

const testDir = path.resolve(__dirname, path.basename(__filename, '.js'))
const modAdir = path.resolve(testDir, 'modA')
const modBdir = path.resolve(testDir, 'modB')
const modCdir = path.resolve(testDir, 'modC')

test('conflicts in shrinkwrap are auto-resolved on install', (t) => {
  const fixture = new Tacks(Dir({
    'package.json': File({
      name: 'foo',
      dependencies: {
        modA: 'file://' + modAdir,
        modB: 'file://' + modBdir
      },
      devDependencies: {
        modC: 'file://' + modCdir
      }
    }),
    'npm-shrinkwrap.json': File(
      `
{
  "name": "foo",
  "requires": true,
  "lockfileVersion": 1,
  "dependencies": {
<<` + `<<` + `<<` + `< HEAD
    "modA": {
      "version": "file:modA"
||` + `||` + `||` + `| merged common ancestors
    "modB": {
      "version": "file:modB"
==` + `==` + `==` + `=
    "modC": {
      "version": "file:modC",
      "dev": true
>>` + `>>` + `>>` + `> branch
    }
  }
}
`),
    'modA': Dir({
      'package.json': File({
        name: 'modA',
        version: '1.0.0'
      })
    }),
    'modB': Dir({
      'package.json': File({
        name: 'modB',
        version: '1.0.0'
      })
    }),
    'modC': Dir({
      'package.json': File({
        name: 'modC',
        version: '1.0.0'
      })
    })
  }))
  fixture.create(testDir)
  function readJson (file) {
    return fs.readFileAsync(path.join(testDir, file)).then(JSON.parse)
  }
  return BB.fromNode((cb) => {
    common.npm([
      'install',
      '--loglevel', 'warn'
    ], {cwd: testDir}, (err, code, out, stderr) => {
      t.comment(stderr)
      t.match(stderr, /warn.*conflict/gi, 'warns about a conflict')
      cb(err || (code && new Error('non-zero exit code')) || null, out)
    })
  })
    .then(() => BB.join(
      readJson('npm-shrinkwrap.json'),
      readJson('node_modules/modA/package.json'),
      readJson('node_modules/modB/package.json'),
      readJson('node_modules/modC/package.json'),
      (lockfile, A, B, C) => {
        t.deepEqual(lockfile, {
          name: 'foo',
          requires: true,
          lockfileVersion: 1,
          dependencies: {
            modA: {
              version: 'file:modA'
            },
            modB: {
              version: 'file:modB'
            },
            modC: {
              version: 'file:modC',
              dev: true
            }
          }
        }, 'resolved lockfile matches expectations')
        t.equal(A.name, 'modA', 'installed modA')
        t.equal(B.name, 'modB', 'installed modB')
        t.equal(C.name, 'modC', 'installed modC')
      }
    ))
})

test('cleanup', () => rimraf(testDir))