Keep bootstrap, signing identity, config and resource-key allocation atomic with optional Repository intent. Preserve repository-present fingerprints for saved receipts; replay reads current authority at the initial key and never recreates missing assets. Provide explicit repository-free CLI creation, optional TUI/Web creation inputs, nullable generated contracts, and valid empty catalog/Worker paths. Retain existing authenticated non-owner viewing policy pending the T-717 authorization decision. Validation: root cargo check; server tests 639 lib + 11 bin; server-api 70 default / 77 typescript; client 52 lib + 2 integration; tui 337; yoi 11 lib + 120 bin. OpenAPI/TS freshness, cargo fmt and diff checks pass. Web check/build, 18 model tests, 268 component tests and Chromium 8 width/theme combinations pass; before/after visual evidence is documented in web/workspace/test/visual-review. Full Web suite has one independently reproduced baseline Ticket source-policy failure.
44 lines
1.6 KiB
Rust
44 lines
1.6 KiB
Rust
use client::{
|
|
BackendTarget, CreateBackendWorkspaceRepository, CreateBackendWorkspaceRequest, Target,
|
|
WorkerConnectionSelector,
|
|
};
|
|
|
|
#[test]
|
|
fn workspace_creation_request_preserves_operation_key_for_retry() {
|
|
let request = CreateBackendWorkspaceRequest {
|
|
operation_key: "workspace-create-1".to_string(),
|
|
display_name: "Alpha".to_string(),
|
|
repository: Some(CreateBackendWorkspaceRepository {
|
|
repository_key: "main".to_string(),
|
|
uri: "/srv/repos/alpha".to_string(),
|
|
default_ref: Some("develop".to_string()),
|
|
}),
|
|
};
|
|
|
|
assert_eq!(request.clone(), request);
|
|
assert_eq!(request.operation_key, "workspace-create-1");
|
|
let json = serde_json::to_value(&request).unwrap();
|
|
assert_eq!(json["operation_key"], "workspace-create-1");
|
|
assert_eq!(json["repository"]["repository_key"], "main");
|
|
assert_eq!(json["repository"]["uri"], "/srv/repos/alpha");
|
|
assert!(json.get("operation_id").is_none());
|
|
assert!(json["repository"].get("display_name").is_none());
|
|
assert!(json["repository"].get("source").is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn backend_worker_connection_requires_explicit_workspace_scope() {
|
|
let target = BackendTarget::new("http://127.0.0.1:8787", None::<String>);
|
|
let error = match target.connect_worker(WorkerConnectionSelector::new("runtime-a", "worker-a"))
|
|
{
|
|
Ok(_) => panic!("unscoped Backend worker connection must fail"),
|
|
Err(error) => error,
|
|
};
|
|
|
|
assert!(
|
|
error
|
|
.to_string()
|
|
.contains("workspace selection is required")
|
|
);
|
|
}
|