146 lines
5.0 KiB
Dart
146 lines
5.0 KiB
Dart
// Author: fruit.com.cn
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'package:fruitshorts/core/data/models/drama.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/data/services/catalog_controller.dart';
|
|
import 'package:fruitshorts/core/data/services/favorite_controller.dart';
|
|
import 'package:fruitshorts/core/data/services/interaction_controller.dart';
|
|
import 'package:fruitshorts/core/platform/haptics.dart';
|
|
import 'package:fruitshorts/core/theme/app_theme.dart';
|
|
import 'package:fruitshorts/l10n/app_localizations.dart';
|
|
import 'package:fruitshorts/pages/drama_detail/drama_detail_view.dart';
|
|
|
|
import '../support/fake_catalog.dart';
|
|
import '../support/fake_haptics.dart';
|
|
import '../support/fake_interaction_repositories.dart';
|
|
|
|
void main() {
|
|
testWidgets('should_render_preview_hero_cta_synopsis_and_episode_chips', (
|
|
tester,
|
|
) async {
|
|
tester.view.physicalSize = const Size(390, 844);
|
|
tester.view.devicePixelRatio = 1;
|
|
addTearDown(tester.view.resetPhysicalSize);
|
|
addTearDown(tester.view.resetDevicePixelRatio);
|
|
|
|
await tester.pumpWidget(_host(_detailDrama()));
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(tester.getSize(find.byKey(const Key('detail-hero'))).height, 190);
|
|
expect(
|
|
tester.getSize(find.byKey(const Key('detail-back'))),
|
|
const Size(36, 36),
|
|
);
|
|
expect(
|
|
tester
|
|
.widget<Icon>(
|
|
find.descendant(
|
|
of: find.byKey(const Key('detail-back')),
|
|
matching: find.byType(Icon),
|
|
),
|
|
)
|
|
.size,
|
|
18,
|
|
);
|
|
expect(find.byKey(const Key('detail-cta')), findsOneWidget);
|
|
expect(tester.getSize(find.byKey(const Key('detail-cta'))).height, 40);
|
|
expect(find.byKey(const Key('detail-episode-chip-1')), findsOneWidget);
|
|
expect(find.byKey(const Key('detail-episode-chip-8')), findsOneWidget);
|
|
|
|
final synopsis = tester.widget<Text>(
|
|
find.byKey(const Key('detail-synopsis')),
|
|
);
|
|
expect(synopsis.style?.fontSize, 11);
|
|
expect(synopsis.style?.height, 1.6);
|
|
|
|
await tester.tap(find.byKey(const Key('detail-more')));
|
|
await tester.pumpAndSettle();
|
|
expect(find.byKey(const Key('detail-favorite')), findsOneWidget);
|
|
expect(find.byKey(const Key('detail-download')), findsOneWidget);
|
|
expect(find.byKey(const Key('detail-share')), findsOneWidget);
|
|
expect(find.byKey(const Key('detail-report')), findsOneWidget);
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
|
|
testWidgets('should_fit_compact_viewport_when_detail_scrolls', (
|
|
tester,
|
|
) async {
|
|
tester.view.physicalSize = const Size(320, 568);
|
|
tester.view.devicePixelRatio = 1;
|
|
addTearDown(tester.view.resetPhysicalSize);
|
|
addTearDown(tester.view.resetDevicePixelRatio);
|
|
|
|
await tester.pumpWidget(_host(_detailDrama()));
|
|
await tester.pumpAndSettle();
|
|
await tester.drag(
|
|
find.byKey(const Key('detail-scroll')),
|
|
const Offset(0, -520),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
|
|
expect(find.byKey(const Key('detail-episode-chip-8')), findsOneWidget);
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
}
|
|
|
|
Widget _host(Drama drama) {
|
|
final catalog = FakeCatalogRepository(dramas: [drama]);
|
|
return MultiProvider(
|
|
providers: [
|
|
Provider<WatchHistoryRepository>.value(
|
|
value: InMemoryWatchHistoryRepository(),
|
|
),
|
|
Provider<PlaybackRepository>.value(value: FakePlaybackRepository()),
|
|
Provider<Haptics>.value(value: FakeHaptics()),
|
|
ChangeNotifierProvider(
|
|
create: (_) => FavoriteController(InMemoryFavoriteRepository()),
|
|
),
|
|
ChangeNotifierProvider(
|
|
create: (_) => InteractionController(FakeInteractionRepository()),
|
|
),
|
|
ChangeNotifierProvider(create: (_) => CatalogController(catalog)..load()),
|
|
],
|
|
child: MaterialApp(
|
|
theme: AppTheme.dark(),
|
|
locale: const Locale('en'),
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
home: DramaDetailPage(drama: drama),
|
|
),
|
|
);
|
|
}
|
|
|
|
Drama _detailDrama() {
|
|
return Drama(
|
|
id: 'detail-k25',
|
|
title: 'Detail K25',
|
|
synopsis:
|
|
'She agreed to marry a mysterious stranger to save her family, '
|
|
'until she discovered his secret identity and the city he controls.',
|
|
posterUrl: '/files/detail-k25.png',
|
|
genre: 'Urban Romance',
|
|
category: 'Romance',
|
|
totalEpisodes: 8,
|
|
viewCount: 4800000,
|
|
detailLoaded: true,
|
|
episodes: [
|
|
for (var number = 1; number <= 8; number++)
|
|
Episode(
|
|
id: 'detail-k25-$number',
|
|
number: number,
|
|
title: 'Episode $number',
|
|
isFree: number == 1,
|
|
durationSec: 135,
|
|
locked: number > 1,
|
|
videoUrl: number == 1 ? '/files/detail-k25-1.mp4' : '',
|
|
),
|
|
],
|
|
);
|
|
}
|