marple-db 0.2.1

Rust SDK for the MarpleDB API
Documentation
use marple_db::{Stream, StreamType};
use serde_json::json;

#[test]
fn deserializes_typed_file_stream_fields() {
    let stream: Stream = serde_json::from_value(json!({
        "id": 3,
        "name": "IMC",
        "type": "files",
        "datapool": "default",
        "description": "Race telemetry",
        "n_datasets": 4,
        "n_datapoints": 9_481_422_904_u64,
        "cold_bytes": 63_331_968_278_u64,
        "hot_bytes": 357_048_320_u64,
        "plugin": "imc",
        "plugin_args": "--unzip",
        "layer_shifts": [0, 1],
        "insight_workspace": "workspace-a"
    }))
    .expect("stream JSON");

    assert_eq!(stream.id, 3);
    assert_eq!(stream.name, "IMC");
    assert_eq!(stream.stream_type, StreamType::Files);
    assert_eq!(stream.datapool, "default");
    assert_eq!(stream.description, "Race telemetry");
    assert_eq!(stream.n_datasets, Some(4));
    assert_eq!(stream.n_datapoints, Some(9_481_422_904));
    assert_eq!(stream.cold_bytes, Some(63_331_968_278));
    assert_eq!(stream.hot_bytes, Some(357_048_320));
    assert_eq!(stream.plugin.as_deref(), Some("imc"));
    assert_eq!(stream.plugin_args.as_deref(), Some("--unzip"));
    assert_eq!(stream.extra.get("layer_shifts"), Some(&json!([0, 1])));
    assert_eq!(
        stream.extra.get("insight_workspace"),
        Some(&json!("workspace-a"))
    );
    assert!(stream.extra.get("datapool").is_none());
}

#[test]
fn deserializes_realtime_stream_without_file_plugin_fields() {
    let stream: Stream = serde_json::from_value(json!({
        "id": 4,
        "name": "Live",
        "type": "realtime",
        "datapool": "default",
        "description": null,
        "n_datasets": null,
        "n_datapoints": null,
        "cold_bytes": null,
        "hot_bytes": null
    }))
    .expect("stream JSON");

    assert_eq!(stream.stream_type, StreamType::Realtime);
    assert_eq!(stream.datapool, "default");
    assert_eq!(stream.description, "");
    assert_eq!(stream.plugin, None);
    assert_eq!(stream.plugin_args, None);
}

#[test]
fn stream_type_and_datapool_are_required() {
    let missing_type = serde_json::from_value::<Stream>(json!({
        "id": 3,
        "name": "IMC",
        "datapool": "default"
    }));
    assert!(missing_type.is_err());

    let missing_datapool = serde_json::from_value::<Stream>(json!({
        "id": 3,
        "name": "IMC",
        "type": "files"
    }));
    assert!(missing_datapool.is_err());

    let unknown_type = serde_json::from_value::<Stream>(json!({
        "id": 3,
        "name": "IMC",
        "type": "archive",
        "datapool": "default"
    }));
    assert!(unknown_type.is_err());
}