veza/veza-backend-api/internal/errors/errors_test.go

107 lines
3 KiB
Go
Raw Normal View History

2025-12-03 19:29:37 +00:00
package errors
import (
"testing"
"github.com/stretchr/testify/assert"
)
// TestAppError_Error teste le formatage des messages d'erreur
func TestAppError_Error(t *testing.T) {
tests := []struct {
name string
err *AppError
expected string
}{
{
name: "error without wrapped error",
err: New(ErrCodeValidation, "Invalid input"),
expected: "[2000] Invalid input",
},
{
name: "error with wrapped error",
err: Wrap(ErrCodeDatabase, "Database query failed", assert.AnError),
expected: "[9001] Database query failed: assert.AnError general error for testing",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := tt.err.Error()
assert.Contains(t, result, tt.expected)
})
}
}
// TestAppError_Unwrap teste la fonction Unwrap
func TestAppError_Unwrap(t *testing.T) {
wrappedErr := assert.AnError
err := Wrap(ErrCodeDatabase, "Database error", wrappedErr)
assert.Equal(t, wrappedErr, err.Unwrap())
assert.Nil(t, New(ErrCodeValidation, "Test").Unwrap())
}
// TestNew teste la création d'une nouvelle AppError
func TestNew(t *testing.T) {
err := New(ErrCodeValidation, "Test message")
assert.Equal(t, ErrCodeValidation, err.Code)
assert.Equal(t, "Test message", err.Message)
assert.Nil(t, err.Err)
assert.Empty(t, err.Details)
}
// TestWrap teste l'enveloppement d'une erreur
func TestWrap(t *testing.T) {
wrappedErr := assert.AnError
err := Wrap(ErrCodeInternal, "Internal error", wrappedErr)
assert.Equal(t, ErrCodeInternal, err.Code)
assert.Equal(t, "Internal error", err.Message)
assert.Equal(t, wrappedErr, err.Err)
}
// TestNewValidationError teste la création d'une erreur de validation
func TestNewValidationError(t *testing.T) {
details := []ErrorDetail{
{Field: "email", Message: "Invalid format"},
{Field: "password", Message: "Too short"},
}
err := NewValidationError("Validation failed", details...)
assert.Equal(t, ErrCodeValidation, err.Code)
assert.Equal(t, "Validation failed", err.Message)
assert.Len(t, err.Details, 2)
assert.Equal(t, "email", err.Details[0].Field)
assert.Equal(t, "Invalid format", err.Details[0].Message)
assert.Equal(t, "password", err.Details[1].Field)
assert.Equal(t, "Too short", err.Details[1].Message)
}
// TestNewValidationError_NoDetails teste la création sans détails
func TestNewValidationError_NoDetails(t *testing.T) {
err := NewValidationError("Validation failed")
assert.Equal(t, ErrCodeValidation, err.Code)
assert.Equal(t, "Validation failed", err.Message)
assert.Empty(t, err.Details)
}
// TestNewNotFoundError teste la création d'une erreur "not found"
func TestNewNotFoundError(t *testing.T) {
err := NewNotFoundError("User")
assert.Equal(t, ErrCodeNotFound, err.Code)
assert.Equal(t, "User not found", err.Message)
}
// TestNewUnauthorizedError teste la création d'une erreur d'autorisation
func TestNewUnauthorizedError(t *testing.T) {
err := NewUnauthorizedError("Invalid token")
assert.Equal(t, ErrCodeUnauthorized, err.Code)
assert.Equal(t, "Invalid token", err.Message)
}