node-app-manifest 7.5.21

Canonical manifest schema and validation contract for Node apps
Documentation
use node_app_manifest::{
    check_host_contract, required_features, AppManifest, HostFeature, HostFeatureSet,
    HostVersion, ManifestRejection,
};

fn load(name: &str) -> AppManifest {
    let path = format!("{}/fixtures/composed/{name}", env!("CARGO_MANIFEST_DIR"));
    let json = std::fs::read_to_string(&path).unwrap();
    AppManifest::from_json(&json).unwrap_or_else(|error| panic!("{name}: {error}"))
}

#[test]
fn incident_widgets_with_app_data_parse_on_this_host() {
    for name in ["friends-0.8.5.json", "message-1.1.3.json"] {
        let manifest = load(name);
        assert!(required_features(&manifest).contains(&HostFeature::UiWidgetData), "{name}");
        assert_eq!(check_host_contract(&manifest, &HostFeatureSet::current()), Ok(()), "{name}");
    }
}

#[test]
fn incident_widgets_are_rejected_precisely_for_7_1_17() {
    let manifest = load("friends-0.8.5.json");
    let rejection = check_host_contract(&manifest, &HostFeatureSet::at(HostVersion::new(7, 1, 17)));
    assert_eq!(
        rejection,
        Err(ManifestRejection::HostFeatureMissing {
            features: vec!["ui.widget-data".to_string()],
            min_host: Some(HostVersion::new(7, 2, 0)),
        })
    );
}