mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-08 15:51:06 +00:00
99 lines
3.2 KiB
TypeScript
99 lines
3.2 KiB
TypeScript
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import { describe, expect, it } from "vitest";
|
|
import { withTempHome } from "../../../test/helpers/temp-home.js";
|
|
import { detectLegacyMatrixCrypto } from "./legacy-crypto.js";
|
|
import {
|
|
hasActionableMatrixMigration,
|
|
maybeCreateMatrixMigrationSnapshot,
|
|
resolveMatrixMigrationSnapshotMarkerPath,
|
|
resolveMatrixMigrationSnapshotOutputDir,
|
|
} from "./migration-snapshot.js";
|
|
import { resolveMatrixAccountStorageRoot } from "./storage-paths.js";
|
|
|
|
describe("matrix migration snapshots", () => {
|
|
it("creates a backup marker after writing a pre-migration snapshot", async () => {
|
|
await withTempHome(async (home) => {
|
|
fs.writeFileSync(path.join(home, ".openclaw", "openclaw.json"), "{}\n", "utf8");
|
|
fs.writeFileSync(path.join(home, ".openclaw", "state.txt"), "state\n", "utf8");
|
|
|
|
const result = await maybeCreateMatrixMigrationSnapshot({ trigger: "unit-test" });
|
|
|
|
expect(result.created).toBe(true);
|
|
expect(result.markerPath).toBe(resolveMatrixMigrationSnapshotMarkerPath(process.env));
|
|
expect(
|
|
result.archivePath.startsWith(resolveMatrixMigrationSnapshotOutputDir(process.env)),
|
|
).toBe(true);
|
|
expect(fs.existsSync(result.archivePath)).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("treats resolvable Matrix legacy state as actionable", async () => {
|
|
await withTempHome(async (home) => {
|
|
const stateDir = path.join(home, ".openclaw");
|
|
fs.mkdirSync(path.join(stateDir, "matrix"), { recursive: true });
|
|
fs.writeFileSync(
|
|
path.join(stateDir, "matrix", "bot-storage.json"),
|
|
'{"legacy":true}',
|
|
"utf8",
|
|
);
|
|
|
|
expect(
|
|
hasActionableMatrixMigration({
|
|
cfg: {
|
|
channels: {
|
|
matrix: {
|
|
homeserver: "https://matrix.example.org",
|
|
userId: "@bot:example.org",
|
|
accessToken: "tok-123",
|
|
},
|
|
},
|
|
} as never,
|
|
env: process.env,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
});
|
|
|
|
it("treats legacy Matrix crypto as actionable when the extension inspector is present", async () => {
|
|
await withTempHome(async (home) => {
|
|
const stateDir = path.join(home, ".openclaw");
|
|
const { rootDir } = resolveMatrixAccountStorageRoot({
|
|
stateDir,
|
|
homeserver: "https://matrix.example.org",
|
|
userId: "@bot:example.org",
|
|
accessToken: "tok-123",
|
|
});
|
|
fs.mkdirSync(path.join(rootDir, "crypto"), { recursive: true });
|
|
fs.writeFileSync(
|
|
path.join(rootDir, "crypto", "bot-sdk.json"),
|
|
JSON.stringify({ deviceId: "DEVICE123" }),
|
|
"utf8",
|
|
);
|
|
|
|
const cfg = {
|
|
channels: {
|
|
matrix: {
|
|
homeserver: "https://matrix.example.org",
|
|
userId: "@bot:example.org",
|
|
accessToken: "tok-123",
|
|
},
|
|
},
|
|
} as never;
|
|
|
|
const detection = detectLegacyMatrixCrypto({
|
|
cfg,
|
|
env: process.env,
|
|
});
|
|
expect(detection.plans).toHaveLength(1);
|
|
expect(detection.warnings).toEqual([]);
|
|
expect(
|
|
hasActionableMatrixMigration({
|
|
cfg,
|
|
env: process.env,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
});
|
|
});
|