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
107 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|