mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-08-28 16:45:22 +00:00
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
import {
|
|
resetWarmBashParser,
|
|
warmBashParser,
|
|
} from "#src/access-intent/bash/parser";
|
|
import { parseBashCommandsSync } from "#src/access-intent/bash/sync-commands";
|
|
|
|
describe("parseBashCommandsSync", () => {
|
|
beforeEach(() => {
|
|
resetWarmBashParser();
|
|
});
|
|
afterEach(() => {
|
|
resetWarmBashParser();
|
|
});
|
|
|
|
it("returns null when the parser is not warm", () => {
|
|
expect(parseBashCommandsSync("echo hi")).toBeNull();
|
|
});
|
|
|
|
describe("once warm", () => {
|
|
beforeEach(async () => {
|
|
await warmBashParser();
|
|
});
|
|
|
|
it("returns a single unit for a lone command", () => {
|
|
expect(parseBashCommandsSync("echo hi")).toEqual([{ text: "echo hi" }]);
|
|
});
|
|
|
|
it("decomposes a chained command into its units", () => {
|
|
expect(parseBashCommandsSync("cd /repo && npm install x")).toEqual([
|
|
{ text: "cd /repo" },
|
|
{ text: "npm install x" },
|
|
]);
|
|
});
|
|
|
|
it("descends into a command substitution, tagging its context", () => {
|
|
expect(parseBashCommandsSync("echo $(rm -rf /)")).toEqual([
|
|
{ text: "echo $(rm -rf /)" },
|
|
{ text: "rm -rf /", context: "command_substitution" },
|
|
]);
|
|
});
|
|
|
|
it("flags an opaque wrapper", () => {
|
|
expect(parseBashCommandsSync('bash -c "rm -rf /"')).toEqual([
|
|
{
|
|
text: 'bash -c "rm -rf /"',
|
|
wrapperKind: "opaque-payload",
|
|
executedUnit: "rm -rf /",
|
|
},
|
|
]);
|
|
});
|
|
|
|
it("returns an empty array for a comment-only command", () => {
|
|
expect(parseBashCommandsSync("# just a comment")).toEqual([]);
|
|
});
|
|
|
|
it("returns an empty array for an empty command", () => {
|
|
expect(parseBashCommandsSync("")).toEqual([]);
|
|
});
|
|
});
|
|
});
|