@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,30 +1,24 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
2
  import { mockApi, testCommand } from '@sanity/cli-test';
4
3
  import nock from 'nock';
5
4
  import { afterEach, describe, expect, test, vi } from 'vitest';
6
5
  import { GRAPHQL_API_VERSION } from '../../../services/graphql.js';
7
6
  import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
8
7
  import { List } from '../list.js';
9
- // Mock the config functions with relative paths
10
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
11
- findProjectRoot: vi.fn().mockResolvedValue({
12
- directory: '/test/path',
13
- root: '/test/path',
14
- type: 'studio'
15
- })
16
- }));
17
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
18
- getCliConfig: vi.fn().mockResolvedValue({
19
- api: {
20
- projectId: 'test-project'
21
- }
22
- })
23
- }));
24
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
25
- getCliToken: vi.fn().mockResolvedValue('test-token')
26
- }));
27
- const mockGetCliConfig = vi.mocked(getCliConfig);
8
+ const testProjectId = 'test-project';
9
+ const defaultMocks = {
10
+ cliConfig: {
11
+ api: {
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
+ };
28
22
  describe('#list', ()=>{
29
23
  afterEach(()=>{
30
24
  vi.clearAllMocks();
@@ -56,7 +50,7 @@ describe('#list', ()=>{
56
50
  });
57
51
  test('displays GraphQL endpoints correctly with multiple endpoints', async ()=>{
58
52
  mockApi({
59
- apiHost: 'https://test-project.api.sanity.io',
53
+ apiHost: `https://${testProjectId}.api.sanity.io`,
60
54
  apiVersion: GRAPHQL_API_VERSION,
61
55
  uri: '/apis/graphql'
62
56
  }).reply(200, [
@@ -64,18 +58,20 @@ describe('#list', ()=>{
64
58
  dataset: 'production',
65
59
  generation: 'gen2',
66
60
  playgroundEnabled: true,
67
- projectId: 'test-project',
61
+ projectId: testProjectId,
68
62
  tag: 'default'
69
63
  },
70
64
  {
71
65
  dataset: 'staging',
72
66
  generation: 'gen3',
73
67
  playgroundEnabled: false,
74
- projectId: 'test-project',
68
+ projectId: testProjectId,
75
69
  tag: 'latest'
76
70
  }
77
71
  ]);
78
- const { stdout } = await testCommand(List);
72
+ const { stdout } = await testCommand(List, [], {
73
+ mocks: defaultMocks
74
+ });
79
75
  expect(stdout).toMatchInlineSnapshot(`
80
76
  "Here are the GraphQL endpoints deployed for this project:
81
77
  1. Dataset: production
@@ -95,7 +91,7 @@ describe('#list', ()=>{
95
91
  });
96
92
  test('displays single GraphQL endpoint correctly', async ()=>{
97
93
  mockApi({
98
- apiHost: 'https://test-project.api.sanity.io',
94
+ apiHost: `https://${testProjectId}.api.sanity.io`,
99
95
  apiVersion: GRAPHQL_API_VERSION,
100
96
  uri: '/apis/graphql'
101
97
  }).reply(200, [
@@ -103,11 +99,13 @@ describe('#list', ()=>{
103
99
  dataset: 'production',
104
100
  generation: 'gen2',
105
101
  playgroundEnabled: true,
106
- projectId: 'test-project',
102
+ projectId: testProjectId,
107
103
  tag: 'default'
108
104
  }
109
105
  ]);
110
- const { stdout } = await testCommand(List);
106
+ const { stdout } = await testCommand(List, [], {
107
+ mocks: defaultMocks
108
+ });
111
109
  expect(stdout).toMatchInlineSnapshot(`
112
110
  "Here are the GraphQL endpoints deployed for this project:
113
111
  1. Dataset: production
@@ -121,20 +119,24 @@ describe('#list', ()=>{
121
119
  });
122
120
  test('handles empty GraphQL endpoints list', async ()=>{
123
121
  mockApi({
124
- apiHost: 'https://test-project.api.sanity.io',
122
+ apiHost: `https://${testProjectId}.api.sanity.io`,
125
123
  apiVersion: GRAPHQL_API_VERSION,
126
124
  uri: '/apis/graphql'
127
125
  }).reply(200, []);
128
- const { stdout } = await testCommand(List);
126
+ const { stdout } = await testCommand(List, [], {
127
+ mocks: defaultMocks
128
+ });
129
129
  expect(stdout).toBe("This project doesn't have any GraphQL endpoints deployed.\n");
130
130
  });
131
131
  test('handles null/undefined GraphQL endpoints response', async ()=>{
132
132
  mockApi({
133
- apiHost: 'https://test-project.api.sanity.io',
133
+ apiHost: `https://${testProjectId}.api.sanity.io`,
134
134
  apiVersion: GRAPHQL_API_VERSION,
135
135
  uri: '/apis/graphql'
136
136
  }).reply(200, undefined);
137
- const { stdout } = await testCommand(List);
137
+ const { stdout } = await testCommand(List, [], {
138
+ mocks: defaultMocks
139
+ });
138
140
  expect(stdout).toBe("This project doesn't have any GraphQL endpoints deployed.\n");
139
141
  });
140
142
  test.each([
@@ -148,32 +150,38 @@ describe('#list', ()=>{
148
150
  ]
149
151
  ])('displays error when API request fails with %i status and message "%s"', async (status, message)=>{
150
152
  mockApi({
151
- apiHost: 'https://test-project.api.sanity.io',
153
+ apiHost: `https://${testProjectId}.api.sanity.io`,
152
154
  apiVersion: GRAPHQL_API_VERSION,
153
155
  uri: '/apis/graphql'
154
156
  }).reply(status, {
155
157
  message
156
158
  });
157
- const { error } = await testCommand(List);
159
+ const { error } = await testCommand(List, [], {
160
+ mocks: defaultMocks
161
+ });
158
162
  expect(error).toBeInstanceOf(Error);
159
163
  expect(error?.message).toContain('GraphQL endpoints list retrieval failed');
160
164
  expect(error?.message).toContain(message);
161
165
  expect(error?.oclif?.exit).toBe(1);
162
166
  });
163
167
  test('throws error when project ID is not defined', async ()=>{
164
- mockGetCliConfig.mockResolvedValueOnce({
165
- api: {
166
- projectId: undefined
168
+ const { error } = await testCommand(List, [], {
169
+ mocks: {
170
+ ...defaultMocks,
171
+ cliConfig: {
172
+ api: {
173
+ projectId: undefined
174
+ }
175
+ }
167
176
  }
168
177
  });
169
- const { error } = await testCommand(List);
170
178
  expect(error).toBeInstanceOf(Error);
171
179
  expect(error?.message).toEqual(NO_PROJECT_ID);
172
180
  expect(error?.oclif?.exit).toBe(1);
173
181
  });
174
182
  test('displays endpoints correctly when dataset names contain special characters', async ()=>{
175
183
  mockApi({
176
- apiHost: 'https://test-project.api.sanity.io',
184
+ apiHost: `https://${testProjectId}.api.sanity.io`,
177
185
  apiVersion: GRAPHQL_API_VERSION,
178
186
  uri: '/apis/graphql'
179
187
  }).reply(200, [
@@ -181,18 +189,20 @@ describe('#list', ()=>{
181
189
  dataset: 'my-dataset-123',
182
190
  generation: 'gen2',
183
191
  playgroundEnabled: true,
184
- projectId: 'test-project',
192
+ projectId: testProjectId,
185
193
  tag: 'v1.0.0'
186
194
  },
187
195
  {
188
196
  dataset: 'test_dataset',
189
197
  generation: 'gen3',
190
198
  playgroundEnabled: false,
191
- projectId: 'test-project',
199
+ projectId: testProjectId,
192
200
  tag: 'beta-2'
193
201
  }
194
202
  ]);
195
- const { stdout } = await testCommand(List);
203
+ const { stdout } = await testCommand(List, [], {
204
+ mocks: defaultMocks
205
+ });
196
206
  expect(stdout).toContain('Dataset: my-dataset-123');
197
207
  expect(stdout).toContain('Tag: v1.0.0');
198
208
  expect(stdout).toContain('Dataset: test_dataset');
@@ -200,7 +210,7 @@ describe('#list', ()=>{
200
210
  });
201
211
  test('displays endpoints with various generation values correctly', async ()=>{
202
212
  mockApi({
203
- apiHost: 'https://test-project.api.sanity.io',
213
+ apiHost: `https://${testProjectId}.api.sanity.io`,
204
214
  apiVersion: GRAPHQL_API_VERSION,
205
215
  uri: '/apis/graphql'
206
216
  }).reply(200, [
@@ -208,18 +218,20 @@ describe('#list', ()=>{
208
218
  dataset: 'production',
209
219
  generation: 'gen1',
210
220
  playgroundEnabled: true,
211
- projectId: 'test-project',
221
+ projectId: testProjectId,
212
222
  tag: 'default'
213
223
  },
214
224
  {
215
225
  dataset: 'staging',
216
226
  generation: 'gen3',
217
227
  playgroundEnabled: false,
218
- projectId: 'test-project',
228
+ projectId: testProjectId,
219
229
  tag: 'default'
220
230
  }
221
231
  ]);
222
- const { stdout } = await testCommand(List);
232
+ const { stdout } = await testCommand(List, [], {
233
+ mocks: defaultMocks
234
+ });
223
235
  expect(stdout).toContain('Generation: gen1');
224
236
  expect(stdout).toContain('Generation: gen3');
225
237
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/commands/graphql/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {getCliConfig} from '@sanity/cli-core'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {GRAPHQL_API_VERSION} from '../../../services/graphql.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\n\n// Mock the config functions with relative paths\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\nconst mockGetCliConfig = vi.mocked(getCliConfig)\n\ndescribe('#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(['graphql list', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"List all GraphQL endpoints deployed for this project\n\n USAGE\n $ sanity graphql list\n\n DESCRIPTION\n List all GraphQL endpoints deployed for this project\n\n EXAMPLES\n List GraphQL endpoints for the current project\n\n $ sanity graphql list\n\n \"\n `)\n })\n\n test('displays GraphQL endpoints correctly with multiple endpoints', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: 'test-project',\n tag: 'default',\n },\n {\n dataset: 'staging',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: 'test-project',\n tag: 'latest',\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Here are the GraphQL endpoints deployed for this project:\n 1. Dataset: production\n Tag: default\n Generation: gen2\n Playground: true\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/production/default\n\n 2. Dataset: staging\n Tag: latest\n Generation: gen3\n Playground: false\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/staging/latest\n\n \"\n `)\n })\n\n test('displays single GraphQL endpoint correctly', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: 'test-project',\n tag: 'default',\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Here are the GraphQL endpoints deployed for this project:\n 1. Dataset: production\n Tag: default\n Generation: gen2\n Playground: true\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/production/default\n\n \"\n `)\n })\n\n test('handles empty GraphQL endpoints list', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe(\"This project doesn't have any GraphQL endpoints deployed.\\n\")\n })\n\n test('handles null/undefined GraphQL endpoints response', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, undefined)\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toBe(\"This project doesn't have any GraphQL endpoints deployed.\\n\")\n })\n\n test.each([\n [404, 'Project not found'],\n [500, 'Internal Server Error'],\n ])(\n 'displays error when API request fails with %i status and message \"%s\"',\n async (status, message) => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(status, {message})\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('GraphQL endpoints list retrieval failed')\n expect(error?.message).toContain(message)\n expect(error?.oclif?.exit).toBe(1)\n },\n )\n\n test('throws error when project ID is not defined', async () => {\n mockGetCliConfig.mockResolvedValueOnce({\n api: {\n projectId: undefined,\n },\n })\n\n const {error} = await testCommand(List)\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('displays endpoints correctly when dataset names contain special characters', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'my-dataset-123',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: 'test-project',\n tag: 'v1.0.0',\n },\n {\n dataset: 'test_dataset',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: 'test-project',\n tag: 'beta-2',\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toContain('Dataset: my-dataset-123')\n expect(stdout).toContain('Tag: v1.0.0')\n expect(stdout).toContain('Dataset: test_dataset')\n expect(stdout).toContain('Tag: beta-2')\n })\n\n test('displays endpoints with various generation values correctly', async () => {\n mockApi({\n apiHost: 'https://test-project.api.sanity.io',\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen1',\n playgroundEnabled: true,\n projectId: 'test-project',\n tag: 'default',\n },\n {\n dataset: 'staging',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: 'test-project',\n tag: 'default',\n },\n ])\n\n const {stdout} = await testCommand(List)\n\n expect(stdout).toContain('Generation: gen1')\n expect(stdout).toContain('Generation: gen3')\n })\n})\n"],"names":["runCommand","getCliConfig","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","GRAPHQL_API_VERSION","NO_PROJECT_ID","List","mock","findProjectRoot","fn","mockResolvedValue","directory","root","type","api","projectId","getCliToken","mockGetCliConfig","mocked","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","apiHost","apiVersion","uri","reply","dataset","generation","playgroundEnabled","tag","toBe","undefined","each","status","message","error","toBeInstanceOf","Error","toContain","oclif","exit","mockResolvedValueOnce"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/commands/graphql/__tests__/list.test.ts"],"sourcesContent":["import {runCommand} from '@oclif/test'\nimport {mockApi, testCommand} from '@sanity/cli-test'\nimport nock from 'nock'\nimport {afterEach, describe, expect, test, vi} from 'vitest'\n\nimport {GRAPHQL_API_VERSION} from '../../../services/graphql.js'\nimport {NO_PROJECT_ID} from '../../../util/errorMessages.js'\nimport {List} from '../list.js'\n\nconst testProjectId = 'test-project'\n\nconst defaultMocks = {\n cliConfig: {api: {projectId: testProjectId}},\n projectRoot: {\n directory: '/test/path',\n path: '/test/path/sanity.config.ts',\n type: 'studio' as const,\n },\n token: 'test-token',\n}\n\ndescribe('#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(['graphql list', '--help'])\n\n expect(stdout).toMatchInlineSnapshot(`\n \"List all GraphQL endpoints deployed for this project\n\n USAGE\n $ sanity graphql list\n\n DESCRIPTION\n List all GraphQL endpoints deployed for this project\n\n EXAMPLES\n List GraphQL endpoints for the current project\n\n $ sanity graphql list\n\n \"\n `)\n })\n\n test('displays GraphQL endpoints correctly with multiple endpoints', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: testProjectId,\n tag: 'default',\n },\n {\n dataset: 'staging',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: testProjectId,\n tag: 'latest',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Here are the GraphQL endpoints deployed for this project:\n 1. Dataset: production\n Tag: default\n Generation: gen2\n Playground: true\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/production/default\n\n 2. Dataset: staging\n Tag: latest\n Generation: gen3\n Playground: false\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/staging/latest\n\n \"\n `)\n })\n\n test('displays single GraphQL endpoint correctly', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: testProjectId,\n tag: 'default',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toMatchInlineSnapshot(`\n \"Here are the GraphQL endpoints deployed for this project:\n 1. Dataset: production\n Tag: default\n Generation: gen2\n Playground: true\n URL: https://test-project.api.sanity.io/v2025-09-19/graphql/production/default\n\n \"\n `)\n })\n\n test('handles empty GraphQL endpoints list', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe(\"This project doesn't have any GraphQL endpoints deployed.\\n\")\n })\n\n test('handles null/undefined GraphQL endpoints response', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, undefined)\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toBe(\"This project doesn't have any GraphQL endpoints deployed.\\n\")\n })\n\n test.each([\n [404, 'Project not found'],\n [500, 'Internal Server Error'],\n ])(\n 'displays error when API request fails with %i status and message \"%s\"',\n async (status, message) => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(status, {message})\n\n const {error} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toContain('GraphQL endpoints list retrieval failed')\n expect(error?.message).toContain(message)\n expect(error?.oclif?.exit).toBe(1)\n },\n )\n\n test('throws error when project ID is not defined', async () => {\n const {error} = await testCommand(List, [], {\n mocks: {\n ...defaultMocks,\n cliConfig: {api: {projectId: undefined}},\n },\n })\n\n expect(error).toBeInstanceOf(Error)\n expect(error?.message).toEqual(NO_PROJECT_ID)\n expect(error?.oclif?.exit).toBe(1)\n })\n\n test('displays endpoints correctly when dataset names contain special characters', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'my-dataset-123',\n generation: 'gen2',\n playgroundEnabled: true,\n projectId: testProjectId,\n tag: 'v1.0.0',\n },\n {\n dataset: 'test_dataset',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: testProjectId,\n tag: 'beta-2',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Dataset: my-dataset-123')\n expect(stdout).toContain('Tag: v1.0.0')\n expect(stdout).toContain('Dataset: test_dataset')\n expect(stdout).toContain('Tag: beta-2')\n })\n\n test('displays endpoints with various generation values correctly', async () => {\n mockApi({\n apiHost: `https://${testProjectId}.api.sanity.io`,\n apiVersion: GRAPHQL_API_VERSION,\n uri: '/apis/graphql',\n }).reply(200, [\n {\n dataset: 'production',\n generation: 'gen1',\n playgroundEnabled: true,\n projectId: testProjectId,\n tag: 'default',\n },\n {\n dataset: 'staging',\n generation: 'gen3',\n playgroundEnabled: false,\n projectId: testProjectId,\n tag: 'default',\n },\n ])\n\n const {stdout} = await testCommand(List, [], {mocks: defaultMocks})\n\n expect(stdout).toContain('Generation: gen1')\n expect(stdout).toContain('Generation: gen3')\n })\n})\n"],"names":["runCommand","mockApi","testCommand","nock","afterEach","describe","expect","test","vi","GRAPHQL_API_VERSION","NO_PROJECT_ID","List","testProjectId","defaultMocks","cliConfig","api","projectId","projectRoot","directory","path","type","token","clearAllMocks","pending","pendingMocks","cleanAll","toEqual","stdout","toMatchInlineSnapshot","apiHost","apiVersion","uri","reply","dataset","generation","playgroundEnabled","tag","mocks","toBe","undefined","each","status","message","error","toBeInstanceOf","Error","toContain","oclif","exit"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { runCommand } from '@oclif/test';
2
- import { getCliConfig } from '@sanity/cli-core';
3
2
  import { mockApi, testCommand } from '@sanity/cli-test';
4
3
  import nock from 'nock';
5
4
  import { createSchema } from 'sanity';
@@ -8,50 +7,41 @@ import { getGraphQLAPIs } from '../../../actions/graphql/getGraphQLAPIs.js';
8
7
  import { GRAPHQL_API_VERSION } from '../../../services/graphql.js';
9
8
  import { NO_PROJECT_ID } from '../../../util/errorMessages.js';
10
9
  import { Undeploy } from '../undeploy.js';
11
- // Mock the config functions
12
- vi.mock('../../../../../cli-core/src/config/findProjectRoot.js', ()=>({
13
- findProjectRoot: vi.fn().mockResolvedValue({
14
- directory: '/test/path',
15
- root: '/test/path',
16
- type: 'studio'
17
- })
18
- }));
19
- vi.mock('../../../../../cli-core/src/config/cli/getCliConfig.js', ()=>({
20
- getCliConfig: vi.fn().mockResolvedValue({
21
- api: {
22
- dataset: 'production',
23
- projectId: 'test-project'
24
- }
25
- })
26
- }));
27
- vi.mock('../../../../../cli-core/src/services/getCliToken.js', ()=>({
28
- getCliToken: vi.fn().mockResolvedValue('test-token')
29
- }));
30
10
  // Mock getGraphQLAPIs
31
11
  vi.mock('../../../actions/graphql/getGraphQLAPIs.js', ()=>({
32
12
  getGraphQLAPIs: vi.fn()
33
13
  }));
34
- const mockGetCliConfig = vi.mocked(getCliConfig);
14
+ const testProjectId = 'test-project';
15
+ const defaultMocks = {
16
+ cliConfig: {
17
+ api: {
18
+ dataset: 'production',
19
+ projectId: testProjectId
20
+ }
21
+ },
22
+ projectRoot: {
23
+ directory: '/test/path',
24
+ path: '/test/path/sanity.config.ts',
25
+ type: 'studio'
26
+ },
27
+ token: 'test-token'
28
+ };
35
29
  const mockGetGraphQLAPIs = vi.mocked(getGraphQLAPIs);
36
30
  const mockConfirm = vi.hoisted(()=>vi.fn());
37
31
  const schema = createSchema({
38
32
  name: 'default',
39
33
  types: []
40
34
  });
41
- // Mock inquirer prompts
42
- vi.mock('@sanity/cli-core/ux', ()=>({
35
+ vi.mock('@sanity/cli-core/ux', async ()=>{
36
+ const actual = await vi.importActual('@sanity/cli-core/ux');
37
+ return {
38
+ ...actual,
43
39
  confirm: mockConfirm
44
- }));
40
+ };
41
+ });
45
42
  describe('graphql undeploy', ()=>{
46
43
  beforeEach(()=>{
47
44
  vi.clearAllMocks();
48
- // Reset getCliConfig to default values for each test
49
- mockGetCliConfig.mockResolvedValue({
50
- api: {
51
- dataset: 'production',
52
- projectId: 'test-project'
53
- }
54
- });
55
45
  });
56
46
  afterEach(()=>{
57
47
  const pending = nock.pendingMocks();
@@ -113,7 +103,9 @@ describe('graphql undeploy', ()=>{
113
103
  method: 'delete',
114
104
  uri: '/apis/graphql/production/default'
115
105
  }).reply(204);
116
- const { stdout } = await testCommand(Undeploy);
106
+ const { stdout } = await testCommand(Undeploy, [], {
107
+ mocks: defaultMocks
108
+ });
117
109
  expect(mockConfirm).toHaveBeenCalledWith({
118
110
  default: false,
119
111
  message: 'Are you absolutely sure you want to delete the current GraphQL API connected to the "production" dataset in project test-project?'
@@ -131,7 +123,9 @@ describe('graphql undeploy', ()=>{
131
123
  const { stdout } = await testCommand(Undeploy, [
132
124
  '--tag',
133
125
  'beta'
134
- ]);
126
+ ], {
127
+ mocks: defaultMocks
128
+ });
135
129
  expect(mockConfirm).toHaveBeenCalledWith({
136
130
  default: false,
137
131
  message: 'Are you absolutely sure you want to delete the GraphQL API connected to the "production" dataset in project test-project, tagged "beta"?'
@@ -149,7 +143,9 @@ describe('graphql undeploy', ()=>{
149
143
  const { stdout } = await testCommand(Undeploy, [
150
144
  '--dataset',
151
145
  'staging'
152
- ]);
146
+ ], {
147
+ mocks: defaultMocks
148
+ });
153
149
  expect(stdout).toBe('GraphQL API deleted\n');
154
150
  });
155
151
  test('uses --project flag when specified', async ()=>{
@@ -164,7 +160,9 @@ describe('graphql undeploy', ()=>{
164
160
  '--project',
165
161
  'custom-project',
166
162
  '--force'
167
- ]);
163
+ ], {
164
+ mocks: defaultMocks
165
+ });
168
166
  expect(stdout).toBe('GraphQL API deleted\n');
169
167
  });
170
168
  test('successfully undeploys with all flags combined', async ()=>{
@@ -182,7 +180,9 @@ describe('graphql undeploy', ()=>{
182
180
  'staging',
183
181
  '--tag',
184
182
  'experimental'
185
- ]);
183
+ ], {
184
+ mocks: defaultMocks
185
+ });
186
186
  expect(stdout).toBe('GraphQL API deleted\n');
187
187
  expect(mockConfirm).toHaveBeenCalledWith({
188
188
  default: false,
@@ -198,13 +198,17 @@ describe('graphql undeploy', ()=>{
198
198
  }).reply(204);
199
199
  const { stdout } = await testCommand(Undeploy, [
200
200
  '--force'
201
- ]);
201
+ ], {
202
+ mocks: defaultMocks
203
+ });
202
204
  expect(stdout).toBe('GraphQL API deleted\n');
203
205
  expect(mockConfirm).not.toHaveBeenCalled();
204
206
  });
205
207
  test('cancels deletion when user declines confirmation', async ()=>{
206
208
  mockConfirm.mockResolvedValue(false);
207
- const { stdout } = await testCommand(Undeploy);
209
+ const { stdout } = await testCommand(Undeploy, [], {
210
+ mocks: defaultMocks
211
+ });
208
212
  expect(stdout).toBe('Operation cancelled\n');
209
213
  expect(nock.pendingMocks()).toHaveLength(0); // No API call should be made
210
214
  });
@@ -228,7 +232,9 @@ describe('graphql undeploy', ()=>{
228
232
  const { stdout } = await testCommand(Undeploy, [
229
233
  '--api',
230
234
  'ios'
231
- ]);
235
+ ], {
236
+ mocks: defaultMocks
237
+ });
232
238
  expect(stdout).toBe('GraphQL API deleted\n');
233
239
  expect(mockGetGraphQLAPIs).toHaveBeenCalledWith(process.cwd());
234
240
  });
@@ -245,7 +251,9 @@ describe('graphql undeploy', ()=>{
245
251
  const { error } = await testCommand(Undeploy, [
246
252
  '--api',
247
253
  'ios'
248
- ]);
254
+ ], {
255
+ mocks: defaultMocks
256
+ });
249
257
  expect(error).toBeInstanceOf(Error);
250
258
  expect(error?.message).toContain('GraphQL API "ios" not found');
251
259
  expect(error?.oclif?.exit).toBe(1);
@@ -272,7 +280,9 @@ describe('graphql undeploy', ()=>{
272
280
  'ios',
273
281
  '--dataset',
274
282
  'staging'
275
- ]);
283
+ ], {
284
+ mocks: defaultMocks
285
+ });
276
286
  expect(stdout).toBe('GraphQL API deleted\n');
277
287
  expect(stderr).toContain('Both --api and --dataset specified, using --dataset staging');
278
288
  });
@@ -298,7 +308,9 @@ describe('graphql undeploy', ()=>{
298
308
  'ios',
299
309
  '--project',
300
310
  'test-project'
301
- ]);
311
+ ], {
312
+ mocks: defaultMocks
313
+ });
302
314
  expect(stdout).toBe('GraphQL API deleted\n');
303
315
  expect(stderr).toContain('Both --api and --project specified, using --project test-project');
304
316
  });
@@ -324,34 +336,44 @@ describe('graphql undeploy', ()=>{
324
336
  'ios',
325
337
  '--tag',
326
338
  'beta'
327
- ]);
339
+ ], {
340
+ mocks: defaultMocks
341
+ });
328
342
  expect(stdout).toBe('GraphQL API deleted\n');
329
343
  expect(stderr).toContain('Both --api and --tag specified, using --tag beta');
330
344
  });
331
345
  test('throws error when project ID is not defined', async ()=>{
332
- mockGetCliConfig.mockResolvedValue({
333
- api: {
334
- dataset: 'production',
335
- projectId: undefined
336
- }
337
- });
338
346
  const { error } = await testCommand(Undeploy, [
339
347
  '--force'
340
- ]);
348
+ ], {
349
+ mocks: {
350
+ ...defaultMocks,
351
+ cliConfig: {
352
+ api: {
353
+ dataset: 'production',
354
+ projectId: undefined
355
+ }
356
+ }
357
+ }
358
+ });
341
359
  expect(error).toBeInstanceOf(Error);
342
360
  expect(error?.message).toEqual(NO_PROJECT_ID);
343
361
  expect(error?.oclif?.exit).toBe(1);
344
362
  });
345
363
  test('throws error when dataset is not defined and not in config', async ()=>{
346
- mockGetCliConfig.mockResolvedValue({
347
- api: {
348
- dataset: undefined,
349
- projectId: 'test-project'
350
- }
351
- });
352
364
  const { error } = await testCommand(Undeploy, [
353
365
  '--force'
354
- ]);
366
+ ], {
367
+ mocks: {
368
+ ...defaultMocks,
369
+ cliConfig: {
370
+ api: {
371
+ dataset: undefined,
372
+ projectId: testProjectId
373
+ }
374
+ }
375
+ }
376
+ });
355
377
  expect(error).toBeInstanceOf(Error);
356
378
  expect(error?.message).toContain('Dataset is required. Specify it with --dataset or configure it in your project.');
357
379
  expect(error?.oclif?.exit).toBe(1);
@@ -366,7 +388,9 @@ describe('graphql undeploy', ()=>{
366
388
  }).reply(404, {
367
389
  message: 'GraphQL API not found'
368
390
  });
369
- const { error } = await testCommand(Undeploy);
391
+ const { error } = await testCommand(Undeploy, [], {
392
+ mocks: defaultMocks
393
+ });
370
394
  expect(error).toBeInstanceOf(Error);
371
395
  expect(error?.message).toContain('GraphQL API deletion failed');
372
396
  expect(error?.message).toContain('GraphQL API not found');
@@ -374,7 +398,9 @@ describe('graphql undeploy', ()=>{
374
398
  });
375
399
  test('handles user cancelling confirmation prompt', async ()=>{
376
400
  mockConfirm.mockRejectedValue(new Error('User cancelled'));
377
- const { error } = await testCommand(Undeploy);
401
+ const { error } = await testCommand(Undeploy, [], {
402
+ mocks: defaultMocks
403
+ });
378
404
  expect(error).toBeInstanceOf(Error);
379
405
  expect(error?.message).toBe('Operation cancelled');
380
406
  expect(error?.oclif?.exit).toBe(1);