#![expect( clippy::disallowed_methods, reason = "integration tests stage fixtures with sync std::fs; test infrastructure, not Tokio-hot path" )] use fabro_test::{fabro_snapshot, test_context}; use insta::assert_snapshot; #[test] fn help() { let context = test_context!(); let mut cmd = context.command(); cmd.args(["repo", "init", "--help"]); fabro_snapshot!(context.filters(), cmd, @" success: true exit_code: 0 ----- stdout ----- Initialize a new project Usage: fabro repo init [OPTIONS] Options: --json Output as JSON [env: FABRO_JSON=] --server Fabro server target: http(s) URL or absolute Unix socket path [env: FABRO_SERVER=] --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 repo_init_creates_project_toml_and_hello_workflow() { let context = test_context!(); context.git_init(); let mut cmd = context.command(); cmd.args(["repo", "init"]); fabro_snapshot!(context.filters(), cmd, @" success: true exit_code: 0 ----- stdout ----- ----- stderr ----- ✔ .fabro/project.toml ✔ .fabro/workflows/hello/workflow.fabro ✔ .fabro/workflows/hello/workflow.toml Project initialized! Run a workflow with: fabro run hello ! No git remote found — skipping GitHub check Run `git remote add origin `, then `gh auth login` or `fabro install` to configure GitHub access "); assert_snapshot!( std::fs::read_to_string(context.temp_dir.join(".fabro/project.toml")).unwrap(), @r###" # Fabro project configuration # https://docs.fabro.computer/getting-started/quick-start _version = 1 "### ); assert_snapshot!( std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.fabro")) .unwrap(), @r###" digraph Hello { graph [goal="Say hello and demonstrate a basic Fabro workflow"] rankdir=LR start [shape=Mdiamond, label="Start"] exit [shape=Msquare, label="Exit"] greet [label="Greet", prompt="Say hello! Introduce yourself and explain that this is a test of the Fabro workflow engine."] start -> greet -> exit } "### ); assert_snapshot!( std::fs::read_to_string(context.temp_dir.join(".fabro/workflows/hello/workflow.toml")) .unwrap(), @r###" _version = 1 [workflow] graph = "workflow.fabro" # Auto-create pull requests on successful workflow runs. [run.pull_request] enabled = true draft = true # auto_merge = true "### ); } #[test] fn repo_init_rejects_already_initialized_repo() { let context = test_context!(); context.git_init(); std::fs::create_dir_all(context.temp_dir.join(".fabro")).unwrap(); std::fs::write( context.temp_dir.join(".fabro/project.toml"), "_version = 1\n", ) .unwrap(); let mut cmd = context.command(); cmd.args(["repo", "init"]); fabro_snapshot!(context.filters(), cmd, @" success: false exit_code: 1 ----- stdout ----- ----- stderr ----- × already initialized — .fabro/project.toml exists at [TEMP_DIR]/.fabro/project.toml "); } #[test] fn repo_init_errors_outside_git_repo() { let context = test_context!(); let mut cmd = context.command(); cmd.args(["repo", "init"]); fabro_snapshot!(context.filters(), cmd, @" success: false exit_code: 1 ----- stdout ----- ----- stderr ----- × not a git repository — run `git init` first "); }