Ctrl K
ComunidadGuías…

repair_endpoint_test.go

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

Archivo original ↗Preguntar a KiBot
package predastore

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

	"github.com/mulgadc/predastore/internal/gate/repair"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

type fakeRepairReporter struct {
	stats repair.Stats
	ok    bool
}

func (f fakeRepairReporter) RepairStats() (repair.Stats, bool) { return f.stats, f.ok }

func serveRepair(t *testing.T, gw repairReporter) map[string]any {
	t.Helper()

	ep := repairEndpoint(gw)
	require.Equal(t, "GET /repair", ep.Pattern)

	rec := httptest.NewRecorder()
	ep.Handler.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/repair", nil))
	require.Equal(t, http.StatusOK, rec.Code)

	var body map[string]any
	require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &body))

	return body
}

func TestRepairEndpointServesTheCounters(t *testing.T) {
	body := serveRepair(t, fakeRepairReporter{ok: true, stats: repair.Stats{
		Passes: 3, Pending: 1, FailedPeerMissing: 1, RepairedRebuild: 4,
		LastPass: &repair.PassSummary{Outcome: repair.OutcomeComplete, Owed: 1, DurationMs: 42},
	}})

	assert.Equal(t, true, body["enabled"])
	stats, ok := body["stats"].(map[string]any)
	require.True(t, ok, "stats must be an object: %v", body)
	assert.InDelta(t, 3, stats["passes"], 0)
	assert.InDelta(t, 1, stats["pending"], 0)
	assert.InDelta(t, 1, stats["failed_peer_missing"], 0)
	assert.InDelta(t, 4, stats["repaired_rebuild"], 0)

	last, ok := stats["last_pass"].(map[string]any)
	require.True(t, ok, "last_pass must be an object: %v", stats)
	assert.Equal(t, "complete", last["outcome"])
	assert.InDelta(t, 1, last["owed"], 0)
	assert.InDelta(t, 42, last["duration_ms"], 0)
}

func TestRepairEndpointOnAGateThatRunsNoRepair(t *testing.T) {
	body := serveRepair(t, fakeRepairReporter{})

	assert.Equal(t, false, body["enabled"])
	assert.NotContains(t, body, "stats")
}