Skip to content

Commit

Permalink
Refactor cache handling test to make it more robust
Browse files Browse the repository at this point in the history
  • Loading branch information
mre committed Oct 27, 2024
1 parent e43086c commit ad1c84f
Showing 1 changed file with 36 additions and 26 deletions.
62 changes: 36 additions & 26 deletions lychee-bin/tests/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ mod cli {
fs::{self, File},
io::Write,
path::{Path, PathBuf},
time::Duration,
};

use assert_cmd::Command;
Expand Down Expand Up @@ -845,52 +846,61 @@ mod cli {
let base_path = fixtures_path().join("cache");
let cache_file = base_path.join(LYCHEE_CACHE_FILE);

// Unconditionally remove cache file if it exists
let _ = fs::remove_file(&cache_file);
// Ensure clean state
if cache_file.exists() {
fs::remove_file(&cache_file)?;
tokio::time::sleep(Duration::from_millis(100)).await;
}

// Setup mock servers
let mock_server_ok = mock_server!(StatusCode::OK);
let mock_server_err = mock_server!(StatusCode::NOT_FOUND);
let mock_server_exclude = mock_server!(StatusCode::OK);

// Create test file
let dir = tempfile::tempdir()?;
let mut file = File::create(dir.path().join("c.md"))?;

let file_path = dir.path().join("c.md");
let mut file = File::create(&file_path)?;
writeln!(file, "{}", mock_server_ok.uri().as_str())?;
writeln!(file, "{}", mock_server_err.uri().as_str())?;
writeln!(file, "{}", mock_server_exclude.uri().as_str())?;
file.sync_all()?;

// Create and run command
let mut cmd = main_command();
let test_cmd = cmd
.current_dir(&base_path)
.arg(dir.path().join("c.md"))
cmd.current_dir(&base_path)
.arg(&file_path)
.arg("--verbose")
.arg("--no-progress")
.arg("--cache")
.arg("--exclude")
.arg(mock_server_exclude.uri());

assert!(
!cache_file.exists(),
"cache file should not exist before this test"
);
// Note: Don't check output.status.success() since we expect
// a non-zero exit code (2) when lychee finds broken links
let _output = cmd.output()?;

// run first without cache to generate the cache file
test_cmd
.assert()
.stderr(contains(format!("[200] {}/\n", mock_server_ok.uri())))
.stderr(contains(format!(
"[404] {}/ | Failed: Network error: Not Found\n",
mock_server_err.uri()
)));
// Wait for cache file to be written
for _ in 0..10 {
if cache_file.exists() {
break;
}
tokio::time::sleep(Duration::from_millis(100)).await;
}

// check content of cache file
// Check cache contents
let data = fs::read_to_string(&cache_file)?;
assert!(data.contains(&format!("{}/,200", mock_server_ok.uri())));
assert!(data.contains(&format!("{}/,404", mock_server_err.uri())));
assert!(
data.contains(&format!("{}/,200", mock_server_ok.uri())),
"Missing OK entry in cache"
);
assert!(
data.contains(&format!("{}/,404", mock_server_err.uri())),
"Missing error entry in cache"
);

// run again to verify cache behavior
test_cmd
.assert()
// Run again to verify cache behavior
cmd.assert()
.stderr(contains(format!(
"[200] {}/ | Cached: OK (cached)\n",
mock_server_ok.uri()
Expand All @@ -900,7 +910,7 @@ mod cli {
mock_server_err.uri()
)));

// clear the cache file
// Clean up
fs::remove_file(&cache_file)?;

Ok(())
Expand Down

0 comments on commit ad1c84f

Please # to comment.