import test from 'brittle' import { parseImageRef, normalizeDigest, digestsFromInspect, preferredRepoTag, } from '../server/services/image-updates.js' test('parseImageRef handles Docker Hub short names', (t) => { const r = parseImageRef('nginx:alpine') t.ok(r) t.is(r.registry, 'registry-1.docker.io') t.is(r.repository, 'library/nginx') t.is(r.tag, 'alpine') t.ok(r.isOfficial) t.absent(r.isPinned) }) test('parseImageRef handles user/repo on Hub', (t) => { const r = parseImageRef('library/redis:7') t.is(r.repository, 'library/redis') t.is(r.tag, '7') t.is(r.host, 'docker.io') }) test('parseImageRef handles ghcr and custom registries', (t) => { const g = parseImageRef('ghcr.io/org/app:1.2.3') t.is(g.registry, 'ghcr.io') t.is(g.repository, 'org/app') t.is(g.tag, '1.2.3') const c = parseImageRef('registry.example.com:5000/ns/img:v2') t.is(c.registry, 'registry.example.com:5000') t.is(c.repository, 'ns/img') t.is(c.tag, 'v2') }) test('parseImageRef digests and bare ids', (t) => { const pinned = parseImageRef('nginx@sha256:abc123') t.ok(pinned.isPinned) t.is(pinned.digest, 'sha256:abc123') t.is(parseImageRef('sha256:deadbeef'), null) t.is(parseImageRef('a1b2c3d4e5f6'), null) t.is(parseImageRef(''), null) t.is(parseImageRef(':'), null) }) test('parseImageRef defaults tag to latest', (t) => { const r = parseImageRef('postgres') t.is(r.tag, 'latest') t.is(r.repository, 'library/postgres') }) test('normalizeDigest and digestsFromInspect', (t) => { t.is(normalizeDigest('sha256:abc'), 'sha256:abc') t.is(normalizeDigest('abc'), 'sha256:abc') t.is(normalizeDigest(''), null) const digests = digestsFromInspect({ RepoDigests: [ 'nginx@sha256:1111111111111111111111111111111111111111111111111111111111111111', 'docker.io/library/nginx@sha256:2222222222222222222222222222222222222222222222222222222222222222', ], }) t.is(digests.length, 2) t.ok(digests[0].startsWith('sha256:')) t.is(preferredRepoTag({ RepoTags: [':', 'nginx:alpine'] }), 'nginx:alpine') t.is(preferredRepoTag({ RepoTags: [] }), null) })