From fc1e8a8a32926d79fc9f7cde4cdd68f58b88e280 Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Sun, 5 Jul 2026 18:03:11 +0000 Subject: [PATCH] test(mgmt): display_settings_surface stays read-only (gaming-rig now accepted) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old `..._and_forever_rejected` asserted a 400 for keep_alive=forever; now that it's accepted, that PUT succeeded and WROTE gaming-rig into the process-global prefs, racing other tests. Rewrite read-only: assert the surface (5 presets, effective, enforced axes) and read gaming-rig=forever off the preset list — no write. Acceptance is covered on-glass (.116) + the pure policy tests. Co-Authored-By: Claude Opus 4.8 (1M context) --- crates/punktfunk-host/src/mgmt.rs | 41 ++++++++++++++----------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/crates/punktfunk-host/src/mgmt.rs b/crates/punktfunk-host/src/mgmt.rs index 7002849..59cca65 100644 --- a/crates/punktfunk-host/src/mgmt.rs +++ b/crates/punktfunk-host/src/mgmt.rs @@ -2788,24 +2788,36 @@ mod tests { .unwrap() } - /// The display-management endpoints: GET returns the policy surface (presets + effective + - /// the Stage-0 enforced list); PUT rejects `keep_alive: forever` (the `gaming-rig` preset) - /// *before* persisting, so this stays read-only against the global policy store. + /// The display-management GET surface (presets + effective + the enforced-axes list). READ-ONLY + /// on purpose: `prefs()` is a process-global `OnceLock`, so a PUT here would clobber it and race + /// other tests running in the same process. `keep_alive: forever` (gaming-rig) is now accepted + /// (not rejected) — that acceptance is covered on-glass (`.116`) + by the pure `policy` tests, and + /// the `forever` value is read off the surfaced preset below without writing. #[tokio::test] - async fn display_settings_surface_and_forever_rejected() { + async fn display_settings_surface() { let app = test_app(test_state(), None); let (status, body) = send(&app, get_req("/api/v1/display/settings")).await; assert_eq!(status, StatusCode::OK); + let presets = body["presets"].as_array().expect("presets array"); assert_eq!( - body["presets"].as_array().map(|a| a.len()), - Some(5), + presets.len(), + 5, "all five named presets are surfaced for the console picker" ); assert!( body["effective"]["keep_alive"].is_object(), "the effective policy is echoed" ); + // gaming-rig surfaces keep_alive: forever (no longer rejected) — read it off the preset list. + let gaming = presets + .iter() + .find(|p| p["id"] == "gaming-rig") + .expect("gaming-rig preset surfaced"); + assert_eq!( + gaming["fields"]["keep_alive"]["mode"], "forever", + "gaming-rig is keep_alive: forever" + ); let enforced: Vec<&str> = body["enforced"] .as_array() .unwrap() @@ -2818,23 +2830,6 @@ mod tests { assert!(enforced.contains(&"mode_conflict")); assert!(enforced.contains(&"identity")); assert!(enforced.contains(&"layout")); - - // `gaming-rig` expands to keep_alive: forever → rejected at Stage 0 (before any write). - let put = axum::http::Request::put("/api/v1/display/settings") - .header("content-type", "application/json") - .body(Body::from( - serde_json::json!({ "preset": "gaming-rig" }).to_string(), - )) - .unwrap(); - let (status, body) = send(&app, put).await; - assert_eq!(status, StatusCode::BAD_REQUEST); - assert!( - body["error"] - .as_str() - .unwrap_or_default() - .contains("forever"), - "the rejection names the unsupported option" - ); } /// The display state/release endpoints are wired + auth-gated. On the test host no backend has