import 'package:podman/podman.dart'; import 'package:test/test.dart'; import 'support/fake_podman_transport.dart'; void main() { group('PodmanClient events API', () { test('lists events with filters and since/until', () async { final since = DateTime.fromMillisecondsSinceEpoch( 1700000000000, isUtc: true, ); final until = DateTime.fromMillisecondsSinceEpoch( 1700000060000, isUtc: true, ); final transport = FakePodmanTransport() ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/events', queryParameters: const >{ 'stream': ['false'], 'since': ['1700000000'], 'until': ['1700000060'], 'filters': ['type=container', 'event=start'], }, responseBody: '{"Type":"container","Action":"start","status":"start","id":"c1","time":1700000001,"timeNano":1700000001000000000,"Actor":{"ID":"c1","Attributes":{"name":"web"}}}\n' '{"Type":"container","Action":"stop","status":"stop","id":"c1","time":1700000059,"timeNano":1700000059000000000,"Actor":{"ID":"c1","Attributes":{"name":"web"}}}\n', ); final client = PodmanClient(transport: transport); final events = await client.listEvents( since: since, until: until, filters: const [ PodmanEventFilter('type', 'container'), PodmanEventFilter('event', 'start'), ], ); expect(events, hasLength(2)); expect(events.first.type, 'container'); expect(events.first.action, 'start'); expect(events.first.name, 'web'); transport.expectNoPending(); }); test('watchEvents reconnects and emits events', () async { final transport = FakePodmanTransport() ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/events', queryParameters: const >{ 'stream': ['false'], }, statusCode: 500, responseBody: const {'message': 'temporary'}, ) ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/events', queryParameters: const >{ 'stream': ['false'], }, responseBody: '{"Type":"container","Action":"start","status":"start","id":"c1","time":1700000100,"timeNano":1700000100000000000,"Actor":{"ID":"c1","Attributes":{"name":"web"}}}\n', ); final client = PodmanClient(transport: transport); final first = await client .watchEvents( reconnect: true, reconnectDelay: Duration.zero, pollInterval: const Duration(days: 1), ) .first .timeout(const Duration(seconds: 2)); expect(first.id, 'c1'); expect(first.action, 'start'); transport.expectNoPending(); }); }); }