Files
larksuite-cli/scripts/install.test.js

104 lines
2.9 KiB
JavaScript

// Copyright (c) 2026 Lark Technologies Pte. Ltd.
// SPDX-License-Identifier: MIT
const { test } = require("node:test");
const assert = require("node:assert");
const fs = require("fs");
const os = require("os");
const path = require("path");
const crypto = require("crypto");
const {
verifyChecksum,
getExpectedChecksum,
ChecksumError,
PackageIntegrityError,
} = require("./install.js");
function mktmpdir() {
return fs.mkdtempSync(path.join(os.tmpdir(), "install-test-"));
}
test("verifyChecksum: correct hash resolves", async () => {
const dir = mktmpdir();
try {
const filePath = path.join(dir, "data.bin");
const bytes = Buffer.from("hello world");
fs.writeFileSync(filePath, bytes);
const correctHash = crypto.createHash("sha256").update(bytes).digest("hex");
await verifyChecksum(filePath, correctHash);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test("verifyChecksum: mismatched hash throws ChecksumError", async () => {
const dir = mktmpdir();
try {
const filePath = path.join(dir, "data.bin");
fs.writeFileSync(filePath, "hello world");
const wrongHash = "0".repeat(64);
await assert.rejects(
() => verifyChecksum(filePath, wrongHash),
(err) => err instanceof ChecksumError,
);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test("getExpectedChecksum: returns hash for listed archive", () => {
const dir = mktmpdir();
try {
const checksumsPath = path.join(dir, "checksums.txt");
const knownHash = "a".repeat(64);
fs.writeFileSync(
checksumsPath,
`${knownHash} lark-cli-1.0.0-linux-amd64.tar.gz\n`
);
const result = getExpectedChecksum(
"lark-cli-1.0.0-linux-amd64.tar.gz",
checksumsPath,
);
assert.strictEqual(result, knownHash);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test("getExpectedChecksum: throws PackageIntegrityError (not ChecksumError) when checksums.txt file is absent", () => {
const dir = mktmpdir();
try {
const missingPath = path.join(dir, "does-not-exist.txt");
assert.throws(
() => getExpectedChecksum("lark-cli-1.0.0-linux-amd64.tar.gz", missingPath),
(err) =>
err instanceof PackageIntegrityError &&
!(err instanceof ChecksumError),
);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test("getExpectedChecksum: throws ChecksumError when entry missing", () => {
const dir = mktmpdir();
try {
const checksumsPath = path.join(dir, "checksums.txt");
fs.writeFileSync(
checksumsPath,
`${"a".repeat(64)} some-other-archive.tar.gz\n`
);
assert.throws(
() => getExpectedChecksum("nonexistent-archive.tar.gz", checksumsPath),
(err) => err instanceof ChecksumError,
);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});