132 lines
4.6 KiB
Go
132 lines
4.6 KiB
Go
package validator
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNewDatasourceNotFoundError(t *testing.T) {
|
|
err := NewDatasourceNotFoundError("test-uid", "org-1")
|
|
|
|
require.Equal(t, ErrCodeDatasourceNotFound, err.Code)
|
|
require.Equal(t, http.StatusNotFound, err.StatusCode)
|
|
require.Equal(t, "test-uid", err.Details["datasourceUID"])
|
|
require.Equal(t, "org-1", err.Details["namespace"])
|
|
}
|
|
|
|
func TestNewDatasourceWrongTypeError(t *testing.T) {
|
|
err := NewDatasourceWrongTypeError("test-uid", "prometheus", "influxdb")
|
|
|
|
require.Equal(t, ErrCodeDatasourceWrongType, err.Code)
|
|
require.Equal(t, http.StatusBadRequest, err.StatusCode)
|
|
require.Equal(t, "prometheus", err.Details["expectedType"])
|
|
require.Equal(t, "influxdb", err.Details["actualType"])
|
|
}
|
|
|
|
func TestNewDatasourceUnreachableError(t *testing.T) {
|
|
cause := errors.New("connection refused")
|
|
err := NewDatasourceUnreachableError("test-uid", "http://localhost:9090", cause)
|
|
|
|
require.Equal(t, ErrCodeDatasourceUnreachable, err.Code)
|
|
require.Equal(t, http.StatusServiceUnavailable, err.StatusCode)
|
|
require.Equal(t, cause, err.Cause)
|
|
require.Equal(t, "http://localhost:9090", err.Details["url"])
|
|
}
|
|
|
|
func TestNewAPIUnavailableError(t *testing.T) {
|
|
err := NewAPIUnavailableError(503, "service unavailable", nil)
|
|
|
|
require.Equal(t, ErrCodeAPIUnavailable, err.Code)
|
|
require.Equal(t, http.StatusBadGateway, err.StatusCode)
|
|
require.Equal(t, 503, err.Details["upstreamStatus"])
|
|
}
|
|
|
|
func TestNewAPIInvalidResponseError(t *testing.T) {
|
|
cause := errors.New("invalid JSON")
|
|
err := NewAPIInvalidResponseError("missing data field", cause)
|
|
|
|
require.Equal(t, ErrCodeAPIInvalidResponse, err.Code)
|
|
require.Equal(t, http.StatusBadGateway, err.StatusCode)
|
|
require.Equal(t, cause, err.Cause)
|
|
}
|
|
|
|
func TestNewAPITimeoutError(t *testing.T) {
|
|
cause := errors.New("context deadline exceeded")
|
|
err := NewAPITimeoutError("http://localhost:9090/api/v1/query", cause)
|
|
|
|
require.Equal(t, ErrCodeAPITimeout, err.Code)
|
|
require.Equal(t, http.StatusGatewayTimeout, err.StatusCode)
|
|
require.Equal(t, cause, err.Cause)
|
|
}
|
|
|
|
func TestNewDatasourceAuthError(t *testing.T) {
|
|
err := NewDatasourceAuthError("test-uid", 401)
|
|
|
|
require.Equal(t, ErrCodeDatasourceAuth, err.Code)
|
|
require.Equal(t, http.StatusUnauthorized, err.StatusCode)
|
|
require.Equal(t, 401, err.Details["upstreamStatus"])
|
|
}
|
|
|
|
func TestValidationErrorChaining(t *testing.T) {
|
|
cause := errors.New("network error")
|
|
err := NewValidationError(ErrCodeInternal, "test error", http.StatusInternalServerError).
|
|
WithCause(cause).
|
|
WithDetail("key1", "value1").
|
|
WithDetail("key2", 123)
|
|
|
|
require.Equal(t, cause, err.Cause)
|
|
require.Equal(t, "value1", err.Details["key1"])
|
|
require.Equal(t, 123, err.Details["key2"])
|
|
}
|
|
|
|
func TestIsValidationError(t *testing.T) {
|
|
validationErr := NewDatasourceNotFoundError("test-uid", "org-1")
|
|
regularErr := errors.New("regular error")
|
|
|
|
require.True(t, IsValidationError(validationErr), "expected IsValidationError to return true for ValidationError")
|
|
require.False(t, IsValidationError(regularErr), "expected IsValidationError to return false for regular error")
|
|
}
|
|
|
|
func TestGetValidationError(t *testing.T) {
|
|
validationErr := NewDatasourceNotFoundError("test-uid", "org-1")
|
|
regularErr := errors.New("regular error")
|
|
|
|
retrieved := GetValidationError(validationErr)
|
|
require.NotNil(t, retrieved, "expected GetValidationError to return the ValidationError")
|
|
require.Equal(t, ErrCodeDatasourceNotFound, retrieved.Code)
|
|
|
|
retrieved = GetValidationError(regularErr)
|
|
require.Nil(t, retrieved, "expected GetValidationError to return nil for regular error")
|
|
}
|
|
|
|
func TestGetHTTPStatusCode(t *testing.T) {
|
|
validationErr := NewDatasourceNotFoundError("test-uid", "org-1")
|
|
regularErr := errors.New("regular error")
|
|
|
|
require.Equal(t, http.StatusNotFound, GetHTTPStatusCode(validationErr))
|
|
require.Equal(t, http.StatusInternalServerError, GetHTTPStatusCode(regularErr), "expected default status code for regular error")
|
|
}
|
|
|
|
func TestErrorUnwrap(t *testing.T) {
|
|
cause := errors.New("underlying error")
|
|
err := NewDatasourceUnreachableError("test-uid", "http://localhost:9090", cause)
|
|
|
|
require.Equal(t, cause, errors.Unwrap(err), "expected Unwrap to return the cause")
|
|
}
|
|
|
|
func TestErrorErrorMethod(t *testing.T) {
|
|
// Test without cause
|
|
err1 := NewDatasourceNotFoundError("test-uid", "org-1")
|
|
require.NotEmpty(t, err1.Error(), "expected non-empty error message")
|
|
|
|
// Test with cause
|
|
cause := errors.New("underlying error")
|
|
err2 := NewDatasourceUnreachableError("test-uid", "http://localhost:9090", cause)
|
|
errMsg2 := err2.Error()
|
|
require.NotEmpty(t, errMsg2, "expected non-empty error message")
|
|
require.Contains(t, errMsg2, "underlying error", "error message should include cause")
|
|
}
|