WP-12: contract and failing tests for the Kubernetes overview
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
105
backend/crates/api/tests/cluster.rs
Normal file
105
backend/crates/api/tests/cluster.rs
Normal file
@ -0,0 +1,105 @@
|
||||
//! 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
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user