accounts/internal/xrayconfig/generator_test.go
Haitao Pan 07e31ff6bd feat: move account service to repo root
# Conflicts:
#	account/Makefile
#	account/go.mod
#	docs/account-admin-settings.md
#	docs/account-svc-plus.md
2026-01-16 16:15:23 +08:00

123 lines
2.9 KiB
Go

package xrayconfig
import (
"encoding/json"
"os"
"path/filepath"
"strings"
"testing"
)
type testConfig struct {
Inbounds []struct {
Settings struct {
Clients []struct {
ID string `json:"id"`
Email string `json:"email,omitempty"`
Flow string `json:"flow,omitempty"`
} `json:"clients"`
} `json:"settings"`
} `json:"inbounds"`
}
func TestGeneratorGenerate(t *testing.T) {
dir := t.TempDir()
outputPath := filepath.Join(dir, "config.json")
template := `{
"inbounds": [
{
"settings": {
"clients": [
{"id": "old", "email": "old@example"}
]
}
}
]
}`
gen := Generator{
Definition: JSONDefinition{Raw: []byte(template)},
OutputPath: outputPath,
}
clients := []Client{
{ID: "uuid-a", Email: "a@demo", Flow: "xtls-rprx-vision"},
{ID: "uuid-b"},
}
if err := gen.Generate(clients); err != nil {
t.Fatalf("generate: %v", err)
}
var cfg testConfig
raw, err := gen.Render(clients)
if err != nil {
t.Fatalf("render: %v", err)
}
if err := json.Unmarshal(raw, &cfg); err != nil {
t.Fatalf("decode output: %v", err)
}
if len(cfg.Inbounds) == 0 {
t.Fatalf("expected at least 1 inbound, got %d", len(cfg.Inbounds))
}
clientsSection := cfg.Inbounds[0].Settings.Clients
if len(clientsSection) == 0 {
t.Fatalf("expected client entries, got %d", len(clientsSection))
}
if len(clientsSection) != len(clients) {
t.Fatalf("expected %d clients, got %d", len(clients), len(clientsSection))
}
if clientsSection[0].ID != "uuid-a" || clientsSection[0].Email != "a@demo" {
t.Fatalf("unexpected first client: %+v", clientsSection[0])
}
if clientsSection[0].Flow != "xtls-rprx-vision" {
t.Fatalf("unexpected first client flow: %+v", clientsSection[0])
}
if clientsSection[1].ID != "uuid-b" || clientsSection[1].Email != "" || clientsSection[1].Flow != DefaultFlow {
t.Fatalf("unexpected second client: %+v", clientsSection[1])
}
onDisk, err := os.ReadFile(outputPath)
if err != nil {
t.Fatalf("read output: %v", err)
}
if string(onDisk) != string(raw) {
t.Fatalf("written config does not match rendered output")
}
}
func TestGeneratorGenerateMissingID(t *testing.T) {
dir := t.TempDir()
outputPath := filepath.Join(dir, "config.json")
template := `{"inbounds":[{"settings":{"clients":[]}}]}`
gen := Generator{
Definition: JSONDefinition{Raw: []byte(template)},
OutputPath: outputPath,
}
err := gen.Generate([]Client{{Email: "missing@id"}})
if err == nil || !strings.Contains(err.Error(), "missing id") {
t.Fatalf("expected missing id error, got %v", err)
}
}
func TestGeneratorRenderUsesDefaultDefinition(t *testing.T) {
gen := Generator{}
data, err := gen.Render(nil)
if err != nil {
t.Fatalf("render: %v", err)
}
if len(data) == 0 {
t.Fatal("expected data from default definition")
}
if data[len(data)-1] != '\n' {
t.Fatal("expected render output to end with newline")
}
}