Skip to content

Commit f20d3ad

Browse files
authored
default text if summary is null or empty (#5016)
Fix: flutter/flutter#184360
1 parent 569810c commit f20d3ad

File tree

2 files changed

+84
-5
lines changed

2 files changed

+84
-5
lines changed

dashboard/lib/views/presubmit_view.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,9 @@ class _JobDetailsViewerPaneState extends State<_JobDetailsViewerPane> {
459459
width: double.infinity,
460460
child: SingleChildScrollView(
461461
child: Text(
462-
selectedJob.summary ?? _getDefaultJobDetails(selectedJob),
462+
selectedJob.summary?.trim().isEmpty ?? true
463+
? _getDefaultJobDetails(selectedJob)
464+
: selectedJob.summary!,
463465
style: const TextStyle(
464466
fontFamily: 'monospace',
465467
fontSize: 13,
@@ -518,16 +520,16 @@ class _JobDetailsViewerPaneState extends State<_JobDetailsViewerPane> {
518520
String _getDefaultJobDetails(PresubmitJobResponse job) {
519521
return switch (job.status) {
520522
.succeeded =>
521-
'${job.jobName} executed successfully.\nClick "View more details on LUCI UI" button bellow for more details.',
523+
'${job.jobName} executed successfully.\nClick "View more details on LUCI UI" button below for more details.',
522524
.failed =>
523-
'${job.jobName} failed.\nClick "View more details on LUCI UI" button bellow for more details.',
525+
'${job.jobName} failed.\nClick "View more details on LUCI UI" button below for more details.',
524526
.infraFailure =>
525-
'Infrastructure failed during execution of ${job.jobName}.\nClick "View more details on LUCI UI" button bellow for more details.',
527+
'Infrastructure failed during execution of ${job.jobName}.\nClick "View more details on LUCI UI" button below for more details.',
526528
.skipped => '${job.jobName} is skipped.',
527529
.neutral => '${job.jobName} is disabled.',
528530
.cancelled => '${job.jobName} is cancelled.',
529531
.inProgress =>
530-
'${job.jobName} is in progress.\nClick "View more details on LUCI UI" button bellow to see execution details.',
532+
'${job.jobName} is in progress.\nClick "View more details on LUCI UI" button below to see execution details.',
531533
.waitingForBackfill =>
532534
'${job.jobName} is not yet scheduled for execution.\n"View more details on LUCI UI" button will become enabled once the job is scheduled.',
533535
};

dashboard/test/views/presubmit_view_test.dart

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,83 @@ void main() {
281281
expect(find.textContaining('Status: Failed'), findsOneWidget);
282282
});
283283

284+
testWidgets('PreSubmitView displays default job details when summary is empty', (
285+
WidgetTester tester,
286+
) async {
287+
tester.view.physicalSize = const Size(2000, 1080);
288+
tester.view.devicePixelRatio = 1.0;
289+
addTearDown(tester.view.resetPhysicalSize);
290+
addTearDown(tester.view.resetDevicePixelRatio);
291+
292+
const mockSha = 'decaf_3_real_sha';
293+
const guardResponse = PresubmitGuardResponse(
294+
prNum: 123,
295+
author: 'dash',
296+
guardStatus: GuardStatus.failed,
297+
checkRunId: 456,
298+
stages: [
299+
PresubmitGuardStage(
300+
name: 'Engine',
301+
createdAt: 0,
302+
builds: {'Mac mac_host_engine 1': TaskStatus.failed},
303+
),
304+
],
305+
);
306+
307+
when(
308+
mockCocoonService.fetchPresubmitGuard(
309+
repo: anyNamed('repo'),
310+
sha: mockSha,
311+
),
312+
).thenAnswer((_) async => const CocoonResponse.data(guardResponse));
313+
314+
when(
315+
mockCocoonService.fetchPresubmitJobDetails(
316+
checkRunId: anyNamed('checkRunId'),
317+
jobName: argThat(contains('mac_host_engine'), named: 'jobName'),
318+
),
319+
).thenAnswer(
320+
(_) async => CocoonResponse.data([
321+
PresubmitJobResponse(
322+
attemptNumber: 1,
323+
jobName: 'Mac mac_host_engine 1',
324+
creationTime: 0,
325+
status: TaskStatus.failed,
326+
summary: '', // Empty summary
327+
),
328+
]),
329+
);
330+
331+
await tester.runAsync(() async {
332+
await tester.pumpWidget(
333+
createPreSubmitView({'repo': 'flutter', 'pr': '123'}),
334+
);
335+
for (var i = 0; i < 50; i++) {
336+
await tester.pump();
337+
await Future<void>.delayed(const Duration(milliseconds: 50));
338+
if (find.textContaining('by dash').evaluate().isNotEmpty) break;
339+
}
340+
});
341+
await tester.pumpAndSettle();
342+
343+
expect(find.textContaining('PR #123'), findsOneWidget);
344+
345+
await tester.tap(find.textContaining('mac_host_engine').first);
346+
await tester.runAsync(() async {
347+
for (var i = 0; i < 50; i++) {
348+
await tester.pump();
349+
await Future<void>.delayed(const Duration(milliseconds: 50));
350+
if (find.textContaining('Mac mac_host_engine 1 failed.').evaluate().isNotEmpty) {
351+
break;
352+
}
353+
}
354+
});
355+
await tester.pumpAndSettle();
356+
357+
expect(find.textContaining('Mac mac_host_engine 1 failed.'), findsOneWidget);
358+
expect(find.textContaining('Click "View more details on LUCI UI" button below for more details.'), findsOneWidget);
359+
});
360+
284361
testWidgets(
285362
'PreSubmitView automatically selects latest SHA and updates sidebar when opened with PR only',
286363
(WidgetTester tester) async {

0 commit comments

Comments
 (0)