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) } }