Files
dockhand-upstream/tests/traefik-urls.test.ts
T

108 lines
3.5 KiB
TypeScript

import { describe, test, expect } from 'bun:test';
import { extractTraefikUrls } from '../src/lib/utils/traefik-urls';
describe('extractTraefikUrls', () => {
test('returns empty for no labels / null / undefined', () => {
expect(extractTraefikUrls(null)).toEqual([]);
expect(extractTraefikUrls(undefined)).toEqual([]);
expect(extractTraefikUrls({})).toEqual([]);
});
test('ignores containers with no Traefik labels', () => {
expect(extractTraefikUrls({ 'com.docker.compose.project': 'foo' })).toEqual([]);
});
test('plain Host() defaults to https', () => {
const out = extractTraefikUrls({
'traefik.http.routers.app.rule': 'Host(`app.example.com`)'
});
expect(out).toEqual([{ url: 'https://app.example.com', router: 'app' }]);
});
test('entrypoints=websecure → https', () => {
const out = extractTraefikUrls({
'traefik.http.routers.app.rule': 'Host(`app.example.com`)',
'traefik.http.routers.app.entrypoints': 'websecure'
});
expect(out[0].url).toBe('https://app.example.com');
});
test('entrypoints=web → http', () => {
const out = extractTraefikUrls({
'traefik.http.routers.app.rule': 'Host(`app.example.com`)',
'traefik.http.routers.app.entrypoints': 'web'
});
expect(out[0].url).toBe('http://app.example.com');
});
test('explicit tls=true overrides entrypoints', () => {
const out = extractTraefikUrls({
'traefik.http.routers.app.rule': 'Host(`app.example.com`)',
'traefik.http.routers.app.entrypoints': 'web',
'traefik.http.routers.app.tls': 'true'
});
expect(out[0].url).toBe('https://app.example.com');
});
test('appends PathPrefix', () => {
const out = extractTraefikUrls({
'traefik.http.routers.api.rule': 'Host(`api.example.com`) && PathPrefix(`/v1`)',
'traefik.http.routers.api.entrypoints': 'websecure'
});
expect(out[0].url).toBe('https://api.example.com/v1');
});
test('emits one URL per Host() in a multi-host rule', () => {
const out = extractTraefikUrls({
'traefik.http.routers.web.rule': 'Host(`a.example.com`) || Host(`b.example.com`)',
'traefik.http.routers.web.entrypoints': 'websecure'
});
expect(out.map((u) => u.url)).toEqual([
'https://a.example.com',
'https://b.example.com'
]);
});
test('dedupes identical hosts across routers', () => {
const out = extractTraefikUrls({
'traefik.http.routers.a.rule': 'Host(`same.example.com`)',
'traefik.http.routers.b.rule': 'Host(`same.example.com`)'
});
expect(out).toHaveLength(1);
expect(out[0].url).toBe('https://same.example.com');
});
test('skips routers with no Host() (PathPrefix-only / HostRegexp)', () => {
expect(
extractTraefikUrls({
'traefik.http.routers.api.rule': 'PathPrefix(`/api`)',
'traefik.http.routers.regex.rule': 'HostRegexp(`{subdomain:[a-z]+}.example.com`)'
})
).toEqual([]);
});
test('accepts double-quoted and single-quoted Host()', () => {
const out = extractTraefikUrls({
'traefik.http.routers.dq.rule': 'Host("dq.example.com")',
'traefik.http.routers.sq.rule': "Host('sq.example.com')"
});
expect(out.map((u) => u.url).sort()).toEqual([
'https://dq.example.com',
'https://sq.example.com'
]);
});
test('multiple routers on one container each produce a URL', () => {
const out = extractTraefikUrls({
'traefik.http.routers.api.rule': 'Host(`api.example.com`)',
'traefik.http.routers.api.entrypoints': 'websecure',
'traefik.http.routers.ui.rule': 'Host(`ui.example.com`)',
'traefik.http.routers.ui.entrypoints': 'web'
});
expect(out.map((u) => u.url).sort()).toEqual([
'http://ui.example.com',
'https://api.example.com'
]);
});
});