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.
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
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
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user