biolic 0.1.0

A modular bioinformatics toolkit in Rust for long-read sequence processing
Documentation
//! Integration tests for the biolic CLI.
//!
//! These run the compiled binary against `tests/data/small.fastq` (5 reads,
//! 206 total bases). Note: `assert_cmd` pipes stdout, so the default output
//! format is TSV (not human-readable), per biolic's TTY-detection convention.

use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;

const FASTQ: &str = "tests/data/small.fastq";
const FASTQ_GZ: &str = "tests/data/small.fastq.gz";
const FASTA: &str = "tests/data/small.fasta";

#[test]
fn stats_default_output_is_tsv_when_piped() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", FASTQ])
        .assert()
        .success()
        .stdout(predicate::str::starts_with("file\t"))
        .stdout(predicate::str::contains("n50"));
}

#[test]
fn stats_json_reports_five_reads() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", FASTQ, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"read_count\": 5"))
        .stdout(predicate::str::contains("\"total_bases\": 206"))
        .stdout(predicate::str::contains("\"n50\""));
}

#[test]
fn count_json_reports_five_reads() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["count", FASTQ, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"reads\": 5"))
        .stdout(predicate::str::contains("\"bases\": 206"));
}

#[test]
fn stats_reads_gzip_input() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", FASTQ_GZ, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"read_count\": 5"))
        .stdout(predicate::str::contains("\"total_bases\": 206"));
}

#[test]
fn stats_reads_from_stdin() {
    let data = fs::read(FASTQ).unwrap();
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", "-", "--json"])
        .write_stdin(data)
        .assert()
        .success()
        .stdout(predicate::str::contains("\"read_count\": 5"));
}

#[test]
fn stats_reads_gzip_from_stdin() {
    let data = fs::read(FASTQ_GZ).unwrap();
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", "-", "--json"])
        .write_stdin(data)
        .assert()
        .success()
        .stdout(predicate::str::contains("\"read_count\": 5"));
}

#[test]
fn stats_reads_fasta() {
    // FASTA: 3 sequences, 12 + 16 + 12 = 40 bases, no quality.
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["stats", FASTA, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"read_count\": 3"))
        .stdout(predicate::str::contains("\"total_bases\": 40"));
}

#[test]
fn count_reads_fasta() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["count", FASTA, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"reads\": 3"))
        .stdout(predicate::str::contains("\"bases\": 40"));
}

#[test]
fn help_works() {
    Command::cargo_bin("biolic")
        .unwrap()
        .arg("--help")
        .assert()
        .success()
        .stdout(predicate::str::contains("biolic"));
}

#[test]
fn unimplemented_module_errors_cleanly() {
    Command::cargo_bin("biolic")
        .unwrap()
        .args(["filter", FASTQ])
        .assert()
        .failure();
}