返回 DeepSeek-Reasonix
diagnostic_store_test.go
根目录 / internal / skill / diagnostic_store_test.go
1 package skill
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "reasonix/internal/config"
9 "reasonix/internal/pluginpkg"
10 )
11
12 func TestDiagnosticStorePreservesPluginOwnership(t *testing.T) {
13 rh, root := t.TempDir(), t.TempDir()
14 t.Setenv("REASONIX_HOME", rh)
15 for _, owner := range []string{"owner-a", "owner-b"} {
16 base := filepath.Join(rh, "plugins", owner)
17 name := owner + "-probe"
18 files := map[string]string{
19 pluginpkg.CodexManifest: `{"name":"` + owner + `","skills":"skills"}`,
20 "skills/" + name + "/SKILL.md": "---\nname: " + name + "\ndescription: Probe\nallowed-tools: [search]\n---\nTest\n",
21 }
22 for relative, body := range files {
23 file := filepath.Join(base, relative)
24 if err := os.MkdirAll(filepath.Dir(file), 0700); err != nil {
25 t.Fatal(err)
26 }
27 if err := os.WriteFile(file, []byte(body), 0600); err != nil {
28 t.Fatal(err)
29 }
30 }
31 if err := pluginpkg.Upsert(rh, pluginpkg.InstalledPlugin{Name: owner, Root: filepath.Join("plugins", owner), ManifestKind: "codex", Enabled: true}); err != nil {
32 t.Fatal(err)
33 }
34 }
35 cfg, err := config.LoadForRootReadOnly(root)
36 if err != nil {
37 t.Fatal(err)
38 }
39 owners := map[string]bool{}
40 for _, sk := range DiagnosticStore(root, t.TempDir(), rh, cfg).List() {
41 if sk.Name == "owner-a-probe" || sk.Name == "owner-b-probe" {
42 owners[sk.Plugin] = true
43 }
44 }
45 if len(owners) != 2 || !owners["owner-a"] || !owners["owner-b"] {
46 t.Fatalf("plugin skills lost ownership: %v", owners)
47 }
48 }
49
49 lines GO