Go 98 lines
package main
import (
"bytes"
"os"
"path/filepath"
"strings"
"testing"
)
func TestRunRun_NoArgsBlocked(t *testing.T) {
chdir(t, t.TempDir())
var errOut bytes.Buffer
if code := runRun(nil, &bytes.Buffer{}, &errOut); code != 2 {
t.Fatalf("no workflow -> exit %d, want 2", code)
}
if !strings.Contains(errOut.String(), "usage: eeco run") {
t.Errorf("missing usage:\n%s", errOut.String())
}
}
func TestRunRun_OutsideRepo(t *testing.T) {
chdir(t, t.TempDir())
var errOut bytes.Buffer
if code := runRun([]string{"comment-hygiene"}, &bytes.Buffer{}, &errOut); code == 0 {
t.Fatal("expected non-zero outside repo")
}
if !strings.Contains(errOut.String(), "not inside a git repository") {
t.Errorf("missing hint:\n%s", errOut.String())
}
}
func TestRunRun_CommentHygieneCleanThenFinding(t *testing.T) {
root := newGitRepo(t)
chdir(t, root)
writeFile(t, root, "main.go", "package main\nfunc main(){}\n")
var out bytes.Buffer
if code := runRun([]string{"comment-hygiene"}, &out, &bytes.Buffer{}); code != 0 {
t.Fatalf("clean tree -> exit %d\n%s", code, out.String())
}
// Plant a fingerprint, assembled so this test source stays clean.
trailer := "Co-" + "Authored-" + "By: X <x@y>"
writeFile(t, root, "tainted.md", "notes\n"+trailer+"\n")
out.Reset()
if code := runRun([]string{"comment-hygiene"}, &out, &bytes.Buffer{}); code != 1 {
t.Fatalf("planted fingerprint -> exit %d, want 1\n%s", code, out.String())
}
if !strings.Contains(out.String(), "tainted.md") {
t.Errorf("report missing offending path:\n%s", out.String())
}
}
func TestRunRun_UnknownWorkflowBlocked(t *testing.T) {
root := newGitRepo(t)
chdir(t, root)
// Not a builtin and no scaffolded entry -> blocked (2).
if code := runRun([]string{"nope"}, &bytes.Buffer{}, &bytes.Buffer{}); code != 2 {
t.Fatalf("unknown workflow -> exit %d, want 2", code)
}
}
func TestRunNew_HappyPathAndGuards(t *testing.T) {
root := newGitRepo(t)
chdir(t, root)
// Before init: refused.
if code := runNew([]string{"checks"}, &bytes.Buffer{}, &bytes.Buffer{}); code != 1 {
t.Fatalf("new before init -> %d, want 1", code)
}
if code := runInit(nil, &bytes.Buffer{}, &bytes.Buffer{}); code != 0 {
t.Fatal("init failed")
}
var out bytes.Buffer
if code := runNew([]string{"checks"}, &out, &bytes.Buffer{}); code != 0 {
t.Fatalf("new -> %d\n%s", code, out.String())
}
entry := filepath.Join(root, "tester", ".eeco", "workflows", "checks", "run")
if _, err := os.Stat(entry); err != nil {
t.Fatalf("scaffolded entry missing: %v", err)
}
// Duplicate refused.
if code := runNew([]string{"checks"}, &bytes.Buffer{}, &bytes.Buffer{}); code != 1 {
t.Errorf("duplicate new -> %d, want 1", code)
}
// Bad name refused.
if code := runNew([]string{"Bad Name"}, &bytes.Buffer{}, &bytes.Buffer{}); code != 1 {
t.Errorf("bad name -> %d, want 1", code)
}
}
func TestRunNew_WrongArgCount(t *testing.T) {
if code := runNew(nil, &bytes.Buffer{}, &bytes.Buffer{}); code != 2 {
t.Errorf("no args -> %d, want 2", code)
}
}