@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,30 +1,34 @@
|
|
|
1
1
|
import { runCommand } from '@oclif/test';
|
|
2
|
-
import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
|
|
3
2
|
import { chalk } from '@sanity/cli-core/ux';
|
|
4
3
|
import { testCommand } from '@sanity/cli-test';
|
|
5
4
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
6
5
|
import { QueryDocumentCommand } from '../query.js';
|
|
7
|
-
// Mock the config functions
|
|
8
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
|
|
9
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
10
|
-
directory: '/test/path',
|
|
11
|
-
root: '/test/path',
|
|
12
|
-
type: 'studio'
|
|
13
|
-
})
|
|
14
|
-
}));
|
|
15
|
-
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
|
|
16
|
-
getCliConfig: vi.fn()
|
|
17
|
-
}));
|
|
18
|
-
vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
|
|
19
|
-
getCliToken: vi.fn().mockResolvedValue('test-token')
|
|
20
|
-
}));
|
|
21
|
-
vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
|
|
22
|
-
getProjectCliClient: vi.fn()
|
|
23
|
-
}));
|
|
24
|
-
const mockGetCliConfig = vi.mocked(getCliConfig);
|
|
25
|
-
const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
|
|
26
6
|
const testProjectId = 'test-project';
|
|
27
7
|
const testDataset = 'production';
|
|
8
|
+
const defaultMocks = {
|
|
9
|
+
cliConfig: {
|
|
10
|
+
api: {
|
|
11
|
+
dataset: testDataset,
|
|
12
|
+
projectId: testProjectId
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
projectRoot: {
|
|
16
|
+
directory: '/test/path',
|
|
17
|
+
path: '/test/path/sanity.config.ts',
|
|
18
|
+
type: 'studio'
|
|
19
|
+
},
|
|
20
|
+
token: 'test-token'
|
|
21
|
+
};
|
|
22
|
+
const mockFetch = vi.hoisted(()=>vi.fn());
|
|
23
|
+
vi.mock('@sanity/cli-core', async ()=>{
|
|
24
|
+
const actual = await vi.importActual('@sanity/cli-core');
|
|
25
|
+
return {
|
|
26
|
+
...actual,
|
|
27
|
+
getProjectCliClient: vi.fn().mockResolvedValue({
|
|
28
|
+
fetch: mockFetch
|
|
29
|
+
})
|
|
30
|
+
};
|
|
31
|
+
});
|
|
28
32
|
describe('#documents:query', ()=>{
|
|
29
33
|
afterEach(()=>{
|
|
30
34
|
vi.clearAllMocks();
|
|
@@ -86,30 +90,15 @@ describe('#documents:query', ()=>{
|
|
|
86
90
|
title: 'Inception'
|
|
87
91
|
}
|
|
88
92
|
];
|
|
89
|
-
|
|
90
|
-
api: {
|
|
91
|
-
dataset: testDataset,
|
|
92
|
-
projectId: testProjectId
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
// Mock the getProjectApiClient to return a mock client with fetch
|
|
96
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
97
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
98
|
-
fetch: mockFetch
|
|
99
|
-
});
|
|
93
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
100
94
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
101
95
|
'*[_type == "movie"]'
|
|
102
|
-
]
|
|
96
|
+
], {
|
|
97
|
+
mocks: defaultMocks
|
|
98
|
+
});
|
|
103
99
|
expect(stdout).toContain('"_id": "movie1"');
|
|
104
100
|
expect(stdout).toContain('"title": "The Matrix"');
|
|
105
101
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
106
|
-
// Verify that getProjectCliClient was called with requireUser: true by default
|
|
107
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
108
|
-
apiVersion: expect.any(String),
|
|
109
|
-
dataset: testDataset,
|
|
110
|
-
projectId: testProjectId,
|
|
111
|
-
requireUser: true
|
|
112
|
-
});
|
|
113
102
|
});
|
|
114
103
|
test('executes query with pretty flag for colorized output', async ()=>{
|
|
115
104
|
const mockResults = [
|
|
@@ -118,16 +107,7 @@ describe('#documents:query', ()=>{
|
|
|
118
107
|
title: 'Test Movie'
|
|
119
108
|
}
|
|
120
109
|
];
|
|
121
|
-
|
|
122
|
-
api: {
|
|
123
|
-
dataset: testDataset,
|
|
124
|
-
projectId: testProjectId
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
128
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
129
|
-
fetch: mockFetch
|
|
130
|
-
});
|
|
110
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
131
111
|
const originalChalkLevel = chalk.level;
|
|
132
112
|
// Force colorization
|
|
133
113
|
chalk.level = 3;
|
|
@@ -137,7 +117,8 @@ describe('#documents:query', ()=>{
|
|
|
137
117
|
], {
|
|
138
118
|
capture: {
|
|
139
119
|
stripAnsi: false
|
|
140
|
-
}
|
|
120
|
+
},
|
|
121
|
+
mocks: defaultMocks
|
|
141
122
|
});
|
|
142
123
|
// Reset chalk level
|
|
143
124
|
chalk.level = originalChalkLevel;
|
|
@@ -155,29 +136,16 @@ describe('#documents:query', ()=>{
|
|
|
155
136
|
}
|
|
156
137
|
];
|
|
157
138
|
const overrideDataset = 'staging';
|
|
158
|
-
|
|
159
|
-
api: {
|
|
160
|
-
dataset: testDataset,
|
|
161
|
-
projectId: testProjectId
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
165
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
166
|
-
fetch: mockFetch
|
|
167
|
-
});
|
|
139
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
168
140
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
169
141
|
'*[_type == "movie"]',
|
|
170
142
|
'--dataset',
|
|
171
143
|
overrideDataset
|
|
172
|
-
]
|
|
144
|
+
], {
|
|
145
|
+
mocks: defaultMocks
|
|
146
|
+
});
|
|
173
147
|
expect(stdout).toContain('"_id": "test"');
|
|
174
148
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
175
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
176
|
-
apiVersion: expect.any(String),
|
|
177
|
-
dataset: overrideDataset,
|
|
178
|
-
projectId: testProjectId,
|
|
179
|
-
requireUser: true
|
|
180
|
-
});
|
|
181
149
|
});
|
|
182
150
|
test('uses project flag to override config', async ()=>{
|
|
183
151
|
const mockResults = [
|
|
@@ -186,30 +154,16 @@ describe('#documents:query', ()=>{
|
|
|
186
154
|
title: 'Test'
|
|
187
155
|
}
|
|
188
156
|
];
|
|
189
|
-
|
|
190
|
-
mockGetCliConfig.mockResolvedValue({
|
|
191
|
-
api: {
|
|
192
|
-
dataset: testDataset,
|
|
193
|
-
projectId: testProjectId
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
197
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
198
|
-
fetch: mockFetch
|
|
199
|
-
});
|
|
157
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
200
158
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
201
159
|
'*[_type == "movie"]',
|
|
202
160
|
'--project',
|
|
203
|
-
|
|
204
|
-
]
|
|
161
|
+
'other-project'
|
|
162
|
+
], {
|
|
163
|
+
mocks: defaultMocks
|
|
164
|
+
});
|
|
205
165
|
expect(stdout).toContain('"_id": "test"');
|
|
206
166
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
207
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
208
|
-
apiVersion: expect.any(String),
|
|
209
|
-
dataset: testDataset,
|
|
210
|
-
projectId: overrideProject,
|
|
211
|
-
requireUser: true
|
|
212
|
-
});
|
|
213
167
|
});
|
|
214
168
|
test('uses anonymous flag to skip authentication', async ()=>{
|
|
215
169
|
const mockResults = [
|
|
@@ -218,29 +172,15 @@ describe('#documents:query', ()=>{
|
|
|
218
172
|
title: 'Test'
|
|
219
173
|
}
|
|
220
174
|
];
|
|
221
|
-
|
|
222
|
-
api: {
|
|
223
|
-
dataset: testDataset,
|
|
224
|
-
projectId: testProjectId
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
228
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
229
|
-
fetch: mockFetch
|
|
230
|
-
});
|
|
175
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
231
176
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
232
177
|
'*[_type == "movie"]',
|
|
233
178
|
'--anonymous'
|
|
234
|
-
]
|
|
179
|
+
], {
|
|
180
|
+
mocks: defaultMocks
|
|
181
|
+
});
|
|
235
182
|
expect(stdout).toContain('"_id": "test"');
|
|
236
183
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
237
|
-
// Verify that getProjectCliClient was called with requireUser: false
|
|
238
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
239
|
-
apiVersion: expect.any(String),
|
|
240
|
-
dataset: testDataset,
|
|
241
|
-
projectId: testProjectId,
|
|
242
|
-
requireUser: false
|
|
243
|
-
});
|
|
244
184
|
});
|
|
245
185
|
test('uses custom API version', async ()=>{
|
|
246
186
|
const mockResults = [
|
|
@@ -250,29 +190,16 @@ describe('#documents:query', ()=>{
|
|
|
250
190
|
}
|
|
251
191
|
];
|
|
252
192
|
const customApiVersion = 'v2021-06-07';
|
|
253
|
-
|
|
254
|
-
api: {
|
|
255
|
-
dataset: testDataset,
|
|
256
|
-
projectId: testProjectId
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
260
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
261
|
-
fetch: mockFetch
|
|
262
|
-
});
|
|
193
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
263
194
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
264
195
|
'*[_type == "movie"]',
|
|
265
196
|
'--api-version',
|
|
266
197
|
customApiVersion
|
|
267
|
-
]
|
|
198
|
+
], {
|
|
199
|
+
mocks: defaultMocks
|
|
200
|
+
});
|
|
268
201
|
expect(stdout).toContain('"_id": "test"');
|
|
269
202
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
270
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
271
|
-
apiVersion: customApiVersion,
|
|
272
|
-
dataset: testDataset,
|
|
273
|
-
projectId: testProjectId,
|
|
274
|
-
requireUser: true
|
|
275
|
-
});
|
|
276
203
|
});
|
|
277
204
|
test('shows warning and uses default API version when not specified', async ()=>{
|
|
278
205
|
const mockResults = [
|
|
@@ -281,87 +208,68 @@ describe('#documents:query', ()=>{
|
|
|
281
208
|
title: 'Test'
|
|
282
209
|
}
|
|
283
210
|
];
|
|
284
|
-
|
|
285
|
-
api: {
|
|
286
|
-
dataset: testDataset,
|
|
287
|
-
projectId: testProjectId
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
291
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
292
|
-
fetch: mockFetch
|
|
293
|
-
});
|
|
211
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
294
212
|
const { stderr, stdout } = await testCommand(QueryDocumentCommand, [
|
|
295
213
|
'*[_type == "movie"]'
|
|
296
|
-
]
|
|
214
|
+
], {
|
|
215
|
+
mocks: defaultMocks
|
|
216
|
+
});
|
|
297
217
|
expect(stderr).toContain('--api-version not specified, using `2025-08-15`');
|
|
298
218
|
expect(stdout).toContain('"_id": "test"');
|
|
299
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
300
|
-
apiVersion: '2025-08-15',
|
|
301
|
-
dataset: testDataset,
|
|
302
|
-
projectId: testProjectId,
|
|
303
|
-
requireUser: true
|
|
304
|
-
});
|
|
305
219
|
});
|
|
306
220
|
test('fails when no project ID is configured or provided', async ()=>{
|
|
307
|
-
mockGetCliConfig.mockResolvedValue({
|
|
308
|
-
api: {
|
|
309
|
-
dataset: testDataset
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
221
|
const { error } = await testCommand(QueryDocumentCommand, [
|
|
313
222
|
'*[_type == "movie"]'
|
|
314
|
-
]
|
|
223
|
+
], {
|
|
224
|
+
mocks: {
|
|
225
|
+
...defaultMocks,
|
|
226
|
+
cliConfig: {
|
|
227
|
+
api: {
|
|
228
|
+
dataset: testDataset
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
315
233
|
expect(error).toBeInstanceOf(Error);
|
|
316
234
|
expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier');
|
|
317
235
|
expect(error?.oclif?.exit).toBe(1);
|
|
318
236
|
});
|
|
319
237
|
test('fails when no dataset is configured or provided', async ()=>{
|
|
320
|
-
mockGetCliConfig.mockResolvedValue({
|
|
321
|
-
api: {
|
|
322
|
-
projectId: testProjectId
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
238
|
const { error } = await testCommand(QueryDocumentCommand, [
|
|
326
239
|
'*[_type == "movie"]'
|
|
327
|
-
]
|
|
240
|
+
], {
|
|
241
|
+
mocks: {
|
|
242
|
+
...defaultMocks,
|
|
243
|
+
cliConfig: {
|
|
244
|
+
api: {
|
|
245
|
+
projectId: testProjectId
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
});
|
|
328
250
|
expect(error).toBeInstanceOf(Error);
|
|
329
251
|
expect(error?.message).toContain('No dataset specified');
|
|
330
252
|
expect(error?.oclif?.exit).toBe(1);
|
|
331
253
|
});
|
|
332
254
|
test('fails when query returns null/undefined', async ()=>{
|
|
333
|
-
|
|
334
|
-
api: {
|
|
335
|
-
dataset: testDataset,
|
|
336
|
-
projectId: testProjectId
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
const mockFetch = vi.fn().mockResolvedValue(null);
|
|
340
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
341
|
-
fetch: mockFetch
|
|
342
|
-
});
|
|
255
|
+
mockFetch.mockResolvedValue(null);
|
|
343
256
|
const { error } = await testCommand(QueryDocumentCommand, [
|
|
344
257
|
'*[_type == "nonexistent"]'
|
|
345
|
-
]
|
|
258
|
+
], {
|
|
259
|
+
mocks: defaultMocks
|
|
260
|
+
});
|
|
346
261
|
expect(error).toBeInstanceOf(Error);
|
|
347
262
|
expect(error?.message).toContain('Query returned no results');
|
|
348
263
|
expect(error?.oclif?.exit).toBe(1);
|
|
349
264
|
});
|
|
350
265
|
test('handles query execution errors', async ()=>{
|
|
351
266
|
const queryError = new Error('Invalid query syntax');
|
|
352
|
-
|
|
353
|
-
api: {
|
|
354
|
-
dataset: testDataset,
|
|
355
|
-
projectId: testProjectId
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
const mockFetch = vi.fn().mockRejectedValue(queryError);
|
|
359
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
360
|
-
fetch: mockFetch
|
|
361
|
-
});
|
|
267
|
+
mockFetch.mockRejectedValue(queryError);
|
|
362
268
|
const { error } = await testCommand(QueryDocumentCommand, [
|
|
363
269
|
'invalid query'
|
|
364
|
-
]
|
|
270
|
+
], {
|
|
271
|
+
mocks: defaultMocks
|
|
272
|
+
});
|
|
365
273
|
expect(error).toBeInstanceOf(Error);
|
|
366
274
|
expect(error?.message).toContain('Invalid GROQ query syntax: Invalid query syntax');
|
|
367
275
|
expect(error?.message).toContain('Query: invalid query');
|
|
@@ -377,27 +285,14 @@ describe('#documents:query', ()=>{
|
|
|
377
285
|
const envApiVersion = 'v2023-01-01';
|
|
378
286
|
// Mock environment variable
|
|
379
287
|
vi.stubEnv('SANITY_CLI_QUERY_API_VERSION', envApiVersion);
|
|
380
|
-
|
|
381
|
-
api: {
|
|
382
|
-
dataset: testDataset,
|
|
383
|
-
projectId: testProjectId
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
const mockFetch = vi.fn().mockResolvedValue(mockResults);
|
|
387
|
-
mockGetProjectCliClient.mockResolvedValue({
|
|
388
|
-
fetch: mockFetch
|
|
389
|
-
});
|
|
288
|
+
mockFetch.mockResolvedValue(mockResults);
|
|
390
289
|
const { stdout } = await testCommand(QueryDocumentCommand, [
|
|
391
290
|
'*[_type == "movie"]'
|
|
392
|
-
]
|
|
291
|
+
], {
|
|
292
|
+
mocks: defaultMocks
|
|
293
|
+
});
|
|
393
294
|
expect(stdout).toContain('"_id": "test"');
|
|
394
295
|
expect(mockFetch).toHaveBeenCalledWith('*[_type == "movie"]');
|
|
395
|
-
expect(mockGetProjectCliClient).toHaveBeenCalledWith({
|
|
396
|
-
apiVersion: envApiVersion,
|
|
397
|
-
dataset: testDataset,
|
|
398
|
-
projectId: testProjectId,
|
|
399
|
-
requireUser: true
|
|
400
|
-
});
|
|
401
296
|
vi.unstubAllEnvs();
|
|
402
297
|
});
|
|
403
298
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/commands/documents/__tests__/query.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {QueryDocumentCommand} from '../query.js'\n\n// Mock the config functions\nvi.mock('../../../../../cli-core/src/config/findProjectRoot.js', () => ({\n findProjectRoot: vi.fn().mockResolvedValue({\n directory: '/test/path',\n root: '/test/path',\n type: 'studio',\n }),\n}))\n\nvi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', () => ({\n getCliConfig: vi.fn(),\n}))\n\nvi.mock('../../../../../cli-core/src/services/getCliToken.js', () => ({\n getCliToken: vi.fn().mockResolvedValue('test-token'),\n}))\n\nvi.mock('../../../../../cli-core/src/services/apiClient.js', () => ({\n getProjectCliClient: vi.fn(),\n}))\n\nconst mockGetCliConfig = vi.mocked(getCliConfig)\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\nconst testProjectId = 'test-project'\nconst testDataset = 'production'\n\ndescribe('#documents:query', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents query', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Query for documents\n\n USAGE\n $ sanity documents query QUERY [--anonymous] [--api-version <value>] [-d\n <value>] [--pretty] [-p <value>]\n\n ARGUMENTS\n QUERY GROQ query to run against the dataset\n\n FLAGS\n -d, --dataset=<value> Dataset to query (overrides config)\n -p, --project=<value> Project ID to query (overrides config)\n --anonymous Send the query without any authorization token\n --api-version=<value> [env: SANITY_CLI_QUERY_API_VERSION] API version to\n use (defaults to 2025-08-15)\n --pretty Colorize JSON output\n\n DESCRIPTION\n Query for documents\n\n EXAMPLES\n Fetch 5 documents of type \"movie\"\n\n $ sanity documents query '*[_type == \"movie\"][0..4]'\n\n Fetch title of the oldest movie in the dataset named \"staging\"\n\n $ sanity documents query '*[_type == \"movie\"]|order(releaseDate \\\n asc)[0]{title}' --dataset staging\n\n Use API version v2021-06-07 and do a query\n\n $ sanity documents query '*[_id == \"header\"] { \"headerText\": \\\n pt::text(body) }' --api-version v2021-06-07\n\n \"\n `)\n })\n\n test('executes query successfully with basic options', async () => {\n const mockResults = [\n {\n _id: 'movie1',\n _type: 'movie',\n title: 'The Matrix',\n },\n {\n _id: 'movie2',\n _type: 'movie',\n title: 'Inception',\n },\n ]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n // Mock the getProjectApiClient to return a mock client with fetch\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"movie1\"')\n expect(stdout).toContain('\"title\": \"The Matrix\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: true by default\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('executes query with pretty flag for colorized output', async () => {\n const mockResults = [{_id: 'test', title: 'Test Movie'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const originalChalkLevel = chalk.level\n // Force colorization\n chalk.level = 3\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--pretty'], {\n capture: {\n stripAnsi: false,\n },\n })\n\n // Reset chalk level\n chalk.level = originalChalkLevel\n\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(stdout).toContain('\"_id\"')\n expect(stdout).toContain('test')\n // eslint-disable-next-line no-control-regex\n expect(stdout).toMatch(/\\u001B\\[\\d+m/)\n })\n\n test('uses dataset flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideDataset = 'staging'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--dataset',\n overrideDataset,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: overrideDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('uses project flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideProject = 'other-project'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--project',\n overrideProject,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: overrideProject,\n requireUser: true,\n })\n })\n\n test('uses anonymous flag to skip authentication', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--anonymous'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n // Verify that getProjectCliClient was called with requireUser: false\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: expect.any(String),\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: false,\n })\n })\n\n test('uses custom API version', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const customApiVersion = 'v2021-06-07'\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, [\n '*[_type == \"movie\"]',\n '--api-version',\n customApiVersion,\n ])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: customApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('shows warning and uses default API version when not specified', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stderr, stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stderr).toContain('--api-version not specified, using `2025-08-15`')\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: '2025-08-15',\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n })\n\n test('fails when no project ID is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no dataset is configured or provided', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n projectId: testProjectId,\n },\n })\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when query returns null/undefined', async () => {\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(null)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"nonexistent\"]'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Query returned no results')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles query execution errors', async () => {\n const queryError = new Error('Invalid query syntax')\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockRejectedValue(queryError)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {error} = await testCommand(QueryDocumentCommand, ['invalid query'])\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Invalid GROQ query syntax: Invalid query syntax')\n expect(error?.message).toContain('Query: invalid query')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('uses environment variable for API version when set', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const envApiVersion = 'v2023-01-01'\n\n // Mock environment variable\n vi.stubEnv('SANITY_CLI_QUERY_API_VERSION', envApiVersion)\n\n mockGetCliConfig.mockResolvedValue({\n api: {\n dataset: testDataset,\n projectId: testProjectId,\n },\n })\n\n const mockFetch = vi.fn().mockResolvedValue(mockResults)\n mockGetProjectCliClient.mockResolvedValue({\n fetch: mockFetch,\n } as never)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'])\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(mockGetProjectCliClient).toHaveBeenCalledWith({\n apiVersion: envApiVersion,\n dataset: testDataset,\n projectId: testProjectId,\n requireUser: true,\n })\n\n vi.unstubAllEnvs()\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","chalk","testCommand","afterEach","describe","expect","test","vi","QueryDocumentCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","getCliToken","mockGetCliConfig","mocked","mockGetProjectCliClient","testProjectId","testDataset","clearAllMocks","stdout","toMatchInlineSnapshot","String","raw","mockResults","_id","_type","title","api","dataset","projectId","mockFetch","fetch","toContain","toHaveBeenCalledWith","apiVersion","any","requireUser","originalChalkLevel","level","capture","stripAnsi","toMatch","overrideDataset","overrideProject","customApiVersion","stderr","error","toBeInstanceOf","Error","message","oclif","exit","toBe","queryError","mockRejectedValue","envApiVersion","stubEnv","unstubAllEnvs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/commands/documents/__tests__/query.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {chalk} from '@sanity/cli-core/ux'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {QueryDocumentCommand} from '../query.js'\n\nconst testProjectId = 'test-project'\nconst testDataset = 'production'\n\nconst defaultMocks = {\n cliConfig: {api: {dataset: testDataset, 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 mockFetch = vi.hoisted(() => vi.fn())\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual('@sanity/cli-core')\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n fetch: mockFetch,\n }),\n }\n})\n\ndescribe('#documents:query', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['documents query', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(String.raw`\n \"Query for documents\n\n USAGE\n $ sanity documents query QUERY [--anonymous] [--api-version <value>] [-d\n <value>] [--pretty] [-p <value>]\n\n ARGUMENTS\n QUERY GROQ query to run against the dataset\n\n FLAGS\n -d, --dataset=<value> Dataset to query (overrides config)\n -p, --project=<value> Project ID to query (overrides config)\n --anonymous Send the query without any authorization token\n --api-version=<value> [env: SANITY_CLI_QUERY_API_VERSION] API version to\n use (defaults to 2025-08-15)\n --pretty Colorize JSON output\n\n DESCRIPTION\n Query for documents\n\n EXAMPLES\n Fetch 5 documents of type \"movie\"\n\n $ sanity documents query '*[_type == \"movie\"][0..4]'\n\n Fetch title of the oldest movie in the dataset named \"staging\"\n\n $ sanity documents query '*[_type == \"movie\"]|order(releaseDate \\\n asc)[0]{title}' --dataset staging\n\n Use API version v2021-06-07 and do a query\n\n $ sanity documents query '*[_id == \"header\"] { \"headerText\": \\\n pt::text(body) }' --api-version v2021-06-07\n\n \"\n `)\n })\n\n test('executes query successfully with basic options', async () => {\n const mockResults = [\n {\n _id: 'movie1',\n _type: 'movie',\n title: 'The Matrix',\n },\n {\n _id: 'movie2',\n _type: 'movie',\n title: 'Inception',\n },\n ]\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('\"_id\": \"movie1\"')\n expect(stdout).toContain('\"title\": \"The Matrix\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n })\n\n test('executes query with pretty flag for colorized output', async () => {\n const mockResults = [{_id: 'test', title: 'Test Movie'}]\n\n mockFetch.mockResolvedValue(mockResults)\n\n const originalChalkLevel = chalk.level\n // Force colorization\n chalk.level = 3\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]', '--pretty'], {\n capture: {\n stripAnsi: false,\n },\n mocks: defaultMocks,\n })\n\n // Reset chalk level\n chalk.level = originalChalkLevel\n\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n expect(stdout).toContain('\"_id\"')\n expect(stdout).toContain('test')\n // eslint-disable-next-line no-control-regex\n expect(stdout).toMatch(/\\u001B\\[\\d+m/)\n })\n\n test('uses dataset flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const overrideDataset = 'staging'\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(\n QueryDocumentCommand,\n ['*[_type == \"movie\"]', '--dataset', overrideDataset],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n })\n\n test('uses project flag to override config', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(\n QueryDocumentCommand,\n ['*[_type == \"movie\"]', '--project', 'other-project'],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n })\n\n test('uses anonymous flag to skip authentication', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(\n QueryDocumentCommand,\n ['*[_type == \"movie\"]', '--anonymous'],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n })\n\n test('uses custom API version', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const customApiVersion = 'v2021-06-07'\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(\n QueryDocumentCommand,\n ['*[_type == \"movie\"]', '--api-version', customApiVersion],\n {\n mocks: defaultMocks,\n },\n )\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n })\n\n test('shows warning and uses default API version when not specified', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stderr, stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'], {\n mocks: defaultMocks,\n })\n\n expect(stderr).toContain('--api-version not specified, using `2025-08-15`')\n expect(stdout).toContain('\"_id\": \"test\"')\n })\n\n test('fails when no project ID is configured or provided', async () => {\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {dataset: testDataset}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('sanity.cli.ts does not contain a project identifier')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when no dataset is configured or provided', async () => {\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: testProjectId}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('No dataset specified')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('fails when query returns null/undefined', async () => {\n mockFetch.mockResolvedValue(null)\n\n const {error} = await testCommand(QueryDocumentCommand, ['*[_type == \"nonexistent\"]'], {\n mocks: defaultMocks,\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Query returned no results')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles query execution errors', async () => {\n const queryError = new Error('Invalid query syntax')\n\n mockFetch.mockRejectedValue(queryError)\n\n const {error} = await testCommand(QueryDocumentCommand, ['invalid query'], {\n mocks: defaultMocks,\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('Invalid GROQ query syntax: Invalid query syntax')\n expect(error?.message).toContain('Query: invalid query')\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('uses environment variable for API version when set', async () => {\n const mockResults = [{_id: 'test', title: 'Test'}]\n const envApiVersion = 'v2023-01-01'\n\n // Mock environment variable\n vi.stubEnv('SANITY_CLI_QUERY_API_VERSION', envApiVersion)\n\n mockFetch.mockResolvedValue(mockResults)\n\n const {stdout} = await testCommand(QueryDocumentCommand, ['*[_type == \"movie\"]'], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toContain('\"_id\": \"test\"')\n expect(mockFetch).toHaveBeenCalledWith('*[_type == \"movie\"]')\n\n vi.unstubAllEnvs()\n })\n})\n"],"names":["runCommand","chalk","testCommand","afterEach","describe","expect","test","vi","QueryDocumentCommand","testProjectId","testDataset","defaultMocks","cliConfig","api","dataset","projectId","projectRoot","directory","path","type","token","mockFetch","hoisted","fn","mock","actual","importActual","getProjectCliClient","mockResolvedValue","fetch","clearAllMocks","stdout","toMatchInlineSnapshot","String","raw","mockResults","_id","_type","title","mocks","toContain","toHaveBeenCalledWith","originalChalkLevel","level","capture","stripAnsi","toMatch","overrideDataset","customApiVersion","stderr","error","toBeInstanceOf","Error","message","oclif","exit","toBe","queryError","mockRejectedValue","envApiVersion","stubEnv","unstubAllEnvs"],"mappings":"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"}
|
|
@@ -24,30 +24,34 @@ vi.mock('@sanity/cli-core/ux', async ()=>{
|
|
|
24
24
|
confirm: mocks.confirm
|
|
25
25
|
};
|
|
26
26
|
});
|
|
27
|
-
vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
|
|
28
|
-
findProjectRoot: vi.fn().mockResolvedValue({
|
|
29
|
-
directory: '/test/path',
|
|
30
|
-
root: '/test/path',
|
|
31
|
-
type: 'studio'
|
|
32
|
-
})
|
|
33
|
-
}));
|
|
34
|
-
vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
|
|
35
|
-
getCliConfig: vi.fn()
|
|
36
|
-
}));
|
|
37
|
-
vi.mock('../../../../../cli-core/src/services/apiClient.js', ()=>({
|
|
38
|
-
getGlobalCliClient: vi.fn().mockResolvedValue({
|
|
39
|
-
config: vi.fn(()=>({
|
|
40
|
-
dataset: 'test-dataset',
|
|
41
|
-
projectId: 'test-project'
|
|
42
|
-
}))
|
|
43
|
-
})
|
|
44
|
-
}));
|
|
45
27
|
vi.mock('../../../actions/documents/validate.js', ()=>({
|
|
46
28
|
validateDocuments: mocks.validate
|
|
47
29
|
}));
|
|
48
30
|
const mockConfirm = mocks.confirm;
|
|
49
31
|
const mockIsFile = mocks.isFile;
|
|
50
32
|
const mockValidate = mocks.validate;
|
|
33
|
+
const testProjectId = 'test-project';
|
|
34
|
+
const testDataset = 'test-dataset';
|
|
35
|
+
const defaultMocks = {
|
|
36
|
+
cliConfig: {
|
|
37
|
+
api: {
|
|
38
|
+
dataset: testDataset,
|
|
39
|
+
projectId: testProjectId
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
globalApiClient: {
|
|
43
|
+
config: vi.fn(()=>({
|
|
44
|
+
dataset: testDataset,
|
|
45
|
+
projectId: testProjectId
|
|
46
|
+
}))
|
|
47
|
+
},
|
|
48
|
+
projectRoot: {
|
|
49
|
+
directory: '/test/path',
|
|
50
|
+
path: '/test/path/sanity.config.ts',
|
|
51
|
+
type: 'studio'
|
|
52
|
+
},
|
|
53
|
+
token: 'test-token'
|
|
54
|
+
};
|
|
51
55
|
describe('#documents:validate', ()=>{
|
|
52
56
|
afterEach(()=>{
|
|
53
57
|
vi.clearAllMocks();
|
|
@@ -122,26 +126,34 @@ describe('#documents:validate', ()=>{
|
|
|
122
126
|
const { error } = await testCommand(ValidateDocumentsCommand, [
|
|
123
127
|
'--level',
|
|
124
128
|
'critical'
|
|
125
|
-
]
|
|
129
|
+
], {
|
|
130
|
+
mocks: defaultMocks
|
|
131
|
+
});
|
|
126
132
|
expect(error?.message).toContain('Expected --level=critical to be one of: error, warning, info');
|
|
127
133
|
});
|
|
128
134
|
test('throws error if user enters non integer max-custom-validation-concurrency flag', async ()=>{
|
|
129
135
|
const { error } = await testCommand(ValidateDocumentsCommand, [
|
|
130
136
|
'--max-custom-validation-concurrency',
|
|
131
137
|
'abc'
|
|
132
|
-
]
|
|
138
|
+
], {
|
|
139
|
+
mocks: defaultMocks
|
|
140
|
+
});
|
|
133
141
|
expect(error?.message).toContain('Expected an integer but received: abc');
|
|
134
142
|
});
|
|
135
143
|
test('throws error if user enters non integer max-fetch-concurrency flag', async ()=>{
|
|
136
144
|
const { error } = await testCommand(ValidateDocumentsCommand, [
|
|
137
145
|
'--max-fetch-concurrency',
|
|
138
146
|
'xyz'
|
|
139
|
-
]
|
|
147
|
+
], {
|
|
148
|
+
mocks: defaultMocks
|
|
149
|
+
});
|
|
140
150
|
expect(error?.message).toContain('Expected an integer but received: xyz');
|
|
141
151
|
});
|
|
142
152
|
test('prompts user to confirm by default and exits if they do not want to continue', async ()=>{
|
|
143
153
|
mockConfirm.mockResolvedValue(false);
|
|
144
|
-
const { stdout } = await testCommand(ValidateDocumentsCommand, []
|
|
154
|
+
const { stdout } = await testCommand(ValidateDocumentsCommand, [], {
|
|
155
|
+
mocks: defaultMocks
|
|
156
|
+
});
|
|
145
157
|
expect(stdout).toMatchInlineSnapshot(`
|
|
146
158
|
"⚠ Warning: This command downloads all documents from your dataset and processes them through your local schema within a simulated browser environment.
|
|
147
159
|
|
|
@@ -163,14 +175,18 @@ describe('#documents:validate', ()=>{
|
|
|
163
175
|
test('skips confirm if user uses yes flag', async ()=>{
|
|
164
176
|
await testCommand(ValidateDocumentsCommand, [
|
|
165
177
|
'--y'
|
|
166
|
-
]
|
|
178
|
+
], {
|
|
179
|
+
mocks: defaultMocks
|
|
180
|
+
});
|
|
167
181
|
expect(mockConfirm).not.toHaveBeenCalled();
|
|
168
182
|
});
|
|
169
183
|
test('exits if format is incorrect value', async ()=>{
|
|
170
184
|
const { error } = await testCommand(ValidateDocumentsCommand, [
|
|
171
185
|
'--format',
|
|
172
186
|
'xml'
|
|
173
|
-
]
|
|
187
|
+
], {
|
|
188
|
+
mocks: defaultMocks
|
|
189
|
+
});
|
|
174
190
|
expect(error?.message).toContain("Did not recognize format 'xml'. Available formats are 'json', 'ndjson', and 'pretty'");
|
|
175
191
|
});
|
|
176
192
|
test('exits if user inputs invalid file path in flag', async ()=>{
|
|
@@ -178,7 +194,9 @@ describe('#documents:validate', ()=>{
|
|
|
178
194
|
const { error } = await testCommand(ValidateDocumentsCommand, [
|
|
179
195
|
'--file',
|
|
180
196
|
'/non/existent/file.ndjson'
|
|
181
|
-
]
|
|
197
|
+
], {
|
|
198
|
+
mocks: defaultMocks
|
|
199
|
+
});
|
|
182
200
|
expect(error?.message).toContain("'--file' must point to a valid ndjson file or tarball");
|
|
183
201
|
});
|
|
184
202
|
test('validateDocuments is called with the correct params', async ()=>{
|
|
@@ -197,9 +215,10 @@ describe('#documents:validate', ()=>{
|
|
|
197
215
|
'50',
|
|
198
216
|
'--file',
|
|
199
217
|
'/path/to/file.ndjson'
|
|
200
|
-
]
|
|
218
|
+
], {
|
|
219
|
+
mocks: defaultMocks
|
|
220
|
+
});
|
|
201
221
|
expect(mockValidate).toHaveBeenCalledWith({
|
|
202
|
-
clientConfig: expect.any(Object),
|
|
203
222
|
dataset: 'my-dataset',
|
|
204
223
|
level: 'info',
|
|
205
224
|
maxCustomValidationConcurrency: 10,
|
|
@@ -213,12 +232,16 @@ describe('#documents:validate', ()=>{
|
|
|
213
232
|
});
|
|
214
233
|
test('exits with code 1 if validateDocuments returns overall level as error', async ()=>{
|
|
215
234
|
mockValidate.mockResolvedValue('error');
|
|
216
|
-
const { error } = await testCommand(ValidateDocumentsCommand, []
|
|
235
|
+
const { error } = await testCommand(ValidateDocumentsCommand, [], {
|
|
236
|
+
mocks: defaultMocks
|
|
237
|
+
});
|
|
217
238
|
expect(error?.oclif?.exit).toBe(1);
|
|
218
239
|
});
|
|
219
240
|
test('exits with code 0 if validateDocuments does not return overall level as error', async ()=>{
|
|
220
241
|
mockValidate.mockResolvedValue('warning');
|
|
221
|
-
const { error } = await testCommand(ValidateDocumentsCommand, []
|
|
242
|
+
const { error } = await testCommand(ValidateDocumentsCommand, [], {
|
|
243
|
+
mocks: defaultMocks
|
|
244
|
+
});
|
|
222
245
|
expect(error).toBe(undefined);
|
|
223
246
|
});
|
|
224
247
|
});
|