Files
ReelShort/test/player/player_video_surface_test.dart
T

115 lines
3.3 KiB
Dart

// Author: fruit.com.cn
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:video_player/video_player.dart';
import 'package:fruitshorts/pages/player/widgets/player_video_surface.dart';
void main() {
testWidgets('should_keep_fallback_visible_before_video_is_ready', (
tester,
) async {
await _pumpSurface(tester);
expect(find.byKey(const Key('player-fallback-background')), findsOneWidget);
expect(find.byKey(const Key('player-fallback-cover')), findsOneWidget);
expect(_opacity(tester), 0);
expect(
tester.widget<Text>(find.byKey(const Key('player-debug-video'))).data,
'loading',
);
});
testWidgets('should_fade_video_in_within_200ms_after_first_frame', (
tester,
) async {
final controller = await _pumpSurface(tester);
expect(_opacity(tester), 0);
controller.value = const VideoPlayerValue(
duration: Duration(minutes: 1),
size: Size(1280, 720),
position: Duration(milliseconds: 1),
isInitialized: true,
isPlaying: true,
);
await tester.pump();
expect(_opacity(tester), 1);
expect(
tester
.widget<AnimatedOpacity>(
find.byKey(const Key('player-video-opacity')),
)
.duration,
const Duration(milliseconds: 200),
);
await tester.pump(const Duration(milliseconds: 100));
final halfway = _fadeValue(tester);
expect(halfway, greaterThan(0));
expect(halfway, lessThan(1));
await tester.pump(const Duration(milliseconds: 100));
expect(_fadeValue(tester), 1);
expect(find.byKey(const Key('player-fallback-background')), findsOneWidget);
});
testWidgets('should_show_video_error_above_retained_fallback', (
tester,
) async {
await _pumpSurface(
tester,
value: const VideoPlayerValue.erroneous('No route to host'),
);
expect(find.byKey(const Key('player-video-error')), findsOneWidget);
expect(find.text('No route to host'), findsOneWidget);
expect(find.byKey(const Key('player-fallback-background')), findsOneWidget);
expect(_opacity(tester), 0);
expect(
tester.widget<Text>(find.byKey(const Key('player-debug-video'))).data,
'error: No route to host',
);
});
}
Future<VideoPlayerController> _pumpSurface(
WidgetTester tester, {
VideoPlayerValue? value,
}) async {
final controller = VideoPlayerController.networkUrl(
Uri.parse('http://192.168.31.187:8081/files/video.mp4'),
);
addTearDown(controller.dispose);
if (value != null) controller.value = value;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: PlayerVideoSurface(
controller: controller,
posterUrl: '/files/poster.jpg',
videoUrl: controller.dataSource,
theater: false,
onTap: () {},
),
),
),
);
await tester.pump();
return controller;
}
double _opacity(WidgetTester tester) {
return tester
.widget<AnimatedOpacity>(find.byKey(const Key('player-video-opacity')))
.opacity;
}
double _fadeValue(WidgetTester tester) {
final fade = find.descendant(
of: find.byKey(const Key('player-video-opacity')),
matching: find.byType(FadeTransition),
);
return tester.widget<FadeTransition>(fade).opacity.value;
}