// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.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 'package:fruitshorts/app.dart'; import 'package:fruitshorts/core/data/models/comment.dart'; import 'package:fruitshorts/core/data/repositories/comment_repository.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 '../support/fake_catalog.dart'; import '../support/fake_category.dart'; import '../support/fake_haptics.dart'; import '../support/fake_interaction_repositories.dart'; import '../support/fake_notice_repository.dart'; import '../support/widget_player.dart'; void main() { setUp(() { SharedPreferencesAsyncPlatform.instance = InMemorySharedPreferencesAsync.empty(); }); testWidgets('should_render_card_player_progress_and_three_action_buttons', ( tester, ) async { await _pumpApp(tester); await _openCityLights(tester); final frame = tester.widget( find.byKey(const Key('card-player-video-frame')), ); expect(frame.aspectRatio, closeTo(9 / 10, 0.001)); expect(find.byKey(const Key('player-back')), findsOneWidget); expect(find.byKey(const Key('player-title')), findsOneWidget); expect(find.byKey(const Key('player-more')), findsOneWidget); expect(find.byKey(const Key('card-player-progress')), findsOneWidget); expect(find.byKey(const Key('card-player-episodes')), findsOneWidget); expect(find.byKey(const Key('card-player-comments')), findsOneWidget); expect(find.byKey(const Key('card-player-next')), findsOneWidget); final theme = tester.widget( find.ancestor( of: find.byKey(const Key('card-player-progress')), matching: find.byType(SliderTheme), ), ); expect(theme.data.trackHeight, 1.5); expect(theme.data.activeTrackColor, AppColors.blue); expect(theme.data.thumbColor, Colors.white); expect(theme.data.inactiveTrackColor, Colors.white.withValues(alpha: 0.15)); final next = tester.widget( find.byKey(const Key('card-player-next')), ); expect(next.onPressed, isNotNull); await tester.tap(find.byKey(const Key('card-player-next'))); await tester.pumpAndSettle(); expect( tester.widget(find.byKey(const Key('player-title'))).data, contains('Episode 2'), ); expect(tester.takeException(), isNull); }); testWidgets('should_disable_next_episode_on_the_last_episode', ( tester, ) async { await _pumpApp(tester); await _openCityLights(tester); for (var index = 0; index < 6; index++) { await tester.tap(find.byKey(const Key('card-player-next'))); await tester.pumpAndSettle(); } expect( tester.widget(find.byKey(const Key('player-title'))).data, contains('Episode 7'), ); final next = tester.widget( find.byKey(const Key('card-player-next')), ); expect(next.onPressed, isNull); expect(tester.takeException(), isNull); }); testWidgets('should_show_featured_comment_when_comments_exist', ( tester, ) async { await _pumpApp( tester, comments: FakeCommentRepository( pages: const [ CommentPage( comments: [ DramaComment( id: 'c1', dramaId: 'city-lights-demo', episodeId: '0', parentId: '0', rootId: '0', userId: '9', uid: 'U9', nickname: 'Lina', avatarUrl: '', content: 'The banquet scene gave me chills.', status: 'approved', auditReason: '', likeCount: 428, replyCount: 0, reportCount: 0, createdAt: null, mine: false, liked: false, ), ], ), ], ), ); await _openCityLights(tester); expect(find.byKey(const Key('player-featured-comment')), findsOneWidget); expect(find.text('Lina'), findsOneWidget); expect(find.text('428'), findsOneWidget); expect(find.byKey(const Key('player-comments-view-all')), findsOneWidget); await tester.tap(find.byKey(const Key('player-comments-view-all'))); await tester.pumpAndSettle(); expect(find.text('The banquet scene gave me chills.'), findsWidgets); }); } Future _openCityLights(WidgetTester tester) async { await tester.tap(find.byKey(const Key('tab-discover'))); await tester.pumpAndSettle(); await tester.tap(find.text('City Lights & Velvet Nights')); await tester.pumpAndSettle(); } Future _pumpApp( WidgetTester tester, { CommentRepository? comments, }) 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: comments ?? FakeCommentRepository(), interactionRepository: FakeInteractionRepository(), noticeRepository: FakeNoticeRepository(), haptics: FakeHaptics(), ), ); await tester.pumpAndSettle(); }