package adapter import ( "os" "path/filepath" "strings" "testing" "skillmgr/internal/types" ) func TestOpenCodeAdapter_GetSkillInstallPath_Global(t *testing.T) { tmpDir, cleanup := setupAdapterTestEnv(t) defer cleanup() adapter := &OpenCodeAdapter{} path, err := adapter.GetSkillInstallPath(types.ScopeGlobal, "test-skill") if err != nil { t.Fatalf("GetSkillInstallPath 失败: %v", err) } // OpenCode 全局 skill 使用 ~/.config/opencode/skills/ expected := filepath.Join(tmpDir, ".config", "opencode", "skills", "test-skill") if path != expected { t.Errorf("期望 %s,得到 %s", expected, path) } } func TestOpenCodeAdapter_GetCommandInstallPath_Global(t *testing.T) { tmpDir, cleanup := setupAdapterTestEnv(t) defer cleanup() adapter := &OpenCodeAdapter{} path, err := adapter.GetCommandInstallPath(types.ScopeGlobal, "test-cmd") if err != nil { t.Fatalf("GetCommandInstallPath 失败: %v", err) } // OpenCode 全局 command 使用 ~/.config/opencode/commands/ expected := filepath.Join(tmpDir, ".config", "opencode", "commands") if path != expected { t.Errorf("期望 %s,得到 %s", expected, path) } } func TestOpenCodeAdapter_AdaptCommand_Flattening(t *testing.T) { tmpDir, cleanup := setupAdapterTestEnv(t) defer cleanup() // 创建源目录 srcDir := filepath.Join(tmpDir, "src-cmd") os.MkdirAll(srcDir, 0755) os.WriteFile(filepath.Join(srcDir, "init.md"), []byte("test"), 0644) os.WriteFile(filepath.Join(srcDir, "run.md"), []byte("test"), 0644) destDir := filepath.Join(tmpDir, "dest-cmd") adapter := &OpenCodeAdapter{} mapping, err := adapter.AdaptCommand(srcDir, destDir, "test-cmd") if err != nil { t.Fatalf("AdaptCommand 失败: %v", err) } if len(mapping) != 2 { t.Errorf("期望 2 个文件映射,得到 %d 个", len(mapping)) } // 验证文件名被扁平化 for src, dest := range mapping { srcBase := filepath.Base(src) destBase := filepath.Base(dest) // init.md -> test-cmd-init.md nameWithoutExt := strings.TrimSuffix(srcBase, ".md") expectedBase := "test-cmd-" + nameWithoutExt + ".md" if destBase != expectedBase { t.Errorf("OpenCode 适配器应扁平化文件名:期望 %s,得到 %s", expectedBase, destBase) } } } func TestGetAdapter_Claude(t *testing.T) { adapter, err := GetAdapter(types.PlatformClaude) if err != nil { t.Fatalf("GetAdapter(claude) 失败: %v", err) } if _, ok := adapter.(*ClaudeAdapter); !ok { t.Error("期望 ClaudeAdapter 类型") } } func TestGetAdapter_OpenCode(t *testing.T) { adapter, err := GetAdapter(types.PlatformOpenCode) if err != nil { t.Fatalf("GetAdapter(opencode) 失败: %v", err) } if _, ok := adapter.(*OpenCodeAdapter); !ok { t.Error("期望 OpenCodeAdapter 类型") } } func TestGetAdapter_Invalid(t *testing.T) { _, err := GetAdapter(types.Platform("invalid")) if err == nil { t.Error("期望无效平台返回错误") } }