78 lines
3.2 KiB
JavaScript
78 lines
3.2 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import {randomBytes} from "node:crypto";
|
|
import {mkdtempSync, rmSync} from "node:fs";
|
|
import {tmpdir} from "node:os";
|
|
import {join} from "node:path";
|
|
import {loadBuiltinProviders, normalizeProvider} from "./providers.mjs";
|
|
import {Vault} from "./vault.mjs";
|
|
|
|
const directory = mkdtempSync(join(tmpdir(), "xiteng-vault-test-"));
|
|
const vault = new Vault({
|
|
databasePath: join(directory, "vault.db"),
|
|
masterKey: randomBytes(32),
|
|
builtinProviders: loadBuiltinProviders(new URL("providers.json", import.meta.url))
|
|
});
|
|
const admin = {issuer: "https://id.xiteng.site", sub: "admin-sub", username: "liooil", admin: true};
|
|
const user = {issuer: "https://id.xiteng.site", sub: "user-sub", username: "ziyue", admin: false};
|
|
|
|
try {
|
|
const providers = vault.listProviders(user);
|
|
assert.ok(providers.length >= 25);
|
|
assert.equal(providers.find((provider) => provider.id === "ollama").connection.type, "frontend");
|
|
|
|
assert.throws(() => vault.createCredential(user, {
|
|
providerId: "ollama",
|
|
name: "default",
|
|
secret: "must-not-enter-server"
|
|
}), /remain in the browser/i);
|
|
|
|
const custom = normalizeProvider({
|
|
id: "team-proxy",
|
|
name: "Team Proxy",
|
|
api: "openai-completions",
|
|
connection: {
|
|
type: "backend",
|
|
baseUrl: "https://models.example.com/v1",
|
|
proxy: {type: "socks5", url: "socks5://proxy.example.com:1080"}
|
|
},
|
|
auth: {type: "bearer"},
|
|
defaultModel: "team-model",
|
|
discovery: {type: "openai-models-list", url: "https://models.example.com/v1/catalog"}
|
|
});
|
|
vault.saveCustomProvider(user, custom);
|
|
assert.equal(vault.getProvider(user, "team-proxy").connection.proxy.type, "socks5");
|
|
assert.equal(vault.getProvider(user, "team-proxy").discovery.url, "https://models.example.com/v1/catalog");
|
|
assert.equal("models" in vault.getProvider(user, "team-proxy"), false);
|
|
|
|
const credential = vault.createCredential(user, {
|
|
providerId: "team-proxy",
|
|
name: "default",
|
|
secret: {
|
|
provider: {apiKey: "secret-one"},
|
|
proxy: {username: "proxy-user", password: "proxy-pass"}
|
|
}
|
|
});
|
|
assert.equal(vault.listCredentials(user).length, 1);
|
|
assert.equal(vault.listCredentials(admin, {all: true}).length, 1);
|
|
assert.equal(vault.verifyCredential(user, credential.id).verified, true);
|
|
|
|
const resolved = vault.resolve(user, {providerId: "team-proxy", credentialName: "default"});
|
|
assert.equal(resolved.provider.id, "team-proxy");
|
|
assert.equal(resolved.credential.secret.provider.apiKey, "secret-one");
|
|
assert.equal(resolved.credential.secret.proxy.username, "proxy-user");
|
|
|
|
vault.replaceCredential(user, credential.id, {secret: "secret-two"});
|
|
assert.equal(vault.resolve(user, {providerId: "team-proxy"}).credential.secret.provider.apiKey, "secret-two");
|
|
assert.throws(() => vault.resolve(admin, {providerId: "team-proxy"}), /provider not found/i);
|
|
|
|
vault.deleteCredential(user, credential.id);
|
|
assert.equal(vault.listCredentials(user).length, 0);
|
|
vault.deleteCustomProvider(user, "team-proxy");
|
|
assert.equal(vault.getProvider(user, "team-proxy"), null);
|
|
assert.ok(vault.listAudit(admin, {all: true}).length >= 7);
|
|
console.log("Vault tests passed");
|
|
} finally {
|
|
vault.close();
|
|
rmSync(directory, {recursive: true, force: true});
|
|
}
|