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 }