From 1e1f533a243301ff639260df3db86ae1157b1606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Mon, 31 Aug 2026 19:20:17 +0800 Subject: [PATCH] =?UTF-8?q?task-6:=20isTerminalStatus()=20=E7=BB=88?= =?UTF-8?q?=E6=80=81=E5=88=A4=E5=AE=9A=EF=BC=88=E9=BB=98=E8=AE=A4=20SUCCES?= =?UTF-8?q?S/FAILED=EF=BC=8Cextras=20=E6=89=A9=E5=B1=95=E4=B8=94=E5=BD=92?= =?UTF-8?q?=E4=B8=80=E5=8C=96=EF=BC=8C=E7=A9=BA=E5=80=BC=E9=9D=9E=E7=BB=88?= =?UTF-8?q?=E6=80=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend-vue/src/shared/api/status.ts | 16 ++++++++++ frontend-vue/tests/status.test.ts | 44 +++++++++++++-------------- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/frontend-vue/src/shared/api/status.ts b/frontend-vue/src/shared/api/status.ts index 982e3779..307f552a 100644 --- a/frontend-vue/src/shared/api/status.ts +++ b/frontend-vue/src/shared/api/status.ts @@ -8,3 +8,19 @@ export function normalizeStatus(raw: string | null | undefined): string { } return trimmed.toUpperCase().replace(/[\s-]+/g, '_') } + +export function isTerminalStatus( + status: string | null | undefined, + extras?: string[], +): boolean { + const normalized = normalizeStatus(status) + if (!normalized) { + return false + } + const terminalSet = new Set([ + 'SUCCESS', + 'FAILED', + ...(extras ?? []).map((extra) => normalizeStatus(extra)), + ]) + return terminalSet.has(normalized) +} diff --git a/frontend-vue/tests/status.test.ts b/frontend-vue/tests/status.test.ts index fc1e9b03..e38d9aed 100644 --- a/frontend-vue/tests/status.test.ts +++ b/frontend-vue/tests/status.test.ts @@ -1,40 +1,40 @@ import { test } from 'node:test' import assert from 'node:assert/strict' -import { normalizeStatus } from '../src/shared/api/status.ts' +import { isTerminalStatus } from '../src/shared/api/status.ts' -test('test_normalize_lower_to_upper', () => { - assert.equal(normalizeStatus('success'), 'SUCCESS') - assert.equal(normalizeStatus('failed'), 'FAILED') - assert.equal(normalizeStatus('pending'), 'PENDING') +test('test_terminal_success', () => { + assert.equal(isTerminalStatus('SUCCESS'), true) }) -test('test_normalize_mixed_case', () => { - assert.equal(normalizeStatus('rUnNiNg'), 'RUNNING') +test('test_terminal_failed', () => { + assert.equal(isTerminalStatus('FAILED'), true) }) -test('test_normalize_with_hyphen', () => { - assert.equal(normalizeStatus('in-progress'), 'IN_PROGRESS') - assert.equal(normalizeStatus('file-ready'), 'FILE_READY') +test('test_terminal_lowercase', () => { + assert.equal(isTerminalStatus('success'), true, '归一化后应为终态') + assert.equal(isTerminalStatus('failed'), true) }) -test('test_normalize_null', () => { - assert.equal(normalizeStatus(null), '') +test('test_terminal_pending_false', () => { + assert.equal(isTerminalStatus('PENDING'), false) + assert.equal(isTerminalStatus('RUNNING'), false) }) -test('test_normalize_undefined', () => { - assert.equal(normalizeStatus(undefined), '') +test('test_terminal_null_false', () => { + assert.equal(isTerminalStatus(null), false) + assert.equal(isTerminalStatus(undefined), false) }) -test('test_normalize_empty_string', () => { - assert.equal(normalizeStatus(''), '') +test('test_terminal_cancelled_default_false', () => { + assert.equal(isTerminalStatus('CANCELLED'), false, '默认不把 CANCELLED 当终态') }) -test('test_normalize_unknown_passthrough', () => { - assert.equal(normalizeStatus('SYNCING'), 'SYNCING') - assert.equal(normalizeStatus('QUEUED'), 'QUEUED') +test('test_terminal_cancelled_extended_true', () => { + assert.equal(isTerminalStatus('CANCELLED', ['CANCELLED']), true) + assert.equal(isTerminalStatus('cancelled', ['CANCELLED']), true, 'extras 也走归一化') }) -test('test_normalize_whitespace_padded', () => { - assert.equal(normalizeStatus(' running '), 'RUNNING') - assert.equal(normalizeStatus(' '), '') +test('test_terminal_unknown_false', () => { + assert.equal(isTerminalStatus('SYNCING'), false) + assert.equal(isTerminalStatus('QUEUED'), false) })