diff --git a/src/client.rs b/src/client.rs index b3ab04f..c3ac711 100644 --- a/src/client.rs +++ b/src/client.rs @@ -35,6 +35,13 @@ impl VssClient { if status.is_success() { let response = GetObjectResponse::decode(&payload[..])?; + + if response.value.is_none() { + return Err(VssError::InternalServerError( + "VSS Server API Violation, expected value in GetObjectResponse but found none".to_string(), + )); + } + Ok(response) } else { Err(VssError::new(status, payload)) diff --git a/tests/tests.rs b/tests/tests.rs index d5f6d62..c12151e 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -173,6 +173,27 @@ mod tests { mock_server.expect(1).assert(); } + #[tokio::test] + async fn test_get_response_without_value() { + let base_url = mockito::server_url(); + let vss_client = VssClient::new(&base_url); + + // GetObjectResponse with None value + let mock_response = GetObjectResponse { value: None, ..Default::default() }; + let mock_server = mockito::mock("POST", GET_OBJECT_ENDPOINT) + .with_status(200) + .with_body(&mock_response.encode_to_vec()) + .create(); + + let get_result = vss_client + .get_object(&GetObjectRequest { store_id: "store".to_string(), key: "k1".to_string() }) + .await; + assert!(matches!(get_result.unwrap_err(), VssError::InternalServerError { .. })); + + // Verify 1 request hit the server + mock_server.expect(1).assert(); + } + #[tokio::test] async fn test_invalid_request_err_handling() { let base_url = mockito::server_url();