octra-sqlite 0.5.2

Real SQLite inside an Octra Circle, with a Rust CLI and client library
Documentation
use serde_json::Value;
use std::process::{Command, Stdio};

fn octra_sqlite() -> Command {
    Command::new(env!("CARGO_BIN_EXE_octra-sqlite"))
}

#[test]
fn limits_json_is_machine_readable_without_wallet() {
    let output = octra_sqlite()
        .args(["limits", "--json"])
        .output()
        .expect("run octra-sqlite limits --json");
    assert!(output.status.success());
    let value: Value = serde_json::from_slice(&output.stdout).unwrap();
    assert_eq!(value["ok"], true);
    assert_eq!(value["type"], "limits");
    assert_eq!(value["schema"], "octra-sqlite.cli.v1");
    assert_eq!(value["result"]["limit_error"], "result_limit_exceeded");
    assert!(
        value["trace"]["modes"]
            .as_array()
            .unwrap()
            .contains(&Value::String("summary".to_string()))
    );
}

#[test]
fn commands_json_is_machine_readable_without_wallet() {
    let output = octra_sqlite()
        .args(["commands", "--json"])
        .output()
        .expect("run octra-sqlite commands --json");
    assert!(output.status.success());
    let value: Value = serde_json::from_slice(&output.stdout).unwrap();
    assert_eq!(value["ok"], true);
    assert_eq!(value["type"], "commands");
    assert_eq!(value["schema"], "octra-sqlite.cli.v1");
    assert!(
        value["commands"]
            .as_array()
            .unwrap()
            .iter()
            .any(|command| command["command"] == "octra-sqlite DATABASE \"SQL\"")
    );
    assert!(
        value["json_envelopes"]
            .as_array()
            .unwrap()
            .contains(&Value::String("commands".to_string()))
    );
}

#[test]
fn json_errors_have_stable_shape_and_exit_code() {
    let output = octra_sqlite()
        .args(["check", "--json"])
        .stdin(Stdio::null())
        .output()
        .expect("run failing octra-sqlite check --json");
    assert!(!output.status.success());
    assert!(output.stdout.is_empty());
    let value: Value = serde_json::from_slice(&output.stderr).unwrap();
    assert_eq!(value["ok"], false);
    assert_eq!(value["type"], "error");
    assert_eq!(value["schema"], "octra-sqlite.cli.v1");
    assert_eq!(value["exit_code"], 1);
    assert!(value["error"]["code"].is_string());
    assert!(
        value["error"]["message"]
            .as_str()
            .unwrap()
            .contains("check requires")
    );
}