mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-10-03 02:24:33 +00:00
139 lines
3.9 KiB
Rust
139 lines
3.9 KiB
Rust
#![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 <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 <url>`, 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
|
||
");
|
||
}
|