gitbutler/packages/tauri/src/test_utils.rs

196 lines
6.1 KiB
Rust
Raw Normal View History

2023-10-04 13:50:16 +03:00
use std::{collections::HashMap, fs, path};
2023-08-28 10:34:30 +03:00
use tempfile::tempdir;
use crate::{
database, gb_repository, git, keys, paths::DataDir, project_repository, projects, storage,
users,
};
2023-10-04 13:50:16 +03:00
pub struct Suite {
pub local_app_data: DataDir,
2023-10-06 16:41:45 +03:00
pub storage: storage::Storage,
pub users: users::Controller,
2023-10-06 16:56:43 +03:00
pub projects: projects::Controller,
2023-10-06 16:41:45 +03:00
pub keys: keys::Controller,
2023-10-04 13:50:16 +03:00
}
impl Default for Suite {
fn default() -> Self {
let local_app_data = DataDir::from(temp_dir());
2023-10-04 13:50:16 +03:00
let storage = storage::Storage::from(&local_app_data);
2023-10-06 16:41:45 +03:00
let users = users::Controller::from(&storage);
2023-10-06 16:56:43 +03:00
let projects = projects::Controller::from(&local_app_data);
2023-10-06 16:41:45 +03:00
let keys = keys::Controller::from(&storage);
2023-10-04 13:50:16 +03:00
Self {
2023-10-06 16:41:45 +03:00
storage,
2023-10-04 13:50:16 +03:00
local_app_data,
2023-10-06 16:41:45 +03:00
users,
projects,
keys,
2023-10-04 13:50:16 +03:00
}
}
}
impl Suite {
pub fn sign_in(&self) -> users::User {
let user = users::User {
name: "test".to_string(),
email: "test@email.com".to_string(),
..Default::default()
};
2023-10-06 16:41:45 +03:00
self.users.set_user(&user).expect("failed to add user");
2023-10-04 13:50:16 +03:00
user
}
fn project(&self, fs: HashMap<path::PathBuf, &str>) -> projects::Project {
2023-10-04 13:50:16 +03:00
let repository = test_repository();
for (path, contents) in fs {
if let Some(parent) = path.parent() {
fs::create_dir_all(repository.path().parent().unwrap().join(parent))
.expect("failed to create dir");
}
fs::write(
repository.path().parent().unwrap().join(&path),
contents.as_bytes(),
)
.expect("failed to write file");
}
commit_all(&repository);
2023-10-06 16:56:43 +03:00
self.projects
.add(repository.path().parent().unwrap())
.expect("failed to add project")
}
pub fn new_case_with_files(&self, fs: HashMap<path::PathBuf, &str>) -> Case {
let project = self.project(fs);
Case::new(self, project)
}
pub fn new_case(&self) -> Case {
self.new_case_with_files(HashMap::new())
2023-10-04 13:50:16 +03:00
}
}
pub struct Case<'a> {
suite: &'a Suite,
pub project: projects::Project,
2023-10-04 13:50:16 +03:00
pub project_repository: project_repository::Repository,
pub gb_repository: gb_repository::Repository,
pub credentials: git::credentials::Factory,
2023-10-04 13:50:16 +03:00
}
2023-09-14 13:23:25 +03:00
impl<'a> Case<'a> {
fn new(suite: &'a Suite, project: projects::Project) -> Case<'a> {
2023-11-14 17:19:22 +03:00
let project_repository = project_repository::Repository::open(&project)
.expect("failed to create project repository");
let gb_repository =
gb_repository::Repository::open(&suite.local_app_data, &project_repository, None)
.expect("failed to open gb repository");
let credentials = git::credentials::Factory::new(
&project,
suite.keys.get_or_create().expect("failed to get key"),
suite.users.get_user().expect("failed to get user").as_ref(),
);
Case {
suite,
project,
gb_repository,
project_repository,
credentials,
}
}
pub fn refresh(&self) -> Self {
let project = self
.suite
2023-10-06 16:41:45 +03:00
.projects
.get(&self.project.id)
.expect("failed to get project");
2023-11-14 17:19:22 +03:00
let project_repository = project_repository::Repository::open(&project)
.expect("failed to create project repository");
let user = self.suite.users.get_user().expect("failed to get user");
let credentials = git::credentials::Factory::new(
&project,
self.suite.keys.get_or_create().expect("failed to get key"),
user.as_ref(),
);
Self {
suite: self.suite,
gb_repository: gb_repository::Repository::open(
&self.suite.local_app_data,
&project_repository,
user.as_ref(),
)
.expect("failed to open gb repository"),
credentials,
project_repository,
project,
}
}
}
2023-09-14 13:23:25 +03:00
pub fn test_database() -> database::Database {
let path = temp_dir().join("test.db");
let path = DataDir::from(path);
2023-09-14 13:23:25 +03:00
database::Database::try_from(&path).unwrap()
}
2023-08-30 10:46:52 +03:00
2023-08-28 10:34:30 +03:00
pub fn temp_dir() -> path::PathBuf {
let path = tempdir().unwrap().path().to_path_buf();
fs::create_dir_all(&path).unwrap();
path
}
pub fn empty_bare_repository() -> git::Repository {
let path = temp_dir();
2023-10-13 16:33:18 +03:00
git::Repository::init_bare(path).expect("failed to init repository")
}
2023-08-30 10:46:52 +03:00
pub fn test_repository() -> git::Repository {
2023-08-28 10:34:30 +03:00
let path = temp_dir();
2023-08-30 10:46:52 +03:00
let repository = git::Repository::init(path).expect("failed to init repository");
2023-08-28 10:34:30 +03:00
let mut index = repository.index().expect("failed to get index");
let oid = index.write_tree().expect("failed to write tree");
2023-09-20 12:53:59 +03:00
let signature = git::Signature::now("test", "test@email.com").unwrap();
2023-08-28 10:34:30 +03:00
repository
.commit(
Some("HEAD"),
&signature,
&signature,
"Initial commit",
&repository.find_tree(oid).expect("failed to find tree"),
&[],
)
.expect("failed to commit");
repository
}
2023-08-28 11:28:26 +03:00
2023-08-30 18:03:00 +03:00
pub fn commit_all(repository: &git::Repository) -> git::Oid {
2023-08-28 11:28:26 +03:00
let mut index = repository.index().expect("failed to get index");
index
.add_all(["."], git2::IndexAddOption::DEFAULT, None)
.expect("failed to add all");
index.write().expect("failed to write index");
let oid = index.write_tree().expect("failed to write tree");
2023-09-20 12:53:59 +03:00
let signature = git::Signature::now("test", "test@email.com").unwrap();
2023-08-28 11:28:26 +03:00
let commit_oid = repository
.commit(
Some("HEAD"),
&signature,
&signature,
"some commit",
&repository.find_tree(oid).expect("failed to find tree"),
&[&repository
.find_commit(
repository
.refname_to_id("HEAD")
.expect("failed to get head"),
)
.expect("failed to find commit")],
)
.expect("failed to commit");
commit_oid
}