144 lines
4.9 KiB
Dart
144 lines
4.9 KiB
Dart
// 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/models/watch_progress.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/l10n/app_localizations.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_interaction_repositories.dart';
|
|
import '../support/widget_player.dart';
|
|
|
|
const _viewport = Size(390, 844);
|
|
const _tolerance = 0.1;
|
|
const _dramaId = 'the-signal-demo';
|
|
const _banner = Key('following-continue-banner');
|
|
const _page = Key('following-page');
|
|
const _favoritesGrid = Key('following-favorites-grid');
|
|
const _historyRecord = WatchProgress(
|
|
dramaId: _dramaId,
|
|
episodeId: 'the-signal-demo-3',
|
|
dramaTitle: 'Recent story',
|
|
episodeNumber: 3,
|
|
totalEpisodes: 8,
|
|
position: Duration(seconds: 25),
|
|
duration: Duration(seconds: 100),
|
|
);
|
|
|
|
Future<void> _pumpFollowing(
|
|
WidgetTester tester, {
|
|
bool hasFavorites = true,
|
|
}) async {
|
|
tester.view.physicalSize = _viewport;
|
|
tester.view.devicePixelRatio = 1;
|
|
addTearDown(tester.view.resetPhysicalSize);
|
|
addTearDown(tester.view.resetDevicePixelRatio);
|
|
final catalog = FakeCatalogRepository();
|
|
final cards = hasFavorites
|
|
? catalog.dramas.take(1).toList()
|
|
: catalog.dramas.take(0).toList();
|
|
await tester.pumpWidget(
|
|
LumaDramaApp(
|
|
playerFactory: createWidgetPlayer,
|
|
catalogRepository: catalog,
|
|
categoryRepository: FakeCategoryRepository(catalog: catalog),
|
|
watchHistoryRepository: InMemoryWatchHistoryRepository(
|
|
seed: [_historyRecord],
|
|
),
|
|
favoriteRepository: InMemoryFavoriteRepository(
|
|
cards: cards,
|
|
saved: cards.map((drama) => drama.id).toSet(),
|
|
),
|
|
playbackRepository: FakePlaybackRepository(),
|
|
commentRepository: FakeCommentRepository(),
|
|
interactionRepository: FakeInteractionRepository(),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
await tester.tap(find.byKey(const Key('tab-follow')));
|
|
await tester.pumpAndSettle();
|
|
}
|
|
|
|
void main() {
|
|
setUp(() {
|
|
SharedPreferencesAsyncPlatform.instance =
|
|
InMemorySharedPreferencesAsync.empty();
|
|
});
|
|
|
|
testWidgets('should_hide_continue_banner_when_recent_history_exists', (
|
|
tester,
|
|
) async {
|
|
await _pumpFollowing(tester);
|
|
expect(find.byKey(_banner), findsNothing);
|
|
expect(find.byKey(const Key('following-card-$_dramaId')), findsOneWidget);
|
|
expect(find.byKey(const Key('following-add-card')), findsOneWidget);
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
|
|
for (final hasFavorites in [true, false]) {
|
|
testWidgets(
|
|
'should_omit_section_heading_and_count_when_favorites_are_$hasFavorites',
|
|
(tester) async {
|
|
await _pumpFollowing(tester, hasFavorites: hasFavorites);
|
|
final l10n = AppLocalizations.of(tester.element(find.byKey(_page)))!;
|
|
final grid = find.byKey(_favoritesGrid);
|
|
expect(
|
|
find.descendant(of: grid, matching: find.text(l10n.favoriteDramas)),
|
|
findsNothing,
|
|
);
|
|
expect(
|
|
find.descendant(
|
|
of: grid,
|
|
matching: find.text(l10n.totalDramasCount(hasFavorites ? 1 : 0)),
|
|
),
|
|
findsNothing,
|
|
);
|
|
if (hasFavorites) {
|
|
final header = tester.getRect(
|
|
find.byKey(const Key('following-header')),
|
|
);
|
|
final card = tester.getRect(
|
|
find.byKey(const Key('following-card-$_dramaId')),
|
|
);
|
|
expect(card.top, closeTo(header.bottom, _tolerance));
|
|
} else {
|
|
expect(
|
|
find.byKey(const Key('following-favorites-empty')),
|
|
findsOneWidget,
|
|
);
|
|
}
|
|
expect(tester.takeException(), isNull);
|
|
},
|
|
);
|
|
}
|
|
|
|
testWidgets('should_keep_history_continue_entry_when_history_tab_opens', (
|
|
tester,
|
|
) async {
|
|
await _pumpFollowing(tester);
|
|
await tester.tap(find.byKey(const Key('following-tab-history')));
|
|
await tester.pumpAndSettle();
|
|
expect(
|
|
find.byKey(const Key('following-history-card-$_dramaId')),
|
|
findsOneWidget,
|
|
);
|
|
expect(
|
|
find.byKey(const Key('following-history-continue-$_dramaId')),
|
|
findsOneWidget,
|
|
);
|
|
expect(
|
|
find.byKey(const Key('following-progress-$_dramaId')),
|
|
findsOneWidget,
|
|
);
|
|
expect(find.byKey(_banner), findsNothing);
|
|
expect(tester.takeException(), isNull);
|
|
});
|
|
}
|