@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.
Files changed (291) hide show
  1. package/dist/actions/dev/startStudioDevServer.js +3 -8
  2. package/dist/actions/dev/startStudioDevServer.js.map +1 -1
  3. package/dist/actions/dev/types.d.ts +1 -3
  4. package/dist/actions/dev/types.js.map +1 -1
  5. package/dist/actions/documents/validate.d.ts +0 -2
  6. package/dist/actions/documents/validate.js +21 -1
  7. package/dist/actions/documents/validate.js.map +1 -1
  8. package/dist/actions/exec/execScript.js +1 -1
  9. package/dist/actions/exec/execScript.js.map +1 -1
  10. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js +1 -1
  11. package/dist/actions/graphql/__tests__/getGraphQLAPIs.test.js.map +1 -1
  12. package/dist/actions/graphql/getGraphQLAPIs.js +1 -1
  13. package/dist/actions/graphql/getGraphQLAPIs.js.map +1 -1
  14. package/dist/actions/manifest/extractManifest.js +1 -4
  15. package/dist/actions/manifest/extractManifest.js.map +1 -1
  16. package/dist/actions/schema/deleteSchemaAction.d.ts +13 -5
  17. package/dist/actions/schema/deleteSchemaAction.js +12 -17
  18. package/dist/actions/schema/deleteSchemaAction.js.map +1 -1
  19. package/dist/actions/schema/deploySchemas.d.ts +15 -0
  20. package/dist/actions/schema/deploySchemas.js +98 -0
  21. package/dist/actions/schema/deploySchemas.js.map +1 -0
  22. package/dist/actions/schema/listSchemas.d.ts +12 -0
  23. package/dist/actions/schema/listSchemas.js +119 -0
  24. package/dist/actions/schema/listSchemas.js.map +1 -0
  25. package/dist/actions/schema/schemaStoreTypes.d.ts +0 -11
  26. package/dist/actions/schema/schemaStoreTypes.js.map +1 -1
  27. package/dist/actions/schema/utils/debug.d.ts +2 -0
  28. package/dist/actions/schema/utils/debug.js +5 -0
  29. package/dist/actions/schema/utils/debug.js.map +1 -0
  30. package/dist/actions/schema/utils/manifestExtractor.d.ts +3 -8
  31. package/dist/actions/schema/utils/manifestExtractor.js +12 -17
  32. package/dist/actions/schema/utils/manifestExtractor.js.map +1 -1
  33. package/dist/actions/schema/utils/manifestReader.d.ts +2 -9
  34. package/dist/actions/schema/utils/manifestReader.js +6 -12
  35. package/dist/actions/schema/utils/manifestReader.js.map +1 -1
  36. package/dist/actions/schema/utils/schemaStoreOutStrings.d.ts +0 -1
  37. package/dist/actions/schema/utils/schemaStoreOutStrings.js +1 -1
  38. package/dist/actions/schema/utils/schemaStoreOutStrings.js.map +1 -1
  39. package/dist/actions/schema/utils/schemaStoreValidation.d.ts +10 -62
  40. package/dist/actions/schema/utils/schemaStoreValidation.js +38 -125
  41. package/dist/actions/schema/utils/schemaStoreValidation.js.map +1 -1
  42. package/dist/actions/schema/utils/uniqByProjectIdDataset.d.ts +14 -0
  43. package/dist/actions/schema/utils/uniqByProjectIdDataset.js +9 -0
  44. package/dist/actions/schema/utils/uniqByProjectIdDataset.js.map +1 -0
  45. package/dist/actions/users/getMembersForProject.d.ts +1 -3
  46. package/dist/actions/users/getMembersForProject.js +6 -17
  47. package/dist/actions/users/getMembersForProject.js.map +1 -1
  48. package/dist/actions/users/types.d.ts +0 -11
  49. package/dist/actions/users/types.js.map +1 -1
  50. package/dist/commands/__tests__/debug.test.js +113 -220
  51. package/dist/commands/__tests__/debug.test.js.map +1 -1
  52. package/dist/commands/__tests__/deploy.test.js +325 -293
  53. package/dist/commands/__tests__/deploy.test.js.map +1 -1
  54. package/dist/commands/__tests__/dev.test.js +62 -19
  55. package/dist/commands/__tests__/dev.test.js.map +1 -1
  56. package/dist/commands/__tests__/init/init.authentication.test.js +40 -27
  57. package/dist/commands/__tests__/init/init.authentication.test.js.map +1 -1
  58. package/dist/commands/__tests__/init/init.create-new-project.test.js +84 -85
  59. package/dist/commands/__tests__/init/init.create-new-project.test.js.map +1 -1
  60. package/dist/commands/__tests__/init/init.plan.test.js +103 -44
  61. package/dist/commands/__tests__/init/init.plan.test.js.map +1 -1
  62. package/dist/commands/__tests__/init/init.setup.test.js +85 -29
  63. package/dist/commands/__tests__/init/init.setup.test.js.map +1 -1
  64. package/dist/commands/__tests__/install.test.js +46 -22
  65. package/dist/commands/__tests__/install.test.js.map +1 -1
  66. package/dist/commands/__tests__/logout.test.js +8 -5
  67. package/dist/commands/__tests__/logout.test.js.map +1 -1
  68. package/dist/commands/__tests__/manage.test.js +29 -24
  69. package/dist/commands/__tests__/manage.test.js.map +1 -1
  70. package/dist/commands/__tests__/versions.test.js +22 -14
  71. package/dist/commands/__tests__/versions.test.js.map +1 -1
  72. package/dist/commands/backup/__tests__/disable.test.js +72 -75
  73. package/dist/commands/backup/__tests__/disable.test.js.map +1 -1
  74. package/dist/commands/backup/__tests__/download.test.js +166 -77
  75. package/dist/commands/backup/__tests__/download.test.js.map +1 -1
  76. package/dist/commands/backup/__tests__/enable.test.js +109 -140
  77. package/dist/commands/backup/__tests__/enable.test.js.map +1 -1
  78. package/dist/commands/backup/__tests__/list.test.js +84 -75
  79. package/dist/commands/backup/__tests__/list.test.js.map +1 -1
  80. package/dist/commands/backup/disable.js +5 -11
  81. package/dist/commands/backup/disable.js.map +1 -1
  82. package/dist/commands/backup/enable.js +5 -11
  83. package/dist/commands/backup/enable.js.map +1 -1
  84. package/dist/commands/backup/list.js +7 -8
  85. package/dist/commands/backup/list.js.map +1 -1
  86. package/dist/commands/cors/__tests__/add.test.js +68 -38
  87. package/dist/commands/cors/__tests__/add.test.js.map +1 -1
  88. package/dist/commands/cors/__tests__/delete.test.js +52 -37
  89. package/dist/commands/cors/__tests__/delete.test.js.map +1 -1
  90. package/dist/commands/cors/__tests__/list.test.js +80 -57
  91. package/dist/commands/cors/__tests__/list.test.js.map +1 -1
  92. package/dist/commands/cors/add.js +5 -13
  93. package/dist/commands/cors/add.js.map +1 -1
  94. package/dist/commands/cors/delete.js +7 -15
  95. package/dist/commands/cors/delete.js.map +1 -1
  96. package/dist/commands/cors/list.js +2 -10
  97. package/dist/commands/cors/list.js.map +1 -1
  98. package/dist/commands/dataset/__tests__/copy.test.js +197 -89
  99. package/dist/commands/dataset/__tests__/copy.test.js.map +1 -1
  100. package/dist/commands/dataset/__tests__/create.test.js +147 -117
  101. package/dist/commands/dataset/__tests__/create.test.js.map +1 -1
  102. package/dist/commands/dataset/__tests__/delete.test.js +75 -68
  103. package/dist/commands/dataset/__tests__/delete.test.js.map +1 -1
  104. package/dist/commands/dataset/__tests__/export.test.js +123 -83
  105. package/dist/commands/dataset/__tests__/export.test.js.map +1 -1
  106. package/dist/commands/dataset/__tests__/list.test.js +107 -65
  107. package/dist/commands/dataset/__tests__/list.test.js.map +1 -1
  108. package/dist/commands/dataset/alias/__tests__/create.test.js +114 -74
  109. package/dist/commands/dataset/alias/__tests__/create.test.js.map +1 -1
  110. package/dist/commands/dataset/alias/__tests__/delete.test.js +40 -29
  111. package/dist/commands/dataset/alias/__tests__/delete.test.js.map +1 -1
  112. package/dist/commands/dataset/alias/__tests__/link.test.js +114 -74
  113. package/dist/commands/dataset/alias/__tests__/link.test.js.map +1 -1
  114. package/dist/commands/dataset/alias/__tests__/unlink.test.js +44 -29
  115. package/dist/commands/dataset/alias/__tests__/unlink.test.js.map +1 -1
  116. package/dist/commands/dataset/export.js +4 -4
  117. package/dist/commands/dataset/export.js.map +1 -1
  118. package/dist/commands/dataset/visibility/__tests__/get.test.js +48 -67
  119. package/dist/commands/dataset/visibility/__tests__/get.test.js.map +1 -1
  120. package/dist/commands/dataset/visibility/__tests__/set.test.js +76 -123
  121. package/dist/commands/dataset/visibility/__tests__/set.test.js.map +1 -1
  122. package/dist/commands/dev.js +0 -1
  123. package/dist/commands/dev.js.map +1 -1
  124. package/dist/commands/docs/__tests__/search.test.js +8 -7
  125. package/dist/commands/docs/__tests__/search.test.js.map +1 -1
  126. package/dist/commands/documents/__tests__/create.test.js +328 -265
  127. package/dist/commands/documents/__tests__/create.test.js.map +1 -1
  128. package/dist/commands/documents/__tests__/delete.test.js +119 -87
  129. package/dist/commands/documents/__tests__/delete.test.js.map +1 -1
  130. package/dist/commands/documents/__tests__/get.test.js +68 -95
  131. package/dist/commands/documents/__tests__/get.test.js.map +1 -1
  132. package/dist/commands/documents/__tests__/query.test.js +84 -189
  133. package/dist/commands/documents/__tests__/query.test.js.map +1 -1
  134. package/dist/commands/documents/__tests__/validate.test.js +52 -29
  135. package/dist/commands/documents/__tests__/validate.test.js.map +1 -1
  136. package/dist/commands/documents/create.d.ts +1 -0
  137. package/dist/commands/documents/create.js +10 -9
  138. package/dist/commands/documents/create.js.map +1 -1
  139. package/dist/commands/documents/delete.js +2 -3
  140. package/dist/commands/documents/delete.js.map +1 -1
  141. package/dist/commands/documents/get.js +2 -3
  142. package/dist/commands/documents/get.js.map +1 -1
  143. package/dist/commands/documents/query.js +2 -3
  144. package/dist/commands/documents/query.js.map +1 -1
  145. package/dist/commands/documents/validate.js +0 -20
  146. package/dist/commands/documents/validate.js.map +1 -1
  147. package/dist/commands/graphql/__tests__/list.test.js +57 -45
  148. package/dist/commands/graphql/__tests__/list.test.js.map +1 -1
  149. package/dist/commands/graphql/__tests__/undeploy.test.js +85 -59
  150. package/dist/commands/graphql/__tests__/undeploy.test.js.map +1 -1
  151. package/dist/commands/graphql/list.js +2 -2
  152. package/dist/commands/graphql/list.js.map +1 -1
  153. package/dist/commands/graphql/undeploy.js +4 -9
  154. package/dist/commands/graphql/undeploy.js.map +1 -1
  155. package/dist/commands/hook/__tests__/attempt.test.js +48 -33
  156. package/dist/commands/hook/__tests__/attempt.test.js.map +1 -1
  157. package/dist/commands/hook/__tests__/create.test.js +49 -51
  158. package/dist/commands/hook/__tests__/create.test.js.map +1 -1
  159. package/dist/commands/hook/__tests__/delete.test.js +43 -30
  160. package/dist/commands/hook/__tests__/delete.test.js.map +1 -1
  161. package/dist/commands/hook/__tests__/list.test.js +38 -31
  162. package/dist/commands/hook/__tests__/list.test.js.map +1 -1
  163. package/dist/commands/hook/__tests__/logs.test.js +68 -40
  164. package/dist/commands/hook/__tests__/logs.test.js.map +1 -1
  165. package/dist/commands/hook/create.js +2 -6
  166. package/dist/commands/hook/create.js.map +1 -1
  167. package/dist/commands/hook/delete.js +5 -17
  168. package/dist/commands/hook/delete.js.map +1 -1
  169. package/dist/commands/hook/list.js +2 -8
  170. package/dist/commands/hook/list.js.map +1 -1
  171. package/dist/commands/manifest/__tests__/extract.test.js +22 -13
  172. package/dist/commands/manifest/__tests__/extract.test.js.map +1 -1
  173. package/dist/commands/media/__tests__/create-aspect.test.js +41 -28
  174. package/dist/commands/media/__tests__/create-aspect.test.js.map +1 -1
  175. package/dist/commands/media/__tests__/delete-aspect.test.js +44 -35
  176. package/dist/commands/media/__tests__/delete-aspect.test.js.map +1 -1
  177. package/dist/commands/media/__tests__/deploy-aspect.test.js +67 -80
  178. package/dist/commands/media/__tests__/deploy-aspect.test.js.map +1 -1
  179. package/dist/commands/media/__tests__/export.test.js +365 -66
  180. package/dist/commands/media/__tests__/export.test.js.map +1 -1
  181. package/dist/commands/media/__tests__/import.test.js +171 -105
  182. package/dist/commands/media/__tests__/import.test.js.map +1 -1
  183. package/dist/commands/media/export.js +2 -2
  184. package/dist/commands/media/export.js.map +1 -1
  185. package/dist/commands/media/import.js +2 -2
  186. package/dist/commands/media/import.js.map +1 -1
  187. package/dist/commands/projects/__tests__/list.test.js +5 -4
  188. package/dist/commands/projects/__tests__/list.test.js.map +1 -1
  189. package/dist/commands/projects/list.js +2 -6
  190. package/dist/commands/projects/list.js.map +1 -1
  191. package/dist/commands/schema/__tests__/delete.test.js +396 -151
  192. package/dist/commands/schema/__tests__/delete.test.js.map +1 -1
  193. package/dist/commands/schema/__tests__/deploy.test.js +348 -0
  194. package/dist/commands/schema/__tests__/deploy.test.js.map +1 -0
  195. package/dist/commands/schema/__tests__/extract.test.js +19 -11
  196. package/dist/commands/schema/__tests__/extract.test.js.map +1 -1
  197. package/dist/commands/schema/__tests__/list.test.js +399 -0
  198. package/dist/commands/schema/__tests__/list.test.js.map +1 -0
  199. package/dist/commands/schema/__tests__/validate.test.js +27 -10
  200. package/dist/commands/schema/__tests__/validate.test.js.map +1 -1
  201. package/dist/commands/schema/delete.d.ts +1 -1
  202. package/dist/commands/schema/delete.js +20 -23
  203. package/dist/commands/schema/delete.js.map +1 -1
  204. package/dist/commands/schema/deploy.d.ts +16 -0
  205. package/dist/commands/schema/deploy.js +98 -0
  206. package/dist/commands/schema/deploy.js.map +1 -0
  207. package/dist/commands/schema/list.d.ts +15 -0
  208. package/dist/commands/schema/list.js +104 -0
  209. package/dist/commands/schema/list.js.map +1 -0
  210. package/dist/commands/telemetry/__tests__/disable.test.js +7 -5
  211. package/dist/commands/telemetry/__tests__/disable.test.js.map +1 -1
  212. package/dist/commands/telemetry/__tests__/enable.test.js +7 -5
  213. package/dist/commands/telemetry/__tests__/enable.test.js.map +1 -1
  214. package/dist/commands/telemetry/__tests__/status.test.js +7 -5
  215. package/dist/commands/telemetry/__tests__/status.test.js.map +1 -1
  216. package/dist/commands/tokens/__tests__/add.test.js +55 -40
  217. package/dist/commands/tokens/__tests__/add.test.js.map +1 -1
  218. package/dist/commands/tokens/__tests__/delete.test.js +72 -42
  219. package/dist/commands/tokens/__tests__/delete.test.js.map +1 -1
  220. package/dist/commands/tokens/__tests__/list.test.js +87 -60
  221. package/dist/commands/tokens/__tests__/list.test.js.map +1 -1
  222. package/dist/commands/tokens/add.js +3 -5
  223. package/dist/commands/tokens/add.js.map +1 -1
  224. package/dist/commands/users/__tests__/invite.test.js +100 -79
  225. package/dist/commands/users/__tests__/invite.test.js.map +1 -1
  226. package/dist/commands/users/__tests__/list.test.js +186 -180
  227. package/dist/commands/users/__tests__/list.test.js.map +1 -1
  228. package/dist/commands/users/invite.js +6 -17
  229. package/dist/commands/users/invite.js.map +1 -1
  230. package/dist/commands/users/list.js +4 -7
  231. package/dist/commands/users/list.js.map +1 -1
  232. package/dist/config/createCliConfig.d.ts +4 -4
  233. package/dist/services/backup.d.ts +8 -0
  234. package/dist/services/backup.js +19 -0
  235. package/dist/services/backup.js.map +1 -1
  236. package/dist/services/cors.d.ts +23 -0
  237. package/dist/services/cors.js +38 -0
  238. package/dist/services/cors.js.map +1 -0
  239. package/dist/services/graphql.d.ts +7 -0
  240. package/dist/services/graphql.js +11 -0
  241. package/dist/services/graphql.js.map +1 -1
  242. package/dist/services/hooks.d.ts +2 -0
  243. package/dist/services/hooks.js +19 -0
  244. package/dist/services/hooks.js.map +1 -1
  245. package/dist/services/organizations.d.ts +1 -1
  246. package/dist/services/organizations.js +1 -1
  247. package/dist/services/organizations.js.map +1 -1
  248. package/dist/services/projects.d.ts +11 -0
  249. package/dist/services/projects.js +41 -0
  250. package/dist/services/projects.js.map +1 -1
  251. package/dist/services/schemas.d.ts +4 -0
  252. package/dist/services/schemas.js +40 -0
  253. package/dist/services/schemas.js.map +1 -0
  254. package/dist/services/user.d.ts +8 -0
  255. package/dist/services/user.js +15 -2
  256. package/dist/services/user.js.map +1 -1
  257. package/dist/util/__tests__/getCliVersion.test.js +2 -2
  258. package/dist/util/__tests__/getCliVersion.test.js.map +1 -1
  259. package/dist/util/errorMessages.d.ts +1 -0
  260. package/dist/util/errorMessages.js +1 -0
  261. package/dist/util/errorMessages.js.map +1 -1
  262. package/dist/util/getCliVersion.js +1 -1
  263. package/dist/util/getCliVersion.js.map +1 -1
  264. package/dist/util/readPackageJson.d.ts +1 -15
  265. package/dist/util/readPackageJson.js +1 -1
  266. package/dist/util/readPackageJson.js.map +1 -1
  267. package/dist/util/uniqBy.d.ts +1 -0
  268. package/dist/util/uniqBy.js +14 -0
  269. package/dist/util/uniqBy.js.map +1 -0
  270. package/oclif.manifest.json +172 -27
  271. package/package.json +27 -28
  272. package/dist/actions/cors/constants.d.ts +0 -1
  273. package/dist/actions/cors/constants.js +0 -3
  274. package/dist/actions/cors/constants.js.map +0 -1
  275. package/dist/actions/cors/types.d.ts +0 -9
  276. package/dist/actions/cors/types.js +0 -3
  277. package/dist/actions/cors/types.js.map +0 -1
  278. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js +0 -294
  279. package/dist/actions/schema/__tests__/deleteSchemaAction.test.js.map +0 -1
  280. package/dist/actions/schema/schemaStoreConstants.d.ts +0 -1
  281. package/dist/actions/schema/schemaStoreConstants.js +0 -4
  282. package/dist/actions/schema/schemaStoreConstants.js.map +0 -1
  283. package/dist/actions/schema/utils/schemaActionHelpers.d.ts +0 -1
  284. package/dist/actions/schema/utils/schemaActionHelpers.js +0 -5
  285. package/dist/actions/schema/utils/schemaActionHelpers.js.map +0 -1
  286. package/dist/actions/schema/utils/schemaApiClient.d.ts +0 -6
  287. package/dist/actions/schema/utils/schemaApiClient.js +0 -17
  288. package/dist/actions/schema/utils/schemaApiClient.js.map +0 -1
  289. package/dist/actions/users/apiVersion.d.ts +0 -6
  290. package/dist/actions/users/apiVersion.js +0 -7
  291. package/dist/actions/users/apiVersion.js.map +0 -1
@@ -1,58 +1,49 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig, getProjectCliClient } from '@sanity/cli-core';
3
- import { testCommand } from '@sanity/cli-test';
2
+ import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
3
+ import nock from 'nock';
4
4
  import { afterEach, describe, expect, test, vi } from 'vitest';
5
+ import { DATASET_API_VERSION } from '../../../services/datasets.js';
5
6
  import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
6
7
  import { ListDatasetCommand } from '../list.js';
7
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
8
- findProjectRoot: vi.fn().mockResolvedValue({
9
- directory: '/test/path',
10
- root: '/test/path',
11
- type: 'studio'
12
- })
13
- }));
14
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
15
- getCliConfig: vi.fn().mockResolvedValue({
16
- api: {
17
- projectId: 'test-project'
18
- }
19
- })
20
- }));
21
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
22
- getCliToken: vi.fn().mockResolvedValue('test-token')
23
- }));
24
- vi.mock('../../../../../cli-core/src/services/apiClient.js', async (importOriginal)=>{
25
- const actual = await importOriginal();
8
+ const mockListDatasets = vi.hoisted(()=>vi.fn());
9
+ const testProjectId = vi.hoisted(()=>'test-project');
10
+ const testToken = vi.hoisted(()=>'test-token');
11
+ vi.mock('@sanity/cli-core', async ()=>{
12
+ const actual = await vi.importActual('@sanity/cli-core');
13
+ const testClient = createTestClient({
14
+ apiVersion: 'v2025-09-16',
15
+ projectId: testProjectId,
16
+ token: testToken
17
+ });
26
18
  return {
27
19
  ...actual,
28
- getProjectCliClient: vi.fn()
20
+ getProjectCliClient: vi.fn().mockResolvedValue({
21
+ datasets: {
22
+ list: mockListDatasets
23
+ },
24
+ request: testClient.request
25
+ })
29
26
  };
30
27
  });
31
- const mockGetProjectCliClient = vi.mocked(getProjectCliClient);
32
- const setupMockClient = (datasets = [
33
- {
34
- name: 'production'
28
+ const defaultMocks = {
29
+ cliConfig: {
30
+ api: {
31
+ projectId: testProjectId
32
+ }
35
33
  },
36
- {
37
- name: 'test'
38
- }
39
- ], aliases = [
40
- {
41
- datasetName: 'production',
42
- name: 'prod'
43
- }
44
- ], aliasError)=>{
45
- const mockRequest = aliasError ? vi.fn().mockRejectedValue(aliasError) : vi.fn().mockResolvedValue(aliases);
46
- mockGetProjectCliClient.mockResolvedValue({
47
- datasets: {
48
- list: vi.fn().mockResolvedValue(datasets)
49
- },
50
- request: mockRequest
51
- });
34
+ projectRoot: {
35
+ directory: '/test/path',
36
+ path: '/test/path/sanity.config.ts',
37
+ type: 'studio'
38
+ },
39
+ token: testToken
52
40
  };
53
41
  describe('#dataset:list', ()=>{
54
42
  afterEach(()=>{
55
43
  vi.clearAllMocks();
44
+ const pending = nock.pendingMocks();
45
+ nock.cleanAll();
46
+ expect(pending, 'pending mocks').toEqual([]);
56
47
  });
57
48
  test('--help works', async ()=>{
58
49
  const { stdout } = await runCommand([
@@ -77,7 +68,7 @@ describe('#dataset:list', ()=>{
77
68
  `);
78
69
  });
79
70
  test('lists datasets successfully', async ()=>{
80
- setupMockClient([
71
+ mockListDatasets.mockResolvedValue([
81
72
  {
82
73
  name: 'production'
83
74
  },
@@ -87,19 +78,33 @@ describe('#dataset:list', ()=>{
87
78
  {
88
79
  name: 'development'
89
80
  }
90
- ], []);
91
- const { stdout } = await testCommand(ListDatasetCommand, []);
81
+ ]);
82
+ mockApi({
83
+ apiHost: `https://${testProjectId}.api.sanity.io`,
84
+ apiVersion: DATASET_API_VERSION,
85
+ method: 'get',
86
+ uri: `/aliases`
87
+ }).reply(200, []);
88
+ const { stdout } = await testCommand(ListDatasetCommand, [], {
89
+ mocks: defaultMocks
90
+ });
92
91
  expect(stdout).toBe('production\ntest\ndevelopment\n');
93
92
  });
94
93
  test('lists datasets and aliases successfully', async ()=>{
95
- setupMockClient([
94
+ mockListDatasets.mockResolvedValue([
96
95
  {
97
96
  name: 'production'
98
97
  },
99
98
  {
100
99
  name: 'test'
101
100
  }
102
- ], [
101
+ ]);
102
+ mockApi({
103
+ apiHost: `https://${testProjectId}.api.sanity.io`,
104
+ apiVersion: DATASET_API_VERSION,
105
+ method: 'get',
106
+ uri: `/aliases`
107
+ }).reply(200, [
103
108
  {
104
109
  datasetName: 'production',
105
110
  name: 'prod'
@@ -109,15 +114,23 @@ describe('#dataset:list', ()=>{
109
114
  name: 'staging'
110
115
  }
111
116
  ]);
112
- const { stdout } = await testCommand(ListDatasetCommand, []);
117
+ const { stdout } = await testCommand(ListDatasetCommand, [], {
118
+ mocks: defaultMocks
119
+ });
113
120
  expect(stdout).toBe('production\ntest\n~prod -> production\n~staging -> test\n');
114
121
  });
115
122
  test('handles unlinked aliases', async ()=>{
116
- setupMockClient([
123
+ mockListDatasets.mockResolvedValue([
117
124
  {
118
125
  name: 'production'
119
126
  }
120
- ], [
127
+ ]);
128
+ mockApi({
129
+ apiHost: `https://${testProjectId}.api.sanity.io`,
130
+ apiVersion: DATASET_API_VERSION,
131
+ method: 'get',
132
+ uri: `/aliases`
133
+ }).reply(200, [
121
134
  {
122
135
  datasetName: 'production',
123
136
  name: 'prod'
@@ -127,30 +140,55 @@ describe('#dataset:list', ()=>{
127
140
  name: 'old'
128
141
  }
129
142
  ]);
130
- const { stdout } = await testCommand(ListDatasetCommand, []);
143
+ const { stdout } = await testCommand(ListDatasetCommand, [], {
144
+ mocks: defaultMocks
145
+ });
131
146
  expect(stdout).toBe('production\n~prod -> production\n~old -> <unlinked>\n');
132
147
  });
133
148
  test('handles empty dataset list', async ()=>{
134
- setupMockClient([], []);
135
- const { stdout } = await testCommand(ListDatasetCommand, []);
149
+ mockListDatasets.mockResolvedValue([]);
150
+ mockApi({
151
+ apiHost: `https://${testProjectId}.api.sanity.io`,
152
+ apiVersion: DATASET_API_VERSION,
153
+ method: 'get',
154
+ uri: `/aliases`
155
+ }).reply(200, []);
156
+ const { stdout } = await testCommand(ListDatasetCommand, [], {
157
+ mocks: defaultMocks
158
+ });
136
159
  expect(stdout).toBe('No datasets found for this project.\n');
137
160
  });
138
161
  test('handles alias fetch failure gracefully', async ()=>{
139
- setupMockClient([
162
+ mockListDatasets.mockResolvedValue([
140
163
  {
141
164
  name: 'production'
142
165
  }
143
- ], [], new Error('Alias service unavailable'));
144
- const { stdout } = await testCommand(ListDatasetCommand, []);
166
+ ]);
167
+ mockApi({
168
+ apiHost: `https://${testProjectId}.api.sanity.io`,
169
+ apiVersion: DATASET_API_VERSION,
170
+ method: 'get',
171
+ uri: `/aliases`
172
+ }).reply(500, {
173
+ error: 'Alias service unavailable',
174
+ message: 'Alias service unavailable'
175
+ });
176
+ const { stdout } = await testCommand(ListDatasetCommand, [], {
177
+ mocks: defaultMocks
178
+ });
145
179
  expect(stdout).toBe('production\n');
146
180
  });
147
181
  test('shows error when no project ID is found', async ()=>{
148
- vi.mocked(getCliConfig).mockResolvedValueOnce({
149
- api: {
150
- projectId: undefined
182
+ const { error } = await testCommand(ListDatasetCommand, [], {
183
+ mocks: {
184
+ ...defaultMocks,
185
+ cliConfig: {
186
+ api: {
187
+ projectId: undefined
188
+ }
189
+ }
151
190
  }
152
191
  });
153
- const { error } = await testCommand(ListDatasetCommand, []);
154
192
  expect(error?.message).toBe(NO_PROJECT_ID);
155
193
  expect(error?.oclif?.exit).toBe(1);
156
194
  });
@@ -159,12 +197,16 @@ describe('#dataset:list', ()=>{
159
197
  Object.assign(listError, {
160
198
  statusCode: 500
161
199
  });
162
- mockGetProjectCliClient.mockResolvedValue({
163
- datasets: {
164
- list: vi.fn().mockRejectedValue(listError)
165
- }
200
+ mockListDatasets.mockRejectedValue(listError);
201
+ mockApi({
202
+ apiHost: `https://${testProjectId}.api.sanity.io`,
203
+ apiVersion: DATASET_API_VERSION,
204
+ method: 'get',
205
+ uri: `/aliases`
206
+ }).reply(200, []);
207
+ const { error } = await testCommand(ListDatasetCommand, [], {
208
+ mocks: defaultMocks
166
209
  });
167
- const { error } = await testCommand(ListDatasetCommand, []);
168
210
  expect(error?.message).toContain('Dataset list retrieval failed');
169
211
  expect(error?.message).toContain('Internal Server Error');
170
212
  expect(error?.oclif?.exit).toBe(1);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/dataset/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig, getProjectCliClient} from '@sanity/cli-core'\nimport {testCommand} from '@sanity/cli-test'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {type DatasetAliasDefinition} from '../../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {ListDatasetCommand} from '../list.js'\n\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().mockResolvedValue({\n api: {\n projectId: 'test-project',\n },\n }),\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', async (importOriginal) => {\n const actual =\n await importOriginal<typeof import('../../../../../cli-core/src/services/apiClient.js')>()\n return {\n ...actual,\n getProjectCliClient: vi.fn(),\n }\n})\n\nconst mockGetProjectCliClient = vi.mocked(getProjectCliClient)\n\nconst setupMockClient = (\n datasets = [{name: 'production'}, {name: 'test'}],\n aliases: DatasetAliasDefinition[] = [{datasetName: 'production', name: 'prod'}],\n aliasError?: Error,\n) => {\n const mockRequest = aliasError\n ? vi.fn().mockRejectedValue(aliasError)\n : vi.fn().mockResolvedValue(aliases)\n\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockResolvedValue(datasets),\n },\n request: mockRequest,\n } as never)\n}\n\ndescribe('#dataset:list', () => {\n afterEach(() => {\n vi.clearAllMocks()\n })\n\n test('--help works', async () => {\n const {stdout} = await runCommand(['dataset list', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"List datasets of your project\n\n USAGE\n $ sanity dataset list\n\n DESCRIPTION\n List datasets of your project\n\n EXAMPLES\n List datasets of your project\n\n $ sanity dataset list\n\n \"\n `)\n })\n\n test('lists datasets successfully', async () => {\n setupMockClient([{name: 'production'}, {name: 'test'}, {name: 'development'}], [])\n\n const {stdout} = await testCommand(ListDatasetCommand, [])\n expect(stdout).toBe('production\\ntest\\ndevelopment\\n')\n })\n\n test('lists datasets and aliases successfully', async () => {\n setupMockClient(\n [{name: 'production'}, {name: 'test'}],\n [\n {datasetName: 'production', name: 'prod'},\n {datasetName: 'test', name: 'staging'},\n ],\n )\n\n const {stdout} = await testCommand(ListDatasetCommand, [])\n expect(stdout).toBe('production\\ntest\\n~prod -> production\\n~staging -> test\\n')\n })\n\n test('handles unlinked aliases', async () => {\n setupMockClient(\n [{name: 'production'}],\n [\n {datasetName: 'production', name: 'prod'},\n {datasetName: null, name: 'old'},\n ],\n )\n\n const {stdout} = await testCommand(ListDatasetCommand, [])\n expect(stdout).toBe('production\\n~prod -> production\\n~old -> <unlinked>\\n')\n })\n\n test('handles empty dataset list', async () => {\n setupMockClient([], [])\n\n const {stdout} = await testCommand(ListDatasetCommand, [])\n expect(stdout).toBe('No datasets found for this project.\\n')\n })\n\n test('handles alias fetch failure gracefully', async () => {\n setupMockClient([{name: 'production'}], [], new Error('Alias service unavailable'))\n\n const {stdout} = await testCommand(ListDatasetCommand, [])\n expect(stdout).toBe('production\\n')\n })\n\n test('shows error when no project ID is found', async () => {\n vi.mocked(getCliConfig).mockResolvedValueOnce({\n api: {projectId: undefined},\n })\n\n const {error} = await testCommand(ListDatasetCommand, [])\n expect(error?.message).toBe(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when listing datasets ', async () => {\n const listError = new Error('Internal Server Error')\n Object.assign(listError, {statusCode: 500})\n\n mockGetProjectCliClient.mockResolvedValue({\n datasets: {\n list: vi.fn().mockRejectedValue(listError),\n },\n } as never)\n\n const {error} = await testCommand(ListDatasetCommand, [])\n expect(error?.message).toContain('Dataset list retrieval failed')\n expect(error?.message).toContain('Internal Server Error')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","getCliConfig","getProjectCliClient","testCommand","afterEach","describe","expect","test","vi","NO_PROJECT_ID","ListDatasetCommand","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","importOriginal","actual","mockGetProjectCliClient","mocked","setupMockClient","datasets","name","aliases","datasetName","aliasError","mockRequest","mockRejectedValue","list","request","clearAllMocks","stdout","toMatchInlineSnapshot","toBe","Error","mockResolvedValueOnce","undefined","error","message","oclif","exit","listError","Object","assign","statusCode","toContain"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/dataset/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {createTestClient, mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {DATASET_API_VERSION, type DatasetAliasDefinition} from '../../../services/datasets.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {ListDatasetCommand} from '../list.js'\n\nconst mockListDatasets = vi.hoisted(() => vi.fn())\nconst testProjectId = vi.hoisted(() => 'test-project')\nconst testToken = vi.hoisted(() => 'test-token')\n\nvi.mock('@sanity/cli-core', async () => {\n const actual = await vi.importActual('@sanity/cli-core')\n\n const testClient = createTestClient({\n apiVersion: 'v2025-09-16',\n projectId: testProjectId,\n token: testToken,\n })\n\n return {\n ...actual,\n getProjectCliClient: vi.fn().mockResolvedValue({\n datasets: {\n list: mockListDatasets,\n } as never,\n request: testClient.request,\n }),\n }\n})\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: testToken,\n}\n\ndescribe('#dataset:list', () => {\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(['dataset list', '--help'])\n expect(stdout).toMatchInlineSnapshot(`\n \"List datasets of your project\n\n USAGE\n $ sanity dataset list\n\n DESCRIPTION\n List datasets of your project\n\n EXAMPLES\n List datasets of your project\n\n $ sanity dataset list\n\n \"\n `)\n })\n\n test('lists datasets successfully', async () => {\n mockListDatasets.mockResolvedValue([\n {name: 'production'} as never,\n {name: 'test'} as never,\n {name: 'development'} as never,\n ])\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n const {stdout} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n\n expect(stdout).toBe('production\\ntest\\ndevelopment\\n')\n })\n\n test('lists datasets and aliases successfully', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never, {name: 'test'} as never])\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [\n {datasetName: 'production', name: 'prod'},\n {datasetName: 'test', name: 'staging'},\n ])\n\n const {stdout} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n expect(stdout).toBe('production\\ntest\\n~prod -> production\\n~staging -> test\\n')\n })\n\n test('handles unlinked aliases', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [\n {datasetName: 'production', name: 'prod'},\n {datasetName: null, name: 'old'},\n ] as DatasetAliasDefinition[])\n\n const {stdout} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n expect(stdout).toBe('production\\n~prod -> production\\n~old -> <unlinked>\\n')\n })\n\n test('handles empty dataset list', async () => {\n mockListDatasets.mockResolvedValue([])\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n const {stdout} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n expect(stdout).toBe('No datasets found for this project.\\n')\n })\n\n test('handles alias fetch failure gracefully', async () => {\n mockListDatasets.mockResolvedValue([{name: 'production'} as never])\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(500, {\n error: 'Alias service unavailable',\n message: 'Alias service unavailable',\n })\n\n const {stdout} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n expect(stdout).toBe('production\\n')\n })\n\n test('shows error when no project ID is found', async () => {\n const {error} = await testCommand(ListDatasetCommand, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n expect(error?.message).toBe(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('handles API errors when listing datasets ', async () => {\n const listError = new Error('Internal Server Error')\n Object.assign(listError, {statusCode: 500})\n mockListDatasets.mockRejectedValue(listError)\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: DATASET_API_VERSION,\n method: 'get',\n uri: `/aliases`,\n }).reply(200, [])\n\n const {error} = await testCommand(ListDatasetCommand, [], {\n mocks: defaultMocks,\n })\n expect(error?.message).toContain('Dataset list retrieval failed')\n expect(error?.message).toContain('Internal Server Error')\n expect(error?.oclif?.exit).toBe(1)\n })\n})\n"],"names":["runCommand","createTestClient","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","DATASET_API_VERSION","NO_PROJECT_ID","ListDatasetCommand","mockListDatasets","hoisted","fn","testProjectId","testToken","mock","actual","importActual","testClient","apiVersion","projectId","token","getProjectCliClient","mockResolvedValue","datasets","list","request","defaultMocks","cliConfig","api","projectRoot","directory","path","type","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","name","apiHost","method","uri","reply","mocks","toBe","datasetName","error","message","undefined","oclif","exit","listError","Error","Object","assign","statusCode","mockRejectedValue","toContain"],"mappings":"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"}
@@ -1,35 +1,44 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
- import { mockApi, testCommand } from '@sanity/cli-test';
2
+ import { createTestClient, mockApi, testCommand } from '@sanity/cli-test';
4
3
  import nock from 'nock';
5
4
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
- import { DATASET_ALIASES_API_VERSION } from '../../../../services/datasetAliases.js';
7
- import { listDatasets } from '../../../../services/datasets.js';
5
+ import { DATASET_API_VERSION } from '../../../../services/datasets.js';
8
6
  import { PROJECT_FEATURES_API_VERSION } from '../../../../services/getProjectFeatures.js';
9
7
  import { NO_PROJECT_ID } from '../../../../util/errorMessages.js';
10
8
  import { CreateAliasCommand } from '../create.js';
11
- vi.mock('../../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
12
- findProjectRoot: vi.fn().mockResolvedValue({
13
- directory: '/test/path',
14
- root: '/test/path',
15
- type: 'studio'
16
- })
17
- }));
18
- vi.mock('../../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
19
- getCliConfig: vi.fn().mockResolvedValue({
20
- api: {
21
- projectId: 'test-project'
22
- }
9
+ const mockListDatasets = vi.hoisted(()=>vi.fn());
10
+ const testProjectId = vi.hoisted(()=>'test-project');
11
+ const testToken = vi.hoisted(()=>'test-token');
12
+ vi.mock('@sanity/cli-core', async (importOriginal)=>{
13
+ const actual = await importOriginal();
14
+ const testClient = createTestClient({
15
+ apiVersion: 'v2025-09-16',
16
+ projectId: testProjectId,
17
+ token: testToken
18
+ });
19
+ return {
20
+ ...actual,
21
+ getProjectCliClient: vi.fn().mockResolvedValue({
22
+ datasets: {
23
+ list: mockListDatasets
24
+ },
25
+ request: testClient.request
23
26
  })
24
- }));
25
- vi.mock('../../../../../../cli-core/src/services/getCliToken.js', ()=>({
26
- getCliToken: vi.fn().mockResolvedValue('test-token')
27
- }));
28
- vi.mock('../../../../services/datasets.js', ()=>({
29
- listDatasets: vi.fn()
30
- }));
31
- const mockListDatasets = vi.mocked(listDatasets);
32
- const mockGetCliConfig = vi.mocked(getCliConfig);
27
+ };
28
+ });
29
+ const defaultMocks = {
30
+ cliConfig: {
31
+ api: {
32
+ projectId: testProjectId
33
+ }
34
+ },
35
+ projectRoot: {
36
+ directory: '/test/path',
37
+ path: '/test/path/sanity.config.ts',
38
+ type: 'studio'
39
+ },
40
+ token: testToken
41
+ };
33
42
  describe('#dataset:alias:create', ()=>{
34
43
  afterEach(()=>{
35
44
  vi.clearAllMocks();
@@ -91,22 +100,24 @@ describe('#dataset:alias:create', ()=>{
91
100
  }
92
101
  ]);
93
102
  mockApi({
94
- apiHost: 'https://test-project.api.sanity.io',
103
+ apiHost: `https://${testProjectId}.api.sanity.io`,
95
104
  apiVersion: PROJECT_FEATURES_API_VERSION,
96
- uri: '/features'
105
+ method: 'get',
106
+ uri: `/features`
97
107
  }).reply(200, [
98
108
  'advancedDatasetManagement'
99
109
  ]);
100
110
  mockApi({
101
- apiHost: 'https://test-project.api.sanity.io',
102
- apiVersion: DATASET_ALIASES_API_VERSION,
103
- uri: '/aliases'
111
+ apiHost: `https://${testProjectId}.api.sanity.io`,
112
+ apiVersion: DATASET_API_VERSION,
113
+ method: 'get',
114
+ uri: `/aliases`
104
115
  }).reply(200, []);
105
116
  mockApi({
106
- apiHost: 'https://test-project.api.sanity.io',
107
- apiVersion: DATASET_ALIASES_API_VERSION,
117
+ apiHost: `https://${testProjectId}.api.sanity.io`,
118
+ apiVersion: DATASET_API_VERSION,
108
119
  method: 'put',
109
- uri: '/aliases/test-alias'
120
+ uri: `/aliases/test-alias`
110
121
  }).reply(200, {
111
122
  aliasName: 'test-alias',
112
123
  datasetName: 'production'
@@ -114,35 +125,41 @@ describe('#dataset:alias:create', ()=>{
114
125
  const { stdout } = await testCommand(CreateAliasCommand, [
115
126
  aliasInput,
116
127
  'production'
117
- ]);
128
+ ], {
129
+ mocks: defaultMocks
130
+ });
118
131
  expect(stdout).toContain('Dataset alias ~test-alias created and linked to production successfully');
119
132
  });
120
133
  test('creates alias without target dataset', async ()=>{
121
134
  mockListDatasets.mockResolvedValue([]);
122
135
  mockApi({
123
- apiHost: 'https://test-project.api.sanity.io',
136
+ apiHost: `https://${testProjectId}.api.sanity.io`,
124
137
  apiVersion: PROJECT_FEATURES_API_VERSION,
125
- uri: '/features'
138
+ method: 'get',
139
+ uri: `/features`
126
140
  }).reply(200, [
127
141
  'advancedDatasetManagement'
128
142
  ]);
129
143
  mockApi({
130
- apiHost: 'https://test-project.api.sanity.io',
131
- apiVersion: DATASET_ALIASES_API_VERSION,
132
- uri: '/aliases'
144
+ apiHost: `https://${testProjectId}.api.sanity.io`,
145
+ apiVersion: DATASET_API_VERSION,
146
+ method: 'get',
147
+ uri: `/aliases`
133
148
  }).reply(200, []);
134
149
  mockApi({
135
- apiHost: 'https://test-project.api.sanity.io',
136
- apiVersion: DATASET_ALIASES_API_VERSION,
150
+ apiHost: `https://${testProjectId}.api.sanity.io`,
151
+ apiVersion: DATASET_API_VERSION,
137
152
  method: 'put',
138
- uri: '/aliases/test-alias'
153
+ uri: `/aliases/test-alias`
139
154
  }).reply(200, {
140
155
  aliasName: 'test-alias',
141
156
  datasetName: null
142
157
  });
143
158
  const { stdout } = await testCommand(CreateAliasCommand, [
144
159
  'test-alias'
145
- ]);
160
+ ], {
161
+ mocks: defaultMocks
162
+ });
146
163
  expect(stdout).toContain('Dataset alias ~test-alias created successfully');
147
164
  });
148
165
  test('fails when alias already exists', async ()=>{
@@ -152,16 +169,18 @@ describe('#dataset:alias:create', ()=>{
152
169
  }
153
170
  ]);
154
171
  mockApi({
155
- apiHost: 'https://test-project.api.sanity.io',
172
+ apiHost: `https://${testProjectId}.api.sanity.io`,
156
173
  apiVersion: PROJECT_FEATURES_API_VERSION,
157
- uri: '/features'
174
+ method: 'get',
175
+ uri: `/features`
158
176
  }).reply(200, [
159
177
  'advancedDatasetManagement'
160
178
  ]);
161
179
  mockApi({
162
- apiHost: 'https://test-project.api.sanity.io',
163
- apiVersion: DATASET_ALIASES_API_VERSION,
164
- uri: '/aliases'
180
+ apiHost: `https://${testProjectId}.api.sanity.io`,
181
+ apiVersion: DATASET_API_VERSION,
182
+ method: 'get',
183
+ uri: `/aliases`
165
184
  }).reply(200, [
166
185
  {
167
186
  datasetName: 'production',
@@ -171,7 +190,9 @@ describe('#dataset:alias:create', ()=>{
171
190
  const { error } = await testCommand(CreateAliasCommand, [
172
191
  'existing-alias',
173
192
  'production'
174
- ]);
193
+ ], {
194
+ mocks: defaultMocks
195
+ });
175
196
  expect(error?.message).toContain('Dataset alias "~existing-alias" already exists');
176
197
  expect(error?.oclif?.exit).toBe(1);
177
198
  });
@@ -182,14 +203,17 @@ describe('#dataset:alias:create', ()=>{
182
203
  }
183
204
  ]);
184
205
  mockApi({
185
- apiHost: 'https://test-project.api.sanity.io',
206
+ apiHost: `https://${testProjectId}.api.sanity.io`,
186
207
  apiVersion: PROJECT_FEATURES_API_VERSION,
187
- uri: '/features'
208
+ method: 'get',
209
+ uri: `/features`
188
210
  }).reply(200, []);
189
211
  const { error } = await testCommand(CreateAliasCommand, [
190
212
  'test-alias',
191
213
  'production'
192
- ]);
214
+ ], {
215
+ mocks: defaultMocks
216
+ });
193
217
  expect(error?.message).toContain('This project cannot create a dataset alias');
194
218
  expect(error?.oclif?.exit).toBe(1);
195
219
  });
@@ -200,33 +224,41 @@ describe('#dataset:alias:create', ()=>{
200
224
  }
201
225
  ]);
202
226
  mockApi({
203
- apiHost: 'https://test-project.api.sanity.io',
227
+ apiHost: `https://${testProjectId}.api.sanity.io`,
204
228
  apiVersion: PROJECT_FEATURES_API_VERSION,
205
- uri: '/features'
229
+ method: 'get',
230
+ uri: `/features`
206
231
  }).reply(200, [
207
232
  'advancedDatasetManagement'
208
233
  ]);
209
234
  mockApi({
210
- apiHost: 'https://test-project.api.sanity.io',
211
- apiVersion: DATASET_ALIASES_API_VERSION,
212
- uri: '/aliases'
235
+ apiHost: `https://${testProjectId}.api.sanity.io`,
236
+ apiVersion: DATASET_API_VERSION,
237
+ method: 'get',
238
+ uri: `/aliases`
213
239
  }).reply(200, []);
214
240
  const { error } = await testCommand(CreateAliasCommand, [
215
241
  'test-alias',
216
242
  'nonexistent'
217
- ]);
243
+ ], {
244
+ mocks: defaultMocks
245
+ });
218
246
  expect(error?.message).toContain('Dataset "nonexistent" does not exist');
219
247
  expect(error?.message).toContain('Available datasets: production');
220
248
  expect(error?.oclif?.exit).toBe(1);
221
249
  });
222
250
  test('fails when no project ID available', async ()=>{
223
- mockGetCliConfig.mockResolvedValueOnce({
224
- api: {}
225
- });
226
251
  const { error } = await testCommand(CreateAliasCommand, [
227
252
  'test-alias',
228
253
  'production'
229
- ]);
254
+ ], {
255
+ mocks: {
256
+ ...defaultMocks,
257
+ cliConfig: {
258
+ api: {}
259
+ }
260
+ }
261
+ });
230
262
  expect(error?.message).toContain(NO_PROJECT_ID);
231
263
  expect(error?.oclif?.exit).toBe(1);
232
264
  });
@@ -237,29 +269,34 @@ describe('#dataset:alias:create', ()=>{
237
269
  }
238
270
  ]);
239
271
  mockApi({
240
- apiHost: 'https://test-project.api.sanity.io',
272
+ apiHost: `https://${testProjectId}.api.sanity.io`,
241
273
  apiVersion: PROJECT_FEATURES_API_VERSION,
242
- uri: '/features'
274
+ method: 'get',
275
+ uri: `/features`
243
276
  }).reply(200, [
244
277
  'advancedDatasetManagement'
245
278
  ]);
246
279
  mockApi({
247
- apiHost: 'https://test-project.api.sanity.io',
248
- apiVersion: DATASET_ALIASES_API_VERSION,
249
- uri: '/aliases'
280
+ apiHost: `https://${testProjectId}.api.sanity.io`,
281
+ apiVersion: DATASET_API_VERSION,
282
+ method: 'get',
283
+ uri: `/aliases`
250
284
  }).reply(200, []);
251
285
  mockApi({
252
- apiHost: 'https://test-project.api.sanity.io',
253
- apiVersion: DATASET_ALIASES_API_VERSION,
286
+ apiHost: `https://${testProjectId}.api.sanity.io`,
287
+ apiVersion: DATASET_API_VERSION,
254
288
  method: 'put',
255
- uri: '/aliases/test-alias'
289
+ uri: `/aliases/test-alias`
256
290
  }).reply(500, {
291
+ error: 'API Error: Network timeout',
257
292
  message: 'API Error: Network timeout'
258
293
  });
259
294
  const { error } = await testCommand(CreateAliasCommand, [
260
295
  'test-alias',
261
296
  'production'
262
- ]);
297
+ ], {
298
+ mocks: defaultMocks
299
+ });
263
300
  expect(error?.message).toContain('Dataset alias creation failed: API Error: Network timeout');
264
301
  expect(error?.oclif?.exit).toBe(1);
265
302
  });
@@ -281,16 +318,19 @@ describe('#dataset:alias:create', ()=>{
281
318
  }
282
319
  ]);
283
320
  mockApi({
284
- apiHost: 'https://test-project.api.sanity.io',
321
+ apiHost: `https://${testProjectId}.api.sanity.io`,
285
322
  apiVersion: PROJECT_FEATURES_API_VERSION,
286
- uri: '/features'
323
+ method: 'get',
324
+ uri: `/features`
287
325
  }).reply(200, [
288
326
  'advancedDatasetManagement'
289
327
  ]);
290
328
  const { error } = await testCommand(CreateAliasCommand, [
291
329
  alias,
292
330
  dataset
293
- ]);
331
+ ], {
332
+ mocks: defaultMocks
333
+ });
294
334
  expect(error?.message).toContain(expectedError);
295
335
  expect(error?.oclif?.exit).toBe(1);
296
336
  });