// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/core/data/models/category_ranking.dart'; import 'package:fruitshorts/core/data/models/content_category.dart'; import 'package:fruitshorts/core/data/models/drama.dart'; import 'package:fruitshorts/core/data/models/home_feed.dart'; import 'package:fruitshorts/core/data/repositories/category_repository.dart'; import 'package:fruitshorts/core/data/services/category_controller.dart'; import 'package:fruitshorts/core/theme/app_colors.dart'; import 'package:fruitshorts/core/theme/app_theme.dart'; import 'package:fruitshorts/l10n/app_localizations.dart'; import 'package:fruitshorts/pages/home/widgets/home_ranking_dramas.dart'; import 'package:provider/provider.dart'; void main() { testWidgets('should_render_uniform_rows_in_server_rank_order', ( tester, ) async { final controller = CategoryController(_EmptyCategoryRepository()); controller.rankingSlotOf('ranking').ranking = CategoryRanking( id: 'ranking', code: 'RECOMMEND_RANKING', revision: '4', entries: [ for (var rank = 1; rank <= 4; rank++) CategoryRankingEntry(rank: rank, drama: _drama('$rank')), ], ); Drama? opened; await tester.pumpWidget( ChangeNotifierProvider.value( value: controller, child: MaterialApp( theme: AppTheme.dark(), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Scaffold( body: HomeRankingDramas( categoryId: 'ranking', onOpenDrama: (drama) => opened = drama, ), ), ), ), ); await tester.pumpAndSettle(); for (var rank = 1; rank <= 4; rank++) { expect(find.byKey(Key('ranking-top-$rank')), findsOneWidget); expect(find.byKey(Key('ranking-row-${rank - 1}')), findsOneWidget); } expect(find.byKey(const Key('home-ranking-top-1')), findsNothing); final surface = tester.widget( find.byKey(const Key('home-ranking-surface')), ); final gradient = (surface.decoration as BoxDecoration).gradient! as LinearGradient; expect(gradient.colors.first, AppColors.followingGlow); expect( tester.getSize(find.byKey(const Key('ranking-row-cover-1'))), const Size(96, 128), ); await tester.tap(find.byKey(const Key('ranking-top-2'))); expect(opened?.id, '2'); }); } Drama _drama(String id) => Drama( id: id, title: 'Rank $id', synopsis: '', posterUrl: '', viewCount: int.parse(id) * 10, ); class _EmptyCategoryRepository implements CategoryRepository { @override Future> fetchCategories() async => const []; @override Future fetchDiscoverFeed() async => const HomeFeed(); }