#![allow(dead_code)]
use std::time::Duration;
use hotdata::Client;
const CONNECT_TIMEOUT: Duration = Duration::from_secs(10);
const REQUEST_TIMEOUT: Duration = Duration::from_secs(60);
pub fn test_http_client() -> reqwest::Client {
reqwest::Client::builder()
.connect_timeout(CONNECT_TIMEOUT)
.timeout(REQUEST_TIMEOUT)
.build()
.expect("building the test reqwest client should not fail")
}
pub const DEFAULT_API_URL: &str = "https://api.hotdata.dev";
#[derive(Clone, Debug)]
pub struct TestEnv {
pub api_key: Option<String>,
pub workspace_id: Option<String>,
pub api_url: String,
pub connection_id: Option<String>,
}
impl TestEnv {
pub fn has_creds(&self) -> bool {
self.api_key.is_some() && self.workspace_id.is_some()
}
}
fn non_empty(name: &str) -> Option<String> {
std::env::var(name).ok().filter(|s| !s.is_empty())
}
pub fn load_env() -> TestEnv {
TestEnv {
api_key: non_empty("HOTDATA_SDK_TEST_API_KEY"),
workspace_id: non_empty("HOTDATA_SDK_TEST_WORKSPACE_ID"),
api_url: non_empty("HOTDATA_SDK_TEST_API_URL")
.unwrap_or_else(|| DEFAULT_API_URL.to_string()),
connection_id: non_empty("HOTDATA_SDK_TEST_CONNECTION_ID"),
}
}
pub fn client_or_skip() -> Option<Client> {
let env = load_env();
if !env.has_creds() {
return None;
}
let client = Client::builder()
.api_token(env.api_key.expect("checked above"))
.workspace_id(env.workspace_id.expect("checked above"))
.base_url(env.api_url)
.reqwest_client(test_http_client())
.build()
.expect("Client::build with valid credentials should not fail");
Some(client)
}
pub fn sdkci_name(scenario: &str) -> String {
let id = uuid::Uuid::new_v4().simple().to_string();
format!("sdkci-{}-{}", scenario, &id[..8])
}
#[macro_export]
macro_rules! skip_if_no_creds {
() => {{
match $crate::common::client_or_skip() {
Some(client) => client,
None => {
eprintln!(
"SKIP {}: set HOTDATA_SDK_TEST_API_KEY and \
HOTDATA_SDK_TEST_WORKSPACE_ID to run this scenario",
module_path!()
);
return;
}
}
}};
}
#[macro_export]
macro_rules! skip_if_no_connection {
() => {{
let env = $crate::common::load_env();
match ($crate::common::client_or_skip(), env.connection_id.clone()) {
(Some(client), Some(connection_id)) => (client, connection_id),
(None, _) => {
eprintln!(
"SKIP {}: set HOTDATA_SDK_TEST_API_KEY and \
HOTDATA_SDK_TEST_WORKSPACE_ID to run this scenario",
module_path!()
);
return;
}
(Some(_), None) => {
eprintln!(
"SKIP {}: set HOTDATA_SDK_TEST_CONNECTION_ID to run this \
scenario",
module_path!()
);
return;
}
}
}};
}
pub fn status_of<T>(err: &hotdata::Error<T>) -> Option<u16> {
match err {
hotdata::Error::ResponseError(content) => Some(content.status.as_u16()),
_ => None,
}
}
pub const SHARED_DATABASE_NAME: &str = "sdkci-shared";
pub async fn shared_database_id(client: &Client) -> String {
use hotdata::apis::databases_api;
let config = client.configuration();
let listing = databases_api::list_databases(config)
.await
.expect("list_databases should succeed");
if let Some(db) = listing
.databases
.iter()
.find(|d| d.name.as_ref().and_then(|n| n.as_deref()) == Some(SHARED_DATABASE_NAME))
{
return db.id.clone();
}
let mut request = hotdata::models::CreateDatabaseRequest::new();
request.name = Some(Some(SHARED_DATABASE_NAME.to_string()));
let created = databases_api::create_database(config, request)
.await
.expect("create_database should succeed");
created.id
}
pub async fn create_scratch_database(client: &Client, scenario: &str) -> String {
use hotdata::apis::databases_api;
let mut request = hotdata::models::CreateDatabaseRequest::new();
request.name = Some(Some(sdkci_name(scenario)));
let created = databases_api::create_database(client.configuration(), request)
.await
.expect("create_database should succeed");
created.id
}