zixcel-github 0.1.1

Policy-neutral GitHub API wrapper boundary for Zixcel
Documentation
use zixcel_github::{parse_snapshot_artifact, parse_text_artifact, parse_workflow_inputs_artifact};

#[test]
fn closed_text_and_inputs_artifacts_accept_only_bounded_declared_fields() {
    let text = br#"{"schema":"zixcel://github/text-artifact/v1","text":"body"}"#;
    assert_eq!(parse_text_artifact(text).expect("text").text, "body");
    assert!(
        parse_text_artifact(
            br#"{"schema":"zixcel://github/text-artifact/v1","text":"body","extra":true}"#,
        )
        .is_err()
    );
    let inputs =
        br#"{"schema":"zixcel://github/workflow-inputs-artifact/v1","inputs":{"release":"v1"}}"#;
    assert_eq!(
        parse_workflow_inputs_artifact(inputs)
            .expect("inputs")
            .inputs["release"],
        "v1"
    );
    assert!(
        parse_workflow_inputs_artifact(
            br#"{"schema":"zixcel://github/workflow-inputs-artifact/v1","inputs":{" bad ":"v1"}}"#,
        )
        .is_err()
    );
}

#[test]
fn snapshot_rejects_duplicate_traversal_and_invalid_base64() {
    let valid = br#"{"schema":"zixcel://github/source-snapshot-artifact/v1","branch":"main","message":"release","files":[{"path":"README.md","mode":"100644","content_base64":"aGVsbG8="}]}"#;
    let parsed = parse_snapshot_artifact(valid).expect("snapshot");
    assert_eq!(parsed.files[0].path, "README.md");
    for invalid in [
        br#"{"schema":"zixcel://github/source-snapshot-artifact/v1","branch":"main","message":"release","files":[{"path":"../README.md","mode":"100644","content_base64":"aGVsbG8="}]}"#.as_slice(),
        br#"{"schema":"zixcel://github/source-snapshot-artifact/v1","branch":"main","message":"release","files":[{"path":"README.md","mode":"100644","content_base64":"aGVsbG8="},{"path":"README.md","mode":"100755","content_base64":"aGVsbG8="}]}"#.as_slice(),
        br#"{"schema":"zixcel://github/source-snapshot-artifact/v1","branch":"main","message":"release","files":[{"path":"README.md","mode":"100644","content_base64":"***"}]}"#.as_slice(),
    ] {
        assert!(parse_snapshot_artifact(invalid).is_err());
    }
}