174 lines
4.5 KiB
Go
174 lines
4.5 KiB
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestGomogError_Error(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
err *GomogError
|
|
expected string
|
|
}{
|
|
{
|
|
name: "simple error",
|
|
err: &GomogError{Code: ErrInternalError, Message: "internal error"},
|
|
expected: "[1] internal error",
|
|
},
|
|
{
|
|
name: "error with details",
|
|
err: (&GomogError{Code: ErrInternalError, Message: "internal error"}).WithDetails("connection failed"),
|
|
expected: "[1] internal error: connection failed",
|
|
},
|
|
{
|
|
name: "wrapped error",
|
|
err: Wrap(errors.New("underlying error"), ErrDatabaseError, "database error"),
|
|
expected: "[4] database error: underlying error",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if tt.err.Error() != tt.expected {
|
|
t.Errorf("expected %s, got %s", tt.expected, tt.err.Error())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGomogError_WithDetails(t *testing.T) {
|
|
err := ErrInternal.WithDetails("test details")
|
|
if err.Details != "test details" {
|
|
t.Errorf("expected details to be 'test details', got %s", err.Details)
|
|
}
|
|
}
|
|
|
|
func TestGomogError_WithMetadata(t *testing.T) {
|
|
err := ErrInternal.WithMetadata("key", "value")
|
|
if err.Metadata["key"] != "value" {
|
|
t.Errorf("expected metadata key to be 'value', got %s", err.Metadata["key"])
|
|
}
|
|
}
|
|
|
|
func TestGomogError_GetHTTPStatus(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
err *GomogError
|
|
expected int
|
|
}{
|
|
{"internal error", ErrInternal, 500},
|
|
{"invalid request", ErrInvalidReq, 400},
|
|
{"not found", ErrCollectionNotFnd, 404},
|
|
{"duplicate key", ErrDuplicate, 409},
|
|
{"permission denied", ErrPermDenied, 403},
|
|
{"timeout", ErrTimeoutErr, 408},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
status := tt.err.GetHTTPStatus()
|
|
if status != tt.expected {
|
|
t.Errorf("expected status %d, got %d", tt.expected, status)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestNewf(t *testing.T) {
|
|
err := Newf(ErrInvalidRequest, "field %s is required", "username")
|
|
if err.Message != "field username is required" {
|
|
t.Errorf("expected 'field username is required', got %s", err.Message)
|
|
}
|
|
}
|
|
|
|
func TestWrapf(t *testing.T) {
|
|
underlying := errors.New("underlying error")
|
|
err := Wrapf(underlying, ErrDatabaseError, "failed to connect to %s", "database")
|
|
if err.Message != "failed to connect to database" {
|
|
t.Errorf("expected 'failed to connect to database', got %s", err.Message)
|
|
}
|
|
if !errors.Is(err, underlying) {
|
|
t.Error("expected wrapped error to contain underlying error")
|
|
}
|
|
}
|
|
|
|
func TestIsFunctions(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
err error
|
|
testFunc func(error) bool
|
|
expected bool
|
|
}{
|
|
{"collection not found", ErrCollectionNotFnd, IsCollectionNotFound, true},
|
|
{"document not found", ErrDocumentNotFnd, IsDocumentNotFound, true},
|
|
{"duplicate key", ErrDuplicate, IsDuplicateKey, true},
|
|
{"invalid request", ErrInvalidReq, IsInvalidRequest, true},
|
|
{"type mismatch", ErrTypeMis, IsTypeMismatch, true},
|
|
{"timeout", ErrTimeoutErr, IsTimeout, true},
|
|
{"other error", ErrInternal, IsCollectionNotFound, false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := tt.testFunc(tt.err)
|
|
if result != tt.expected {
|
|
t.Errorf("expected %v, got %v", tt.expected, result)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetErrorCode(t *testing.T) {
|
|
code := GetErrorCode(ErrInternal)
|
|
if code != ErrInternalError {
|
|
t.Errorf("expected ErrInternalError, got %d", code)
|
|
}
|
|
}
|
|
|
|
func TestGetErrorMessage(t *testing.T) {
|
|
msg := GetErrorMessage(ErrInternal)
|
|
if msg != "internal error" {
|
|
t.Errorf("expected 'internal error', got %s", msg)
|
|
}
|
|
}
|
|
|
|
func TestToHTTPStatus(t *testing.T) {
|
|
status := ToHTTPStatus(ErrCollectionNotFnd)
|
|
if status != 404 {
|
|
t.Errorf("expected 404, got %d", status)
|
|
}
|
|
}
|
|
|
|
func TestEqual(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
err1 error
|
|
err2 error
|
|
expected bool
|
|
}{
|
|
{"same error", ErrInternal, ErrInternal, true},
|
|
{"different errors", ErrInternal, ErrInvalidReq, false},
|
|
{"nil errors", nil, nil, true},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := Equal(tt.err1, tt.err2)
|
|
if result != tt.expected {
|
|
t.Errorf("expected %v, got %v", tt.expected, result)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUnwrap(t *testing.T) {
|
|
underlying := errors.New("underlying error")
|
|
wrapped := Wrap(underlying, ErrDatabaseError, "database error")
|
|
|
|
unwrapped := errors.Unwrap(wrapped)
|
|
if unwrapped != underlying {
|
|
t.Errorf("expected underlying error, got %v", unwrapped)
|
|
}
|
|
}
|