Files
Termix/src/backend/tests/plugins/host-commands.test.ts
T

117 lines
3.6 KiB
TypeScript

import { describe, it, expect } from "vitest";
import {
parsePlatformProbe,
buildPackageActionCommand,
buildPackageRemoveCommand,
isValidPackageName,
buildSudoCommand,
parseUpgradable,
} from "@termix/plugin-sdk/host-commands";
describe("parsePlatformProbe", () => {
it("prefers dnf over yum when both are present", () => {
const out = ["dnf=1", "yum=1", "apt=0", "pacman=0"].join("\n");
expect(parsePlatformProbe(out).pkg).toBe("dnf");
});
it("reads the pretty OS name and tool flags", () => {
const out = [
"systemd=1",
"apt=1",
"dnf=0",
"yum=0",
"pacman=0",
"certbot=1",
"acmesh=0",
"docker=1",
"os=Debian GNU/Linux 12 (bookworm)",
].join("\n");
const info = parsePlatformProbe(out);
expect(info).toMatchObject({
hasSystemd: true,
pkg: "apt",
hasCertbot: true,
hasAcmeSh: false,
hasDocker: true,
osPrettyName: "Debian GNU/Linux 12 (bookworm)",
});
});
it("nulls the OS name when the probe line is empty", () => {
expect(parsePlatformProbe("os=").osPrettyName).toBeNull();
});
});
describe("buildPackageActionCommand", () => {
it("builds install and upgrade-all commands per package manager", () => {
expect(buildPackageActionCommand("apt", "install", "curl")).toContain(
"apt-get -y install curl",
);
expect(buildPackageActionCommand("dnf", "upgrade-all")).toBe(
"dnf -y upgrade",
);
expect(buildPackageActionCommand("yum", "install", "curl")).toBe(
"yum -y install curl",
);
expect(buildPackageActionCommand("pacman", "upgrade-all")).toBe(
"pacman -Syu --noconfirm",
);
});
it("returns null when no package manager was detected", () => {
expect(buildPackageActionCommand(null, "install", "curl")).toBeNull();
});
});
describe("buildPackageRemoveCommand", () => {
it("builds the correct remove command per package manager", () => {
expect(buildPackageRemoveCommand("apt", "curl")).toContain(
"apt-get -y remove curl",
);
expect(buildPackageRemoveCommand("dnf", "curl")).toBe("dnf -y remove curl");
expect(buildPackageRemoveCommand("yum", "curl")).toBe("yum -y remove curl");
expect(buildPackageRemoveCommand("pacman", "curl")).toBe(
"pacman -R --noconfirm curl",
);
});
it("returns null when no package manager was detected", () => {
expect(buildPackageRemoveCommand(null, "curl")).toBeNull();
});
});
describe("isValidPackageName", () => {
it("accepts ordinary package names", () => {
expect(isValidPackageName("curl")).toBe(true);
expect(isValidPackageName("lib32-glibc")).toBe(true);
});
it("rejects shell metacharacters and empty strings", () => {
expect(isValidPackageName("curl; rm -rf /")).toBe(false);
expect(isValidPackageName("")).toBe(false);
expect(isValidPackageName(123)).toBe(false);
});
});
describe("buildSudoCommand", () => {
it("single-quotes the password and wraps the marker echo around the command", () => {
const cmd = buildSudoCommand("uptime", "p'w");
expect(cmd).toContain("sudo -S -p ''");
expect(cmd).toContain("__TX_SUDO_OK__");
expect(cmd).toContain("uptime");
});
});
describe("parseUpgradable", () => {
it("parses apt list --upgradable output", () => {
const out = "curl/stable 7.88.0 amd64 [upgradable from: 7.87.0]";
expect(parseUpgradable("apt", out)).toEqual([
{ name: "curl", newVersion: "7.88.0", currentVersion: "7.87.0" },
]);
});
it("returns an empty list for no package manager", () => {
expect(parseUpgradable(null, "anything")).toEqual([]);
});
});