Skip to content

Commit 650aa9a

Browse files
introduce formatBulkOperationStatus helper to print nice progress messages
1 parent 7e00334 commit 650aa9a

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import {formatBulkOperationStatus} from './format-bulk-operation-status.js'
2+
import {GetBulkOperationByIdQuery} from '../../api/graphql/bulk-operations/generated/get-bulk-operation-by-id.js'
3+
import {describe, test, expect} from 'vitest'
4+
5+
type BulkOperation = NonNullable<GetBulkOperationByIdQuery['bulkOperation']>
6+
7+
function createMockOperation(overrides: Partial<BulkOperation> = {}): BulkOperation {
8+
return {
9+
id: 'gid://shopify/BulkOperation/123',
10+
status: 'CREATED',
11+
errorCode: null,
12+
createdAt: '2024-01-01T00:00:00Z',
13+
completedAt: null,
14+
objectCount: '0',
15+
url: null,
16+
...overrides,
17+
}
18+
}
19+
20+
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)')
25+
})
26+
27+
test('formats CREATED status', () => {
28+
const result = formatBulkOperationStatus(createMockOperation({status: 'CREATED'}))
29+
expect(result.value).toBe('Starting...')
30+
})
31+
32+
test('formats COMPLETED status', () => {
33+
const result = formatBulkOperationStatus(createMockOperation({status: 'COMPLETED', objectCount: 100}))
34+
expect(result.value).toContain('Bulk operation succeeded.')
35+
expect(result.value).toContain('(100 objects)')
36+
})
37+
38+
test('formats FAILED status with error code', () => {
39+
const result = formatBulkOperationStatus(
40+
createMockOperation({status: 'FAILED', objectCount: 10, errorCode: 'ACCESS_DENIED'}),
41+
)
42+
expect(result.value).toContain('Bulk operation failed.')
43+
expect(result.value).toContain('(error: ACCESS_DENIED)')
44+
})
45+
46+
test('formats FAILED status without error code', () => {
47+
const result = formatBulkOperationStatus(createMockOperation({status: 'FAILED', objectCount: 10, errorCode: null}))
48+
expect(result.value).toContain('Bulk operation failed.')
49+
expect(result.value).toContain('(error: unknown)')
50+
})
51+
52+
test('formats CANCELING status', () => {
53+
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELING', objectCount: 5}))
54+
expect(result.value).toBe('Bulk operation canceling...')
55+
})
56+
57+
test('formats CANCELED status', () => {
58+
const result = formatBulkOperationStatus(createMockOperation({status: 'CANCELED', objectCount: 5}))
59+
expect(result.value).toBe('Bulk operation canceled.')
60+
})
61+
62+
test('formats EXPIRED status', () => {
63+
const result = formatBulkOperationStatus(createMockOperation({status: 'EXPIRED'}))
64+
expect(result.value).toBe('Bulk operation expired.')
65+
})
66+
67+
test('formats unknown status', () => {
68+
const result = formatBulkOperationStatus({
69+
...createMockOperation(),
70+
status: 'UNKNOWN_STATUS',
71+
} as unknown as BulkOperation)
72+
expect(result.value).toBe('Bulk operation status: UNKNOWN_STATUS')
73+
})
74+
})
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {GetBulkOperationByIdQuery} from '../../api/graphql/bulk-operations/generated/get-bulk-operation-by-id.js'
2+
import {outputContent, outputToken, TokenizedString} from '@shopify/cli-kit/node/output'
3+
4+
export function formatBulkOperationStatus(
5+
operation: NonNullable<GetBulkOperationByIdQuery['bulkOperation']>,
6+
): TokenizedString {
7+
switch (operation.status) {
8+
case 'RUNNING':
9+
return outputContent`Bulk operation in progress... ${outputToken.gray(
10+
`(${String(operation.objectCount)} objects)`,
11+
)}`
12+
case 'CREATED':
13+
return outputContent`Starting...`
14+
case 'COMPLETED':
15+
return outputContent`Bulk operation succeeded. ${outputToken.gray(`(${String(operation.objectCount)} objects)`)}`
16+
case 'FAILED':
17+
return outputContent`Bulk operation failed. ${outputToken.gray(`(error: ${operation.errorCode ?? 'unknown'})`)}`
18+
case 'CANCELING':
19+
return outputContent`Bulk operation canceling...`
20+
case 'CANCELED':
21+
return outputContent`Bulk operation canceled.`
22+
case 'EXPIRED':
23+
return outputContent`Bulk operation expired.`
24+
default:
25+
return outputContent`Bulk operation status: ${operation.status}`
26+
}
27+
}

0 commit comments

Comments
 (0)