#![cfg(feature = "test-support")]
use axum::body::Body;
use axum::http::{Request, StatusCode};
use kyma_core::tenant::DEFAULT_TENANT;
use kyma_server::agent::local::{
NullCredentialStore, NullEnabledSkillsStore, NullEnginePreferenceStore,
};
use kyma_server::agent::AgentState;
use kyma_server::auth::{require_role_middleware, AuthBackend, AuthLayerState, EnvAuthBackend, Role};
use std::sync::Arc;
use tower::ServiceExt;
fn agent_app(state: &kyma_server::QueryState) -> axum::Router {
let agent_state = AgentState {
catalog: state.catalog.clone(),
format: state.format.clone(),
pool: None,
engines: Arc::new(NullEnginePreferenceStore),
credentials: Arc::new(NullCredentialStore),
tenant: DEFAULT_TENANT,
skills: Arc::new(NullEnabledSkillsStore),
mcp_url: None,
};
let backend: Arc<dyn AuthBackend> =
Arc::new(EnvAuthBackend::from_str("read-token:read,write-token:write"));
kyma_server::agent::router(agent_state).layer(axum::middleware::from_fn_with_state(
AuthLayerState {
backend,
required: Role::Read,
},
require_role_middleware,
))
}
async fn post_import(app: axum::Router, auth: Option<&str>) -> StatusCode {
let mut req = Request::builder()
.method("POST")
.uri("/memory/import")
.header("content-type", "application/json");
if let Some(tok) = auth {
req = req.header("authorization", format!("Bearer {tok}"));
}
let req = req
.body(Body::from(r#"{"memory_nodes":[],"memory_edges":[]}"#))
.unwrap();
app.oneshot(req).await.unwrap().status()
}
#[tokio::test]
async fn import_refuses_read_token_and_anonymous() {
let state = kyma_server::test_support::seeded_state_empty().await;
assert_eq!(
post_import(agent_app(&state), Some("read-token")).await,
StatusCode::FORBIDDEN,
"a read-only token must not be able to import (write) memory",
);
assert_eq!(
post_import(agent_app(&state), None).await,
StatusCode::UNAUTHORIZED,
"unauthenticated import must be rejected",
);
}