// Feed 组件 Widget 测试:InteractionBar 计数/回调、FreeQuotaBanner 显隐 import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:video_app/core/storage/token_store.dart'; import 'package:video_app/models/user_model.dart'; import 'package:video_app/models/video_item.dart'; import 'package:video_app/providers/auth_provider.dart'; import 'package:video_app/screens/feed/widgets/feed_overlays.dart'; import 'package:video_app/screens/feed/widgets/interaction_bar.dart'; VideoItem _item({ int likeCount = 5, int commentCount = 3, int favoriteCount = 2, }) => VideoItem( videoId: 101, author: VideoAuthor(userId: 1, nickname: '小明'), likeCount: likeCount, commentCount: commentCount, favoriteCount: favoriteCount, ); void main() { group('InteractionBar', () { testWidgets('渲染点赞/评论/收藏计数,≥10000 显示 x.xw', (tester) async { await tester.pumpWidget( ProviderScope( child: MaterialApp( home: Scaffold( body: InteractionBar( item: _item(likeCount: 12000), onLike: (_) {}, ), ), ), ), ); expect(find.text('1.2w'), findsOneWidget); // 点赞 expect(find.text('3'), findsOneWidget); // 评论 expect(find.text('2'), findsOneWidget); // 收藏 expect(find.text('分享'), findsOneWidget); }); testWidgets('已登录点击点赞触发回调', (tester) async { final container = ProviderContainer(); addTearDown(container.dispose); // 注入登录态(Token 内存缓存 + 用户模型) TokenStore.accessToken = 'test-token'; addTearDown(() => TokenStore.accessToken = null); await container .read(authProvider.notifier) .onLoginSuccess(UserModel(userId: 1, nickname: '测试')); int? likedId; await tester.pumpWidget( UncontrolledProviderScope( container: container, child: MaterialApp( home: Scaffold( body: InteractionBar( item: _item(), onLike: (id) => likedId = id, ), ), ), ), ); await tester.tap(find.byIcon(Icons.favorite_border)); expect(likedId, 101); }); testWidgets('已登录点击收藏触发 onFavorite 回调', (tester) async { final container = ProviderContainer(); addTearDown(container.dispose); TokenStore.accessToken = 'test-token'; addTearDown(() => TokenStore.accessToken = null); await container .read(authProvider.notifier) .onLoginSuccess(UserModel(userId: 1)); int? favId; await tester.pumpWidget( UncontrolledProviderScope( container: container, child: MaterialApp( home: Scaffold( body: InteractionBar( item: _item(), onLike: (_) {}, onFavorite: (id) => favId = id, ), ), ), ), ); await tester.tap(find.byIcon(Icons.star_border)); expect(favId, 101); }); }); group('FreeQuotaBanner', () { Future pump(WidgetTester tester, int? remaining) async { await tester.pumpWidget( MaterialApp( home: Scaffold(body: FreeQuotaBanner(remaining: remaining)), ), ); } testWidgets('remaining=2 显示剩余次数提示', (tester) async { await pump(tester, 2); expect(find.text('今日免费观看剩余 2 次'), findsOneWidget); }); testWidgets('remaining=0 显示已用完文案', (tester) async { await pump(tester, 0); expect(find.text('今日免费次数已用完,登录后继续观看'), findsOneWidget); }); testWidgets('remaining=5 不显示', (tester) async { await pump(tester, 5); expect(find.byType(Container), findsNothing); expect(find.textContaining('免费'), findsNothing); }); testWidgets('remaining=null 不显示', (tester) async { await pump(tester, null); expect(find.textContaining('免费'), findsNothing); }); }); }