mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-07 08:27:12 +00:00
Wrap root CLI errors at the main boundary so fatal diagnostics use miette's styled renderer while preserving existing telemetry, exit codes, and auth help hints.
135 lines
3.2 KiB
Rust
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, @r#"
|
||
success: false
|
||
exit_code: 1
|
||
----- stdout -----
|
||
----- stderr -----
|
||
× Parse error: grammar error: Parsing Error: Error { input: "", code: Char }
|
||
"#);
|
||
}
|