Integration Tests:
- test_user_workflow: Create, update, reset password, delete user
- test_multiple_users: Create multiple users, verify list, cleanup
- test_user_permissions: Admin vs regular user permissions
Test Features:
- Unique usernames (timestamp-based) to avoid conflicts
- Using existing data/auth.sqlite database
- Cleanup after each test
- Password verification
- Permission checking
Test Coverage:
- create_user() + bcrypt password hashing
- get_user() + user data verification
- check_password() + correct/wrong password tests
- update_user() + home_dir, uid, permissions update
- reset_password() + password change verification
- list_users() + multiple users list
- delete_user() + cleanup verification
Build: ✅ markbase-core
Tests: 3 passed, 0 failed
188 lines
7.1 KiB
Rust
188 lines
7.1 KiB
Rust
use std::path::PathBuf;
|
|
use markbase_core::provider::{DataProvider, User, SqliteProvider};
|
|
|
|
#[cfg(test)]
|
|
mod integration_tests {
|
|
use super::*;
|
|
|
|
fn create_test_provider() -> SqliteProvider {
|
|
// Use existing auth database for testing (relative to project root)
|
|
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
|
|
let db_path = format!("{}/../data/auth.sqlite", manifest_dir);
|
|
SqliteProvider::new(&db_path).unwrap()
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_user_workflow() {
|
|
let provider = create_test_provider();
|
|
|
|
// Use unique username to avoid conflicts
|
|
let unique_name = format!("testuser_{}", std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs());
|
|
|
|
// 1. Create user
|
|
let user = User {
|
|
username: unique_name.clone(),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from("/tmp/testuser"),
|
|
uid: 1000,
|
|
gid: 1000,
|
|
permissions: "read,write".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.create_user(&user, "testpassword123").unwrap();
|
|
|
|
// 2. Check user exists
|
|
let loaded_user = provider.get_user(&unique_name).unwrap().unwrap();
|
|
assert_eq!(loaded_user.username, unique_name);
|
|
assert_eq!(loaded_user.home_dir, PathBuf::from("/tmp/testuser"));
|
|
assert_eq!(loaded_user.status, 1);
|
|
|
|
// 3. Verify password
|
|
assert!(provider.check_password(&unique_name, "testpassword123").unwrap());
|
|
assert!(!provider.check_password(&unique_name, "wrongpassword").unwrap());
|
|
|
|
// 4. Get home directory
|
|
let home_dir = provider.get_home_dir(&unique_name).unwrap().unwrap();
|
|
assert_eq!(home_dir, "/tmp/testuser");
|
|
|
|
// 5. Update user
|
|
let updated_user = User {
|
|
username: unique_name.clone(),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from("/tmp/testuser_updated"),
|
|
uid: 1001,
|
|
gid: 1001,
|
|
permissions: "read".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.update_user(&updated_user, None).unwrap();
|
|
|
|
let loaded_user = provider.get_user(&unique_name).unwrap().unwrap();
|
|
assert_eq!(loaded_user.home_dir, PathBuf::from("/tmp/testuser_updated"));
|
|
assert_eq!(loaded_user.uid, 1001);
|
|
|
|
// 6. Reset password
|
|
provider.reset_password(&unique_name, "newpassword456").unwrap();
|
|
assert!(provider.check_password(&unique_name, "newpassword456").unwrap());
|
|
assert!(!provider.check_password(&unique_name, "testpassword123").unwrap());
|
|
|
|
// 7. List users
|
|
let users = provider.list_users().unwrap();
|
|
assert!(users.len() >= 1);
|
|
assert!(users.iter().any(|u| u.username == unique_name));
|
|
|
|
// 8. Delete user
|
|
provider.delete_user(&unique_name).unwrap();
|
|
assert!(provider.get_user(&unique_name).unwrap().is_none());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_multiple_users() {
|
|
let provider = create_test_provider();
|
|
|
|
// Use unique usernames to avoid conflicts
|
|
let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs();
|
|
let users_data = vec![
|
|
(format!("alice_{}", timestamp), "/tmp/alice_home", "alicepass"),
|
|
(format!("bob_{}", timestamp), "/tmp/bob_home", "bobpass"),
|
|
(format!("charlie_{}", timestamp), "/tmp/charlie_home", "charliepass"),
|
|
];
|
|
|
|
for (username, home_dir, password) in &users_data {
|
|
let user = User {
|
|
username: username.clone(),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from(home_dir),
|
|
uid: 1000,
|
|
gid: 1000,
|
|
permissions: "read,write".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.create_user(&user, password).unwrap();
|
|
}
|
|
|
|
// 2. List all users
|
|
let loaded_users = provider.list_users().unwrap();
|
|
assert!(loaded_users.len() >= 3);
|
|
|
|
// 3. Verify each user
|
|
for (username, home_dir, password) in &users_data {
|
|
let user = provider.get_user(username).unwrap().unwrap();
|
|
assert_eq!(user.home_dir, PathBuf::from(home_dir));
|
|
assert!(provider.check_password(username, password).unwrap());
|
|
}
|
|
|
|
// 4. Cleanup
|
|
for (username, _, _) in &users_data {
|
|
provider.delete_user(username).unwrap();
|
|
}
|
|
|
|
let remaining_users = provider.list_users().unwrap();
|
|
assert!(!remaining_users.iter().any(|u| users_data.iter().any(|(name, _, _)| name == &u.username)));
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_user_permissions() {
|
|
let provider = create_test_provider();
|
|
|
|
// Use unique usernames to avoid conflicts
|
|
let timestamp = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs();
|
|
|
|
// 1. Create admin user
|
|
let admin = User {
|
|
username: format!("admin_{}", timestamp),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from("/tmp/admin_home"),
|
|
uid: 1000,
|
|
gid: 1000,
|
|
permissions: "read,write,delete,admin".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.create_user(&admin, "adminpass").unwrap();
|
|
|
|
// 2. Create regular user
|
|
let regular = User {
|
|
username: format!("regular_{}", timestamp),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from("/tmp/regular_home"),
|
|
uid: 1001,
|
|
gid: 1001,
|
|
permissions: "read".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.create_user(®ular, "regularpass").unwrap();
|
|
|
|
// 3. Verify permissions
|
|
let admin_user = provider.get_user(&format!("admin_{}", timestamp)).unwrap().unwrap();
|
|
assert!(admin_user.permissions.contains("admin"));
|
|
|
|
let regular_user = provider.get_user(&format!("regular_{}", timestamp)).unwrap().unwrap();
|
|
assert!(regular_user.permissions.contains("read"));
|
|
assert!(!regular_user.permissions.contains("admin"));
|
|
|
|
// 4. Update regular user permissions
|
|
let updated_regular = User {
|
|
username: format!("regular_{}", timestamp),
|
|
password_hash: "".to_string(),
|
|
home_dir: PathBuf::from("/tmp/regular_home"),
|
|
uid: 1001,
|
|
gid: 1001,
|
|
permissions: "read,write".to_string(),
|
|
status: 1,
|
|
};
|
|
|
|
provider.update_user(&updated_regular, None).unwrap();
|
|
|
|
let regular_user = provider.get_user(&format!("regular_{}", timestamp)).unwrap().unwrap();
|
|
assert!(regular_user.permissions.contains("write"));
|
|
|
|
// 5. Cleanup
|
|
provider.delete_user(&format!("admin_{}", timestamp)).unwrap();
|
|
provider.delete_user(&format!("regular_{}", timestamp)).unwrap();
|
|
}
|
|
} |