Files
ReelShort/test/home/catalog_controller_refresh_test.dart
T

73 lines
1.9 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/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<Drama> fetchDrama(String dramaId) async => _drama;
}
const _drama = Drama(
id: 'refresh-drama',
title: 'Refresh Drama',
synopsis: 'synopsis',
posterUrl: '',
detailLoaded: true,
);