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 gate; setUp(() { once = Once(); runs = 0; gate = Completer(); }); Future 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); }); }); }