package services import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "edge-infra.dev/pkg/edge/device-registrar/config" test "edge-infra.dev/pkg/edge/device-registrar/utils/test" ienApi "edge-infra.dev/pkg/sds/ien/k8s/apis/v1" ) func TestPairFailVIPAddress(t *testing.T) { router, scheme := setupTest() mockClient := test.NewErrorInjectingFakeClient(scheme, true) router.Use(injectMockClientMiddleware(t, mockClient)) w := servePairRequest(t, router) assert.Equal(t, http.StatusInternalServerError, w.Code) assert.Contains(t, w.Body.String(), "failed to retrieve VIP address") } func TestPairSuccess(t *testing.T) { router, scheme := setupTest() node := ienApi.IENode{ ObjectMeta: metav1.ObjectMeta{ Name: "test-node", Namespace: "device-registrar-clients", }, Spec: ienApi.IENodeSpec{ NetworkServices: ienApi.NetworkServices{ KubeVip: "172.0.0.1", }, }, } mockClient := test.NewErrorInjectingFakeClient(scheme, true, &node) router.Use(injectMockClientMiddleware(t, mockClient)) w := servePairRequest(t, router) assert.Equal(t, http.StatusOK, w.Code) var resp DevicePairResponse err := json.Unmarshal(w.Body.Bytes(), &resp) assert.NoError(t, err) assert.Contains(t, resp.ConnectURL, config.ConnectURL) } func TestPairFailCreateDevBinding(t *testing.T) { router, scheme := setupTest() mockClient := test.NewErrorInjectingFakeClient(scheme, true) mockClient.SetFailOnCreate() router.Use(injectMockClientMiddleware(t, mockClient)) w := servePairRequest(t, router) // status code 500 assert.Equal(t, http.StatusInternalServerError, w.Code) // confirm response contains the error message assert.Contains(t, w.Body.String(), "failed to create device binding: create error") } func TestPairFailUpdateDevBinding(t *testing.T) { router, scheme := setupTest() mockClient := test.NewErrorInjectingFakeClient(scheme, true) mockClient.SetFailOnStatus() mockClient.NewCustomSubResourceWriter().SetFailOnUpdate() router.Use(injectMockClientMiddleware(t, mockClient)) w := servePairRequest(t, router) // status code 500 assert.Equal(t, http.StatusInternalServerError, w.Code) // confirm response contains the error message assert.Contains(t, w.Body.String(), "failed to update deviceBinding status") } func servePairRequest(t *testing.T, router *gin.Engine) *httptest.ResponseRecorder { // register endpoint router.POST("/pair", Pair) // Create a new HTTP request req, err := http.NewRequest(http.MethodPost, "/pair", nil) assert.NoError(t, err) w := httptest.NewRecorder() router.ServeHTTP(w, req) return w }