66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
/**
|
|
* Image reference parsing across the registries semver has to handle.
|
|
*/
|
|
import { describe, it, expect } from 'bun:test';
|
|
import { parseImageReference, isDockerHub, isGhcr } from '../src/lib/server/registry/image-ref';
|
|
|
|
describe('parseImageReference', () => {
|
|
it('defaults a bare official image to Docker Hub library/', () => {
|
|
expect(parseImageReference('nginx:1.25')).toEqual({
|
|
registry: 'index.docker.io',
|
|
repo: 'library/nginx',
|
|
tag: '1.25'
|
|
});
|
|
});
|
|
|
|
it('keeps a Hub user/repo', () => {
|
|
expect(parseImageReference('grafana/grafana:11.0.0')).toEqual({
|
|
registry: 'index.docker.io',
|
|
repo: 'grafana/grafana',
|
|
tag: '11.0.0'
|
|
});
|
|
});
|
|
|
|
it('parses ghcr', () => {
|
|
expect(parseImageReference('ghcr.io/user/app:v1.2')).toEqual({
|
|
registry: 'ghcr.io',
|
|
repo: 'user/app',
|
|
tag: 'v1.2'
|
|
});
|
|
});
|
|
|
|
it('parses codeberg (the forgejo case)', () => {
|
|
expect(parseImageReference('codeberg.org/forgejo/forgejo:15.0.2')).toEqual({
|
|
registry: 'codeberg.org',
|
|
repo: 'forgejo/forgejo',
|
|
tag: '15.0.2'
|
|
});
|
|
});
|
|
|
|
it('parses a registry with a port', () => {
|
|
expect(parseImageReference('registry.example.com:5000/repo:tag')).toEqual({
|
|
registry: 'registry.example.com:5000',
|
|
repo: 'repo',
|
|
tag: 'tag'
|
|
});
|
|
});
|
|
|
|
it('defaults the tag to latest and strips a digest', () => {
|
|
expect(parseImageReference('nginx')).toMatchObject({ tag: 'latest' });
|
|
expect(parseImageReference('nginx@sha256:abc')).toMatchObject({ repo: 'library/nginx', tag: 'latest' });
|
|
});
|
|
});
|
|
|
|
describe('registry host predicates', () => {
|
|
it('recognises every Docker Hub alias', () => {
|
|
for (const h of ['index.docker.io', 'docker.io', 'registry-1.docker.io', 'hub.docker.com']) {
|
|
expect(isDockerHub(h)).toBe(true);
|
|
}
|
|
expect(isDockerHub('ghcr.io')).toBe(false);
|
|
});
|
|
it('recognises ghcr', () => {
|
|
expect(isGhcr('ghcr.io')).toBe(true);
|
|
expect(isGhcr('codeberg.org')).toBe(false);
|
|
});
|
|
});
|