← Files Biological Sequence & Alignment ViewerARCHIVED FILE

src/viewer-query.test.ts

27.9 KB · Sep 30, 2026 · 23:01 UTC

↓ Download file

import { describe, expect, it } from "vitest";

import { computeMsaDerivedAnalysis } from "./msa/analysis";
import { parseMsa } from "./msa/parser";
import { buildGuideTree } from "./msa/phylogenetic-tree";
import { parseSequenceDocument } from "./sequence/parser";
import { parseSequenceTrack } from "./sequence/tracks";
import { DEFAULT_READ_PILEUP_STATE } from "./sequence/read-pileup";
import { insertSequence } from "./sequence/editing";
import {
  createSequenceWorkbenchState,
  sequenceWorkbenchReducer,
} from "./workbench-state";
import { SEQUENCE_VIEWER_LIMITS } from "./runtime-contract";
import { queryAlignmentViewer, querySequenceViewer } from "./viewer-query";

describe("paged viewer query contract", () => {
  it("pages records and keeps cursors target-specific", () => {
    const document = parseSequenceDocument({
      contents: ">a\nAAAA\n>b\nCCCC\n>c\nGGGG\n",
      fileName: "records.fasta",
    });
    const first = querySequenceViewer({
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      request: { limit: 2, target: "records" },
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [],
    });
    expect(first).toMatchObject({
      nextCursor: "q1.records.2",
      page: { count: 2, offset: 0, totalCount: 3 },
      truncated: true,
    });
    expect(() =>
      querySequenceViewer({
        artifacts: [],
        document,
        hits: [],
        jobs: [],
        request: {
          cursor: first.nextCursor ?? undefined,
          limit: 2,
          target: "features",
        },
        selectedRecordId: document.records[0]?.id ?? "",
        tracks: [],
      }),
    ).toThrow("invalid for this target");
  });

  it("returns exact coordinate semantics with sequence and quality windows", () => {
    const document = parseSequenceDocument({
      contents: "@read\nACGT\n+\nIIII\n",
      fileName: "read.fastq",
    });
    const selectedRecordId = document.records[0]?.id ?? "";
    const sequence = querySequenceViewer({
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      request: { end: 3, start: 2, target: "sequence-range" },
      selectedRecordId,
      tracks: [],
    });
    const quality = querySequenceViewer({
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      request: { end: 4, start: 1, target: "quality" },
      selectedRecordId,
      tracks: [],
    });
    expect(sequence).toMatchObject({
      coordinateSystem: { basis: 1, end: "inclusive", space: "sequence" },
      result: { sequence: "CG", start: 2, end: 3 },
    });
    expect(quality.result).toMatchObject({ min: 40, max: 40, mean: 40 });
  });

  it("returns the mounted FASTQ aggregate as one bounded live metrics page", () => {
    const document = parseSequenceDocument({
      contents: "@read-1\nACGT\n+\nIIII\n@read-2\nGC\n+\nI!\n",
      fileName: "reads.fastq",
    });
    const result = querySequenceViewer({
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      request: { limit: 100, target: "metrics" },
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [],
    });

    expect(result).toMatchObject({
      items: [
        {
          gcPercent: (2 / 3) * 100,
          q30Percent: (5 / 6) * 100,
          qualityEncoding: "phred+33-assumed",
          readCount: 2,
          readLengthMax: 4,
          readLengthMin: 2,
          totalBases: 6,
          type: "fastq-summary",
        },
      ],
      nextCursor: null,
      page: { count: 1, offset: 0, totalCount: 1 },
      target: "metrics",
      truncated: false,
    });
  });

  it("filters feature pages by identifiers, locations, and qualifier values", () => {
    const document = parseSequenceDocument({
      contents: `LOCUS       TEST                     12 bp    DNA     linear
FEATURES             Location/Qualifiers
     source          1..12
     CDS             complement(1..9)
                     /gene="cI"
                     /protein_id="NP_040628.1"
     regulatory      10..12
                     /note="operator-r1"
ORIGIN
        1 atgcatgcat gc
//
`,
      fileName: "features.gb",
    });
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [],
    };

    expect(
      querySequenceViewer({
        ...shared,
        request: {
          limit: 10,
          query: "NP_040628.1",
          target: "features",
        },
      }),
    ).toMatchObject({
      items: [expect.objectContaining({ sourceLocation: "complement(1..9)" })],
      page: { count: 1, totalCount: 1 },
    });
    expect(
      querySequenceViewer({
        ...shared,
        request: { limit: 10, query: "operator-r1", target: "features" },
      }),
    ).toMatchObject({
      items: [expect.objectContaining({ start: 10, end: 12 })],
      page: { count: 1, totalCount: 1 },
    });
  });

  it("shrinks large feature pages beneath the installed-host completion envelope", () => {
    const featureCount = 50;
    const features = Array.from(
      { length: featureCount },
      (_, index) => `     misc_feature    ${index + 1}..${index + 1}
                     /gene="cI"
                     /note="feature-${index}-${"x".repeat(6_000)}"`,
    ).join("\n");
    const document = parseSequenceDocument({
      contents: `LOCUS       LARGE                    100 bp    DNA     linear
FEATURES             Location/Qualifiers
     source          1..100
${features}
ORIGIN
        1 ${"a".repeat(100)}
//
`,
      fileName: "large-features.gb",
    });
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [],
    };
    const first = querySequenceViewer({
      ...shared,
      request: { limit: featureCount, query: "cI", target: "features" },
    });

    expect(first.page?.count).toBeGreaterThan(0);
    expect(first.page?.count).toBeLessThan(featureCount);
    expect(first.nextCursor).toBe(`q1.features.${first.page?.count}`);
    expect(first).toMatchObject({
      page: { totalCount: featureCount },
      truncated: true,
    });
    const completionRequest = {
      arguments: {
        applied: true,
        commandId: "11111111-1111-4111-8111-111111111111",
        message: "Returned features from the live Sequence viewer.",
        sessionId: "22222222-2222-4222-8222-222222222222",
        state: { query: first },
      },
      name: "sequence.complete_viewer_command",
    };
    const completionRequestBytes = new TextEncoder().encode(
      JSON.stringify({
        id: "sequence-viewer-completion",
        jsonrpc: "2.0",
        method: "tools/call",
        params: completionRequest,
      }),
    ).byteLength;
    expect(completionRequestBytes).toBeLessThanOrEqual(
      SEQUENCE_VIEWER_LIMITS.persistence.proxyEnvelopeBytes,
    );
    expect(
      new TextEncoder().encode(
        JSON.stringify(completionRequest.arguments.state),
      ).byteLength,
    ).toBeLessThanOrEqual(
      SEQUENCE_VIEWER_LIMITS.command.maxCompletionStateBytes,
    );

    const second = querySequenceViewer({
      ...shared,
      request: {
        cursor: first.nextCursor ?? undefined,
        limit: featureCount,
        query: "cI",
        target: "features",
      },
    });
    expect((first.page?.count ?? 0) + (second.page?.count ?? 0)).toBe(
      featureCount,
    );
    expect(second.nextCursor).toBeNull();
    const returnedIds = [...(first.items ?? []), ...(second.items ?? [])].map(
      (item) => (item as { id: string }).id,
    );
    const expectedIds = document.records[0]?.features
      .filter((feature) => feature.qualifiers.gene === "cI")
      .map(({ id }) => id);
    expect(returnedIds).toEqual(expectedIds);
    expect(new Set(returnedIds).size).toBe(featureCount);
  });

  it("rejects a single feature that cannot fit without returning a stuck cursor", () => {
    const document = parseSequenceDocument({
      contents: `LOCUS       OVERSIZED                  10 bp    DNA     linear
FEATURES             Location/Qualifiers
     source          1..10
     misc_feature    1..10
                     /gene="cI"
                     /note="${"x".repeat(250 * 1_024)}"
ORIGIN
        1 aaaaaaaaaa
//
`,
      fileName: "oversized-feature.gb",
    });

    expect(() =>
      querySequenceViewer({
        artifacts: [],
        document,
        hits: [],
        jobs: [],
        request: { limit: 1, query: "cI", target: "features" },
        selectedRecordId: document.records[0]?.id ?? "",
        tracks: [],
      }),
    ).toThrow("Narrow the query or coordinate window");
  });

  it("queries variants, coverage, and reads beyond model-context truncation", () => {
    const document = parseSequenceDocument({
      contents: ">chr1\nACGTACGTACGT\n",
      fileName: "chr1.fasta",
    });
    const tracks = [
      parseSequenceTrack({
        content: "chr1\t3\tv1\tG\tA\t50\tPASS\tDP=2\n",
        displayName: "variants.vcf",
        format: "vcf",
        id: "variants",
        requestedReference: "chr1",
      }),
      parseSequenceTrack({
        content: "r1\t0\tchr1\t2\t60\t4M\t*\t0\t0\tCGTA\tIIII\n",
        displayName: "reads.sam",
        format: "sam",
        id: "reads",
        requestedReference: "chr1",
        sourceItemCount: 20,
        sourceTruncated: true,
      }),
    ];
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks,
    };
    expect(
      querySequenceViewer({
        ...shared,
        request: {
          end: 8,
          limit: 100,
          reference: "chr1",
          start: 1,
          target: "variants",
        },
      }).items,
    ).toHaveLength(1);
    const coverageQuery = querySequenceViewer({
      ...shared,
      request: {
        end: 8,
        limit: 100,
        reference: "chr1",
        start: 1,
        target: "coverage",
      },
    });
    expect(coverageQuery.items).toEqual(
      expect.arrayContaining([
        expect.objectContaining({ coordinate: 3, depth: 1 }),
      ]),
    );
    expect(coverageQuery.result).toMatchObject({
      coverageComplete: false,
      coverageOmittedReadCount: 0,
      coverageReadCount: 1,
      coverageScope: "filtered-loaded-reads-before-display-sampling",
      sourceTruncated: true,
      sourceReadCount: 20,
    });
    expect(
      querySequenceViewer({
        ...shared,
        request: {
          end: 8,
          limit: 100,
          reference: "chr1",
          start: 1,
          target: "reads",
        },
      }).result,
    ).toMatchObject({
      downsampled: true,
      sourceReadCount: 20,
      sourceTruncated: true,
      totalReadCount: 1,
    });
  });

  it("exposes canonical read options, stable source identity, filtered coverage and paged base events to agents", () => {
    const document = parseSequenceDocument({
      contents: ">ref\nACGT\n",
      fileName: "reference.fasta",
    });
    const track = parseSequenceTrack({
      content: [
        "same-name\t0\tref\t1\t60\t4M\t*\t0\t0\tACGT\tIIII",
        "same-name\t16\tref\t1\t255\t4M\t*\t0\t0\tATGT\t*",
      ].join("\n"),
      displayName: "reads.sam",
      format: "sam",
      id: "source",
      requestedReference: "ref",
    });
    const readPileupState = {
      options: {
        ...DEFAULT_READ_PILEUP_STATE.options,
        minimumMappingQuality: 30,
        includeUnknownMappingQuality: false,
        showSoftClips: false,
      },
      selectedRead: { sourceReadIndex: 0, trackId: "source" },
    };
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      readPileupRange: { start: 1, end: 4 },
      readPileupState,
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [track],
    };
    expect(
      querySequenceViewer({
        ...shared,
        request: { target: "read-pileup-state" },
      }).result,
    ).toMatchObject({ ...readPileupState, range: { start: 1, end: 4 } });
    const reads = querySequenceViewer({
      ...shared,
      request: {
        target: "reads",
        start: 1,
        end: 4,
        reference: "ref",
        limit: 100,
      },
    });
    expect(reads.items).toEqual([
      expect.objectContaining({ sourceReadIndex: 0, trackId: "source" }),
    ]);
    expect(reads.result).toMatchObject({
      totalReadCount: 2,
      filteredReadCount: 1,
    });
    const coverage = querySequenceViewer({
      ...shared,
      request: {
        target: "coverage",
        start: 1,
        end: 4,
        reference: "ref",
        limit: 100,
      },
    });
    expect(coverage.items).toEqual(
      [1, 2, 3, 4].map((coordinate) => ({ coordinate, depth: 1 })),
    );
    const first = querySequenceViewer({
      ...shared,
      request: {
        target: "read-detail",
        trackId: "source",
        sourceReadIndex: 1,
        limit: 2,
      },
    });
    expect(first).toMatchObject({
      nextCursor: "q1.read-detail.2",
      page: { count: 2, offset: 0, totalCount: 5 },
      result: {
        mappingQuality: null,
        mappingQualityRaw: 255,
        inDisplayedSample: false,
        sourceReadIndex: 1,
        trackId: "source",
        strand: "-",
        referenceRecordId: document.records[0]?.id,
      },
    });
    const next = querySequenceViewer({
      ...shared,
      request: {
        target: "read-detail",
        trackId: "source",
        sourceReadIndex: 1,
        limit: 500,
        cursor: first.nextCursor ?? undefined,
      },
    });
    expect(next.items).toEqual(
      expect.arrayContaining([
        expect.objectContaining({
          type: "base-call",
          base: "T",
          referenceBase: "C",
          comparison: "mismatch",
          coordinate: 2,
          quality: null,
        }),
      ]),
    );
    expect(next.nextCursor).toBeNull();
    expect(() =>
      querySequenceViewer({
        ...shared,
        request: {
          target: "read-detail",
          trackId: "source",
          sourceReadIndex: 2,
          limit: 100,
        },
      }),
    ).toThrow(/not present/);
  });

  it("bounds read-detail sequence previews and discloses omitted base calls for wide windows", () => {
    const document = parseSequenceDocument({
      contents: `>ref\n${"A".repeat(1_000)}\n`,
      fileName: "reference.fasta",
    });
    const track = parseSequenceTrack({
      content: `long\t0\tref\t1\t60\t1000M\t*\t0\t0\t${"A".repeat(1_000)}\t*`,
      displayName: "long.sam",
      format: "sam",
      id: "long",
      requestedReference: "ref",
    });
    const result = querySequenceViewer({
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [track],
      request: {
        target: "read-detail",
        trackId: "long",
        sourceReadIndex: 0,
        start: 1,
        end: 1_000,
        limit: 500,
      },
    });
    expect(result.items).toEqual([
      {
        type: "alignment-block",
        operation: "M",
        coordinate: 1,
        start: 1,
        end: 1_000,
      },
    ]);
    expect(result.result).toMatchObject({
      baseCallsOmitted: true,
      sequenceTruncated: true,
      sequence: "A".repeat(500),
      sequenceLength: 1_000,
      windowPartial: false,
    });
  });

  it("retains original read metadata but blocks all mapped evidence on edited copies until undo", () => {
    const original = parseSequenceDocument({
      contents: ">ref\nACGT\n",
      fileName: "ref.fasta",
    });
    const recordId = original.records[0]?.id ?? "";
    const track = parseSequenceTrack({
      content: "r1\t0\tref\t1\t60\t4M\t*\t0\t0\tACGT\tIIII",
      displayName: "reads.sam",
      format: "sam",
      id: "reads",
      requestedReference: "ref",
    });
    let state = sequenceWorkbenchReducer(
      createSequenceWorkbenchState(original),
      { type: "add-track", track },
    );
    const edit = insertSequence(state.document, recordId, 1, "T");
    state = sequenceWorkbenchReducer(state, {
      type: "apply-sequence-document",
      document: edit.document,
      description: edit.change.description,
    });
    const shared = {
      artifacts: [],
      document: state.document,
      hits: [],
      jobs: [],
      selectedRecordId: recordId,
      tracks: state.tracks,
    };
    for (const target of ["reads", "coverage", "variants"] as const) {
      expect(
        querySequenceViewer({
          ...shared,
          request: { target, reference: "ref", start: 1, end: 4, limit: 100 },
        }),
      ).toMatchObject({
        items: [],
        result: {
          available: false,
          coverageComplete: false,
          originalSourceTracksRetained: true,
          unavailableReason: expect.stringMatching(
            /reference sequence was edited/,
          ),
        },
      });
    }
    const detail = querySequenceViewer({
      ...shared,
      request: {
        target: "read-detail",
        trackId: "reads",
        sourceReadIndex: 0,
        limit: 100,
      },
    });
    expect(detail).toMatchObject({
      items: [],
      result: {
        position: 1,
        end: 4,
        sequence: "ACGT",
        evidenceCoordinatesStale: true,
        originalSourceCoordinatesRetained: true,
        projectionUnavailableReason: expect.stringMatching(
          /reference sequence was edited/,
        ),
      },
    });
    expect(
      querySequenceViewer({
        ...shared,
        request: { target: "read-pileup-state" },
      }).result,
    ).toMatchObject({
      evidenceCoordinatesStale: true,
      unavailableReason: expect.any(String),
    });
    state = sequenceWorkbenchReducer(state, { type: "undo-sequence-document" });
    const restored = querySequenceViewer({
      ...shared,
      document: state.document,
      request: {
        target: "read-detail",
        trackId: "reads",
        sourceReadIndex: 0,
        limit: 100,
      },
    });
    expect(restored.result?.projectionUnavailableReason).toBeNull();
    expect(restored.items).toHaveLength(5);
    expect(state.tracks[0]?.reads?.[0]).toMatchObject({
      position: 1,
      cigar: "4M",
      sequence: "ACGT",
    });
  });

  it("reports sample visibility from the selected reference and mounted range, not the detail request", () => {
    const document = parseSequenceDocument({
      contents: ">chr1\nAAAAAAAA\n>1\nTTTTTTTT\n",
      fileName: "references.fasta",
    });
    const track = parseSequenceTrack({
      content:
        "a\t0\tchr1\t1\t60\t4M\t*\t0\t0\tAAAA\tIIII\nb\t0\t1\t1\t60\t4M\t*\t0\t0\tTTTT\tIIII",
      displayName: "reads.sam",
      format: "sam",
      id: "reads",
      requestedReference: "chr1",
    });
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [track],
    };
    const hidden = querySequenceViewer({
      ...shared,
      readPileupRange: { start: 1, end: 4 },
      request: {
        target: "read-detail",
        trackId: "reads",
        sourceReadIndex: 1,
        start: 1,
        end: 4,
        limit: 100,
      },
    });
    expect(hidden.result).toMatchObject({
      inDisplayedSample: false,
      projectionUnavailableReason: null,
    });
    const outside = querySequenceViewer({
      ...shared,
      readPileupRange: { start: 5, end: 8 },
      request: {
        target: "read-detail",
        trackId: "reads",
        sourceReadIndex: 0,
        start: 1,
        end: 4,
        limit: 100,
      },
    });
    expect(outside.result?.inDisplayedSample).toBe(false);
    const unknown = querySequenceViewer({
      ...shared,
      request: {
        target: "read-detail",
        trackId: "reads",
        sourceReadIndex: 0,
        limit: 100,
      },
    });
    expect(unknown.result?.inDisplayedSample).toBeNull();
  });

  it("never returns 100 private VCF sample names or genotypes from Sequence queries", () => {
    const document = parseSequenceDocument({
      contents: ">1\nACGTACGTACGT\n",
      fileName: "public-chromosome-1.fasta",
    });
    const track = privateHundredSampleVcfTrack();
    const shared = {
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      selectedRecordId: document.records[0]?.id ?? "",
      tracks: [track],
    };
    const first = querySequenceViewer({
      ...shared,
      request: {
        end: 10,
        limit: 1,
        reference: "1",
        start: 1,
        target: "variants",
      },
    });

    expect(first).toMatchObject({
      items: [
        {
          alternateAlleles: ["G"],
          filters: [],
          id: "rs-public-1",
          infoCount: 1,
          position: 5,
          quality: 60,
          reference: "1",
          referenceAllele: "A",
          sampleCount: 100,
        },
      ],
      nextCursor: "q1.variants.1",
      page: { count: 1, totalCount: 2 },
    });
    assertNoPrivateVcfData(first);

    const second = querySequenceViewer({
      ...shared,
      request: {
        cursor: first.nextCursor ?? undefined,
        end: 10,
        limit: 1,
        reference: "1",
        start: 1,
        target: "variants",
      },
    });
    expect(second).toMatchObject({
      items: [{ position: 6, sampleCount: 100 }],
      nextCursor: null,
    });
    assertNoPrivateVcfData(second);

    const summary = querySequenceViewer({
      ...shared,
      request: { limit: 10, target: "tracks" },
    });
    expect(summary.items).toEqual([
      expect.objectContaining({
        format: "vcf",
        id: "public-100-sample-vcf",
        variantCount: 2,
      }),
    ]);
    assertNoPrivateVcfData(summary);
    expect(track.vcfHeader?.sampleNames).toHaveLength(100);
    expect(track.variants?.[0]?.sampleValues).toHaveLength(100);
  });

  it("never returns 100 private VCF sample names or genotypes from Alignment queries", () => {
    const document = alignmentDocument(">1\nAACCGGTTAACC\n>2\nAATCGGTTAACC\n");
    const track = privateHundredSampleVcfTrack();
    const shared = {
      analysis: null,
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      tracks: [track],
      tree: null,
    };

    const variants = queryAlignmentViewer({
      ...shared,
      request: {
        end: 10,
        limit: 10,
        reference: "1",
        start: 1,
        target: "variants",
      },
    });
    expect(variants.items).toEqual([
      expect.objectContaining({
        infoCount: 1,
        position: 5,
        sampleCount: 100,
      }),
      expect.objectContaining({ position: 6, sampleCount: 100 }),
    ]);
    assertNoPrivateVcfData(variants);

    const summary = queryAlignmentViewer({
      ...shared,
      request: { limit: 10, target: "tracks" },
    });
    expect(summary.items).toEqual([
      expect.objectContaining({
        id: "public-100-sample-vcf",
        variantCount: 2,
      }),
    ]);
    assertNoPrivateVcfData(summary);
    expect(track.variants?.[1]?.sampleValues).toHaveLength(100);
  });

  it("pages alignment rows and returns bounded column metrics and tree nodes", () => {
    const document = alignmentDocument(">a\nAAAA\n>b\nAAAT\n>c\nTTTT\n");
    const analysis = computeMsaDerivedAnalysis({
      analysisId: "analysis",
      analysisRowIds: document.rows.map(({ id }) => id),
      document,
    });
    const tree = buildGuideTree(document.rows);
    const shared = {
      analysis,
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      tracks: [],
      tree,
    };
    expect(
      queryAlignmentViewer({
        ...shared,
        request: { limit: 2, target: "rows" },
      }),
    ).toMatchObject({ page: { count: 2, totalCount: 3 }, truncated: true });
    expect(
      queryAlignmentViewer({
        ...shared,
        request: { end: 2, start: 1, target: "columns" },
      }).items,
    ).toEqual([
      expect.objectContaining({ column: 1, consensus: expect.any(String) }),
      expect.objectContaining({ column: 2, identity: expect.any(Number) }),
    ]);
    expect(
      queryAlignmentViewer({
        ...shared,
        request: { limit: 2, target: "metrics" },
      }).items,
    ).toEqual([
      expect.objectContaining({
        column: 1,
        consensus: expect.any(String),
        conservation: expect.any(Number),
        gapFraction: expect.any(Number),
        identity: expect.any(Number),
      }),
      expect.objectContaining({
        column: 2,
        consensus: expect.any(String),
        conservation: expect.any(Number),
        gapFraction: expect.any(Number),
        identity: expect.any(Number),
      }),
    ]);
    expect(
      queryAlignmentViewer({
        ...shared,
        request: { limit: 100, target: "tree-nodes" },
      }).items?.length,
    ).toBeGreaterThan(document.rows.length);
  });

  it("returns bounded track summaries from alignment mode", () => {
    const document = alignmentDocument(">a\nAAAA\n>b\nAAAT\n");
    const track = parseSequenceTrack({
      content: "r1\t0\ta\t1\t60\t4M\t*\t0\t0\tAAAA\tIIII\n",
      displayName: "reads.sam",
      format: "sam",
      id: "reads",
    });
    const result = queryAlignmentViewer({
      analysis: null,
      artifacts: [],
      document,
      hits: [],
      jobs: [],
      request: { limit: 100, target: "tracks" },
      tracks: [track],
      tree: null,
    });

    expect(result.items).toEqual([
      expect.objectContaining({
        id: "reads",
        readCount: 1,
      }),
    ]);
    expect(result.items?.[0]).not.toHaveProperty("reads");
  });

  it("rejects oversized coordinate windows rather than returning partial unlabeled data", () => {
    const document = parseSequenceDocument({
      contents: `>long\n${"A".repeat(100_001)}\n`,
      fileName: "long.fasta",
    });
    expect(() =>
      querySequenceViewer({
        artifacts: [],
        document,
        hits: [],
        jobs: [],
        request: { end: 100_001, start: 1, target: "sequence-range" },
        selectedRecordId: document.records[0]?.id ?? "",
        tracks: [],
      }),
    ).toThrow("100,000 residues");
  });
});

function alignmentDocument(contents: string) {
  const result = parseMsa(contents, "demo.aln-fasta");
  if (result.status !== "success") throw new Error(result.message);
  return result.document;
}

function privateHundredSampleVcfTrack() {
  const sampleNames = Array.from(
    { length: 100 },
    (_, index) => `QA_PRIVATE_SAMPLE_${index + 1}`,
  );
  const sampleValues = sampleNames.map(
    (_, index) => `0/1:PRIVATE_GENOTYPE_${index + 1}`,
  );
  return Object.assign(
    parseSequenceTrack({
      content: [
        "##fileformat=VCFv4.3",
        "##SAMPLE=<ID=QA_PRIVATE_SAMPLE_1,Description=PRIVATE_HEADER_METADATA>",
        [
          "#CHROM",
          "POS",
          "ID",
          "REF",
          "ALT",
          "QUAL",
          "FILTER",
          "INFO",
          "FORMAT",
          ...sampleNames,
        ].join("\t"),
        [
          "1",
          "5",
          "rs-public-1",
          "A",
          "G",
          "60",
          ".",
          "PRIVATE_INFO_KEY=PRIVATE_INFO_VALUE",
          "GT:PRIVATE_FORMAT",
          ...sampleValues,
        ].join("\t"),
        [
          "1",
          "6",
          "rs-public-2",
          "C",
          "T",
          ".",
          "PASS",
          "PRIVATE_INFO_KEY=PRIVATE_INFO_VALUE",
          "GT:PRIVATE_FORMAT",
          ...sampleValues,
        ].join("\t"),
      ].join("\n"),
      displayName: "official-100-sample-conformance.vcf",
      format: "vcf",
      id: "public-100-sample-vcf",
      requestedReference: "1",
    }),
    { futurePrivateSamplePayload: "PRIVATE_FUTURE_METADATA" },
  );
}

function assertNoPrivateVcfData(result: unknown): void {
  const serialized = JSON.stringify(result);
  expect(serialized).not.toContain("QA_PRIVATE_SAMPLE_");
  expect(serialized).not.toContain("PRIVATE_GENOTYPE_");
  expect(serialized).not.toContain("PRIVATE_HEADER_METADATA");
  expect(serialized).not.toContain("PRIVATE_INFO_KEY");
  expect(serialized).not.toContain("PRIVATE_INFO_VALUE");
  expect(serialized).not.toContain("PRIVATE_FORMAT");
  expect(serialized).not.toContain("PRIVATE_FUTURE_METADATA");
  expect(serialized).not.toContain("vcfHeader");
  expect(serialized).not.toContain("sampleValues");
}

SHA-256: 99a5b88c29228c62120d71a522969e3bdbd38ee03a628c864d818be6830a242c