technitium 0.4.0

Typed async Rust client for the Technitium DNS Server API
Documentation
mod common;

use std::time::{Duration, Instant};

use technitium::Client;

#[tokio::test]
#[ignore = "requires running Technitium server"]
async fn connect_timeout_fires() {
    // 192.0.2.1 is TEST-NET-1 (RFC 5737) — guaranteed non-routable
    let client = Client::builder()
        .base_url("http://192.0.2.1:5380")
        .connect_timeout(Duration::from_secs(2))
        .request_timeout(Duration::from_secs(5))
        .build()
        .expect("build client");

    let start = Instant::now();
    let result = client.login("admin", "admin").await;
    let elapsed = start.elapsed();

    assert!(result.is_err(), "should fail");
    assert!(
        elapsed < Duration::from_secs(5),
        "should fail within ~2s connect timeout, took {elapsed:?}"
    );
}

#[tokio::test]
#[ignore = "requires running Technitium server"]
async fn default_timeout_allows_normal_requests() {
    // Default timeouts (30s request, 10s connect) should not interfere
    let client = common::build_client();
    client
        .login(&common::admin_username(), &common::admin_password())
        .await
        .expect("login with default timeouts should succeed");

    let zones = client.list_zones().await;
    assert!(
        zones.is_ok(),
        "list_zones should succeed with default timeouts"
    );
}

#[tokio::test]
#[ignore = "requires running Technitium server"]
async fn pool_settings_dont_break() {
    let client = Client::builder()
        .base_url(common::server_url())
        .pool_max_idle(2)
        .pool_idle_timeout(Duration::from_secs(5))
        .build()
        .expect("build client with pool settings");

    client
        .login(&common::admin_username(), &common::admin_password())
        .await
        .expect("login with pool settings should succeed");

    // Send multiple requests to exercise pooling
    for _ in 0..5 {
        client
            .list_zones()
            .await
            .expect("list_zones should succeed");
    }
}