technitium 0.4.0

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

const ALLOWED_ZONE: &str = "allowed-test.example.com";
const BLOCKED_ZONE: &str = "blocked-test.example.com";

#[tokio::test]
#[ignore = "requires running Technitium server"]
async fn allowed_zone_add_delete() {
    let client = common::authenticated_client().await;

    // Cleanup
    let _ = client.delete_allowed(ALLOWED_ZONE).await;

    // Add
    client
        .allow_zone(ALLOWED_ZONE)
        .await
        .expect("allow_zone should succeed");

    // Export (verifies the zone was added — export includes all entries)
    let exported = client
        .export_allowed()
        .await
        .expect("export_allowed should succeed");
    let export_str = String::from_utf8_lossy(&exported);
    assert!(
        export_str.contains(ALLOWED_ZONE),
        "export should contain the allowed zone"
    );

    // Delete
    client
        .delete_allowed(ALLOWED_ZONE)
        .await
        .expect("delete_allowed should succeed");
}

#[tokio::test]
#[ignore = "requires running Technitium server"]
async fn blocked_zone_add_delete() {
    let client = common::authenticated_client().await;

    // Cleanup
    let _ = client.delete_blocked(BLOCKED_ZONE).await;

    // Add
    client
        .block_zone(BLOCKED_ZONE)
        .await
        .expect("block_zone should succeed");

    // Export (verifies the zone was added)
    let exported = client
        .export_blocked()
        .await
        .expect("export_blocked should succeed");
    let export_str = String::from_utf8_lossy(&exported);
    assert!(
        export_str.contains(BLOCKED_ZONE),
        "export should contain the blocked zone"
    );

    // Delete
    client
        .delete_blocked(BLOCKED_ZONE)
        .await
        .expect("delete_blocked should succeed");
}