package api import ( "bytes" "context" "encoding/json" "net/http" "net/http/httptest" "testing" "time" "git.dws.rip/dubey/kat/internal/store" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" ) func TestNodeStatusHandler(t *testing.T) { // Create mock state store mockStore := new(MockStateStore) mockStore.On("Put", mock.Anything, mock.MatchedBy(func(key string) bool { return key == "/kat/nodes/status/test-node" }), mock.Anything).Return(nil) // Create node status handler handler := NewNodeStatusHandler(mockStore) // Create test request statusReq := NodeStatusRequest{ NodeName: "test-node", NodeUID: "test-uid", Timestamp: time.Now(), Resources: struct { Capacity map[string]string `json:"capacity"` Allocatable map[string]string `json:"allocatable"` }{ Capacity: map[string]string{ "cpu": "2000m", "memory": "4096Mi", }, Allocatable: map[string]string{ "cpu": "1800m", "memory": "3800Mi", }, }, OverlayNetwork: struct { Status string `json:"status"` LastPeerSync string `json:"lastPeerSync"` }{ Status: "connected", LastPeerSync: time.Now().Format(time.RFC3339), }, } reqBody, err := json.Marshal(statusReq) if err != nil { t.Fatalf("Failed to marshal status request: %v", err) } // Create HTTP request req := httptest.NewRequest("POST", "/v1alpha1/nodes/test-node/status", bytes.NewBuffer(reqBody)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() // Call handler handler(w, req) // Check response resp := w.Result() defer resp.Body.Close() assert.Equal(t, http.StatusOK, resp.StatusCode) // Verify mock was called mockStore.AssertExpectations(t) } func TestNodeStatusHandlerNameMismatch(t *testing.T) { // Create mock state store mockStore := new(MockStateStore) // Create node status handler handler := NewNodeStatusHandler(mockStore) // Create test request with mismatched node name statusReq := NodeStatusRequest{ NodeName: "wrong-node", // This doesn't match the URL path NodeUID: "test-uid", Timestamp: time.Now(), } reqBody, err := json.Marshal(statusReq) if err != nil { t.Fatalf("Failed to marshal status request: %v", err) } // Create HTTP request req := httptest.NewRequest("POST", "/v1alpha1/nodes/test-node/status", bytes.NewBuffer(reqBody)) req.Header.Set("Content-Type", "application/json") w := httptest.NewRecorder() // Call handler handler(w, req) // Check response - should be bad request due to name mismatch resp := w.Result() defer resp.Body.Close() assert.Equal(t, http.StatusBadRequest, resp.StatusCode) // Verify mock was not called mockStore.AssertNotCalled(t, "Put", mock.Anything, mock.Anything, mock.Anything) }