autumn-plugin-clickhouse 0.3.0

Autumn plugin: a ClickHouse OLAP client with batch inserts, typed queries, and migrations.
Documentation
use autumn_web::actuator::{HealthIndicator, HealthStatus, IndicatorGroup};
use clickhouse::test::{self, Mock};

use super::*;
use crate::client::ClickHouse;
use crate::config::ClickHouseConfig;

fn check() -> ClickHouseCheck {
    ClickHouseCheck::new(Arc::new(Shared::default()))
}

#[tokio::test]
async fn down_before_the_plugin_starts() {
    let output = check().check().await;
    assert_eq!(output.status, HealthStatus::Down);
    assert_eq!(
        output.details.get("state"),
        Some(&serde_json::Value::String("not started".to_owned()))
    );
}

#[tokio::test]
async fn up_when_select_1_succeeds() {
    let mock = Mock::new();
    let client = clickhouse::Client::default().with_mock(&mock);
    mock.add(test::handlers::record_ddl());
    let shared = Arc::new(Shared::default());
    let db = ClickHouse::with_client(client, ClickHouseConfig::default());
    let _ = shared.handle.set(db);
    let output = ClickHouseCheck::new(shared).check().await;
    assert_eq!(output.status, HealthStatus::Up);
    assert_eq!(
        output.details.get("database"),
        Some(&serde_json::Value::String("default".to_owned()))
    );
}

#[tokio::test]
async fn down_when_the_server_refuses() {
    let mock = Mock::new();
    let client = clickhouse::Client::default().with_mock(&mock);
    mock.add(test::handlers::failure(test::status::FORBIDDEN));
    let shared = Arc::new(Shared::default());
    let db = ClickHouse::with_client(client, ClickHouseConfig::default());
    let _ = shared.handle.set(db);
    let output = ClickHouseCheck::new(shared).check().await;
    assert_eq!(output.status, HealthStatus::Down);
    assert_eq!(
        output.details.get("state"),
        Some(&serde_json::Value::String("unreachable".to_owned()))
    );
}

#[test]
fn is_health_only() {
    assert_eq!(check().group(), IndicatorGroup::HealthOnly);
    assert_eq!(check().timeout_ms(), 1_000);
}

#[test]
fn details_never_show_secrets() {
    let fields = [("database", "analytics"), ("url", "http://x")];
    let map = details(&fields);
    assert!(!format!("{map:?}").contains("secret"));
    assert_eq!(map.len(), 2);
}