import 'dart:async'; import 'package:flutter_test/flutter_test.dart'; import 'package:ikar/core/share/share_inbox.dart'; void main() { test( 'concurrent events present each share once and wait for file users', () async { final records = [ for (var i = 0; i < 3; i++) {'id': '$i', 'text': 'share $i'}, ]; final shown = []; final acknowledged = []; final released = []; final upload = Completer(); final inbox = ShareInbox( consume: () async => records.isEmpty ? null : records.removeAt(0), acknowledge: (id) async => acknowledged.add(id), release: (id) async => released.add(id), onShare: (payload) => shown.add(payload.text!), ); await Future.wait([inbox.check(), inbox.check(), inbox.check()]); expect(shown, ['share 0']); final completing = inbox.complete(waitForRelease: () => upload.future); await Future.delayed(Duration.zero); expect(acknowledged, ['0']); expect(released, isEmpty); expect(shown, ['share 0']); upload.complete(); await completing; expect(released, ['0']); expect(shown, ['share 0', 'share 1']); await inbox.complete(); await inbox.complete(); expect(shown, ['share 0', 'share 1', 'share 2']); expect(released, ['0', '1', '2']); }, ); test( 'ack failure keeps active record and retries without presenting twice', () async { var failures = 1; var shown = 0; var consumed = false; final inbox = ShareInbox( consume: () async { if (consumed) return null; consumed = true; return {'id': 'a', 'text': 'text'}; }, acknowledge: (_) async { if (failures-- > 0) throw StateError('disk'); }, release: (_) async {}, onShare: (_) => shown++, ); await inbox.check(); await expectLater(inbox.complete(), throwsStateError); await inbox.check(); expect(shown, 1); }, ); test( 'invalid record is discarded and next valid record is presented', () async { final records = [ {'id': 'bad'}, {'id': 'good', 'text': 'ok'}, ]; final acknowledged = []; final shown = []; final inbox = ShareInbox( consume: () async => records.isEmpty ? null : records.removeAt(0), acknowledge: (id) async => acknowledged.add(id), release: (_) async {}, onShare: (payload) => shown.add(payload.text!), ); await inbox.check(); expect(acknowledged, ['bad']); expect(shown, ['ok']); await inbox.complete(); }, ); }