Ctrl K
ComunidadGuías…

server/internal/handlers/agent_push_monitor_test.go

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

Archivo original ↗Preguntar a KiBot
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)
}