import 'package:podman/podman.dart'; import 'package:test/test.dart'; import 'support/fake_podman_transport.dart'; void main() { group('PodmanClient artifacts API', () { test('supports list, inspect, pull, add, push, extract, and remove', () async { final blobBytes = [1, 2, 3, 4]; final extractBytes = [9, 8, 7]; final transport = FakePodmanTransport() ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/artifacts/json', responseBody: [ { 'Name': 'quay.io/groupware/policy:latest', 'Digest': 'sha256:abc', 'Manifest': {'schemaVersion': 2}, }, ], ) ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/artifacts/quay.io%2Fgroupware%2Fpolicy%3Alatest/json', responseBody: const { 'Name': 'quay.io/groupware/policy:latest', 'Digest': 'sha256:abc', 'Manifest': {'schemaVersion': 2}, }, ) ..enqueue( method: HttpMethod.post, path: '/v5.0.0/libpod/artifacts/pull', queryParameters: const >{ 'name': ['quay.io/groupware/policy:latest'], 'retry': ['5'], 'retryDelay': ['2s'], 'tlsVerify': ['true'], }, statusCode: 200, responseBody: const {'ArtifactDigest': 'sha256:abc'}, ) ..enqueue( method: HttpMethod.post, path: '/v5.0.0/libpod/artifacts/add', queryParameters: const >{ 'name': ['quay.io/groupware/policy:latest'], 'fileName': ['policy.json'], 'fileMIMEType': ['application/json'], 'annotations': ['purpose=policy'], 'append': ['true'], }, body: blobBytes, statusCode: 201, responseBody: const {'ArtifactDigest': 'sha256:add'}, ) ..enqueue( method: HttpMethod.post, path: '/v5.0.0/libpod/artifacts/local/add', queryParameters: const >{ 'name': ['quay.io/groupware/policy:latest'], 'fileName': ['policy.json'], 'path': ['/tmp/policy.json'], 'replace': ['true'], }, statusCode: 201, responseBody: const { 'ArtifactDigest': 'sha256:localadd', }, ) ..enqueue( method: HttpMethod.post, path: '/v5.0.0/libpod/artifacts/quay.io%2Fgroupware%2Fpolicy%3Alatest/push', queryParameters: const >{ 'retry': ['3'], 'retrydelay': ['1s'], 'tlsVerify': ['false'], }, statusCode: 200, responseBody: const {'ArtifactDigest': 'sha256:abc'}, ) ..enqueue( method: HttpMethod.get, path: '/v5.0.0/libpod/artifacts/quay.io%2Fgroupware%2Fpolicy%3Alatest/extract', queryParameters: const >{ 'title': ['policy.json'], }, statusCode: 200, responseBody: extractBytes, ) ..enqueue( method: HttpMethod.delete, path: '/v5.0.0/libpod/artifacts/quay.io%2Fgroupware%2Fpolicy%3Alatest', statusCode: 200, responseBody: const { 'ArtifactDigests': ['sha256:abc'], }, ) ..enqueue( method: HttpMethod.delete, path: '/v5.0.0/libpod/artifacts/remove', queryParameters: const >{ 'artifacts': ['quay.io/groupware/policy:latest'], 'ignore': ['true'], }, statusCode: 200, responseBody: const { 'ArtifactDigests': ['sha256:abc'], }, ); final client = PodmanClient(transport: transport); final list = await client.listArtifacts(); expect(list, hasLength(1)); expect(list.first.digest, 'sha256:abc'); final inspected = await client.inspectArtifact( 'quay.io/groupware/policy:latest', ); expect(inspected.name, 'quay.io/groupware/policy:latest'); final pulled = await client.pullArtifact( 'quay.io/groupware/policy:latest', options: const ArtifactPullOptions( retry: 5, retryDelay: '2s', tlsVerify: true, ), ); expect(pulled.artifactDigest, 'sha256:abc'); final added = await client.addArtifact( 'quay.io/groupware/policy:latest', fileName: 'policy.json', fileBytes: blobBytes, options: const ArtifactAddOptions( fileMimeType: 'application/json', annotations: ['purpose=policy'], append: true, ), ); expect(added.artifactDigest, 'sha256:add'); final localAdded = await client.addLocalArtifact( 'quay.io/groupware/policy:latest', path: '/tmp/policy.json', fileName: 'policy.json', options: const ArtifactAddOptions(replace: true), ); expect(localAdded.artifactDigest, 'sha256:localadd'); final pushed = await client.pushArtifact( 'quay.io/groupware/policy:latest', options: const ArtifactPushOptions( retry: 3, retryDelay: '1s', tlsVerify: false, ), ); expect(pushed.artifactDigest, 'sha256:abc'); final extracted = await client.extractArtifact( 'quay.io/groupware/policy:latest', title: 'policy.json', ); expect(extracted, extractBytes); final removed = await client.removeArtifact( 'quay.io/groupware/policy:latest', ); expect(removed.artifactDigests, contains('sha256:abc')); final batchRemoved = await client.removeArtifacts( const ArtifactRemoveOptions( artifacts: ['quay.io/groupware/policy:latest'], ignore: true, ), ); expect(batchRemoved.artifactDigests, contains('sha256:abc')); transport.expectNoPending(); }); }); }