2024-03-29 12:04:26 +03:00
|
|
|
use std::path::PathBuf;
|
2024-06-09 08:18:44 +03:00
|
|
|
use std::str;
|
2024-03-29 12:04:26 +03:00
|
|
|
|
2024-06-09 08:18:44 +03:00
|
|
|
use gitbutler_core::types::Sensitive;
|
2024-03-31 00:27:56 +03:00
|
|
|
use gitbutler_core::{
|
2024-06-02 16:48:15 +03:00
|
|
|
git::credentials::{Credential, Helper, SshCredential},
|
2024-03-31 00:27:56 +03:00
|
|
|
keys, project_repository, projects, users,
|
|
|
|
};
|
|
|
|
|
2024-04-06 11:08:50 +03:00
|
|
|
use gitbutler_testsupport::{temp_dir, test_repository};
|
2024-03-29 12:04:26 +03:00
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
struct TestCase<'a> {
|
|
|
|
remote_url: &'a str,
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: Option<Sensitive<&'a str>>,
|
2024-03-29 12:04:26 +03:00
|
|
|
preferred_key: projects::AuthKey,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl TestCase<'_> {
|
|
|
|
fn run(&self) -> Vec<(String, Vec<Credential>)> {
|
|
|
|
let local_app_data = temp_dir();
|
|
|
|
|
2024-04-24 10:20:55 +03:00
|
|
|
let users = users::Controller::from_path(local_app_data.path());
|
2024-03-29 12:04:26 +03:00
|
|
|
let user = users::User {
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: self.github_access_token.map(|s| Sensitive(s.0.to_string())),
|
2024-03-29 12:04:26 +03:00
|
|
|
..Default::default()
|
|
|
|
};
|
|
|
|
users.set_user(&user).unwrap();
|
|
|
|
|
2024-04-24 10:20:55 +03:00
|
|
|
let keys = keys::Controller::from_path(local_app_data.path());
|
2024-06-02 16:48:15 +03:00
|
|
|
let helper = Helper::new(keys);
|
2024-03-29 12:04:26 +03:00
|
|
|
|
|
|
|
let (repo, _tmp) = test_repository();
|
2024-06-05 02:11:10 +03:00
|
|
|
repo.remote("origin", self.remote_url).unwrap();
|
2024-03-29 12:04:26 +03:00
|
|
|
let project = projects::Project {
|
|
|
|
path: repo.workdir().unwrap().to_path_buf(),
|
|
|
|
preferred_key: self.preferred_key.clone(),
|
|
|
|
..Default::default()
|
|
|
|
};
|
|
|
|
let project_repository = project_repository::Repository::open(&project).unwrap();
|
|
|
|
|
|
|
|
let flow = helper.help(&project_repository, "origin").unwrap();
|
|
|
|
flow.into_iter()
|
2024-06-02 00:30:25 +03:00
|
|
|
.map(|(remote, credentials)| (remote.url().as_ref().unwrap().to_string(), credentials))
|
2024-03-29 12:04:26 +03:00
|
|
|
.collect::<Vec<_>>()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod not_github {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
mod with_preferred_key {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn https() {
|
|
|
|
let test_case = TestCase {
|
|
|
|
remote_url: "https://gitlab.com/test-gitbutler/test.git",
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: Some(Sensitive("token")),
|
2024-03-29 12:04:26 +03:00
|
|
|
preferred_key: projects::AuthKey::Local {
|
|
|
|
private_key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
let flow = test_case.run();
|
|
|
|
assert_eq!(flow.len(), 1);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].0,
|
|
|
|
"git@gitlab.com:test-gitbutler/test.git".to_string(),
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].1,
|
|
|
|
vec![Credential::Ssh(SshCredential::Keyfile {
|
|
|
|
key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
passphrase: None,
|
|
|
|
})]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ssh() {
|
|
|
|
let test_case = TestCase {
|
|
|
|
remote_url: "git@gitlab.com:test-gitbutler/test.git",
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: Some(Sensitive("token")),
|
2024-03-29 12:04:26 +03:00
|
|
|
preferred_key: projects::AuthKey::Local {
|
|
|
|
private_key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
let flow = test_case.run();
|
|
|
|
assert_eq!(flow.len(), 1);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].0,
|
|
|
|
"git@gitlab.com:test-gitbutler/test.git".to_string(),
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].1,
|
|
|
|
vec![Credential::Ssh(SshCredential::Keyfile {
|
|
|
|
key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
passphrase: None,
|
|
|
|
})]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod github {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
mod without_github_token {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
mod with_preferred_key {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn https() {
|
|
|
|
let test_case = TestCase {
|
|
|
|
remote_url: "https://github.com/gitbutlerapp/gitbutler.git",
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: Some(Sensitive("token")),
|
2024-03-29 12:04:26 +03:00
|
|
|
preferred_key: projects::AuthKey::Local {
|
|
|
|
private_key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
let flow = test_case.run();
|
|
|
|
assert_eq!(flow.len(), 1);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].0,
|
|
|
|
"git@github.com:gitbutlerapp/gitbutler.git".to_string(),
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].1,
|
|
|
|
vec![Credential::Ssh(SshCredential::Keyfile {
|
|
|
|
key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
passphrase: None,
|
|
|
|
})]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn ssh() {
|
|
|
|
let test_case = TestCase {
|
|
|
|
remote_url: "git@github.com:gitbutlerapp/gitbutler.git",
|
2024-06-09 08:18:44 +03:00
|
|
|
github_access_token: Some(Sensitive("token")),
|
2024-03-29 12:04:26 +03:00
|
|
|
preferred_key: projects::AuthKey::Local {
|
|
|
|
private_key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
},
|
|
|
|
};
|
|
|
|
let flow = test_case.run();
|
|
|
|
assert_eq!(flow.len(), 1);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].0,
|
|
|
|
"git@github.com:gitbutlerapp/gitbutler.git".to_string(),
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
flow[0].1,
|
|
|
|
vec![Credential::Ssh(SshCredential::Keyfile {
|
|
|
|
key_path: PathBuf::from("/tmp/id_rsa"),
|
|
|
|
passphrase: None,
|
|
|
|
})]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|