use super::*;
use pretty_assertions::assert_eq;
use std::fs;
use std::path::Path;
const TEST_REWRITE_PROFILE: RewriteProfile = RewriteProfile::new(
"CLAUDE.md",
&[
"claude code",
"claude-code",
"claude_code",
"claudecode",
"claude",
],
);
#[test]
fn command_skill_names_must_fit_codex_skill_loader_limit() {
let source_name = "this-is-a-deeply-nested-command-with-a-very-long-name";
let file = Path::new("commands/this/is/a/deeply/nested/command/with/a/very/long/name.md");
let document = parse_command_content("---\ndescription: Review PR\n---\nReview\n");
assert!(
command_skill_name_if_supported(
source_name,
file,
&document,
CommandDescriptionMode::RequireFrontmatter,
)
.is_none()
);
}
#[test]
fn commands_with_overlong_descriptions_are_preserved() {
let description = "x".repeat(1025);
let document =
parse_command_content(&format!("---\ndescription: {description}\n---\nReview\n"));
assert_eq!(
command_skill_name_if_supported(
"review",
Path::new("commands/review.md"),
&document,
CommandDescriptionMode::RequireFrontmatter,
),
Some("source-command-review".to_string())
);
let rendered = render_command_skill(
&document.body,
"source-command-review",
&description,
"review",
TEST_REWRITE_PROFILE,
);
assert_eq!(
parse_command_content(&rendered).description.as_deref(),
Some(description.as_str())
);
}
#[test]
fn commands_with_provider_runtime_expansion_are_skipped() {
let document = parse_command_content(
"---\ndescription: Deploy\n---\nDeploy $ARGUMENTS from @release.yaml\n",
);
assert!(
command_skill_name_if_supported(
"deploy",
Path::new("commands/deploy.md"),
&document,
CommandDescriptionMode::RequireFrontmatter,
)
.is_none()
);
}
#[test]
fn commands_without_description_are_skipped() {
let document = parse_command_content("Review the current change.\n");
assert!(
command_skill_name_if_supported(
"review",
Path::new("commands/review.md"),
&document,
CommandDescriptionMode::RequireFrontmatter,
)
.is_none()
);
}
#[test]
fn commands_can_derive_descriptions_from_source_names() {
let root = tempfile::TempDir::new().expect("tempdir");
let commands = root.path().join("commands");
let target_skills = root.path().join("skills");
fs::create_dir_all(&commands).expect("create commands");
fs::write(
commands.join("review-code.md"),
"Review the current change.\n",
)
.expect("write command");
let profile = CommandMigrationProfile::new(
TEST_REWRITE_PROFILE,
CommandDescriptionMode::UseSourceNameFallback,
);
assert_eq!(
import_commands_with_profile(&commands, &target_skills, profile).unwrap(),
vec!["source-command-review-code".to_string()]
);
let rendered = fs::read_to_string(
target_skills
.join("source-command-review-code")
.join("SKILL.md"),
)
.expect("read migrated command");
assert!(rendered.contains("description: \"Migrated source command `review-code`\""));
assert!(rendered.contains("Review the current change."));
}
#[test]
fn command_slug_collisions_are_skipped() {
let root = tempfile::TempDir::new().expect("tempdir");
let commands = root.path().join("commands");
fs::create_dir_all(&commands).expect("create commands");
fs::write(
commands.join("foo-bar.md"),
"---\ndescription: First\n---\nRun the first command.\n",
)
.expect("write first command");
fs::write(
commands.join("foo_bar.md"),
"---\ndescription: Second\n---\nRun the second command.\n",
)
.expect("write second command");
assert_eq!(
unique_supported_command_sources(&commands, CommandDescriptionMode::RequireFrontmatter,)
.unwrap(),
Vec::<CommandSource>::new()
);
}