feat: complete cmpp gateway delivery recovery workflows
This commit is contained in:
@@ -7,6 +7,9 @@ import (
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"cmpp-platform/gateway/internal/inbound"
|
||||
)
|
||||
|
||||
func TestConnectChannelCallbacksConnectedState(t *testing.T) {
|
||||
@@ -84,6 +87,99 @@ func TestConnectChannelRejectsInvalidCommand(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecoveryCandidatesEndpointReturnsView(t *testing.T) {
|
||||
handler := handlerWithServer(Server{
|
||||
RecoveryCandidates: func(context.Context) ([]inbound.DownstreamPresence, error) {
|
||||
return []inbound.DownstreamPresence{{
|
||||
Account: "100001",
|
||||
GatewayInstanceID: "gateway-a",
|
||||
State: "connected",
|
||||
UpdatedAt: time.Now().UTC(),
|
||||
}}, nil
|
||||
},
|
||||
})
|
||||
|
||||
resp := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodGet, "/downstream/recovery-candidates", nil)
|
||||
handler.ServeHTTP(resp, req)
|
||||
|
||||
if resp.Code != http.StatusOK {
|
||||
t.Fatalf("unexpected response status: %d body=%s", resp.Code, resp.Body.String())
|
||||
}
|
||||
var payload []inbound.DownstreamPresence
|
||||
if err := json.Unmarshal(resp.Body.Bytes(), &payload); err != nil {
|
||||
t.Fatalf("decode response: %v", err)
|
||||
}
|
||||
if len(payload) != 1 || payload[0].Account != "100001" {
|
||||
t.Fatalf("unexpected payload: %+v", payload)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecoveryStatusesEndpointReturnsView(t *testing.T) {
|
||||
handler := handlerWithServer(Server{
|
||||
RecoveryStatuses: func(context.Context) ([]inbound.DownstreamRecoveryStatus, error) {
|
||||
return []inbound.DownstreamRecoveryStatus{{
|
||||
Account: "100001",
|
||||
GatewayInstanceID: "gateway-a",
|
||||
State: "waiting_connection",
|
||||
AttemptCount: 2,
|
||||
}}, nil
|
||||
},
|
||||
})
|
||||
|
||||
resp := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodGet, "/downstream/recovery-statuses", nil)
|
||||
handler.ServeHTTP(resp, req)
|
||||
|
||||
if resp.Code != http.StatusOK {
|
||||
t.Fatalf("unexpected response status: %d body=%s", resp.Code, resp.Body.String())
|
||||
}
|
||||
var payload []inbound.DownstreamRecoveryStatus
|
||||
if err := json.Unmarshal(resp.Body.Bytes(), &payload); err != nil {
|
||||
t.Fatalf("decode response: %v", err)
|
||||
}
|
||||
if len(payload) != 1 || payload[0].State != "waiting_connection" || payload[0].AttemptCount != 2 {
|
||||
t.Fatalf("unexpected payload: %+v", payload)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRecoveryOverviewEndpointReturnsCombinedView(t *testing.T) {
|
||||
handler := handlerWithServer(Server{
|
||||
RecoveryCandidates: func(context.Context) ([]inbound.DownstreamPresence, error) {
|
||||
return []inbound.DownstreamPresence{{
|
||||
Account: "100001",
|
||||
GatewayInstanceID: "gateway-a",
|
||||
State: "connected",
|
||||
}}, nil
|
||||
},
|
||||
RecoveryStatuses: func(context.Context) ([]inbound.DownstreamRecoveryStatus, error) {
|
||||
return []inbound.DownstreamRecoveryStatus{{
|
||||
Account: "100001",
|
||||
GatewayInstanceID: "gateway-a",
|
||||
State: "success",
|
||||
}}, nil
|
||||
},
|
||||
})
|
||||
|
||||
resp := httptest.NewRecorder()
|
||||
req := httptest.NewRequest(http.MethodGet, "/downstream/recovery-overview", nil)
|
||||
handler.ServeHTTP(resp, req)
|
||||
|
||||
if resp.Code != http.StatusOK {
|
||||
t.Fatalf("unexpected response status: %d body=%s", resp.Code, resp.Body.String())
|
||||
}
|
||||
var payload DownstreamRecoveryOverview
|
||||
if err := json.Unmarshal(resp.Body.Bytes(), &payload); err != nil {
|
||||
t.Fatalf("decode response: %v", err)
|
||||
}
|
||||
if len(payload.Candidates) != 1 || payload.Candidates[0].Account != "100001" {
|
||||
t.Fatalf("unexpected candidate payload: %+v", payload.Candidates)
|
||||
}
|
||||
if len(payload.Statuses) != 1 || payload.Statuses[0].State != "success" {
|
||||
t.Fatalf("unexpected status payload: %+v", payload.Statuses)
|
||||
}
|
||||
}
|
||||
|
||||
type testDialError struct{}
|
||||
|
||||
func (testDialError) Error() string {
|
||||
@@ -93,8 +189,12 @@ func (testDialError) Error() string {
|
||||
var errTestDial testDialError
|
||||
|
||||
func handlerWithDial(apiBaseURL string, dial DialFunc) http.Handler {
|
||||
return handlerWithServer(Server{APIBaseURL: apiBaseURL, Dial: dial})
|
||||
}
|
||||
|
||||
func handlerWithServer(server Server) http.Handler {
|
||||
mux := http.NewServeMux()
|
||||
Register(mux, Server{APIBaseURL: apiBaseURL, Dial: dial})
|
||||
Register(mux, server)
|
||||
return mux
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user