ajhahn.de
← eeco
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)
	}
}