Module users::mock [] [src]

Mockable users and groups.

When you're testing your code, you don't want to actually rely on the system actually having various users and groups present - it's much better to have a custom set of users that are guaranteed to be there, so you can test against them.

This sub-library allows you to create these custom users and groups definitions, then access them using the same Users trait as in the main library, with few changes to your code.

Creating Mock Users

The only thing a mock users object needs to know in advance is the UID of the current user. Aside from that, you can add users and groups with add_user and add_group to the object:

use users::mock::{MockUsers, User, Group};
let mut users = MockUsers::with_current_uid(1000);
users.add_user(User { uid: 1000, name: "Bobbins".to_string(), primary_group: 100 });
users.add_group(Group { gid: 100, name: "funkyppl".to_string(), members: vec![ "other_person".to_string() ] });

The exports get re-exported into the mock module, for simpler use lines.

Using Mock Users

To set your program up to use either type of Users object, make your functions and structs accept a generic parameter that implements the Users trait. Then, you can pass in an object of either OS or Mock type.

Here's a complete example:

use users::{Users, OSUsers, User};
use users::mock::MockUsers;

fn print_current_username<U: Users>(users: &mut U) {
    println!("Current user: {:?}", users.get_current_username());
}

let mut users = MockUsers::with_current_uid(1001);
users.add_user(User { uid: 1001, name: "fred".to_string(), primary_group: 101 });
print_current_username(&mut users);

let mut actual_users = OSUsers::empty_cache();
print_current_username(&mut actual_users);

Reexports

pub use super::{Users, User, Group};

Structs

MockUsers

A mocking users object that you can add your own users and groups to.