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