Ctrl K
ComunidadGuías…

server/internal/handlers/nodes_test.go

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

Archivo original ↗Preguntar a KiBot
package handlers_test

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

	"blackbox/server/internal/handlers"
	"blackbox/server/internal/models"
	"github.com/oklog/ulid/v2"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

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

	req := httptest.NewRequest(http.MethodGet, "/api/nodes", nil)
	rr := httptest.NewRecorder()

	handlers.ListNodes(database)(rr, req)

	require.Equal(t, http.StatusOK, rr.Code)
	var result []map[string]interface{}
	require.NoError(t, json.Unmarshal(rr.Body.Bytes(), &result))
	assert.Len(t, result, 0)
}

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

	require.NoError(t, database.Create(&models.Node{
		ID:       ulid.Make().String(),
		Name:     "online-node",
		LastSeen: time.Now().UTC().Add(-2 * time.Minute),
	}).Error)
	require.NoError(t, database.Create(&models.Node{
		ID:       ulid.Make().String(),
		Name:     "offline-node",
		LastSeen: time.Now().UTC().Add(-10 * time.Minute),
	}).Error)

	req := httptest.NewRequest(http.MethodGet, "/api/nodes", nil)
	rr := httptest.NewRecorder()

	handlers.ListNodes(database)(rr, req)

	require.Equal(t, http.StatusOK, rr.Code)

	var nodes []struct {
		Name   string `json:"name"`
		Status string `json:"status"`
	}
	require.NoError(t, json.Unmarshal(rr.Body.Bytes(), &nodes))
	require.Len(t, nodes, 2)

	statusByName := map[string]string{}
	for _, node := range nodes {
		statusByName[node.Name] = node.Status
	}
	assert.Equal(t, "online", statusByName["online-node"])
	assert.Equal(t, "offline", statusByName["offline-node"])
}

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

	require.NoError(t, database.Create(&models.Node{
		ID:       ulid.Make().String(),
		Name:     "graceful-stop-node",
		LastSeen: time.Now().UTC().Add(-30 * time.Second),
		Status:   "offline",
	}).Error)

	req := httptest.NewRequest(http.MethodGet, "/api/nodes", nil)
	rr := httptest.NewRecorder()

	handlers.ListNodes(database)(rr, req)

	require.Equal(t, http.StatusOK, rr.Code)

	var nodes []struct {
		Name   string `json:"name"`
		Status string `json:"status"`
	}
	require.NoError(t, json.Unmarshal(rr.Body.Bytes(), &nodes))
	require.Len(t, nodes, 1)
	assert.Equal(t, "offline", nodes[0].Status)
}