← Files Biological Sequence & Alignment ViewerARCHIVED FILE

src/sequence/exports.test.ts

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

↓ Download file

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

import {
  buildFastaExport,
  buildFastqExport,
  buildSelectedSequenceExport,
  getSequenceExportFileName,
} from "./exports";
import type { SequenceDocument, SequenceRecord } from "./types";

const RECORD: SequenceRecord = {
  features: [],
  id: "demo",
  length: 8,
  metadata: {},
  molecule: "dna",
  quality: { ascii: "IIIIIIII", phred: Array(8).fill(40) },
  sequence: "ACGTACGT",
  sourceLabel: "demo",
  topology: "linear",
};

const DOCUMENT: SequenceDocument = {
  classification: {
    alignment: null,
    confidence: "high",
    evidence: [],
    kind: "single-sequence",
    molecule: "dna",
    suggestedViewer: "sequence",
  },
  format: "fasta",
  kind: "single-sequence",
  records: [RECORD],
  warnings: [],
};

describe("sequence exports", () => {
  it("builds FASTA, selected-range FASTA, and FASTQ payloads", () => {
    expect(buildFastaExport([RECORD])).toBe(">demo\nACGTACGT");
    expect(
      buildSelectedSequenceExport({
        document: DOCUMENT,
        selection: { end: 4, recordId: "demo", start: 2 },
      }),
    ).toBe(">demo:2-4\nCGT");
    expect(buildFastqExport(RECORD)).toBe("@demo\nACGTACGT\n+\nIIIIIIII");
  });

  it("creates safe export file names for records and selected ranges", () => {
    expect(getSequenceExportFileName({ record: RECORD, suffix: "fasta" })).toBe(
      "demo.fasta",
    );
    expect(
      getSequenceExportFileName({
        record: RECORD,
        selection: { end: 4, recordId: RECORD.id, start: 2 },
        suffix: "fasta",
      }),
    ).toBe("demo-2-4.fasta");
  });
});

SHA-256: 02dc630511e1fd9e129f87865e3ec86ae43a6e911651d091961f774aa0114beb