use anyhow::Result;
use assert_cmd::Command;
use predicates::prelude::*;
use std::env;
#[test]
fn test_github_pages_status_command() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("status"));
Ok(())
}
#[test]
fn test_github_pages_status_with_explicit_repo() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("Pages") || stderr.contains("Pages") || stderr.contains("Error"),
"Command should provide pages status or error message"
);
Ok(())
}
#[test]
fn test_github_workflow_status_command() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("workflow").arg("status").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("status"));
Ok(())
}
#[test]
fn test_github_workflow_status_with_workflow_name() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci")
.arg("workflow")
.arg("status")
.arg("--workflow")
.arg("Build and Deploy GitHub Pages");
let output = cmd.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("Workflow")
|| stdout.contains("Build")
|| stderr.contains("Workflow")
|| stderr.contains("Error"),
"Command should provide workflow status or error message"
);
Ok(())
}
#[test]
fn test_github_trigger_workflow_command() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("trigger").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("trigger"));
Ok(())
}
#[test]
#[ignore] fn test_github_repo_auto_detection() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("detected")
|| stderr.contains("repository")
|| stderr.contains("Error")
|| stderr.contains("Pages"),
"Command should attempt repo detection or provide error"
);
Ok(())
}
#[test]
fn test_github_commands_handle_missing_token() -> Result<()> {
let original_token = env::var("GITHUB_TOKEN").ok();
env::remove_var("GITHUB_TOKEN");
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
if let Some(token) = original_token {
env::set_var("GITHUB_TOKEN", token);
}
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
!stdout.is_empty() || !stderr.is_empty(),
"Command should provide output even without token"
);
Ok(())
}
#[test]
#[ignore] fn test_github_pages_status_output_format() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("github.io")
|| stdout.contains("Pages URL")
|| stdout.contains("Status")
|| stderr.contains("Error")
|| stderr.contains("not configured"),
"Output should contain pages information or error"
);
Ok(())
}
#[test]
fn test_github_workflow_status_lists_workflows() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("workflow").arg("status");
let output = cmd.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("Workflow")
|| stdout.contains("workflow")
|| stderr.contains("Error")
|| stderr.contains("No workflows"),
"Output should contain workflow information or error"
);
Ok(())
}
#[test]
fn test_github_commands_validate_repo_format() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stderr.contains("Error") || stderr.contains("invalid") || stderr.contains("format"),
"Should provide error for invalid repo format"
);
}
Ok(())
}
#[test]
fn test_github_help_commands() -> Result<()> {
let subcommands = ["pages status", "workflow status", "trigger"];
for subcommand in &subcommands {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.args(["ci"].iter().copied().chain(subcommand.split(" ")))
.arg("--help");
cmd.assert().success().stdout(predicate::str::contains(
subcommand.split(' ').next().unwrap(),
));
}
Ok(())
}
#[test]
#[ignore] fn test_github_integration_with_public_repo() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(
stdout.contains("seanchatmangpt.github.io/ggen")
|| stdout.contains("Status:")
|| stdout.contains("Pages URL:")
|| stderr.contains("Error:")
|| stderr.contains("not configured")
|| stderr.contains("rate limit"),
"Command should provide pages status or specific error for known repo"
);
Ok(())
}
#[test]
fn test_github_commands_performance() -> Result<()> {
use std::time::Instant;
let start = Instant::now();
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let _ = cmd.output()?;
let duration = start.elapsed();
assert!(
duration.as_secs() < 10,
"GitHub command should complete within 10 seconds, took {:?}",
duration
);
Ok(())
}
#[test]
fn test_github_api_error_messages_are_helpful() -> Result<()> {
let mut cmd = Command::cargo_bin("ggen")?;
cmd.arg("ci").arg("pages").arg("status");
let output = cmd.output()?;
let stderr = String::from_utf8_lossy(&output.stderr);
if !output.status.success() {
assert!(
stderr.contains("Error")
|| stderr.contains("not found")
|| stderr.contains("404")
|| stderr.contains("does not exist"),
"Error message should be informative, got: {}",
stderr
);
}
Ok(())
}