mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-07-23 21:12:59 +00:00
67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
import { decodeSettingsFromSetupURI } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/API/processSetting";
|
|
import { DEFAULT_SETTINGS } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings";
|
|
|
|
function assert(condition: unknown, message: string): asserts condition {
|
|
if (!condition) throw new Error(message);
|
|
}
|
|
|
|
Deno.test("generates a current self-hosted Setup URI through the published Commonlib contract", async () => {
|
|
const scriptPath = new URL("./generate_setupuri.ts", import.meta.url);
|
|
const command = new Deno.Command(Deno.execPath(), {
|
|
args: ["run", "-A", scriptPath.pathname],
|
|
env: {
|
|
hostname: "https://couch.example.test",
|
|
username: "alice",
|
|
password: "couch-secret",
|
|
database: "notes",
|
|
passphrase: "vault-secret",
|
|
uri_passphrase: "setup-secret",
|
|
},
|
|
stdout: "piped",
|
|
stderr: "piped",
|
|
});
|
|
|
|
const result = await command.output();
|
|
const stdout = new TextDecoder().decode(result.stdout);
|
|
const stderr = new TextDecoder().decode(result.stderr);
|
|
assert(result.success, `generator failed:\n${stdout}\n${stderr}`);
|
|
|
|
const setupURI = stdout.match(/obsidian:\/\/setuplivesync\?settings=\S+/)
|
|
?.[0];
|
|
assert(setupURI, `generator did not print a Setup URI:\n${stdout}`);
|
|
|
|
const decoded = await decodeSettingsFromSetupURI(setupURI, "setup-secret");
|
|
assert(decoded, "Commonlib could not decode the generated Setup URI");
|
|
const effectiveSettings = { ...DEFAULT_SETTINGS, ...decoded };
|
|
assert(
|
|
effectiveSettings.customChunkSize === 60,
|
|
"the Setup URI did not use the current self-hosted chunk-size recommendation",
|
|
);
|
|
assert(
|
|
effectiveSettings.chunkSplitterVersion === "v3-rabin-karp",
|
|
"the Setup URI did not use the current chunk splitter",
|
|
);
|
|
assert(
|
|
effectiveSettings.E2EEAlgorithm === "v2",
|
|
"the Setup URI did not use the current E2EE algorithm",
|
|
);
|
|
assert(
|
|
!Object.hasOwn(decoded, "doNotUseFixedRevisionForChunks"),
|
|
"the Setup URI serialised the obsolete fixed-revision compatibility setting",
|
|
);
|
|
|
|
const profiles = Object.values(decoded.remoteConfigurations ?? {});
|
|
assert(
|
|
profiles.length === 1,
|
|
"the Setup URI did not contain exactly one CouchDB remote profile",
|
|
);
|
|
assert(
|
|
decoded.activeConfigurationId === profiles[0].id,
|
|
"the CouchDB remote profile was not selected",
|
|
);
|
|
assert(
|
|
profiles[0].uri.startsWith("sls+https://"),
|
|
"the selected remote profile was not a CouchDB connection URI",
|
|
);
|
|
});
|