blob: 1eae4ee07051e9322fb2e058ae5dda9c504a2400 [file] [log] [blame]
import { html, fixture, expect } from "@open-wc/testing";
import "./sketch-container-status";
import type { SketchContainerStatus } from "./sketch-container-status";
import { State } from "../types";
describe("SketchContainerStatus", () => {
// Mock complete state for testing
const mockCompleteState: State = {
hostname: "test-host",
working_dir: "/test/dir",
initial_commit: "abcdef1234567890",
message_count: 42,
os: "linux",
title: "Test Session",
total_usage: {
input_tokens: 1000,
output_tokens: 2000,
cache_read_input_tokens: 300,
cache_creation_input_tokens: 400,
total_cost_usd: 0.25,
},
};
it("renders with complete state data", async () => {
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status
.state=${mockCompleteState}
></sketch-container-status>
`);
// Check that all expected elements exist
expect(el.shadowRoot!.querySelector("#hostname")).to.exist;
expect(el.shadowRoot!.querySelector("#workingDir")).to.exist;
expect(el.shadowRoot!.querySelector("#initialCommit")).to.exist;
expect(el.shadowRoot!.querySelector("#messageCount")).to.exist;
expect(el.shadowRoot!.querySelector("#inputTokens")).to.exist;
expect(el.shadowRoot!.querySelector("#outputTokens")).to.exist;
expect(el.shadowRoot!.querySelector("#cacheReadInputTokens")).to.exist;
expect(el.shadowRoot!.querySelector("#cacheCreationInputTokens")).to.exist;
expect(el.shadowRoot!.querySelector("#totalCost")).to.exist;
// Verify content of displayed elements
expect(el.shadowRoot!.querySelector("#hostname")!.textContent).to.equal(
"test-host",
);
expect(el.shadowRoot!.querySelector("#workingDir")!.textContent).to.equal(
"/test/dir",
);
expect(
el.shadowRoot!.querySelector("#initialCommit")!.textContent,
).to.equal("abcdef12"); // Only first 8 chars
expect(el.shadowRoot!.querySelector("#messageCount")!.textContent).to.equal(
"42",
);
expect(el.shadowRoot!.querySelector("#inputTokens")!.textContent).to.equal(
"1000",
);
expect(el.shadowRoot!.querySelector("#outputTokens")!.textContent).to.equal(
"2000",
);
expect(
el.shadowRoot!.querySelector("#cacheReadInputTokens")!.textContent,
).to.equal("300");
expect(
el.shadowRoot!.querySelector("#cacheCreationInputTokens")!.textContent,
).to.equal("400");
expect(el.shadowRoot!.querySelector("#totalCost")!.textContent).to.equal(
"$0.25",
);
});
it("renders with undefined state", async () => {
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status></sketch-container-status>
`);
// Elements should exist but be empty
expect(el.shadowRoot!.querySelector("#hostname")!.textContent).to.equal("");
expect(el.shadowRoot!.querySelector("#workingDir")!.textContent).to.equal(
"",
);
expect(
el.shadowRoot!.querySelector("#initialCommit")!.textContent,
).to.equal("");
expect(el.shadowRoot!.querySelector("#messageCount")!.textContent).to.equal(
"",
);
expect(el.shadowRoot!.querySelector("#inputTokens")!.textContent).to.equal(
"",
);
expect(el.shadowRoot!.querySelector("#outputTokens")!.textContent).to.equal(
"",
);
expect(el.shadowRoot!.querySelector("#totalCost")!.textContent).to.equal(
"$0.00",
);
});
it("renders with partial state data", async () => {
const partialState: Partial<State> = {
hostname: "partial-host",
message_count: 10,
os: "linux",
title: "Partial Test",
total_usage: {
input_tokens: 500,
},
};
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status
.state=${partialState as State}
></sketch-container-status>
`);
// Check that elements with data are properly populated
expect(el.shadowRoot!.querySelector("#hostname")!.textContent).to.equal(
"partial-host",
);
expect(el.shadowRoot!.querySelector("#messageCount")!.textContent).to.equal(
"10",
);
expect(el.shadowRoot!.querySelector("#inputTokens")!.textContent).to.equal(
"500",
);
// Check that elements without data are empty
expect(el.shadowRoot!.querySelector("#workingDir")!.textContent).to.equal(
"",
);
expect(
el.shadowRoot!.querySelector("#initialCommit")!.textContent,
).to.equal("");
expect(el.shadowRoot!.querySelector("#outputTokens")!.textContent).to.equal(
"",
);
expect(el.shadowRoot!.querySelector("#totalCost")!.textContent).to.equal(
"$0.00",
);
});
it("handles cost formatting correctly", async () => {
// Test with different cost values
const testCases = [
{ cost: 0, expected: "$0.00" },
{ cost: 0.1, expected: "$0.10" },
{ cost: 1.234, expected: "$1.23" },
{ cost: 10.009, expected: "$10.01" },
];
for (const testCase of testCases) {
const stateWithCost = {
...mockCompleteState,
total_usage: {
...mockCompleteState.total_usage,
total_cost_usd: testCase.cost,
},
};
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status
.state=${stateWithCost}
></sketch-container-status>
`);
expect(el.shadowRoot!.querySelector("#totalCost")!.textContent).to.equal(
testCase.expected,
);
}
});
it("truncates commit hash to 8 characters", async () => {
const stateWithLongCommit = {
...mockCompleteState,
initial_commit: "1234567890abcdef1234567890abcdef12345678",
};
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status
.state=${stateWithLongCommit}
></sketch-container-status>
`);
expect(
el.shadowRoot!.querySelector("#initialCommit")!.textContent,
).to.equal("12345678");
});
it("has correct link elements", async () => {
const el: SketchContainerStatus = await fixture(html`
<sketch-container-status
.state=${mockCompleteState}
></sketch-container-status>
`);
const links = Array.from(el.shadowRoot!.querySelectorAll("a"));
expect(links.length).to.equal(2);
// Check for logs link
const logsLink = links.find((link) => link.textContent === "Logs");
expect(logsLink).to.exist;
expect(logsLink!.getAttribute("href")).to.equal("logs");
// Check for download link
const downloadLink = links.find((link) => link.textContent === "Download");
expect(downloadLink).to.exist;
expect(downloadLink!.getAttribute("href")).to.equal("download");
});
});