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:
authorGar <gar+gh@danger.computer>2022-05-03 23:42:22 +0300
committerGitHub <noreply@github.com>2022-05-03 23:42:22 +0300
commit62af3a1dc003cf23c563d18437be81f61e65cb49 (patch)
treed5f33ffebfbbe809f97688a9014dda41fc9db1d7 /test
parent2bd5d7b24f05d438938466adcea35ecfed310871 (diff)
feat: make npm owner workspace aware (#4835)
Diffstat (limited to 'test')
-rw-r--r--test/lib/commands/owner.js189
-rw-r--r--test/lib/npm.js2
2 files changed, 190 insertions, 1 deletions
diff --git a/test/lib/commands/owner.js b/test/lib/commands/owner.js
index d80ce36fe..800d5b96a 100644
--- a/test/lib/commands/owner.js
+++ b/test/lib/commands/owner.js
@@ -2,6 +2,7 @@ const t = require('tap')
const { load: loadMockNpm } = require('../../fixtures/mock-npm.js')
const MockRegistry = require('../../fixtures/mock-registry.js')
+const path = require('path')
const npa = require('npm-package-arg')
const packageName = '@npmcli/test-package'
const spec = npa(packageName)
@@ -12,6 +13,42 @@ const maintainers = [
{ email: 'test-user-b@npmjs.org', name: 'test-user-b' },
]
+const workspaceFixture = {
+ 'package.json': JSON.stringify({
+ name: packageName,
+ version: '1.2.3-test',
+ workspaces: ['workspace-a', 'workspace-b', 'workspace-c'],
+ }),
+ 'workspace-a': {
+ 'package.json': JSON.stringify({
+ name: 'workspace-a',
+ version: '1.2.3-a',
+ }),
+ },
+ 'workspace-b': {
+ 'package.json': JSON.stringify({
+ name: 'workspace-b',
+ version: '1.2.3-n',
+ }),
+ },
+ 'workspace-c': JSON.stringify({
+ 'package.json': {
+ name: 'workspace-n',
+ version: '1.2.3-n',
+ },
+ }),
+}
+
+function registryPackage (t, registry, name) {
+ const mockRegistry = new MockRegistry({ tap: t, registry })
+
+ const manifest = mockRegistry.manifest({
+ name,
+ packuments: [{ maintainers, version: '1.0.0' }],
+ })
+ mockRegistry.package({ manifest })
+}
+
t.test('owner no args', async t => {
const { npm } = await loadMockNpm(t)
await t.rejects(
@@ -429,6 +466,158 @@ t.test('owner rm <user> no cwd package', async t => {
)
})
+t.test('workspaces', async t => {
+ t.test('owner no args --workspace', async t => {
+ const { npm } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ })
+ npm.config.set('workspace', ['workspace-a'])
+ await t.rejects(
+ npm.exec('owner', []),
+ { code: 'EUSAGE' },
+ 'rejects with usage'
+ )
+ })
+
+ t.test('owner ls implicit workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => path.join(prefix, 'workspace-a'),
+ }),
+ })
+ registryPackage(t, npm.config.get('registry'), 'workspace-a')
+ await npm.exec('owner', ['ls'])
+ t.match(joinedOutput(), maintainers.map(m => `${m.name} <${m.email}>`).join('\n'))
+ })
+
+ t.test('owner ls explicit workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => prefix,
+ }),
+ })
+ npm.config.set('workspace', ['workspace-a'])
+ registryPackage(t, npm.config.get('registry'), 'workspace-a')
+ await npm.exec('owner', ['ls'])
+ t.match(joinedOutput(), maintainers.map(m => `${m.name} <${m.email}>`).join('\n'))
+ })
+
+ t.test('owner ls <pkg> implicit workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => path.join(prefix, 'workspace-a'),
+ }),
+ })
+ registryPackage(t, npm.config.get('registry'), packageName)
+ await npm.exec('owner', ['ls', packageName])
+ t.match(joinedOutput(), maintainers.map(m => `${m.name} <${m.email}>`).join('\n'))
+ })
+
+ t.test('owner ls <pkg> explicit workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => prefix,
+ }),
+ })
+ npm.config.set('workspace', ['workspace-a'])
+ registryPackage(t, npm.config.get('registry'), packageName)
+ await npm.exec('owner', ['ls', packageName])
+ t.match(joinedOutput(), maintainers.map(m => `${m.name} <${m.email}>`).join('\n'))
+ })
+
+ t.test('owner add implicit workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => path.join(prefix, 'workspace-a'),
+ }),
+ })
+ const username = 'foo'
+ const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') })
+
+ const manifest = registry.manifest({
+ name: 'workspace-a',
+ packuments: [{ maintainers, version: '1.0.0' }],
+ })
+ registry.package({ manifest })
+ registry.couchuser({ username })
+ registry.nock.put(`/workspace-a/-rev/${manifest._rev}`, body => {
+ t.match(body, {
+ _id: manifest._id,
+ _rev: manifest._rev,
+ maintainers: [
+ ...manifest.maintainers,
+ { name: username, email: '' },
+ ],
+ })
+ return true
+ }).reply(200, {})
+ await npm.exec('owner', ['add', username])
+ t.equal(joinedOutput(), `+ ${username} (workspace-a)`)
+ })
+
+ t.test('owner add --workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ })
+ npm.config.set('workspace', ['workspace-a'])
+ const username = 'foo'
+ const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') })
+
+ const manifest = registry.manifest({
+ name: 'workspace-a',
+ packuments: [{ maintainers, version: '1.0.0' }],
+ })
+ registry.package({ manifest })
+ registry.couchuser({ username })
+ registry.nock.put(`/workspace-a/-rev/${manifest._rev}`, body => {
+ t.match(body, {
+ _id: manifest._id,
+ _rev: manifest._rev,
+ maintainers: [
+ ...manifest.maintainers,
+ { name: username, email: '' },
+ ],
+ })
+ return true
+ }).reply(200, {})
+ await npm.exec('owner', ['add', username])
+ t.equal(joinedOutput(), `+ ${username} (workspace-a)`)
+ })
+
+ t.test('owner rm --workspace', async t => {
+ const { npm, joinedOutput } = await loadMockNpm(t, {
+ prefixDir: workspaceFixture,
+ globals: ({ prefix }) => ({
+ 'process.cwd': () => path.join(prefix, 'workspace-a'),
+ }),
+ })
+ const registry = new MockRegistry({ tap: t, registry: npm.config.get('registry') })
+
+ const username = maintainers[0].name
+ const manifest = registry.manifest({
+ name: 'workspace-a',
+ packuments: [{ maintainers, version: '1.0.0' }],
+ })
+ registry.package({ manifest })
+ registry.couchuser({ username })
+ registry.nock.put(`/workspace-a/-rev/${manifest._rev}`, body => {
+ t.match(body, {
+ _id: manifest._id,
+ _rev: manifest._rev,
+ maintainers: maintainers.slice(1),
+ })
+ return true
+ }).reply(200, {})
+ await npm.exec('owner', ['rm', username])
+ t.equal(joinedOutput(), `- ${username} (workspace-a)`)
+ })
+})
+
t.test('completion', async t => {
t.test('basic commands', async t => {
const { npm } = await loadMockNpm(t)
diff --git a/test/lib/npm.js b/test/lib/npm.js
index 1966ca960..566cbca20 100644
--- a/test/lib/npm.js
+++ b/test/lib/npm.js
@@ -620,7 +620,7 @@ t.test('implicit workspace rejection', async t => {
}),
})
await t.rejects(
- mock.npm.exec('owner', []),
+ mock.npm.exec('team', []),
/This command does not support workspaces/
)
})