Files
cloudflare-domain-manager/apps/api/test/dns-sync.test.ts
T
Denozordec 6d1d8ca4f3
Build, Test, and Push CFDM Docker Image / test (push) Failing after 51s
Build, Test, and Push CFDM Docker Image / build-and-push (push) Has been skipped
Build, Test, and Push CFDM Docker Image / update-wiki (push) Has been skipped
Build, Test, and Push CFDM Docker Image / create-release (push) Has been skipped
feat:Update pnpm-lock.yaml to link shared package; modify API routes to utilize new schemas for domain and service management; enhance DNS record handling with CNAME support; refactor service and subdomain routes for improved functionality; implement confirm dialog for domain deletion in the frontend; clean up unused components and improve UI consistency.
2026-06-22 13:52:33 +07:00

107 lines
2.5 KiB
TypeScript

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);
});
});