use std::collections::HashMap;
use crate::common::utils::*;
use ed25519_dalek::Signer as _;
use reqwest::{StatusCode, IntoUrl};
use rubedo::{
crypto::{SigningKey, VerifyingKey},
sugar::s,
};
use sham::reqwest::{MockError, MockResponse, create_mock_response as create_sham_response};
#[expect(variant_size_differences, reason = "Doesn't matter here")]
pub enum ResponseSignature {
Generate,
GenerateUsing(SigningKey),
Omit,
Use(String),
}
pub fn create_mock_response<U: IntoUrl, S: Into<String>>(
url: U,
status: StatusCode,
content_type: Option<S>,
content_len: Option<usize>,
body: Result<&String, MockError>,
sign: &ResponseSignature,
) -> (MockResponse, VerifyingKey) {
let key = match *sign {
ResponseSignature::GenerateUsing(ref key) => key.clone(),
ResponseSignature::Generate |
ResponseSignature::Omit |
ResponseSignature::Use(_) => generate_new_private_key(),
};
let signature = match *sign {
ResponseSignature::GenerateUsing(_) |
ResponseSignature::Generate => {
body.as_ref().map_or_else(|_| s!(""), |b| key.sign(b.as_ref()).to_string())
},
ResponseSignature::Omit => s!(""),
ResponseSignature::Use(ref other_sig) => other_sig.clone(),
};
let mut headers = HashMap::new();
match *sign {
ResponseSignature::GenerateUsing(_) |
ResponseSignature::Generate |
ResponseSignature::Use(_) => drop(headers.insert("X-Signature", signature)),
ResponseSignature::Omit => {},
}
let mock_response = create_sham_response(
url,
status,
content_type,
content_len,
headers,
match body {
Ok(b) => Ok(b.as_bytes()),
Err(e) => Err(e),
},
);
(mock_response, key.verifying_key())
}
pub fn create_mock_binary_response<U: IntoUrl, S: Into<String>>(
url: U,
status: StatusCode,
content_type: Option<S>,
content_len: Option<usize>,
body: Result<&[u8], MockError>,
) -> MockResponse {
create_sham_response(
url,
status,
content_type,
content_len,
HashMap::<String, String>::new(),
body,
)
}