/*
Unit tests for dns aid covering buildDnsAidRecords (RFC-0786, RFC-1162). It also guards the documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-0786: initial unit tests for buildDnsAidRecord.
- RFC-1162: DNS-AID _mcp record + live-zone drift validation (AGD-05/06)
- RFC-1162: resolve relative interfaces.mcp.url against baseUrl (pilot crash)
*/
import { describe, it, expect } from "vitest";
import { buildDnsAidRecords } from "@warpgogol/werkstatt-shared/agent";
import type { AgentSurfaceManifest } from "@warpgogol/werkstatt-shared/agent";
function makeManifest(baseUrl: string): AgentSurfaceManifest {
return {
$schema: "agent-surface-manifest/1",
surfaceVersion: "1.0.0",
site: "test-site",
baseUrl,
generatedAt: "2026-09-28T00:00:00.000Z",
languages: { default: "de", supported: ["de"] },
supportedProtocols: [],
contentHash: "abc123",
knowledge: [],
actions: [],
claims: [],
interfaces: { llms: "", twins: null, openapi: null, mcp: null, a2a: null, search: null },
proof: null,
};
}
describe("buildDnsAidRecords (RFC-0786, RFC-1162)", () => {
it("builds record with _index._agents. name", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(record.name).toBe("_index._agents.warpgogol.com");
});
it("builds record with SVCB type", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(record.type).toBe("SVCB");
});
it("builds SVCB content with target, alpn and port params (RFC 9460)", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(record.content).toBe("1 warpgogol.com alpn=h2 port=443");
});
it("sets ttl to 3600", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(record.ttl).toBe(3600);
});
it("sets proxied to false", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(record.proxied).toBe(false);
});
it("is deterministic — same input produces same output (DNA-58)", () => {
const manifest = makeManifest("https://example.org");
const r1 = buildDnsAidRecords(manifest);
const r2 = buildDnsAidRecords(manifest);
expect(JSON.stringify(r1)).toBe(JSON.stringify(r2));
});
it("extracts domain from URL with port", () => {
const [record] = buildDnsAidRecords(makeManifest("http://localhost:3000"));
expect(record.name).toBe("_index._agents.localhost");
expect(record.content).toBe("1 localhost alpn=h2 port=443");
});
it("strips trailing slash from baseUrl", () => {
const [record] = buildDnsAidRecords(makeManifest("https://warpgogol.com/"));
expect(record.content).toBe("1 warpgogol.com alpn=h2 port=443");
});
// RFC-1162 AC-1: interfaces.mcp declared → exactly two records.
it("emits _mcp._agents. when interfaces.mcp is set (AC-1)", () => {
const manifest = makeManifest("https://warpgogol.com");
manifest.interfaces.mcp = { url: "https://warpgogol.com/mcp", protocolVersion: "2025-06-18" };
const records = buildDnsAidRecords(manifest);
expect(records).toHaveLength(2);
expect(records[0].name).toBe("_index._agents.warpgogol.com");
expect(records[1].name).toBe("_mcp._agents.warpgogol.com");
expect(records[1].type).toBe("SVCB");
expect(records[1].content).toBe("1 warpgogol.com alpn=h2 port=443");
});
// RFC-1162 AC-1: _mcp target derives from interfaces.mcp.url hostname,
// not baseUrl — hosted MCP endpoints may live on a different host.
it("derives _mcp target from interfaces.mcp.url hostname (AC-1)", () => {
const manifest = makeManifest("https://warpgogol.com");
manifest.interfaces.mcp = {
url: "https://mcp.example.net/agent",
protocolVersion: "2025-06-18",
};
const records = buildDnsAidRecords(manifest);
expect(records[1].name).toBe("_mcp._agents.warpgogol.com");
expect(records[1].content).toBe("1 mcp.example.net alpn=h2 port=443");
});
// RFC-1162: relative mcp.url (same-origin MCP route, e.g. /api/agent/mcp)
// resolves against baseUrl — the record advertises the site host.
it("resolves relative mcp.url against baseUrl hostname", () => {
const manifest = makeManifest("https://warpgogol.com");
manifest.interfaces.mcp = { url: "/api/agent/mcp", protocolVersion: "2025-06-18" };
const records = buildDnsAidRecords(manifest);
expect(records).toHaveLength(2);
expect(records[1].content).toBe("1 warpgogol.com alpn=h2 port=443");
});
// RFC-1162 AC-1: deterministic for the same input.
it("is deterministic with interfaces.mcp set (AC-1)", () => {
const manifest = makeManifest("https://warpgogol.com");
manifest.interfaces.mcp = { url: "https://warpgogol.com/mcp", protocolVersion: "2025-06-18" };
const r1 = buildDnsAidRecords(manifest);
const r2 = buildDnsAidRecords(manifest);
expect(JSON.stringify(r1)).toBe(JSON.stringify(r2));
});
// RFC-1162 AC-2: no interfaces.mcp → exactly one record, byte-identical
// to the pre-RFC singular output shape.
it("returns exactly one record without interfaces.mcp (AC-2)", () => {
const records = buildDnsAidRecords(makeManifest("https://warpgogol.com"));
expect(records).toHaveLength(1);
expect(records[0]).toEqual({
name: "_index._agents.warpgogol.com",
type: "SVCB",
content: "1 warpgogol.com alpn=h2 port=443",
ttl: 3600,
proxied: false,
});
});
});