github.com/Finschia/finschia-sdk@v0.49.1/x/fswap/keeper/grpc_query_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/suite"
     7  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
     8  	"google.golang.org/grpc/codes"
     9  	"google.golang.org/grpc/status"
    10  
    11  	"github.com/Finschia/finschia-sdk/baseapp"
    12  	"github.com/Finschia/finschia-sdk/simapp"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  	"github.com/Finschia/finschia-sdk/types/query"
    15  	bank "github.com/Finschia/finschia-sdk/x/bank/types"
    16  	"github.com/Finschia/finschia-sdk/x/fswap/keeper"
    17  	"github.com/Finschia/finschia-sdk/x/fswap/types"
    18  )
    19  
    20  func TestFSwapQueryTestSuite(t *testing.T) {
    21  	suite.Run(t, &FSwapQueryTestSuite{})
    22  }
    23  
    24  type FSwapQueryTestSuite struct {
    25  	suite.Suite
    26  
    27  	app             *simapp.SimApp
    28  	ctx             sdk.Context
    29  	queryClient     types.QueryClient
    30  	keeper          keeper.Keeper
    31  	swap            types.Swap
    32  	toDenomMetadata bank.Metadata
    33  	fromDenom       string
    34  	toDenom         string
    35  }
    36  
    37  func (s *FSwapQueryTestSuite) SetupTest() {
    38  	s.app = simapp.Setup(false)
    39  	s.ctx = s.app.BaseApp.NewContext(false, tmproto.Header{})
    40  
    41  	queryHelper := baseapp.NewQueryServerTestHelper(s.ctx, s.app.InterfaceRegistry())
    42  	types.RegisterQueryServer(queryHelper, keeper.NewQueryServer(s.app.FswapKeeper))
    43  	s.queryClient = types.NewQueryClient(queryHelper)
    44  	s.keeper = s.app.FswapKeeper
    45  
    46  	keiSwapRateForCony, err := sdk.NewDecFromStr("148079656000000")
    47  	s.Require().NoError(err)
    48  	swapCap := sdk.NewInt(1000)
    49  	s.Require().NoError(err)
    50  	s.fromDenom = "cony"
    51  	s.toDenom = "kei"
    52  	s.swap = types.Swap{
    53  		FromDenom:           s.fromDenom,
    54  		ToDenom:             s.toDenom,
    55  		AmountCapForToDenom: swapCap,
    56  		SwapRate:            keiSwapRateForCony,
    57  	}
    58  	s.toDenomMetadata = bank.Metadata{
    59  		Description: "This is metadata for to-coin",
    60  		DenomUnits: []*bank.DenomUnit{
    61  			{Denom: s.toDenom, Exponent: 0},
    62  		},
    63  		Base:    s.toDenom,
    64  		Display: s.toDenom,
    65  		Name:    "DUMMY",
    66  		Symbol:  "DUM",
    67  	}
    68  	err = s.toDenomMetadata.Validate()
    69  	s.Require().NoError(err)
    70  
    71  	fromDenom := bank.Metadata{
    72  		Description: "This is metadata for from-coin",
    73  		DenomUnits: []*bank.DenomUnit{
    74  			{Denom: s.fromDenom, Exponent: 0},
    75  		},
    76  		Base:    s.fromDenom,
    77  		Display: s.fromDenom,
    78  		Name:    "FROM",
    79  		Symbol:  "FROM",
    80  	}
    81  	err = fromDenom.Validate()
    82  	s.Require().NoError(err)
    83  
    84  	s.app.BankKeeper.SetDenomMetaData(s.ctx, fromDenom)
    85  	err = s.keeper.SetSwap(s.ctx, s.swap, s.toDenomMetadata)
    86  	s.Require().NoError(err)
    87  }
    88  
    89  func (s *FSwapQueryTestSuite) TestQuerySwapRequest() {
    90  	tests := []struct {
    91  		name             string
    92  		request          *types.QuerySwapRequest
    93  		expectedResponse *types.QuerySwapResponse
    94  		expectedGrpcCode codes.Code
    95  	}{
    96  		{
    97  			name: "valid",
    98  			request: &types.QuerySwapRequest{
    99  				FromDenom: s.fromDenom,
   100  				ToDenom:   s.toDenom,
   101  			},
   102  			expectedResponse: &types.QuerySwapResponse{
   103  				Swap: types.Swap{
   104  					FromDenom:           s.swap.FromDenom,
   105  					ToDenom:             s.swap.ToDenom,
   106  					AmountCapForToDenom: s.swap.AmountCapForToDenom,
   107  					SwapRate:            s.swap.SwapRate,
   108  				},
   109  			},
   110  			expectedGrpcCode: codes.OK,
   111  		},
   112  		{
   113  			name: "invalid: empty fromDenom",
   114  			request: &types.QuerySwapRequest{
   115  				FromDenom: "",
   116  				ToDenom:   s.toDenom,
   117  			},
   118  			expectedGrpcCode: codes.InvalidArgument,
   119  		},
   120  		{
   121  			name: "invalid: empty toDenom",
   122  			request: &types.QuerySwapRequest{
   123  				FromDenom: s.fromDenom,
   124  				ToDenom:   "",
   125  			},
   126  			expectedGrpcCode: codes.InvalidArgument,
   127  		},
   128  		{
   129  			name: "invalid: the same fromDenom and toDenom",
   130  			request: &types.QuerySwapRequest{
   131  				FromDenom: s.fromDenom,
   132  				ToDenom:   s.fromDenom,
   133  			},
   134  			expectedGrpcCode: codes.InvalidArgument,
   135  		},
   136  		{
   137  			name: "invalid: unregistered swap",
   138  			request: &types.QuerySwapRequest{
   139  				FromDenom: s.toDenom,
   140  				ToDenom:   s.fromDenom,
   141  			},
   142  			expectedGrpcCode: codes.NotFound,
   143  		},
   144  	}
   145  	for _, tc := range tests {
   146  		s.Run(tc.name, func() {
   147  			response, err := s.queryClient.Swap(s.ctx.Context(), tc.request)
   148  			s.Require().Equal(tc.expectedResponse, response)
   149  			actualGrpcCode := status.Code(err)
   150  			s.Require().Equal(tc.expectedGrpcCode, actualGrpcCode, actualGrpcCode.String())
   151  		})
   152  	}
   153  }
   154  
   155  func (s *FSwapQueryTestSuite) TestQuerySwappedRequest() {
   156  	tests := []struct {
   157  		name             string
   158  		request          *types.QuerySwappedRequest
   159  		expectedResponse *types.QuerySwappedResponse
   160  		expectedGrpcCode codes.Code
   161  	}{
   162  		{
   163  			name: "valid",
   164  			request: &types.QuerySwappedRequest{
   165  				FromDenom: s.fromDenom,
   166  				ToDenom:   s.toDenom,
   167  			},
   168  			expectedResponse: &types.QuerySwappedResponse{
   169  				FromCoinAmount: sdk.NewCoin(s.fromDenom, sdk.ZeroInt()),
   170  				ToCoinAmount:   sdk.NewCoin(s.toDenom, sdk.ZeroInt()),
   171  			},
   172  			expectedGrpcCode: codes.OK,
   173  		},
   174  		{
   175  			name: "invalid: empty fromDenom",
   176  			request: &types.QuerySwappedRequest{
   177  				FromDenom: "",
   178  				ToDenom:   s.toDenom,
   179  			},
   180  			expectedResponse: nil,
   181  			expectedGrpcCode: codes.Unknown,
   182  		},
   183  		{
   184  			name: "invalid: empty toDenom",
   185  			request: &types.QuerySwappedRequest{
   186  				FromDenom: s.fromDenom,
   187  				ToDenom:   "",
   188  			},
   189  			expectedResponse: nil,
   190  			expectedGrpcCode: codes.Unknown,
   191  		},
   192  		{
   193  			name: "invalid: unregistered swap",
   194  			request: &types.QuerySwappedRequest{
   195  				FromDenom: s.toDenom,
   196  				ToDenom:   s.fromDenom,
   197  			},
   198  			expectedResponse: nil,
   199  			expectedGrpcCode: codes.Unknown,
   200  		},
   201  	}
   202  	for _, tc := range tests {
   203  		s.Run(tc.name, func() {
   204  			response, err := s.queryClient.Swapped(s.ctx.Context(), tc.request)
   205  			s.Require().Equal(tc.expectedResponse, response)
   206  			actualGrpcCode := status.Code(err)
   207  			s.Require().Equal(tc.expectedGrpcCode, actualGrpcCode, actualGrpcCode.String())
   208  		})
   209  	}
   210  }
   211  
   212  func (s *FSwapQueryTestSuite) TestQueryTotalSwappableToCoinAmountRequest() {
   213  	tests := []struct {
   214  		name             string
   215  		request          *types.QueryTotalSwappableToCoinAmountRequest
   216  		expectedResponse *types.QueryTotalSwappableToCoinAmountResponse
   217  		expectedGrpcCode codes.Code
   218  	}{
   219  		{
   220  			name: "valid",
   221  			request: &types.QueryTotalSwappableToCoinAmountRequest{
   222  				FromDenom: s.fromDenom,
   223  				ToDenom:   s.toDenom,
   224  			},
   225  			expectedResponse: &types.QueryTotalSwappableToCoinAmountResponse{
   226  				SwappableAmount: sdk.NewCoin(s.toDenom, s.swap.AmountCapForToDenom),
   227  			},
   228  			expectedGrpcCode: codes.OK,
   229  		},
   230  		{
   231  			name: "invalid: empty fromDenom",
   232  			request: &types.QueryTotalSwappableToCoinAmountRequest{
   233  				FromDenom: "",
   234  				ToDenom:   s.toDenom,
   235  			},
   236  			expectedResponse: nil,
   237  			expectedGrpcCode: codes.Unknown,
   238  		},
   239  		{
   240  			name: "invalid: empty toDenom",
   241  			request: &types.QueryTotalSwappableToCoinAmountRequest{
   242  				FromDenom: s.fromDenom,
   243  				ToDenom:   "",
   244  			},
   245  			expectedResponse: nil,
   246  			expectedGrpcCode: codes.Unknown,
   247  		},
   248  		{
   249  			name: "invalid: unregistered swap",
   250  			request: &types.QueryTotalSwappableToCoinAmountRequest{
   251  				FromDenom: s.toDenom,
   252  				ToDenom:   s.fromDenom,
   253  			},
   254  			expectedResponse: nil,
   255  			expectedGrpcCode: codes.Unknown,
   256  		},
   257  	}
   258  	for _, tc := range tests {
   259  		s.Run(tc.name, func() {
   260  			response, err := s.queryClient.TotalSwappableToCoinAmount(s.ctx.Context(), tc.request)
   261  			s.Require().Equal(tc.expectedResponse, response)
   262  			actualGrpcCode := status.Code(err)
   263  			s.Require().Equal(tc.expectedGrpcCode, actualGrpcCode, actualGrpcCode.String())
   264  		})
   265  	}
   266  }
   267  
   268  func (s *FSwapQueryTestSuite) TestQuerySwapsRequest() {
   269  	tests := []struct {
   270  		name             string
   271  		request          *types.QuerySwapsRequest
   272  		expectedResponse *types.QuerySwapsResponse
   273  		expectedGrpcCode codes.Code
   274  	}{
   275  		{
   276  			name: "valid",
   277  			request: &types.QuerySwapsRequest{
   278  				Pagination: nil,
   279  			},
   280  			expectedResponse: &types.QuerySwapsResponse{
   281  				Swaps: []types.Swap{
   282  					{
   283  						FromDenom:           s.swap.FromDenom,
   284  						ToDenom:             s.swap.ToDenom,
   285  						AmountCapForToDenom: s.swap.AmountCapForToDenom,
   286  						SwapRate:            s.swap.SwapRate,
   287  					},
   288  				},
   289  				Pagination: &query.PageResponse{
   290  					NextKey: nil,
   291  					Total:   1,
   292  				},
   293  			},
   294  			expectedGrpcCode: codes.OK,
   295  		},
   296  		{
   297  			name: "invalid request",
   298  			request: &types.QuerySwapsRequest{
   299  				Pagination: &query.PageRequest{
   300  					Key:    []byte("invalid-key"),
   301  					Offset: 1,
   302  					Limit:  0,
   303  				},
   304  			},
   305  			expectedResponse: nil,
   306  			expectedGrpcCode: codes.Unknown,
   307  		},
   308  	}
   309  	for _, tc := range tests {
   310  		s.Run(tc.name, func() {
   311  			response, err := s.queryClient.Swaps(s.ctx.Context(), tc.request)
   312  			s.Require().Equal(tc.expectedResponse, response)
   313  			actualGrpcCode := status.Code(err)
   314  			s.Require().Equal(tc.expectedGrpcCode, actualGrpcCode, actualGrpcCode.String())
   315  		})
   316  	}
   317  }