ajhahn.de
← eeco
Go 52 lines
package workflow

import (
	"os"
	"path/filepath"
	"strings"
	"testing"

	"github.com/ajhahnde/eeco/internal/cockpit"
	"github.com/ajhahnde/eeco/internal/config"
	"github.com/ajhahnde/eeco/internal/playbooks"
)

// TestCockpitSync_AutoRegeneratesDrift: at automation=auto, a drifted artifact
// is regenerated to its clean bytes, the run reports CodeClean, and nothing is
// queued (the C4 reconcile path; orphans/safety would still queue).
func TestCockpitSync_AutoRegeneratesDrift(t *testing.T) {
	cfg := newCfg(t)
	cfg.UserDir = filepath.Join(cfg.RepoRoot, "tester")
	cfg.Automation = config.AutomationAuto
	if err := cockpit.SaveSelection(cfg, cockpit.Selection{Targets: []string{"claude"}}); err != nil {
		t.Fatal(err)
	}
	pb, err := playbooks.Get("handover")
	if err != nil {
		t.Fatal(err)
	}
	if _, err := cockpit.Generate(cfg, pb, "claude"); err != nil {
		t.Fatalf("generate: %v", err)
	}
	dst := filepath.Join(cfg.UserDir, ".claude", "skills", "handover", "SKILL.md")
	clean, _ := os.ReadFile(dst)
	if err := os.WriteFile(dst, []byte("edited\n"), 0o644); err != nil {
		t.Fatal(err)
	}

	res, err := cockpitSync{}.Run(Env{Config: cfg})
	if err != nil {
		t.Fatal(err)
	}
	if res.Code != CodeClean {
		t.Errorf("auto-regen of pure drift = Code %d (%q), want CodeClean", res.Code, res.Summary)
	}
	got, _ := os.ReadFile(dst)
	if string(got) != string(clean) {
		t.Errorf("drifted artifact not regenerated to clean bytes:\n%s", got)
	}
	if q := queueBody(t, cfg); strings.Contains(q, "cockpit-sync") {
		t.Errorf("auto-regen of pure drift must not queue, got:\n%s", q)
	}
}