Files
cloudlysis/runner/tests/jetstream_integration.rs
Vlad Durnea 90c307016d
Some checks failed
ci / rust (push) Failing after 2m21s
ci / ui (push) Failing after 28s
images / build-and-push (push) Failing after 18s
transport: complete M0–M7
shared: add stream+consumer policy helpers; NATS context header builder

aggregate/runner/projection: centralize stream validation and header usage; set bounded consumer params

projection: add QueryService gRPC and wire into main; settings include PROJECTION_GRPC_ADDR

gateway: gRPC routing to Projection/Runner with deadlines; bounded read-only retries; pooled gRPC channels (bounded LRU+TTL); admin proxy forwards to gRPC; probes use concurrency limiter + TTL cache

runner: add RunnerAdmin gRPC server (drain, status, reload) and wire into main; settings include RUNNER_GRPC_ADDR

tests: add gateway authz for runner admin, projection tenant isolation, runner admin drain semantics

docs: update TRANSPORT_DEVELOPMENT_PLAN to reflect completed milestones and details
2026-03-30 14:24:14 +03:00

50 lines
1.5 KiB
Rust

use async_nats::jetstream::{self, stream::Config as StreamConfig};
use runner::config::Settings;
use runner::stream::JetStreamClient;
use runner::types::{
CommandId, EffectName, EffectResultEnvelope, EffectResultType, MessageMetadata, TenantId,
};
use serde_json::json;
#[test]
#[ignore]
fn jetstream_connects_and_can_publish_effect_result() {
let Ok(nats_url) = std::env::var("RUNNER_TEST_NATS_URL") else {
return;
};
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async move {
let client = async_nats::connect(&nats_url).await.unwrap();
let js = jetstream::new(client);
let _ = js
.get_or_create_stream(StreamConfig {
name: "AGGREGATE_EVENTS".to_string(),
subjects: vec!["tenant.*.aggregate.*.*".to_string()],
..Default::default()
})
.await
.unwrap();
let settings = Settings {
nats_url,
..Default::default()
};
let runner_js = JetStreamClient::connect(&settings).await.unwrap();
let result = EffectResultEnvelope {
tenant_id: TenantId::new("t1"),
command_id: CommandId::new("c1"),
effect_name: EffectName::new("noop"),
result_type: EffectResultType::Succeeded,
payload: json!({"ok": true}),
timestamp: chrono::Utc::now(),
metadata: MessageMetadata::default(),
};
runner_js.publish_effect_result(&result).await.unwrap();
});
}