47 lines
1.1 KiB
Dart
47 lines
1.1 KiB
Dart
|
|
import 'dart:async';
|
||
|
|
|
||
|
|
import 'package:serverpod_offline_sync/src/utils/once.dart';
|
||
|
|
import 'package:test/test.dart';
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
group('Given an action run once,', () {
|
||
|
|
late Once once;
|
||
|
|
late int runs;
|
||
|
|
late Completer<void> gate;
|
||
|
|
|
||
|
|
setUp(() {
|
||
|
|
once = Once();
|
||
|
|
runs = 0;
|
||
|
|
gate = Completer<void>();
|
||
|
|
});
|
||
|
|
|
||
|
|
Future<void> action() async {
|
||
|
|
runs++;
|
||
|
|
await gate.future;
|
||
|
|
}
|
||
|
|
|
||
|
|
test('when asked while it runs and after, then it runs once and every '
|
||
|
|
'caller awaits that run.', () async {
|
||
|
|
final first = once.run(action);
|
||
|
|
final meanwhile = once.run(action);
|
||
|
|
gate.complete();
|
||
|
|
await Future.wait([first, meanwhile]);
|
||
|
|
await once.run(action);
|
||
|
|
|
||
|
|
expect(runs, 1);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('when its run fails, then the next caller runs it again.', () async {
|
||
|
|
final failing = once.run(() async {
|
||
|
|
runs++;
|
||
|
|
throw StateError('failed');
|
||
|
|
});
|
||
|
|
await expectLater(failing, throwsStateError);
|
||
|
|
|
||
|
|
gate.complete();
|
||
|
|
await once.run(action);
|
||
|
|
|
||
|
|
expect(runs, 2);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|