batuta/stack/crates_io/
mock.rs1use super::types::{CrateData, CrateResponse, VersionData};
4use anyhow::{anyhow, Result};
5use std::collections::HashMap;
6
7#[derive(Debug, Default)]
9pub struct MockCratesIoClient {
10 pub responses: HashMap<String, Result<CrateResponse, String>>,
12}
13
14impl MockCratesIoClient {
15 pub fn new() -> Self {
17 Self::default()
18 }
19
20 pub fn add_crate(&mut self, name: impl Into<String>, version: impl Into<String>) -> &mut Self {
22 let name = name.into();
23 let version = version.into();
24
25 let response = CrateResponse {
26 krate: CrateData {
27 max_stable_version: Some(version.clone()),
28 downloads: 1000,
29 ..CrateData::new(name.clone(), version.clone())
30 },
31 versions: vec![VersionData::new(version, 1000)],
32 };
33
34 self.responses.insert(name, Ok(response));
35 self
36 }
37
38 pub fn add_not_found(&mut self, name: impl Into<String>) -> &mut Self {
40 self.responses.insert(name.into(), Err("Not found".to_string()));
41 self
42 }
43
44 pub fn get_crate(&self, name: &str) -> Result<CrateResponse> {
46 match self.responses.get(name) {
47 Some(Ok(response)) => Ok(response.clone()),
48 Some(Err(e)) => Err(anyhow!("{}", e)),
49 None => Err(anyhow!("Crate '{}' not found", name)),
50 }
51 }
52
53 pub fn get_latest_version(&self, name: &str) -> Result<semver::Version> {
55 let response = self.get_crate(name)?;
56 response.krate.max_version.parse().map_err(|e| anyhow!("Failed to parse version: {}", e))
57 }
58
59 pub fn is_version_published(&self, name: &str, version: &semver::Version) -> Result<bool> {
61 let response = self.get_crate(name)?;
62 let version_str = version.to_string();
63 Ok(response.versions.iter().any(|v| v.num == version_str && !v.yanked))
64 }
65}