← Files Biological Sequence & Alignment ViewerARCHIVED FILE
src/viewer-commands.test.ts
11.4 KB · Sep 30, 2026 · 23:01 UTC
import { describe, expect, it } from "vitest";
import {
queuedSequenceViewerCommandSchema,
sequenceViewerControlInputSchema,
sequenceViewerControlToolInputSchema,
} from "./viewer-commands";
const sessionId = "11111111-1111-4111-8111-111111111111";
describe("sequence viewer command schemas", () => {
it.each([
{ action: "clear_alignment_selection", sessionId },
{ action: "clear_sequence_selection", sessionId },
{ action: "compute_alignment_guide_tree", sessionId },
{ action: "filter_alignment_rows", query: "KRAS", sessionId },
{ action: "focus_alignment_cell", column: 4, row: "KRAS", sessionId },
{
action: "focus_alignment_reference_coordinate",
coordinate: 12,
sessionId,
},
{
action: "focus_sequence_coordinate",
coordinate: 12,
record: "query",
sessionId,
},
{ action: "navigate_alignment_search_hit", direction: "next", sessionId },
{
action: "navigate_sequence_search_hit",
direction: "previous",
sessionId,
},
{ action: "reset_alignment_view", sessionId },
{ action: "search_alignment", query: "GxxxxGKS", sessionId },
{ action: "search_sequence", query: "GGT", sessionId },
{ action: "select_alignment_columns", end: 25, sessionId, start: 20 },
{
action: "select_sequence_range",
end: 18,
sessionId,
start: 12,
wraparound: false,
},
{
action: "select_sequence_feature",
featureId: "cds-1",
record: "query",
sessionId,
},
{
action: "set_alignment_row_visibility",
rows: ["KRAS", "NRAS"],
sessionId,
visible: false,
},
{ action: "set_alignment_reference", reference: "consensus", sessionId },
{
action: "set_alignment_view_options",
cellWidth: 24,
colorMode: "protein-similarity",
sessionId,
},
{ action: "set_display_mode", displayMode: "fullscreen", sessionId },
{ action: "set_mode", mode: "alignment", sessionId },
{ action: "set_sequence_record", record: "query", sessionId },
{
action: "set_sequence_view_options",
geneticCodeId: 11,
layout: "split",
orientation: "reverse-complement",
palette: "rasmol",
sessionId,
synchronizedViews: false,
wrapWidth: 80,
},
{ action: "set_toolbar_visibility", sessionId, visible: false },
{ action: "show_all_alignment_rows", sessionId },
])("accepts the complete $action contract", (command) => {
expect(sequenceViewerControlInputSchema.safeParse(command).success).toBe(
true,
);
});
it.each([
"muted-amino-acid",
"muted-nucleic-acid",
"neutral",
"ncbi-nucleic-acid",
"jalview-nucleotide",
])(
"preserves the %s palette through MCP and queued command validation",
(palette) => {
const input = {
action: "set_sequence_view_options",
palette,
sessionId,
};
const parsed = sequenceViewerControlToolInputSchema.strict().parse(input);
expect(sequenceViewerControlInputSchema.parse(parsed)).toEqual(input);
expect(
queuedSequenceViewerCommandSchema.parse({
action: input.action,
commandId: sessionId,
palette,
revision: 1,
}),
).toMatchObject({ action: input.action, palette });
},
);
it.each(["muted-nucleic-acid", "muted-amino-acid", "neutral"])(
"preserves the %s alignment palette through MCP and queued command validation",
(residuePalette) => {
const input = {
action: "set_alignment_view_options",
residuePalette,
sessionId,
};
const parsed = sequenceViewerControlToolInputSchema.strict().parse(input);
expect(sequenceViewerControlInputSchema.parse(parsed)).toEqual(input);
expect(
queuedSequenceViewerCommandSchema.parse({
action: input.action,
commandId: sessionId,
residuePalette,
revision: 1,
}),
).toMatchObject({ action: input.action, residuePalette });
},
);
it("rejects unknown sequence and alignment palettes", () => {
expect(
sequenceViewerControlToolInputSchema.safeParse({
action: "set_sequence_view_options",
palette: "retired-palette",
sessionId,
}).success,
).toBe(false);
expect(
sequenceViewerControlInputSchema.safeParse({
action: "set_sequence_view_options",
palette: "retired-palette",
sessionId,
}).success,
).toBe(false);
expect(
sequenceViewerControlToolInputSchema.safeParse({
action: "set_alignment_view_options",
residuePalette: "retired-palette",
sessionId,
}).success,
).toBe(false);
expect(
sequenceViewerControlInputSchema.safeParse({
action: "set_alignment_view_options",
residuePalette: "retired-palette",
sessionId,
}).success,
).toBe(false);
});
it.each([
{ action: "filter_alignment_rows", query: "x".repeat(501), sessionId },
{ action: "focus_alignment_cell", row: "KRAS", sessionId },
{ action: "focus_alignment_reference_coordinate", sessionId },
{ action: "focus_sequence_coordinate", sessionId },
{ action: "navigate_alignment_search_hit", sessionId },
{ action: "navigate_sequence_search_hit", direction: "later", sessionId },
{ action: "search_sequence", sessionId },
{ action: "select_alignment_columns", start: 3, sessionId },
{ action: "select_sequence_range", end: 3, sessionId },
{ action: "select_sequence_feature", featureId: "", sessionId },
{
action: "set_alignment_row_visibility",
rows: [],
sessionId,
visible: true,
},
{ action: "set_alignment_reference", reference: "", sessionId },
{ action: "set_alignment_view_options", sessionId },
{ action: "set_display_mode", sessionId },
{ action: "set_mode", sessionId },
{ action: "set_sequence_record", record: "", sessionId },
{ action: "set_sequence_view_options", sessionId },
{ action: "set_toolbar_visibility", sessionId },
{ action: "set_toolbar_visibility", sessionId, visible: "false" },
{
action: "set_toolbar_visibility",
sessionId: "wrong-session",
visible: false,
},
])("rejects an incomplete $action contract", (command) => {
expect(sequenceViewerControlInputSchema.safeParse(command).success).toBe(
false,
);
});
it("requires valid queue identity and revision metadata", () => {
expect(
queuedSequenceViewerCommandSchema.safeParse({
action: "search_sequence",
commandId: sessionId,
query: "ACGT",
revision: 1,
}).success,
).toBe(true);
expect(
queuedSequenceViewerCommandSchema.safeParse({
action: "search_sequence",
commandId: "not-a-uuid",
query: "ACGT",
revision: 0,
}).success,
).toBe(false);
});
it.each([
{
action: "set_workbench_panel",
group: "sequence-tools",
panel: "quality",
},
{ action: "set_workbench_panel", group: "alignment-tools", panel: null },
{ action: "set_workbench_panel", group: "sequence-display", panel: "copy" },
{
action: "set_workbench_disclosure",
disclosureId: "sequence.record-metadata",
expanded: true,
},
{
action: "dismiss_workbench_feedback",
feedbackId: "sequence.copy-feedback",
},
{
action: "set_read_pileup_options",
minimumMappingQuality: 0,
strand: "-",
includeDuplicates: false,
includeQcFailed: false,
includeSecondary: false,
includeSupplementary: true,
includeUnknownMappingQuality: false,
showAllBases: true,
showSoftClips: false,
sortBy: "mapping-quality",
},
{ action: "select_read", trackId: "track-a", sourceReadIndex: 0 },
{ action: "clear_read_selection" },
{
action: "set_quality_view_options",
distributionsExpanded: true,
methodsExpanded: false,
expandedTables: ["cycle-quality", "cycle-composition"],
},
{ action: "set_quality_view_options", expandedTables: [] },
{
action: "set_chromatogram_view_options",
firstBase: 11,
basesPerWindow: 100,
},
{
action: "set_sequence_record_browser",
query: "record-a",
page: 0,
sortBy: "length",
expanded: true,
},
{
action: "set_sequence_annotation_index",
query: "CDS",
page: 1,
expanded: true,
},
{ action: "set_sequence_view_options", originRangeExpanded: false },
{ action: "navigate_sequence_feature", direction: "previous" },
{ action: "select_alignment_rows", rows: [] },
{ action: "select_alignment_rows", rows: ["row-a", "row-b"] },
{
action: "set_alignment_view_options",
enabledMetricTracks: [],
showSequenceLogoHelp: false,
rowSortKey: "coverage",
rowSortDirection: "desc",
},
])(
"preserves every new UI operation through the model-facing $action schema",
(command) => {
const input = { ...command, sessionId };
const modelInput = sequenceViewerControlToolInputSchema.parse(input);
expect(sequenceViewerControlInputSchema.parse(modelInput)).toEqual(input);
},
);
it.each([
{ action: "set_workbench_panel", group: "sequence-tools" },
{ action: "set_workbench_panel", group: "unknown", panel: "inspect" },
{ action: "set_workbench_panel", group: "sequence-tools", panel: "" },
{
action: "set_workbench_disclosure",
disclosureId: "sequence.record-metadata",
},
{
action: "set_workbench_disclosure",
disclosureId: "unscoped",
expanded: true,
},
{ action: "dismiss_workbench_feedback" },
{ action: "dismiss_workbench_feedback", feedbackId: "approve-source" },
{
action: "dismiss_workbench_feedback",
feedbackId: "sequence.copy-feedback",
approve: true,
},
{
action: "set_workbench_disclosure",
disclosureId: "sequence.record-metadata",
expanded: false,
approve: true,
},
{ action: "set_read_pileup_options" },
{ action: "set_quality_view_options" },
{ action: "set_quality_view_options", expandedTables: ["unknown"] },
{ action: "set_read_pileup_options", minimumMappingQuality: 256 },
{ action: "set_read_pileup_options", sortBy: "source" },
{ action: "set_read_pileup_options", includeDuplicates: "false" },
{ action: "select_read", trackId: "track-a", sourceReadIndex: -1 },
{ action: "select_read", trackId: "track-a" },
{ action: "set_chromatogram_view_options" },
{ action: "set_chromatogram_view_options", firstBase: 0 },
{ action: "set_chromatogram_view_options", basesPerWindow: 101 },
{ action: "set_sequence_record_browser" },
{ action: "set_sequence_record_browser", page: -1 },
{ action: "set_sequence_record_browser", query: "x".repeat(501) },
{ action: "set_sequence_annotation_index" },
{ action: "set_sequence_annotation_index", page: 0.5 },
{ action: "select_alignment_rows", rows: [""] },
{
action: "select_alignment_rows",
rows: Array.from({ length: 501 }, (_, index) => `row-${index}`),
},
{
action: "set_alignment_view_options",
enabledMetricTracks: ["unsupported"],
},
{ action: "set_alignment_view_options", rowSortDirection: "reverse" },
])("rejects invalid or unbounded new $action options", (command) => {
expect(
sequenceViewerControlInputSchema.safeParse({ ...command, sessionId })
.success,
).toBe(false);
});
});
SHA-256: 130d19f980c50f6fd55ce51e2bca0e316c12aeb431facd7916ff66311545d7f4