Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuy Adorno <ruyadorno@hotmail.com>2020-12-07 19:35:17 +0300
committerisaacs <i@izs.me>2020-12-09 02:28:11 +0300
commit2848f594034b87939bfc5546e3e603f123d98a01 (patch)
tree1748ce06e171d1b86dfce28e46d6bc6b0a4dce87 /test/lib/shrinkwrap.js
parentde45a46709e165bcfca80955fa8ea50c30c96c2d (diff)
test: add lib/shrinkwrap.js tests
Fixes: https://github.com/npm/statusboard/issues/173 PR-URL: https://github.com/npm/cli/pull/2293 Credit: @ruyadorno Close: #2293 Reviewed-by: @nlf
Diffstat (limited to 'test/lib/shrinkwrap.js')
-rw-r--r--test/lib/shrinkwrap.js329
1 files changed, 329 insertions, 0 deletions
diff --git a/test/lib/shrinkwrap.js b/test/lib/shrinkwrap.js
new file mode 100644
index 000000000..65b16b147
--- /dev/null
+++ b/test/lib/shrinkwrap.js
@@ -0,0 +1,329 @@
+const t = require('tap')
+const requireInject = require('require-inject')
+
+const npm = {
+ lockfileVersion: 2,
+ globalDir: '',
+ flatOptions: {
+ depth: 0,
+ global: false,
+ },
+ prefix: '',
+}
+const tree = {
+ meta: {
+ hiddenLockfile: null,
+ loadedFromDisk: false,
+ filename: '',
+ originalLockfileVersion: 2,
+ save () {},
+ },
+}
+const mocks = {
+ npmlog: { notice () {} },
+ '@npmcli/arborist': class {
+ loadVirtual () {
+ return tree
+ }
+
+ loadActual () {
+ return tree
+ }
+ },
+ '../../lib/npm.js': npm,
+ '../../lib/utils/usage.js': () => 'usage instructions',
+}
+
+t.afterEach(cb => {
+ npm.prefix = ''
+ npm.flatOptions.global = false
+ npm.globalDir = ''
+ cb()
+})
+
+t.test('no args', t => {
+ t.plan(4)
+
+ npm.prefix = '/project/a'
+
+ class Arborist {
+ constructor (args) {
+ t.deepEqual(
+ args,
+ { ...npm.flatOptions, path: npm.prefix },
+ 'should call arborist contructor with expected args'
+ )
+ }
+
+ async loadVirtual () {
+ t.ok('should load virtual tree')
+ return {
+ ...tree,
+ meta: {
+ ...tree.meta,
+ save () {
+ t.ok('should save the lockfile')
+ },
+ },
+ }
+ }
+ }
+
+ const npmlog = {
+ notice (title, msg) {
+ t.equal(
+ msg,
+ 'created a lockfile as npm-shrinkwrap.json',
+ 'should log notice msg that file was successfully created'
+ )
+ },
+ }
+
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
+ ...mocks,
+ npmlog,
+ '@npmcli/arborist': Arborist,
+ })
+
+ shrinkwrap([], err => {
+ if (err)
+ throw err
+ })
+})
+
+t.test('no virtual tree', t => {
+ t.plan(4)
+
+ npm.prefix = '/project/a'
+
+ class Arborist {
+ constructor (args) {
+ t.deepEqual(
+ args,
+ { ...npm.flatOptions, path: npm.prefix },
+ 'should call arborist contructor with expected args'
+ )
+ }
+
+ async loadVirtual () {
+ throw new Error('ERR')
+ }
+
+ async loadActual () {
+ t.ok('should load actual tree')
+ return {
+ ...tree,
+ meta: {
+ ...tree.meta,
+ save () {
+ t.ok('should save the lockfile')
+ },
+ },
+ }
+ }
+ }
+
+ const npmlog = {
+ notice (title, msg) {
+ t.equal(
+ msg,
+ 'created a lockfile as npm-shrinkwrap.json',
+ 'should log notice msg that file was successfully created'
+ )
+ },
+ }
+
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
+ ...mocks,
+ npmlog,
+ '@npmcli/arborist': Arborist,
+ })
+
+ shrinkwrap([], err => {
+ if (err)
+ throw err
+ })
+})
+
+t.test('existing package-json file', t => {
+ t.plan(5)
+
+ npm.prefix = '/project/a'
+
+ class Arborist {
+ constructor (args) {
+ t.deepEqual(
+ args,
+ { ...npm.flatOptions, path: npm.prefix },
+ 'should call arborist contructor with expected args'
+ )
+ }
+
+ async loadVirtual () {
+ t.ok('should load virtual tree')
+ return {
+ ...tree,
+ meta: {
+ hiddenLockfile: false,
+ loadedFromDisk: true,
+ filename: 'package-lock.json',
+ save () {
+ t.ok('should save the lockfile')
+ },
+ },
+ }
+ }
+ }
+
+ const npmlog = {
+ notice (title, msg) {
+ t.equal(
+ msg,
+ 'package-lock.json has been renamed to npm-shrinkwrap.json',
+ 'should log notice msg that file was renamed'
+ )
+ },
+ }
+
+ const fs = {
+ promises: {
+ unlink (filename) {
+ t.equal(filename, 'package-lock.json', 'should remove old lockfile')
+ },
+ },
+ }
+
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
+ ...mocks,
+ fs,
+ npmlog,
+ '@npmcli/arborist': Arborist,
+ })
+
+ shrinkwrap([], err => {
+ if (err)
+ throw err
+ })
+})
+
+t.test('update shrinkwrap file version', t => {
+ t.plan(4)
+
+ npm.prefix = '/project/a'
+
+ class Arborist {
+ constructor (args) {
+ t.deepEqual(
+ args,
+ { ...npm.flatOptions, path: npm.prefix },
+ 'should call arborist contructor with expected args'
+ )
+ }
+
+ async loadVirtual () {
+ t.ok('should load virtual tree')
+ return {
+ ...tree,
+ meta: {
+ hiddenLockfile: false,
+ loadedFromDisk: true,
+ filename: 'npm-shrinkwrap.json',
+ originalLockfileVersion: 1,
+ save () {
+ t.ok('should save the lockfile')
+ },
+ },
+ }
+ }
+ }
+
+ const npmlog = {
+ notice (title, msg) {
+ t.equal(
+ msg,
+ 'npm-shrinkwrap.json updated to version 2',
+ 'should log notice msg that file was updated'
+ )
+ },
+ }
+
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
+ ...mocks,
+ npmlog,
+ '@npmcli/arborist': Arborist,
+ })
+
+ shrinkwrap([], err => {
+ if (err)
+ throw err
+ })
+})
+
+t.test('update to date shrinkwrap file', t => {
+ t.plan(4)
+
+ npm.prefix = '/project/a'
+
+ class Arborist {
+ constructor (args) {
+ t.deepEqual(
+ args,
+ { ...npm.flatOptions, path: npm.prefix },
+ 'should call arborist contructor with expected args'
+ )
+ }
+
+ async loadVirtual () {
+ t.ok('should load virtual tree')
+ return {
+ ...tree,
+ meta: {
+ hiddenLockfile: false,
+ loadedFromDisk: true,
+ filename: 'npm-shrinkwrap.json',
+ originalLockfileVersion: 2,
+ save () {
+ t.ok('should save the lockfile')
+ },
+ },
+ }
+ }
+ }
+
+ const npmlog = {
+ notice (title, msg) {
+ t.equal(
+ msg,
+ 'npm-shrinkwrap.json up to date',
+ 'should log notice msg shrinkwrap up to date'
+ )
+ },
+ }
+
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', {
+ ...mocks,
+ npmlog,
+ '@npmcli/arborist': Arborist,
+ })
+
+ shrinkwrap([], err => {
+ if (err)
+ throw err
+ })
+})
+
+t.test('shrinkwrap --global', t => {
+ const shrinkwrap = requireInject('../../lib/shrinkwrap.js', mocks)
+
+ npm.flatOptions.global = true
+
+ shrinkwrap([], err => {
+ t.match(
+ err,
+ /does not work for global packages/,
+ 'should throw no global support msg'
+ )
+ t.equal(err.code, 'ESHRINKWRAPGLOBAL', 'should throw expected error code')
+ t.end()
+ })
+})