docs(http): mark http/adapters/to-openapi completed + fix formatting

to_openapi gateway projection merged: 5-endpoint OpenAPI doc (ADR-042/045), pure
projection, info.version 1.0.0, error fidelity (ADR-023). 230 tests pass. Clippy clean.
This commit is contained in:
2026-07-01 23:37:35 +00:00
parent ccaac7e157
commit b3ab6ef097
3 changed files with 38 additions and 19 deletions

View File

@@ -695,7 +695,6 @@ mod tests {
assert!(response.contains("location: https://example.com")); assert!(response.contains("location: https://example.com"));
} }
#[tokio::test] #[tokio::test]
async fn openapi_json_route_serves_gateway_spec() { async fn openapi_json_route_serves_gateway_spec() {
let adapter = HttpAdapter::new(provider(), empty_registry()); let adapter = HttpAdapter::new(provider(), empty_registry());

View File

@@ -315,7 +315,10 @@ mod tests {
let ctx = hub_root_context( let ctx = hub_root_context(
"hub-acl-ok", "hub-acl-ok",
&["ui/dragged"], &["ui/dragged"],
Some(CompositionAuthority::new("hub", vec!["ui:write".to_string()])), Some(CompositionAuthority::new(
"hub",
vec!["ui:write".to_string()],
)),
env.clone(), env.clone(),
); );
@@ -342,7 +345,10 @@ mod tests {
let ctx = hub_root_context( let ctx = hub_root_context(
"hub-acl-deny", "hub-acl-deny",
&["ui/dragged"], &["ui/dragged"],
Some(CompositionAuthority::new("hub", vec!["ui:read".to_string()])), Some(CompositionAuthority::new(
"hub",
vec!["ui:read".to_string()],
)),
env.clone(), env.clone(),
); );
@@ -499,10 +505,12 @@ mod tests {
assert!(conn.pending().lock().contains("ws-sub-root")); assert!(conn.pending().lock().contains("ws-sub-root"));
assert!(conn.pending().lock().contains("ws-sub-child")); assert!(conn.pending().lock().contains("ws-sub-child"));
let failed = conn let failed =
.pending() conn.pending()
.lock() .lock()
.fail_all(alknet_call::protocol::wire::CallError::internal("connection closed")); .fail_all(alknet_call::protocol::wire::CallError::internal(
"connection closed",
));
assert!(failed.contains(&"ws-sub-root".to_string())); assert!(failed.contains(&"ws-sub-root".to_string()));
assert!(failed.contains(&"ws-sub-child".to_string())); assert!(failed.contains(&"ws-sub-child".to_string()));
assert!(conn.pending().lock().is_empty()); assert!(conn.pending().lock().is_empty());
@@ -526,10 +534,12 @@ mod tests {
) )
}; };
let failed = conn let failed =
.pending() conn.pending()
.lock() .lock()
.fail_all(alknet_call::protocol::wire::CallError::internal("connection closed")); .fail_all(alknet_call::protocol::wire::CallError::internal(
"connection closed",
));
assert!(failed.contains(&"hub-call-inflight".to_string())); assert!(failed.contains(&"hub-call-inflight".to_string()));
let result = tokio::time::timeout(Duration::from_millis(100), rx).await; let result = tokio::time::timeout(Duration::from_millis(100), rx).await;
@@ -566,7 +576,10 @@ mod tests {
.await; .await;
let envelope: EventEnvelope = response.into(); let envelope: EventEnvelope = response.into();
assert_eq!(envelope.r#type, EVENT_RESPONDED); assert_eq!(envelope.r#type, EVENT_RESPONDED);
assert_eq!(envelope.payload.get("output"), Some(&serde_json::json!({ "v": 9 }))); assert_eq!(
envelope.payload.get("output"),
Some(&serde_json::json!({ "v": 9 }))
);
} }
#[tokio::test] #[tokio::test]
@@ -667,10 +680,10 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn browser_identity_resolved_at_upgrade_is_stored_on_connection() { async fn browser_identity_resolved_at_upgrade_is_stored_on_connection() {
let provider = Arc::new( let provider = Arc::new(StaticIdentityProvider::new().with_token(
StaticIdentityProvider::new() "browser-token",
.with_token("browser-token", identity_with_scopes("browser-user", &["ui:read"])), identity_with_scopes("browser-user", &["ui:read"]),
); ));
let registry = echo_registry(); let registry = echo_registry();
let dp = dispatcher(registry, Arc::clone(&provider) as Arc<dyn IdentityProvider>); let dp = dispatcher(registry, Arc::clone(&provider) as Arc<dyn IdentityProvider>);
@@ -693,4 +706,4 @@ mod tests {
let peer_ids = composed_env.peer_ids(); let peer_ids = composed_env.peer_ids();
assert_eq!(peer_ids, vec!["browser-user".to_string()]); assert_eq!(peer_ids, vec!["browser-user".to_string()]);
} }
} }

View File

@@ -1,7 +1,7 @@
--- ---
id: http/adapters/to-openapi id: http/adapters/to-openapi
name: Implement to_openapi gateway projection (5-endpoint OpenAPI doc, info.version semver, ADR-042/045) name: Implement to_openapi gateway projection (5-endpoint OpenAPI doc, info.version semver, ADR-042/045)
status: pending status: completed
depends_on: [http/server/gateway-endpoints, http/gateway/gateway-dispatch-spine] depends_on: [http/server/gateway-endpoints, http/gateway/gateway-dispatch-spine]
scope: moderate scope: moderate
risk: medium risk: medium
@@ -185,4 +185,11 @@ out of scope.
## Summary ## Summary
> To be filled on completion > Implemented to_openapi(registry: &OperationRegistry) -> OpenAPISpec in src/adapters/
> to_openapi.rs — pure projection generating fixed 5-endpoint gateway doc (/search,
> /schema, /call, /batch, /subscribe) with info.version = 1.0.0 (ADR-045). /call responses
> carry protocol-level errors (400/401/403/404/500/504) + operation-level errors from
> registry error_schemas mapped by http_status (ADR-023). Per-caller operation surface
> NOT preloaded (discovered via /search, ADR-042). /subscribe response is text/event-stream.
> Wired GET /openapi.json in adapter.rs replacing placeholder 501. 16 new tests. 230
> total tests pass. Clippy clean. Formatting fixed during merge.