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
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/coverage-map.js26
-rw-r--r--test/fixtures/libnpmsearch-stream-result.js27
-rw-r--r--test/fixtures/mock-registry.js13
-rw-r--r--test/lib/commands/search.js302
-rw-r--r--test/lib/commands/view.js457
-rw-r--r--test/lib/utils/config/definitions.js11
-rw-r--r--test/lib/utils/file-exists.js30
7 files changed, 352 insertions, 514 deletions
diff --git a/test/coverage-map.js b/test/coverage-map.js
deleted file mode 100644
index 9a289b648..000000000
--- a/test/coverage-map.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const coverageMap = (filename) => {
- const { basename } = require('path')
- const testbase = basename(filename)
- if (filename === 'test/index.js') {
- return ['index.js']
- }
- if (testbase === 'load-all-commands.js') {
- const { cmdList } = require('../lib/utils/cmd-list.js')
- return cmdList.map(cmd => `lib/${cmd}.js`)
- .concat('lib/base-command.js')
- }
- if (/^test\/lib\/commands/.test(filename) || filename === 'test/lib/npm.js') {
- return [
- filename.replace(/^test\//, ''),
- 'lib/npm.js',
- 'lib/base-command.js',
- 'lib/exec/get-workspace-location-msg.js',
- ]
- }
- if (/^test\/(lib|bin)\//.test(filename)) {
- return filename.replace(/^test\//, '')
- }
- return []
-}
-
-module.exports = coverageMap
diff --git a/test/fixtures/libnpmsearch-stream-result.js b/test/fixtures/libnpmsearch-stream-result.js
index 4d3aca396..b2ec20f59 100644
--- a/test/fixtures/libnpmsearch-stream-result.js
+++ b/test/fixtures/libnpmsearch-stream-result.js
@@ -5,7 +5,7 @@ module.exports = [
version: '3.0.1',
description: 'Collection of programmatic APIs for the npm CLI',
keywords: ['npm', 'api', 'package manager', 'lib'],
- date: new Date('2019-07-16T17:50:00.572Z'),
+ date: '2019-07-16T17:50:00.572Z',
links: {
npm: 'https://www.npmjs.com/package/libnpm',
homepage: 'https://github.com/npm/libnpm#readme',
@@ -26,7 +26,8 @@ module.exports = [
scope: 'unscoped',
version: '4.0.1',
description: 'programmatic library for `npm access` commands',
- date: new Date('2020-11-03T19:19:00.526Z'),
+ keywords: 'libnpmaccess',
+ date: '2020-11-03T19:19:00.526Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmaccess',
homepage: 'https://npmjs.com/package/libnpmaccess',
@@ -47,7 +48,7 @@ module.exports = [
scope: 'evocateur',
version: '3.1.2',
description: 'programmatic library for `npm access` commands',
- date: new Date('2019-07-16T19:43:33.959Z'),
+ date: '2019-07-16T19:43:33.959Z',
links: {
npm: 'https://www.npmjs.com/package/%40evocateur%2Flibnpmaccess',
homepage: 'https://npmjs.com/package/@evocateur/libnpmaccess',
@@ -63,7 +64,7 @@ module.exports = [
scope: 'evocateur',
version: '1.2.2',
description: 'Programmatic API for the bits behind npm publish and unpublish',
- date: new Date('2019-07-16T19:40:40.850Z'),
+ date: '2019-07-16T19:40:40.850Z',
links: {
npm: 'https://www.npmjs.com/package/%40evocateur%2Flibnpmpublish',
homepage: 'https://npmjs.com/package/@evocateur/libnpmpublish',
@@ -80,7 +81,7 @@ module.exports = [
version: '2.0.1',
description: 'Programmatic api for `npm org` commands',
keywords: ['libnpm', 'npm', 'package manager', 'api', 'orgs', 'teams'],
- date: new Date('2020-11-03T19:21:57.757Z'),
+ date: '2020-11-03T19:21:57.757Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmorg',
homepage: 'https://npmjs.com/package/libnpmorg',
@@ -102,7 +103,7 @@ module.exports = [
version: '3.1.0',
description: 'Programmatic API for searching in npm and compatible registries.',
keywords: ['npm', 'search', 'api', 'libnpm'],
- date: new Date('2020-12-08T23:54:18.374Z'),
+ date: '2020-12-08T23:54:18.374Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmsearch',
homepage: 'https://npmjs.com/package/libnpmsearch',
@@ -123,7 +124,7 @@ module.exports = [
scope: 'unscoped',
version: '2.0.2',
description: 'npm Team management APIs',
- date: new Date('2020-11-03T19:24:42.380Z'),
+ date: '2020-11-03T19:24:42.380Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmteam',
homepage: 'https://npmjs.com/package/libnpmteam',
@@ -145,7 +146,7 @@ module.exports = [
version: '6.0.1',
description: 'programmatic API for managing npm registry hooks',
keywords: ['npm', 'hooks', 'registry', 'npm api'],
- date: new Date('2020-11-03T19:20:45.818Z'),
+ date: '2020-11-03T19:20:45.818Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmhook',
homepage: 'https://github.com/npm/libnpmhook#readme',
@@ -166,7 +167,7 @@ module.exports = [
scope: 'unscoped',
version: '4.0.0',
description: 'Programmatic API for the bits behind npm publish and unpublish',
- date: new Date('2020-11-03T19:13:43.780Z'),
+ date: '2020-11-03T19:13:43.780Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmpublish',
homepage: 'https://npmjs.com/package/libnpmpublish',
@@ -193,7 +194,7 @@ module.exports = [
'git', 'fund',
'gitfund',
],
- date: new Date('2020-12-08T23:22:00.213Z'),
+ date: '2020-12-08T23:22:00.213Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmfund',
homepage: 'https://github.com/npm/libnpmfund#readme',
@@ -222,7 +223,7 @@ module.exports = [
'workspaces',
'map-workspaces',
],
- date: new Date('2020-09-30T15:16:29.017Z'),
+ date: '2020-09-30T15:16:29.017Z',
links: {
npm: 'https://www.npmjs.com/package/%40npmcli%2Fmap-workspaces',
homepage: 'https://github.com/npm/map-workspaces#readme',
@@ -243,7 +244,7 @@ module.exports = [
scope: 'unscoped',
version: '1.0.7',
description: "library to do the things that 'npm version' does",
- date: new Date('2020-11-04T00:21:41.069Z'),
+ date: '2020-11-04T00:21:41.069Z',
links: {
npm: 'https://www.npmjs.com/package/libnpmversion',
homepage: 'https://github.com/npm/libnpmversion#readme',
@@ -269,7 +270,7 @@ module.exports = [
scope: 'types',
version: '2.0.1',
description: 'TypeScript definitions for libnpmsearch',
- date: new Date('2019-09-26T22:24:28.713Z'),
+ date: '2019-09-26T22:24:28.713Z',
links: { npm: 'https://www.npmjs.com/package/%40types%2Flibnpmsearch' },
publisher: { username: 'types', email: 'ts-npm-types@microsoft.com' },
maintainers: [{ username: 'types', email: 'ts-npm-types@microsoft.com' }],
diff --git a/test/fixtures/mock-registry.js b/test/fixtures/mock-registry.js
index 5890fa7ee..01d43ba3d 100644
--- a/test/fixtures/mock-registry.js
+++ b/test/fixtures/mock-registry.js
@@ -46,6 +46,19 @@ class MockRegistry {
this.#nock = nock
}
+ search ({ responseCode = 200, results = [], error }) {
+ // the flags, score, and searchScore parts of the response are never used
+ // by npm, only package is used
+ const response = results.map(p => ({ package: p }))
+ this.nock = this.nock.get('/-/v1/search').query(true)
+ if (error) {
+ this.nock = this.nock.replyWithError(error)
+ } else {
+ this.nock = this.nock.reply(responseCode, { objects: response })
+ }
+ return this.nock
+ }
+
whoami ({ username, body, responseCode = 200, times = 1 }) {
if (username) {
this.nock = this.nock.get('/-/whoami').times(times).reply(responseCode, { username })
diff --git a/test/lib/commands/search.js b/test/lib/commands/search.js
index d2462b1ae..f18fcc475 100644
--- a/test/lib/commands/search.js
+++ b/test/lib/commands/search.js
@@ -1,169 +1,92 @@
const t = require('tap')
-const Minipass = require('minipass')
-const { fake: mockNpm } = require('../../fixtures/mock-npm')
+const { load: loadMockNpm } = require('../../fixtures/mock-npm.js')
+const MockRegistry = require('../../fixtures/mock-registry.js')
const libnpmsearchResultFixture =
require('../../fixtures/libnpmsearch-stream-result.js')
-let result = ''
-const flatOptions = {
- search: {
- exclude: null,
- limit: 20,
- opts: '',
- },
-}
-const config = {
- json: false,
- parseable: false,
-}
-const npm = mockNpm({
- config,
- flatOptions: { ...flatOptions },
- output: (...msg) => {
- result += msg.join('\n')
- },
-})
-const npmlog = {
- silly () {},
- clearProgress () {},
-}
-const libnpmsearch = {
- stream () {},
-}
-const mocks = {
- npmlog,
- libnpmsearch,
-}
-
-t.afterEach(() => {
- result = ''
- config.json = false
- config.parseable = false
- npm.flatOptions = { ...flatOptions }
-})
-
-const Search = t.mock('../../../lib/commands/search.js', mocks)
-const search = new Search(npm)
-
t.test('no args', async t => {
+ const { npm } = await loadMockNpm(t)
await t.rejects(
- search.exec([]),
+ npm.exec('search', []),
/search must be called with arguments/,
'should throw usage instructions'
)
})
-t.test('search <name>', async t => {
- const src = new Minipass()
- src.objectMode = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+t.test('search <name> text', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t)
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- for (const i of libnpmsearchResultFixture) {
- src.write(i)
- }
-
- src.end()
-
- await search.exec(['libnpm'])
- t.matchSnapshot(result, 'should have expected search results')
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'should have expected search results')
})
t.test('search <name> --json', async t => {
- const src = new Minipass()
- src.objectMode = true
-
- npm.flatOptions.json = true
- config.json = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { json: true } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- for (const i of libnpmsearchResultFixture) {
- src.write(i)
- }
+ registry.search({ results: libnpmsearchResultFixture })
- src.end()
- await search.exec(['libnpm'])
-
- const parsedResult = JSON.parse(result)
- parsedResult.forEach((entry) => {
- entry.date = new Date(entry.date)
- })
+ await npm.exec('search', ['libnpm'])
t.same(
- parsedResult,
+ JSON.parse(joinedOutput()),
libnpmsearchResultFixture,
'should have expected search results as json'
)
+})
- config.json = false
+t.test('search <name> --parseable', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { parseable: true } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
+
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'should have expected search results as parseable')
})
-t.test('search <invalid-module> --json', async t => {
- const src = new Minipass()
- src.objectMode = true
-
- npm.flatOptions.json = true
- config.json = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+t.test('search <name> --color', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { color: 'always' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- src.end()
- await search.exec(['foo'])
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'should have expected search results with color')
+})
- t.equal(result, '\n[]\n', 'should have expected empty square brackets')
+t.test('search /<name>/--color', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { color: 'always' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
- config.json = false
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['/libnpm/'])
+ t.matchSnapshot(joinedOutput(), 'should have expected search results with color')
})
-t.test('search <name> --searchexclude --searchopts', async t => {
- npm.flatOptions.search = {
- ...flatOptions.search,
- exclude: '',
- }
-
- const src = new Minipass()
- src.objectMode = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+t.test('search <name>', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t)
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- src.write({
+ registry.search({ results: [{
name: 'foo',
scope: 'unscoped',
version: '1.0.0',
@@ -175,8 +98,7 @@ t.test('search <name> --searchexclude --searchopts', async t => {
maintainers: [
{ username: 'foo', email: 'foo@npmjs.com' },
],
- })
- src.write({
+ }, {
name: 'libnpmversion',
scope: 'unscoped',
version: '1.0.0',
@@ -188,58 +110,100 @@ t.test('search <name> --searchexclude --searchopts', async t => {
maintainers: [
{ username: 'foo', email: 'foo@npmjs.com' },
],
- })
+ }] })
- src.end()
- await search.exec(['foo'])
+ await npm.exec('search', ['foo'])
- t.matchSnapshot(result, 'should have filtered expected search results')
+ t.matchSnapshot(joinedOutput(), 'should have filtered expected search results')
})
t.test('empty search results', async t => {
- const src = new Minipass()
- src.objectMode = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+ const { npm, joinedOutput } = await loadMockNpm(t)
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- src.end()
- await search.exec(['foo'])
+ registry.search({ results: [] })
+ await npm.exec('search', ['foo'])
- t.matchSnapshot(result, 'should have expected search results')
+ t.matchSnapshot(joinedOutput(), 'should have expected search results')
})
-t.test('search api response error', async t => {
- const src = new Minipass()
- src.objectMode = true
- const libnpmsearch = {
- stream () {
- return src
- },
- }
-
- const Search = t.mock('../../../lib/commands/search.js', {
- ...mocks,
- libnpmsearch,
+t.test('empty search results --json', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { json: true } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
- const search = new Search(npm)
- setImmediate(() => {
- src.emit('error', new Error('ERR'))
- src.end()
+ registry.search({ results: [] })
+
+ await npm.exec('search', ['foo'])
+ t.equal(joinedOutput(), '\n[]\n', 'should have expected empty square brackets')
+})
+
+t.test('search api response error', async t => {
+ const { npm } = await loadMockNpm(t)
+
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
})
+ registry.search({ error: 'ERR' })
+
await t.rejects(
- search.exec(['foo']),
+ npm.exec('search', ['foo']),
/ERR/,
'should throw response error'
)
})
+
+t.test('search exclude string', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { searchexclude: 'libnpmversion' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
+
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'results should not have libnpmversion')
+})
+
+t.test('search exclude username with upper case letters', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { searchexclude: 'NLF' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
+
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'results should not have nlf')
+})
+
+t.test('search exclude regex', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { searchexclude: '/version/' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
+
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'results should not have libnpmversion')
+})
+
+t.test('search exclude forward slash', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, { config: { searchexclude: '/version' } })
+ const registry = new MockRegistry({
+ tap: t,
+ registry: npm.config.get('registry'),
+ })
+
+ registry.search({ results: libnpmsearchResultFixture })
+ await npm.exec('search', ['libnpm'])
+ t.matchSnapshot(joinedOutput(), 'results should not have libnpmversion')
+})
diff --git a/test/lib/commands/view.js b/test/lib/commands/view.js
index 82be1201e..da823db5d 100644
--- a/test/lib/commands/view.js
+++ b/test/lib/commands/view.js
@@ -1,4 +1,5 @@
const t = require('tap')
+const { load: _loadMockNpm } = require('../../fixtures/mock-npm.js')
t.cleanSnapshot = str => str
.replace(/(published ).*?( ago)/g, '$1{TIME}$2')
@@ -6,18 +7,6 @@ t.cleanSnapshot = str => str
// run the same as tap does when running directly with node
process.stdout.columns = undefined
-const { fake: mockNpm } = require('../../fixtures/mock-npm')
-
-let logs
-const cleanLogs = () => {
- logs = ''
- const fn = (...args) => {
- logs += '\n'
- args.map(el => logs += el)
- }
- console.log = fn
-}
-
// 3 days. its never yesterday and never a week ago
const yesterday = new Date(Date.now() - 1000 * 60 * 60 * 24 * 3)
@@ -71,7 +60,7 @@ const packument = (nv, opts) => {
tarball: 'http://hm.blue.com/1.0.1.tgz',
integrity: '---',
fileCount: 1,
- unpackedSize: 1,
+ unpackedSize: 1000,
},
},
},
@@ -94,7 +83,7 @@ const packument = (nv, opts) => {
tarball: 'http://hm.cyan.com/1.0.0.tgz',
integrity: '---',
fileCount: 1,
- unpackedSize: 1,
+ unpackedSize: 1000000,
},
},
'1.0.1': {},
@@ -180,7 +169,7 @@ const packument = (nv, opts) => {
tarball: 'http://hm.green.com/1.0.0.tgz',
integrity: '---',
fileCount: 1,
- unpackedSize: 1,
+ unpackedSize: 1000000000,
},
},
'1.0.1': {},
@@ -271,289 +260,212 @@ const packument = (nv, opts) => {
return mocks[nv.name]
}
-t.beforeEach(cleanLogs)
-
-t.test('should log package info', async t => {
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const npm = mockNpm({
- config: { unicode: false },
- })
- const view = new View(npm)
-
- const ViewJson = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
+const loadMockNpm = async function (t, opts = {}) {
+ const consoleLogs = []
+ const mockNpm = await _loadMockNpm(t, {
+ mocks: {
+ pacote: {
+ packument,
+ },
},
- })
- const jsonNpm = mockNpm({
- config: {
- json: true,
- tag: 'latest',
+ globals: {
+ 'console.log': (...args) => {
+ consoleLogs.push(args)
+ },
},
+ ...opts,
})
- const viewJson = new ViewJson(jsonNpm)
+ return { ...mockNpm, consoleLogs }
+}
- const ViewUnicode = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const unicodeNpm = mockNpm({
- config: { unicode: true },
- })
- const viewUnicode = new ViewUnicode(unicodeNpm)
+t.test('package from git', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['https://github.com/npm/green'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package from git', async t => {
- await view.exec(['https://github.com/npm/green'])
- t.matchSnapshot(logs)
- })
+t.test('deprecated package with license, bugs, repository and other fields', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['green@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with license, bugs, repository and other fields', async t => {
- await view.exec(['green@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('deprecated package with unicode', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: true } })
+ await npm.exec('view', ['green@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with more than 25 deps', async t => {
- await view.exec(['black@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with more than 25 deps', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['black@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with maintainers info as object', async t => {
- await view.exec(['pink@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with maintainers info as object', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['pink@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with homepage', async t => {
- await view.exec(['orange@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with homepage', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['orange@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with no versions', async t => {
- await view.exec(['brown'])
- t.equal(logs, '', 'no info to display')
- })
+t.test('package with no versions', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['brown'])
+ t.equal(consoleLogs.join('\n'), '', 'no info to display')
+})
- t.test('package with no repo or homepage', async t => {
- await view.exec(['blue@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with no repo or homepage', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['blue@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with semver range', async t => {
- await view.exec(['blue@^1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with semver range', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['blue@^1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with no modified time', async t => {
- await viewUnicode.exec(['cyan@1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with no modified time', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { unicode: false } })
+ await npm.exec('view', ['cyan@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with --json and semver range', async t => {
- await viewJson.exec(['cyan@^1.0.0'])
- t.matchSnapshot(logs)
- })
+t.test('package with --json and semver range', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { json: true } })
+ await npm.exec('view', ['cyan@^1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+})
- t.test('package with --json and no versions', async t => {
- await viewJson.exec(['brown'])
- t.equal(logs, '', 'no info to display')
- })
+t.test('package with --json and no versions', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t, { config: { json: true } })
+ await npm.exec('view', ['brown'])
+ t.equal(consoleLogs.join('\n'), '', 'no info to display')
})
-t.test('should log info of package in current working dir', async t => {
- const testDir = t.testdir({
+t.test('package in cwd', async t => {
+ const prefixDir = {
'package.json': JSON.stringify({
name: 'blue',
version: '1.0.0',
}, null, 2),
- })
-
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const npm = mockNpm({
- prefix: testDir,
- config: {
- tag: '1.0.0',
- },
- })
- const view = new View(npm)
+ }
t.test('specific version', async t => {
- await view.exec(['.@1.0.0'])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, { prefixDir })
+ await npm.exec('view', ['.@1.0.0'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('non-specific version', async t => {
- await view.exec(['.'])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, { prefixDir })
+ await npm.exec('view', ['.'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('directory', async t => {
- await view.exec(['./blue'])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, { prefixDir })
+ await npm.exec('view', ['./blue'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
})
-t.test('should log info by field name', async t => {
- const ViewJson = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const jsonNpm = mockNpm({
- config: {
- tag: 'latest',
- json: true,
- },
- })
-
- const viewJson = new ViewJson(jsonNpm)
-
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
+t.test('specific field names', async t => {
+ const { npm, consoleLogs } = await loadMockNpm(t)
+ t.afterEach(() => {
+ consoleLogs.length = 0
})
- const npm = mockNpm()
- const view = new View(npm)
-
t.test('readme', async t => {
- await view.exec(['yellow@1.0.0', 'readme'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['yellow@1.0.0', 'readme'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('several fields', async t => {
- await viewJson.exec(['yellow@1.0.0', 'name', 'version', 'foo[bar]'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['yellow@1.0.0', 'name', 'version', 'foo[bar]'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('several fields with several versions', async t => {
- await view.exec(['yellow@1.x.x', 'author'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['yellow@1.x.x', 'author'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('nested field with brackets', async t => {
- await viewJson.exec(['orange@1.0.0', 'dist[shasum]'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['orange@1.0.0', 'dist[shasum]'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('maintainers with email', async t => {
- await viewJson.exec(['yellow@1.0.0', 'maintainers', 'name'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['yellow@1.0.0', 'maintainers', 'name'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('maintainers with url', async t => {
- await viewJson.exec(['pink@1.0.0', 'maintainers'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['pink@1.0.0', 'maintainers'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('unknown nested field ', async t => {
- await view.exec(['yellow@1.0.0', 'dist.foobar'])
- t.equal(logs, '', 'no info to display')
+ await npm.exec('view', ['yellow@1.0.0', 'dist.foobar'])
+ t.equal(consoleLogs.join('\n'), '', 'no info to display')
})
t.test('array field - 1 element', async t => {
- await view.exec(['purple@1.0.0', 'maintainers.name'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['purple@1.0.0', 'maintainers.name'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('array field - 2 elements', async t => {
- await view.exec(['yellow@1.x.x', 'maintainers.name'])
- t.matchSnapshot(logs)
+ await npm.exec('view', ['yellow@1.x.x', 'maintainers.name'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
})
t.test('throw error if global mode', async t => {
- const View = t.mock('../../../lib/commands/view.js')
- const npm = mockNpm({
- config: {
- global: true,
- tag: 'latest',
- },
- })
- const view = new View(npm)
+ const { npm } = await loadMockNpm(t, { config: { global: true } })
await t.rejects(
- view.exec([]),
+ npm.exec('view', []),
/Cannot use view command in global mode./
)
})
t.test('throw ENOENT error if package.json missing', async t => {
- const testDir = t.testdir({})
-
- const View = t.mock('../../../lib/commands/view.js')
- const npm = mockNpm({
- prefix: testDir,
- })
- const view = new View(npm)
+ const { npm } = await loadMockNpm(t)
await t.rejects(
- view.exec([]),
+ npm.exec('view', []),
{ code: 'ENOENT' }
)
})
-t.test('throw EJSONPARSE error if package.json not json', async t => {
- const testDir = t.testdir({
- 'package.json': 'not json, nope, not even a little bit!',
- })
-
- const View = t.mock('../../../lib/commands/view.js')
- const npm = mockNpm({
- prefix: testDir,
- })
- const view = new View(npm)
- await t.rejects(
- view.exec([]),
- { code: 'EJSONPARSE' }
- )
-})
-
t.test('throw error if package.json has no name', async t => {
- const testDir = t.testdir({
- 'package.json': '{}',
- })
-
- const View = t.mock('../../../lib/commands/view.js')
- const npm = mockNpm({
- prefix: testDir,
+ const { npm } = await loadMockNpm(t, {
+ prefixDir: {
+ 'package.json': '{}',
+ },
})
- const view = new View(npm)
await t.rejects(
- view.exec([]),
+ npm.exec('view', []),
/Invalid package.json, no "name" field/
)
})
t.test('throws when unpublished', async t => {
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const npm = mockNpm({
- config: {
- tag: '1.0.1',
- },
- })
- const view = new View(npm)
+ const { npm } = await loadMockNpm(t)
await t.rejects(
- view.exec(['red']),
+ npm.exec('view', ['red']),
{ code: 'E404', pkgid: 'red@1.0.1', message: 'Unpublished on 2012-12-20T00:00:00.000Z' }
)
})
t.test('workspaces', async t => {
- t.beforeEach(() => {
- warnMsg = undefined
- config.json = false
- })
- const testDir = t.testdir({
+ const prefixDir = {
'package.json': JSON.stringify({
name: 'workspaces-test-package',
version: '1.2.3',
@@ -571,106 +483,103 @@ t.test('workspaces', async t => {
version: '1.2.3',
}),
},
- })
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- 'proc-log': {
- warn: (msg) => {
- warnMsg = msg
- },
- silly: () => {},
- },
- })
- const config = {
- unicode: false,
- tag: 'latest',
}
- let warnMsg
- const npm = mockNpm({
- config,
- localPrefix: testDir,
- })
- const view = new View(npm)
t.test('all workspaces', async t => {
- await view.execWorkspaces([], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true },
+ })
+ await npm.exec('view', [])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('one specific workspace', async t => {
- await view.execWorkspaces([], ['green'])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspace: ['green'] },
+ })
+ await npm.exec('view', [])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('all workspaces --json', async t => {
- config.json = true
- await view.execWorkspaces([], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true, json: true },
+ })
+ await npm.exec('view', [])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('all workspaces single field', async t => {
- await view.execWorkspaces(['.', 'name'], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true },
+ })
+ await npm.exec('view', ['.', 'name'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('all workspaces nonexistent field', async t => {
- await view.execWorkspaces(['.', 'foo'], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true },
+ })
+ await npm.exec('view', ['.', 'foo'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('all workspaces nonexistent field --json', async t => {
- config.json = true
- await view.execWorkspaces(['.', 'foo'], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true, json: true },
+ })
+ await npm.exec('view', ['.', 'foo'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('all workspaces single field --json', async t => {
- config.json = true
- await view.execWorkspaces(['.', 'name'], [])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true, json: true },
+ })
+ await npm.exec('view', ['.', 'name'])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('single workspace --json', async t => {
- config.json = true
- await view.execWorkspaces([], ['green'])
- t.matchSnapshot(logs)
+ const { npm, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspace: ['green'], json: true },
+ })
+ await npm.exec('view', [])
+ t.matchSnapshot(consoleLogs.join('\n'))
})
t.test('remote package name', async t => {
- await view.execWorkspaces(['pink'], [])
- t.matchSnapshot(warnMsg)
- t.matchSnapshot(logs)
+ const { npm, logs, consoleLogs } = await loadMockNpm(t, {
+ prefixDir,
+ config: { unicode: false, workspaces: true },
+ })
+ await npm.exec('view', ['pink'])
+ t.matchSnapshot(consoleLogs.join('\n'))
+ t.matchSnapshot(logs.warn, 'should have warning of ignoring workspaces')
})
})
t.test('completion', async t => {
- const View = t.mock('../../../lib/commands/view.js', {
- pacote: {
- packument,
- },
- })
- const npm = mockNpm({
- config: {
- tag: '1.0.1',
- },
- })
- const view = new View(npm)
+ const { npm } = await loadMockNpm(t)
+ const view = await npm.cmd('view')
const res = await view.completion({
conf: { argv: { remain: ['npm', 'view', 'green@1.0.0'] } },
})
t.ok(res, 'returns back fields')
})
-t.test('no registry completion', async t => {
- const View = t.mock('../../../lib/commands/view.js')
- const npm = mockNpm({
- config: {
- tag: '1.0.1',
- },
- })
- const view = new View(npm)
+t.test('no package completion', async t => {
+ const { npm } = await loadMockNpm(t)
+ const view = await npm.cmd('view')
const res = await view.completion({ conf: { argv: { remain: ['npm', 'view'] } } })
t.notOk(res, 'there is no package completion')
t.end()
diff --git a/test/lib/utils/config/definitions.js b/test/lib/utils/config/definitions.js
index 088d0cdb6..200ee9e55 100644
--- a/test/lib/utils/config/definitions.js
+++ b/test/lib/utils/config/definitions.js
@@ -457,6 +457,13 @@ t.test('retry options', t => {
})
t.test('search options', t => {
+ const vals = {
+ description: 'test description',
+ exclude: 'test search exclude',
+ limit: 99,
+ staleneess: 99,
+
+ }
const obj = {}
// <config>: flat.search[<option>]
const mapping = {
@@ -469,9 +476,9 @@ t.test('search options', t => {
for (const [config, option] of Object.entries(mapping)) {
const msg = `${config} -> search.${option}`
const flat = {}
- obj[config] = 99
+ obj[config] = vals[option]
definitions[config].flatten(config, obj, flat)
- t.strictSame(flat, { search: { limit: 20, [option]: 99 } }, msg)
+ t.strictSame(flat, { search: { limit: 20, [option]: vals[option] } }, msg)
delete obj[config]
}
diff --git a/test/lib/utils/file-exists.js b/test/lib/utils/file-exists.js
deleted file mode 100644
index c8edf4d96..000000000
--- a/test/lib/utils/file-exists.js
+++ /dev/null
@@ -1,30 +0,0 @@
-const t = require('tap')
-const fileExists = require('../../../lib/utils/file-exists.js')
-
-t.test('returns true when arg is a file', async (t) => {
- const path = t.testdir({
- foo: 'just some file',
- })
-
- const result = await fileExists(`${path}/foo`)
- t.equal(result, true, 'file exists')
- t.end()
-})
-
-t.test('returns false when arg is not a file', async (t) => {
- const path = t.testdir({
- foo: {},
- })
-
- const result = await fileExists(`${path}/foo`)
- t.equal(result, false, 'file does not exist')
- t.end()
-})
-
-t.test('returns false when arg does not exist', async (t) => {
- const path = t.testdir()
-
- const result = await fileExists(`${path}/foo`)
- t.equal(result, false, 'file does not exist')
- t.end()
-})