hi-server/tests/config.go
shanshanzhong 595e4c62f9
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 5m25s
x
2026-05-03 18:34:14 -07:00

137 lines
3.9 KiB
Go

// Package tests provides HTTP client helpers for manually testing ppanel-server APIs.
//
// Usage:
//
// go test -v -run TestXxx ./tests/
//
// Configure the constants below to match your local environment.
package tests
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"testing"
)
// ─── Environment Configuration ────────────────────────────────────────────────
const (
// BaseURL is the ppanel-server base URL (no trailing slash).
BaseURL = "http://localhost:8080"
// AdminToken is the JWT token for an admin user.
// Obtain by calling CallAdminLogin first, then paste the token here.
AdminToken = "YOUR_ADMIN_TOKEN"
// UserToken is the JWT token for a regular user.
// Obtain by calling CallUserLogin first, then paste the token here.
UserToken = "YOUR_USER_TOKEN"
// TestEmail is the email address for user-related test calls.
TestEmail = "test@example.com"
// TestPassword is the password for test user login.
TestPassword = "Test@123456"
// AdminEmail is the email for admin login.
AdminEmail = "admin@example.com"
// AdminPassword is the admin password.
AdminPassword = "Admin@123456"
)
// ─── Request Options ──────────────────────────────────────────────────────────
type reqOption func(*http.Request)
// withToken adds a Bearer token to the request.
func withToken(token string) reqOption {
return func(r *http.Request) {
r.Header.Set("Authorization", "Bearer "+token)
}
}
// withAdminToken adds the AdminToken.
func withAdminToken() reqOption { return withToken(AdminToken) }
// withUserToken adds the UserToken.
func withUserToken() reqOption { return withToken(UserToken) }
// ─── Core HTTP Helper ─────────────────────────────────────────────────────────
// doRequest sends an HTTP request and prints the response.
// body may be nil (for GET/DELETE without body), a map[string]any, or any JSON-serialisable value.
// Returns the raw response body as a string.
func doRequest(t *testing.T, method, path string, body any, opts ...reqOption) string {
t.Helper()
var reqBody io.Reader
if body != nil {
b, err := json.Marshal(body)
if err != nil {
t.Fatalf("marshal body: %v", err)
}
reqBody = bytes.NewReader(b)
}
req, err := http.NewRequest(method, BaseURL+path, reqBody)
if err != nil {
t.Fatalf("new request: %v", err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
for _, o := range opts {
o(req)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatalf("do request: %v", err)
}
defer resp.Body.Close()
raw, _ := io.ReadAll(resp.Body)
result := prettyJSON(raw)
t.Logf("[%s %s] %d\n%s", method, path, resp.StatusCode, result)
return string(raw)
}
// doRequestRaw is like doRequest but for non-testing contexts (prints to stdout).
func doRequestRaw(method, path string, body any, opts ...reqOption) string {
var reqBody io.Reader
if body != nil {
b, _ := json.Marshal(body)
reqBody = bytes.NewReader(b)
}
req, _ := http.NewRequest(method, BaseURL+path, reqBody)
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "application/json")
for _, o := range opts {
o(req)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Printf("request error: %v\n", err)
return ""
}
defer resp.Body.Close()
raw, _ := io.ReadAll(resp.Body)
result := prettyJSON(raw)
fmt.Printf("[%s %s] %d\n%s\n", method, path, resp.StatusCode, result)
return string(raw)
}
func prettyJSON(raw []byte) string {
var buf bytes.Buffer
if err := json.Indent(&buf, raw, "", " "); err != nil {
return string(raw)
}
return buf.String()
}