package gitea import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestListOrgSkillsFiltersReposWithoutSkillMD(t *testing.T) { mux := http.NewServeMux() mux.HandleFunc("/api/v1/orgs/skills/repos", func(w http.ResponseWriter, r *http.Request) { if got := r.URL.Query().Get("page"); got != "1" { t.Fatalf("page = %q, want 1", got) } _ = json.NewEncoder(w).Encode([]apiRepo{ {Name: "good", FullName: "skills/good", CloneURL: "https://example/good.git", DefaultBranch: "main"}, {Name: "bad", FullName: "skills/bad", CloneURL: "https://example/bad.git", DefaultBranch: "main"}, }) }) mux.HandleFunc("/api/v1/repos/skills/good/contents/SKILL.md", func(w http.ResponseWriter, r *http.Request) { if got := r.URL.Query().Get("ref"); got != "main" { t.Fatalf("ref = %q, want main", got) } w.WriteHeader(http.StatusOK) }) mux.HandleFunc("/api/v1/repos/skills/bad/contents/SKILL.md", func(w http.ResponseWriter, r *http.Request) { http.NotFound(w, r) }) server := httptest.NewServer(mux) defer server.Close() client := NewClient(server.URL, Auth{Type: AuthPassword, Username: "alice", Secret: "secret"}) repos, err := client.ListOrgSkills(context.Background(), "skills") if err != nil { t.Fatalf("ListOrgSkills returned error: %v", err) } if len(repos) != 1 || repos[0].Name != "good" { t.Fatalf("repos = %+v, want only good", repos) } if repos[0].CloneURL != "https://example/good.git" { t.Fatalf("CloneURL = %q", repos[0].CloneURL) } } func TestListOrgSkillsNormalizesLoopbackCloneURLToConfiguredBaseURL(t *testing.T) { mux := http.NewServeMux() mux.HandleFunc("/api/v1/orgs/skills/repos", func(w http.ResponseWriter, r *http.Request) { _ = json.NewEncoder(w).Encode([]apiRepo{ {Name: "good", FullName: "skills/good", CloneURL: "http://localhost:3000/skills/good.git", DefaultBranch: "main"}, }) }) mux.HandleFunc("/api/v1/repos/skills/good/contents/SKILL.md", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) server := httptest.NewServer(mux) defer server.Close() client := NewClient(server.URL, Auth{Type: AuthPassword, Username: "alice", Secret: "secret"}) repos, err := client.ListOrgSkills(context.Background(), "skills") if err != nil { t.Fatalf("ListOrgSkills returned error: %v", err) } want := server.URL + "/skills/good.git" if repos[0].CloneURL != want { t.Fatalf("CloneURL = %q, want %q", repos[0].CloneURL, want) } } func TestListOrgSkillsUsesTokenAuth(t *testing.T) { mux := http.NewServeMux() mux.HandleFunc("/api/v1/orgs/skills/repos", func(w http.ResponseWriter, r *http.Request) { if got := r.Header.Get("Authorization"); got != "token abc123" { t.Fatalf("Authorization = %q, want token abc123", got) } _ = json.NewEncoder(w).Encode([]apiRepo{}) }) server := httptest.NewServer(mux) defer server.Close() client := NewClient(server.URL, Auth{Type: AuthToken, Secret: "abc123"}) if _, err := client.ListOrgSkills(context.Background(), "skills"); err != nil { t.Fatalf("ListOrgSkills returned error: %v", err) } } func TestTestConnectionChecksCurrentUserAndOrg(t *testing.T) { mux := http.NewServeMux() mux.HandleFunc("/api/v1/user", func(w http.ResponseWriter, r *http.Request) { _ = json.NewEncoder(w).Encode(apiUser{UserName: "alice"}) }) mux.HandleFunc("/api/v1/orgs/skills", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) server := httptest.NewServer(mux) defer server.Close() client := NewClient(server.URL, Auth{Type: AuthPassword, Username: "alice", Secret: "secret"}) result, err := client.TestConnection(context.Background(), "skills") if err != nil { t.Fatalf("TestConnection returned error: %v", err) } if !result.OK || result.Username != "alice" || result.Org != "skills" { t.Fatalf("result = %+v", result) } }