import { describe, expect, it } from "vitest"; import { createMemoryDb, repos, runMigrations } from "@cfdm/db"; import { SYNC_CONFLICT, SYNC_ERROR, SYNC_SYNCED } from "@cfdm/shared"; import type { CloudflareClient } from "../src/lib/cf-client.js"; import { pullSync } from "../src/services/sync-service.js"; const ZONE = "rkns.top"; const CF_ZONE_ID = "zone-rkns"; function mockCf(remote: Array<{ id: string; type: string; name: string; content: string; }>): CloudflareClient { return { listDnsRecords: async () => remote.map((record) => ({ ...record, ttl: 1, proxied: false, })), } as unknown as CloudflareClient; } function setupDb() { const { db, sqlite } = createMemoryDb(); runMigrations(sqlite); return db; } describe("pullSync", () => { it("reconciles short local names with Cloudflare FQDNs", async () => { const db = setupDb(); const domain = repos.createDomain(db, null, ZONE, CF_ZONE_ID); repos.insertDnsRecord( db, domain.id, "A", "de", "193.233.134.103", 1, false, null, SYNC_CONFLICT, "local", "cf-de", ); const cf = mockCf([ { id: "cf-de", type: "A", name: "de.rkns.top", content: "193.233.134.103", }, ]); const changes = await pullSync(db, cf, domain); expect(changes).toBeGreaterThan(0); const records = repos.listDnsByDomain(db, domain.id); expect(records).toHaveLength(1); expect(records[0].name).toBe("de.rkns.top"); expect(records[0].sync_status).toBe(SYNC_SYNCED); }); it("marks local record as conflict when Cloudflare has another type", async () => { const db = setupDb(); const domain = repos.createDomain(db, null, ZONE, CF_ZONE_ID); repos.insertDnsRecord( db, domain.id, "A", "mhome", "185.244.181.61", 1, false, null, SYNC_ERROR, "local", null, ); const cf = mockCf([ { id: "cf-mhome", type: "CNAME", name: "mhome.rkns.top", content: "mmsk.rkns.top", }, ]); await pullSync(db, cf, domain); const records = repos.listDnsByDomain(db, domain.id); const localA = records.find((r) => r.record_type === "A"); expect(localA?.sync_status).toBe(SYNC_CONFLICT); expect(localA?.last_error).toBe("type mismatch with cloudflare"); const localCname = records.find((r) => r.record_type === "CNAME"); expect(localCname?.sync_status).toBe(SYNC_SYNCED); }); });