Files
2026-09-16 10:58:29 +02:00

125 lines
5.0 KiB
Rust

// file: crates/ksp-app-raw-transaction-ingest-desk/unit_tests/dto_route.rs
// version: 5
#[test]
fn pre_005_route_ids_are_exact_and_stably_ordered() {
let foundation = crate::RawIngestRouteFoundationDto::scaffold();
assert_eq!(foundation.route_ids.len(), 5);
let value = serde_json::to_value(foundation.route_ids);
assert!(value.is_ok());
if let std::result::Result::Ok(value) = value {
assert_eq!(
value,
serde_json::json!(["yellowstone-hydrated", "standard-logs-hydrated", "standard-block-direct", "helius-transaction-hydrated", "http-block-polling"])
);
}
}
#[test]
fn pre_005_route_states_are_exact_without_runtime_claims() {
let foundation = crate::RawIngestRouteFoundationDto::scaffold();
assert_eq!(foundation.states.len(), 7);
let value = serde_json::to_value(foundation.states);
assert!(value.is_ok());
if let std::result::Result::Ok(value) = value {
assert_eq!(value, serde_json::json!(["unavailable", "configured", "starting", "running", "stopping", "stopped", "faulted"]));
}
}
#[test]
fn pre_006_unavailable_reason_codes_are_exact_and_safe() {
let values = [
crate::RawIngestRouteUnavailableReason::ProfileUnresolved,
crate::RawIngestRouteUnavailableReason::NetworkMismatch,
crate::RawIngestRouteUnavailableReason::MissingHttpGetBlock,
crate::RawIngestRouteUnavailableReason::MissingHttpGetTransaction,
crate::RawIngestRouteUnavailableReason::MissingHttpBlockScan,
crate::RawIngestRouteUnavailableReason::MissingWsLogsCapability,
crate::RawIngestRouteUnavailableReason::MissingWsBlockCapability,
crate::RawIngestRouteUnavailableReason::MissingHeliusTransactionCapability,
crate::RawIngestRouteUnavailableReason::MissingYellowstoneGrpc,
crate::RawIngestRouteUnavailableReason::MissingRequiredSecret,
];
let serialized = serde_json::to_value(values);
assert!(serialized.is_ok());
if let std::result::Result::Ok(serialized) = serialized {
assert_eq!(
serialized,
serde_json::json!([
"profile_unresolved",
"network_mismatch",
"missing_http_get_block",
"missing_http_get_transaction",
"missing_http_block_scan",
"missing_ws_logs_capability",
"missing_ws_block_capability",
"missing_helius_transaction_capability",
"missing_yellowstone_grpc",
"missing_required_secret"
])
);
}
}
#[test]
fn pre_008_runtime_acknowledgement_serializes_only_safe_logical_identity_and_state() {
let dto = crate::RawIngestRouteRuntimeDto {
commitment: crate::RawIngestCommitment::Confirmed,
inventory_generation: 7,
network: "mainnet".to_owned(),
profile_id: "mainnet".to_owned(),
route_id: crate::RawIngestRouteId::StandardBlockDirect,
state: crate::RawIngestRouteState::Running,
};
let value = serde_json::to_value(dto);
assert!(value.is_ok());
if let std::result::Result::Ok(value) = value {
assert_eq!(
value,
serde_json::json!({
"commitment": "confirmed",
"inventoryGeneration": 7,
"network": "mainnet",
"profileId": "mainnet",
"routeId": "standard-block-direct",
"state": "running"
})
);
let encoded = value.to_string();
for forbidden in ["endpoint", "provider", "connectionUri", "sourceKey", "workerId", "payload"] {
assert!(!encoded.contains(forbidden));
}
}
}
#[test]
fn pre_012_route_requests_reject_unknown_fields_and_bound_free_form_profile_identity() {
let start = serde_json::from_value::<crate::RawIngestRouteStartRequestDto>(serde_json::json!({
"commitment": "confirmed",
"inventoryGeneration": 1,
"profileId": "mainnet",
"routeId": "http-block-polling",
"endpointUrl": "https://forbidden.invalid"
}));
assert!(start.is_err());
let stop = serde_json::from_value::<crate::RawIngestRouteStopRequestDto>(serde_json::json!({
"profileId": "mainnet",
"routeId": "http-block-polling",
"workerId": "forbidden"
}));
assert!(stop.is_err());
let oversized = crate::RawIngestRouteStartRequestDto {
commitment: crate::RawIngestCommitment::Confirmed,
inventory_generation: 1,
profile_id: "x".repeat(super::RAW_INGEST_PROFILE_ID_MAX_BYTES + 1),
route_id: crate::RawIngestRouteId::HttpBlockPolling,
};
let oversized = oversized.validate_logical_identity();
assert!(oversized.is_err());
if let std::result::Result::Err(error) = oversized {
assert_eq!(error.code(), crate::ERROR_CODE_ROUTE_REQUEST_INVALID);
}
let control = crate::RawIngestRouteStopRequestDto { profile_id: "mainnet\n".to_owned(), route_id: crate::RawIngestRouteId::HttpBlockPolling };
assert!(control.validate_logical_identity().is_err());
}