sylphx-cli 0.1.0

Sylphx Platform CLI — dogfoods the Rust Management SDK
//! Launch the real `sylphx` binary against the wire-mock server.
//! Proves the shipped entrypoint dogfoods the Management SDK (not stubs).

use assert_cmd::cargo::cargo_bin;
use predicates::prelude::*;
use sylphx_wire_mock::WireMockServer;
use tokio::process::Command;

#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn cli_all_shipped_commands_twice() {
    let mock = WireMockServer::start().await;
    let base = mock.management_base_url();
    let bin = cargo_bin!("sylphx");

    let runs: &[&[&str]] = &[
        &["health", "--json"],
        &["whoami", "--json"],
        &["orgs", "list", "--json"],
        &["projects", "list", "--json"],
        &["projects", "get", "prj_demo", "--json"],
        &["api", "get", "/projects", "--json"],
        &["version-info", "--json"],
    ];

    for run in 1..=2 {
        for args in runs {
            let mut cmd = Command::new(&bin);
            if *args != &["version-info", "--json"] {
                cmd.args(["--token", "svc_test", "--api-url", &base]);
            }
            let output = cmd.args(*args).output().await.expect("spawn");
            assert!(
                output.status.success(),
                "run {run} {:?} failed: {}",
                args,
                String::from_utf8_lossy(&output.stderr)
            );
            let stdout = String::from_utf8_lossy(&output.stdout);
            assert!(!stdout.trim().is_empty(), "run {run} {:?} empty stdout", args);
            match args[0] {
                "health" => assert!(stdout.contains("ok"), "run {run}: {stdout}"),
                "whoami" => assert!(stdout.contains("user_1"), "run {run}: {stdout}"),
                "orgs" => assert!(stdout.contains("acme"), "run {run}: {stdout}"),
                "projects" if args.get(1) == Some(&"list") => {
                    assert!(stdout.contains("prj_demo"), "run {run}: {stdout}")
                }
                "projects" if args.get(1) == Some(&"get") => {
                    assert!(stdout.contains("Demo"), "run {run}: {stdout}")
                }
                "api" => {
                    assert!(stdout.contains("\"status\""), "run {run}: {stdout}");
                    assert!(stdout.contains("demo"), "run {run}: {stdout}");
                }
                "version-info" => {
                    assert!(stdout.contains("sylphx-sdk-management"), "run {run}: {stdout}");
                    assert!(stdout.contains("shippedCommands"), "run {run}: {stdout}");
                }
                _ => {}
            }
        }
    }

    mock.shutdown().await;
}

#[test]
fn cli_rejects_missing_token() {
    let bin = cargo_bin!("sylphx");
    let assert = assert_cmd::Command::new(bin)
        .env_remove("SYLPHX_TOKEN")
        .args(["health"])
        .assert();
    assert
        .failure()
        .stderr(predicate::str::contains("SYLPHX_TOKEN").or(predicate::str::contains("token")));
}