Skip to content

Commit 7b5c6b2

Browse files
fix: optimize case listing and polish test run pages
Agent-Logs-Url: https://github.com/bg-playground/BGSTM/sessions/294d8d86-ccd0-403f-8efe-8eea70b4325f Co-authored-by: bg-playground <259109604+bg-playground@users.noreply.github.com>
1 parent 167f06b commit 7b5c6b2

4 files changed

Lines changed: 32 additions & 11 deletions

File tree

backend/app/crud/external_case_results.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""CRUD operations for External Case Results (BGSTM#303)."""
22

33
import uuid
4+
from collections import defaultdict
45
from typing import Any
56
from uuid import UUID
67

@@ -367,6 +368,16 @@ async def list_case_results_for_session(
367368
count_stmt = select(func.count()).select_from(ExternalCaseResult).where(ExternalCaseResult.session_id == session_id)
368369
total = (await db.execute(count_stmt)).scalar_one()
369370
rows = (await db.execute(stmt)).scalars().all()
371+
requirement_ids_by_test_case_id: dict[UUID, list[UUID]] = defaultdict(list)
372+
linked_test_case_ids = [row.test_case_id for row in rows if row.test_case_id is not None]
373+
if linked_test_case_ids:
374+
requirement_rows = await db.execute(
375+
select(RequirementTestCaseLink.test_case_id, RequirementTestCaseLink.requirement_id)
376+
.where(RequirementTestCaseLink.test_case_id.in_(linked_test_case_ids))
377+
.order_by(RequirementTestCaseLink.created_at.asc())
378+
)
379+
for test_case_id, requirement_id in requirement_rows.all():
380+
requirement_ids_by_test_case_id[test_case_id].append(requirement_id)
370381
for row in rows:
371-
row.requirement_ids = await _get_requirement_ids_for_test_case(db, test_case_id=row.test_case_id)
382+
row.requirement_ids = requirement_ids_by_test_case_id.get(row.test_case_id, []) if row.test_case_id else []
372383
return list(rows), total

backend/app/schemas/external_results.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class SessionResponse(BaseModel):
9595
git_branch: str | None = None
9696
ci_url: HttpUrl | None = None
9797
metadata: dict[str, Any] = Field(default_factory=dict)
98-
summary: dict[str, Any] | None = None
98+
summary: dict[str, Any] = Field(default_factory=dict)
9999

100100

101101
_TERMINAL_STATUSES = {RunStatus.passed, RunStatus.failed, RunStatus.aborted}

frontend/src/pages/TestRunDetailPage.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,20 @@ const TestRunDetailPage: React.FC = () => {
5252
}
5353
try {
5454
setLoading(true);
55-
const [sessionRes, casesRes] = await Promise.all([
56-
externalResultsApi.getSession(sessionId),
57-
externalResultsApi.listSessionCases(sessionId, { skip: 0, limit: 500 }),
58-
]);
55+
const sessionPromise = externalResultsApi.getSession(sessionId);
56+
const allCases: CaseResult[] = [];
57+
let skip = 0;
58+
const limit = 500;
59+
let total = 0;
60+
do {
61+
const caseRes = await externalResultsApi.listSessionCases(sessionId, { skip, limit });
62+
allCases.push(...caseRes.data.cases);
63+
total = caseRes.data.total;
64+
skip += caseRes.data.cases.length;
65+
} while (skip < total);
66+
const sessionRes = await sessionPromise;
5967
setSession(sessionRes.data);
60-
setCases(casesRes.data.cases);
68+
setCases(allCases);
6169
} catch (error) {
6270
console.error('Failed to load test run details:', error);
6371
showToast('Failed to load test run details', 'error');

frontend/src/pages/TestRunsPage.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,18 @@ export const TestRunsPage: React.FC = () => {
7979
await loadSessions();
8080
}, [loadSessions]);
8181

82+
const handleStatusFilterChange = useCallback((event: React.ChangeEvent<HTMLSelectElement>) => {
83+
setStatusFilter(event.target.value as StatusFilter);
84+
setPage(1);
85+
}, []);
86+
8287
return (
8388
<div className="container mx-auto px-4 py-8">
8489
<div className="flex items-center justify-between mb-6">
8590
<h1 className="text-3xl font-bold text-gray-900">Test Runs</h1>
8691
<select
8792
value={statusFilter}
88-
onChange={(e) => {
89-
setStatusFilter(e.target.value as StatusFilter);
90-
setPage(1);
91-
}}
93+
onChange={handleStatusFilterChange}
9294
className="px-3 py-2 border border-gray-300 rounded-md text-sm focus:ring-primary-500 focus:border-primary-500"
9395
>
9496
<option value="all">All</option>

0 commit comments

Comments
 (0)