diff options
author | Cyborus <cyborus@cyborus.xyz> | 2024-05-14 19:02:52 +0200 |
---|---|---|
committer | Cyborus <cyborus@cyborus.xyz> | 2024-05-27 18:38:54 +0200 |
commit | f159316f031cdb5759bcb7f2b1ce75ac92f9a236 (patch) | |
tree | abecf0f4c593affec9cebb288ac078afb17bd102 | |
parent | split tests into multiple files (diff) | |
download | forgejo-api-f159316f031cdb5759bcb7f2b1ce75ac92f9a236.tar.xz forgejo-api-f159316f031cdb5759bcb7f2b1ce75ac92f9a236.zip |
split tests into smaller tests
-rw-r--r-- | tests/admin.rs | 88 | ||||
-rw-r--r-- | tests/common/mod.rs | 12 | ||||
-rw-r--r-- | tests/repo.rs | 167 | ||||
-rw-r--r-- | tests/user.rs | 78 |
4 files changed, 237 insertions, 108 deletions
diff --git a/tests/admin.rs b/tests/admin.rs index a8e7e1d..06aed66 100644 --- a/tests/admin.rs +++ b/tests/admin.rs @@ -3,8 +3,8 @@ use forgejo_api::structs::*; mod common; #[tokio::test] -async fn admin() { - let api = common::get_api(); +async fn user() { + let api = common::login(); let user_opt = CreateUserOption { created_at: None, @@ -48,6 +48,29 @@ async fn admin() { .is_some(), "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, @@ -60,7 +83,7 @@ async fn admin() { website: None, }; let _ = api - .admin_create_org("Pipis", org_opt) + .admin_create_org("OrgOwner", org_opt) .await .expect("failed to create org"); let query = AdminGetAllOrgsQuery::default(); @@ -68,20 +91,6 @@ async fn admin() { !api.admin_get_all_orgs(query).await.unwrap().is_empty(), "org list empty" ); - - 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("Pipis", key_opt) - .await - .expect("failed to create key"); - api.admin_delete_user_public_key("Pipis", key.id.unwrap()) - .await - .expect("failed to delete key"); - let rename_opt = RenameUserOption { new_username: "Bepis".into(), }; @@ -97,6 +106,47 @@ async fn admin() { 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()) + .await + .expect("failed to delete key"); +} + +#[tokio::test] +async fn cron() { + let api = common::login(); let query = AdminCronListQuery::default(); let crons = api @@ -106,7 +156,11 @@ async fn admin() { api.admin_cron_run(&crons.get(0).expect("no crons").name.as_ref().unwrap()) .await .expect("failed to run cron"); +} +#[tokio::test] +async fn hook() { + let api = common::login(); let hook_opt = CreateHookOption { active: None, authorization_header: None, diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 07d772f..63ae02c 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -1,7 +1,17 @@ use forgejo_api::Forgejo; -pub fn get_api() -> Forgejo { +pub fn login() -> Forgejo { let url = url::Url::parse(&std::env::var("FORGEJO_API_CI_INSTANCE_URL").unwrap()).unwrap(); let token = std::env::var("FORGEJO_API_CI_TOKEN").unwrap(); Forgejo::new(forgejo_api::Auth::Token(&token), url).unwrap() } + +pub fn login_pass(username: &str, password: &str) -> Forgejo { + let url = url::Url::parse(&std::env::var("FORGEJO_API_CI_INSTANCE_URL").unwrap()).unwrap(); + let auth = forgejo_api::Auth::Password { + username, + password, + mfa: None, + }; + Forgejo::new(auth, url).unwrap() +} diff --git a/tests/repo.rs b/tests/repo.rs index bce5d77..a4e3bf5 100644 --- a/tests/repo.rs +++ b/tests/repo.rs @@ -2,37 +2,34 @@ use forgejo_api::structs::*; mod common; -#[tokio::test] -async fn repo() { - let api = common::get_api(); +struct Git { + dir: &'static std::path::Path, +} + +impl Git { + fn new<T: AsRef<std::path::Path> + ?Sized>(path: &'static T) -> Self { + let dir = path.as_ref(); + std::fs::create_dir_all(dir).unwrap(); + Self { dir } + } - tokio::fs::create_dir("./test_repo").await.unwrap(); - let git = || { + fn run(&self, args: &[impl AsRef<std::ffi::OsStr>]) { let mut cmd = std::process::Command::new("git"); - cmd.current_dir("./test_repo"); - cmd - }; - let _ = git() - .args(["config", "--global", "init.defaultBranch", "main"]) - .status() - .unwrap(); - let _ = git().args(["init"]).status().unwrap(); - let _ = git() - .args(["config", "user.name", "TestingAdmin"]) - .status() - .unwrap(); - let _ = git() - .args(["config", "user.email", "admin@noreply.example.org"]) - .status() - .unwrap(); - tokio::fs::write("./test_repo/README.md", "# Test\nThis is a test repo") + cmd.current_dir(self.dir); + let _ = cmd.args(args).status().unwrap(); + } +} + +async fn basic_repo(api: &forgejo_api::Forgejo, git: &Git, name: &str) -> Repository { + git.run(&["config", "--global", "init.defaultBranch", "main"]); + git.run(&["init"]); + git.run(&["config", "user.name", "TestingAdmin"]); + git.run(&["config", "user.email", "admin@noreply.example.org"]); + tokio::fs::write(&git.dir.join("README.md"), "# Test\nThis is a test repo") .await .unwrap(); - let _ = git().args(["add", "."]).status().unwrap(); - let _ = git() - .args(["commit", "-m", "initial commit"]) - .status() - .unwrap(); + git.run(&["add", "."]); + git.run(&["commit", "-m", "initial commit"]); let repo_opt = CreateRepoOption { auto_init: Some(false), @@ -41,7 +38,7 @@ async fn repo() { gitignores: Some("".into()), issue_labels: Some("".into()), license: Some("".into()), - name: "test".into(), + name: name.into(), object_format_name: None, private: Some(false), readme: None, @@ -58,36 +55,36 @@ async fn repo() { "repo owner is not \"TestingAdmin\"" ); assert!( - remote_repo.name.as_ref().unwrap() == "test", - "repo owner is not \"test\"" + remote_repo.name.as_ref().unwrap() == name, + "repo name is not \"{name}\"" ); - tokio::time::sleep(std::time::Duration::from_secs(3)).await; let mut remote_url = remote_repo.clone_url.clone().unwrap(); remote_url.set_username("TestingAdmin").unwrap(); remote_url.set_password(Some("password")).unwrap(); - let _ = git() - .args(["remote", "add", "origin", remote_url.as_str()]) - .status() - .unwrap(); - let _ = git() - .args(["push", "-u", "origin", "main"]) - .status() - .unwrap(); + git.run(&["remote", "add", "origin", remote_url.as_str()]); + git.run(&["push", "-u", "origin", "main"]); + + remote_repo +} + +#[tokio::test] +async fn pull_request() { + let api = common::login(); + + let git = Git::new("./test_repos/pr"); + let _ = basic_repo(&api, &git, "pr-test").await; + git.run(&["switch", "-c", "test"]); - let _ = git().args(["switch", "-c", "test"]).status().unwrap(); tokio::fs::write( - "./test_repo/example.rs", + "./test_repos/pr/example.rs", "fn add_one(x: u32) -> u32 { x + 1 }", ) .await .unwrap(); - let _ = git().args(["add", "."]).status().unwrap(); - let _ = git().args(["commit", "-m", "egg"]).status().unwrap(); - let _ = git() - .args(["push", "-u", "origin", "test"]) - .status() - .unwrap(); + git.run(&["add", "."]); + git.run(&["commit", "-m", "egg"]); + git.run(&["push", "-u", "origin", "test"]); let pr_opt = CreatePullRequestOption { assignee: None, @@ -101,20 +98,27 @@ async fn repo() { title: Some("test pr".into()), }; let pr = api - .repo_create_pull_request("TestingAdmin", "test", pr_opt) + .repo_create_pull_request("TestingAdmin", "pr-test", pr_opt) .await .expect("couldn't create pr"); - tokio::time::sleep(std::time::Duration::from_secs(3)).await; + let is_merged = api - .repo_pull_request_is_merged("TestingAdmin", "test", pr.number.unwrap()) + .repo_pull_request_is_merged("TestingAdmin", "pr-test", pr.number.unwrap()) .await .is_ok(); assert!(!is_merged, "pr should not yet be merged"); + let pr_files_query = RepoGetPullRequestFilesQuery::default(); let (_, _) = api - .repo_get_pull_request_files("TestingAdmin", "test", pr.number.unwrap(), pr_files_query) + .repo_get_pull_request_files( + "TestingAdmin", + "pr-test", + pr.number.unwrap(), + pr_files_query, + ) .await .unwrap(); + let merge_opt = MergePullRequestOption { r#do: MergePullRequestOptionDo::Merge, merge_commit_id: None, @@ -125,20 +129,27 @@ async fn repo() { head_commit_id: None, merge_when_checks_succeed: None, }; - api.repo_merge_pull_request("TestingAdmin", "test", pr.number.unwrap(), merge_opt) + + api.repo_merge_pull_request("TestingAdmin", "pr-test", pr.number.unwrap(), merge_opt) .await .expect("couldn't merge pr"); let is_merged = api - .repo_pull_request_is_merged("TestingAdmin", "test", pr.number.unwrap()) + .repo_pull_request_is_merged("TestingAdmin", "pr-test", pr.number.unwrap()) .await .is_ok(); assert!(is_merged, "pr should be merged"); - let _ = git().args(["fetch"]).status().unwrap(); - let _ = git().args(["pull"]).status().unwrap(); +} + +#[tokio::test] +async fn release() { + let api = common::login(); + + let git = Git::new("./test_repos/release"); + let _ = basic_repo(&api, &git, "release-test").await; let query = RepoListReleasesQuery::default(); assert!( - api.repo_list_releases("TestingAdmin", "test", query) + api.repo_list_releases("TestingAdmin", "release-test", query) .await .unwrap() .is_empty(), @@ -150,7 +161,7 @@ async fn repo() { tag_name: "v1.0".into(), target: None, }; - api.repo_create_tag("TestingAdmin", "test", tag_opt) + api.repo_create_tag("TestingAdmin", "release-test", tag_opt) .await .expect("failed to create tag"); @@ -163,7 +174,7 @@ async fn repo() { target_commitish: None, }; let release = api - .repo_create_release("TestingAdmin", "test", release_opt) + .repo_create_release("TestingAdmin", "release-test", release_opt) .await .expect("failed to create release"); let edit_release = EditReleaseOption { @@ -174,16 +185,21 @@ async fn repo() { tag_name: None, target_commitish: None, }; - api.repo_edit_release("TestingAdmin", "test", release.id.unwrap(), edit_release) - .await - .expect("failed to edit release"); + api.repo_edit_release( + "TestingAdmin", + "release-test", + release.id.unwrap(), + edit_release, + ) + .await + .expect("failed to edit release"); let release_by_tag = api - .repo_get_release_by_tag("TestingAdmin", "test", "v1.0") + .repo_get_release_by_tag("TestingAdmin", "release-test", "v1.0") .await .expect("failed to find release"); let release_latest = api - .repo_get_latest_release("TestingAdmin", "test") + .repo_get_latest_release("TestingAdmin", "release-test") .await .expect("failed to find latest release"); assert!(release_by_tag == release_latest, "releases not equal"); @@ -191,7 +207,7 @@ async fn repo() { let attachment = api .repo_create_release_attachment( "TestingAdmin", - "test", + "release-test", release.id.unwrap(), b"This is a file!".to_vec(), RepoCreateReleaseAttachmentQuery { @@ -204,7 +220,7 @@ async fn repo() { &*api .download_release_attachment( "TestingAdmin", - "test", + "release-test", release.id.unwrap(), attachment.id.unwrap() ) @@ -214,29 +230,40 @@ async fn repo() { "couldn't download attachment" ); let _zip_archive = api - .repo_get_archive("TestingAdmin", "test", "v1.0.zip") + .repo_get_archive("TestingAdmin", "release-test", "v1.0.zip") .await .unwrap(); let _tar_archive = api - .repo_get_archive("TestingAdmin", "test", "v1.0.tar.gz") + .repo_get_archive("TestingAdmin", "release-test", "v1.0.tar.gz") .await .unwrap(); // check these contents when their return value is fixed api.repo_delete_release_attachment( "TestingAdmin", - "test", + "release-test", release.id.unwrap(), attachment.id.unwrap(), ) .await .expect("failed to deleted attachment"); - api.repo_delete_release("TestingAdmin", "test", release.id.unwrap()) + api.repo_delete_release("TestingAdmin", "release-test", release.id.unwrap()) .await .expect("failed to delete release"); - api.repo_delete_tag("TestingAdmin", "test", "v1.0") + api.repo_delete_tag("TestingAdmin", "release-test", "v1.0") .await .expect("failed to delete release"); } + +#[tokio::test] +async fn delete_repo() { + let api = common::login(); + let git = Git::new("./test_repos/delete"); + let _ = basic_repo(&api, &git, "delete-test").await; + + api.repo_delete("TestingAdmin", "delete-test") + .await + .expect("failed to delete repo"); +} diff --git a/tests/user.rs b/tests/user.rs index 48e9d18..fb02088 100644 --- a/tests/user.rs +++ b/tests/user.rs @@ -1,10 +1,10 @@ -use forgejo_api::{structs::*, Forgejo}; +use forgejo_api::structs::*; mod common; #[tokio::test] -async fn user() { - let api = common::get_api(); +async fn myself() { + let api = common::login(); let myself = api.user_get_current().await.unwrap(); assert!(myself.is_admin.unwrap(), "user should be admin"); @@ -19,31 +19,67 @@ async fn user() { myself, myself_indirect, "result of `myself` does not match result of `get_user`" ); +} + +#[tokio::test] +async fn follow() { + let api = common::login(); let query = UserListFollowingQuery::default(); let following = api .user_list_following("TestingAdmin", query) .await .unwrap(); - assert_eq!(following, Vec::new(), "following list not empty"); + assert!(following.is_empty(), "following list not empty"); let query = UserListFollowersQuery::default(); let followers = api .user_list_followers("TestingAdmin", query) .await .unwrap(); - assert_eq!(followers, Vec::new(), "follower list not empty"); - - let url = url::Url::parse(&std::env::var("FORGEJO_API_CI_INSTANCE_URL").unwrap()).unwrap(); - let password_api = Forgejo::new( - forgejo_api::Auth::Password { - username: "TestingAdmin", - password: "password", - mfa: None, - }, - url, - ) - .expect("failed to log in using username and password"); + assert!(followers.is_empty(), "follower list not empty"); + + let option = CreateUserOption { + created_at: None, + email: "follower@testing".into(), + full_name: None, + login_name: None, + must_change_password: Some(false), + password: Some("password".into()), + restricted: None, + send_notify: None, + source_id: None, + username: "Follower".into(), + visibility: None, + }; + let _ = api.admin_create_user(option).await.unwrap(); + let new_user = common::login_pass("Follower", "password"); + + new_user + .user_current_put_follow("TestingAdmin") + .await + .unwrap(); + api.user_current_put_follow("Follower").await.unwrap(); + + let query = UserListFollowingQuery::default(); + let following = api + .user_list_following("TestingAdmin", query) + .await + .unwrap(); + assert!(!following.is_empty(), "following list empty"); + + let query = UserListFollowersQuery::default(); + let followers = api + .user_list_followers("TestingAdmin", query) + .await + .unwrap(); + assert!(!followers.is_empty(), "follower list empty"); +} + +#[tokio::test] +async fn password_login() { + let api = common::login(); + let password_api = common::login_pass("TestingAdmin", "password"); assert!( api.user_get_current().await.unwrap() == password_api.user_get_current().await.unwrap(), @@ -53,7 +89,7 @@ async fn user() { #[tokio::test] async fn oauth2_login() { - let api = common::get_api(); + let api = common::login(); let opt = forgejo_api::structs::CreateOAuth2ApplicationOptions { confidential_client: Some(true), name: Some("Test Application".into()), @@ -129,7 +165,7 @@ async fn oauth2_login() { // Redeem the code and check it works let url = url::Url::parse(&base_url).unwrap(); - let api = Forgejo::new(forgejo_api::Auth::None, url.clone()).unwrap(); + let api = forgejo_api::Forgejo::new(forgejo_api::Auth::None, url.clone()).unwrap(); let request = forgejo_api::structs::OAuthTokenRequest::Confidential { client_id: &client_id, @@ -139,7 +175,8 @@ async fn oauth2_login() { }; let token = api.oauth_get_access_token(request).await.unwrap(); let token_api = - Forgejo::new(forgejo_api::Auth::OAuth2(&token.access_token), url.clone()).unwrap(); + forgejo_api::Forgejo::new(forgejo_api::Auth::OAuth2(&token.access_token), url.clone()) + .unwrap(); let myself = token_api.user_get_current().await.unwrap(); assert_eq!(myself.login.as_deref(), Some("TestingAdmin")); @@ -149,7 +186,8 @@ async fn oauth2_login() { client_secret: &client_secret, }; let token = token_api.oauth_get_access_token(request).await.unwrap(); - let token_api = Forgejo::new(forgejo_api::Auth::OAuth2(&token.access_token), url).unwrap(); + let token_api = + forgejo_api::Forgejo::new(forgejo_api::Auth::OAuth2(&token.access_token), url).unwrap(); let myself = token_api.user_get_current().await.unwrap(); assert_eq!(myself.login.as_deref(), Some("TestingAdmin")); } |