technitium 0.4.0

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

use technitium::{CreateGroup, CreateUser};

const TEST_USER: &str = "test-user-integration";
const TEST_GROUP: &str = "test-group-integration";

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

    // Cleanup from prior runs
    let _ = client.delete_user(TEST_USER).await;

    // Create user
    client
        .create_user(&CreateUser {
            username: TEST_USER.to_string(),
            display_name: "Integration Test User".to_string(),
            password: "test-password-123".to_string(),
        })
        .await
        .expect("create_user should succeed");

    // List users and verify present
    let users = client
        .list_users()
        .await
        .expect("list_users should succeed");
    assert!(
        users
            .iter()
            .any(|u| u.username.as_deref() == Some(TEST_USER)),
        "created user should appear in list"
    );

    // Get user details
    let user = client
        .get_user(TEST_USER)
        .await
        .expect("get_user should succeed");
    assert_eq!(user.username.as_deref(), Some(TEST_USER));

    // Cleanup
    client
        .delete_user(TEST_USER)
        .await
        .expect("delete_user should succeed");
}

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

    // Cleanup from prior runs
    let _ = client.delete_group(TEST_GROUP).await;

    // Create group
    client
        .create_group(&CreateGroup {
            name: TEST_GROUP.to_string(),
            description: "Integration test group".to_string(),
        })
        .await
        .expect("create_group should succeed");

    // List groups and verify present
    let groups = client
        .list_groups()
        .await
        .expect("list_groups should succeed");
    assert!(
        groups.iter().any(|g| g.name.as_deref() == Some(TEST_GROUP)),
        "created group should appear in list"
    );

    // Cleanup
    client
        .delete_group(TEST_GROUP)
        .await
        .expect("delete_group should succeed");
}