use super::*;
#[test]
fn database_errors_carry_a_machine_readable_type_discriminator() {
let cases: Vec<(Error, &str)> = vec![
(Error::DatabaseLocked, "database_locked"),
(
Error::CorruptEmbedding {
id: "mem-1".to_string(),
reason: "not enough bytes".to_string(),
},
"corrupt_embedding",
),
(
Error::InvalidBlobSize {
expected: crate::embedding::EMBEDDING_DIMS * 4,
actual: 4,
},
"invalid_blob_size",
),
(
Error::MismatchedDimensions {
expected: 384,
actual: 768,
},
"mismatched_dimensions",
),
];
for (err, expected_type) in cases {
let data = rmcp::ErrorData::from(err)
.data
.unwrap_or_else(|| panic!("{expected_type} must carry a data payload"));
assert_eq!(
data["type"].as_str(),
Some(expected_type),
"expected the {expected_type} discriminator"
);
}
}
#[test]
fn the_corrupt_embedding_discriminator_carries_the_row_id() {
let err = Error::CorruptEmbedding {
id: "mem-42".to_string(),
reason: "invalid BLOB size".to_string(),
};
let data = rmcp::ErrorData::from(err).data.expect("data payload");
assert_eq!(data["id"].as_str(), Some("mem-42"));
assert_eq!(data["expected"], serde_json::Value::Null);
}