fix: give final acceptance a shared retry budget and diagnostics
This commit is contained in:
1 parent
50638d4130
commit
32441e79c4
18 files changed
+779
-40
No files matched your search
+41
-1
@@ -1,7 +1,7 @@
|
||||
import { fakeAsync, TestBed, tick } from '@angular/core/testing';
|
||||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
|
||||
import { LlmRequestStatusComponent, ModelRequest, requestHint } from './llm-request-status.component';
|
||||
import { FinalReview, LlmRequestStatusComponent, ModelRequest, requestHint, reviewStage } from './llm-request-status.component';
|
||||
|
||||
const waiting: ModelRequest = {
|
||||
request_id: 'call-1', attempt_id: 'attempt-1', model: 'gpt-6-luna', role: 'FlashRunner',
|
||||
@@ -78,4 +78,44 @@ describe('模型请求诊断', () => {
|
||||
expect(text).toContain('本次工具尚未执行');
|
||||
fixture.destroy();
|
||||
});
|
||||
|
||||
it('无模型请求时仍展示验收阶段与总预算,耗尽后保留明确原因', fakeAsync(() => {
|
||||
const fixture = TestBed.createComponent(LlmRequestStatusComponent);
|
||||
const http = TestBed.inject(HttpTestingController);
|
||||
const now = Date.now() / 1000;
|
||||
const review: FinalReview = {
|
||||
review_id: 'review-1', attempt_id: 'final#1', status: 'running', stage: 'reading_evidence', active: true,
|
||||
started_at: now - 20, deadline_at: now + 80, total_seconds: 100, elapsed_seconds: 20, remaining_seconds: 80,
|
||||
request_count: 2, retry_count: 1, max_retries: 5
|
||||
};
|
||||
fixture.componentRef.setInput('sessionId', 'review-task');
|
||||
fixture.componentRef.setInput('running', true);
|
||||
fixture.detectChanges();
|
||||
http.expectOne('/api/sessions/review-task/request-diagnostics').flush({ requests: [], final_reviews: [review] });
|
||||
fixture.detectChanges();
|
||||
const text = fixture.nativeElement.querySelector('.review-live').textContent;
|
||||
expect(text).toContain('正在读取验收证据');
|
||||
expect(text).toContain('测试仍为待判定');
|
||||
expect(text).toContain('剩余验收预算 80 秒');
|
||||
expect(text).toContain('已重试 1 次');
|
||||
tick(1000); fixture.detectChanges();
|
||||
expect(fixture.nativeElement.querySelector('.review-live').textContent).toContain('剩余验收预算 79 秒');
|
||||
tick(2000);
|
||||
http.expectOne('/api/sessions/review-task/request-diagnostics').flush({ requests: [], final_reviews: [{
|
||||
...review, active: false, status: 'budget_exhausted', ended_at: now + 3, elapsed_seconds: 100
|
||||
}] });
|
||||
fixture.detectChanges();
|
||||
expect(fixture.nativeElement.querySelector('.review-live')).toBeNull();
|
||||
expect(fixture.nativeElement.textContent).toContain('验收总预算已用尽');
|
||||
expect(fixture.nativeElement.textContent).toContain('未确认通过');
|
||||
fixture.destroy(); tick(3000);
|
||||
http.expectNone('/api/sessions/review-task/request-diagnostics');
|
||||
}));
|
||||
|
||||
it('区分重试耗尽、验收中断与完成,不把完成当成通过', () => {
|
||||
const review = { status: 'request_retries_exhausted' } as FinalReview;
|
||||
expect(reviewStage(review)).toBe('验收请求重试已用尽');
|
||||
expect(reviewStage({ ...review, status: 'cancelled' })).toBe('验收已中断');
|
||||
expect(reviewStage({ ...review, status: 'completed' })).toBe('验收完成');
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user