Skip to content

Instantly share code, notes, and snippets.

@AntonioSun
Last active May 1, 2022 20:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AntonioSun/badf66c164eaf76a7440ded00845f03e to your computer and use it in GitHub Desktop.
Save AntonioSun/badf66c164eaf76a7440ded00845f03e to your computer and use it in GitHub Desktop.
package account
import (
"context"
"errors"
"fmt"
"log"
"net"
"testing"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/test/bufconn"
pb "github.com/AntonioSun/grpc-go-examples-bank/pkg/proto/bank/account"
)
type mockDepositServer struct {
pb.UnimplementedDepositServiceServer
}
var ErrInvalidArgument = errors.New("InvalidArgument")
func (*mockDepositServer) Deposit(ctx context.Context, req *pb.DepositRequest) (*pb.DepositResponse, error) {
if req.GetAmount() < 0 {
return nil, fmt.Errorf("cannot deposit %v: %w",
req.GetAmount(), ErrInvalidArgument)
}
return &pb.DepositResponse{Ok: true}, nil
}
func dialer() func(context.Context, string) (net.Conn, error) {
listener := bufconn.Listen(1024 * 1024)
server := grpc.NewServer()
pb.RegisterDepositServiceServer(server, &mockDepositServer{})
go func() {
if err := server.Serve(listener); err != nil {
log.Fatal(err)
}
}()
return func(context.Context, string) (net.Conn, error) {
return listener.Dial()
}
}
func TestDepositClient_Deposit(t *testing.T) {
tests := []struct {
name string
amount float32
res bool
err error
}{
{
"invalid request with negative amount",
-1.11,
false,
// codes.InvalidArgument, X: cannot use codes.InvalidArgument (constant 3 of type codes.Code) as type error in struct literal
// ErrInvalidArgument, X: error wrapping is discarded
fmt.Errorf("grpc: Unknown, cannot deposit %v: %w", -1.11, ErrInvalidArgument),
},
{
"valid request with non negative amount",
0.00,
true,
nil,
},
}
ctx := context.Background()
conn, err := grpc.DialContext(ctx, "", grpc.WithInsecure(), grpc.WithContextDialer(dialer()))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
response, err := NewDepositClient(conn, time.Second).Deposit(context.Background(), tt.amount)
if response != tt.res {
t.Error("error: expected", tt.res, "received", response)
}
e0 := ErrInvalidArgument
e1 := tt.err
//t.Logf("] %+v\n] %+v\n", err, tt.err)
e2 := fmt.Errorf("cannot deposit %v: %w", -1.11, ErrInvalidArgument)
t.Logf("] %v %v %v:%v %v:%v %v:%v %v:%v\n",
errors.Is(err, tt.err), errors.Is(tt.err, err),
errors.Is(err, ErrInvalidArgument), errors.Is(err, e0),
errors.Is(tt.err, ErrInvalidArgument), errors.Is(tt.err, e0),
errors.Is(e1, ErrInvalidArgument), errors.Is(e1, e0),
errors.Is(e2, ErrInvalidArgument), errors.Is(e2, e0),
)
//if !errors.Is(err, tt.err) {
//if err != tt.err {
if err != nil && err.Error() != tt.err.Error() {
t.Error("error: expected", tt.err, "received", err)
}
})
}
}
=== RUN   TestDepositClient_Deposit
=== RUN   TestDepositClient_Deposit/invalid_request_with_negative_amount
    deposit_client_test.go:94: ] false false false:false true:true true:true true:true
=== RUN   TestDepositClient_Deposit/valid_request_with_non_negative_amount
    deposit_client_test.go:94: ] true true false:false false:false false:false true:true
--- PASS: TestDepositClient_Deposit (0.00s)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment