feat(panel): add modular landing page builder, public landing page, and hosted launcher downloads

This commit is contained in:
SCOPEDD committed 2026-09-29 02:32:48 -04:00
1 parent 3043f3ab42
commit 4b79f69c20
10 files changed
+1413 -3

No files matched your search

+30
View File
@@ -223,3 +223,33 @@ async fn settings_never_leak_curseforge_key() {
let (s, _) = t.call("PUT", "/api/admin/settings", Some(&admin), Some(json!({"public_url": "ftp://nope"}))).await;
assert_eq!(s, StatusCode::BAD_REQUEST, "public URL must be http(s)");
}
#[tokio::test]
async fn landing_page_config_and_permissions() {
let t = setup().await;
// 1. Public landing endpoint accessible without authentication
let (s, v) = t.call("GET", "/api/v1/landing", None, None).await;
assert_eq!(s, StatusCode::OK);
assert_eq!(v["brand_name"], "SCOPENET");
assert_eq!(v["enabled"], true);
assert!(v["blocks"].as_array().unwrap().len() >= 5);
// 2. Unauthenticated user cannot modify landing config
let (s, _) = t.call("PUT", "/api/admin/landing", None, Some(json!({"brand_name": "Hacked"}))).await;
assert_eq!(s, StatusCode::UNAUTHORIZED);
// 3. Admin can update landing config
let admin = t.login("admin", "supersecret").await;
let mut updated = v.clone();
updated["brand_name"] = json!("PixelCraft");
updated["hero_title"] = json!("Welcome to PixelCraft");
let (s, v2) = t.call("PUT", "/api/admin/landing", Some(&admin), Some(updated)).await;
assert_eq!(s, StatusCode::OK);
assert_eq!(v2["brand_name"], "PixelCraft");
assert_eq!(v2["hero_title"], "Welcome to PixelCraft");
// 4. Public endpoint reflects the updated config
let (s, v3) = t.call("GET", "/api/v1/landing", None, None).await;
assert_eq!(s, StatusCode::OK);
assert_eq!(v3["brand_name"], "PixelCraft");
}