ajhahn.de
← eeco
Go 70 lines
package workflow

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

	"github.com/ajhahnde/eeco/internal/config"
	"github.com/ajhahnde/eeco/internal/manifest"
)

func TestManifestRefresh_WritesSkeletonsForKnowledgeDirs(t *testing.T) {
	root := t.TempDir()
	userDir := filepath.Join(root, "alice")
	// Engine workspace (must be skipped) + two knowledge dirs, one nested.
	mustMkdir(t, filepath.Join(userDir, ".eeco", "state"))
	mustMkdir(t, filepath.Join(userDir, "backend"))
	mustMkdir(t, filepath.Join(userDir, "frontend", "routes"))
	mustWrite(t, filepath.Join(userDir, "backend", "main.go"), "package main")

	cfg := &config.Config{UserDir: userDir, WorkspaceName: ".eeco"}
	res, err := manifestRefresh{}.Run(Env{Config: cfg})
	if err != nil {
		t.Fatal(err)
	}
	if res.Code != CodeClean {
		t.Fatalf("code = %d, want %d", res.Code, CodeClean)
	}

	// Top-level dirs AND the nested subdirectory each get a manifest.
	for _, d := range []string{"backend", "frontend", filepath.Join("frontend", "routes")} {
		if _, err := os.Stat(filepath.Join(userDir, d, manifest.FileName)); err != nil {
			t.Fatalf("manifest missing for %s: %v", d, err)
		}
	}
	// The engine workspace must NOT get a manifest.
	if _, err := os.Stat(filepath.Join(userDir, ".eeco", manifest.FileName)); !os.IsNotExist(err) {
		t.Fatalf("engine workspace should be skipped, stat err = %v", err)
	}
}

func TestManifestRefresh_NoKnowledgeDirsIsCleanNoop(t *testing.T) {
	root := t.TempDir()
	userDir := filepath.Join(root, "alice")
	mustMkdir(t, filepath.Join(userDir, ".eeco"))

	cfg := &config.Config{UserDir: userDir, WorkspaceName: ".eeco"}
	res, err := manifestRefresh{}.Run(Env{Config: cfg})
	if err != nil {
		t.Fatal(err)
	}
	if res.Code != CodeClean {
		t.Fatalf("code = %d, want %d", res.Code, CodeClean)
	}
}

func mustMkdir(t *testing.T, p string) {
	t.Helper()
	if err := os.MkdirAll(p, 0o755); err != nil {
		t.Fatal(err)
	}
}

func mustWrite(t *testing.T, p, body string) {
	t.Helper()
	if err := os.WriteFile(p, []byte(body), 0o644); err != nil {
		t.Fatal(err)
	}
}