48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func TestParseDBErrorUsesDatabaseIndependentGORMErrors(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
err error
|
|
want *APIError
|
|
}{
|
|
{name: "record not found", err: gorm.ErrRecordNotFound, want: ErrResourceNotFound},
|
|
{name: "duplicate key", err: gorm.ErrDuplicatedKey, want: ErrDuplicateResource},
|
|
{name: "wrapped duplicate key", err: errors.Join(errors.New("create group"), gorm.ErrDuplicatedKey), want: ErrDuplicateResource},
|
|
{name: "other", err: errors.New("database unavailable"), want: ErrDatabase},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := ParseDBError(tt.err); got != tt.want {
|
|
t.Fatalf("ParseDBError(%v) = %#v, want %#v", tt.err, got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestParseDBErrorRecognizesSQLiteUniqueConstraint(t *testing.T) {
|
|
err := errors.New("constraint failed: UNIQUE constraint failed: groups.name (2067)")
|
|
if got := ParseDBError(err); got != ErrDuplicateResource {
|
|
t.Fatalf("ParseDBError() = %#v, want duplicate resource", got)
|
|
}
|
|
}
|
|
|
|
func TestNewAPIErrorWithDataDoesNotMutateBase(t *testing.T) {
|
|
data := map[string]any{"id": 12}
|
|
got := NewAPIErrorWithData(ErrUpstreamURLConflict, data)
|
|
if got == ErrUpstreamURLConflict || got.Data == nil {
|
|
t.Fatalf("NewAPIErrorWithData() = %#v", got)
|
|
}
|
|
if ErrUpstreamURLConflict.Data != nil {
|
|
t.Fatalf("base Data = %#v, want nil", ErrUpstreamURLConflict.Data)
|
|
}
|
|
}
|