Ctrl K
ComunidadGuías…

server/internal/handlers/setup_test.go

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

Archivo original ↗Preguntar a KiBot
package handlers_test

import (
	"bytes"
	"context"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"

	"blackbox/server/internal/db"
	"blackbox/server/internal/handlers"
	"blackbox/server/internal/middleware"
	"blackbox/server/internal/models"
	"blackbox/shared/types"
	"github.com/go-chi/chi/v5"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"gorm.io/gorm"
)

func newTestDB(t *testing.T) *gorm.DB {
	t.Helper()
	database, err := db.Init(":memory:")
	require.NoError(t, err)
	return database
}

func authenticatedAgentRequest(t *testing.T, entry types.Entry, nodeName string) (*http.Request, *httptest.ResponseRecorder, func(http.Handler) http.Handler) {
	t.Helper()

	body, err := json.Marshal(entry)
	require.NoError(t, err)

	config, err := middleware.NewAgentAuthConfig(nodeName + "=node-secret")
	require.NoError(t, err)

	req := httptest.NewRequest(http.MethodPost, "/api/agent/push", bytes.NewReader(body))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-Blackbox-Agent-Key", "node-secret")
	req.Header.Set("X-Blackbox-Node-Name", nodeName)

	w := httptest.NewRecorder()
	return req, w, middleware.AgentAuth(config)
}

func testIncidentChannel(t *testing.T) chan types.Entry {
	t.Helper()

	ch := make(chan types.Entry, 16)
	t.Cleanup(func() {
		for {
			select {
			case <-ch:
			default:
				return
			}
		}
	})
	return ch
}

func withChiParam(r *http.Request, key, value string) *http.Request {
	rctx := chi.NewRouteContext()
	rctx.URLParams.Add(key, value)
	return r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, rctx))
}

func TestSetupStatus_NotBootstrapped(t *testing.T) {
	database := newTestDB(t)

	req := httptest.NewRequest(http.MethodGet, "/api/setup/status", nil)
	w := httptest.NewRecorder()

	handlers.SetupStatus(database)(w, req)

	assert.Equal(t, http.StatusOK, w.Code)
	var resp map[string]bool
	require.NoError(t, json.NewDecoder(w.Body).Decode(&resp))
	assert.False(t, resp["bootstrapped"])
}

func TestSetupStatus_Bootstrapped(t *testing.T) {
	database := newTestDB(t)
	database.Create(&models.User{ID: "01ADMIN", Username: "admin", IsAdmin: true})

	req := httptest.NewRequest(http.MethodGet, "/api/setup/status", nil)
	w := httptest.NewRecorder()

	handlers.SetupStatus(database)(w, req)

	assert.Equal(t, http.StatusOK, w.Code)
	var resp map[string]bool
	require.NoError(t, json.NewDecoder(w.Body).Decode(&resp))
	assert.True(t, resp["bootstrapped"])
}

func TestSetupStatus_DBError_Returns503(t *testing.T) {
	database, err := db.Init(":memory:")
	require.NoError(t, err)
	sqlDB, err := database.DB()
	require.NoError(t, err)
	require.NoError(t, sqlDB.Close())

	req := httptest.NewRequest(http.MethodGet, "/api/setup/status", nil)
	w := httptest.NewRecorder()

	handlers.SetupStatus(database)(w, req)

	assert.Equal(t, http.StatusServiceUnavailable, w.Code)
}

func authenticatedBatchRequest(t *testing.T, entries []types.Entry, nodeName string) (*http.Request, *httptest.ResponseRecorder, func(http.Handler) http.Handler) {
	t.Helper()

	body, err := json.Marshal(entries)
	require.NoError(t, err)

	config, err := middleware.NewAgentAuthConfig(nodeName + "=node-secret")
	require.NoError(t, err)

	req := httptest.NewRequest(http.MethodPost, "/api/agent/push/batch", bytes.NewReader(body))
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("X-Blackbox-Agent-Key", "node-secret")
	req.Header.Set("X-Blackbox-Node-Name", nodeName)

	w := httptest.NewRecorder()
	return req, w, middleware.AgentAuth(config)
}