feat(theater): 剧场分类列表服务端分页
This commit is contained in:
1 parent
f8769f2e1d
commit
13a14f3e85
16 files changed
+769
-21
No files matched your search
@@ -140,6 +140,7 @@ class ScriptedCatalogRepository implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async => const FeedPage();
|
||||
|
||||
@@ -40,6 +40,7 @@ void main() {
|
||||
|
||||
final page = await api.feed(
|
||||
types: const ['ANIME', 'LIVE'],
|
||||
categoryId: '7',
|
||||
cursor: '9',
|
||||
size: 20,
|
||||
);
|
||||
@@ -47,6 +48,7 @@ void main() {
|
||||
expect(adapter.requests.single.uri.path, '/app/feed');
|
||||
expect(adapter.requests.single.queryParameters, {
|
||||
'types': 'ANIME,LIVE',
|
||||
'categoryId': '7',
|
||||
'cursor': '9',
|
||||
'size': '20',
|
||||
});
|
||||
|
||||
@@ -298,6 +298,7 @@ class _ScriptedFeedRepository implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
// Author: fruit.com.cn
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:fruitshorts/core/data/models/drama.dart';
|
||||
import 'package:fruitshorts/core/data/models/feed_page.dart';
|
||||
import 'package:fruitshorts/core/data/models/home_feed.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/catalog_repository.dart';
|
||||
import 'package:fruitshorts/core/data/services/theater_feed_controller.dart';
|
||||
|
||||
void main() {
|
||||
test('should_request_all_and_selected_category_with_expected_ids', () async {
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('all')]))
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('category')]));
|
||||
final controller = TheaterFeedController(repository);
|
||||
|
||||
await controller.select(null);
|
||||
await controller.select('7');
|
||||
|
||||
expect(repository.calls.map((call) => call.categoryId), [null, '7']);
|
||||
expect(controller.dramas.single.id, 'category');
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
test('should_keep_cached_category_visible_while_refreshing', () async {
|
||||
final refresh = Completer<FeedPage>();
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('all-old')]))
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('category')]))
|
||||
..enqueue(() => refresh.future);
|
||||
final controller = TheaterFeedController(repository);
|
||||
|
||||
await controller.select(null);
|
||||
await controller.select('7');
|
||||
await controller.select(null);
|
||||
|
||||
expect(controller.dramas.single.id, 'all-old');
|
||||
refresh.complete(FeedPage(dramas: [_drama('all-new')]));
|
||||
await pumpEventQueue();
|
||||
|
||||
expect(controller.dramas.single.id, 'all-new');
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
test('should_append_unique_items_and_stop_when_has_more_is_false', () async {
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(
|
||||
() async => FeedPage(
|
||||
dramas: [_drama('a'), _drama('b')],
|
||||
nextCursor: 'next',
|
||||
hasMore: true,
|
||||
),
|
||||
)
|
||||
..enqueue(
|
||||
() async =>
|
||||
FeedPage(dramas: [_drama('b'), _drama('c')], hasMore: false),
|
||||
);
|
||||
final controller = TheaterFeedController(repository);
|
||||
await controller.select('7');
|
||||
|
||||
await controller.loadMore();
|
||||
await controller.loadMore();
|
||||
|
||||
expect(controller.dramas.map((drama) => drama.id), ['a', 'b', 'c']);
|
||||
expect(repository.calls, hasLength(2));
|
||||
expect(repository.calls.last.categoryId, '7');
|
||||
expect(repository.calls.last.cursor, 'next');
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
test('should_keep_old_data_when_refresh_fails', () async {
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('old')]))
|
||||
..enqueue(() async => throw StateError('offline'));
|
||||
final controller = TheaterFeedController(repository);
|
||||
await controller.select('7');
|
||||
|
||||
final refreshed = await controller.refreshCurrent();
|
||||
|
||||
expect(refreshed, isFalse);
|
||||
expect(controller.dramas.single.id, 'old');
|
||||
expect(controller.lastError, contains('offline'));
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
test(
|
||||
'should_retry_automatically_when_returning_to_failed_category',
|
||||
() async {
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('all')]))
|
||||
..enqueue(() async => throw StateError('offline'))
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('category-8')]))
|
||||
..enqueue(() async => FeedPage(dramas: [_drama('category-7-retry')]));
|
||||
final controller = TheaterFeedController(repository);
|
||||
|
||||
await controller.select(null);
|
||||
await controller.select('7');
|
||||
expect(controller.lastError, contains('offline'));
|
||||
await controller.select('8');
|
||||
await controller.select('7');
|
||||
|
||||
expect(controller.dramas.single.id, 'category-7-retry');
|
||||
expect(repository.calls, hasLength(4));
|
||||
controller.dispose();
|
||||
},
|
||||
);
|
||||
|
||||
test('should_finish_loading_with_error_when_request_times_out', () async {
|
||||
final pending = Completer<FeedPage>();
|
||||
final repository = _ScriptedTheaterRepository()
|
||||
..enqueue(() => pending.future);
|
||||
final controller = TheaterFeedController(
|
||||
repository,
|
||||
requestTimeout: const Duration(milliseconds: 10),
|
||||
);
|
||||
|
||||
await controller.select(null);
|
||||
|
||||
expect(controller.loadingFirstPage, isFalse);
|
||||
expect(controller.loaded, isTrue);
|
||||
expect(controller.lastError, isNotNull);
|
||||
controller.dispose();
|
||||
});
|
||||
|
||||
test('should_not_report_first_page_loading_without_request', () {
|
||||
final controller = TheaterFeedController(_ScriptedTheaterRepository());
|
||||
|
||||
expect(controller.loaded, isFalse);
|
||||
expect(controller.loadingFirstPage, isFalse);
|
||||
controller.dispose();
|
||||
});
|
||||
}
|
||||
|
||||
class TheaterFeedCall {
|
||||
const TheaterFeedCall({
|
||||
required this.categoryId,
|
||||
required this.cursor,
|
||||
required this.size,
|
||||
});
|
||||
|
||||
final String? categoryId;
|
||||
final String? cursor;
|
||||
final int size;
|
||||
}
|
||||
|
||||
class _ScriptedTheaterRepository implements CatalogRepository {
|
||||
final List<TheaterFeedCall> calls = [];
|
||||
final List<Future<FeedPage> Function()> _responses = [];
|
||||
|
||||
void enqueue(Future<FeedPage> Function() response) {
|
||||
_responses.add(response);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
calls.add(
|
||||
TheaterFeedCall(categoryId: categoryId, cursor: cursor, size: size),
|
||||
);
|
||||
return _responses.removeAt(0)();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<HomeFeed> fetchHomeFeed() async => const HomeFeed();
|
||||
|
||||
@override
|
||||
Future<HomeFeed> fetchDiscoverFeed() async => const HomeFeed();
|
||||
|
||||
@override
|
||||
Future<Drama> fetchDrama(String dramaId) async => _drama(dramaId);
|
||||
}
|
||||
|
||||
Drama _drama(String id) =>
|
||||
Drama(id: id, title: id, synopsis: id, posterUrl: '');
|
||||
@@ -5,6 +5,7 @@ import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:fruitshorts/app.dart';
|
||||
import 'package:fruitshorts/core/data/models/content_category.dart';
|
||||
import 'package:fruitshorts/core/data/models/drama.dart';
|
||||
import 'package:fruitshorts/core/data/models/feed_page.dart';
|
||||
import 'package:fruitshorts/core/data/models/home_feed.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/category_repository.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/favorite_repository.dart';
|
||||
@@ -72,11 +73,20 @@ void main() {
|
||||
testWidgets('should_filter_grid_when_category_chip_is_tapped', (
|
||||
tester,
|
||||
) async {
|
||||
await _pumpTheater(tester, categoryRepository: _GridCategoryRepository());
|
||||
final catalog = _CategoryTheaterCatalog();
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: catalog,
|
||||
categoryRepository: _GridCategoryRepository(),
|
||||
);
|
||||
|
||||
await tester.tap(find.byKey(const Key('theater-category-7')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(
|
||||
catalog.requestedCategoryIds.where((categoryId) => categoryId == '7'),
|
||||
hasLength(1),
|
||||
);
|
||||
expect(
|
||||
find.byKey(const Key('home-drama-card-city-lights-demo')),
|
||||
findsOneWidget,
|
||||
@@ -92,6 +102,9 @@ void main() {
|
||||
) async {
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: _SinglePageTheaterCatalog(
|
||||
dramas: _tallDiscoverFeed.dramas,
|
||||
),
|
||||
categoryRepository: _GridCategoryRepository(
|
||||
discoverFeed: _tallDiscoverFeed,
|
||||
),
|
||||
@@ -121,6 +134,7 @@ void main() {
|
||||
testWidgets('should_show_empty_and_retry_states', (tester) async {
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: _SinglePageTheaterCatalog(dramas: const []),
|
||||
categoryRepository: _GridCategoryRepository(
|
||||
discoverFeed: const HomeFeed(),
|
||||
),
|
||||
@@ -144,6 +158,18 @@ void main() {
|
||||
expect(find.textContaining('discover feed unavailable'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('should_show_retry_when_theater_feed_fails', (tester) async {
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: _FailingTheaterCatalog(),
|
||||
categoryRepository: _GridCategoryRepository(),
|
||||
);
|
||||
|
||||
expect(find.byKey(const Key('home-categories-error')), findsOneWidget);
|
||||
expect(find.text('Retry'), findsOneWidget);
|
||||
expect(find.textContaining('theater feed unavailable'), findsWidgets);
|
||||
});
|
||||
|
||||
testWidgets('should_show_search_results_when_text_changes', (tester) async {
|
||||
await _pumpTheater(tester, categoryRepository: _GridCategoryRepository());
|
||||
|
||||
@@ -161,19 +187,63 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
testWidgets('should_load_next_theater_page_near_scroll_bottom', (
|
||||
tester,
|
||||
) async {
|
||||
final catalog = _PagedTheaterCatalog([
|
||||
FeedPage(dramas: _pageDramas(0, 20), nextCursor: '20', hasMore: true),
|
||||
FeedPage(dramas: _pageDramas(20, 20)),
|
||||
]);
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: catalog,
|
||||
categoryRepository: _GridCategoryRepository(),
|
||||
);
|
||||
final position = tester
|
||||
.state<ScrollableState>(
|
||||
find
|
||||
.descendant(
|
||||
of: find.byKey(const Key('discover-refresh')),
|
||||
matching: find.byType(Scrollable),
|
||||
)
|
||||
.first,
|
||||
)
|
||||
.position;
|
||||
|
||||
position.jumpTo(position.maxScrollExtent);
|
||||
await tester.pump();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(catalog.calls, 2);
|
||||
expect(catalog.requestedCursors, [null, '20']);
|
||||
expect(find.byKey(const Key('home-drama-card-page-39')), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('should_refresh_feed_when_pulled_down', (tester) async {
|
||||
final counter = _CountingCategoryRepository(
|
||||
_GridCategoryRepository(discoverFeed: _tallDiscoverFeed),
|
||||
);
|
||||
await _pumpTheater(tester, categoryRepository: counter);
|
||||
final theaterCounter = _CountingTheaterCatalog(
|
||||
dramas: _tallDiscoverFeed.dramas,
|
||||
);
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: theaterCounter,
|
||||
categoryRepository: counter,
|
||||
);
|
||||
|
||||
final before = counter.categoryLoads + counter.feedLoads;
|
||||
final beforeCategories = counter.categoryLoads + counter.feedLoads;
|
||||
final beforeTheater = theaterCounter.feedCalls;
|
||||
await tester.drag(_verticalFeed, const Offset(0, 320));
|
||||
await tester.pump();
|
||||
await tester.pump(const Duration(seconds: 1));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(counter.categoryLoads + counter.feedLoads, greaterThan(before));
|
||||
expect(
|
||||
counter.categoryLoads + counter.feedLoads,
|
||||
greaterThan(beforeCategories),
|
||||
);
|
||||
expect(theaterCounter.feedCalls, beforeTheater + 1);
|
||||
expect(find.byType(RefreshProgressIndicator), findsNothing);
|
||||
});
|
||||
|
||||
@@ -205,6 +275,9 @@ void main() {
|
||||
testWidgets('should_pin_theater_filters_when_scrolling', (tester) async {
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: _SinglePageTheaterCatalog(
|
||||
dramas: _tallDiscoverFeed.dramas,
|
||||
),
|
||||
categoryRepository: _GridCategoryRepository(
|
||||
discoverFeed: _tallDiscoverFeed,
|
||||
),
|
||||
@@ -243,6 +316,9 @@ void main() {
|
||||
testWidgets('should_keep_category_row_stable_across_scrolls', (tester) async {
|
||||
await _pumpTheater(
|
||||
tester,
|
||||
catalogRepository: _SinglePageTheaterCatalog(
|
||||
dramas: _tallDiscoverFeed.dramas,
|
||||
),
|
||||
categoryRepository: _GridCategoryRepository(
|
||||
discoverFeed: _tallDiscoverFeed,
|
||||
),
|
||||
@@ -357,12 +433,13 @@ final Finder _verticalFeed = find.byWidgetPredicate(
|
||||
Future<void> _pumpTheater(
|
||||
WidgetTester tester, {
|
||||
required CategoryRepository categoryRepository,
|
||||
FakeCatalogRepository? catalogRepository,
|
||||
}) async {
|
||||
tester.view.physicalSize = const Size(390, 844);
|
||||
tester.view.devicePixelRatio = 1;
|
||||
addTearDown(tester.view.resetPhysicalSize);
|
||||
addTearDown(tester.view.resetDevicePixelRatio);
|
||||
final catalog = FakeCatalogRepository();
|
||||
final catalog = catalogRepository ?? FakeCatalogRepository();
|
||||
await tester.pumpWidget(
|
||||
LumaDramaApp(
|
||||
playerFactory: createWidgetPlayer,
|
||||
@@ -469,3 +546,169 @@ class _CountingCategoryRepository implements CategoryRepository {
|
||||
return delegate.fetchDiscoverFeed();
|
||||
}
|
||||
}
|
||||
|
||||
class _TheaterOnlyCatalog extends FakeCatalogRepository {
|
||||
_TheaterOnlyCatalog({super.dramas});
|
||||
|
||||
final FakeCatalogRepository _homeDelegate = FakeCatalogRepository();
|
||||
|
||||
@override
|
||||
Future<HomeFeed> fetchHomeFeed() => _homeDelegate.fetchHomeFeed();
|
||||
|
||||
@override
|
||||
Future<HomeFeed> fetchDiscoverFeed() => _homeDelegate.fetchDiscoverFeed();
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
return _homeDelegate.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _SinglePageTheaterCatalog extends _TheaterOnlyCatalog {
|
||||
_SinglePageTheaterCatalog({required List<Drama> dramas})
|
||||
: super(dramas: dramas);
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async {
|
||||
if (size != 20) {
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
return FeedPage(dramas: dramas.take(size).toList());
|
||||
}
|
||||
}
|
||||
|
||||
class _CategoryTheaterCatalog extends _TheaterOnlyCatalog {
|
||||
final List<String?> requestedCategoryIds = [];
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async {
|
||||
if (size != 20) {
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
requestedCategoryIds.add(categoryId);
|
||||
final rows = categoryId == '7'
|
||||
? dramas.where((drama) => drama.id == 'city-lights-demo').toList()
|
||||
: dramas;
|
||||
return FeedPage(dramas: rows.take(size).toList());
|
||||
}
|
||||
}
|
||||
|
||||
class _CountingTheaterCatalog extends _TheaterOnlyCatalog {
|
||||
_CountingTheaterCatalog({required List<Drama> dramas})
|
||||
: super(dramas: dramas);
|
||||
|
||||
int feedCalls = 0;
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
if (size != 20) {
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
feedCalls++;
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _PagedTheaterCatalog extends _TheaterOnlyCatalog {
|
||||
_PagedTheaterCatalog(this.pages);
|
||||
|
||||
final List<FeedPage> pages;
|
||||
final List<String?> requestedCursors = [];
|
||||
|
||||
int get calls => requestedCursors.length;
|
||||
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async {
|
||||
if (size != 20) {
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
requestedCursors.add(cursor);
|
||||
return pages.removeAt(0);
|
||||
}
|
||||
}
|
||||
|
||||
class _FailingTheaterCatalog extends _TheaterOnlyCatalog {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
if (size == 20) {
|
||||
return Future.error(StateError('theater feed unavailable'));
|
||||
}
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
List<Drama> _pageDramas(int start, int count) => [
|
||||
for (var index = start; index < start + count; index++)
|
||||
Drama(
|
||||
id: 'page-$index',
|
||||
title: 'Page $index',
|
||||
synopsis: 'Page $index synopsis',
|
||||
posterUrl: '',
|
||||
genre: 'Drama',
|
||||
),
|
||||
];
|
||||
@@ -63,6 +63,7 @@ class _FakeCatalog implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async => const FeedPage();
|
||||
|
||||
@@ -162,6 +162,7 @@ class _EmptyCatalogRepository implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async => const FeedPage();
|
||||
@@ -188,6 +189,7 @@ class _PendingCatalogRepository implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async => FeedPage(dramas: _feed.dramas);
|
||||
|
||||
@@ -518,6 +518,7 @@ class _PendingAnimeCatalog extends FakeCatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
@@ -525,7 +526,12 @@ class _PendingAnimeCatalog extends FakeCatalogRepository {
|
||||
animeCalls++;
|
||||
return anime.future;
|
||||
}
|
||||
return super.fetchFeed(types: types, cursor: cursor, size: size);
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -533,12 +539,18 @@ class _EmptyAnimeCatalog extends FakeCatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) {
|
||||
if (types.contains('ANIME')) {
|
||||
return Future.value(const FeedPage(dramas: []));
|
||||
}
|
||||
return super.fetchFeed(types: types, cursor: cursor, size: size);
|
||||
return super.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ class FakeCatalogRepository implements CatalogRepository, SearchRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async {
|
||||
|
||||
@@ -269,6 +269,7 @@ class ScriptedWatchCatalog implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) async => const FeedPage();
|
||||
|
||||
@@ -275,9 +275,15 @@ class _FailingWatchCatalog implements CatalogRepository {
|
||||
@override
|
||||
Future<FeedPage> fetchFeed({
|
||||
List<String> types = const [],
|
||||
String? categoryId,
|
||||
String? cursor,
|
||||
int size = 10,
|
||||
}) => _delegate.fetchFeed(types: types, cursor: cursor, size: size);
|
||||
}) => _delegate.fetchFeed(
|
||||
types: types,
|
||||
categoryId: categoryId,
|
||||
cursor: cursor,
|
||||
size: size,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<Drama> fetchDrama(String dramaId) async {
|
||||
|
||||
Reference in new issue
Block a user