Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ignite
GitHub Repository: ignite/cli
Path: blob/main/integration/faucet/faucet_test.go
1007 views
1
package faucet_test
2
3
import (
4
"context"
5
"fmt"
6
"net/http"
7
"strings"
8
"testing"
9
"time"
10
11
"cosmossdk.io/math"
12
sdk "github.com/cosmos/cosmos-sdk/types"
13
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
14
"github.com/stretchr/testify/require"
15
"golang.org/x/sync/errgroup"
16
17
"github.com/ignite/cli/v29/ignite/pkg/cosmosclient"
18
"github.com/ignite/cli/v29/ignite/pkg/cosmosfaucet"
19
"github.com/ignite/cli/v29/ignite/pkg/xurl"
20
envtest "github.com/ignite/cli/v29/integration"
21
)
22
23
const (
24
addr = "cosmos1zqr2gd7hwkyw55knad0l6ml6ngutd70878evqj"
25
)
26
27
var (
28
defaultCoins = []string{"10token", "1stake"}
29
maxCoins = []string{"102token", "100000000stake"}
30
)
31
32
func TestRequestCoinsFromFaucet(t *testing.T) {
33
var (
34
env = envtest.New(t)
35
app = env.ScaffoldApp("github.com/test/faucetapp")
36
servers = app.RandomizeServerPorts()
37
faucetURL = app.EnableFaucet(defaultCoins, maxCoins)
38
ctx, cancel = context.WithTimeout(env.Ctx(), envtest.ServeTimeout)
39
faucetClient = cosmosfaucet.NewClient(faucetURL)
40
)
41
isErrTransferRequest := func(err error, expectedCode int) {
42
var errTransfer cosmosfaucet.ErrTransferRequest
43
require.ErrorAs(t, err, &errTransfer)
44
require.EqualValues(t, expectedCode, errTransfer.StatusCode)
45
}
46
47
// serve the app
48
go func() {
49
app.Serve("should serve app", envtest.ExecCtx(ctx))
50
}()
51
52
// wait servers to be online
53
defer cancel()
54
app.WaitChainUp(ctx, servers.API)
55
56
err := env.IsFaucetServed(ctx, faucetClient)
57
require.NoError(t, err)
58
59
// error "account doesn't have any balances" occurs if a sleep is not included
60
time.Sleep(time.Second * 1)
61
62
nodeAddr, err := xurl.HTTP(servers.RPC)
63
require.NoError(t, err)
64
65
cosmosClient, err := cosmosclient.New(ctx, cosmosclient.WithNodeAddress(nodeAddr))
66
require.NoError(t, err)
67
68
// the faucet sends the default faucet coins value when not specified
69
_, err = faucetClient.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, nil))
70
require.NoError(t, err)
71
checkAccountBalance(ctx, t, cosmosClient, addr, defaultCoins)
72
73
// the faucet can send a specified amount of coins
74
_, err = faucetClient.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, []string{"20token", "2stake"}))
75
require.NoError(t, err)
76
checkAccountBalance(ctx, t, cosmosClient, addr, []string{"30token", "3stake"})
77
78
// faucet request fails on malformed coins
79
_, err = faucetClient.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, []string{"no-token"}))
80
isErrTransferRequest(err, http.StatusBadRequest)
81
82
// faucet request fails when requesting more than max coins
83
_, err = faucetClient.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, []string{"500token"}))
84
isErrTransferRequest(err, http.StatusInternalServerError)
85
86
// faucet request fails when transfer should fail
87
_, err = faucetClient.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, []string{"500nonexistent"}))
88
isErrTransferRequest(err, http.StatusInternalServerError)
89
90
// send several request in parallel and check max coins is not overflown
91
g, ctx := errgroup.WithContext(ctx)
92
for i := 0; i < 10; i++ {
93
g.Go(func() error {
94
c := faucetClient
95
index := i + 1
96
coins := []string{
97
sdk.NewCoin("token", math.NewInt(int64(index*2))).String(),
98
sdk.NewCoin("stake", math.NewInt(int64(index*3))).String(),
99
}
100
_, err := c.Transfer(ctx, cosmosfaucet.NewTransferRequest(addr, coins))
101
return err
102
})
103
}
104
require.NoError(t, g.Wait())
105
checkAccountBalance(ctx, t, cosmosClient, addr, []string{"168stake", "140token"})
106
}
107
108
func checkAccountBalance(ctx context.Context, t *testing.T, c cosmosclient.Client, accAddr string, coins []string) {
109
t.Helper()
110
resp, err := banktypes.NewQueryClient(c.Context()).AllBalances(ctx, &banktypes.QueryAllBalancesRequest{
111
Address: accAddr,
112
})
113
require.NoError(t, err)
114
115
require.Len(t, resp.Balances, len(coins))
116
expectedCoins, err := sdk.ParseCoinsNormalized(strings.Join(coins, ","))
117
require.NoError(t, err)
118
expectedCoins = expectedCoins.Sort()
119
gotCoins := resp.Balances.Sort()
120
require.True(t, gotCoins.Equal(expectedCoins),
121
fmt.Sprintf("%s should be equals to %s", gotCoins.String(), expectedCoins.String()),
122
)
123
}
124
125