sharepoint-cli 0.0.10

Agent-friendly SharePoint Online CLI with JSON output, structured exit codes, and schema introspection
Documentation
use assert_cmd::Command;

fn isolated() -> (tempfile::TempDir, Command) {
    let dir = tempfile::tempdir().unwrap();
    let mut command = Command::cargo_bin("sharepoint").unwrap();
    command
        .env_clear()
        .env("PATH", std::env::var("PATH").unwrap_or_default())
        .env("HOME", dir.path())
        .env("XDG_CONFIG_HOME", dir.path())
        .env("XDG_CACHE_HOME", dir.path());
    (dir, command)
}

#[test]
fn init_requires_explicit_values_when_non_interactive() {
    let (_dir, mut command) = isolated();
    let out = command.args(["--output", "text", "init"]).output().unwrap();
    assert!(!out.status.success());
    let combined = format!(
        "{}{}",
        String::from_utf8_lossy(&out.stdout),
        String::from_utf8_lossy(&out.stderr)
    );
    assert!(combined.contains("--tenant"), "got: {combined}");
}

#[test]
fn init_can_configure_quietly_without_login() {
    let (dir, mut command) = isolated();
    let out = command
        .args([
            "--quiet",
            "init",
            "--tenant",
            "contoso.onmicrosoft.com",
            "--client-id",
            "00000000-0000-0000-0000-000000000000",
            "--default-site",
            "Marketing",
            "--read-only",
            "--no-login",
        ])
        .output()
        .unwrap();
    assert!(
        out.status.success(),
        "{}",
        String::from_utf8_lossy(&out.stderr)
    );
    let result: serde_json::Value = serde_json::from_slice(&out.stdout).unwrap();
    assert_eq!(result["signed_in"], false);
    assert_eq!(result["read_only"], true);

    let config_path = result["config_path"].as_str().unwrap();
    assert!(
        std::path::Path::new(config_path).starts_with(dir.path()),
        "config escaped isolated home: {config_path}"
    );
    let config = std::fs::read_to_string(config_path).unwrap();
    assert!(config.contains("contoso.onmicrosoft.com"));
    assert!(config.contains("default_site = \"Marketing\""));
    assert!(config.contains("read_only = true"));
}