hmc-rag / frontend /src /components /Sidebar.test.ts
webmuppet
Refactor: replace Streamlit with React+Vite SPA + FastAPI server
b5c0df4
Raw
History Blame Contribute Delete
2.58 kB
/**
* Property-based tests for saved response sidebar truncation.
*
* **Validates: Requirements 8.3**
*
* Property 5: Saved response sidebar truncation — for any question string
* exceeding 80 characters, the text displayed in the sidebar SHALL be between
* 75 and 85 characters long (inclusive). Strings ≤ 80 characters are returned
* unchanged.
*/
import { describe, it, expect } from "vitest";
import * as fc from "fast-check";
import { truncateQuestion } from "./Sidebar";
// ---------------------------------------------------------------------------
// Property 5: Saved response sidebar truncation
// ---------------------------------------------------------------------------
describe("Property 5: Saved response sidebar truncation", () => {
/**
* **Validates: Requirements 8.3**
*
* For any question string exceeding 80 characters, truncateQuestion returns
* a string within [75, 85] characters long (inclusive).
*/
it("truncated text is within [75, 85] characters when original exceeds 80 characters", () => {
fc.assert(
fc.property(
fc.string({ minLength: 81, maxLength: 500 }),
(question) => {
const truncated = truncateQuestion(question);
expect(truncated.length).toBeGreaterThanOrEqual(75);
expect(truncated.length).toBeLessThanOrEqual(85);
}
)
);
});
it("truncated text ends with ellipsis when original exceeds 80 characters", () => {
fc.assert(
fc.property(
fc.string({ minLength: 81, maxLength: 500 }),
(question) => {
const truncated = truncateQuestion(question);
expect(truncated.endsWith("\u2026")).toBe(true);
}
)
);
});
it("strings of 80 characters or fewer are returned unchanged", () => {
fc.assert(
fc.property(
fc.string({ minLength: 0, maxLength: 80 }),
(question) => {
const truncated = truncateQuestion(question);
expect(truncated).toBe(question);
}
)
);
});
it("truncated text is a prefix of the original (minus ellipsis)", () => {
fc.assert(
fc.property(
fc.string({ minLength: 81, maxLength: 500 }),
(question) => {
const truncated = truncateQuestion(question);
// Remove the trailing ellipsis to get the prefix
const prefix = truncated.slice(0, -1);
// The prefix must be a substring of the original starting at index 0
expect(question.startsWith(prefix.trimEnd())).toBe(true);
}
)
);
});
});