Files
ReelShort/test/home/home_ranking_dramas_test.dart

87 lines
2.9 KiB
Dart

// 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<DecoratedBox>(
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<List<ContentCategory>> fetchCategories() async => const [];
@override
Future<HomeFeed> fetchDiscoverFeed() async => const HomeFeed();
}