import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:reelbox/data/models.dart'; import 'package:reelbox/ui/catalog.dart'; import 'catalog_widget_test.dart' show CatalogApi, mountCatalog; class DiscoveryApi extends CatalogApi { @override Future>> actors({ int page = 1, String search = '', }) async => []; @override Future>> playlists({ bool mine = false, String userId = '', int page = 1, }) async => []; @override Future>> curatedLinks({bool best = false}) async => []; @override Future> bestRandom({ bool byYear = false, int page = 1, }) async => []; } Future openDirectory(WidgetTester tester) async { await tester.tap(find.byTooltip('Explore more')); await tester.pumpAndSettle(); } void main() { for (final preset in [ ('Best titles', 'mixed', 0, 'rating'), ('Newest titles', 'mixed', 0, 'created'), ('Popular titles', 'mixed', 0, 'rating'), ('Top 250 movies', 'movie', 0, 'imdb'), ('Top 250 series', 'serie', 0, 'imdb'), ('Korean series', 'serie', 36, 'created'), ('Chinese / Japanese series', 'serie', 37, 'created'), ('Turkish series', 'serie', 35, 'created'), ('Indian series', 'serie', 38, 'created'), ('Indian movies', 'movie', 38, 'created'), ('Most-viewed movies', 'movie', 0, 'views'), ('Most-viewed series', 'serie', 0, 'views'), ]) { testWidgets( '${preset.$1} ${preset.$4 == 'views' ? 'is unavailable on Iran' : 'uses the Iran catalog contract'}', (tester) async { final api = DiscoveryApi(); await mountCatalog(tester, api, const DiscoverPage()); await openDirectory(tester); if (preset.$4 == 'views') { final list = tester.widget(find.byType(ListView)); final children = (list.childrenDelegate as SliverChildListDelegate).children; expect( children.whereType().map( (tile) => (tile.title as Text).data, ), isNot(contains(preset.$1)), ); expect(api.catalogCalls, isEmpty); } else { await tester.scrollUntilVisible(find.text(preset.$1), 300); await tester.ensureVisible(find.text(preset.$1)); await tester.pumpAndSettle(); await tester.tap(find.text(preset.$1)); await tester.pumpAndSettle(); expect(api.catalogCalls, [ for (final page in [0, 1, 2]) { 'kind': preset.$2, 'genre': preset.$3, 'country': 0, 'order': preset.$4, 'page': page, }, ]); } }, ); } for (final entry in [ ('Actors', ActorsPage), ('Editor picks', CuratedPage), ('Best collections', CuratedPage), ('Best by year', RecommendationsPage), ]) { testWidgets('Discover reaches ${entry.$1}', (tester) async { await mountCatalog(tester, DiscoveryApi(), const DiscoverPage()); await openDirectory(tester); await tester.scrollUntilVisible(find.text(entry.$1), 300); await tester.ensureVisible(find.text(entry.$1)); await tester.pumpAndSettle(); await tester.tap(find.text(entry.$1)); await tester.pumpAndSettle(); expect(find.byType(entry.$2), findsOneWidget); if (entry.$1 == 'Best by year') { expect( tester .widget(find.byType(RecommendationsPage)) .byYear, isTrue, ); } }); } }