package grpcli

import (
	"errors"
	"testing"

	. "github.com/onsi/gomega"
	"github.com/tidbcloud/pkgv2/bizerr"
	"go.buf.build/protocolbuffers/go/linuxgit/tidbcloud/base"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

func TestWrapGrpcError(t *testing.T) {
	g := NewGomegaWithT(t)
	g.Expect(wrapGrpcError(nil)).To(BeNil())
	{
		err := wrapGrpcError(status.Error(codes.NotFound, "test"))
		g.Expect(err.ErrCode()).To(Equal(bizerr.ErrCodeRecordNotFound))
		g.Expect(err.ErrMsg()).To(Equal("test"))
	}
	{
		err := wrapGrpcError(status.Error(codes.Code(bizerr.ErrCodeTooManyRequests), "test"))
		g.Expect(err.ErrCode()).To(Equal(bizerr.ErrCodeTooManyRequests))
		g.Expect(err.ErrMsg()).To(Equal("test"))
	}
	{
		err := wrapGrpcError(status.Error(codes.Code(123), "test"))
		g.Expect(err.RawErrCode()).To(Equal(bizerr.ErrCodeUnknown))
		g.Expect(err.ErrMsg()).To(Equal("test"))
	}
	{
		err := wrapGrpcError(errors.New("test"))
		g.Expect(err.RawErrCode()).To(Equal(bizerr.ErrCodeUnknown))
		g.Expect(err.ErrMsg()).To(Equal("test"))
	}
}

func TestParseBaseResp(t *testing.T) {
	g := NewGomegaWithT(t)
	g.Expect(parseBaseResp(nil)).To(BeNil())
	g.Expect(parseBaseResp(&base.BaseResp{})).To(BeNil())

	{
		err := parseBaseResp(&base.BaseResp{
			ErrCode: 123,
			ErrMsg:  "test",
		})
		g.Expect(err.ErrCode()).To(Equal(bizerr.ErrCode(123)))
	}
}
