//! WP-12: /api/cluster mod common; use axum::http::StatusCode; use common::{get, post, test_app_with_admin}; use serde_json::json; const ADMIN: &str = "admin@example.com"; const PW: &str = "admin-password-123"; #[tokio::test] async fn overview_and_admin_actions() { let app = test_app_with_admin().await; let token = common::login(&app, ADMIN, PW).await.access; let res = get(&app, "/api/cluster/overview", Some(&token)).await; assert_eq!(res.status, StatusCode::OK, "{}", res.json); assert_eq!(res.json["nodes"][0]["version"], "v1.32.13"); let w = res.json["workloads"].as_array().unwrap(); assert!(w .iter() .any(|w| w["name"] == "gitea" && w["kind"] == "deployment")); assert!(res.json["images"].as_array().unwrap().len() >= 2); let base = "/api/cluster/workloads/gitea/deployment/gitea"; assert_eq!( post(&app, &format!("{base}/restart"), json!({}), Some(&token)) .await .status, StatusCode::NO_CONTENT ); assert_eq!( post( &app, &format!("{base}/scale"), json!({"replicas": 2}), Some(&token) ) .await .status, StatusCode::NO_CONTENT ); assert_eq!( post( &app, &format!("{base}/scale"), json!({"replicas": 500}), Some(&token) ) .await .status, StatusCode::UNPROCESSABLE_ENTITY ); assert_eq!( post( &app, &format!("{base}/image"), json!({"image": "gitea/gitea:1.23.0"}), Some(&token) ) .await .status, StatusCode::NO_CONTENT ); assert_eq!( post( &app, "/api/cluster/workloads/gitea/cronjob/x/restart", json!({}), Some(&token) ) .await .status, StatusCode::NOT_FOUND ); } #[tokio::test] async fn actions_are_admin_only_and_overview_needs_auth() { let app = test_app_with_admin().await; let admin = common::login(&app, ADMIN, PW).await.access; post(&app, "/api/users", json!({"email": "u@x.de", "display_name": "U", "password": "user-password-123", "role": "user"}), Some(&admin)).await; let user = common::login(&app, "u@x.de", "user-password-123") .await .access; assert_eq!( get(&app, "/api/cluster/overview", Some(&user)).await.status, StatusCode::OK ); assert_eq!( post( &app, "/api/cluster/workloads/gitea/deployment/gitea/restart", json!({}), Some(&user) ) .await .status, StatusCode::FORBIDDEN ); assert_eq!( get(&app, "/api/cluster/overview", None).await.status, StatusCode::UNAUTHORIZED ); }