WIP: Batch 2 — backfill tests for fs, shell, and http/workflow

- io/fs.rs: 20 tests (path resolution, project open/close/get, known projects,
  model prefs, file read/write, list dir, validate path, scaffold)
- io/shell.rs: 4 new tests (allowlist, command execution, stdout capture, exit codes)
- http/workflow.rs: 8 tests (parse_test_status, to_test_case, to_review_story)

Coverage: 28.6% → 48.1%

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dave
2026-02-19 13:52:19 +00:00
parent 76e7c68b66
commit de6334720a
3 changed files with 435 additions and 0 deletions

View File

@@ -106,4 +106,64 @@ mod tests {
"expected shell execution to be blocked when test plan is not approved"
);
}
#[tokio::test]
async fn exec_shell_impl_rejects_disallowed_command() {
let dir = tempdir().unwrap();
let result = exec_shell_impl(
"curl".to_string(),
vec!["https://example.com".to_string()],
dir.path().to_path_buf(),
)
.await;
assert!(result.is_err());
assert!(result.unwrap_err().contains("not in the allowlist"));
}
#[tokio::test]
async fn exec_shell_impl_runs_allowed_command() {
let dir = tempdir().unwrap();
let result = exec_shell_impl(
"ls".to_string(),
Vec::new(),
dir.path().to_path_buf(),
)
.await;
assert!(result.is_ok());
let output = result.unwrap();
assert_eq!(output.exit_code, 0);
}
#[tokio::test]
async fn exec_shell_impl_captures_stdout() {
let dir = tempdir().unwrap();
std::fs::write(dir.path().join("hello.txt"), "").unwrap();
let result = exec_shell_impl(
"ls".to_string(),
Vec::new(),
dir.path().to_path_buf(),
)
.await
.unwrap();
assert!(result.stdout.contains("hello.txt"));
}
#[tokio::test]
async fn exec_shell_impl_returns_nonzero_exit_code() {
let dir = tempdir().unwrap();
let result = exec_shell_impl(
"ls".to_string(),
vec!["nonexistent_file_xyz".to_string()],
dir.path().to_path_buf(),
)
.await
.unwrap();
assert_ne!(result.exit_code, 0);
assert!(!result.stderr.is_empty());
}
}