Files
gohoarder/pkg/errors/errors_test.go
T
lukaszraczylo 6b037a92b4 refactor: reorganize struct fields, add new handlers and storage backends
- [x] Reorder struct fields across codebase for consistency
- [x] Add analytics event handlers and tests
- [x] Add authentication API key management handlers and tests
- [x] Add pre-warming control handlers and tests
- [x] Implement S3 storage backend with tests
- [x] Implement SMB/CIFS storage backend with tests
- [x] Add CDN middleware tests
- [x] Integrate analytics tracking into cache manager
- [x] Add S3 and SMB storage initialization in app setup
- [x] Add CDN caching to proxy handlers
- [x] Remove distributed locking (Redis lock manager)
- [x] Remove proxy common package and utilities
- [x] Remove standalone HTTP server package
- [x] Remove logger middleware
- [x] Simplify error handling utilities
- [x] Update config with S3 and SMB options
- [x] Update cache manager signature to include analytics
2026-01-03 00:18:58 +00:00

176 lines
3.7 KiB
Go

package errors
import (
"errors"
"testing"
"github.com/stretchr/testify/suite"
)
type ErrorsTestSuite struct {
suite.Suite
}
func TestErrorsTestSuite(t *testing.T) {
suite.Run(t, new(ErrorsTestSuite))
}
func (s *ErrorsTestSuite) TestNew() {
tests := []struct {
name string
code string
message string
}{
{
name: "simple_error",
code: ErrCodeNotFound,
message: "Resource not found",
},
{
name: "empty_message",
code: ErrCodeBadRequest,
message: "",
},
}
for _, tt := range tests {
s.Run(tt.name, func() {
err := New(tt.code, tt.message)
s.Equal(tt.code, err.Code)
s.Equal(tt.message, err.Message)
s.Nil(err.Details)
s.Nil(err.Trace)
s.Nil(err.Cause)
})
}
}
func (s *ErrorsTestSuite) TestWithDetails() {
tests := []struct {
details interface{}
name string
}{
{
name: "map_details",
details: map[string]string{"key": "value"},
},
{
name: "string_details",
details: "some details",
},
{
name: "nil_details",
details: nil,
},
}
for _, tt := range tests {
s.Run(tt.name, func() {
err := New(ErrCodeBadRequest, "test").WithDetails(tt.details)
s.Equal(tt.details, err.Details)
})
}
}
func (s *ErrorsTestSuite) TestWithCause() {
cause := errors.New("underlying error")
err := New(ErrCodeStorageFailure, "test").WithCause(cause)
s.Equal(cause, err.Cause)
s.Contains(err.Error(), "underlying error")
}
func (s *ErrorsTestSuite) TestWrap() {
cause := errors.New("original error")
wrapped := Wrap(cause, ErrCodeDatabaseFailure, "database connection failed")
s.Equal(ErrCodeDatabaseFailure, wrapped.Code)
s.Equal("database connection failed", wrapped.Message)
s.Equal(cause, wrapped.Cause)
s.True(errors.Is(wrapped, cause))
}
func (s *ErrorsTestSuite) TestErrorString() {
tests := []struct {
name string
err *Error
expected string
}{
{
name: "error_without_cause",
err: New(ErrCodeNotFound, "not found"),
expected: "NOT_FOUND: not found",
},
{
name: "error_with_cause",
err: Wrap(errors.New("io error"), ErrCodeStorageFailure, "storage failed"),
expected: "STORAGE_FAILURE: storage failed (caused by: io error)",
},
}
for _, tt := range tests {
s.Run(tt.name, func() {
s.Equal(tt.expected, tt.err.Error())
})
}
}
func (s *ErrorsTestSuite) TestQuotaExceeded() {
limit := int64(1000000)
err := QuotaExceeded(limit)
s.Equal(ErrCodeQuotaExceeded, err.Code)
s.NotNil(err.Details)
details, ok := err.Details.(map[string]interface{})
s.True(ok)
s.Equal(limit, details["limit_bytes"])
}
func (s *ErrorsTestSuite) TestUnwrap() {
cause := errors.New("root cause")
wrapped := Wrap(cause, ErrCodeDatabaseFailure, "db error")
unwrapped := wrapped.Unwrap()
s.Equal(cause, unwrapped)
}
// Benchmark tests
func BenchmarkNewError(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = New(ErrCodeNotFound, "test error")
}
}
func BenchmarkNewErrorWithDetails(b *testing.B) {
details := map[string]string{"key": "value"}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = New(ErrCodeNotFound, "test error").WithDetails(details)
}
}
// Test edge cases
func (s *ErrorsTestSuite) TestEdgeCases() {
s.Run("nil_error_wrap", func() {
wrapped := Wrap(nil, ErrCodeInternalServer, "test")
s.Nil(wrapped.Cause)
})
s.Run("chained_wrapping", func() {
err1 := errors.New("base")
err2 := Wrap(err1, ErrCodeStorageFailure, "storage")
err3 := Wrap(err2, ErrCodeInternalServer, "internal")
s.True(errors.Is(err3, err2))
s.True(errors.Is(err3, err1))
})
s.Run("large_details", func() {
largeDetails := make(map[string]string)
for i := 0; i < 1000; i++ {
largeDetails[string(rune(i))] = "value"
}
err := New(ErrCodeBadRequest, "test").WithDetails(largeDetails)
s.Equal(largeDetails, err.Details)
})
}