// Copyright 2025 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package api import ( "context" "encoding/json" "net/http" "net/http/httptest" "testing" "code.gitea.io/tea/modules/config" ) func TestNewClient(t *testing.T) { login := &config.Login{ URL: "https://gitea.example.com", Token: "test-token", Insecure: false, } client := NewClient(login) if client == nil { t.Fatal("NewClient returned nil") } if client.login != login { t.Error("Client login not set correctly") } if client.httpClient == nil { t.Error("Client httpClient not set") } } func TestNewClientInsecure(t *testing.T) { login := &config.Login{ URL: "https://gitea.example.com", Token: "test-token", Insecure: true, } client := NewClient(login) if client == nil { t.Fatal("NewClient returned nil") } // Verify that insecure transport is configured if client.httpClient.Transport == nil { t.Error("Expected custom transport for insecure client") } } func TestGet(t *testing.T) { // Create a test server server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Verify request if r.Method != "GET" { t.Errorf("Expected GET request, got %s", r.Method) } if r.Header.Get("Authorization") != "token test-token" { t.Errorf("Expected authorization header, got %s", r.Header.Get("Authorization")) } if r.Header.Get("Accept") != "application/json" { t.Errorf("Expected accept header, got %s", r.Header.Get("Accept")) } // Return test response w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]string{"status": "ok"}) })) defer server.Close() login := &config.Login{ URL: server.URL, Token: "test-token", } client := NewClient(login) var result map[string]string _, err := client.Get(context.Background(), "/test", &result) if err != nil { t.Fatalf("Get returned error: %v", err) } if result["status"] != "ok" { t.Errorf("Expected status 'ok', got %s", result["status"]) } } func TestGetError(t *testing.T) { // Create a test server that returns an error server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) w.Write([]byte("not found")) })) defer server.Close() login := &config.Login{ URL: server.URL, Token: "test-token", } client := NewClient(login) var result map[string]string _, err := client.Get(context.Background(), "/test", &result) if err == nil { t.Fatal("Expected error for 404 response") } expectedError := "API request failed with status 404" if err.Error()[:len(expectedError)] != expectedError { t.Errorf("Expected error starting with '%s', got '%s'", expectedError, err.Error()) } } func TestGetRaw(t *testing.T) { expectedBody := "raw log content here" server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { t.Errorf("Expected GET request, got %s", r.Method) } if r.Header.Get("Authorization") != "token test-token" { t.Errorf("Expected authorization header, got %s", r.Header.Get("Authorization")) } w.Write([]byte(expectedBody)) })) defer server.Close() login := &config.Login{ URL: server.URL, Token: "test-token", } client := NewClient(login) body, err := client.GetRaw(context.Background(), "/logs") if err != nil { t.Fatalf("GetRaw returned error: %v", err) } if string(body) != expectedBody { t.Errorf("Expected body '%s', got '%s'", expectedBody, string(body)) } } func TestGetRawError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte("internal error")) })) defer server.Close() login := &config.Login{ URL: server.URL, Token: "test-token", } client := NewClient(login) _, err := client.GetRaw(context.Background(), "/logs") if err == nil { t.Fatal("Expected error for 500 response") } expectedError := "API request failed with status 500" if err.Error()[:len(expectedError)] != expectedError { t.Errorf("Expected error starting with '%s', got '%s'", expectedError, err.Error()) } } func TestGetWithContextCancellation(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // This should not be reached if context is cancelled w.Write([]byte("ok")) })) defer server.Close() login := &config.Login{ URL: server.URL, Token: "test-token", } client := NewClient(login) // Create a cancelled context ctx, cancel := context.WithCancel(context.Background()) cancel() var result map[string]string _, err := client.Get(ctx, "/test", &result) if err == nil { t.Fatal("Expected error for cancelled context") } }