mod common;
use common::TestContext;
use insta::assert_snapshot;
fn build_skill(ctx: &TestContext) {
let result = ctx.run_skc(&["build", ctx.skill_name(), "--target", ctx.mock_agent_str()]);
result.assert_success("build skill for gateway");
}
#[test]
fn test_outline_snapshot() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["outline", ctx.skill_name()]);
assert_snapshot!("outline", output);
}
#[test]
fn test_outline_level_filter() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["outline", ctx.skill_name(), "--level", "2"]);
assert_snapshot!("outline_level_2", output);
}
#[test]
fn test_outline_with_index() {
let ctx = TestContext::new()
.with_rich_skill("test-skill")
.with_mock_agent();
build_skill(&ctx);
let output = ctx.run_skc_text(&["outline", ctx.skill_name()]);
assert_snapshot!("outline_with_index", output);
}
#[test]
fn test_outline_level_filter_with_index() {
let ctx = TestContext::new()
.with_rich_skill("test-skill")
.with_mock_agent();
build_skill(&ctx);
let output = ctx.run_skc_text(&["outline", ctx.skill_name(), "--level", "2"]);
assert_snapshot!("outline_level_2_with_index", output);
}
#[test]
fn test_show_snapshot() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["show", ctx.skill_name(), "--section", "Getting Started"]);
assert_snapshot!("show", output);
}
#[test]
fn test_show_max_lines() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&[
"show",
ctx.skill_name(),
"--section",
"Getting Started",
"--max-lines",
"3",
]);
assert_snapshot!("show_max_lines", output);
}
#[test]
fn test_open_snapshot() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["open", ctx.skill_name(), "docs/advanced.md"]);
assert_snapshot!("open", output);
}
#[test]
fn test_open_max_lines() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&[
"open",
ctx.skill_name(),
"docs/advanced.md",
"--max-lines",
"3",
]);
assert_snapshot!("open_max_lines", output);
}
#[test]
fn test_show_with_index() {
let ctx = TestContext::new()
.with_rich_skill("test-skill")
.with_mock_agent();
build_skill(&ctx);
let output = ctx.run_skc_text(&["show", ctx.skill_name(), "--section", "Getting Started"]);
assert_snapshot!("show_with_index", output);
}
#[test]
fn test_show_emdash_stripping() {
let ctx = TestContext::new()
.with_rich_skill("test-skill")
.with_mock_agent();
build_skill(&ctx);
let output = ctx.run_skc_text(&[
"show",
ctx.skill_name(),
"--section",
"Getting Started — How to begin using the skill",
]);
assert_snapshot!("show_emdash_stripping", output);
}
#[test]
fn test_show_suggestions() {
let ctx = TestContext::new()
.with_rich_skill("test-skill")
.with_mock_agent();
build_skill(&ctx);
let result = ctx.run_skc(&["show", ctx.skill_name(), "--section", "Getting"]);
assert!(!result.success);
assert!(result.stderr.contains("section not found"));
assert!(result.stderr.contains("Did you mean"));
assert!(result.stderr.contains("Getting Started"));
}
#[test]
fn test_sources_snapshot() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["sources", ctx.skill_name()]);
assert_snapshot!("sources", output);
}
#[test]
fn test_sources_json() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_json(&["sources", ctx.skill_name(), "--format", "json"]);
assert_snapshot!("sources_json", output);
}
#[test]
fn test_sources_depth() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["sources", ctx.skill_name(), "--depth", "1"]);
assert_snapshot!("sources_depth_1", output);
}
#[test]
fn test_sources_subdir() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["sources", ctx.skill_name(), "--dir", "docs"]);
assert_snapshot!("sources_subdir", output);
}
#[test]
fn test_sources_pattern() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["sources", ctx.skill_name(), "--pattern", "*.md"]);
assert_snapshot!("sources_pattern", output);
}
#[test]
fn test_sources_limit() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let output = ctx.run_skc_text(&["sources", ctx.skill_name(), "--limit", "2"]);
assert_snapshot!("sources_limit", output);
}
#[test]
fn test_sources_path_escape() {
let ctx = TestContext::new().with_rich_skill("test-skill");
let result = ctx.run_skc(&["sources", ctx.skill_name(), "--dir", "../.."]);
assert!(!result.success);
assert!(result.stderr.contains("path escapes") || result.stderr.contains("not found"));
}