Files
hpc/internal/slurm/client_test.go
dailz b3d787c97b fix(slurm): parse structured errors from non-2xx Slurm API responses
Replace ErrorResponse with SlurmAPIError that extracts structured errors/warnings from JSON body when Slurm returns non-2xx (e.g. 404 with valid JSON). Add IsNotFound helper for fallback logic.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-10 13:43:17 +08:00

148 lines
3.8 KiB
Go

package slurm
import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"testing"
)
func TestNewClient(t *testing.T) {
client, err := NewClient("http://localhost:6820/", nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if client == nil {
t.Fatal("expected non-nil client")
}
if client.UserAgent != DefaultUserAgent {
t.Errorf("expected UserAgent %q, got %q", DefaultUserAgent, client.UserAgent)
}
if client.client == nil {
t.Error("expected http.Client to be initialized (nil httpClient should create a client with default timeout)")
}
_, err = NewClient("://invalid", nil)
if err == nil {
t.Fatal("expected error for invalid URL, got nil")
}
client2, err := NewClient("http://localhost:6820/", nil)
if err != nil {
t.Fatalf("unexpected error with nil httpClient: %v", err)
}
if client2.client == nil {
t.Error("expected client.httpclient to be non-nil when passing nil")
}
}
func TestNewClient_ServicesInitialized(t *testing.T) {
client, err := NewClient("http://localhost:6820/", nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
services := []struct {
name string
svc interface{}
}{
{"Jobs", client.Jobs},
{"Nodes", client.Nodes},
{"Partitions", client.Partitions},
{"Reservations", client.Reservations},
{"Diag", client.Diag},
{"Ping", client.Ping},
{"Licenses", client.Licenses},
{"Reconfigure", client.Reconfigure},
{"Shares", client.Shares},
{"SlurmdbDiag", client.SlurmdbDiag},
{"SlurmdbConfig", client.SlurmdbConfig},
{"SlurmdbTres", client.SlurmdbTres},
{"SlurmdbQos", client.SlurmdbQos},
{"SlurmdbAssocs", client.SlurmdbAssocs},
{"SlurmdbInstances", client.SlurmdbInstances},
{"SlurmdbUsers", client.SlurmdbUsers},
{"SlurmdbClusters", client.SlurmdbClusters},
{"SlurmdbWckeys", client.SlurmdbWckeys},
{"SlurmdbAccounts", client.SlurmdbAccounts},
{"SlurmdbJobs", client.SlurmdbJobs},
}
for _, s := range services {
if s.svc == nil {
t.Errorf("%s service is nil", s.name)
}
}
}
func TestClient_AuthHeaders(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if got := r.Header.Get("X-SLURM-USER-NAME"); got != "testuser" {
t.Errorf("expected X-SLURM-USER-NAME %q, got %q", "testuser", got)
}
if got := r.Header.Get("X-SLURM-USER-TOKEN"); got != "testtoken" {
t.Errorf("expected X-SLURM-USER-TOKEN %q, got %q", "testtoken", got)
}
w.WriteHeader(200)
fmt.Fprint(w, `{}`)
})
server := httptest.NewServer(mux)
defer server.Close()
transport := &TokenAuthTransport{
UserName: "testuser",
Token: "testtoken",
}
httpClient := transport.Client()
client, err := NewClient(server.URL, httpClient)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
req, err := client.NewRequest("GET", "slurm/v0.0.40/ping", nil)
if err != nil {
t.Fatalf("unexpected error creating request: %v", err)
}
_, err = client.Do(context.Background(), req, nil)
if err != nil {
t.Fatalf("unexpected error doing request: %v", err)
}
}
func TestClient_ErrorHandling(t *testing.T) {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(500)
fmt.Fprint(w, "internal server error")
})
server := httptest.NewServer(mux)
defer server.Close()
client, err := NewClient(server.URL, nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
req, err := client.NewRequest("GET", "slurm/v0.0.40/diag", nil)
if err != nil {
t.Fatalf("unexpected error creating request: %v", err)
}
_, err = client.Do(context.Background(), req, nil)
if err == nil {
t.Fatal("expected error for 500 response")
}
errorResp, ok := err.(*SlurmAPIError)
if !ok {
t.Fatalf("expected *SlurmAPIError, got %T", err)
}
if errorResp.StatusCode != 500 {
t.Errorf("expected status 500, got %d", errorResp.StatusCode)
}
}