fabro/lib/crates/fabro-cli/tests/it/cmd/parse.rs
Bryan Helmkamp 819facbb1e refactor(cli): deglobalize server and storage target flags
Move --storage-dir and --server-url off GlobalArgs and onto the
leaf commands that actually honor them.

This aligns help, parser behavior, and env-var wiring with the
current command architecture while preserving the intended model
and exec targeting semantics.
2026-04-05 16:06:42 -04:00

135 lines
3.2 KiB
Rust

use fabro_test::{fabro_snapshot, test_context};
#[test]
fn help() {
let context = test_context!();
let mut cmd = context.command();
cmd.args(["parse", "--help"]);
fabro_snapshot!(context.filters(), cmd, @"
success: true
exit_code: 0
----- stdout -----
Parse a DOT file and print its AST
Usage: fabro parse [OPTIONS] <WORKFLOW>
Arguments:
<WORKFLOW> Path to the .fabro workflow file
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}
#[test]
fn parse_valid_workflow_prints_ast_json() {
let context = test_context!();
context.write_temp(
"tiny.fabro",
"digraph Tiny {\n graph [goal=\"Parse a tiny workflow\"]\n start [shape=Mdiamond]\n exit [shape=Msquare]\n main [label=\"Main\", prompt=\"Do the thing\"]\n start -> main -> exit\n}\n",
);
let mut cmd = context.command();
cmd.args(["parse", "tiny.fabro"]);
fabro_snapshot!(context.filters(), cmd, @r###"
success: true
exit_code: 0
----- stdout -----
{
"name": "Tiny",
"statements": [
{
"GraphAttr": [
[
"goal",
{
"Str": "Parse a tiny workflow"
}
]
]
},
{
"Node": {
"id": "start",
"attrs": [
[
"shape",
{
"Ident": "Mdiamond"
}
]
]
}
},
{
"Node": {
"id": "exit",
"attrs": [
[
"shape",
{
"Ident": "Msquare"
}
]
]
}
},
{
"Node": {
"id": "main",
"attrs": [
[
"label",
{
"Str": "Main"
}
],
[
"prompt",
{
"Str": "Do the thing"
}
]
]
}
},
{
"Edge": {
"nodes": [
"start",
"main",
"exit"
],
"attrs": null
}
}
]
}
----- stderr -----
"###);
}
#[test]
fn parse_invalid_dot_fails_cleanly() {
let context = test_context!();
context.write_temp(
"bad.fabro",
"digraph Bad {\n start [shape=Mdiamond]\n exit [shape=Msquare]\n start -> exit\n",
);
let mut cmd = context.command();
cmd.args(["parse", "bad.fabro"]);
fabro_snapshot!(context.filters(), cmd, @"
success: false
exit_code: 1
----- stdout -----
----- stderr -----
error: Parse error: grammar error: Parsing Error: Error { input: \"\", code: Char }
");
}