Skip to main content

batuta/stack/crates_io/
mock.rs

1//! Mock client for testing without network calls.
2
3use super::types::{CrateData, CrateResponse, VersionData};
4use anyhow::{anyhow, Result};
5use std::collections::HashMap;
6
7/// Mock client for testing without network calls
8#[derive(Debug, Default)]
9pub struct MockCratesIoClient {
10    /// Predefined responses
11    pub responses: HashMap<String, Result<CrateResponse, String>>,
12}
13
14impl MockCratesIoClient {
15    /// Create a new mock client
16    pub fn new() -> Self {
17        Self::default()
18    }
19
20    /// Add a mock response for a crate
21    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    /// Add a "not found" response for a crate
39    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    /// Get crate (mock implementation)
45    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    /// Get latest version (mock implementation)
54    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    /// Check if version is published (mock implementation)
60    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}