From 5329a93e3ea861b7a431139dd723ded772c745e2 Mon Sep 17 00:00:00 2001 From: Hare Date: Fri, 30 Oct 2026 07:39:15 +0900 Subject: [PATCH] test: preserve saved policy fixtures and uncertain Plugin cancellation evidence --- .../worker_operation_authorization_tests.rs | 4 +-- .../src/server_plugin_controller_tests.rs | 27 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/crates/workspace-server/src/server/tests/worker_operation_authorization_tests.rs b/crates/workspace-server/src/server/tests/worker_operation_authorization_tests.rs index 900cea084..3e3c88ed5 100644 --- a/crates/workspace-server/src/server/tests/worker_operation_authorization_tests.rs +++ b/crates/workspace-server/src/server/tests/worker_operation_authorization_tests.rs @@ -520,7 +520,7 @@ async fn backend_control_grant_does_not_replace_exact_operation_use_permission() wrong_workspace, ] { permissions.push(workspace_permission("worker.create")); - f.assign(permissions, vec![]).await; + f.seed_saved_policy(permissions, vec![]); assert_backend_denied(&f, &f.source, &target, Some(StatusCode::FORBIDDEN)).await; } f.assign(vec![operation_permission("worker.messaging")], vec![]) @@ -604,7 +604,7 @@ async fn saved_targeted_message_permissions_preserve_target_direction_and_reject let target = f.child("saved-target", vec![]).await; let other = f.child("saved-other-target", vec![]).await; let saved = target_permission(legacy, &target); - let policy = f.assign(vec![saved.clone()], vec![]).await; + let policy = f.seed_saved_policy(vec![saved.clone()], vec![]); assert_eq!( policy.execution, vec![saved.clone()], diff --git a/crates/workspace-server/src/server_plugin_controller_tests.rs b/crates/workspace-server/src/server_plugin_controller_tests.rs index 51e4ad172..416afb246 100644 --- a/crates/workspace-server/src/server_plugin_controller_tests.rs +++ b/crates/workspace-server/src/server_plugin_controller_tests.rs @@ -1012,18 +1012,23 @@ mod plugin_controller_tests { .unwrap(); finish(&mut connection, protocol::RunResult::Cancelled).await; peer.closed().await; - let cancelled: bool = f - .api - .config_store - .with_conn(|conn| { - Ok(conn.query_row( - "SELECT cancelled FROM plugin_invocations WHERE workspace_id=?1 AND invocation_id=?2", - rusqlite::params![TEST_WORKSPACE_ID, effect.0], |row| row.get(0))?) - }) - .unwrap(); + // The Controller bounds cancellation acknowledgement. If the owner call + // misses that deadline, cancellation is unknown, not confirmed. In both + // cases the already-admitted effect must remain consumed and may never + // expose a successful response or be re-keyed on restore. + let (state, response, error): (String, Option, Option) = f.api.config_store.with_conn(|conn| { + Ok(conn.query_row("SELECT state,response_status,error_json FROM plugin_effect_receipts WHERE workspace_id=?1 AND invocation_id=?2 AND effect_key='status-v1'", + rusqlite::params![TEST_WORKSPACE_ID, effect.0], |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?)))?) + }).unwrap(); + assert!(matches!(state.as_str(), "pending" | "completed")); assert!( - cancelled, - "Controller cancellation must reach the durable Host owner" + response.is_none(), + "cancelled submission must not publish an HTTPS success" + ); + let error: server_api::PluginHostError = serde_json::from_str(&error.unwrap()).unwrap(); + assert_eq!( + error.effect, + server_api::PluginEffectObservation::Indeterminate ); assert_eq!( f.requests.lock().unwrap().len(),