server/internal/handlers/agent_push_monitor_test.go
Rama main · réplica de lectura del repositorio original.
package handlers_test
import (
"context"
"encoding/json"
"testing"
"time"
"blackbox/server/internal/handlers"
"blackbox/server/internal/hub"
"blackbox/server/internal/models"
"github.com/oklog/ulid/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestStartNodeStatusMonitor_MarksStaleNodesOfflineAndBroadcasts(t *testing.T) {
database := newTestDB(t)
require.NoError(t, database.Create(&models.Node{
ID: ulid.Make().String(),
Name: "stale-node",
LastSeen: time.Now().UTC().Add(-10 * time.Minute),
Status: "online",
}).Error)
eventHub := hub.New()
_, ch, _, unsub, err := eventHub.Subscribe("user-1", "127.0.0.1")
require.NoError(t, err)
defer unsub()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
handlers.StartNodeStatusMonitor(ctx, database, eventHub, 10*time.Millisecond)
var message handlers.WSMessage
select {
case raw := <-ch:
require.NoError(t, json.Unmarshal(raw, &message))
case <-time.After(time.Second):
t.Fatal("timed out waiting for node_status broadcast")
}
assert.Equal(t, "node_status", message.Type)
require.Eventually(t, func() bool {
var node models.Node
if err := database.Where("name = ?", "stale-node").First(&node).Error; err != nil {
return false
}
return node.Status == "offline"
}, time.Second, 20*time.Millisecond)
}