2025-02-05 05:23:13 +01:00
|
|
|
use forgejo_api::structs::*;
|
|
|
|
|
|
|
|
mod common;
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn user() {
|
|
|
|
let api = common::login();
|
|
|
|
|
|
|
|
let user_opt = CreateUserOption {
|
|
|
|
created_at: None,
|
|
|
|
email: "pipis@noreply.example.org".into(),
|
|
|
|
full_name: None,
|
|
|
|
login_name: None,
|
|
|
|
must_change_password: None,
|
|
|
|
password: Some("userpass".into()),
|
|
|
|
restricted: Some(false),
|
|
|
|
send_notify: Some(true),
|
|
|
|
source_id: None,
|
|
|
|
username: "Pipis".into(),
|
|
|
|
visibility: Some("public".into()),
|
|
|
|
};
|
|
|
|
let _ = api
|
|
|
|
.admin_create_user(user_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create user");
|
|
|
|
|
|
|
|
let query = AdminSearchUsersQuery::default();
|
|
|
|
let users = api
|
|
|
|
.admin_search_users(query)
|
|
|
|
.await
|
|
|
|
.expect("failed to search users");
|
|
|
|
assert!(
|
2025-02-05 05:24:00 +01:00
|
|
|
users.iter().any(|u| u.login.as_ref().unwrap() == "Pipis"),
|
2025-02-05 05:23:13 +01:00
|
|
|
"could not find new user"
|
|
|
|
);
|
|
|
|
let query = AdminGetAllEmailsQuery::default();
|
|
|
|
let users = api
|
|
|
|
.admin_get_all_emails(query)
|
|
|
|
.await
|
|
|
|
.expect("failed to search emails");
|
|
|
|
assert!(
|
|
|
|
users
|
|
|
|
.iter()
|
2025-02-05 05:24:00 +01:00
|
|
|
.any(|u| u.email.as_ref().unwrap() == "pipis@noreply.example.org"),
|
2025-02-05 05:23:13 +01:00
|
|
|
"could not find new user"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn org() {
|
|
|
|
let api = common::login();
|
|
|
|
|
|
|
|
let user_opt = CreateUserOption {
|
|
|
|
created_at: None,
|
|
|
|
email: "org-owner@noreply.example.org".into(),
|
|
|
|
full_name: None,
|
|
|
|
login_name: None,
|
|
|
|
must_change_password: None,
|
|
|
|
password: Some("userpass".into()),
|
|
|
|
restricted: Some(false),
|
|
|
|
send_notify: Some(true),
|
|
|
|
source_id: None,
|
|
|
|
username: "OrgOwner".into(),
|
|
|
|
visibility: Some("public".into()),
|
|
|
|
};
|
|
|
|
let _ = api
|
|
|
|
.admin_create_user(user_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create user");
|
|
|
|
|
|
|
|
let org_opt = CreateOrgOption {
|
|
|
|
description: None,
|
|
|
|
email: None,
|
|
|
|
full_name: None,
|
|
|
|
location: None,
|
|
|
|
repo_admin_change_team_access: None,
|
|
|
|
username: "test-org".into(),
|
|
|
|
visibility: Some(CreateOrgOptionVisibility::Public),
|
|
|
|
website: None,
|
|
|
|
};
|
|
|
|
let _ = api
|
|
|
|
.admin_create_org("OrgOwner", org_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create org");
|
|
|
|
let query = AdminGetAllOrgsQuery::default();
|
|
|
|
assert!(
|
|
|
|
!api.admin_get_all_orgs(query).await.unwrap().is_empty(),
|
|
|
|
"org list empty"
|
|
|
|
);
|
|
|
|
let rename_opt = RenameUserOption {
|
|
|
|
new_username: "Bepis".into(),
|
|
|
|
};
|
|
|
|
api.admin_rename_user("Pipis", rename_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to rename user");
|
|
|
|
let query = AdminDeleteUserQuery { purge: Some(true) };
|
|
|
|
api.admin_delete_user("Bepis", query)
|
|
|
|
.await
|
|
|
|
.expect("failed to delete user");
|
|
|
|
let query = AdminDeleteUserQuery { purge: Some(true) };
|
|
|
|
assert!(
|
|
|
|
api.admin_delete_user("Ghost", query).await.is_err(),
|
|
|
|
"deleting fake user should fail"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn key() {
|
|
|
|
let api = common::login();
|
|
|
|
|
|
|
|
let user_opt = CreateUserOption {
|
|
|
|
created_at: None,
|
|
|
|
email: "key-holder@noreply.example.org".into(),
|
|
|
|
full_name: None,
|
|
|
|
login_name: None,
|
|
|
|
must_change_password: None,
|
|
|
|
password: Some("userpass".into()),
|
|
|
|
restricted: Some(false),
|
|
|
|
send_notify: Some(true),
|
|
|
|
source_id: None,
|
|
|
|
username: "KeyHolder".into(),
|
|
|
|
visibility: Some("public".into()),
|
|
|
|
};
|
|
|
|
let _ = api
|
|
|
|
.admin_create_user(user_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create user");
|
|
|
|
|
|
|
|
let key_opt = CreateKeyOption {
|
|
|
|
key: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN68ehQAsbGEwlXPa2AxbAh1QxFQrtRel2jeC0hRlPc1 user@noreply.example.org".into(),
|
|
|
|
read_only: None,
|
|
|
|
title: "Example Key".into(),
|
|
|
|
};
|
|
|
|
let key = api
|
|
|
|
.admin_create_public_key("KeyHolder", key_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create key");
|
|
|
|
api.admin_delete_user_public_key("KeyHolder", key.id.unwrap() as u64)
|
|
|
|
.await
|
|
|
|
.expect("failed to delete key");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn cron() {
|
|
|
|
let api = common::login();
|
|
|
|
|
|
|
|
let query = AdminCronListQuery::default();
|
|
|
|
let crons = api
|
|
|
|
.admin_cron_list(query)
|
|
|
|
.await
|
|
|
|
.expect("failed to get crons list");
|
2025-02-05 05:24:00 +01:00
|
|
|
api.admin_cron_run(crons.first().expect("no crons").name.as_ref().unwrap())
|
2025-02-05 05:23:13 +01:00
|
|
|
.await
|
|
|
|
.expect("failed to run cron");
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn hook() {
|
|
|
|
let api = common::login();
|
|
|
|
let hook_opt = CreateHookOption {
|
|
|
|
active: None,
|
|
|
|
authorization_header: None,
|
|
|
|
branch_filter: None,
|
|
|
|
config: CreateHookOptionConfig {
|
|
|
|
content_type: "json".into(),
|
|
|
|
url: url::Url::parse("http://test.local/").unwrap(),
|
|
|
|
additional: Default::default(),
|
|
|
|
},
|
|
|
|
events: Some(Vec::new()),
|
|
|
|
r#type: CreateHookOptionType::Gitea,
|
|
|
|
};
|
|
|
|
// yarr har har me matey this is me hook
|
|
|
|
let hook = api
|
|
|
|
.admin_create_hook(hook_opt)
|
|
|
|
.await
|
|
|
|
.expect("failed to create hook");
|
|
|
|
let edit_hook = EditHookOption {
|
|
|
|
active: Some(true),
|
|
|
|
authorization_header: None,
|
|
|
|
branch_filter: None,
|
|
|
|
config: None,
|
|
|
|
events: None,
|
|
|
|
};
|
|
|
|
api.admin_edit_hook(hook.id.unwrap() as u64, edit_hook)
|
|
|
|
.await
|
|
|
|
.expect("failed to edit hook");
|
|
|
|
api.admin_delete_hook(hook.id.unwrap() as u64)
|
|
|
|
.await
|
|
|
|
.expect("failed to delete hook");
|
|
|
|
}
|
2025-02-05 05:24:00 +01:00
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn quota_group() {
|
|
|
|
let api = common::login();
|
|
|
|
|
|
|
|
let user_opts = CreateUserOption {
|
|
|
|
created_at: None,
|
|
|
|
email: "1997@example.com".into(),
|
|
|
|
full_name: None,
|
|
|
|
login_name: None,
|
|
|
|
must_change_password: None,
|
|
|
|
password: Some("dialtone".into()),
|
|
|
|
restricted: None,
|
|
|
|
send_notify: None,
|
|
|
|
source_id: None,
|
|
|
|
username: "salesman".into(),
|
|
|
|
visibility: None,
|
|
|
|
};
|
|
|
|
api.admin_create_user(user_opts)
|
|
|
|
.await
|
|
|
|
.expect("failed to create user");
|
|
|
|
|
|
|
|
let group = CreateQuotaGroupOptions {
|
|
|
|
name: Some("no doing anything".into()),
|
|
|
|
rules: Some(vec![CreateQuotaRuleOptions {
|
|
|
|
limit: Some(0),
|
|
|
|
name: Some("blah".into()),
|
|
|
|
subjects: Some(vec![CreateQuotaRuleOptionsSubjects::SizeAll]),
|
|
|
|
}]),
|
|
|
|
};
|
|
|
|
let quota_group = api
|
|
|
|
.admin_create_quota_group(group)
|
|
|
|
.await
|
|
|
|
.expect("failed to create quota group");
|
|
|
|
|
|
|
|
api.admin_add_user_to_quota_group("no doing anything", "salesman")
|
|
|
|
.await
|
|
|
|
.expect("failed to add user to quota group");
|
|
|
|
|
|
|
|
assert!(quota_group
|
|
|
|
.name
|
|
|
|
.as_ref()
|
|
|
|
.is_some_and(|name| name == "no doing anything"));
|
|
|
|
assert!(quota_group
|
|
|
|
.rules
|
|
|
|
.as_ref()
|
|
|
|
.is_some_and(|rules| rules.len() == 1));
|
|
|
|
|
|
|
|
let quota_groups = api
|
|
|
|
.admin_list_quota_groups()
|
|
|
|
.await
|
|
|
|
.expect("failed to list quota groups");
|
|
|
|
assert_eq!(quota_groups.len(), 1);
|
|
|
|
assert_eq!("a_groups[0], "a_group);
|
|
|
|
|
|
|
|
let quota_info = api
|
|
|
|
.admin_get_user_quota("salesman")
|
|
|
|
.await
|
|
|
|
.expect("failed to get user quota");
|
|
|
|
let usage = quota_info
|
|
|
|
.used
|
|
|
|
.expect("quota info missing usage info")
|
|
|
|
.size
|
|
|
|
.expect("quota info missing size info");
|
|
|
|
assert!(usage
|
|
|
|
.git
|
|
|
|
.is_some_and(|git| git.lfs.is_some_and(|lfs| lfs == 0)));
|
|
|
|
assert!(usage
|
|
|
|
.repos
|
|
|
|
.as_ref()
|
|
|
|
.is_some_and(|repos| repos.public.is_some_and(|lfs| lfs == 0)));
|
|
|
|
assert!(usage
|
|
|
|
.repos
|
|
|
|
.is_some_and(|repos| repos.private.is_some_and(|lfs| lfs == 0)));
|
|
|
|
assert!(usage
|
|
|
|
.assets
|
|
|
|
.is_some_and(|assets| assets.artifacts.is_some_and(|lfs| lfs == 0)));
|
|
|
|
|
|
|
|
api.admin_remove_rule_from_quota_group("no doing anything", "blah")
|
|
|
|
.await
|
|
|
|
.expect("failed to delete rule from quota group");
|
|
|
|
api.admin_remove_user_from_quota_group("no doing anything", "salesman")
|
|
|
|
.await
|
|
|
|
.expect("failed to remove user from quota group");
|
|
|
|
api.admin_delete_quota_group("no doing anything")
|
|
|
|
.await
|
|
|
|
.expect("failed to delete quota group");
|
|
|
|
}
|