test: add lib/shrinkwrap.js tests · npm/cli@2848f59 (original) (raw)
``
1
`+
const t = require('tap')
`
``
2
`+
const requireInject = require('require-inject')
`
``
3
+
``
4
`+
const npm = {
`
``
5
`+
lockfileVersion: 2,
`
``
6
`+
globalDir: '',
`
``
7
`+
flatOptions: {
`
``
8
`+
depth: 0,
`
``
9
`+
global: false,
`
``
10
`+
},
`
``
11
`+
prefix: '',
`
``
12
`+
}
`
``
13
`+
const tree = {
`
``
14
`+
meta: {
`
``
15
`+
hiddenLockfile: null,
`
``
16
`+
loadedFromDisk: false,
`
``
17
`+
filename: '',
`
``
18
`+
originalLockfileVersion: 2,
`
``
19
`+
save () {},
`
``
20
`+
},
`
``
21
`+
}
`
``
22
`+
const mocks = {
`
``
23
`+
npmlog: { notice () {} },
`
``
24
`+
'@npmcli/arborist': class {
`
``
25
`+
loadVirtual () {
`
``
26
`+
return tree
`
``
27
`+
}
`
``
28
+
``
29
`+
loadActual () {
`
``
30
`+
return tree
`
``
31
`+
}
`
``
32
`+
},
`
``
33
`+
'../../lib/npm.js': npm,
`
``
34
`+
'../../lib/utils/usage.js': () => 'usage instructions',
`
``
35
`+
}
`
``
36
+
``
37
`+
t.afterEach(cb => {
`
``
38
`+
npm.prefix = ''
`
``
39
`+
npm.flatOptions.global = false
`
``
40
`+
npm.globalDir = ''
`
``
41
`+
cb()
`
``
42
`+
})
`
``
43
+
``
44
`+
t.test('no args', t => {
`
``
45
`+
t.plan(4)
`
``
46
+
``
47
`+
npm.prefix = '/project/a'
`
``
48
+
``
49
`+
class Arborist {
`
``
50
`+
constructor (args) {
`
``
51
`+
t.deepEqual(
`
``
52
`+
args,
`
``
53
`+
{ ...npm.flatOptions, path: npm.prefix },
`
``
54
`+
'should call arborist contructor with expected args'
`
``
55
`+
)
`
``
56
`+
}
`
``
57
+
``
58
`+
async loadVirtual () {
`
``
59
`+
t.ok('should load virtual tree')
`
``
60
`+
return {
`
``
61
`+
...tree,
`
``
62
`+
meta: {
`
``
63
`+
...tree.meta,
`
``
64
`+
save () {
`
``
65
`+
t.ok('should save the lockfile')
`
``
66
`+
},
`
``
67
`+
},
`
``
68
`+
}
`
``
69
`+
}
`
``
70
`+
}
`
``
71
+
``
72
`+
const npmlog = {
`
``
73
`+
notice (title, msg) {
`
``
74
`+
t.equal(
`
``
75
`+
msg,
`
``
76
`+
'created a lockfile as npm-shrinkwrap.json',
`
``
77
`+
'should log notice msg that file was successfully created'
`
``
78
`+
)
`
``
79
`+
},
`
``
80
`+
}
`
``
81
+
``
82
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
`
``
83
`+
...mocks,
`
``
84
`+
npmlog,
`
``
85
`+
'@npmcli/arborist': Arborist,
`
``
86
`+
})
`
``
87
+
``
88
`+
shrinkwrap([], err => {
`
``
89
`+
if (err)
`
``
90
`+
throw err
`
``
91
`+
})
`
``
92
`+
})
`
``
93
+
``
94
`+
t.test('no virtual tree', t => {
`
``
95
`+
t.plan(4)
`
``
96
+
``
97
`+
npm.prefix = '/project/a'
`
``
98
+
``
99
`+
class Arborist {
`
``
100
`+
constructor (args) {
`
``
101
`+
t.deepEqual(
`
``
102
`+
args,
`
``
103
`+
{ ...npm.flatOptions, path: npm.prefix },
`
``
104
`+
'should call arborist contructor with expected args'
`
``
105
`+
)
`
``
106
`+
}
`
``
107
+
``
108
`+
async loadVirtual () {
`
``
109
`+
throw new Error('ERR')
`
``
110
`+
}
`
``
111
+
``
112
`+
async loadActual () {
`
``
113
`+
t.ok('should load actual tree')
`
``
114
`+
return {
`
``
115
`+
...tree,
`
``
116
`+
meta: {
`
``
117
`+
...tree.meta,
`
``
118
`+
save () {
`
``
119
`+
t.ok('should save the lockfile')
`
``
120
`+
},
`
``
121
`+
},
`
``
122
`+
}
`
``
123
`+
}
`
``
124
`+
}
`
``
125
+
``
126
`+
const npmlog = {
`
``
127
`+
notice (title, msg) {
`
``
128
`+
t.equal(
`
``
129
`+
msg,
`
``
130
`+
'created a lockfile as npm-shrinkwrap.json',
`
``
131
`+
'should log notice msg that file was successfully created'
`
``
132
`+
)
`
``
133
`+
},
`
``
134
`+
}
`
``
135
+
``
136
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
`
``
137
`+
...mocks,
`
``
138
`+
npmlog,
`
``
139
`+
'@npmcli/arborist': Arborist,
`
``
140
`+
})
`
``
141
+
``
142
`+
shrinkwrap([], err => {
`
``
143
`+
if (err)
`
``
144
`+
throw err
`
``
145
`+
})
`
``
146
`+
})
`
``
147
+
``
148
`+
t.test('existing package-json file', t => {
`
``
149
`+
t.plan(5)
`
``
150
+
``
151
`+
npm.prefix = '/project/a'
`
``
152
+
``
153
`+
class Arborist {
`
``
154
`+
constructor (args) {
`
``
155
`+
t.deepEqual(
`
``
156
`+
args,
`
``
157
`+
{ ...npm.flatOptions, path: npm.prefix },
`
``
158
`+
'should call arborist contructor with expected args'
`
``
159
`+
)
`
``
160
`+
}
`
``
161
+
``
162
`+
async loadVirtual () {
`
``
163
`+
t.ok('should load virtual tree')
`
``
164
`+
return {
`
``
165
`+
...tree,
`
``
166
`+
meta: {
`
``
167
`+
hiddenLockfile: false,
`
``
168
`+
loadedFromDisk: true,
`
``
169
`+
filename: 'package-lock.json',
`
``
170
`+
save () {
`
``
171
`+
t.ok('should save the lockfile')
`
``
172
`+
},
`
``
173
`+
},
`
``
174
`+
}
`
``
175
`+
}
`
``
176
`+
}
`
``
177
+
``
178
`+
const npmlog = {
`
``
179
`+
notice (title, msg) {
`
``
180
`+
t.equal(
`
``
181
`+
msg,
`
``
182
`+
'package-lock.json has been renamed to npm-shrinkwrap.json',
`
``
183
`+
'should log notice msg that file was renamed'
`
``
184
`+
)
`
``
185
`+
},
`
``
186
`+
}
`
``
187
+
``
188
`+
const fs = {
`
``
189
`+
promises: {
`
``
190
`+
unlink (filename) {
`
``
191
`+
t.equal(filename, 'package-lock.json', 'should remove old lockfile')
`
``
192
`+
},
`
``
193
`+
},
`
``
194
`+
}
`
``
195
+
``
196
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
`
``
197
`+
...mocks,
`
``
198
`+
fs,
`
``
199
`+
npmlog,
`
``
200
`+
'@npmcli/arborist': Arborist,
`
``
201
`+
})
`
``
202
+
``
203
`+
shrinkwrap([], err => {
`
``
204
`+
if (err)
`
``
205
`+
throw err
`
``
206
`+
})
`
``
207
`+
})
`
``
208
+
``
209
`+
t.test('update shrinkwrap file version', t => {
`
``
210
`+
t.plan(4)
`
``
211
+
``
212
`+
npm.prefix = '/project/a'
`
``
213
+
``
214
`+
class Arborist {
`
``
215
`+
constructor (args) {
`
``
216
`+
t.deepEqual(
`
``
217
`+
args,
`
``
218
`+
{ ...npm.flatOptions, path: npm.prefix },
`
``
219
`+
'should call arborist contructor with expected args'
`
``
220
`+
)
`
``
221
`+
}
`
``
222
+
``
223
`+
async loadVirtual () {
`
``
224
`+
t.ok('should load virtual tree')
`
``
225
`+
return {
`
``
226
`+
...tree,
`
``
227
`+
meta: {
`
``
228
`+
hiddenLockfile: false,
`
``
229
`+
loadedFromDisk: true,
`
``
230
`+
filename: 'npm-shrinkwrap.json',
`
``
231
`+
originalLockfileVersion: 1,
`
``
232
`+
save () {
`
``
233
`+
t.ok('should save the lockfile')
`
``
234
`+
},
`
``
235
`+
},
`
``
236
`+
}
`
``
237
`+
}
`
``
238
`+
}
`
``
239
+
``
240
`+
const npmlog = {
`
``
241
`+
notice (title, msg) {
`
``
242
`+
t.equal(
`
``
243
`+
msg,
`
``
244
`+
'npm-shrinkwrap.json updated to version 2',
`
``
245
`+
'should log notice msg that file was updated'
`
``
246
`+
)
`
``
247
`+
},
`
``
248
`+
}
`
``
249
+
``
250
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
`
``
251
`+
...mocks,
`
``
252
`+
npmlog,
`
``
253
`+
'@npmcli/arborist': Arborist,
`
``
254
`+
})
`
``
255
+
``
256
`+
shrinkwrap([], err => {
`
``
257
`+
if (err)
`
``
258
`+
throw err
`
``
259
`+
})
`
``
260
`+
})
`
``
261
+
``
262
`+
t.test('update to date shrinkwrap file', t => {
`
``
263
`+
t.plan(4)
`
``
264
+
``
265
`+
npm.prefix = '/project/a'
`
``
266
+
``
267
`+
class Arborist {
`
``
268
`+
constructor (args) {
`
``
269
`+
t.deepEqual(
`
``
270
`+
args,
`
``
271
`+
{ ...npm.flatOptions, path: npm.prefix },
`
``
272
`+
'should call arborist contructor with expected args'
`
``
273
`+
)
`
``
274
`+
}
`
``
275
+
``
276
`+
async loadVirtual () {
`
``
277
`+
t.ok('should load virtual tree')
`
``
278
`+
return {
`
``
279
`+
...tree,
`
``
280
`+
meta: {
`
``
281
`+
hiddenLockfile: false,
`
``
282
`+
loadedFromDisk: true,
`
``
283
`+
filename: 'npm-shrinkwrap.json',
`
``
284
`+
originalLockfileVersion: 2,
`
``
285
`+
save () {
`
``
286
`+
t.ok('should save the lockfile')
`
``
287
`+
},
`
``
288
`+
},
`
``
289
`+
}
`
``
290
`+
}
`
``
291
`+
}
`
``
292
+
``
293
`+
const npmlog = {
`
``
294
`+
notice (title, msg) {
`
``
295
`+
t.equal(
`
``
296
`+
msg,
`
``
297
`+
'npm-shrinkwrap.json up to date',
`
``
298
`+
'should log notice msg shrinkwrap up to date'
`
``
299
`+
)
`
``
300
`+
},
`
``
301
`+
}
`
``
302
+
``
303
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
`
``
304
`+
...mocks,
`
``
305
`+
npmlog,
`
``
306
`+
'@npmcli/arborist': Arborist,
`
``
307
`+
})
`
``
308
+
``
309
`+
shrinkwrap([], err => {
`
``
310
`+
if (err)
`
``
311
`+
throw err
`
``
312
`+
})
`
``
313
`+
})
`
``
314
+
``
315
`+
t.test('shrinkwrap --global', t => {
`
``
316
`+
const shrinkwrap = requireInject('../../lib/shrinkwrap.js', mocks)
`
``
317
+
``
318
`+
npm.flatOptions.global = true
`
``
319
+
``
320
`+
shrinkwrap([], err => {
`
``
321
`+
t.match(
`
``
322
`+
err,
`
``
323
`+
/does not work for global packages/,
`
``
324
`+
'should throw no global support msg'
`
``
325
`+
)
`
``
326
`+
t.equal(err.code, 'ESHRINKWRAPGLOBAL', 'should throw expected error code')
`
``
327
`+
t.end()
`
``
328
`+
})
`
``
329
`+
})
`