138 lines
4.2 KiB
Dart
138 lines
4.2 KiB
Dart
// 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<void> 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);
|
|
});
|
|
});
|
|
}
|