import { describe, expect, it } from 'vitest'; import { cancelClientOperation, clientOperationCanRetry, createClientOperation, isCurrentClientOperation, transitionClientOperation, } from '../src/services/clientOperation'; describe('AGC client operation contract', () => { it('keeps operation/request identity and deadline across phase transitions', () => { const operation = createClientOperation( 'home-create', { prompt: '做一个游戏' }, { scope: { projectPath: 'C:\\games\\demo' }, deadlineMs: 15_000 }, ); const network = transitionClientOperation(operation, 'network'); const project = transitionClientOperation(network, 'project', { scope: { projectPath: 'C:\\games\\created' }, }); expect(project.operationId).toBe(operation.operationId); expect(project.requestId).toBe(operation.requestId); expect(project.deadlineAt).toBe(operation.startedAt + 15_000); expect(project.scope.projectPath).toBe('C:\\games\\created'); expect(project.cancellable).toBe(true); expect(isCurrentClientOperation(project, operation.operationId)).toBe(true); }); it('marks cancellation as stale and does not make it retryable', () => { const operation = createClientOperation('auth-refresh', null); const failed = transitionClientOperation(operation, 'retryable-failure'); expect(clientOperationCanRetry(failed)).toBe(true); const cancelled = cancelClientOperation(failed); expect(cancelled.cancelled).toBe(true); expect(isCurrentClientOperation(cancelled, operation.operationId)).toBe( false, ); expect(clientOperationCanRetry(cancelled)).toBe(false); }); });