From 906d15fc9b3d0daf4d3c1d9e70e9554414c8296b Mon Sep 17 00:00:00 2001 From: Wikid82 Date: Wed, 19 Nov 2025 21:17:39 -0500 Subject: [PATCH] test: Add CRUD tests for RemoteServer and ProxyHost handlers --- .../internal/api/handlers/handlers_test.go | 110 ++++++++++++++++++ .../api/handlers/proxy_host_handler_test.go | 59 ++++++++++ 2 files changed, 169 insertions(+) diff --git a/backend/internal/api/handlers/handlers_test.go b/backend/internal/api/handlers/handlers_test.go index 64e8bfd1..5b7db0c5 100644 --- a/backend/internal/api/handlers/handlers_test.go +++ b/backend/internal/api/handlers/handlers_test.go @@ -132,6 +132,116 @@ func TestRemoteServerHandler_TestConnection(t *testing.T) { assert.NotEmpty(t, result["error"]) } +func TestRemoteServerHandler_Get(t *testing.T) { + gin.SetMode(gin.TestMode) + db := setupTestDB() + + // Create test server + server := &models.RemoteServer{ + UUID: uuid.NewString(), + Name: "Test Server", + Provider: "docker", + Host: "localhost", + Port: 8080, + Enabled: true, + } + db.Create(server) + + handler := handlers.NewRemoteServerHandler(db) + router := gin.New() + handler.RegisterRoutes(router.Group("/api/v1")) + + // Test Get + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/api/v1/remote-servers/"+server.UUID, nil) + router.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + + var fetched models.RemoteServer + err := json.Unmarshal(w.Body.Bytes(), &fetched) + assert.NoError(t, err) + assert.Equal(t, server.UUID, fetched.UUID) +} + +func TestRemoteServerHandler_Update(t *testing.T) { + gin.SetMode(gin.TestMode) + db := setupTestDB() + + // Create test server + server := &models.RemoteServer{ + UUID: uuid.NewString(), + Name: "Test Server", + Provider: "docker", + Host: "localhost", + Port: 8080, + Enabled: true, + } + db.Create(server) + + handler := handlers.NewRemoteServerHandler(db) + router := gin.New() + handler.RegisterRoutes(router.Group("/api/v1")) + + // Test Update + updateData := map[string]interface{}{ + "name": "Updated Server", + "provider": "generic", + "host": "10.0.0.1", + "port": 9000, + "enabled": false, + } + body, _ := json.Marshal(updateData) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("PUT", "/api/v1/remote-servers/"+server.UUID, bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + router.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + + var updated models.RemoteServer + err := json.Unmarshal(w.Body.Bytes(), &updated) + assert.NoError(t, err) + assert.Equal(t, "Updated Server", updated.Name) + assert.Equal(t, "generic", updated.Provider) + assert.False(t, updated.Enabled) +} + +func TestRemoteServerHandler_Delete(t *testing.T) { + gin.SetMode(gin.TestMode) + db := setupTestDB() + + // Create test server + server := &models.RemoteServer{ + UUID: uuid.NewString(), + Name: "Test Server", + Provider: "docker", + Host: "localhost", + Port: 8080, + Enabled: true, + } + db.Create(server) + + handler := handlers.NewRemoteServerHandler(db) + router := gin.New() + handler.RegisterRoutes(router.Group("/api/v1")) + + // Test Delete + w := httptest.NewRecorder() + req, _ := http.NewRequest("DELETE", "/api/v1/remote-servers/"+server.UUID, nil) + router.ServeHTTP(w, req) + + assert.Equal(t, http.StatusNoContent, w.Code) + + // Verify Delete + w2 := httptest.NewRecorder() + req2, _ := http.NewRequest("GET", "/api/v1/remote-servers/"+server.UUID, nil) + router.ServeHTTP(w2, req2) + + assert.Equal(t, http.StatusNotFound, w2.Code) +} + func TestProxyHostHandler_List(t *testing.T) { gin.SetMode(gin.TestMode) db := setupTestDB() diff --git a/backend/internal/api/handlers/proxy_host_handler_test.go b/backend/internal/api/handlers/proxy_host_handler_test.go index 85254e0c..e9ca44ba 100644 --- a/backend/internal/api/handlers/proxy_host_handler_test.go +++ b/backend/internal/api/handlers/proxy_host_handler_test.go @@ -53,4 +53,63 @@ func TestProxyHostLifecycle(t *testing.T) { var hosts []models.ProxyHost require.NoError(t, json.Unmarshal(listResp.Body.Bytes(), &hosts)) require.Len(t, hosts, 1) + + // Get by ID + getReq := httptest.NewRequest(http.MethodGet, "/api/v1/proxy-hosts/"+created.UUID, nil) + getResp := httptest.NewRecorder() + router.ServeHTTP(getResp, getReq) + require.Equal(t, http.StatusOK, getResp.Code) + + var fetched models.ProxyHost + require.NoError(t, json.Unmarshal(getResp.Body.Bytes(), &fetched)) + require.Equal(t, created.UUID, fetched.UUID) + + // Update + updateBody := `{"name":"Media Updated","domain_names":"media.example.com","forward_scheme":"http","forward_host":"media","forward_port":32400,"enabled":false}` + updateReq := httptest.NewRequest(http.MethodPut, "/api/v1/proxy-hosts/"+created.UUID, strings.NewReader(updateBody)) + updateReq.Header.Set("Content-Type", "application/json") + updateResp := httptest.NewRecorder() + router.ServeHTTP(updateResp, updateReq) + require.Equal(t, http.StatusOK, updateResp.Code) + + var updated models.ProxyHost + require.NoError(t, json.Unmarshal(updateResp.Body.Bytes(), &updated)) + require.Equal(t, "Media Updated", updated.Name) + require.False(t, updated.Enabled) + + // Delete + delReq := httptest.NewRequest(http.MethodDelete, "/api/v1/proxy-hosts/"+created.UUID, nil) + delResp := httptest.NewRecorder() + router.ServeHTTP(delResp, delReq) + require.Equal(t, http.StatusOK, delResp.Code) + + // Verify Delete + getReq2 := httptest.NewRequest(http.MethodGet, "/api/v1/proxy-hosts/"+created.UUID, nil) + getResp2 := httptest.NewRecorder() + router.ServeHTTP(getResp2, getReq2) + require.Equal(t, http.StatusNotFound, getResp2.Code) +} + +func TestProxyHostErrors(t *testing.T) { + router, _ := setupTestRouter(t) + + // Get non-existent + req := httptest.NewRequest(http.MethodGet, "/api/v1/proxy-hosts/non-existent-uuid", nil) + resp := httptest.NewRecorder() + router.ServeHTTP(resp, req) + require.Equal(t, http.StatusNotFound, resp.Code) + + // Update non-existent + updateBody := `{"name":"Media Updated"}` + updateReq := httptest.NewRequest(http.MethodPut, "/api/v1/proxy-hosts/non-existent-uuid", strings.NewReader(updateBody)) + updateReq.Header.Set("Content-Type", "application/json") + updateResp := httptest.NewRecorder() + router.ServeHTTP(updateResp, updateReq) + require.Equal(t, http.StatusNotFound, updateResp.Code) + + // Delete non-existent + delReq := httptest.NewRequest(http.MethodDelete, "/api/v1/proxy-hosts/non-existent-uuid", nil) + delResp := httptest.NewRecorder() + router.ServeHTTP(delResp, delReq) + require.Equal(t, http.StatusNotFound, delResp.Code) }