Skip to content

Instantly share code, notes, and snippets.

@AntonioSun
Last active May 1, 2022 20:34
Show Gist options
  • Select an option

  • Save AntonioSun/badf66c164eaf76a7440ded00845f03e to your computer and use it in GitHub Desktop.

Select an option

Save AntonioSun/badf66c164eaf76a7440ded00845f03e to your computer and use it in GitHub Desktop.

Revisions

  1. AntonioSun revised this gist May 1, 2022. 2 changed files with 29 additions and 5 deletions.
    26 changes: 21 additions & 5 deletions deposit_client_test.go
    Original file line number Diff line number Diff line change
    @@ -10,8 +10,6 @@ import (
    "time"

    "google.golang.org/grpc"
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"
    "google.golang.org/grpc/test/bufconn"

    pb "github.com/AntonioSun/grpc-go-examples-bank/pkg/proto/bank/account"
    @@ -21,9 +19,12 @@ 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, status.Errorf(codes.InvalidArgument, "cannot deposit %v", req.GetAmount())
    return nil, fmt.Errorf("cannot deposit %v: %w",
    req.GetAmount(), ErrInvalidArgument)
    }

    return &pb.DepositResponse{Ok: true}, nil
    @@ -58,7 +59,9 @@ func TestDepositClient_Deposit(t *testing.T) {
    "invalid request with negative amount",
    -1.11,
    false,
    fmt.Errorf("grpc: InvalidArgument, cannot deposit %v", -1.11),
    // 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",
    @@ -84,7 +87,20 @@ func TestDepositClient_Deposit(t *testing.T) {
    t.Error("error: expected", tt.res, "received", response)
    }

    if err != nil && errors.Is(err, tt.err) {
    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)
    }
    })
    8 changes: 8 additions & 0 deletions zzComments.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    ```
    === 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)
    ```
  2. AntonioSun created this gist May 1, 2022.
    92 changes: 92 additions & 0 deletions deposit_client_test.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,92 @@
    package account

    import (
    "context"
    "errors"
    "fmt"
    "log"
    "net"
    "testing"
    "time"

    "google.golang.org/grpc"
    "google.golang.org/grpc/codes"
    "google.golang.org/grpc/status"
    "google.golang.org/grpc/test/bufconn"

    pb "github.com/AntonioSun/grpc-go-examples-bank/pkg/proto/bank/account"
    )

    type mockDepositServer struct {
    pb.UnimplementedDepositServiceServer
    }

    func (*mockDepositServer) Deposit(ctx context.Context, req *pb.DepositRequest) (*pb.DepositResponse, error) {
    if req.GetAmount() < 0 {
    return nil, status.Errorf(codes.InvalidArgument, "cannot deposit %v", req.GetAmount())
    }

    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,
    fmt.Errorf("grpc: InvalidArgument, cannot deposit %v", -1.11),
    },
    {
    "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)
    }

    if err != nil && errors.Is(err, tt.err) {
    t.Error("error: expected", tt.err, "received", err)
    }
    })
    }
    }