// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/core/data/models/home_feed.dart'; import 'package:fruitshorts/l10n/app_localizations.dart'; import 'package:fruitshorts/pages/discover/widgets/feed_banner_carousel.dart'; void main() { testWidgets('should_render_nothing_when_banner_list_is_empty', ( tester, ) async { await _pump(tester, const []); expect(find.byKey(const Key('feed-banner-carousel')), findsNothing); }); testWidgets('should_open_linked_drama_when_banner_is_tapped', (tester) async { FeedBanner? opened; await _pump(tester, const [ FeedBanner( id: 'banner-1', imageUrl: '/files/banner.jpg', linkType: 'DRAMA', linkValue: 'drama-1', ), ], onOpen: (banner) => opened = banner); expect(find.byKey(const Key('feed-banner-carousel')), findsOneWidget); expect(find.byKey(const Key('feed-banner-0')), findsOneWidget); await tester.tap(find.byKey(const Key('feed-banner-0'))); await tester.pump(); expect(opened?.dramaId, 'drama-1'); }); testWidgets('should_advance_to_next_banner_when_interval_elapses', ( tester, ) async { await _pump(tester, _banners); await tester.pump(const Duration(milliseconds: 4600)); await tester.pumpAndSettle(); expect(_page(tester), 1); }); testWidgets('should_pause_auto_advance_when_pointer_is_held', (tester) async { await _pump(tester, _banners); final gesture = await tester.startGesture( tester.getCenter(find.byKey(const Key('feed-banner-carousel'))), ); await tester.pump(const Duration(seconds: 5)); expect(_page(tester), 0); await gesture.up(); await tester.pump(const Duration(seconds: 5)); await tester.pumpAndSettle(); expect(_page(tester), 1); }); } const _banners = [ FeedBanner(id: 'banner-1', imageUrl: '/files/one.jpg'), FeedBanner(id: 'banner-2', imageUrl: '/files/two.jpg'), ]; double _page(WidgetTester tester) => tester.widget(find.byType(PageView)).controller!.page!; Future _pump( WidgetTester tester, List banners, { ValueChanged? onOpen, }) async { await tester.pumpWidget( MaterialApp( locale: const Locale('en'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Scaffold( body: FeedBannerCarousel(banners: banners, onOpen: onOpen ?? (_) {}), ), ), ); await tester.pump(); }