Skip to content

Commit

Permalink
test: add unit tests for capsule warm up extension (#187)
Browse files Browse the repository at this point in the history
Fixes #13
  • Loading branch information
GregoryConrad committed May 26, 2024
1 parent 238507a commit 677fbd0
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 4 deletions.
8 changes: 4 additions & 4 deletions packages/flutter_rearch/lib/src/widgets/capsule_warm_up.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
part of '../widgets.dart';

/// Provides [toWarmUpWidget], a mechanism to create a [Widget] from a [List]
/// of the current states of some "warm up" [Capsule]s.
extension CapsuleWarmUp<T> on List<AsyncValue<T>> {
/// Creates a [Widget] from a [List] of the current states of
/// Provides [toWarmUpWidget], a mechanism to create a [Widget] from an
/// [Iterable] of the current states of some "warm up" [Capsule]s.
extension CapsuleWarmUp<T> on Iterable<AsyncValue<T>> {
/// Creates a [Widget] from an [Iterable] of the current states of
/// some "warm up" [Capsule]s.
///
/// - [child] is returned when all of the current states are [AsyncData].
Expand Down
92 changes: 92 additions & 0 deletions packages/flutter_rearch/test/widgets_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import 'package:flutter_rearch/flutter_rearch.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:rearch/rearch.dart';

import 'util.dart';

void main() {
testWidgets('RearchConsumer rebuilds when constructor params change (#163)',
(tester) async {
Expand Down Expand Up @@ -65,6 +67,96 @@ void main() {
await tester.pump();
expect(builds, equals(3)); // count == 6, capsule used, rebuilt
});

group('capsule warm up widget extension', () {
ValueWrapper<(AsyncValue<int>, AsyncValue<bool>)> manager(
CapsuleHandle use,
) =>
use.data(const (AsyncLoading(None()), AsyncLoading(None())));
AsyncValue<int> c1(CapsuleHandle use) => use(manager).value.$1;
AsyncValue<bool> c2(CapsuleHandle use) => use(manager).value.$2;

testWidgets('waits until all AsyncData', (tester) async {
final container = useContainer();
await tester.pumpWidget(
CapsuleContainerProvider(
container: container,
child: MaterialApp(
home: Scaffold(
body: RearchBuilder(
builder: (context, use) {
return [c1, c2].map(use.call).toWarmUpWidget(
loading: const Text('loading'),
child: const Text('warmed up'),
errorBuilder: (_) => throw UnsupportedError(
'should not occur in this test',
),
);
},
),
),
),
),
);

expect(find.text('loading'), findsOneWidget);
expect(find.text('warmed up'), findsNothing);

container.read(manager).value =
const (AsyncData(123), AsyncLoading(None()));
await tester.pumpAndSettle();
expect(find.text('loading'), findsOneWidget);
expect(find.text('warmed up'), findsNothing);

container.read(manager).value = const (AsyncData(123), AsyncData(false));
await tester.pumpAndSettle();
expect(find.text('loading'), findsNothing);
expect(find.text('warmed up'), findsOneWidget);
});

testWidgets('shows error on the first AsyncError', (tester) async {
final container = useContainer();
await tester.pumpWidget(
CapsuleContainerProvider(
container: container,
child: MaterialApp(
home: Scaffold(
body: RearchBuilder(
builder: (context, use) {
return [c1, c2].map(use.call).toWarmUpWidget(
loading: const Text('loading'),
child: const Text('warmed up'),
errorBuilder: (errors) =>
Text(errors.single.error as String),
);
},
),
),
),
),
);

expect(find.text('loading'), findsOneWidget);
expect(find.text('error'), findsNothing);
expect(find.text('warmed up'), findsNothing);

container.read(manager).value =
const (AsyncData(123), AsyncLoading(None()));
await tester.pumpAndSettle();
expect(find.text('loading'), findsOneWidget);
expect(find.text('error'), findsNothing);
expect(find.text('warmed up'), findsNothing);

container.read(manager).value = (
const AsyncData(123),
AsyncError('error', StackTrace.current, const None()),
);
await tester.pumpAndSettle();
expect(find.text('loading'), findsNothing);
expect(find.text('error'), findsOneWidget);
expect(find.text('warmed up'), findsNothing);
});
});
}

class ParentConsumer extends RearchConsumer {
Expand Down

0 comments on commit 677fbd0

Please sign in to comment.