fix(favorite): 统一收藏状态与互动图标

This commit is contained in:
Zhou Weidong committed 2026-10-27 09:31:48 +08:00
1 parent 4b97f89c0b
commit d3dbc9f8dc
13 files changed
+347 -213

No files matched your search

+40 -23
View File
@@ -16,20 +16,20 @@ DramaDetailLogic _logic(
FakeWatchHistory history, {
FavoriteController? favorites,
PlaybackPositionCache? positionCache,
}) =>
DramaDetailLogic(
drama: drama,
history: history,
playback: FakePlaybackRepository(),
favorites: favorites ?? FavoriteController(InMemoryFavoriteRepository()),
positionCache: positionCache ?? PlaybackPositionCache(),
);
}) => DramaDetailLogic(
drama: drama,
history: history,
playback: FakePlaybackRepository(),
favorites: favorites ?? FavoriteController(InMemoryFavoriteRepository()),
positionCache: positionCache ?? PlaybackPositionCache(),
);
Drama _card(String id) => Drama(
Drama _card(String id, {int? favoriteCount}) => Drama(
id: id,
title: id,
synopsis: 'synopsis',
posterUrl: '/files/$id.jpg',
favoriteCount: favoriteCount,
totalEpisodes: 3,
episodes: [
Episode(
@@ -42,11 +42,12 @@ Drama _card(String id) => Drama(
],
);
Drama _detail(String id) => Drama(
Drama _detail(String id, {int? favoriteCount}) => Drama(
id: id,
title: id,
synopsis: 'synopsis',
posterUrl: '/files/$id.jpg',
favoriteCount: favoriteCount,
totalEpisodes: 3,
detailLoaded: true,
episodes: [
@@ -62,21 +63,24 @@ Drama _detail(String id) => Drama(
);
void main() {
test('should_upgrade_to_full_episode_list_when_detail_loads_for_list_card', () async {
var calls = 0;
final logic = _logic(_card('signal'), FakeWatchHistory());
test(
'should_upgrade_to_full_episode_list_when_detail_loads_for_list_card',
() async {
var calls = 0;
final logic = _logic(_card('signal'), FakeWatchHistory());
await logic.load(() async {
calls++;
return _detail('signal');
});
await logic.load(() async {
calls++;
return _detail('signal');
});
expect(calls, 1);
expect(logic.loading, isFalse);
expect(logic.failed, isFalse);
expect(logic.drama.episodes, hasLength(3));
logic.dispose();
});
expect(calls, 1);
expect(logic.loading, isFalse);
expect(logic.failed, isFalse);
expect(logic.drama.episodes, hasLength(3));
logic.dispose();
},
);
test('should_keep_card_and_report_reason_when_load_fails', () async {
final logic = _logic(_card('signal'), FakeWatchHistory());
@@ -107,6 +111,19 @@ void main() {
logic.dispose();
});
test('should_use_detail_favorite_count_as_authoritative', () async {
final favorites = FavoriteController(InMemoryFavoriteRepository());
final card = _card('signal', favoriteCount: 2);
expect(favorites.favoriteCountFor(card), 2);
final logic = _logic(card, FakeWatchHistory(), favorites: favorites);
await logic.load(() async => _detail('signal', favoriteCount: 9));
expect(favorites.favoriteCount('signal'), 9);
expect(logic.adjustedFavoriteCount, 9);
logic.dispose();
});
test('should_prefer_recent_local_position_when_loading_continue', () async {
final cache = PlaybackPositionCache();
cache.save(