Ctrl K
ComunidadGuías…

internal/server/analytics_settings_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// SPDX-License-Identifier: Apache-2.0

package server

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"path/filepath"
	"testing"
	"time"

	appdb "github.com/X4Applegate/caddyui/internal/db"
	"github.com/X4Applegate/caddyui/internal/models"
)

func TestLoadAnalyticsConfigSoftStartDefaultsAndOverrides(t *testing.T) {
	conn, err := appdb.Open(filepath.Join(t.TempDir(), "caddyui.db"))
	if err != nil {
		t.Fatal(err)
	}
	t.Cleanup(func() { _ = conn.Close() })

	cfg := loadAnalyticsConfig(conn)
	if !cfg.SoftStart {
		t.Fatal("SoftStart = false on an unset configuration, want true")
	}
	if cfg.DialTimeout != 5*time.Second {
		t.Fatalf("DialTimeout = %s, want 5s", cfg.DialTimeout)
	}

	if err := models.SetSetting(conn, settingAnalyticsSoftStart, "0"); err != nil {
		t.Fatal(err)
	}
	if err := models.SetSetting(conn, settingAnalyticsDialTimeoutSec, "12"); err != nil {
		t.Fatal(err)
	}
	cfg = loadAnalyticsConfig(conn)
	if cfg.SoftStart {
		t.Fatal("SoftStart = true after explicit disable, want false")
	}
	if cfg.DialTimeout != 12*time.Second {
		t.Fatalf("DialTimeout = %s, want 12s", cfg.DialTimeout)
	}
}

func TestReconcileAnalyticsAccessLogsAppliesSafeUpgradeDefaults(t *testing.T) {
	conn, err := appdb.Open(filepath.Join(t.TempDir(), "caddyui.db"))
	if err != nil {
		t.Fatal(err)
	}
	t.Cleanup(func() { _ = conn.Close() })

	var writer map[string]any
	admin := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		switch {
		case r.Method == http.MethodPost && r.URL.Path == "/config/logging/logs/caddyui_access":
			var logger map[string]any
			if err := json.NewDecoder(r.Body).Decode(&logger); err != nil {
				t.Fatalf("decode logger: %v", err)
			}
			writer, _ = logger["writer"].(map[string]any)
			w.WriteHeader(http.StatusOK)
		case r.Method == http.MethodGet && r.URL.Path == "/config/":
			w.Header().Set("Content-Type", "application/json")
			_, _ = w.Write([]byte(`{"apps":{"http":{"servers":{"srv0":{}}}}}`))
		case r.Method == http.MethodPost && r.URL.Path == "/config/apps/http/servers/srv0/logs":
			w.WriteHeader(http.StatusOK)
		default:
			http.Error(w, "unexpected request", http.StatusNotFound)
		}
	}))
	defer admin.Close()

	if _, err := models.CreateCaddyServer(conn, &models.CaddyServer{
		Name: "Primary", AdminURL: admin.URL, Type: models.CaddyServerTypeManaged,
	}); err != nil {
		t.Fatal(err)
	}
	if err := models.SetSetting(conn, settingAnalyticsEnabled, "1"); err != nil {
		t.Fatal(err)
	}

	s := &Server{DB: conn}
	if err := s.ReconcileAnalyticsAccessLogs(); err != nil {
		t.Fatal(err)
	}
	if writer["soft_start"] != true {
		t.Fatalf("soft_start = %#v, want true", writer["soft_start"])
	}
	if writer["dial_timeout"] != "5s" {
		t.Fatalf("dial_timeout = %#v, want 5s", writer["dial_timeout"])
	}
}