windows_users 0.1.0

A crate for managing Windows users and groups.
Documentation
use windows_users::{
    UserUpdate, add_user, change_user_password, delete_user, get_user, update_user, user_exists,
};

use crate::helpers::{
    auto_remove_user::AutoRemoveUser,
    build::{build_full_user, build_full_user_alt},
    constants::USER_NAME,
    utils::assert_user_eq,
};

mod helpers;

#[test]
fn test_add_and_get_user_with_full_payload() {
    let user_name = format!("{USER_NAME}_2");
    let user = build_full_user(&user_name);
    let _guard = AutoRemoveUser::add(None, &user).expect("Failed to add user");

    let fetched = get_user(None, &user_name).expect("Failed to fetch user");

    assert_user_eq(&fetched, &user);
}

#[test]
fn test_add_user_if_not_exists() {
    let user_name = format!("{USER_NAME}_3");
    let user = build_full_user(&user_name);

    let auto_remove_user_result = AutoRemoveUser::add_if_not_exists(None, &user).unwrap();
    assert!(auto_remove_user_result.added_or_changed);
    let auto_remove_user_result = AutoRemoveUser::add_if_not_exists(None, &user).unwrap();
    assert!(!auto_remove_user_result.added_or_changed);
}

#[test]
fn test_add_user_or_update() {
    let user_name = format!("{USER_NAME}_4");
    let user = build_full_user(&user_name);

    let auto_remove_user_result =
        AutoRemoveUser::add_or_update(None, &user).expect("Failed to add or update user");
    assert!(
        auto_remove_user_result.added_or_changed,
        "User should be added"
    );

    let updated_user = build_full_user_alt(&user_name);
    let auto_remove_user_result =
        AutoRemoveUser::add_or_update(None, &updated_user).expect("Failed to update user");
    assert!(
        !auto_remove_user_result.added_or_changed,
        "Rule should be updated"
    );

    let updated_user = get_user(None, &user_name).expect("Failed to fetch updated user");
    assert_user_eq(&updated_user, &updated_user);
}

#[test]
fn test_delete_user_removes_user() {
    let user_name = format!("{USER_NAME}_5");
    let user = build_full_user(&user_name);
    add_user(None, &user).expect("Failed to add user");

    delete_user(None, &user_name).expect("Failed to delete user");

    assert!(
        !user_exists(None, &user_name),
        "Expected deleted user to no longer exist"
    );
}

#[test]
fn test_user_exists_returns_true_for_created_user() {
    let user_name = format!("{USER_NAME}_6");
    let user = build_full_user(&user_name);
    let _guard = AutoRemoveUser::add(None, &user).expect("Failed to add user");

    assert!(
        user_exists(None, &user_name),
        "Expected user_exists to return true for an existing user"
    );
}

#[test]
fn test_user_exists_returns_false_for_missing_user() {
    let user_name = format!("{USER_NAME}_7");

    assert!(
        !user_exists(None, &user_name),
        "Expected user_exists to return false for a missing user"
    );
}

#[test]
fn test_update_user_changes_only_requested_fields() {
    let user_name = format!("{USER_NAME}_8");
    let mut user = build_full_user(&user_name);
    let _guard = AutoRemoveUser::add(None, &user).expect("Failed to add user");

    let new_full_name = "Updated Full Name";
    let new_comment = "Updated comment";
    let settings = UserUpdate::builder()
        .full_name(new_full_name)
        .comment(new_comment)
        .build();

    user.update(None, &settings)
        .expect("Failed to update user with new API");

    let fetched = get_user(None, &user_name).expect("Failed to fetch updated user");
    user.set_full_name(Some(new_full_name.to_string()));
    user.set_comment(Some(new_comment.to_string()));

    assert_user_eq(&fetched, &user);
}

#[test]
fn test_update_full_user_to_new_full_user() {
    let user_name = format!("{USER_NAME}_9");

    let mut user = build_full_user(&user_name);
    let _guard = AutoRemoveUser::add(None, &user).expect("Failed to add user");

    let new_user = build_full_user_alt(&user_name);

    user.update(None, &new_user.clone().into())
        .expect("Failed to fully update user");

    let fetched = get_user(None, &user_name).expect("Failed to fetch updated user");

    assert_user_eq(&fetched, &new_user);
}

#[test]
fn test_update_user_fails_for_missing_user() {
    let user_name = format!("{USER_NAME}_10");
    let settings = UserUpdate::builder().full_name("Should Fail").build();

    let result = update_user(None, &user_name, &settings);

    assert!(
        result.is_err(),
        "Expected update_user to fail for missing user"
    );
}

#[test]
fn test_change_user_password_accepts_current_password() {
    let user_name = format!("{USER_NAME}_11");
    let user = build_full_user(&user_name);
    let _guard = AutoRemoveUser::add(None, &user).expect("Failed to add user");

    change_user_password(None, &user_name, "P@ssw0rd123!", "N3wP@ssw0rd!")
        .expect("Failed to change user password");
}