Skip to content

Commit addb6cc

Browse files
Merge pull request #6692 from Shopify/bulk_ops_watch_status_content
Improve status messages for `app bulk execute` task
2 parents 7585ef2 + aa765ca commit addb6cc

11 files changed

+47
-16
lines changed

packages/app/src/cli/api/graphql/bulk-operations/generated/bulk-operation-run-mutation.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type BulkOperationRunMutationMutationVariables = Types.Exact<{
1212
export type BulkOperationRunMutationMutation = {
1313
bulkOperationRunMutation?: {
1414
bulkOperation?: {
15+
type: Types.BulkOperationType
1516
completedAt?: unknown | null
1617
createdAt: unknown
1718
errorCode?: Types.BulkOperationErrorCode | null
@@ -81,6 +82,7 @@ export const BulkOperationRunMutation = {
8182
selectionSet: {
8283
kind: 'SelectionSet',
8384
selections: [
85+
{kind: 'Field', name: {kind: 'Name', value: 'type'}},
8486
{kind: 'Field', name: {kind: 'Name', value: 'completedAt'}},
8587
{kind: 'Field', name: {kind: 'Name', value: 'createdAt'}},
8688
{kind: 'Field', name: {kind: 'Name', value: 'errorCode'}},

packages/app/src/cli/api/graphql/bulk-operations/generated/bulk-operation-run-query.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export type BulkOperationRunQueryMutationVariables = Types.Exact<{
1010
export type BulkOperationRunQueryMutation = {
1111
bulkOperationRunQuery?: {
1212
bulkOperation?: {
13+
type: Types.BulkOperationType
1314
completedAt?: unknown | null
1415
createdAt: unknown
1516
errorCode?: Types.BulkOperationErrorCode | null
@@ -59,6 +60,7 @@ export const BulkOperationRunQuery = {
5960
selectionSet: {
6061
kind: 'SelectionSet',
6162
selections: [
63+
{kind: 'Field', name: {kind: 'Name', value: 'type'}},
6264
{kind: 'Field', name: {kind: 'Name', value: 'completedAt'}},
6365
{kind: 'Field', name: {kind: 'Name', value: 'createdAt'}},
6466
{kind: 'Field', name: {kind: 'Name', value: 'errorCode'}},

packages/app/src/cli/api/graphql/bulk-operations/generated/get-bulk-operation-by-id.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export type GetBulkOperationByIdQueryVariables = Types.Exact<{
99

1010
export type GetBulkOperationByIdQuery = {
1111
bulkOperation?: {
12+
type: Types.BulkOperationType
1213
completedAt?: unknown | null
1314
createdAt: unknown
1415
errorCode?: Types.BulkOperationErrorCode | null
@@ -50,6 +51,7 @@ export const GetBulkOperationById = {
5051
selectionSet: {
5152
kind: 'SelectionSet',
5253
selections: [
54+
{kind: 'Field', name: {kind: 'Name', value: 'type'}},
5355
{kind: 'Field', name: {kind: 'Name', value: 'completedAt'}},
5456
{kind: 'Field', name: {kind: 'Name', value: 'createdAt'}},
5557
{kind: 'Field', name: {kind: 'Name', value: 'errorCode'}},

packages/app/src/cli/api/graphql/bulk-operations/generated/types.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,13 @@ export type BulkOperationStatus =
188188
/** The bulk operation is runnning. */
189189
| 'RUNNING'
190190

191+
/** The valid values for the bulk operation's type. */
192+
export type BulkOperationType =
193+
/** The bulk operation is a mutation. */
194+
| 'MUTATION'
195+
/** The bulk operation is a query. */
196+
| 'QUERY'
197+
191198
/** Possible error codes that can be returned by `BulkOperationUserError`. */
192199
export type BulkOperationUserErrorCode =
193200
/** The input value is invalid. */

packages/app/src/cli/api/graphql/bulk-operations/mutations/bulk-operation-run-mutation.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ mutation BulkOperationRunMutation(
99
clientIdentifier: $clientIdentifier
1010
) {
1111
bulkOperation {
12+
type
1213
completedAt
1314
createdAt
1415
errorCode

packages/app/src/cli/api/graphql/bulk-operations/mutations/bulk-operation-run-query.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mutation BulkOperationRunQuery($query: String!) {
33
query: $query
44
) {
55
bulkOperation {
6+
type
67
completedAt
78
createdAt
89
errorCode

packages/app/src/cli/api/graphql/bulk-operations/queries/get-bulk-operation-by-id.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
query GetBulkOperationById($id: ID!) {
22
bulkOperation(id: $id) {
3+
type
34
completedAt
45
createdAt
56
errorCode

packages/app/src/cli/services/bulk-operations/bulk-operation-status.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ describe('getBulkOperationStatus', () => {
3838
return {
3939
bulkOperation: {
4040
id: operationId,
41+
type: 'QUERY',
4142
status: 'RUNNING',
4243
errorCode: null,
4344
objectCount: 100,
@@ -75,8 +76,8 @@ describe('getBulkOperationStatus', () => {
7576
const output = mockAndCaptureOutput()
7677
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
7778

78-
expect(output.info()).toContain('Bulk operation in progress...')
79-
expect(output.info()).toContain('500 objects')
79+
expect(output.info()).toContain('Bulk operation in progress')
80+
expect(output.info()).toContain('500 objects read')
8081
expect(output.info()).toContain('Started')
8182
})
8283

@@ -114,7 +115,7 @@ describe('getBulkOperationStatus', () => {
114115
const output = mockAndCaptureOutput()
115116
await getBulkOperationStatus({storeFqdn, operationId, remoteApp})
116117

117-
expect(output.info()).toContain('Starting...')
118+
expect(output.info()).toContain('Starting')
118119
})
119120

120121
test('renders info banner for canceled operation', async () => {
@@ -160,6 +161,7 @@ describe('listBulkOperations', () => {
160161
bulkOperations: {
161162
nodes: operations.map((op) => ({
162163
id: 'gid://shopify/BulkOperation/123',
164+
type: 'QUERY',
163165
status: 'RUNNING',
164166
errorCode: null,
165167
objectCount: 100,

packages/app/src/cli/services/bulk-operations/execute-bulk-operation.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ describe('executeBulkOperation', () => {
4949
NonNullable<BulkOperationRunQueryMutation['bulkOperationRunQuery']>['bulkOperation']
5050
> = {
5151
id: 'gid://shopify/BulkOperation/123',
52+
type: 'QUERY',
5253
status: 'CREATED',
5354
errorCode: null,
5455
createdAt: '2024-01-01T00:00:00Z',

packages/app/src/cli/services/bulk-operations/format-bulk-operation-status.test.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,54 +8,66 @@ function createMockOperation(overrides: Partial<BulkOperation> = {}): BulkOperat
88
return {
99
id: 'gid://shopify/BulkOperation/123',
1010
status: 'CREATED',
11+
type: 'QUERY',
1112
errorCode: null,
1213
createdAt: '2024-01-01T00:00:00Z',
1314
completedAt: null,
1415
objectCount: '0',
1516
url: null,
17+
partialDataUrl: null,
1618
...overrides,
1719
}
1820
}
1921

2022
describe('formatBulkOperationStatus', () => {
21-
test('formats RUNNING status with object count', () => {
22-
const result = formatBulkOperationStatus(createMockOperation({status: 'RUNNING', objectCount: 42}))
23-
expect(result.value).toContain('Bulk operation in progress...')
24-
expect(result.value).toContain('(42 objects)')
23+
test('formats RUNNING status for query with object count', () => {
24+
const result = formatBulkOperationStatus(createMockOperation({status: 'RUNNING', type: 'QUERY', objectCount: '42'}))
25+
expect(result.value).toContain('Bulk operation in progress')
26+
expect(result.value).toContain('(42 objects read)')
27+
})
28+
29+
test('formats RUNNING status for mutation with object count', () => {
30+
const result = formatBulkOperationStatus(
31+
createMockOperation({status: 'RUNNING', type: 'MUTATION', objectCount: '42'}),
32+
)
33+
expect(result.value).toContain('Bulk operation in progress')
34+
expect(result.value).toContain('(42 objects written)')
2535
})
2636

2737
test('formats CREATED status', () => {
2838
const result = formatBulkOperationStatus(createMockOperation({status: 'CREATED'}))
29-
expect(result.value).toBe('Starting...')
39+
expect(result.value).toBe('Starting')
3040
})
3141

3242
test('formats COMPLETED status', () => {
33-
const result = formatBulkOperationStatus(createMockOperation({status: 'COMPLETED', objectCount: 100}))
43+
const result = formatBulkOperationStatus(createMockOperation({status: 'COMPLETED', objectCount: '100'}))
3444
expect(result.value).toContain('Bulk operation succeeded:')
3545
expect(result.value).toContain('100 objects')
3646
})
3747

3848
test('formats FAILED status with error code', () => {
3949
const result = formatBulkOperationStatus(
40-
createMockOperation({status: 'FAILED', objectCount: 10, errorCode: 'ACCESS_DENIED'}),
50+
createMockOperation({status: 'FAILED', objectCount: '10', errorCode: 'ACCESS_DENIED'}),
4151
)
4252
expect(result.value).toContain('Bulk operation failed.')
4353
expect(result.value).toContain('Error: ACCESS_DENIED')
4454
})
4555

4656
test('formats FAILED status without error code', () => {
47-
const result = formatBulkOperationStatus(createMockOperation({status: 'FAILED', objectCount: 10, errorCode: null}))
57+
const result = formatBulkOperationStatus(
58+
createMockOperation({status: 'FAILED', objectCount: '10', errorCode: null}),
59+
)
4860
expect(result.value).toContain('Bulk operation failed.')
4961
expect(result.value).toContain('Error: unknown')
5062
})
5163

5264
test('formats CANCELING status', () => {
53-
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELING', objectCount: 5}))
65+
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELING', objectCount: '5'}))
5466
expect(result.value).toBe('Bulk operation canceling...')
5567
})
5668

5769
test('formats CANCELED status', () => {
58-
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELED', objectCount: 5}))
70+
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELED', objectCount: '5'}))
5971
expect(result.value).toBe('Bulk operation canceled.')
6072
})
6173

0 commit comments

Comments
 (0)