// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fruitshorts/app.dart'; import 'package:fruitshorts/core/data/repositories/favorite_repository.dart'; import 'package:fruitshorts/core/data/repositories/playback_repository.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; import 'package:fruitshorts/core/theme/app_colors.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; import 'package:shared_preferences_platform_interface/shared_preferences_async_platform_interface.dart'; import '../support/fake_catalog.dart'; import '../support/fake_category.dart'; import '../support/fake_haptics.dart'; import '../support/fake_interaction_repositories.dart'; import '../support/widget_player.dart'; const _keys = [ Key('home-tabs-bar'), Key('tab-home'), Key('tab-discover'), Key('tab-my'), ]; void main() { setUp(() { SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.withData({ 'auth.accessToken': 'test-access', 'auth.refreshToken': 'test-refresh', 'auth.user': '{"uid":"9","nickname":"Viewer","avatarUrl":""}', }); }); testWidgets('should_theme_three_tabs_and_switch_selected_state_when_tapped', ( tester, ) async { final haptics = FakeHaptics(); await _pumpApp(tester, haptics); haptics.reset(); for (final key in _keys) { expect(find.byKey(key), findsOneWidget); } for (final key in _keys.skip(1)) { expect(tester.getSize(find.byKey(key)).height, greaterThanOrEqualTo(48)); } final barFinder = find.byKey(const Key('home-tabs-bar')); final bar = tester.widget(barFinder); final decoration = bar.decoration as BoxDecoration; final border = decoration.border as Border; expect(decoration.color, AppColors.bar.withValues(alpha: 0.95)); expect(border.top.color, AppColors.border); expect(border.top.color.a, lessThan(0.2)); expect(border.top.color, isNot(Colors.white)); expect( tester .widget( find.descendant( of: find.byKey(const Key('tab-home')), matching: find.byType(AnimatedContainer), ), ) .duration, lessThanOrEqualTo(const Duration(milliseconds: 200)), ); expect( find.descendant( of: find.byKey(const Key('tab-home')), matching: find.byIcon(Icons.home_rounded), ), findsOneWidget, ); await tester.tap(find.byKey(const Key('tab-discover'))); await tester.pumpAndSettle(); expect(haptics.selectionClicks, 1); await tester.tap(find.byKey(const Key('tab-discover'))); await tester.pumpAndSettle(); expect(haptics.selectionClicks, 1); expect( find.descendant( of: find.byKey(const Key('tab-discover')), matching: find.byIcon(Icons.explore_rounded), ), findsOneWidget, ); expect( find.descendant( of: find.byKey(const Key('tab-home')), matching: find.byIcon(Icons.home_outlined), ), findsOneWidget, ); }); testWidgets('should_hide_themed_navigation_when_immersive_mode_is_enabled', ( tester, ) async { await _pumpApp(tester); await tester.tap(find.byTooltip('Clear screen')); await tester.pumpAndSettle(); for (final key in _keys) { expect(find.byKey(key), findsNothing); } }); testWidgets('should_map_three_tabs_to_home_discover_and_me', (tester) async { await _pumpApp(tester); expect(find.byKey(const Key('tab-my-list')), findsNothing); expect(find.byKey(const Key('tab-home')), findsOneWidget); expect(find.byKey(const Key('tab-discover')), findsOneWidget); expect(find.byKey(const Key('tab-my')), findsOneWidget); expect(find.byKey(const Key('home-feed-info-card')), findsOneWidget); await tester.tap(find.byKey(const Key('tab-discover'))); await tester.pumpAndSettle(); expect(find.byKey(const Key('home-all-dramas-grid')), findsOneWidget); await tester.tap(find.byKey(const Key('tab-my'))); await tester.pumpAndSettle(); expect(find.text('Viewer'), findsOneWidget); expect( find.byKey(const Key('mine-library-tab-0'), skipOffstage: false), findsOneWidget, ); await tester.tap(find.byKey(const Key('tab-home'))); await tester.pumpAndSettle(); expect(find.byKey(const Key('home-feed-info-card')), findsOneWidget); }); testWidgets('should_not_haptic_when_ordinary_list_item_is_opened', ( tester, ) async { final haptics = FakeHaptics(); await _pumpApp(tester, haptics); await tester.tap(find.byKey(const Key('tab-my'))); await tester.pumpAndSettle(); haptics.reset(); await tester.drag(find.byType(ListView), const Offset(0, -700)); await tester.pumpAndSettle(); await tester.tap(find.text('App Language')); await tester.pumpAndSettle(); expect(haptics.calls, isEmpty); }); } Future _pumpApp(WidgetTester tester, [FakeHaptics? haptics]) async { tester.view.physicalSize = const Size(390, 844); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); final catalog = FakeCatalogRepository(); await tester.pumpWidget( LumaDramaApp( playerFactory: createWidgetPlayer, catalogRepository: catalog, categoryRepository: FakeCategoryRepository(catalog: catalog), watchHistoryRepository: InMemoryWatchHistoryRepository(), favoriteRepository: InMemoryFavoriteRepository(cards: catalog.dramas), playbackRepository: FakePlaybackRepository(), commentRepository: FakeCommentRepository(), interactionRepository: FakeInteractionRepository(), haptics: haptics ?? FakeHaptics(), ), ); await tester.pumpAndSettle(); await tester.tap(find.byKey(const Key('tab-home'))); await tester.pumpAndSettle(); }