qtcloud-devops-cli 0.6.0

量潮DevOps云命令行工具
Documentation
use std::io::Write;

fn git_init(path: &std::path::Path) {
    std::process::Command::new("git")
        .args(["init", "-b", "main"]).current_dir(path).output().unwrap();
    std::process::Command::new("git")
        .args(["config", "user.email", "t@t"]).current_dir(path).output().unwrap();
    std::process::Command::new("git")
        .args(["config", "user.name", "t"]).current_dir(path).output().unwrap();
    std::fs::write(path.join("f"), "").unwrap();
    std::process::Command::new("git")
        .args(["add", "."]).current_dir(path).output().unwrap();
    std::process::Command::new("git")
        .args(["commit", "-m", "init"]).current_dir(path).output().unwrap();
}

fn git_commit(repo: &std::path::Path) {
    let mut f = std::fs::File::create(repo.join("f")).unwrap();
    writeln!(f, "x").unwrap();
    std::process::Command::new("git")
        .args(["add", "."]).current_dir(repo).output().unwrap();
    std::process::Command::new("git")
        .args(["commit", "-m", "x"]).current_dir(repo).output().unwrap();
}

#[test]
fn test_release_create_tag_uses_repo_path() {
    let dir = tempfile::tempdir().unwrap();
    git_init(dir.path()); git_commit(dir.path());
    let tag = "v999.999.999-test-repo-path";
    assert!(qtcloud_devops_cli::release::create_tag(tag, dir.path()));
    let output = std::process::Command::new("git").args(["-C", dir.path().to_str().unwrap(), "tag", "-l"]).output().unwrap();
    assert!(String::from_utf8_lossy(&output.stdout).contains(tag));
    let cwd_tags = std::process::Command::new("git").args(["tag", "-l"]).output().unwrap();
    assert!(!String::from_utf8_lossy(&cwd_tags.stdout).contains(tag));
}

#[test]
fn test_release_publish_rejects_invalid_version() {
    assert!(qtcloud_devops_cli::release::publish("bad", tempfile::tempdir().unwrap().path(), true, None).is_err());
}

#[test]
fn test_release_publish_rejects_missing_changelog() {
    let dir = tempfile::tempdir().unwrap(); git_init(dir.path());
    let err = qtcloud_devops_cli::release::publish("v1.0.0", dir.path(), true, None).unwrap_err().to_string();
    assert!(err.contains("CHANGELOG"), "预期 CHANGELOG 错误,得到: {}", err);
}

#[test]
fn test_release_publish_idempotent() {
    let dir = tempfile::tempdir().unwrap(); git_init(dir.path());
    std::fs::write(dir.path().join("CHANGELOG.md"), "## [1.0.0-rc.1]\n\ncontent\n").unwrap();
    assert!(qtcloud_devops_cli::release::publish("v1.0.0-rc.1", dir.path(), true, None).is_ok());
    assert!(qtcloud_devops_cli::release::publish("v1.0.0-rc.1", dir.path(), true, None).is_ok());
}

#[test]
fn test_release_publish_without_changelog_entry() {
    let dir = tempfile::tempdir().unwrap(); git_init(dir.path());
    std::fs::write(dir.path().join("CHANGELOG.md"), "## [1.0.0]\n\ncontent\n").unwrap();
    let err = qtcloud_devops_cli::release::publish("v2.0.0", dir.path(), true, None).unwrap_err().to_string();
    assert!(err.contains("未找到"));
}