feat: M8.2 Gateway Queue Adapter for SQS via api.riotpiao.com
- Unified QueueAdapter trait for concurrent dual-write operations - GatewayQueueAdapter routes messages via api.riotpiao.com with X-Service: sqs header - TokenProvider abstraction: StaticTokenProvider + AuthentikTokenProvider - JWT bearer token support (from Authentik OAuth2) - InMemoryQueueAdapter for testing - Base64 encoding/decoding for SQS message bodies - HTTP/REST integration (no direct gRPC complexity) - 8 unit tests + comprehensive documentation - Supports long-polling (ReceiveMessage), visibility timeout, DLQ Uses standard SQS API patterns: - SendMessage: Queue chunk for dual-write processing - ReceiveMessage: Long-poll up to 10 messages, 20s wait - DeleteMessage: Acknowledge on success - ChangeMessageVisibility: Retry on failure - SendToDLQ: After max retries Files: - crates/mem-cli/src/queue_adapter.rs (310 LOC) - crates/mem-cli/src/gateway_queue_adapter.rs (530 LOC) - tests/it_gateway_queue_adapter.rs (110 LOC) - docs/M8.2-GATEWAY_QUEUE_ADAPTER.md (400 LOC)
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
//! Quick test for gateway queue adapter
|
||||
//! Tests only the queue_adapter and gateway_queue_adapter modules
|
||||
|
||||
#[test]
|
||||
fn test_queue_adapter_trait_exists() {
|
||||
// Just verify the trait is defined and can be used
|
||||
use mem_cli::queue_adapter::QueueAdapter;
|
||||
let _ = std::any::type_name::<dyn QueueAdapter>();
|
||||
assert!(true);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_static_token_provider() {
|
||||
use mem_cli::gateway_queue_adapter::StaticTokenProvider;
|
||||
use mem_cli::gateway_queue_adapter::TokenProvider;
|
||||
|
||||
let provider = StaticTokenProvider::new("test-token-xyz".to_string());
|
||||
assert_eq!(provider.token().unwrap(), "test-token-xyz");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_gateway_adapter_construction() {
|
||||
use mem_cli::gateway_queue_adapter::GatewayQueueAdapter;
|
||||
|
||||
let adapter = GatewayQueueAdapter::with_static_token(
|
||||
"https://api.riotpiao.com".to_string(),
|
||||
"test-jwt".to_string(),
|
||||
);
|
||||
|
||||
assert_eq!(adapter.queue_name("myproj"), "poimen-chunks-myproj");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_base64_helpers() {
|
||||
let original = "hello world";
|
||||
let encoded = base64::encode(original.as_bytes());
|
||||
let decoded = String::from_utf8(base64::decode(encoded.as_bytes()).unwrap()).unwrap();
|
||||
|
||||
assert_eq!(original, decoded);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_queue_message_creation() {
|
||||
use mem_cli::queue_adapter::QueueMessage;
|
||||
use uuid::Uuid;
|
||||
|
||||
let msg = QueueMessage {
|
||||
message_id: "msg-123".to_string(),
|
||||
chunk_id: Uuid::new_v4(),
|
||||
body: "test".to_string(),
|
||||
receive_count: 0,
|
||||
receipt_handle: "handle-123".to_string(),
|
||||
project: "test".to_string(),
|
||||
attributes: std::collections::HashMap::new(),
|
||||
};
|
||||
|
||||
assert_eq!(msg.message_id, "msg-123");
|
||||
assert_eq!(msg.receive_count, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user