hugin/cli/internal/lock/lock_test.go
2026-10-27 08:33:21 +01:00

83 lines
2.6 KiB
Go

package lock
import (
"os"
"path/filepath"
"strings"
"testing"
)
func TestLoadMissingIsEmpty(t *testing.T) {
l, err := Load(t.TempDir())
if err != nil || l.Packages == nil || len(l.Packages) != 0 {
t.Fatalf("leer erwartet: %+v, %v", l, err)
}
}
func TestRoundTrip(t *testing.T) {
l := New()
l.Packages["pub-a"] = &Package{Version: "1.0.0", Checksum: "sha256:aa",
Files: map[string]string{".claude/skills/pub-a/SKILL.md": "sha256:01"},
Keys: []Key{{File: ".mcp.json", Path: []string{"mcpServers", "munin"}, Sha256: "sha256:02"}}}
l.Packages["pub-b"] = &Package{Version: "2.0.0", Checksum: "sha256:bb",
Files: map[string]string{".hugin/rules/pub-b.md": "sha256:03"}}
l.Common = Common{
Keys: []Key{{File: "opencode.json", Path: []string{"instructions"}, Mode: "list_item", Value: ".hugin/rules/*.md"}},
Blocks: map[string]string{"CLAUDE.md#hugin": "sha256:04"},
Created: []string{"opencode.json"},
}
raw, err := l.Bytes()
if err != nil {
t.Fatal(err)
}
if !strings.HasPrefix(string(raw), header) {
t.Errorf("Kopfzeile fehlt:\n%s", raw)
}
repo := t.TempDir()
if err := os.WriteFile(filepath.Join(repo, Filename), raw, 0o644); err != nil {
t.Fatal(err)
}
back, err := Load(repo)
if err != nil {
t.Fatal(err)
}
if len(back.Files()) != 2 || back.Files()[".hugin/rules/pub-b.md"] != "sha256:03" {
t.Errorf("Files: %v", back.Files())
}
if len(back.AllKeys()) != 2 || !back.Created("opencode.json") || back.Created("CLAUDE.md") {
t.Errorf("Keys/Created: %+v", back)
}
if back.Common.Blocks["CLAUDE.md#hugin"] != "sha256:04" {
t.Errorf("Blocks: %v", back.Common.Blocks)
}
}
func TestFind(t *testing.T) {
keys := []Key{
{File: "opencode.json", Path: []string{"instructions"}, Mode: "list_item", Value: ".hugin/rules/*.md"},
{File: ".mcp.json", Path: []string{"mcpServers", "munin"}},
}
if Find(keys, ".mcp.json", []string{"mcpServers", "munin"}, "", nil) == nil {
t.Error("Schlüssel nicht gefunden")
}
if Find(keys, "opencode.json", []string{"instructions"}, "list_item", ".hugin/rules/*.md") == nil {
t.Error("Listeneintrag nicht gefunden")
}
// Bei list_item muss auch der Wert passen
if Find(keys, "opencode.json", []string{"instructions"}, "list_item", "andere.md") != nil {
t.Error("anderer Wert darf nicht passen")
}
if Find(keys, ".mcp.json", []string{"mcpServers"}, "", nil) != nil {
t.Error("kürzerer Pfad darf nicht passen")
}
}
func TestBrokenFile(t *testing.T) {
path := filepath.Join(t.TempDir(), "trial.lock")
if err := os.WriteFile(path, []byte("packages: [kaputt"), 0o644); err != nil {
t.Fatal(err)
}
if _, err := LoadFrom(path); err == nil {
t.Error("Fehler erwartet")
}
}