140 lines
4.4 KiB
Rust
140 lines
4.4 KiB
Rust
//! Every `.improv` document this repository ships must load (improvise-odbc).
|
|
//! "Shipped" is "tracked", read off git's index: `context/test-evidence/tui.md`.
|
|
|
|
use std::path::{Path, PathBuf};
|
|
|
|
/// Every tracked `.improv` and `.improv.gz` under `root`. Outside a checkout this
|
|
/// panics rather than answering empty (improvise-c0aj).
|
|
fn shipped_documents(root: &Path) -> Vec<PathBuf> {
|
|
let out = std::process::Command::new("git")
|
|
.arg("-C")
|
|
.arg(root)
|
|
.args(["ls-files", "-z", "--", "*.improv", "*.improv.gz"])
|
|
.output()
|
|
.expect("git runs: this test reads the index, so it needs a checkout");
|
|
assert!(
|
|
out.status.success(),
|
|
"git ls-files failed in {}: {}",
|
|
root.display(),
|
|
String::from_utf8_lossy(&out.stderr)
|
|
);
|
|
let mut found: Vec<PathBuf> = String::from_utf8(out.stdout)
|
|
.expect("UTF-8 paths")
|
|
.split('\0')
|
|
.filter(|p| !p.is_empty())
|
|
.map(|p| root.join(p))
|
|
.collect();
|
|
found.sort();
|
|
found
|
|
}
|
|
|
|
#[test]
|
|
fn every_shipped_document_loads() {
|
|
let root = Path::new(env!("CARGO_MANIFEST_DIR"));
|
|
let documents = shipped_documents(root);
|
|
assert!(
|
|
!documents.is_empty(),
|
|
"precondition: the index must list at least one shipped document"
|
|
);
|
|
|
|
for path in documents {
|
|
let workbook = improvise::persistence::load(&path)
|
|
.unwrap_or_else(|e| panic!("{} does not load: {e}", path.display()));
|
|
assert!(
|
|
workbook.views.contains_key(&workbook.active_view),
|
|
"{} loads but its initial view {:?} is not one of {:?}",
|
|
path.display(),
|
|
workbook.active_view,
|
|
workbook.views.keys().collect::<Vec<_>>()
|
|
);
|
|
}
|
|
}
|
|
|
|
/// A scratch repository, so each way of shipping a document is set up for real.
|
|
fn scratch_repo() -> tempfile::TempDir {
|
|
let dir = tempfile::tempdir().expect("a temp dir");
|
|
run_git(dir.path(), &["init", "-q"]);
|
|
dir
|
|
}
|
|
|
|
fn run_git(root: &Path, args: &[&str]) {
|
|
let status = std::process::Command::new("git")
|
|
.arg("-C")
|
|
.arg(root)
|
|
.args(args)
|
|
.status()
|
|
.expect("git runs");
|
|
assert!(status.success(), "git {args:?} failed");
|
|
}
|
|
|
|
fn write(root: &Path, rel: &str, text: &str) {
|
|
let path = root.join(rel);
|
|
std::fs::create_dir_all(path.parent().expect("a parent")).expect("dirs");
|
|
std::fs::write(path, text).expect("writes");
|
|
}
|
|
|
|
fn walked(root: &Path, rel: &str) -> bool {
|
|
shipped_documents(root).contains(&root.join(rel))
|
|
}
|
|
|
|
/// improvise-c0aj: one test per way of shipping a document that reading the
|
|
/// root `.gitignore` missed. Evidence: `context/test-evidence/tui.md`.
|
|
#[test]
|
|
fn a_single_file_un_ignore_is_walked() {
|
|
let repo = scratch_repo();
|
|
let root = repo.path();
|
|
write(root, ".gitignore", "*.improv\n!web/demo.improv\n");
|
|
write(root, "web/demo.improv", "x");
|
|
run_git(root, &["add", ".gitignore", "web/demo.improv"]);
|
|
assert!(walked(root, "web/demo.improv"));
|
|
}
|
|
|
|
#[test]
|
|
fn a_gzipped_document_is_walked() {
|
|
let repo = scratch_repo();
|
|
let root = repo.path();
|
|
write(root, ".gitignore", "*.improv\n");
|
|
write(root, "docs/model.improv.gz", "x");
|
|
run_git(root, &["add", ".gitignore", "docs/model.improv.gz"]);
|
|
assert!(walked(root, "docs/model.improv.gz"));
|
|
}
|
|
|
|
#[test]
|
|
fn a_document_un_ignored_by_a_nested_gitignore_is_walked() {
|
|
let repo = scratch_repo();
|
|
let root = repo.path();
|
|
write(root, ".gitignore", "*.improv\n");
|
|
write(root, "harness/.gitignore", "!keep.improv\n");
|
|
write(root, "harness/keep.improv", "x");
|
|
run_git(
|
|
root,
|
|
&[
|
|
"add",
|
|
".gitignore",
|
|
"harness/.gitignore",
|
|
"harness/keep.improv",
|
|
],
|
|
);
|
|
assert!(walked(root, "harness/keep.improv"));
|
|
}
|
|
|
|
/// An empty walk would pass every per-document assertion vacuously, so a
|
|
/// directory git cannot read must stop the test instead.
|
|
#[test]
|
|
#[should_panic(expected = "git ls-files failed")]
|
|
fn a_directory_that_is_not_a_checkout_fails_loudly() {
|
|
let not_a_repo = tempfile::tempdir().expect("a temp dir");
|
|
shipped_documents(not_a_repo.path());
|
|
}
|
|
|
|
#[test]
|
|
fn a_force_added_document_is_walked() {
|
|
let repo = scratch_repo();
|
|
let root = repo.path();
|
|
write(root, ".gitignore", "*.improv\n");
|
|
write(root, "secret/forced.improv", "x");
|
|
run_git(root, &["add", ".gitignore"]);
|
|
run_git(root, &["add", "-f", "secret/forced.improv"]);
|
|
assert!(walked(root, "secret/forced.improv"));
|
|
}
|