mod common;
use clap::Parser;
use common::{command, root_path};
use sqlarfs_cli::{Archive, Cli, Commands};
use xpct::{be_err, be_ok, be_true, expect, match_pattern, pattern};
#[test]
fn errors_when_source_path_is_root() -> eyre::Result<()> {
let temp_dir = tempfile::tempdir()?;
let archive_path = temp_dir.path().join("test.sqlar");
expect!(command(&[
"archive",
"--archive",
&archive_path.to_string_lossy(),
&root_path().to_string_lossy(),
]))
.to(be_err());
Ok(())
}
#[test]
fn recursive_flag_can_be_overridden() -> eyre::Result<()> {
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_recursive: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--recursive",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_recursive: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-recursive",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_recursive: true,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--recursive",
"--no-recursive",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_recursive: true,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-recursive",
"--recursive",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_recursive: false,
..
}))));
Ok(())
}
#[test]
fn follow_flag_can_be_overridden() -> eyre::Result<()> {
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
follow: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--follow",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
follow: true,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-follow",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
follow: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--follow",
"--no-follow",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
follow: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-follow",
"--follow",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
follow: true,
..
}))));
Ok(())
}
#[test]
fn preserve_flag_can_be_overridden() -> eyre::Result<()> {
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_preserve: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--preserve",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_preserve: false,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-preserve",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_preserve: true,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--preserve",
"--no-preserve",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_preserve: true,
..
}))));
let cli = Cli::parse_from([
"sqlar",
"archive",
"--archive",
"nonexistent.sqlar",
"--no-preserve",
"--preserve",
"nonexistent",
]);
expect!(cli.command).to(match_pattern(pattern!(Commands::Archive(Archive {
no_preserve: false,
..
}))));
Ok(())
}
#[test]
fn archiving_errors_if_archive_does_not_exist() -> eyre::Result<()> {
let source_file = tempfile::NamedTempFile::new()?;
expect!(command(&[
"archive",
"--archive",
"nonexistent.sqlar",
&source_file.path().to_string_lossy(),
]))
.to(be_err());
Ok(())
}
#[test]
fn archiving_errors_if_source_does_not_exist() -> eyre::Result<()> {
let temp_dir = tempfile::tempdir()?;
let archive_path = temp_dir.path().join("test.sqlar");
sqlarfs::Connection::create_new(&archive_path)?;
expect!(command(&[
"archive",
"--archive",
&archive_path.to_string_lossy(),
"nonexistent",
]))
.to(be_err());
Ok(())
}
#[test]
fn archive_file_to_archive_root() -> eyre::Result<()> {
let temp_dir = tempfile::tempdir()?;
let archive_path = temp_dir.path().join("test.sqlar");
let source_file = tempfile::NamedTempFile::new()?;
sqlarfs::Connection::create_new(&archive_path)?;
expect!(command(&[
"archive",
"--archive",
&archive_path.to_string_lossy(),
&source_file.path().to_string_lossy(),
]))
.to(be_ok());
let mut conn = sqlarfs::Connection::open(&archive_path)?;
let file_exists = conn.exec(|archive| {
sqlarfs::Result::Ok(
archive
.open(source_file.path().file_name().unwrap())?
.metadata()?
.is_file(),
)
})?;
expect!(file_exists).to(be_true());
Ok(())
}
#[test]
fn archive_file_to_dest_in_archive_root() -> eyre::Result<()> {
let temp_dir = tempfile::tempdir()?;
let archive_path = temp_dir.path().join("test.sqlar");
let source_file = tempfile::NamedTempFile::new()?;
sqlarfs::Connection::create_new(&archive_path)?;
expect!(command(&[
"archive",
"--archive",
&archive_path.to_string_lossy(),
&source_file.path().to_string_lossy(),
"dest",
]))
.to(be_ok());
let mut conn = sqlarfs::Connection::open(&archive_path)?;
let file_exists =
conn.exec(|archive| sqlarfs::Result::Ok(archive.open("dest")?.metadata()?.is_file()))?;
expect!(file_exists).to(be_true());
Ok(())
}
#[test]
fn archiving_to_dest_creates_parent_directories() -> eyre::Result<()> {
let temp_dir = tempfile::tempdir()?;
let archive_path = temp_dir.path().join("test.sqlar");
let source_file = tempfile::NamedTempFile::new()?;
sqlarfs::Connection::create_new(&archive_path)?;
expect!(command(&[
"archive",
"--archive",
&archive_path.to_string_lossy(),
&source_file.path().to_string_lossy(),
"path/to/dest",
]))
.to(be_ok());
let mut conn = sqlarfs::Connection::open(&archive_path)?;
let file_exists = conn
.exec(|archive| sqlarfs::Result::Ok(archive.open("path/to/dest")?.metadata()?.is_file()))?;
expect!(file_exists).to(be_true());
Ok(())
}