|
@@ -0,0 +1,123 @@
|
|
|
+package errcode
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "net/http"
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "github.com/stretchr/testify/assert"
|
|
|
+ "google.golang.org/grpc/codes"
|
|
|
+ "google.golang.org/grpc/status"
|
|
|
+)
|
|
|
+
|
|
|
+func TestCodeFromGrpcError(t *testing.T) {
|
|
|
+ tests := []struct {
|
|
|
+ name string
|
|
|
+ code codes.Code
|
|
|
+ want int
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ name: "OK",
|
|
|
+ code: codes.OK,
|
|
|
+ want: http.StatusOK,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Invalid argument",
|
|
|
+ code: codes.InvalidArgument,
|
|
|
+ want: http.StatusBadRequest,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Failed precondition",
|
|
|
+ code: codes.FailedPrecondition,
|
|
|
+ want: http.StatusBadRequest,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Out of range",
|
|
|
+ code: codes.OutOfRange,
|
|
|
+ want: http.StatusBadRequest,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Unauthorized",
|
|
|
+ code: codes.Unauthenticated,
|
|
|
+ want: http.StatusUnauthorized,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Permission denied",
|
|
|
+ code: codes.PermissionDenied,
|
|
|
+ want: http.StatusForbidden,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Not found",
|
|
|
+ code: codes.NotFound,
|
|
|
+ want: http.StatusNotFound,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Canceled",
|
|
|
+ code: codes.Canceled,
|
|
|
+ want: http.StatusRequestTimeout,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Already exists",
|
|
|
+ code: codes.AlreadyExists,
|
|
|
+ want: http.StatusConflict,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Aborted",
|
|
|
+ code: codes.Aborted,
|
|
|
+ want: http.StatusConflict,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Resource exhausted",
|
|
|
+ code: codes.ResourceExhausted,
|
|
|
+ want: http.StatusTooManyRequests,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Internal",
|
|
|
+ code: codes.Internal,
|
|
|
+ want: http.StatusInternalServerError,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Data loss",
|
|
|
+ code: codes.DataLoss,
|
|
|
+ want: http.StatusInternalServerError,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Unknown",
|
|
|
+ code: codes.Unknown,
|
|
|
+ want: http.StatusInternalServerError,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Unimplemented",
|
|
|
+ code: codes.Unimplemented,
|
|
|
+ want: http.StatusNotImplemented,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Unavailable",
|
|
|
+ code: codes.Unavailable,
|
|
|
+ want: http.StatusServiceUnavailable,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Deadline exceeded",
|
|
|
+ code: codes.DeadlineExceeded,
|
|
|
+ want: http.StatusGatewayTimeout,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "Beyond defined error",
|
|
|
+ code: codes.Code(^uint32(0)),
|
|
|
+ want: http.StatusInternalServerError,
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, test := range tests {
|
|
|
+ test := test
|
|
|
+ t.Run(test.name, func(t *testing.T) {
|
|
|
+ assert.Equal(t, test.want, CodeFromGrpcError(status.Error(test.code, "foo")))
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestIsGrpcError(t *testing.T) {
|
|
|
+ assert.True(t, IsGrpcError(status.Error(codes.Unknown, "foo")))
|
|
|
+ assert.False(t, IsGrpcError(errors.New("foo")))
|
|
|
+ assert.False(t, IsGrpcError(nil))
|
|
|
+}
|