171 lines
4.9 KiB
Rust
171 lines
4.9 KiB
Rust
use super::*;
|
|
use crate::config::{
|
|
EndpointConfig, MirrorConfig, NamespaceKind, SiteConfig, TokenConfig, Visibility,
|
|
};
|
|
|
|
#[test]
|
|
fn verifies_github_hmac_signature() {
|
|
let body = br#"{"repository":{"name":"repo"}}"#;
|
|
let mut headers = HashMap::new();
|
|
headers.insert("x-github-event".to_string(), "push".to_string());
|
|
headers.insert(
|
|
"x-hub-signature-256".to_string(),
|
|
format!("sha256={}", hmac_sha256_hex(b"secret", body)),
|
|
);
|
|
|
|
assert!(verify_signature(
|
|
Some(&ProviderKind::Github),
|
|
&headers,
|
|
body,
|
|
"secret"
|
|
));
|
|
assert!(!verify_signature(
|
|
Some(&ProviderKind::Github),
|
|
&headers,
|
|
body,
|
|
"wrong"
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn parses_github_push_payload() {
|
|
let mut headers = HashMap::new();
|
|
headers.insert("x-github-event".to_string(), "push".to_string());
|
|
let value: Value = serde_json::from_str(
|
|
r#"{"repository":{"name":"repo","full_name":"alice/repo","owner":{"login":"alice"}}}"#,
|
|
)
|
|
.unwrap();
|
|
|
|
let event = parse_event(Some(ProviderKind::Github), &headers, &value).unwrap();
|
|
|
|
assert_eq!(event.repo, "repo");
|
|
assert_eq!(event.namespace.as_deref(), Some("alice"));
|
|
}
|
|
|
|
#[test]
|
|
fn parses_forgejo_push_payload() {
|
|
let mut headers = HashMap::new();
|
|
headers.insert("x-forgejo-event".to_string(), "push".to_string());
|
|
let value: Value = serde_json::from_str(
|
|
r#"{"repository":{"name":"repo","full_name":"azalea/repo","owner":{"username":"azalea"}}}"#,
|
|
)
|
|
.unwrap();
|
|
|
|
let provider = detect_provider(&headers);
|
|
let event = parse_event(provider.clone(), &headers, &value).unwrap();
|
|
|
|
assert_eq!(provider, Some(ProviderKind::Forgejo));
|
|
assert_eq!(event.repo, "repo");
|
|
assert_eq!(event.namespace.as_deref(), Some("azalea"));
|
|
}
|
|
|
|
#[test]
|
|
fn verifies_forgejo_hmac_signature() {
|
|
let body = br#"{"repository":{"name":"repo"}}"#;
|
|
let mut headers = HashMap::new();
|
|
headers.insert("x-forgejo-event".to_string(), "push".to_string());
|
|
headers.insert(
|
|
"x-forgejo-signature".to_string(),
|
|
format!("sha256={}", hmac_sha256_hex(b"secret", body)),
|
|
);
|
|
|
|
assert!(verify_signature(
|
|
Some(&ProviderKind::Forgejo),
|
|
&headers,
|
|
body,
|
|
"secret"
|
|
));
|
|
}
|
|
|
|
#[test]
|
|
fn parses_gitlab_push_payload() {
|
|
let mut headers = HashMap::new();
|
|
headers.insert("x-gitlab-event".to_string(), "Push Hook".to_string());
|
|
let value: Value = serde_json::from_str(
|
|
r#"{"project":{"path":"repo","path_with_namespace":"parent/alice/repo"}}"#,
|
|
)
|
|
.unwrap();
|
|
|
|
let event = parse_event(Some(ProviderKind::Gitlab), &headers, &value).unwrap();
|
|
|
|
assert_eq!(event.repo, "repo");
|
|
assert_eq!(event.namespace.as_deref(), Some("parent/alice"));
|
|
}
|
|
|
|
#[test]
|
|
fn matches_jobs_by_provider_and_namespace() {
|
|
let config = Config {
|
|
sites: vec![
|
|
site("github", ProviderKind::Github),
|
|
site("gitea", ProviderKind::Gitea),
|
|
],
|
|
mirrors: vec![MirrorConfig {
|
|
name: "sync-1".to_string(),
|
|
endpoints: vec![
|
|
endpoint("github", NamespaceKind::User, "alice"),
|
|
endpoint("gitea", NamespaceKind::User, "azalea"),
|
|
],
|
|
create_missing: true,
|
|
visibility: Visibility::Private,
|
|
allow_force: false,
|
|
}],
|
|
webhook: None,
|
|
};
|
|
let event = WebhookEvent {
|
|
provider: Some(ProviderKind::Github),
|
|
repo: "repo".to_string(),
|
|
namespace: Some("alice".to_string()),
|
|
};
|
|
|
|
let jobs = matching_jobs(&config, &event);
|
|
|
|
assert_eq!(jobs.len(), 1);
|
|
assert_eq!(jobs[0].group, "sync-1");
|
|
assert_eq!(jobs[0].repo, "repo");
|
|
}
|
|
|
|
#[test]
|
|
fn webhook_state_persists_installations() {
|
|
let temp = tempfile::TempDir::new().unwrap();
|
|
let endpoint = endpoint("github", NamespaceKind::User, "alice");
|
|
let key = webhook_installation_key("sync-1", &endpoint, "repo");
|
|
let mut state = WebhookState::default();
|
|
state.installations.insert(
|
|
key.clone(),
|
|
WebhookInstallation {
|
|
group: "sync-1".to_string(),
|
|
endpoint,
|
|
repo: "repo".to_string(),
|
|
url: "https://mirror.example.test/webhook".to_string(),
|
|
},
|
|
);
|
|
|
|
save_webhook_state(temp.path(), &state).unwrap();
|
|
let loaded = load_webhook_state(temp.path()).unwrap();
|
|
|
|
assert_eq!(loaded.installations[&key].repo, "repo");
|
|
assert_eq!(
|
|
loaded.installations[&key].url,
|
|
"https://mirror.example.test/webhook"
|
|
);
|
|
}
|
|
|
|
fn site(name: &str, provider: ProviderKind) -> SiteConfig {
|
|
SiteConfig {
|
|
name: name.to_string(),
|
|
provider,
|
|
base_url: "https://example.test".to_string(),
|
|
api_url: None,
|
|
token: TokenConfig::Value("secret".to_string()),
|
|
git_username: None,
|
|
}
|
|
}
|
|
|
|
fn endpoint(site: &str, kind: NamespaceKind, namespace: &str) -> EndpointConfig {
|
|
EndpointConfig {
|
|
site: site.to_string(),
|
|
kind,
|
|
namespace: namespace.to_string(),
|
|
}
|
|
}
|