Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Refactor cache handling test to make it more robust #1548

Merged
merged 1 commit into from
Oct 27, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading