mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-09-21 18:17:05 +00:00
Complete central provider, resource, scheduling, and recovery contracts
This commit is contained in:
@@ -130,13 +130,18 @@ describe("central remote administration capabilities", () => {
|
||||
});
|
||||
|
||||
it("mutates Object Storage and verifies its milestone postcondition", async () => {
|
||||
const downloadJson = vi.fn(async () => ({ locked: false, accepted_nodes: ["node-1"] }));
|
||||
const milestone = { locked: false, accepted_nodes: ["node-1"] };
|
||||
const downloadJson = vi.fn(async () => milestone);
|
||||
const downloadJsonWithResult = vi.fn(async () => ({
|
||||
status: "available" as const,
|
||||
value: milestone,
|
||||
}));
|
||||
const replicator = {
|
||||
nodeid: "node-1",
|
||||
initializeDatabaseForReplication: vi.fn(async () => true),
|
||||
markRemoteLocked: vi.fn(async () => undefined),
|
||||
markRemoteResolved: vi.fn(async () => undefined),
|
||||
client: { downloadJson },
|
||||
client: { downloadJson, downloadJsonWithResult },
|
||||
};
|
||||
const setting = { ...DEFAULT_SETTINGS, remoteType: REMOTE_MINIO };
|
||||
const capability = OBJECT_STORAGE_CENTRAL_REMOTE_ADMINISTRATION_CAPABILITY;
|
||||
@@ -155,7 +160,63 @@ describe("central remote administration capabilities", () => {
|
||||
},
|
||||
});
|
||||
expect(replicator.markRemoteResolved).toHaveBeenCalledWith(setting);
|
||||
expect(downloadJson).toHaveBeenCalledWith("_00000000-milestone.json");
|
||||
expect(downloadJsonWithResult).toHaveBeenCalledWith("_00000000-milestone.json");
|
||||
expect(downloadJson).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("keeps a missing Object Storage milestone as an unverified postcondition", async () => {
|
||||
const downloadJson = vi.fn(async () => false);
|
||||
const downloadJsonWithResult = vi.fn(async () => ({ status: "not-found" as const }));
|
||||
const replicator = {
|
||||
nodeid: "node-1",
|
||||
initializeDatabaseForReplication: vi.fn(async () => true),
|
||||
markRemoteLocked: vi.fn(async () => undefined),
|
||||
markRemoteResolved: vi.fn(async () => undefined),
|
||||
client: { downloadJson, downloadJsonWithResult },
|
||||
};
|
||||
|
||||
const result = await OBJECT_STORAGE_CENTRAL_REMOTE_ADMINISTRATION_CAPABILITY.run(
|
||||
replicator as never,
|
||||
{ ...DEFAULT_SETTINGS, remoteType: REMOTE_MINIO },
|
||||
{ action: CENTRAL_REMOTE_ADMINISTRATION_ACTIONS.MARK_RESOLVED }
|
||||
);
|
||||
|
||||
expect(result).toEqual({
|
||||
status: CENTRAL_REMOTE_ADMINISTRATION_RESULT_STATUSES.VERIFICATION_FAILED,
|
||||
reason: CENTRAL_REMOTE_ADMINISTRATION_FAILURE_REASONS.MILESTONE_NOT_FOUND,
|
||||
});
|
||||
expect(downloadJsonWithResult).toHaveBeenCalledWith("_00000000-milestone.json");
|
||||
expect(downloadJson).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("returns a typed failure with diagnostic detail when Object Storage milestone reading is unavailable", async () => {
|
||||
const diagnostic = new Error("object storage unavailable");
|
||||
const downloadJson = vi.fn(async () => false);
|
||||
const downloadJsonWithResult = vi.fn(async () => ({
|
||||
status: "unavailable" as const,
|
||||
error: diagnostic,
|
||||
}));
|
||||
const replicator = {
|
||||
nodeid: "node-1",
|
||||
initializeDatabaseForReplication: vi.fn(async () => true),
|
||||
markRemoteLocked: vi.fn(async () => undefined),
|
||||
markRemoteResolved: vi.fn(async () => undefined),
|
||||
client: { downloadJson, downloadJsonWithResult },
|
||||
};
|
||||
|
||||
const result = await OBJECT_STORAGE_CENTRAL_REMOTE_ADMINISTRATION_CAPABILITY.run(
|
||||
replicator as never,
|
||||
{ ...DEFAULT_SETTINGS, remoteType: REMOTE_MINIO },
|
||||
{ action: CENTRAL_REMOTE_ADMINISTRATION_ACTIONS.MARK_RESOLVED }
|
||||
);
|
||||
|
||||
expect(result).toEqual({
|
||||
status: CENTRAL_REMOTE_ADMINISTRATION_RESULT_STATUSES.VERIFICATION_FAILED,
|
||||
reason: CENTRAL_REMOTE_ADMINISTRATION_FAILURE_REASONS.MILESTONE_READ_FAILED,
|
||||
detail: diagnostic,
|
||||
});
|
||||
expect(downloadJsonWithResult).toHaveBeenCalledWith("_00000000-milestone.json");
|
||||
expect(downloadJson).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("rejects an incomplete CouchDB milestone adapter before mutation", async () => {
|
||||
@@ -177,14 +238,14 @@ describe("central remote administration capabilities", () => {
|
||||
expect(markRemoteLocked).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("rejects an incomplete Object Storage milestone adapter before mutation", async () => {
|
||||
it("rejects an Object Storage adapter which only exposes lossy milestone reading", async () => {
|
||||
const markRemoteResolved = vi.fn(async () => undefined);
|
||||
const replicator = {
|
||||
nodeid: "node-1",
|
||||
initializeDatabaseForReplication: vi.fn(async () => true),
|
||||
markRemoteLocked: vi.fn(async () => undefined),
|
||||
markRemoteResolved,
|
||||
client: {},
|
||||
client: { downloadJson: vi.fn(async () => false) },
|
||||
};
|
||||
|
||||
await expect(
|
||||
|
||||
Reference in New Issue
Block a user