veza/veza-backend-api/internal/handlers/frontend_log_handler_test.go

201 lines
5.2 KiB
Go

package handlers
import (
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"go.uber.org/zap"
"veza-backend-api/internal/logging"
)
func TestFrontendLogHandler_ReceiveLog_Success(t *testing.T) {
// Setup
gin.SetMode(gin.TestMode)
router := gin.New()
logger := zap.NewNop()
frontendLogger, _ := logging.NewLoggerWithFileRotation("./test_logs", "frontend", "test", "info")
handler := &FrontendLogHandler{
logger: logger,
frontendLogger: frontendLogger,
logDir: "./test_logs",
commonHandler: NewCommonHandler(logger),
}
router.POST("/api/v1/logs/frontend", handler.ReceiveLog)
reqBody := FrontendLogRequest{
Timestamp: "2024-01-01T00:00:00Z",
Level: "INFO",
Message: "Test log message",
Context: map[string]interface{}{"request_id": "test-123"},
}
body, _ := json.Marshal(reqBody)
// Execute
req, _ := http.NewRequest("POST", "/api/v1/logs/frontend", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
// Assert
assert.Equal(t, http.StatusOK, w.Code)
var response map[string]interface{}
err := json.Unmarshal(w.Body.Bytes(), &response)
assert.NoError(t, err)
assert.True(t, response["success"].(bool))
}
func TestFrontendLogHandler_ReceiveLog_InvalidJSON(t *testing.T) {
// Setup
gin.SetMode(gin.TestMode)
router := gin.New()
logger := zap.NewNop()
frontendLogger, _ := logging.NewLoggerWithFileRotation("./test_logs", "frontend", "test", "info")
handler := &FrontendLogHandler{
logger: logger,
frontendLogger: frontendLogger,
logDir: "./test_logs",
commonHandler: NewCommonHandler(logger),
}
router.POST("/api/v1/logs/frontend", handler.ReceiveLog)
// Execute - Invalid JSON
req, _ := http.NewRequest("POST", "/api/v1/logs/frontend", bytes.NewBuffer([]byte("invalid json")))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
// Assert
assert.Equal(t, http.StatusBadRequest, w.Code)
}
func TestFrontendLogHandler_ReceiveLog_DefaultLevel(t *testing.T) {
// Setup
gin.SetMode(gin.TestMode)
router := gin.New()
logger := zap.NewNop()
frontendLogger, _ := logging.NewLoggerWithFileRotation("./test_logs", "frontend", "test", "info")
handler := &FrontendLogHandler{
logger: logger,
frontendLogger: frontendLogger,
logDir: "./test_logs",
commonHandler: NewCommonHandler(logger),
}
router.POST("/api/v1/logs/frontend", handler.ReceiveLog)
reqBody := FrontendLogRequest{
Timestamp: "2024-01-01T00:00:00Z",
Level: "", // Empty level should default to INFO
Message: "Test log message",
}
body, _ := json.Marshal(reqBody)
// Execute
req, _ := http.NewRequest("POST", "/api/v1/logs/frontend", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
// Assert
assert.Equal(t, http.StatusOK, w.Code)
var response map[string]interface{}
err := json.Unmarshal(w.Body.Bytes(), &response)
assert.NoError(t, err)
data := response["data"].(map[string]interface{})
assert.Equal(t, "INFO", data["level"])
}
func TestFrontendLogHandler_ReceiveLog_DifferentLevels(t *testing.T) {
// Setup
gin.SetMode(gin.TestMode)
router := gin.New()
logger := zap.NewNop()
frontendLogger, _ := logging.NewLoggerWithFileRotation("./test_logs", "frontend", "test", "info")
handler := &FrontendLogHandler{
logger: logger,
frontendLogger: frontendLogger,
logDir: "./test_logs",
commonHandler: NewCommonHandler(logger),
}
router.POST("/api/v1/logs/frontend", handler.ReceiveLog)
levels := []string{"DEBUG", "INFO", "WARN", "ERROR", "UNKNOWN"}
for _, level := range levels {
reqBody := FrontendLogRequest{
Timestamp: "2024-01-01T00:00:00Z",
Level: level,
Message: "Test log message",
}
body, _ := json.Marshal(reqBody)
// Execute
req, _ := http.NewRequest("POST", "/api/v1/logs/frontend", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
// Assert
assert.Equal(t, http.StatusOK, w.Code, "Level: %s", level)
}
}
func TestFrontendLogHandler_ReceiveLog_WithContext(t *testing.T) {
// Setup
gin.SetMode(gin.TestMode)
router := gin.New()
logger := zap.NewNop()
frontendLogger, _ := logging.NewLoggerWithFileRotation("./test_logs", "frontend", "test", "info")
handler := &FrontendLogHandler{
logger: logger,
frontendLogger: frontendLogger,
logDir: "./test_logs",
commonHandler: NewCommonHandler(logger),
}
router.POST("/api/v1/logs/frontend", handler.ReceiveLog)
reqBody := FrontendLogRequest{
Timestamp: "2024-01-01T00:00:00Z",
Level: "INFO",
Message: "Test log message",
Context: map[string]interface{}{
"request_id": "test-123",
"user_id": "user-456",
"action": "test_action",
},
Data: map[string]interface{}{
"key": "value",
},
}
body, _ := json.Marshal(reqBody)
// Execute
req, _ := http.NewRequest("POST", "/api/v1/logs/frontend", bytes.NewBuffer(body))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
// Assert
assert.Equal(t, http.StatusOK, w.Code)
}