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 04a5258
Showing 1 changed file with 56 additions and 35 deletions.
91 changes: 56 additions & 35 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,62 +846,60 @@ 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())));

// run again to verify cache behavior
test_cmd
.assert()
.stderr(contains(format!(
"[200] {}/ | Cached: OK (cached)\n",
mock_server_ok.uri()
)))
.stderr(contains(format!(
"[404] {}/ | Cached: Error (cached)\n",
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"
);

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

Ok(())
Expand Down Expand Up @@ -1723,4 +1722,26 @@ mod cli {

Ok(())
}

#[tokio::test]
async fn test_json_format_in_config() -> Result<()> {
let mock_server = mock_server!(StatusCode::OK);
let config = fixtures_path().join("configs").join("format.toml");
let mut cmd = main_command();
cmd.arg("--config")
.arg(config)
.arg("-")
.write_stdin(mock_server.uri())
.env_clear()
.assert()
.success();

// Check that the output is in JSON format
let output = cmd.output().unwrap();
let output = std::str::from_utf8(&output.stdout).unwrap();
let json: serde_json::Value = serde_json::from_str(output)?;
assert_eq!(json["total"], 1);

Ok(())
}
}

0 comments on commit 04a5258

Please # to comment.