sqlarfs-cli 0.1.1

A CLI tool for working with sqlar archives
Documentation
mod common;

use common::command;
use sqlarfs::Connection;
use xpct::{be_err, be_ok, consist_of, expect};

#[test]
fn errors_when_archive_does_not_exist() -> eyre::Result<()> {
    expect!(command(&["list", "--archive", "nonexistent.sqlar"])).to(be_err());

    Ok(())
}

#[test]
fn listing_descendants_with_no_path_specified() -> eyre::Result<()> {
    let temp_dir = tempfile::tempdir()?;
    let archive_path = temp_dir.path().join("test.sqlar");

    let mut conn = Connection::create_new(&archive_path)?;

    conn.exec(|archive| {
        archive.open("file1")?.create_file()?;
        archive.open("dir")?.create_dir()?;
        archive.open("dir/file2")?.create_file()?;

        sqlarfs::Result::Ok(())
    })?;

    expect!(command(&[
        "list",
        "--archive",
        &archive_path.to_string_lossy(),
        "--tree",
    ]))
    .to(be_ok())
    .map(|output| output.split('\n').map(String::from).collect::<Vec<_>>())
    .to(consist_of([
        String::from("file1"),
        String::from("dir"),
        String::from("dir/file2"),
    ]));

    Ok(())
}

#[test]
fn listing_descendants_of_path() -> eyre::Result<()> {
    let temp_dir = tempfile::tempdir()?;
    let archive_path = temp_dir.path().join("test.sqlar");

    let mut conn = Connection::create_new(&archive_path)?;

    conn.exec(|archive| {
        archive.open("file1")?.create_file()?;
        archive.open("dir1")?.create_dir()?;
        archive.open("dir1/file2")?.create_file()?;
        archive.open("dir1/dir2")?.create_dir()?;
        archive.open("dir1/dir2/file3")?.create_file()?;

        sqlarfs::Result::Ok(())
    })?;

    expect!(command(&[
        "list",
        "--archive",
        &archive_path.to_string_lossy(),
        "--tree",
        "dir1",
    ]))
    .to(be_ok())
    .map(|output| output.split('\n').map(String::from).collect::<Vec<_>>())
    .to(consist_of([
        String::from("dir1/file2"),
        String::from("dir1/dir2"),
        String::from("dir1/dir2/file3"),
    ]));

    Ok(())
}

#[test]
fn listing_immediate_children_with_no_path_specified() -> eyre::Result<()> {
    let temp_dir = tempfile::tempdir()?;
    let archive_path = temp_dir.path().join("test.sqlar");

    let mut conn = Connection::create_new(&archive_path)?;

    conn.exec(|archive| {
        archive.open("file1")?.create_file()?;
        archive.open("dir")?.create_dir()?;
        archive.open("dir/file2")?.create_file()?;

        sqlarfs::Result::Ok(())
    })?;

    expect!(command(&[
        "list",
        "--archive",
        &archive_path.to_string_lossy(),
        "--children",
    ]))
    .to(be_ok())
    .map(|output| output.split('\n').map(String::from).collect::<Vec<_>>())
    .to(consist_of([String::from("file1"), String::from("dir")]));

    Ok(())
}

#[test]
fn listing_immediate_children_of_path() -> eyre::Result<()> {
    let temp_dir = tempfile::tempdir()?;
    let archive_path = temp_dir.path().join("test.sqlar");

    let mut conn = Connection::create_new(&archive_path)?;

    conn.exec(|archive| {
        archive.open("file1")?.create_file()?;
        archive.open("dir1")?.create_dir()?;
        archive.open("dir1/file2")?.create_file()?;
        archive.open("dir1/dir2")?.create_dir()?;
        archive.open("dir1/dir2/file3")?.create_file()?;

        sqlarfs::Result::Ok(())
    })?;

    expect!(command(&[
        "list",
        "--archive",
        &archive_path.to_string_lossy(),
        "--children",
        "dir1",
    ]))
    .to(be_ok())
    .map(|output| output.split('\n').map(String::from).collect::<Vec<_>>())
    .to(consist_of([
        String::from("dir1/file2"),
        String::from("dir1/dir2"),
    ]));

    Ok(())
}

#[test]
fn listing_files_by_type() -> eyre::Result<()> {
    let temp_dir = tempfile::tempdir()?;
    let archive_path = temp_dir.path().join("test.sqlar");

    let mut conn = Connection::create_new(&archive_path)?;

    conn.exec(|archive| {
        archive.open("file1")?.create_file()?;
        archive.open("dir")?.create_dir()?;
        archive.open("dir/file2")?.create_file()?;

        sqlarfs::Result::Ok(())
    })?;

    expect!(command(&[
        "list",
        "--archive",
        &archive_path.to_string_lossy(),
        "--type",
        "file",
    ]))
    .to(be_ok())
    .map(|output| output.split('\n').map(String::from).collect::<Vec<_>>())
    .to(consist_of([
        String::from("file1"),
        String::from("dir/file2"),
    ]));

    Ok(())
}