Files
ReelShort/test/ranking/ranking_page_test.dart
T

127 lines
4.2 KiB
Dart

// Author: fruit.com.cn
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fruitshorts/core/data/models/drama.dart';
import 'package:fruitshorts/core/data/models/feed_page.dart';
import 'package:fruitshorts/core/data/models/home_feed.dart';
import 'package:fruitshorts/core/data/repositories/catalog_repository.dart';
import 'package:fruitshorts/core/data/services/catalog_controller.dart';
import 'package:fruitshorts/core/theme/app_theme.dart';
import 'package:fruitshorts/l10n/app_localizations.dart';
import 'package:fruitshorts/pages/ranking/ranking_page.dart';
import 'package:provider/provider.dart';
void main() {
testWidgets('should_render_rank_badges_on_covers_for_all_entries', (
tester,
) async {
await _pumpPage(tester, [
_drama('a', viewCount: 400),
_drama('b', viewCount: 300),
_drama('c', viewCount: 200),
_drama('d', viewCount: 100),
]);
expect(find.byKey(const Key('ranking-top-1')), findsOneWidget);
expect(find.byKey(const Key('ranking-top-2')), findsOneWidget);
expect(find.byKey(const Key('ranking-top-3')), findsOneWidget);
expect(find.byKey(const Key('ranking-top-4')), findsOneWidget);
expect(find.byKey(const Key('ranking-row-cover-1')), findsOneWidget);
expect(find.byKey(const Key('ranking-title-1')), findsOneWidget);
});
testWidgets('should_hide_optional_fields_when_drama_has_no_data', (
tester,
) async {
await _pumpPage(tester, [_drama('solo')]);
expect(find.byKey(const Key('ranking-tag-1')), findsNothing);
expect(find.byIcon(Icons.local_fire_department_rounded), findsNothing);
});
testWidgets('should_show_optional_fields_when_present', (tester) async {
await _pumpPage(tester, [
_drama(
'rich',
viewCount: 15340000,
likeCount: 550,
tag: '新剧',
genre: '剧情',
synopsis: '以拟人化视角,重温长征岁月。',
),
]);
expect(find.byKey(const Key('ranking-tag-1')), findsOneWidget);
expect(find.text('新剧'), findsOneWidget);
expect(find.text('剧情'), findsOneWidget);
expect(find.text('以拟人化视角,重温长征岁月。'), findsOneWidget);
expect(find.text('1534w heat · 550 likes'), findsOneWidget);
final synopsis = tester.widget<Text>(find.text('以拟人化视角,重温长征岁月。'));
expect(synopsis.maxLines, 3);
expect(synopsis.overflow, TextOverflow.ellipsis);
final tag = tester.widget<Text>(find.byKey(const Key('ranking-tag-1')));
expect(tag.style?.color, isNotNull);
final synopsisRect = tester.getRect(find.text('以拟人化视角,重温长征岁月。'));
final tagRect = tester.getRect(find.byKey(const Key('ranking-tag-1')));
expect(tagRect.top - synopsisRect.bottom, lessThan(8));
});
}
Future<void> _pumpPage(WidgetTester tester, List<Drama> dramas) async {
final controller = CatalogController(_EmptyCatalogRepository());
controller.feed = HomeFeed(
sections: [FeedSection(code: 'hot', title: 'Hot', dramas: dramas)],
);
await tester.pumpWidget(
ChangeNotifierProvider.value(
value: controller,
child: MaterialApp(
theme: AppTheme.dark(),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const RankingPage(),
),
),
);
await tester.pumpAndSettle();
}
Drama _drama(
String id, {
int viewCount = 0,
int? likeCount,
String tag = '',
String genre = '',
String synopsis = '',
}) => Drama(
id: id,
title: 'Drama $id',
synopsis: synopsis,
posterUrl: '',
tag: tag,
genre: genre,
viewCount: viewCount,
likeCount: likeCount,
);
class _EmptyCatalogRepository implements CatalogRepository {
@override
Future<HomeFeed> fetchHomeFeed() async => const HomeFeed();
@override
Future<HomeFeed> fetchDiscoverFeed() async => const HomeFeed();
@override
Future<FeedPage> fetchFeed({
List<String> types = const [],
String? categoryId,
String? cursor,
int size = 10,
}) async => const FeedPage();
@override
Future<Drama> fetchDrama(String dramaId) async =>
Drama(id: dramaId, title: '', synopsis: '', posterUrl: '');
}