60 lines
2.0 KiB
Dart
60 lines
2.0 KiB
Dart
// Author: fruit.com.cn
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
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';
|
|
import 'package:fruitshorts/l10n/app_localizations.dart';
|
|
import 'package:fruitshorts/pages/home/home_view.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
void main() {
|
|
testWidgets(
|
|
'should_keep_splash_with_loading_until_home_feed_settles',
|
|
(tester) async {
|
|
final repository = _PendingCatalog();
|
|
await tester.pumpWidget(
|
|
MaterialApp(
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
home: ChangeNotifierProvider(
|
|
create: (_) => CatalogController(repository)..load(),
|
|
child: const HomePage(),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.byKey(const Key('splash-screen')), findsOneWidget);
|
|
expect(find.byKey(const Key('splash-loading')), findsOneWidget);
|
|
expect(find.byKey(const Key('home-empty')), findsNothing);
|
|
final clip = tester.widget<ClipRRect>(find.byType(ClipRRect));
|
|
expect(clip.borderRadius, BorderRadius.circular(18));
|
|
|
|
repository.pending.complete(const HomeFeed());
|
|
await tester.pump();
|
|
await tester.pump();
|
|
|
|
expect(find.byKey(const Key('splash-screen')), findsNothing);
|
|
expect(find.byKey(const Key('home-empty')), findsOneWidget);
|
|
},
|
|
);
|
|
}
|
|
|
|
class _PendingCatalog implements CatalogRepository {
|
|
final Completer<HomeFeed> pending = Completer<HomeFeed>();
|
|
|
|
@override
|
|
Future<HomeFeed> fetchHomeFeed() => pending.future;
|
|
|
|
@override
|
|
Future<HomeFeed> fetchDiscoverFeed() => pending.future;
|
|
|
|
@override
|
|
Future<Drama> fetchDrama(String dramaId) =>
|
|
Future<Drama>.error(StateError('unused'));
|
|
}
|