package executor
import (
"fmt"
"regexp"
"strings"
)
func AssertCommandSuccess(result *ExecResult) error {
if result.ExitCode != 0 {
return fmt.Errorf("command failed with exit code %d, stderr: %s", result.ExitCode, result.Stderr)
}
return nil
}
func AssertCommandFailed(result *ExecResult) error {
if result.ExitCode == 0 {
return fmt.Errorf("expected command to fail, but it succeeded")
}
return nil
}
func AssertExitCode(result *ExecResult, expected int) error {
if result.ExitCode != expected {
return fmt.Errorf("expected exit code %d, got %d", expected, result.ExitCode)
}
return nil
}
func AssertOutputContains(result *ExecResult, expected string) error {
if !strings.Contains(result.Stdout, expected) {
return fmt.Errorf("expected stdout to contain %q, but got: %s", expected, result.Stdout)
}
return nil
}
func AssertOutputNotContains(result *ExecResult, unexpected string) error {
if strings.Contains(result.Stdout, unexpected) {
return fmt.Errorf("expected stdout not to contain %q, but it does: %s", unexpected, result.Stdout)
}
return nil
}
func AssertOutputEquals(result *ExecResult, expected string) error {
if result.Stdout != expected {
return fmt.Errorf("expected stdout to be %q, but got: %s", expected, result.Stdout)
}
return nil
}
func AssertStderrContains(result *ExecResult, expected string) error {
if !strings.Contains(result.Stderr, expected) {
return fmt.Errorf("expected stderr to contain %q, but got: %s", expected, result.Stderr)
}
return nil
}
func AssertStderrNotContains(result *ExecResult, unexpected string) error {
if strings.Contains(result.Stderr, unexpected) {
return fmt.Errorf("expected stderr not to contain %q, but it does: %s", unexpected, result.Stderr)
}
return nil
}
func AssertStderrEquals(result *ExecResult, expected string) error {
if result.Stderr != expected {
return fmt.Errorf("expected stderr to be %q, but got: %s", expected, result.Stderr)
}
return nil
}
func AssertOutputMatches(result *ExecResult, pattern string) error {
matched, err := regexp.MatchString(pattern, result.Stdout)
if err != nil {
return fmt.Errorf("invalid regexp pattern %q: %w", pattern, err)
}
if !matched {
return fmt.Errorf("expected stdout to match pattern %q, but got: %s", pattern, result.Stdout)
}
return nil
}
func AssertOutputEmpty(result *ExecResult) error {
if strings.TrimSpace(result.Stdout) != "" {
return fmt.Errorf("expected stdout to be empty, but got: %s", result.Stdout)
}
return nil
}
func AssertStderrEmpty(result *ExecResult) error {
if strings.TrimSpace(result.Stderr) != "" {
return fmt.Errorf("expected stderr to be empty, but got: %s", result.Stderr)
}
return nil
}
type ExecResultAssertion func(*ExecResult) error
func AssertExecResults(result *ExecResult, assertions ...ExecResultAssertion) error {
for _, assertion := range assertions {
if err := assertion(result); err != nil {
return err
}
}
return nil
}
var (
AssertSuccess = AssertExecResults
AssertFailure = AssertExecResults
)
func AssertSuccessWithOutput(expectedOutput string) ExecResultAssertion {
return func(result *ExecResult) error {
if err := AssertCommandSuccess(result); err != nil {
return err
}
return AssertOutputContains(result, expectedOutput)
}
}
func AssertFailureWithExitCode(expectedCode int) ExecResultAssertion {
return func(result *ExecResult) error {
if err := AssertCommandFailed(result); err != nil {
return err
}
return AssertExitCode(result, expectedCode)
}
}