// 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 fetchHomeFeed() async { if (fail) throw StateError('offline'); return next; } @override Future fetchDiscoverFeed() async => const HomeFeed(); @override Future fetchDrama(String dramaId) async => _drama; } const _drama = Drama( id: 'refresh-drama', title: 'Refresh Drama', synopsis: 'synopsis', posterUrl: '', detailLoaded: true, );