use crate::objects::user::User;
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Clone)]
pub struct GitHub {
pub id: Uuid,
pub name: String,
pub users: HashMap<String, User>,
}
impl GitHub {
pub fn add_user(&mut self, user: User) {
self.users.insert(user.clone().login, user);
}
pub fn user(&self, login: &str) -> Option<&User> {
self.users.get(login)
}
pub fn users(self) -> Vec<User> {
self.users.into_values().collect()
}
}
#[cfg(test)]
mod tests {
use crate::objects::github::GitHub;
use crate::objects::user::User;
use anyhow::Result;
use hamcrest::{equal_to, is, HamcrestMatcher};
use std::collections::HashMap;
use uuid::Uuid;
#[test]
fn adds_user() -> Result<()> {
let mut github = GitHub {
id: Uuid::new_v4(),
name: String::from("bar"),
users: HashMap::new(),
};
let expected = String::from("jeff");
github.add_user(User::new(expected.clone()));
let users = github.users();
let user = users.first().expect("Failed to get user");
assert_that!(&user.login, is(equal_to(&expected)));
Ok(())
}
#[test]
fn returns_user_by_login() -> Result<()> {
let mut github = GitHub {
id: Uuid::new_v4(),
name: String::from("bar"),
users: HashMap::new(),
};
let expected = "foo";
github.add_user(User::new(String::from(expected)));
let foo = github.user(expected).expect("Failed to get user");
assert_that!(&foo.login, is(equal_to(expected)));
Ok(())
}
}