82 lines
2.1 KiB
Dart
82 lines
2.1 KiB
Dart
// Author: fruit.com.cn
|
|
|
|
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/catalog_controller.dart';
|
|
|
|
void main() {
|
|
test('should_keep_state_when_silent_refresh_fails', () async {
|
|
final repository = _FakeCatalog(fail: true);
|
|
final controller = CatalogController(repository);
|
|
const oldFeed = HomeFeed();
|
|
controller.feed = oldFeed;
|
|
|
|
final ok = await controller.refresh();
|
|
|
|
expect(ok, isFalse);
|
|
expect(controller.feed, same(oldFeed));
|
|
expect(controller.loading, isFalse);
|
|
expect(controller.error, isNull);
|
|
});
|
|
|
|
test(
|
|
'should_replace_feed_without_touching_loading_when_refresh_succeeds',
|
|
() async {
|
|
final repository = _FakeCatalog();
|
|
final controller = CatalogController(repository);
|
|
controller.feed = const HomeFeed();
|
|
final next = HomeFeed(
|
|
sections: [
|
|
FeedSection(code: 'new', title: 'New', dramas: const [_drama]),
|
|
],
|
|
);
|
|
repository.next = next;
|
|
|
|
final ok = await controller.refresh();
|
|
|
|
expect(ok, isTrue);
|
|
expect(controller.feed, same(next));
|
|
expect(controller.loading, isFalse);
|
|
expect(controller.error, isNull);
|
|
},
|
|
);
|
|
}
|
|
|
|
class _FakeCatalog implements CatalogRepository {
|
|
_FakeCatalog({this.fail = false});
|
|
|
|
bool fail;
|
|
HomeFeed next = const HomeFeed();
|
|
|
|
@override
|
|
Future<HomeFeed> fetchHomeFeed() async {
|
|
if (fail) throw StateError('offline');
|
|
return next;
|
|
}
|
|
|
|
@override
|
|
Future<HomeFeed> fetchDiscoverFeed() async => const HomeFeed();
|
|
|
|
@override
|
|
Future<FeedPage> fetchFeed({
|
|
List<String> types = const [],
|
|
String? categoryId,
|
|
String? cursor,
|
|
int size = 10,
|
|
}) async => const FeedPage();
|
|
|
|
@override
|
|
Future<Drama> fetchDrama(String dramaId) async => _drama;
|
|
}
|
|
|
|
const _drama = Drama(
|
|
id: 'refresh-drama',
|
|
title: 'Refresh Drama',
|
|
synopsis: 'synopsis',
|
|
posterUrl: '',
|
|
detailLoaded: true,
|
|
);
|