@sanity/cli 6.0.0-alpha.4 → 6.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/dev/startStudioDevServer.js +3 -8
- package/dist/actions/dev/startStudioDevServer.js.map +1 -1
- package/dist/actions/dev/types.d.ts +1 -3
- package/dist/actions/dev/types.js.map +1 -1
- package/dist/actions/documents/validate.d.ts +0 -2
- package/dist/actions/documents/validate.js +21 -1
- package/dist/actions/documents/validate.js.map +1 -1
- package/dist/actions/exec/execScript.js +1 -1
- package/dist/actions/exec/execScript.js.map +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
- package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
- package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
- package/dist/actions/manifest/extractManifest.js +1 -4
- package/dist/actions/manifest/extractManifest.js.map +1 -1
- package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
- package/dist/actions/schema/deleteSchemaAction.js +12 -17
- package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
- package/dist/actions/schema/deploySchemas.d.ts +15 -0
- package/dist/actions/schema/deploySchemas.js +98 -0
- package/dist/actions/schema/deploySchemas.js.map +1 -0
- package/dist/actions/schema/listSchemas.d.ts +12 -0
- package/dist/actions/schema/listSchemas.js +119 -0
- package/dist/actions/schema/listSchemas.js.map +1 -0
- package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
- package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
- package/dist/actions/schema/utils/debug.d.ts +2 -0
- package/dist/actions/schema/utils/debug.js +5 -0
- package/dist/actions/schema/utils/debug.js.map +1 -0
- package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
- package/dist/actions/schema/utils/manifestExtractor.js +12 -17
- package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
- package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
- package/dist/actions/schema/utils/manifestReader.js +6 -12
- package/dist/actions/schema/utils/manifestReader.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
- package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
- package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
- package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
- package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
- package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
- package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
- package/dist/actions/users/getMembersForProject.d.ts +1 -3
- package/dist/actions/users/getMembersForProject.js +6 -17
- package/dist/actions/users/getMembersForProject.js.map +1 -1
- package/dist/actions/users/types.d.ts +0 -11
- package/dist/actions/users/types.js.map +1 -1
- package/dist/commands/__tests__/debug.test.js +113 -220
- package/dist/commands/__tests__/debug.test.js.map +1 -1
- package/dist/commands/__tests__/deploy.test.js +325 -293
- package/dist/commands/__tests__/deploy.test.js.map +1 -1
- package/dist/commands/__tests__/dev.test.js +62 -19
- package/dist/commands/__tests__/dev.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
- package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
- package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.plan.test.js +103 -44
- package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
- package/dist/commands/__tests__/init/init.setup.test.js +85 -29
- package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
- package/dist/commands/__tests__/install.test.js +46 -22
- package/dist/commands/__tests__/install.test.js.map +1 -1
- package/dist/commands/__tests__/logout.test.js +8 -5
- package/dist/commands/__tests__/logout.test.js.map +1 -1
- package/dist/commands/__tests__/manage.test.js +29 -24
- package/dist/commands/__tests__/manage.test.js.map +1 -1
- package/dist/commands/__tests__/versions.test.js +22 -14
- package/dist/commands/__tests__/versions.test.js.map +1 -1
- package/dist/commands/backup/__tests__/disable.test.js +72 -75
- package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/download.test.js +166 -77
- package/dist/commands/backup/__tests__/download.test.js.map +1 -1
- package/dist/commands/backup/__tests__/enable.test.js +109 -140
- package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
- package/dist/commands/backup/__tests__/list.test.js +84 -75
- package/dist/commands/backup/__tests__/list.test.js.map +1 -1
- package/dist/commands/backup/disable.js +5 -11
- package/dist/commands/backup/disable.js.map +1 -1
- package/dist/commands/backup/enable.js +5 -11
- package/dist/commands/backup/enable.js.map +1 -1
- package/dist/commands/backup/list.js +7 -8
- package/dist/commands/backup/list.js.map +1 -1
- package/dist/commands/cors/__tests__/add.test.js +68 -38
- package/dist/commands/cors/__tests__/add.test.js.map +1 -1
- package/dist/commands/cors/__tests__/delete.test.js +52 -37
- package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
- package/dist/commands/cors/__tests__/list.test.js +80 -57
- package/dist/commands/cors/__tests__/list.test.js.map +1 -1
- package/dist/commands/cors/add.js +5 -13
- package/dist/commands/cors/add.js.map +1 -1
- package/dist/commands/cors/delete.js +7 -15
- package/dist/commands/cors/delete.js.map +1 -1
- package/dist/commands/cors/list.js +2 -10
- package/dist/commands/cors/list.js.map +1 -1
- package/dist/commands/dataset/__tests__/copy.test.js +197 -89
- package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/create.test.js +147 -117
- package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/delete.test.js +75 -68
- package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/export.test.js +123 -83
- package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
- package/dist/commands/dataset/__tests__/list.test.js +107 -65
- package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
- package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
- package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
- package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
- package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
- package/dist/commands/dataset/export.js +4 -4
- package/dist/commands/dataset/export.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
- package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
- package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
- package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
- package/dist/commands/dev.js +0 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs/__tests__/search.test.js +8 -7
- package/dist/commands/docs/__tests__/search.test.js.map +1 -1
- package/dist/commands/documents/__tests__/create.test.js +328 -265
- package/dist/commands/documents/__tests__/create.test.js.map +1 -1
- package/dist/commands/documents/__tests__/delete.test.js +119 -87
- package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
- package/dist/commands/documents/__tests__/get.test.js +68 -95
- package/dist/commands/documents/__tests__/get.test.js.map +1 -1
- package/dist/commands/documents/__tests__/query.test.js +84 -189
- package/dist/commands/documents/__tests__/query.test.js.map +1 -1
- package/dist/commands/documents/__tests__/validate.test.js +52 -29
- package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
- package/dist/commands/documents/create.d.ts +1 -0
- package/dist/commands/documents/create.js +10 -9
- package/dist/commands/documents/create.js.map +1 -1
- package/dist/commands/documents/delete.js +2 -3
- package/dist/commands/documents/delete.js.map +1 -1
- package/dist/commands/documents/get.js +2 -3
- package/dist/commands/documents/get.js.map +1 -1
- package/dist/commands/documents/query.js +2 -3
- package/dist/commands/documents/query.js.map +1 -1
- package/dist/commands/documents/validate.js +0 -20
- package/dist/commands/documents/validate.js.map +1 -1
- package/dist/commands/graphql/__tests__/list.test.js +57 -45
- package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
- package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
- package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
- package/dist/commands/graphql/list.js +2 -2
- package/dist/commands/graphql/list.js.map +1 -1
- package/dist/commands/graphql/undeploy.js +4 -9
- package/dist/commands/graphql/undeploy.js.map +1 -1
- package/dist/commands/hook/__tests__/attempt.test.js +48 -33
- package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
- package/dist/commands/hook/__tests__/create.test.js +49 -51
- package/dist/commands/hook/__tests__/create.test.js.map +1 -1
- package/dist/commands/hook/__tests__/delete.test.js +43 -30
- package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
- package/dist/commands/hook/__tests__/list.test.js +38 -31
- package/dist/commands/hook/__tests__/list.test.js.map +1 -1
- package/dist/commands/hook/__tests__/logs.test.js +68 -40
- package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
- package/dist/commands/hook/create.js +2 -6
- package/dist/commands/hook/create.js.map +1 -1
- package/dist/commands/hook/delete.js +5 -17
- package/dist/commands/hook/delete.js.map +1 -1
- package/dist/commands/hook/list.js +2 -8
- package/dist/commands/hook/list.js.map +1 -1
- package/dist/commands/manifest/__tests__/extract.test.js +22 -13
- package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
- package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
- package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
- package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
- package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
- package/dist/commands/media/__tests__/export.test.js +365 -66
- package/dist/commands/media/__tests__/export.test.js.map +1 -1
- package/dist/commands/media/__tests__/import.test.js +171 -105
- package/dist/commands/media/__tests__/import.test.js.map +1 -1
- package/dist/commands/media/export.js +2 -2
- package/dist/commands/media/export.js.map +1 -1
- package/dist/commands/media/import.js +2 -2
- package/dist/commands/media/import.js.map +1 -1
- package/dist/commands/projects/__tests__/list.test.js +5 -4
- package/dist/commands/projects/__tests__/list.test.js.map +1 -1
- package/dist/commands/projects/list.js +2 -6
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/schema/__tests__/delete.test.js +396 -151
- package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
- package/dist/commands/schema/__tests__/deploy.test.js +348 -0
- package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
- package/dist/commands/schema/__tests__/extract.test.js +19 -11
- package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
- package/dist/commands/schema/__tests__/list.test.js +399 -0
- package/dist/commands/schema/__tests__/list.test.js.map +1 -0
- package/dist/commands/schema/__tests__/validate.test.js +27 -10
- package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
- package/dist/commands/schema/delete.d.ts +1 -1
- package/dist/commands/schema/delete.js +20 -23
- package/dist/commands/schema/delete.js.map +1 -1
- package/dist/commands/schema/deploy.d.ts +16 -0
- package/dist/commands/schema/deploy.js +98 -0
- package/dist/commands/schema/deploy.js.map +1 -0
- package/dist/commands/schema/list.d.ts +15 -0
- package/dist/commands/schema/list.js +104 -0
- package/dist/commands/schema/list.js.map +1 -0
- package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
- package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
- package/dist/commands/telemetry/__tests__/status.test.js +7 -5
- package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/add.test.js +55 -40
- package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/delete.test.js +72 -42
- package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
- package/dist/commands/tokens/__tests__/list.test.js +87 -60
- package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
- package/dist/commands/tokens/add.js +3 -5
- package/dist/commands/tokens/add.js.map +1 -1
- package/dist/commands/users/__tests__/invite.test.js +100 -79
- package/dist/commands/users/__tests__/invite.test.js.map +1 -1
- package/dist/commands/users/__tests__/list.test.js +186 -180
- package/dist/commands/users/__tests__/list.test.js.map +1 -1
- package/dist/commands/users/invite.js +6 -17
- package/dist/commands/users/invite.js.map +1 -1
- package/dist/commands/users/list.js +4 -7
- package/dist/commands/users/list.js.map +1 -1
- package/dist/config/createCliConfig.d.ts +4 -4
- package/dist/services/backup.d.ts +8 -0
- package/dist/services/backup.js +19 -0
- package/dist/services/backup.js.map +1 -1
- package/dist/services/cors.d.ts +23 -0
- package/dist/services/cors.js +38 -0
- package/dist/services/cors.js.map +1 -0
- package/dist/services/graphql.d.ts +7 -0
- package/dist/services/graphql.js +11 -0
- package/dist/services/graphql.js.map +1 -1
- package/dist/services/hooks.d.ts +2 -0
- package/dist/services/hooks.js +19 -0
- package/dist/services/hooks.js.map +1 -1
- package/dist/services/organizations.d.ts +1 -1
- package/dist/services/organizations.js +1 -1
- package/dist/services/organizations.js.map +1 -1
- package/dist/services/projects.d.ts +11 -0
- package/dist/services/projects.js +41 -0
- package/dist/services/projects.js.map +1 -1
- package/dist/services/schemas.d.ts +4 -0
- package/dist/services/schemas.js +40 -0
- package/dist/services/schemas.js.map +1 -0
- package/dist/services/user.d.ts +8 -0
- package/dist/services/user.js +15 -2
- package/dist/services/user.js.map +1 -1
- package/dist/util/__tests__/getCliVersion.test.js +2 -2
- package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
- package/dist/util/errorMessages.d.ts +1 -0
- package/dist/util/errorMessages.js +1 -0
- package/dist/util/errorMessages.js.map +1 -1
- package/dist/util/getCliVersion.js +1 -1
- package/dist/util/getCliVersion.js.map +1 -1
- package/dist/util/readPackageJson.d.ts +1 -15
- package/dist/util/readPackageJson.js +1 -1
- package/dist/util/readPackageJson.js.map +1 -1
- package/dist/util/uniqBy.d.ts +1 -0
- package/dist/util/uniqBy.js +14 -0
- package/dist/util/uniqBy.js.map +1 -0
- package/oclif.manifest.json +172 -27
- package/package.json +27 -28
- package/dist/actions/cors/constants.d.ts +0 -1
- package/dist/actions/cors/constants.js +0 -3
- package/dist/actions/cors/constants.js.map +0 -1
- package/dist/actions/cors/types.d.ts +0 -9
- package/dist/actions/cors/types.js +0 -3
- package/dist/actions/cors/types.js.map +0 -1
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
- package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
- package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
- package/dist/actions/schema/schemaStoreConstants.js +0 -4
- package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
- package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
- package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
- package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
- package/dist/actions/schema/utils/schemaApiClient.js +0 -17
- package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
- package/dist/actions/users/apiVersion.d.ts +0 -6
- package/dist/actions/users/apiVersion.js +0 -7
- package/dist/actions/users/apiVersion.js.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig } from '@sanity/cli-core';
|
|
3
2
|
import { input, select } from '@sanity/cli-core/ux';
|
|
4
3
|
import { mockApi, testCommand } from '@sanity/cli-test';
|
|
5
4
|
import nock from 'nock';
|
|
6
5
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
7
|
-
import {
|
|
6
|
+
import { PROJECTS_API_VERSION } from '../../../services/projects.js';
|
|
8
7
|
import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
|
|
9
8
|
import { UsersInviteCommand } from '../invite.js';
|
|
10
9
|
vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
@@ -15,24 +14,20 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
15
14
|
select: vi.fn()
|
|
16
15
|
};
|
|
17
16
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
};
|
|
35
|
-
});
|
|
17
|
+
const testProjectId = 'test-project';
|
|
18
|
+
const defaultMocks = {
|
|
19
|
+
cliConfig: {
|
|
20
|
+
api: {
|
|
21
|
+
projectId: testProjectId
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
projectRoot: {
|
|
25
|
+
directory: '/test/path',
|
|
26
|
+
path: '/test/path/sanity.config.ts',
|
|
27
|
+
type: 'studio'
|
|
28
|
+
},
|
|
29
|
+
token: 'test-token'
|
|
30
|
+
};
|
|
36
31
|
const mockRoles = [
|
|
37
32
|
{
|
|
38
33
|
appliesToRobots: false,
|
|
@@ -41,7 +36,7 @@ const mockRoles = [
|
|
|
41
36
|
grants: {},
|
|
42
37
|
isCustom: false,
|
|
43
38
|
name: 'administrator',
|
|
44
|
-
projectId:
|
|
39
|
+
projectId: testProjectId,
|
|
45
40
|
title: 'Administrator'
|
|
46
41
|
},
|
|
47
42
|
{
|
|
@@ -51,7 +46,7 @@ const mockRoles = [
|
|
|
51
46
|
grants: {},
|
|
52
47
|
isCustom: false,
|
|
53
48
|
name: 'developer',
|
|
54
|
-
projectId:
|
|
49
|
+
projectId: testProjectId,
|
|
55
50
|
title: 'Developer'
|
|
56
51
|
},
|
|
57
52
|
{
|
|
@@ -61,7 +56,7 @@ const mockRoles = [
|
|
|
61
56
|
grants: {},
|
|
62
57
|
isCustom: false,
|
|
63
58
|
name: 'viewer',
|
|
64
|
-
projectId:
|
|
59
|
+
projectId: testProjectId,
|
|
65
60
|
title: 'Viewer'
|
|
66
61
|
},
|
|
67
62
|
{
|
|
@@ -71,7 +66,7 @@ const mockRoles = [
|
|
|
71
66
|
grants: {},
|
|
72
67
|
isCustom: false,
|
|
73
68
|
name: 'robot',
|
|
74
|
-
projectId:
|
|
69
|
+
projectId: testProjectId,
|
|
75
70
|
title: 'Robot'
|
|
76
71
|
}
|
|
77
72
|
];
|
|
@@ -92,77 +87,87 @@ describe('#invite', ()=>{
|
|
|
92
87
|
});
|
|
93
88
|
test('invites user with email and role provided via flags', async ()=>{
|
|
94
89
|
mockApi({
|
|
95
|
-
apiVersion:
|
|
96
|
-
uri:
|
|
90
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
91
|
+
uri: `/projects/${testProjectId}/roles`
|
|
97
92
|
}).reply(200, mockRoles);
|
|
98
93
|
mockApi({
|
|
99
|
-
apiVersion:
|
|
94
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
100
95
|
method: 'post',
|
|
101
|
-
uri:
|
|
96
|
+
uri: `/invitations/project/${testProjectId}`
|
|
102
97
|
}).reply(200, {});
|
|
103
98
|
const { stdout } = await testCommand(UsersInviteCommand, [
|
|
104
99
|
'test@example.com',
|
|
105
100
|
'--role',
|
|
106
101
|
'developer'
|
|
107
|
-
]
|
|
102
|
+
], {
|
|
103
|
+
mocks: defaultMocks
|
|
104
|
+
});
|
|
108
105
|
expect(stdout).toContain('Invitation sent to test@example.com');
|
|
109
106
|
});
|
|
110
107
|
test('invites user with email provided via args and role as flag', async ()=>{
|
|
111
108
|
mockApi({
|
|
112
|
-
apiVersion:
|
|
113
|
-
uri:
|
|
109
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
110
|
+
uri: `/projects/${testProjectId}/roles`
|
|
114
111
|
}).reply(200, mockRoles);
|
|
115
112
|
mockApi({
|
|
116
|
-
apiVersion:
|
|
113
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
117
114
|
method: 'post',
|
|
118
|
-
uri:
|
|
115
|
+
uri: `/invitations/project/${testProjectId}`
|
|
119
116
|
}).reply(200, {});
|
|
120
117
|
const { stdout } = await testCommand(UsersInviteCommand, [
|
|
121
118
|
'user@example.com',
|
|
122
119
|
'--role',
|
|
123
120
|
'administrator'
|
|
124
|
-
]
|
|
121
|
+
], {
|
|
122
|
+
mocks: defaultMocks
|
|
123
|
+
});
|
|
125
124
|
expect(stdout).toContain('Invitation sent to user@example.com');
|
|
126
125
|
});
|
|
127
126
|
test('exits when role is not found', async ()=>{
|
|
128
127
|
mockApi({
|
|
129
|
-
apiVersion:
|
|
130
|
-
uri:
|
|
128
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
129
|
+
uri: `/projects/${testProjectId}/roles`
|
|
131
130
|
}).reply(200, mockRoles);
|
|
132
131
|
const { error } = await testCommand(UsersInviteCommand, [
|
|
133
132
|
'test@example.com',
|
|
134
133
|
'--role',
|
|
135
134
|
'invalid-role'
|
|
136
|
-
]
|
|
135
|
+
], {
|
|
136
|
+
mocks: defaultMocks
|
|
137
|
+
});
|
|
137
138
|
expect(error).toBeInstanceOf(Error);
|
|
138
139
|
expect(error?.message).toContain('Role name "invalid-role" not found');
|
|
139
140
|
expect(error?.message).toContain('Available roles:');
|
|
140
141
|
expect(error?.oclif?.exit).toBe(1);
|
|
141
142
|
});
|
|
142
143
|
test('exits when project ID is not found', async ()=>{
|
|
143
|
-
vi.mocked(getCliConfig).mockResolvedValueOnce({
|
|
144
|
-
api: {
|
|
145
|
-
projectId: undefined
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
144
|
const { error } = await testCommand(UsersInviteCommand, [
|
|
149
145
|
'test@example.com',
|
|
150
146
|
'--role',
|
|
151
147
|
'developer'
|
|
152
|
-
]
|
|
148
|
+
], {
|
|
149
|
+
mocks: {
|
|
150
|
+
...defaultMocks,
|
|
151
|
+
cliConfig: {
|
|
152
|
+
api: {
|
|
153
|
+
projectId: undefined
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
153
158
|
expect(error).toBeInstanceOf(Error);
|
|
154
159
|
expect(error?.message).toEqual(NO_PROJECT_ID);
|
|
155
160
|
expect(error?.oclif?.exit).toBe(1);
|
|
156
161
|
});
|
|
157
162
|
test('handles 402 quota error', async ()=>{
|
|
158
163
|
mockApi({
|
|
159
|
-
apiVersion:
|
|
160
|
-
uri:
|
|
164
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
165
|
+
uri: `/projects/${testProjectId}/roles`
|
|
161
166
|
}).reply(200, mockRoles);
|
|
162
167
|
mockApi({
|
|
163
|
-
apiVersion:
|
|
168
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
164
169
|
method: 'post',
|
|
165
|
-
uri:
|
|
170
|
+
uri: `/invitations/project/${testProjectId}`
|
|
166
171
|
}).reply(402, {
|
|
167
172
|
message: 'Payment required'
|
|
168
173
|
});
|
|
@@ -170,20 +175,22 @@ describe('#invite', ()=>{
|
|
|
170
175
|
'test@example.com',
|
|
171
176
|
'--role',
|
|
172
177
|
'developer'
|
|
173
|
-
]
|
|
178
|
+
], {
|
|
179
|
+
mocks: defaultMocks
|
|
180
|
+
});
|
|
174
181
|
expect(error).toBeInstanceOf(Error);
|
|
175
182
|
expect(error?.message).toContain('Project is already at user quota, add billing details to the project in order to allow overage charges.');
|
|
176
183
|
expect(error?.oclif?.exit).toBe(1);
|
|
177
184
|
});
|
|
178
185
|
test('handles API errors during invitation', async ()=>{
|
|
179
186
|
mockApi({
|
|
180
|
-
apiVersion:
|
|
181
|
-
uri:
|
|
187
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
188
|
+
uri: `/projects/${testProjectId}/roles`
|
|
182
189
|
}).reply(200, mockRoles);
|
|
183
190
|
mockApi({
|
|
184
|
-
apiVersion:
|
|
191
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
185
192
|
method: 'post',
|
|
186
|
-
uri:
|
|
193
|
+
uri: `/invitations/project/${testProjectId}`
|
|
187
194
|
}).reply(500, {
|
|
188
195
|
message: 'Internal server error'
|
|
189
196
|
});
|
|
@@ -191,15 +198,17 @@ describe('#invite', ()=>{
|
|
|
191
198
|
'test@example.com',
|
|
192
199
|
'--role',
|
|
193
200
|
'developer'
|
|
194
|
-
]
|
|
201
|
+
], {
|
|
202
|
+
mocks: defaultMocks
|
|
203
|
+
});
|
|
195
204
|
expect(error).toBeInstanceOf(Error);
|
|
196
205
|
expect(error?.message).toContain('Error inviting user');
|
|
197
206
|
expect(error?.oclif?.exit).toBe(1);
|
|
198
207
|
});
|
|
199
208
|
test('handles API errors when fetching roles', async ()=>{
|
|
200
209
|
mockApi({
|
|
201
|
-
apiVersion:
|
|
202
|
-
uri:
|
|
210
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
211
|
+
uri: `/projects/${testProjectId}/roles`
|
|
203
212
|
}).reply(500, {
|
|
204
213
|
message: 'Internal server error'
|
|
205
214
|
});
|
|
@@ -207,21 +216,25 @@ describe('#invite', ()=>{
|
|
|
207
216
|
'test@example.com',
|
|
208
217
|
'--role',
|
|
209
218
|
'developer'
|
|
210
|
-
]
|
|
219
|
+
], {
|
|
220
|
+
mocks: defaultMocks
|
|
221
|
+
});
|
|
211
222
|
expect(error).toBeInstanceOf(Error);
|
|
212
223
|
expect(error?.message).toContain('Error fetching roles');
|
|
213
224
|
expect(error?.oclif?.exit).toBe(1);
|
|
214
225
|
});
|
|
215
226
|
test('exits when trying to assign role that does not apply to users', async ()=>{
|
|
216
227
|
mockApi({
|
|
217
|
-
apiVersion:
|
|
218
|
-
uri:
|
|
228
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
229
|
+
uri: `/projects/${testProjectId}/roles`
|
|
219
230
|
}).reply(200, mockRoles);
|
|
220
231
|
const { error } = await testCommand(UsersInviteCommand, [
|
|
221
232
|
'test@example.com',
|
|
222
233
|
'--role',
|
|
223
234
|
'robot'
|
|
224
|
-
]
|
|
235
|
+
], {
|
|
236
|
+
mocks: defaultMocks
|
|
237
|
+
});
|
|
225
238
|
expect(error).toBeInstanceOf(Error);
|
|
226
239
|
expect(error?.message).toContain('Role name "robot" not found');
|
|
227
240
|
expect(error?.message).toContain('Available roles:');
|
|
@@ -229,36 +242,40 @@ describe('#invite', ()=>{
|
|
|
229
242
|
});
|
|
230
243
|
test('role names are case insensitive', async ()=>{
|
|
231
244
|
mockApi({
|
|
232
|
-
apiVersion:
|
|
233
|
-
uri:
|
|
245
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
246
|
+
uri: `/projects/${testProjectId}/roles`
|
|
234
247
|
}).reply(200, mockRoles);
|
|
235
248
|
mockApi({
|
|
236
|
-
apiVersion:
|
|
249
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
237
250
|
method: 'post',
|
|
238
|
-
uri:
|
|
251
|
+
uri: `/invitations/project/${testProjectId}`
|
|
239
252
|
}).reply(200, {});
|
|
240
253
|
const { stdout } = await testCommand(UsersInviteCommand, [
|
|
241
254
|
'test@example.com',
|
|
242
255
|
'--role',
|
|
243
256
|
'DEVELOPER'
|
|
244
|
-
]
|
|
257
|
+
], {
|
|
258
|
+
mocks: defaultMocks
|
|
259
|
+
});
|
|
245
260
|
expect(stdout).toContain('Invitation sent to test@example.com');
|
|
246
261
|
});
|
|
247
262
|
test('prompts for email when not provided as argument', async ()=>{
|
|
248
263
|
vi.mocked(input).mockResolvedValueOnce('prompted@example.com');
|
|
249
264
|
mockApi({
|
|
250
|
-
apiVersion:
|
|
251
|
-
uri:
|
|
265
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
266
|
+
uri: `/projects/${testProjectId}/roles`
|
|
252
267
|
}).reply(200, mockRoles);
|
|
253
268
|
mockApi({
|
|
254
|
-
apiVersion:
|
|
269
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
255
270
|
method: 'post',
|
|
256
|
-
uri:
|
|
271
|
+
uri: `/invitations/project/${testProjectId}`
|
|
257
272
|
}).reply(200, {});
|
|
258
273
|
const { stdout } = await testCommand(UsersInviteCommand, [
|
|
259
274
|
'--role',
|
|
260
275
|
'developer'
|
|
261
|
-
]
|
|
276
|
+
], {
|
|
277
|
+
mocks: defaultMocks
|
|
278
|
+
});
|
|
262
279
|
expect(input).toHaveBeenCalledWith({
|
|
263
280
|
message: 'Email to invite:',
|
|
264
281
|
transformer: expect.any(Function),
|
|
@@ -269,17 +286,19 @@ describe('#invite', ()=>{
|
|
|
269
286
|
test('prompts for role when not provided as flag', async ()=>{
|
|
270
287
|
vi.mocked(select).mockResolvedValueOnce('administrator');
|
|
271
288
|
mockApi({
|
|
272
|
-
apiVersion:
|
|
273
|
-
uri:
|
|
289
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
290
|
+
uri: `/projects/${testProjectId}/roles`
|
|
274
291
|
}).reply(200, mockRoles);
|
|
275
292
|
mockApi({
|
|
276
|
-
apiVersion:
|
|
293
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
277
294
|
method: 'post',
|
|
278
|
-
uri:
|
|
295
|
+
uri: `/invitations/project/${testProjectId}`
|
|
279
296
|
}).reply(200, {});
|
|
280
297
|
const { stdout } = await testCommand(UsersInviteCommand, [
|
|
281
298
|
'prompted@example.com'
|
|
282
|
-
]
|
|
299
|
+
], {
|
|
300
|
+
mocks: defaultMocks
|
|
301
|
+
});
|
|
283
302
|
expect(select).toHaveBeenCalledWith({
|
|
284
303
|
choices: [
|
|
285
304
|
{
|
|
@@ -303,15 +322,17 @@ describe('#invite', ()=>{
|
|
|
303
322
|
vi.mocked(input).mockResolvedValueOnce('interactive@example.com');
|
|
304
323
|
vi.mocked(select).mockResolvedValueOnce('viewer');
|
|
305
324
|
mockApi({
|
|
306
|
-
apiVersion:
|
|
307
|
-
uri:
|
|
325
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
326
|
+
uri: `/projects/${testProjectId}/roles`
|
|
308
327
|
}).reply(200, mockRoles);
|
|
309
328
|
mockApi({
|
|
310
|
-
apiVersion:
|
|
329
|
+
apiVersion: PROJECTS_API_VERSION,
|
|
311
330
|
method: 'post',
|
|
312
|
-
uri:
|
|
331
|
+
uri: `/invitations/project/${testProjectId}`
|
|
313
332
|
}).reply(200, {});
|
|
314
|
-
const { stdout } = await testCommand(UsersInviteCommand, []
|
|
333
|
+
const { stdout } = await testCommand(UsersInviteCommand, [], {
|
|
334
|
+
mocks: defaultMocks
|
|
335
|
+
});
|
|
315
336
|
expect(input).toHaveBeenCalledWith({
|
|
316
337
|
message: 'Email to invite:',
|
|
317
338
|
transformer: expect.any(Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/users/__tests__/invite.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {USERS_API_VERSION} from '../../../actions/users/apiVersion.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {UsersInviteCommand} from '../invite.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', async () => {\n return {\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n }\n})\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', async () => {\n return {\n getCliConfig: vi.fn().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\n }\n})\n\nconst mockRoles = [\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Full access to project',\n grants: {},\n isCustom: false,\n name: 'administrator',\n projectId: 'test-project',\n title: 'Administrator',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Can edit content and publish',\n grants: {},\n isCustom: false,\n name: 'developer',\n projectId: 'test-project',\n title: 'Developer',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Read-only access',\n grants: {},\n isCustom: false,\n name: 'viewer',\n projectId: 'test-project',\n title: 'Viewer',\n },\n {\n appliesToRobots: true,\n appliesToUsers: false,\n description: 'For API tokens',\n grants: {},\n isCustom: false,\n name: 'robot',\n projectId: 'test-project',\n title: 'Robot',\n },\n]\n\ndescribe('#invite', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['users invite', '--help'])\n\n expect(stdout).toContain('Invite a new user to the project')\n expect(stdout).toContain('--role')\n })\n\n test('invites user with email and role provided via flags', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('invites user with email provided via args and role as flag', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'user@example.com',\n '--role',\n 'administrator',\n ])\n\n expect(stdout).toContain('Invitation sent to user@example.com')\n })\n\n test('exits when role is not found', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'invalid-role',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"invalid-role\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when project ID is not found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles 402 quota error', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(402, {message: 'Payment required'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors during invitation', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error inviting user')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when fetching roles', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'developer',\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error fetching roles')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when trying to assign role that does not apply to users', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'robot', // This role does not apply to users\n ])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"robot\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('role names are case insensitive', async () => {\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [\n 'test@example.com',\n '--role',\n 'DEVELOPER', // Uppercase should work\n ])\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('prompts for email when not provided as argument', async () => {\n vi.mocked(input).mockResolvedValueOnce('prompted@example.com')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['--role', 'developer'])\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for role when not provided as flag', async () => {\n vi.mocked(select).mockResolvedValueOnce('administrator')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['prompted@example.com'])\n\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for both email and role when neither is provided', async () => {\n vi.mocked(input).mockResolvedValueOnce('interactive@example.com')\n vi.mocked(select).mockResolvedValueOnce('viewer')\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n uri: '/projects/test-project/roles',\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: USERS_API_VERSION,\n method: 'post',\n uri: '/invitations/project/test-project',\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [])\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to interactive@example.com')\n })\n})\n"],"names":["runCommand","getCliConfig","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","USERS_API_VERSION","NO_PROJECT_ID","UsersInviteCommand","mock","actual","importActual","fn","findProjectRoot","mockResolvedValue","directory","root","type","api","projectId","mockRoles","appliesToRobots","appliesToUsers","description","grants","isCustom","name","title","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","method","error","toBeInstanceOf","Error","message","oclif","exit","toBe","mocked","mockResolvedValueOnce","undefined","toHaveBeenCalledWith","transformer","any","Function","validate","choices","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/users/__tests__/invite.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {input, select} from '@sanity/cli-core/ux'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {PROJECTS_API_VERSION} from '../../../services/projects.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {UsersInviteCommand} from '../invite.js'\n\nvi.mock('@sanity/cli-core/ux', async () => {\n const actual = await vi.importActual<typeof import('@sanity/cli-core/ux')>('@sanity/cli-core/ux')\n return {\n ...actual,\n input: vi.fn(),\n select: vi.fn(),\n }\n})\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\nconst mockRoles = [\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Full access to project',\n grants: {},\n isCustom: false,\n name: 'administrator',\n projectId: testProjectId,\n title: 'Administrator',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Can edit content and publish',\n grants: {},\n isCustom: false,\n name: 'developer',\n projectId: testProjectId,\n title: 'Developer',\n },\n {\n appliesToRobots: false,\n appliesToUsers: true,\n description: 'Read-only access',\n grants: {},\n isCustom: false,\n name: 'viewer',\n projectId: testProjectId,\n title: 'Viewer',\n },\n {\n appliesToRobots: true,\n appliesToUsers: false,\n description: 'For API tokens',\n grants: {},\n isCustom: false,\n name: 'robot',\n projectId: testProjectId,\n title: 'Robot',\n },\n]\n\ndescribe('#invite', () => {\n afterEach(() => {\n vi.clearAllMocks()\n const pending = nock.pendingMocks()\n nock.cleanAll()\n expect(pending, 'pending mocks').toEqual([])\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['users invite', '--help'])\n\n expect(stdout).toContain('Invite a new user to the project')\n expect(stdout).toContain('--role')\n })\n\n test('invites user with email and role provided via flags', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('invites user with email provided via args and role as flag', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n ['user@example.com', '--role', 'administrator'],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to user@example.com')\n })\n\n test('exits when role is not found', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'invalid-role'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"invalid-role\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when project ID is not found', async () => {\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n },\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles 402 quota error', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(402, {message: 'Payment required'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain(\n 'Project is already at user quota, add billing details to the project in order to allow overage charges.',\n )\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors during invitation', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error inviting user')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when fetching roles', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(500, {message: 'Internal server error'})\n\n const {error} = await testCommand(\n UsersInviteCommand,\n ['test@example.com', '--role', 'developer'],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Error fetching roles')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('exits when trying to assign role that does not apply to users', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n const {error} = await testCommand(\n UsersInviteCommand,\n [\n 'test@example.com',\n '--role',\n 'robot', // This role does not apply to users\n ],\n {mocks: defaultMocks},\n )\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Role name \"robot\" not found')\n expect(error?.message).toContain('Available roles:')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('role names are case insensitive', async () => {\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(\n UsersInviteCommand,\n [\n 'test@example.com',\n '--role',\n 'DEVELOPER', // Uppercase should work\n ],\n {mocks: defaultMocks},\n )\n\n expect(stdout).toContain('Invitation sent to test@example.com')\n })\n\n test('prompts for email when not provided as argument', async () => {\n vi.mocked(input).mockResolvedValueOnce('prompted@example.com')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['--role', 'developer'], {\n mocks: defaultMocks,\n })\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for role when not provided as flag', async () => {\n vi.mocked(select).mockResolvedValueOnce('administrator')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, ['prompted@example.com'], {\n mocks: defaultMocks,\n })\n\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to prompted@example.com')\n })\n\n test('prompts for both email and role when neither is provided', async () => {\n vi.mocked(input).mockResolvedValueOnce('interactive@example.com')\n vi.mocked(select).mockResolvedValueOnce('viewer')\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n uri: `/projects/${testProjectId}/roles`,\n }).reply(200, mockRoles)\n\n mockApi({\n apiVersion: PROJECTS_API_VERSION,\n method: 'post',\n uri: `/invitations/project/${testProjectId}`,\n }).reply(200, {})\n\n const {stdout} = await testCommand(UsersInviteCommand, [], {mocks: defaultMocks})\n\n expect(input).toHaveBeenCalledWith({\n message: 'Email to invite:',\n transformer: expect.any(Function),\n validate: expect.any(Function),\n })\n expect(select).toHaveBeenCalledWith({\n choices: [\n {\n name: 'Administrator (Full access to project)',\n value: 'administrator',\n },\n {\n name: 'Developer (Can edit content and publish)',\n value: 'developer',\n },\n {\n name: 'Viewer (Read-only access)',\n value: 'viewer',\n },\n ],\n message: 'Which role should the user have?',\n })\n expect(stdout).toContain('Invitation sent to interactive@example.com')\n })\n})\n"],"names":["runCommand","input","select","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","PROJECTS_API_VERSION","NO_PROJECT_ID","UsersInviteCommand","mock","actual","importActual","fn","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","mockRoles","appliesToRobots","appliesToUsers","description","grants","isCustom","name","title","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toContain","apiVersion","uri","reply","method","mocks","error","toBeInstanceOf","Error","message","oclif","exit","toBe","undefined","mocked","mockResolvedValueOnce","toHaveBeenCalledWith","transformer","any","Function","validate","choices","value"],"mappings":"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"}
|