Files
creator-hub/internal/controlplane/api/environment_create_test.go
T

94 lines
3.1 KiB
Go

package api
import (
"context"
"encoding/json"
"net/http"
"os"
"testing"
"git.ipao.vip/rogee/creator-hub/internal/creator"
hub "git.ipao.vip/rogee/creator-hub/internal/environment"
"github.com/gofiber/fiber/v3"
)
func TestCreatePendingEnvironmentUsesSelectedGateway(t *testing.T) {
raw := os.Getenv("CREATORHUB_POSTGRES_TEST_URL")
if raw == "" {
t.Skip("set CREATORHUB_POSTGRES_TEST_URL")
}
ctx := context.Background()
dbURL := isolatedControlPlaneDatabaseURL(t, raw)
hs, err := hub.Open(ctx, dbURL)
if err != nil {
t.Fatal(err)
}
defer hs.Close()
cs, err := creator.Open(ctx, dbURL)
if err != nil {
t.Fatal(err)
}
defer cs.Close()
for _, name := range []string{"gw-a", "gw-b"} {
if _, err := hs.CreateGateway(ctx, name, "http://"+name+":9100", "test-gateway-token-"+name); err != nil {
t.Fatal(err)
}
}
app := fiber.New()
registerEnvironmentLoginRoutes(app, cs, hs)
for _, input := range []struct {
body string
status int
}{
{`{"gateway":"gw-b","fingerprint":{"timezone":"Asia/Shanghai"}}`, http.StatusCreated},
{`{"gateway":"gw-a"}`, http.StatusCreated},
{`{}`, http.StatusBadRequest},
{`{"gateway":""}`, http.StatusBadRequest},
{`{"gateway":"missing"}`, http.StatusNotFound},
{`{"gateway":"bad gateway"}`, http.StatusBadRequest},
{`{"gateway":"gw-a","fingerprint":{"seed":123}}`, http.StatusBadRequest},
{`{"gateway":"gw-a","fingerprint":{"proxy_server":"http://example.com"}}`, http.StatusBadRequest},
{`{"gateway":"gw-a","fingerprint":{"hardware_concurrency":-1}}`, http.StatusBadRequest},
{`{`, http.StatusBadRequest},
} {
t.Run(input.body, func(t *testing.T) {
response := do(app, http.MethodPost, "/api/creator/environments", input.body)
if response.Code != input.status {
t.Fatalf("status=%d want=%d: %s", response.Code, input.status, response.Body.String())
}
if input.status != http.StatusCreated {
return
}
var env hub.EnvironmentContext
if err := json.Unmarshal(response.Body.Bytes(), &env); err != nil {
t.Fatal(err)
}
var payload struct {
Gateway string `json:"gateway"`
Fingerprint hub.Fingerprint `json:"fingerprint"`
}
if err := json.Unmarshal([]byte(input.body), &payload); err != nil {
t.Fatal(err)
}
if env.Gateway != payload.Gateway || env.Alias == "" || env.ProfileID != env.Alias || env.Fingerprint.Seed == 0 || env.AccountID != "" || env.Fingerprint.Timezone != payload.Fingerprint.Timezone {
t.Fatalf("invalid pending environment: %#v", env)
}
stored, err := hs.GetEnvironmentContext(ctx, env.Alias)
if err != nil || stored.Gateway != payload.Gateway {
t.Fatalf("selected gateway not stored: %#v %v", stored, err)
}
})
}
pending, err := hs.ListPendingEnvironments(ctx)
if err != nil || len(pending) != 2 {
t.Fatalf("invalid pending list: %#v %v", pending, err)
}
if pending[0].Fingerprint.Seed == pending[1].Fingerprint.Seed {
t.Fatal("environments must have independent fingerprint seeds")
}
profiles, err := cs.ListAccountProfiles(ctx)
if err != nil || len(profiles) != 0 {
t.Fatalf("creation wrote placeholder account: %#v %v", profiles, err)
}
}