server/internal/handlers/nodes_test.go
Rama main · réplica de lectura del repositorio original.
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)
}