fleet/server/service/transport_error_test.go

94 lines
1.7 KiB
Go

package service
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/stretchr/testify/assert"
)
type foreignKeyError struct{}
func (foreignKeyError) IsForeignKey() bool { return true }
func (foreignKeyError) Error() string { return "" }
type alreadyExists struct{}
func (alreadyExists) IsExists() bool { return false }
func (alreadyExists) Error() string { return "" }
type newAndExciting struct{}
func (newAndExciting) Error() string { return "" }
func TestHandlesErrorsCode(t *testing.T) {
var errorTests = []struct {
name string
err error
code int
}{
{
"validation",
fleet.NewInvalidArgumentError("a", "b"),
http.StatusUnprocessableEntity,
},
{
"permission",
fleet.NewPermissionError("a"),
http.StatusForbidden,
},
{
"foreign key",
foreignKeyError{},
http.StatusUnprocessableEntity,
},
{
"mail error",
mailError{},
http.StatusInternalServerError,
},
{
"osquery error - invalid node",
osqueryError{nodeInvalid: true},
http.StatusUnauthorized,
},
{
"osquery error - valid node",
osqueryError{},
http.StatusInternalServerError,
},
{
"data not found",
notFoundError{},
http.StatusNotFound,
},
{
"already exists",
alreadyExists{},
http.StatusConflict,
},
{
"status coder",
fleet.NewAuthFailedError(""),
http.StatusUnauthorized,
},
{
"default",
newAndExciting{},
http.StatusInternalServerError,
},
}
for _, tt := range errorTests {
t.Run(tt.name, func(t *testing.T) {
recorder := httptest.NewRecorder()
encodeError(context.Background(), tt.err, recorder)
assert.Equal(t, recorder.Code, tt.code)
})
}
}