包含 Ptr[T] 泛型辅助函数、4 种 NoVal 类型(Uint64/Uint32/Uint16/Float64)、字符串集合类型、OpenapiMeta/Error/Warning,以及对应的序列化测试和客户端集成测试。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
137 lines
3.3 KiB
Go
137 lines
3.3 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 default to http.DefaultClient)")
|
|
}
|
|
|
|
_, 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},
|
|
}
|
|
|
|
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.(*ErrorResponse)
|
|
if !ok {
|
|
t.Fatalf("expected *ErrorResponse, got %T", err)
|
|
}
|
|
if errorResp.Response.StatusCode != 500 {
|
|
t.Errorf("expected status 500, got %d", errorResp.Response.StatusCode)
|
|
}
|
|
}
|