import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:patbond_flutter/core/theme/app_theme.dart'; import 'package:patbond_flutter/core/widgets/upload_progress_overlay.dart'; import 'package:patbond_flutter/features/community/media_uploader.dart'; /// UploadProgressOverlay(05 号规范 §3.3):排队 / 上传中 / 失败三态 /// 形态与失败整格点按重试。 void main() { Widget host(Widget overlay) => MaterialApp( home: Scaffold(body: SizedBox(width: 100, height: 100, child: overlay)), ); testWidgets('排队态:scrim + 「等待中」胶囊', (tester) async { await tester.pumpWidget( host(const UploadProgressOverlay(phase: MediaItemPhase.queued)), ); expect(find.text('等待中'), findsOneWidget); expect(find.byType(CircularProgressIndicator), findsNothing); }); testWidgets('上传中态:环形进度带 value + 百分比胶囊', (tester) async { await tester.pumpWidget( host( const UploadProgressOverlay( phase: MediaItemPhase.uploading, progress: 0.4, ), ), ); final indicator = tester.widget( find.byType(CircularProgressIndicator), ); expect(indicator.value, 0.4); expect(find.text('40%'), findsOneWidget); }); testWidgets('confirming 定格 100%', (tester) async { await tester.pumpWidget( host( const UploadProgressOverlay( phase: MediaItemPhase.confirming, progress: 0.4, ), ), ); expect(find.text('100%'), findsOneWidget); }); testWidgets('失败态:errorDark 图标 + 重试通栏,整格点按触发 onRetry', (tester) async { var retried = 0; await tester.pumpWidget( host( UploadProgressOverlay( phase: MediaItemPhase.failed, onRetry: () => retried++, ), ), ); final icon = tester.widget(find.byIcon(Icons.error_outline)); expect(icon.color, AppColors.errorDark); expect(find.text('重试'), findsOneWidget); // 整格(含图标区)点按即重试。 await tester.tap(find.byIcon(Icons.error_outline)); expect(retried, 1); }); testWidgets('失败终态(onRetry null):不显示重试通栏', (tester) async { await tester.pumpWidget( host(const UploadProgressOverlay(phase: MediaItemPhase.failed)), ); expect(find.text('重试'), findsNothing); }); testWidgets('成功态:150ms 淡出且不拦截点击、无残留文案', (tester) async { await tester.pumpWidget( host(const UploadProgressOverlay(phase: MediaItemPhase.ready)), ); await tester.pumpAndSettle(); expect(find.text('等待中'), findsNothing); expect(find.text('重试'), findsNothing); expect(find.byType(IgnorePointer), findsWidgets); }); }