package admin import ( "encoding/json" "net/http" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/bnema/gordon/internal/adapters/dto" inmocks "github.com/bnema/gordon/internal/boundaries/in/mocks" "github.com/bnema/gordon/internal/domain" ) func TestHandler_TrafficStatus(t *testing.T) { trafficSvc := inmocks.NewMockTrafficStatusService(t) trafficSvc.EXPECT().Status().Return(domain.TrafficStatus{ LastReloadStatus: "ok", EntryPoints: []domain.EntryPointStatus{{ Name: "edge", Address: "127.0.0.1:8443", Protocol: domain.EntryPointProtocolSmartTCP, Active: true, ActiveTCPConnections: 2, TotalAccepted: 3, BytesIn: 11, BytesOut: 22, SmartTCP: domain.SmartTCPCounters{HTTPAccepted: 1, PROXYRefused: 1}, }}, Counters: domain.TrafficCounters{ActiveTCPConnections: 2, TotalAccepted: 3, BytesIn: 11, BytesOut: 22, SmartTCP: domain.SmartTCPCounters{HTTPAccepted: 1, PROXYRefused: 1}}, }) handler := newTestHandler(t, func(d *HandlerDeps) { d.TrafficSvc = trafficSvc }) server := newScopedTestServer(t, handler, "admin:status:read") resp, err := http.Get(server.URL + "/admin/traffic/status") require.NoError(t, err) defer resp.Body.Close() require.Equal(t, http.StatusOK, resp.StatusCode) var body dto.TrafficStatusResponse require.NoError(t, json.NewDecoder(resp.Body).Decode(&body)) assert.Equal(t, "ok", body.LastReloadStatus) require.Len(t, body.EntryPoints, 1) assert.Equal(t, "edge", body.EntryPoints[0].Name) assert.Equal(t, int64(2), body.Counters.ActiveTCPConnections) assert.Equal(t, int64(22), body.Counters.BytesOut) assert.Equal(t, int64(1), body.EntryPoints[0].SmartTCP.HTTPAccepted) assert.Equal(t, int64(1), body.Counters.SmartTCP.PROXYRefused) } func TestHandler_TrafficStatusRequiresStatusRead(t *testing.T) { trafficSvc := inmocks.NewMockTrafficStatusService(t) handler := newTestHandler(t, func(d *HandlerDeps) { d.TrafficSvc = trafficSvc }) server := newScopedTestServer(t, handler, "admin:config:read") resp, err := http.Get(server.URL + "/admin/traffic/status") require.NoError(t, err) defer resp.Body.Close() assert.Equal(t, http.StatusForbidden, resp.StatusCode) } func TestHandler_TrafficStatusUnavailableWithoutService(t *testing.T) { handler := newTestHandler(t, func(d *HandlerDeps) { d.TrafficSvc = nil }) server := newScopedTestServer(t, handler, "admin:status:read") resp, err := http.Get(server.URL + "/admin/traffic/status") require.NoError(t, err) defer resp.Body.Close() require.Equal(t, http.StatusOK, resp.StatusCode) var body dto.TrafficStatusResponse require.NoError(t, json.NewDecoder(resp.Body).Decode(&body)) assert.Equal(t, "unavailable", body.LastReloadStatus) assert.NotNil(t, body.EntryPoints) assert.NotNil(t, body.Routers) assert.NotNil(t, body.Services) }