package config import ( "os" "testing" "time" "skillmgr/internal/types" ) func setupRepoTestEnv(t *testing.T) (string, func()) { t.Helper() tmpDir, err := os.MkdirTemp("", "skillmgr-repo-test-*") if err != nil { t.Fatalf("创建临时目录失败: %v", err) } os.Setenv("SKILLMGR_TEST_ROOT", tmpDir) cleanup := func() { os.Unsetenv("SKILLMGR_TEST_ROOT") os.RemoveAll(tmpDir) } return tmpDir, cleanup } func TestLoadRepositoryConfig_Empty(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() cfg, err := LoadRepositoryConfig() if err != nil { t.Fatalf("LoadRepositoryConfig 失败: %v", err) } if len(cfg.Repositories) != 0 { t.Errorf("期望空仓库列表,得到 %d 个", len(cfg.Repositories)) } } func TestAddRepository_Success(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() repo := types.Repository{ Name: "test-repo", URL: "https://github.com/test/repo.git", Branch: "main", AddedAt: time.Now(), } if err := AddRepository(repo); err != nil { t.Fatalf("AddRepository 失败: %v", err) } // 验证已添加 cfg, _ := LoadRepositoryConfig() if len(cfg.Repositories) != 1 { t.Errorf("期望 1 个仓库,得到 %d 个", len(cfg.Repositories)) } if cfg.Repositories[0].Name != "test-repo" { t.Errorf("期望名称 'test-repo',得到 '%s'", cfg.Repositories[0].Name) } } func TestAddRepository_RejectDuplicate(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() repo := types.Repository{ Name: "test-repo", URL: "https://github.com/test/repo.git", Branch: "main", AddedAt: time.Now(), } // 第一次添加 if err := AddRepository(repo); err != nil { t.Fatalf("第一次 AddRepository 失败: %v", err) } // 第二次添加应该失败 err := AddRepository(repo) if err == nil { t.Error("期望添加重复仓库时返回错误") } } func TestRemoveRepository_Success(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() repo := types.Repository{ Name: "test-repo", URL: "https://github.com/test/repo.git", AddedAt: time.Now(), } AddRepository(repo) if err := RemoveRepository("test-repo"); err != nil { t.Fatalf("RemoveRepository 失败: %v", err) } cfg, _ := LoadRepositoryConfig() if len(cfg.Repositories) != 0 { t.Errorf("期望 0 个仓库,得到 %d 个", len(cfg.Repositories)) } } func TestRemoveRepository_NotFound(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() // RemoveRepository 实现中,不存在的仓库不报错 err := RemoveRepository("nonexistent") if err != nil { t.Errorf("RemoveRepository 不应该报错: %v", err) } } func TestFindRepository_Found(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() repo := types.Repository{ Name: "test-repo", URL: "https://github.com/test/repo.git", AddedAt: time.Now(), } AddRepository(repo) found, err := FindRepository("test-repo") if err != nil { t.Fatalf("FindRepository 失败: %v", err) } if found == nil || found.Name != "test-repo" { t.Errorf("期望找到 'test-repo'") } } func TestFindRepository_NotFound(t *testing.T) { _, cleanup := setupRepoTestEnv(t) defer cleanup() // FindRepository 实现中,找不到时返回 nil, nil found, err := FindRepository("nonexistent") if err != nil { t.Errorf("FindRepository 不应该报错: %v", err) } if found != nil { t.Errorf("期望返回 nil") } }